Reports Guide
The Asenion platform generates compliance reports from the assessments and data captured across your projects. Reports help document governance decisions, demonstrate regulatory compliance, and communicate risk posture to stakeholders.
This guide covers the two primary report types: Assessment Reports and Advanced Template Reports.
Table of Contents
- Overview
- Assessment Reports
- Advanced Template Reports
- Report Template Configuration
- Quick Reference
- Submitting a Report Template
Overview
The platform provides two types of reports:
| Report Type | Purpose | How It Works | Output |
|---|---|---|---|
| Assessment Report | Document a single assessment’s findings, scores, and alignment | Rendered in the browser from assessment data | PDF via browser print or direct download |
| Advanced Template Report | Generate a comprehensive project-level report using a custom Handlebars template | Generated in the background | HTML preview + PDF download |
Assessment Report Advanced Template Report
┌──────────────────┐ ┌──────────────────┐
│ Single assessment │ │ Entire project │
│ Policy-specific │ │ Custom template │
│ Browser-rendered │ │ Server-generated │
│ Instant download │ │ Background job │
└──────────────────┘ └──────────────────┘
Assessment Reports
An assessment report presents the findings of a single assessment (one policy evaluated against one project). It is accessed from the assessment’s detail page via the “Download Report” button.
What Assessment Reports Contain
Assessment reports typically include:
- Cover page — organisation name, project name, policy name, assessment date, completion status
- Assessment summary — completion percentage, overall risk/alignment status
- Policy alignment — alignment score with visual indicator
- Control bundle sections — for each section of the policy:
- Bundle name and alignment status
- Raw score and maximum score
- Individual control questions and answers
- Quantitative metrics (fairness, performance, raw counts) where applicable
- Heat map — visual comparison across control bundles (when the policy includes quantitative controls)
- Reviewer and approver details — who reviewed and approved the assessment, with dates
If the assessment is less than 100% complete, the report displays a “Draft Report” indicator with the current completion percentage.
Policy-Specific Templates
The platform automatically selects a report layout based on the policy attached to the assessment. Some policies have dedicated report templates with specialised formatting, while all others use a default generic layout:
| Template | Description |
|---|---|
| Local Law 144 Bias Audit | NYC Local Law 144 bias audit compliance format with key findings and summary sections |
| ISO/IEC 42001 | Layout for ISO/IEC 42001, with custom bundle renderers per section |
| Predictive AI Bias Audit | Bias audit format for predictive AI systems |
| AI Risk Management | Risk management policy format |
| AI Training | Format for AI training policies |
| Default | Generic assessment report layout that works with any policy |
Note: The template is chosen automatically from the policy attached to the assessment. You do not select one. Organisations may also have report layouts built specifically for them, which appear the same way.
Assessment Versioning
Assessments that have versioning enabled allow you to:
- View previous versions — select a version from the dropdown to see the report as it was at that point in time.
- Create new versions — when an assessment is rejected, authorised users (Org Admin, Owner, Project Lead) can create a new version to address feedback.
The version number is included in the downloaded file name (e.g., Org_Project_Policy_Report_2024-01-15_v2.pdf).
Downloading Assessment Reports
Click the “Download Report” button on the assessment report page. What happens next depends on whether the policy has a dedicated PDF layout, which is determined by the policy’s reportTemplateId field (see Policy Configuration):
- Policies with a dedicated PDF layout — a structured PDF is built directly in the browser, with its own page layout, headers and organisation details. The bias audit formats work this way.
- All other policies — the browser’s print-to-PDF dialog opens. Choose “Save as PDF” to download.
Either way the file is named {OrgName}_{ProjectName}_{PolicyName}_Report_{Date} — with any character outside letters and digits replaced by an underscore, and the date as YYYY-MM-DD. When a specific assessment version is selected, _v{number} is appended.
Role-Based Visibility
Assessment reports respect control visibility rules. The controls and answers shown in the report depend on:
- The viewing user’s role on the project
- Screening visibility settings
- Organisation-level visibility configuration for the policy
This means different users may see different content in the same assessment report.
Advanced Template Reports
Advanced template reports generate project-level documents using custom Handlebars templates. Unlike assessment reports (which cover a single assessment), advanced reports can pull data from the entire project hierarchy — the project itself, its child projects, and parent projects.
What Advanced Reports Contain
The content of an advanced report is entirely defined by the template. A template can include:
- Project metadata (name, type, description)
- Assessment answers from any policy attached to the project
- Answers from child projects (functional models, candidate models, datasets)
- Answers from parent projects (when generating a report for a child)
- Assignment details (reviewers, approvers, dates)
- Organisation branding (logo in PDF header)
- Any custom layout, tables, or formatting defined in the template’s HTML and CSS
Supported Project Types
Advanced reports can be generated for any project type. The template specifies which project types it applies to:
| Project Type | Description | Data Available |
|---|---|---|
AI_SYSTEM | Top-level AI system project | Own assessments + child functional models, candidate models, datasets |
FUNCTIONAL_MODEL | Functional model within an AI system | Own assessments + parent AI system data + child candidate models, datasets |
MODEL_CANDIDATE | Candidate model within a functional model | Own assessments + parent AI system + parent functional model |
ORGANIZATION | Organisation-level assessment | Own assessments only |
Generating an Advanced Report
- Navigate to the project dashboard.
- Open the “Advanced Reports” section.
- The platform displays all templates applicable to the project’s type.
- Click “Generate” on the desired template.
- The report is generated in the background. A progress indicator shows the job status.
- Once complete, the report becomes available for viewing and download.
A job moves through four states, and the platform reports progress as a percentage while it runs:
| State | Meaning |
|---|---|
WAITING | Queued, not started |
ACTIVE | Being generated |
COMPLETED | Finished; the HTML and PDF are available |
FAILED | Generation stopped; an error message explains why |
Notes on generation
- Reports are generated in the background. You can navigate away and come back.
- Clicking Generate again while a job is running does nothing new — the platform returns the job already in flight rather than queuing a second one.
- Job status is tracked per user, so a colleague will not see a job you started in progress. Once it completes, the report itself is available to anyone who can view the project.
Report Output
Each generated report produces two outputs:
- HTML preview — viewable directly in the platform via an embedded viewer.
- PDF download — a formatted PDF document with organisation logo (if configured) and proper page layout.
The PDF filename depends on the project type:
| Project type | Filename |
|---|---|
| Organisation | {OrgName}_Organization_report_{date}.pdf |
| AI System | {ProjectName}_AI_System_report_{date}.pdf |
| Functional Model | {ProjectName}_Use_Case_report_{date}.pdf |
| Anything else | ai-system-report-{date}.pdf |
Spaces become underscores and characters that are unsafe in filenames are removed. The date is YYYY-MM-DD.
Regenerating Reports
Previously generated reports are not automatically updated when assessment data changes. If answers are modified, new assessments are added, or other project data changes, regenerate the report to capture the latest data.
Clicking “Generate” on a template whose report has already completed — or previously failed — discards that job and starts a fresh one. There is no version history for generated reports: the most recent run is the one you keep.
Report Template Configuration
Advanced reports are driven by report templates — configurable documents stored in the platform. Each template defines what data to include, how to structure the output, and which project types it applies to.
Template Structure
A report template has the following fields:
| Field | Type | Required | Description |
|---|---|---|---|
identifier | string | Yes | Unique template identifier (e.g., com.example.org.report.eu-ai-act). |
createdBy | string | Yes | Set by the platform when the template is created; you do not supply it. |
name | string | Yes | Display name shown in the Advanced Reports list. |
description | string | No | Explanation of what this report covers. |
version | string | Yes | Version string for the template. |
isActive | boolean | No | Whether this template is available for use. Defaults to true. |
applicableProjectTypes | string[] | Yes | Which project types can use this template (e.g., ["AI_SYSTEM", "ORGANIZATION"]). |
policyRequirements | PolicyRequirement[] | Yes | Which policies must exist across the project hierarchy for this template to work. See Policy Requirements. |
templateContent | TemplateContent | Yes | The Handlebars HTML template and optional CSS. See Template Content. |
labels | string[] | No | Tags for categorisation. |
isSystemLevel | boolean | No | If true, the template is available to all organisations. If false, it is scoped to a specific organisation. |
organizationId | string | No | The organisation this template belongs to (when isSystemLevel is false). |
Policy Requirements
The policyRequirements field specifies which policies must be present across the project hierarchy for the template to generate successfully. Requirements are grouped by project type — this includes the main project and its child projects:
applicableProjectTypescontrols which project type triggers the report (e.g., you generate it from an AI System project).policyRequirementscontrols which policies must exist at each level of the hierarchy — the main project and its children — because the report pulls data from all of them.
{
"policyRequirements": [
{
"projectType": "AI_SYSTEM",
"requiredPolicies": [
{ "policyId": "com.example.org.projectinfo" },
{ "policyId": "com.example.org.fairness", "policyVersion": "2.0" }
]
},
{
"projectType": "FUNCTIONAL_MODEL",
"requiredPolicies": [{ "policyId": "com.example.org.modelcard" }]
}
]
}
In the example above, the template requires com.example.org.projectinfo and com.example.org.fairness on the AI System itself, and com.example.org.modelcard on each of its child functional models.
- If a
policyVersionis specified, only that exact version is accepted. - If
policyVersionis omitted, the latest version of the policy is used. - If a required policy is missing, report generation fails with a clear error message listing the missing policies.
Template Content (Handlebars)
The templateContent field contains the HTML template that defines the report’s layout. It uses Handlebars syntax for dynamic content.
{
"templateContent": {
"name": "EU AI Act Compliance Report",
"content": "<html><body><h1></h1><p>Project type: </p>...</body></html>",
"css": ".report-section { margin-bottom: 20px; } ..."
}
}
content— the Handlebars HTML template string.css— optional CSS that is injected into the rendered HTML and PDF.name— a label for the template content.
Data Context
When a template is rendered, the platform builds a data context from the project’s assessments and hierarchy. The template can reference any field in this context using Handlebars expressions.
AI System report data context:
| Field | Type | Description |
|---|---|---|
id | string | Project ID |
name | string | Project name |
projectType | string | e.g., "AI_SYSTEM" |
answerIndex | object | Indexed answers from the project’s assessments (keyed by control identifier) |
assignments | object | Reviewer/approver details: approverData, latestReviewData, effectiveDate, reviewEffectiveDate, author |
policies | array | List of { id, identifier, version, name } for each policy on the project |
controlMetadata | object | Control definitions (keyed by identifier): question, name, answerType |
functionalModels | array | Child functional models, each with their own answerIndex and parentAISystem reference |
candidateModels | array | Child candidate models, each with answerIndex, parentAISystem, and parentFunctionalModel references |
datasets | array | Child datasets, each with answerIndex and parent references |
organizationInfo | object | name and identifier of the organisation |
organizationBranding | object | logoUrl, primaryColor, secondaryColor, backgroundColor |
Organisation report data context:
| Field | Type | Description |
|---|---|---|
id | string | Project ID |
name | string | Organisation project name |
projectType | string | "ORGANIZATION" |
answerIndex | object | Indexed answers from the organisation’s assessments |
assignments | object | Reviewer/approver details |
policies | array | List of policies |
controlMetadata | object | Control definitions |
organizationBranding | object | Organisation branding data |
organizationInfo | object | name and identifier of the organisation |
summary | object | Roll-up counts: totalFunctionalModels, totalCandidateModels, totalDatasets |
aiSystems | array | The organisation’s AI systems, so a template can always use `` |
Note: Functional Model and Candidate Model reports have similar contexts, with additional
parentAISystemandparentFunctionalModelfields providing access to parent project data.
Handlebars Helpers
The platform registers custom helpers that do the work of reaching into assessment data, so a template rarely needs to walk the context by hand.
Reading answers
| Helper | Syntax | Description |
|---|---|---|
controlV | `` | The answer for a control. Handles text, choice, score, checkbox, document links and card answers. Shows [Not specified] when unanswered. |
controlV with placeholder | `` | As above, with your own placeholder. |
hasControl | … | True when the control has a non-empty answer. Use it to hide empty sections. |
controlExists | … | True when the control exists in the policy at all. |
controlQuestion | `` | The control’s question text, falling back to its name. |
controlVFromParent | `` | An answer from a parent project. First argument is "aiSystem" or "functionalModel". |
Whole sections in one tag
These render complete, pre-styled blocks, so a simple report can be built from very little markup.
| Helper | Syntax | Description |
|---|---|---|
reportHero | `` | The full cover section — project and organisation name, reviewer and approver details, dates — drawn from the context. |
reportFooter | `` | The standard footer, including the policy name. |
policyQuestionnaire | `` | Every answered, visible control of one policy — name, question, description and answer — grouped by control bundle, in policy order. |
policyQuestionnairerespects visibility. Controls hidden for the current reader are already absent from the data the report is built from, so they are excluded without any extra work in the template.
Completion counts
Useful for progress summaries and cover pages. The bundle helpers take a control bundle identifier; a trailing segment is enough to match.
| Helper | Syntax | Returns |
|---|---|---|
bundleControlCount | `` | Controls in that bundle |
bundleAnsweredCount | `` | Answered controls in that bundle |
bundleCompletionPercent | `` | Percentage answered for that bundle |
overallControlCount | `` | Controls across the whole report |
overallAnsweredCount | `` | Answered controls across the whole report |
overallCompletionPercent | `` | Percentage answered across the whole report |
Formatting and logic
| Helper | Syntax | Description |
|---|---|---|
policyInfo | `` | A field from the first policy — name, identifier or version. |
formatDate | `` | Formats an epoch-millisecond timestamp as a locale date. |
names | `` | Joins an array of { name } objects into a comma-separated string. |
eq | … | Equality comparison. |
ne | … | Not-equal comparison. |
isArray | … | True when the value is an array. |
join | `` | Joins an array with a separator. |
Example template snippet:
Template CSS
Custom CSS can be included in the templateContent.css field. This CSS is injected into the rendered HTML and applied during PDF generation. The platform also applies a base stylesheet that provides standard report formatting (margins, fonts, table styles, page breaks).
Use the page-break CSS class to control pagination in the PDF output:
.new-section {
break-before: page;
}
Template Validation
Templates are validated on creation and update. If your template contains disallowed content, the platform will return a validation error with a description of the issue. Ensure your templates use only standard HTML and CSS — avoid inline JavaScript or external resource loading.
Complete Example
Below is a complete report template configuration for an AI System project. This example demonstrates the key features: policy requirements, Handlebars helpers, iterating over child projects, and conditional sections.
{
"identifier": "com.example.org.report.ai-governance",
"name": "AI Governance Report",
"description": "Comprehensive governance report covering AI system assessments, functional models, and candidate models.",
"version": "1.0",
"isActive": true,
"applicableProjectTypes": ["AI_SYSTEM"],
"policyRequirements": [
{
"projectType": "AI_SYSTEM",
"requiredPolicies": [
{ "policyId": "com.example.org.projectinfo" },
{ "policyId": "com.example.org.riskmanagement" }
]
},
{
"projectType": "FUNCTIONAL_MODEL",
"requiredPolicies": [{ "policyId": "com.example.org.modelcard" }]
},
{
"projectType": "MODEL_CANDIDATE",
"requiredPolicies": [
{
"policyId": "com.example.org.modelvalidation",
"policyVersion": "2.0"
}
]
}
],
"templateContent": {
"name": "AI Governance Report Template",
"content": "<html><head><title> - AI Governance Report</title></head><body><div class=\"report-cover\"><h1>AI Governance Report</h1><p class=\"subtitle\"></p><table class=\"cover-table\"><tr><td>Project Type</td><td></td></tr><tr><td>Organisation</td><td></td></tr><tr><td>Report Date</td><td></td></tr><tr><td>Approved By</td><td></td></tr><tr><td>Reviewed By</td><td></td></tr></table></div><div class=\"section\"><h2>1. Project Overview</h2><p><strong>Project Name:</strong> </p><p><strong>Description:</strong> </p><p><strong>Purpose:</strong> </p><p><strong>Lifecycle Phase:</strong> </p></div><div class=\"section\"><h2>2. Risk Management</h2><p><strong>Risk Classification:</strong> </p><p><strong>Risk Appetite:</strong> </p><h3>Mitigation Measures</h3><p></p></div><div class=\"section new-section\"><h2>3. Functional Models</h2><div class=\"subsection\"><h3></h3><p><strong>Description:</strong> </p><p><strong>Model Type:</strong> </p><p><strong>Training Data:</strong> </p></div></div><div class=\"section new-section\"><h2>4. Candidate Models</h2><div class=\"subsection\"><h3></h3><p><strong>Validation Status:</strong> </p><p><strong>Performance Score:</strong> </p><p><strong>Parent AI System:</strong> </p></div></div><div class=\"section\"><h2>5. Policies</h2><table><thead><tr><th>Policy</th><th>Version</th></tr></thead><tbody><tr><td></td><td></td></tr></tbody></table></div></body></html>",
"css": "body { font-family: 'Segoe UI', Arial, sans-serif; color: #333; line-height: 1.6; } .report-cover { text-align: center; margin-bottom: 40px; padding: 60px 0; } .report-cover h1 { font-size: 28px; color: #1a237e; margin-bottom: 8px; } .subtitle { font-size: 18px; color: #666; margin-bottom: 30px; } .cover-table { margin: 0 auto; border-collapse: collapse; text-align: left; } .cover-table td { padding: 8px 16px; border-bottom: 1px solid #eee; } .cover-table td:first-child { font-weight: 600; color: #555; } .section { margin-bottom: 30px; } .section h2 { color: #1a237e; border-bottom: 2px solid #1a237e; padding-bottom: 6px; font-size: 20px; } .section h3 { color: #333; font-size: 16px; } .subsection { margin-left: 20px; margin-bottom: 20px; padding: 16px; background: #f8f9fa; border-radius: 6px; } table { width: 100%; border-collapse: collapse; margin: 16px 0; } th, td { padding: 10px 14px; text-align: left; border: 1px solid #dee2e6; } th { background: #f1f3f5; font-weight: 600; } .new-section { break-before: page; }"
},
"labels": ["governance", "ai-system"],
"isSystemLevel": false,
"organizationId": "YOUR_ORG_ID"
}
Reading the example above: The
contentfield is a single-line HTML string (JSON requires this). When authoring your template, you can write it as formatted HTML and then minify it into a single line before placing it in the JSON. The same applies tocss.
What this example demonstrates:
| Feature | Where in Example |
|---|---|
| Top-level project data | , |
Assessment answers via controlV | `` |
| Conditional sections | ... |
| Assignment/approval data | , |
| Reviewer names from array | `` |
| Iterating child projects | ... |
| Accessing parent data from child | `` |
| Policy listing | ... |
| Multi-project-type requirements | AI_SYSTEM, FUNCTIONAL_MODEL, MODEL_CANDIDATE each with own policies |
| Version-pinned policy | "policyVersion": "2.0" on com.example.org.modelvalidation |
| Page breaks in CSS | .new-section { break-before: page; } |
Quick Reference
Assessment Reports
| Aspect | Detail |
|---|---|
| Scope | Single assessment (one policy, one project) |
| Access | Assessment detail page → “Download Report” |
| Template selection | Automatic, based on the policy |
| Output format | PDF (browser print or direct download) |
| Versioning | View and download specific assessment versions |
| Visibility | Controlled by user role and visibility settings |
| Draft indicator | Shown when assessment is less than 100% complete |
Advanced Template Reports
| Aspect | Detail |
|---|---|
| Scope | Entire project, including child/parent hierarchy |
| Access | Project dashboard → “Advanced Reports” |
| Template selection | User selects from available templates |
| Output format | HTML preview + PDF download |
| Generation | Background job (asynchronous) |
| Regeneration | Manual — click “Generate” again to capture latest data |
| Template engine | Handlebars (HTML + CSS) |
| PDF engine | Server-side PDF generation with organisation logo |
Report Template Fields
| Field | Type | Required | Description |
|---|---|---|---|
identifier | string | Yes | Unique template identifier |
createdBy | string | Yes | Set by the platform |
name | string | Yes | Display name |
description | string | No | Template description |
version | string | Yes | Template version |
isActive | boolean | No | Whether template is enabled |
applicableProjectTypes | string[] | Yes | e.g., ["AI_SYSTEM", "ORGANIZATION"] |
policyRequirements | PolicyRequirement[] | Yes | Required policies per project type |
templateContent | TemplateContent | Yes | Handlebars HTML + optional CSS |
labels | string[] | No | Tags |
isSystemLevel | boolean | No | Available to all orgs if true |
organizationId | string | No | Org scope (when not system-level) |
Submitting a Report Template
To create or update a report template for your organisation:
- Define policy requirements — list the policies that must exist across the project hierarchy (the main project and its children). Group them by project type.
- Write the Handlebars template — use the data context and helpers to build your report layout.
- Add optional CSS — style your report with custom CSS in the
templateContent.cssfield. - Specify applicable project types — choose which project types (AI System, Functional Model, etc.) can use this template.
-
Create the template. Who can do this depends on its scope:
Scope Who can create it Your organisation ( isSystemLevel: false)Administrators with the organisation settings permission, directly in the platform All organisations ( isSystemLevel: true)The Asenion team — this requires a platform-level permission Templates can also be uploaded in bulk rather than one at a time.
Template content is validated on save. If the HTML or CSS contains disallowed content, the platform rejects it with a message describing the problem.
Tip: start with the section helpers. A usable report can be three tags —
,and— which render the cover, every answered control grouped by bundle, and the footer. Reach for,andwhen you need a bespoke layout rather than the standard one.