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

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

  1. Navigate to the project dashboard.
  2. Open the “Advanced Reports” section.
  3. The platform displays all templates applicable to the project’s type.
  4. Click “Generate” on the desired template.
  5. The report is generated in the background. A progress indicator shows the job status.
  6. 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:

  • applicableProjectTypes controls which project type triggers the report (e.g., you generate it from an AI System project).
  • policyRequirements controls 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 policyVersion is specified, only that exact version is accepted.
  • If policyVersion is 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 parentAISystem and parentFunctionalModel fields 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.

policyQuestionnaire respects 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:

<h1></h1>
<p><strong>Project Type:</strong> </p>

<h2>Assessment Summary</h2>
<p><strong>Approved by:</strong> </p>
<p><strong>Approval date:</strong> </p>
<p><strong>Reviewed by:</strong> </p>

<h2>Project Information</h2>
<table>
  <tr>
    <td>Organisation Name</td>
    <td></td>
  </tr>
  <tr>
    <td>Project Description</td>
    <td></td>
  </tr>
</table>


  <h2>Lifecycle Phase</h2>
  <p></p>



  <h2>Functional Model: </h2>
  <p></p>

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 content field 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 to css.

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:

  1. Define policy requirements — list the policies that must exist across the project hierarchy (the main project and its children). Group them by project type.
  2. Write the Handlebars template — use the data context and helpers to build your report layout.
  3. Add optional CSS — style your report with custom CSS in the templateContent.css field.
  4. Specify applicable project types — choose which project types (AI System, Functional Model, etc.) can use this template.
  5. 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 , and when you need a bespoke layout rather than the standard one.