Policy Configuration
The Asenion platform uses a hierarchical configuration system to define compliance policies, assessment controls, and scoring rules. This document covers the complete policy configuration schema.
Key Terminology:
- A Policy is either mapped to a qualitative questionnaire (form) for policy alignment assessment (which contributes to the Policy Alignment Risk status) or it is mapped to a quantitative questionnaire (form) for recording test results (which contributes to the Technology Risk status).
- A Policy has one or more Control Bundles. A Control Bundle belongs to a Control Objective.
- A Control Bundle has one or more Controls. A control is mapped to a question. The question is used to assess or measure whether the control exists and if so, how effective the control is.
Table of Contents
- Overview
- Top-Level Structure
- Organization
- Policies
- Control Bundles
- Controls
- Answer Types
- Answer Options
- Threshold-Based Scoring
- Card Types
- Compliance Identifiers
- Policy Level
- Complete Configuration Example
- Enum Reference
- Risk & Alignment Scoring
- Versioning
- Best Practices
Overview
A Policy in Asenion represents a regulatory framework or compliance standard (e.g., EU AI Act, NIST AI RMF, internal governance policies). Policies are composed of Control Bundles (logical groups of requirements) which in turn contain Controls (individual questions or requirements that users must answer).
Policy
├── Control Bundle 1
│ ├── Control A
│ ├── Control B
│ └── Control C
├── Control Bundle 2
│ ├── Control D
│ └── Control E
└── ...
The full policy configuration is a JSON document containing three top-level sections:
| Section | Description |
|---|---|
organization | The organization publishing the policy |
policies | One or more policy definitions with control bundle references and compliance levels |
controlBundles | The actual control bundle definitions including controls, answer options, and scoring |
Top-Level Structure
{
"organization": { ... },
"policies": [ ... ],
"controlBundles": [ ... ]
}
Organization
Defines the organization that owns or publishes the policy.
| Property | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name of the organization |
identifier | string | Yes | Unique reverse-domain identifier (e.g., com.example) |
pgId | string | No | External identifier used to link the organization to an external system or database |
Example:
{
"organization": {
"name": "ABC",
"identifier": "com.example",
"pgId": "2"
}
}
Policies
An array of policy definitions. Each policy groups multiple control bundles under a single compliance framework.
Policy Object
| Property | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name of the policy |
identifier | string | Yes | Unique reverse-domain identifier for the policy (e.g., com.example.euaiact) |
version | string | Yes | Semantic version string (e.g., "1.0", "2.1") |
description | string | No | Human-readable description of the policy |
link | string | No | URL to the original regulation or standard |
labels | string[] | No | Tags for categorization, filtering, and report behavior (see Policy Labels) |
controlBundles | ControlBundleRef[] | Yes | References to control bundles included in this policy |
compliance | Compliance[] | No | Compliance level definitions with score ranges |
dimensions | PolicyDimension[] | No | Risk/scoring dimensions for multi-dimensional analysis |
assessMethod | string | No | Assessment methodology identifier |
applicableProjectTypes | ProjectType[] | Yes | Which project types this policy can be applied to |
reportTemplateId | string | No | ID of the report template to use when generating reports |
isSystemLevel | boolean | No | If true, the policy is system-wide and available to all organizations. Default: false |
orgId | string | No | Organization ID. Required for organization-level policies; omit for system-level policies |
isArchived | boolean | No | Archived policies are hidden from selection but not deleted. Managed through the platform rather than set in configuration. Default: false |
policyLevel | PolicyLevel | Read-only | Returned by the API as SYSTEM or ORGANIZATION. Derived automatically from isSystemLevel; do not set in config |
Control Bundle Reference
Each entry in the controlBundles array is a lightweight reference (not the full bundle definition). The actual bundle is defined in the top-level controlBundles array.
| Property | Type | Required | Description |
|---|---|---|---|
identifier | string | Yes | Identifier of the control bundle to include |
version | string | Yes | Version of the control bundle to include |
The platform resolves each reference to the matching bundle by identifier and version when the policy is loaded, so you do not supply an internal bundle ID.
Compliance Level
Compliance levels define named tiers based on aggregate assessment scores.
| Property | Type | Required | Description |
|---|---|---|---|
level | string | Yes | Display name of the compliance level (e.g., "Gold", "Certified") |
compliant | boolean | Yes | Whether this level qualifies as compliant |
score_min | number | No | Minimum score (inclusive) to achieve this level |
score_max | number | No | Maximum score (exclusive) for this level. Omit for the highest tier |
Policy Dimension
Dimensions allow multi-dimensional scoring beyond a single aggregate score.
| Property | Type | Required | Description |
|---|---|---|---|
identifier | string | Yes | Unique identifier for the dimension |
name | string | Yes | Display name |
description | string | No | Description of what the dimension measures |
thresholds | number[] | No | Threshold values for bucketing scores |
ds | PolicyDimensionScore[] | No | Dimension score definitions |
labels | string[] | No | Tags for the dimension |
aggregationType | DimensionAggregationType | Yes | How scores are aggregated: SUM, AVG, MAX, MIN, or PERCENT |
Policy Dimension Score
| Property | Type | Required | Description |
|---|---|---|---|
name | string | No | Display name for the score level |
score | number | Yes | The score value |
description | string | No | Description of this score level |
type | DimensionScoreType | Yes | Severity: NA, INFO, WARNING, or CRITICAL |
Applicable Project Types
A policy must declare which project types it applies to. Available values:
| Value | Description |
|---|---|
AI_SYSTEM | Top-level AI system |
FUNCTIONAL_MODEL | Functional component of an AI system |
MODEL_CANDIDATE | ML model being evaluated |
MODEL_CHAMPION | Champion ML model (selected winner) |
AGENT_CANDIDATE | AI agent being evaluated |
VENDOR_AGENT | Third-party vendor AI agent |
VENDOR_MODEL | Third-party vendor model |
DATASET | Dataset used by an AI system |
ORGANIZATION | Organization-level assessment |
Policy Labels
Labels on a policy do two things: they route its assessments to a tab in the project governance table, and they switch on a few specific behaviours. Any other string is free for your own filtering and organization.
Governance tab routing
Every assessment appears in exactly one tab, chosen from the policy’s labels. Matching is case-insensitive, and the first match in this order wins — so a policy labelled both screening and assurance routes to Screening.
| Label | Tab | Reviewed and approved by |
|---|---|---|
screening | Screening | Governance |
assurance | Testing | Assurance |
monitoring | Monitoring | Governance |
mitigation or notification-alerts | Mitigation | Compliance |
| (none of the above) | Assessments | Compliance |
The tab also determines which review role handles the assessment, so a label change moves the work to a different group. Check the review assignments before relabelling a live policy.
Behaviour labels
| Label | Effect |
|---|---|
assurance combined with LLM, redteam, or multiturn | Marks the assessment as evidence-linking, which changes how results are attached |
documentation | Affects how the policy’s content is rendered in generated reports |
report.project.assessment_details.hide | Hides the assessment details section in generated reports |
Custom labels
Anything else — raii, eu-ai-act, internal — is free-form and used for filtering and grouping in the interface. Custom labels never change routing or scoring.
Labels are matched exactly (apart from letter case). A near-miss such as
screeningsis treated as a custom label, and the policy’s assessments fall through to the Assessments tab.
Policy Example### Policy Example
{
"name": "ABC Responsible AI Assessment Checklist - Pre-Screening",
"identifier": "com.example.projectinfo",
"reportTemplateId": "com.example.rai.checklist",
"version": "1.0.1",
"description": "The purpose of this checklist is to assess projects involving AI-based solutions, ensuring alignment with ethical and responsible AI principles throughout their lifecycle.",
"link": "https://www.abc.example/",
"controlBundles": [
{ "identifier": "com.example.org", "version": "1.0.1" },
{ "identifier": "com.example.general", "version": "1.0.1" },
{ "identifier": "com.example.prescreen", "version": "1.0.1" }
],
"labels": [
"Inherent Risks",
"Not Started",
"Started",
"report.project.assessment_details.hide"
],
"applicableProjectTypes": ["AI_SYSTEM", "FUNCTIONAL_MODEL", "MODEL_CANDIDATE", "AGENT_CANDIDATE"],
"compliance": [
{ "level": "Non-Compliant", "compliant": false, "score_min": 0, "score_max": 49.9 },
{ "level": "Compliant", "compliant": true, "score_min": 50, "score_max": 79.9 },
{ "level": "Fully Compliant", "compliant": true, "score_min": 80 }
]
}
Control Bundles
Control bundles are the building blocks of a policy. Each bundle groups related controls under a common theme (e.g., “Fairness”, “Transparency”, “Accountability”).
Control Bundle Object
| Property | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name of the control bundle |
identifier | string | Yes | Unique reverse-domain identifier (e.g., com.example.raii.dimension1) |
version | string | Yes | Version string |
description | string | No | Description of the bundle’s purpose |
weight | number | No | Relative weight of this bundle in aggregate scoring (default: 1.0) |
labels | string[] | No | Tags for categorization. Special labels include operational_risk, ai_tests |
compliance_min_percent | number | No | Minimum completion percentage for compliance |
compliance_max_percent | number | No | Maximum completion percentage threshold |
score_max | number | No | Maximum alignment score possible for this bundle |
risk_max | number | No | Maximum risk score possible for this bundle |
controls | Control[] | Yes | Array of control definitions |
dimensions | ControlBundleDimension[] | No | Dimensions specific to this bundle (see below) |
applicableProjectTypes | ProjectType[] | No | Override policy-level project type restrictions |
Control Bundle Dimension
Dimensions on a control bundle allow per-bundle multi-dimensional scoring. Note that the ds field here is an array of raw Float values (not objects), unlike PolicyDimension.ds which contains structured score objects.
| Property | Type | Required | Description |
|---|---|---|---|
identifier | string | Yes | Unique identifier for the dimension |
name | string | Yes | Display name |
description | string | No | Description of what the dimension measures |
thresholds | number[] | No | Threshold values for bucketing scores |
ds | number[] | No | Raw score values for the dimension |
labels | string[] | No | Tags for the dimension |
aggregationType | DimensionAggregationType | Yes | How scores are aggregated: SUM, AVG, MAX, MIN, or PERCENT |
Special Labels
Labels on control bundles influence how the platform computes risk and categorizes the bundle:
| Label | Effect |
|---|---|
operational_risk | Controls in this bundle contribute to the Operational Risk score |
ai_tests | Marks the bundle as technology-risk; its controls contribute to the technology-risk dimension |
assurance | Same effect as ai_tests — either label marks the bundle as technology-risk |
project_info | Informational only; typically not scored. Used for project metadata collection |
use_case_info | A naming convention only — the platform does not treat it specially. Used by convention for AI use case metadata bundles |
Control-level label. countAsTestScore is set on an individual control, not on the bundle. It promotes a CARD control from informational to scored — see Card controls.
Note: Only the exact label
operational_risk(singular) is recognized by the risk computation engine. If you use a variant likeoperational_risks(plural), it will not automatically contribute to risk scoring — it will be treated as a custom label.
Control Bundle Example
{
"name": "General Information",
"identifier": "com.example.general",
"version": "1.0.1",
"description": "General information for this AI use case.",
"weight": 1.0,
"labels": ["use_case_info"],
"controls": [ ... ]
}
Controls
A control is an individual question or requirement within a control bundle. Each control specifies its answer type, answer options, and scoring rules.
Control Object
| Property | Type | Required | Description |
|---|---|---|---|
identifier | string | Yes | Unique identifier within the bundle (e.g., dimension1.biasimpact.1) |
name | string | Yes | Display name / title |
description | string | No | Detailed description or guidance text |
question | string | No | The question prompt shown to users |
answerType | AnswerType | Yes | Type of answer input (see Answer Types) |
dataType | ControlDataType | No | Input format hint for free-text answers: TEXT, EMAIL, or DATE |
answerOptions | AnswerOption[] | No | Available answer choices (for scored/selection types) |
optional | boolean | No | If true, the control is not required for completion. Default: false |
formula | string | No | Formula for computed controls |
defaultValue | string | No | Pre-populated default value |
labels | string[] | No | Tags for categorization and filtering |
mainCategory | string | No | Primary categorization |
subCategories | string[] | No | Secondary categorizations |
cardTypes | CardType[] | No | Card templates (required when answerType is CARD) |
controlSource | ControlSource[] | No | References to the original regulatory source |
controlCitations | ControlCitation[] | No | Detailed citations to regulatory text |
framework | string[] | No | Framework identifiers this control maps to |
frameworkLevel | string[] | No | Level within the framework hierarchy |
technicalArea | string[] | No | Technical domain tags |
role | string[] | No | Roles responsible for this control |
usecase | string[] | No | Applicable use case tags |
prerequisiteState | string[] | No | States that must be met before this control becomes active |
controlConclusion | string[] | No | Predefined conclusion options |
industry | string[] | No | Industry-specific tags |
Conditional logic is not configured here. A control bundle defines what is asked, not when it is shown. Rules that show or hide a control based on an earlier answer are configured separately, per organization, in the User Journey tab — see Conditional Form Logic. Keep policy configuration free of display conditions.
Control Source
| Property | Type | Required | Description |
|---|---|---|---|
sourceReference | string | No | Reference ID from the regulation (e.g., article/section number) |
sourceText | string | No | Relevant excerpt from the source text |
Control Citation
| Property | Type | Required | Description |
|---|---|---|---|
reference | string | No | Reference identifier |
text | string | No | Citation text |
citationSource | string | No | Source document name |
citationTitle | string | No | Title of the cited section |
citationText | string | No | Full text of the citation |
Answer Types
The answerType field determines what UI component is rendered and how the answer is stored and scored.
| Answer Type | Description | Scored | Answer Options Required |
|---|---|---|---|
SCORE_CHECKBOX | Multiple-selection checkboxes where each option has a score value | Yes | Yes |
SCORE_MULTIPLE_CHOICE | Single-selection radio buttons where each option has a score value | Yes | Yes |
TEXT_TEXT | Free-text single-line input | No | No |
TEXT_TEXT_MULTI | Free-text multi-line input (textarea) | No | No |
TEXT_TEXT_CHECKLIST | Checklist of text items | No | No |
TEST_SCORE | Numeric test result input with threshold-based scoring | Yes | Yes (with thresholds) |
CARD | Structured data cards for repeatable entries | Varies | No (uses cardTypes) |
DOC_UPLOAD | File/document upload | No | No |
Answer Options
Answer options define the possible answers for scored controls and how each answer maps to alignment, risk, and dimension scores.
Answer Option Object
| Property | Type | Required | Description |
|---|---|---|---|
identifier | string | No | Unique identifier for the option |
type | AnswerOptionType | Yes | Type of option (see below) |
value | number | No | Numeric score value for this option |
answer | string | No | Display text for the answer choice |
description | string | No | Additional guidance shown with the option |
defaultValue | number | No | Default value (for slider/threshold types) |
thresholds | number[] | No | Bucket boundaries for threshold-based scoring. Used on both SCORE_THRESHOLD and SCORE option types (see How value and thresholds Work Together) |
alignmentScore | number[] | No | Alignment score for each threshold bucket (one value per bucket, i.e., thresholds.length - 1 values) |
riskScore | number[] | No | Risk score for each threshold bucket (one value per bucket, i.e., thresholds.length - 1 values) |
ds | DimensionScore[] | No | Per-dimension score contributions |
risk | AnswerOptionRisk[] | No | Risk metadata associated with this option |
alert | AnswerOptionAlert[] | No | Alert metadata associated with this option (see below) |
stateConclusion | string | No | Conclusion text recorded when this option is selected |
scoreMin | number | No | (Deprecated) Minimum score for slider |
scoreMax | number | No | (Deprecated) Maximum score for slider |
thresholdLow | number | No | (Deprecated) Low threshold |
thresholdHigh | number | No | (Deprecated) High threshold |
Answer Option Types
| Type | Description |
|---|---|
SCORE | Fixed score value. Selecting this option contributes value to the total score. |
SCORE_THRESHOLD | Threshold-based scoring. Uses thresholds, alignmentScore, and riskScore arrays to compute scores based on the entered numeric value. |
TEXT_TEXT | Text-only option with no scoring impact. |
Dimension Score
Maps an answer option to a specific scoring dimension.
| Property | Type | Required | Description |
|---|---|---|---|
dimension | string | Yes | Identifier of the dimension |
score | number | Yes | Score contribution to that dimension |
Answer Option Risk
Metadata describing the risk implication of an answer.
| Property | Type | Required | Description |
|---|---|---|---|
riskType | string[] | No | Categories of risk (e.g., ["bias", "fairness"]) |
riskExplanation | string | No | Human-readable explanation of the risk |
Answer Option Alert
Metadata attached to an answer option for downstream reporting.
| Property | Type | Required | Description |
|---|---|---|---|
alertName | string | No | Short name for the alert |
alertCategory | string | No | Grouping category |
alertText | string | No | Text describing what the alert means |
frameworkLevel | string | No | Level within the framework hierarchy |
alertID | string | No | Identifier for the alert |
How value and thresholds Work Together
Answer options can carry two independent scoring mechanisms that serve different purposes:
| Field | Purpose | Used For |
|---|---|---|
value | The compliance/alignment score contributed when this option is selected | Completion percentage, aggregate compliance scoring |
thresholds + riskScore + alignmentScore | Risk and alignment classification based on threshold buckets | Risk status computation (HIGH / MEDIUM / LOW), alignment status |
These are not mutually exclusive. A single SCORE option commonly has both:
{
"type": "SCORE",
"value": 1,
"answer": "Yes",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
}
In this example:
value: 1— selecting “Yes” adds 1 point to the compliance score.thresholds: [0, 0.5, 1]withriskScore: [0, 1]— defines how the option’s value maps to risk (thevalueof1falls in the second bucket[0.5, 1], yielding a risk score of1).
When are thresholds used on SCORE options?
For SCORE_MULTIPLE_CHOICE and SCORE_CHECKBOX controls, the platform uses the value field for compliance scoring, but also uses thresholds/riskScore/alignmentScore to compute risk and alignment statuses. This is why the ABC example includes threshold arrays on every scored answer option.
When is only thresholds used (no value)?
For TEST_SCORE controls with SCORE_THRESHOLD options, only the threshold arrays matter. The user enters a raw numeric value, and the platform looks up which bucket it falls into to determine the risk and alignment scores. See Threshold-Based Scoring.
Threshold-Based Scoring
The thresholds, alignmentScore, and riskScore arrays work together to create a bucket-based scoring system. This mechanism is used in two contexts:
TEST_SCOREcontrols — the user enters a raw number, which is placed into a threshold bucket.SCORE_MULTIPLE_CHOICE/SCORE_CHECKBOXcontrols — each answer option’svalueis placed into the threshold bucket to derive risk and alignment scores.
These arrays feed the numeric aggregate, not the compliance label. On a
SCORE_MULTIPLE_CHOICEorSCORE_CHECKBOXcontrol, the label that drives status comes from the option’s compliance identifier — see Compliance Identifiers.TEST_SCOREis the exception: there the bucket does produce the label.
How It Works
The thresholds array defines bucket boundaries. For n thresholds, there are n - 1 buckets. The alignmentScore and riskScore arrays each have n - 1 values, one per bucket.
thresholds: [0, 0.5, 0.8, 1.0]
|------|------|------|
bucket0 bucket1 bucket2
alignmentScore: [0, 0.5, 1.0]
riskScore: [1.0, 0.5, 0]
Scoring example:
| Input Value | Bucket | Alignment Score | Risk Score |
|---|---|---|---|
0.3 | [0, 0.5) — bucket 0 | 0 | 1.0 |
0.6 | [0.5, 0.8) — bucket 1 | 0.5 | 0.5 |
0.9 | [0.8, 1.0] — bucket 2 | 1.0 | 0 |
Card Types
Card types define structured, repeatable data entry templates. They are used when a control has answerType: "CARD".
Card Type Object
| Property | Type | Required | Description |
|---|---|---|---|
cardTitle | string | Yes | Title of the card template |
cardDescription | string | No | Description of the card purpose |
cardFields | CardField[] | Yes | Array of field definitions within the card |
Card Field
| Property | Type | Required | Description |
|---|---|---|---|
type | AnswerType | Yes | Input type for this field (uses the same AnswerType enum) |
dataType | ControlDataType | No | Input format hint for free-text fields: TEXT, EMAIL, or DATE |
label | string | Yes | Display label for the field |
required | boolean | No | Whether the field is required |
defaultValue | string | No | Default value |
answerOptions | AnswerOption[] | No | Answer options (if the field is a selection type) |
Compliance Identifiers
Every scored control produces one compliance label, and those labels are what roll up into assessment and project status. The label comes from your policy — not from any platform setting.
This is the most common authoring mistake. A control meant to assess a requirement, whose answer options carry no compliance identifier, is treated as informational: it is quietly excluded from scoring and contributes nothing. The assessment still renders, so nothing looks broken. (Being informational is the correct outcome for screening questions — see Compliance identifiers vs descriptive identifiers.)
The four identifiers
| Identifier | Meaning |
|---|---|
fully-compliant | The answer meets the requirement |
partially-compliant | The answer partly meets the requirement |
not-compliant | The answer does not meet the requirement |
not-applicable | The requirement does not apply; the control is excluded from the roll-up |
Only the suffix matters. The platform reads the part after the last . and treats _ as -, so all of these are equivalent and you can keep your own namespacing:
fully-compliant
fully_compliant
com.example.safety.si.fully_compliant
An option with a missing or unrecognized identifier is skipped, and a warning is logged.
Putting it together, a scored control looks like this:
{
"identifier": "com.example.privacy.dsr",
"name": "Data subject request handling",
"question": "Is there a documented process for handling data subject requests?",
"answerType": "SCORE_MULTIPLE_CHOICE",
"answerOptions": [
{ "type": "SCORE", "answer": "Yes, documented and tested",
"identifier": "com.example.privacy.dsr.fully_compliant" },
{ "type": "SCORE", "answer": "Documented but not tested",
"identifier": "com.example.privacy.dsr.partially_compliant" },
{ "type": "SCORE", "answer": "No documented process",
"identifier": "com.example.privacy.dsr.not_compliant" },
{ "type": "SCORE", "answer": "Not applicable to this system",
"identifier": "com.example.privacy.dsr.not_applicable" }
]
}
How each control type is scored
| Answer type | How the label is derived |
|---|---|
SCORE_MULTIPLE_CHOICE | The identifier on the single selected option. |
SCORE_CHECKBOX | The worst of the selected options. |
TEST_SCORE | The numeric answer is placed in a bucket; the bucket’s alignmentScore gives the label. |
CARD with the countAsTestScore label | How many cards are fully completed. |
TEXT_TEXT, TEXT_TEXT_MULTI, DOC_UPLOAD, CARD without the label | Informational — never scored. |
A scored control with no answer is unanswered, which is not the same as a failure but still keeps the assessment below a thresholdFullyCompliant of 100%.
Single-select and multi-select
For SCORE_MULTIPLE_CHOICE, put one of the four identifiers on every answer option. The selected option’s identifier becomes the label directly. not-applicable excludes the control from the roll-up rather than passing it.
For SCORE_CHECKBOX, the same identifiers apply and the strictest selected option wins:
not-compliant > partially-compliant > fully-compliant
not-applicable options are skipped and cannot change the outcome. Two consequences worth knowing:
- If every selected option is
not-applicableor unrecognized, the control becomes informational rather than fully compliant — so a pure not-applicable answer never inflates the count. - For a “none of the above” option, give it the
not-compliantidentifier. No special option name is recognized; the identifier is what carries the meaning.
Test score controls
A TEST_SCORE control carries its scoring rules on its single answer option, using thresholds and alignmentScore:
thresholdslists the bucket boundaries, lowest to highest.alignmentScoreholds one value per bucket — so it always has one entry fewer thanthresholds.- Each bucket covers its lower bound up to but excluding the next, and the topmost bucket includes its upper bound.
Each bucket’s alignmentScore maps to a label:
alignmentScore | Label |
|---|---|
1.0 | Fully compliant |
0.5 | Partially compliant |
0.0 | Not compliant |
Anything else is treated as not compliant and logged, so keep bucket scores to these three values.
Misconfiguration is handled predictably rather than by failing the assessment:
| Situation | Result |
|---|---|
No thresholds or no alignmentScore | Informational — the score is collected but not scored |
alignmentScore length does not match the bucket count | Informational, with a warning |
| Answer is not a number, or falls outside the outermost bounds | Not compliant |
Card controls
A CARD control is informational unless it carries the countAsTestScore label. With that label, its status depends on how many card entries are fully completed:
| Completed entries | Label |
|---|---|
| All of them | Fully compliant |
| Some of them | Partially compliant |
| None | Not compliant |
A card entry counts as completed when every required field on its card type has a value. Optional fields can be left blank without affecting this.
Compliance identifiers vs descriptive identifiers
Not every answer option identifier is a compliance identifier, and the difference decides whether a control contributes to status.
| Compliance identifier | Descriptive identifier | |
|---|---|---|
| Looks like | ends in fully_compliant, partially_compliant, not_compliant, not_applicable | anything else, e.g. ...sysdata.yes |
| Use it for | controls that assess whether a requirement is met | screening and intake questions that capture what a system is |
| Effect on status | produces the control’s compliance label | none — the control is informational |
| Targeted by rules | yes | yes |
Screening questions describe a system rather than judging it: “the system is hosted on-premises” or “the system uses personal data” is neither compliant nor non-compliant. Give those options descriptive identifiers so screening rules can target them, and leave the compliance identifiers for controls that genuinely assess a requirement. See Rules Configuration for how screening rules match answer options.
Both kinds need an identifier. An option with no identifier at all cannot be targeted by a rule and cannot produce a compliance label.
Informational controls
TEXT_TEXT, TEXT_TEXT_MULTI and DOC_UPLOAD controls, and CARD controls without the countAsTestScore label, collect information and are never scored. Leaving them blank does not stop an assessment reaching a fully compliant status — they are not counted at all. Use them for context and evidence gathering, and use a scored type wherever the answer needs to affect status.
Policy Level
| Level | Description |
|---|---|
SYSTEM | Available to all organizations on the platform. Managed by platform admins. |
ORGANIZATION | Scoped to a single organization. Managed by org admins. |
Complete Configuration Example
This example is a screening policy. Its scored controls capture what a system is — where it runs, how it was built, whether it uses personal data — so their options carry descriptive identifiers that screening rules can target, not compliance identifiers. Those controls are therefore informational and do not contribute to compliance status, which is correct for intake questions. For a control that assesses a requirement, follow the pattern in Compliance Identifiers.
Below is a real-world example of a complete policy configuration — ABC’s Responsible AI Pre-Screening Checklist. It demonstrates three control bundles with different purposes: project information (text inputs), general AI use case details (mix of text and scored choices), and a pre-screening checklist (scored multiple choice questions).
{
"organization": {
"name": "ABC",
"identifier": "com.example",
"pgId": "2"
},
"policies": [
{
"name": "ABC Responsible AI Assessment Checklist - Pre-Screening",
"identifier": "com.example.projectinfo",
"reportTemplateId": "com.example.rai.checklist",
"version": "1.0.1",
"description": "The purpose of this checklist is to assess projects involving AI-based solutions, ensuring alignment with ethical and responsible AI principles throughout their lifecycle.",
"link": "https://www.abc.example/",
"controlBundles": [
{ "identifier": "com.example.org", "version": "1.0.1" },
{ "identifier": "com.example.general", "version": "1.0.1" },
{ "identifier": "com.example.prescreen", "version": "1.0.1" }
],
"labels": [
"Inherent Risks",
"Not Started",
"Started",
"report.project.assessment_details.hide"
],
"applicableProjectTypes": ["AI_SYSTEM", "FUNCTIONAL_MODEL", "MODEL_CANDIDATE", "AGENT_CANDIDATE"],
"compliance": [
{ "level": "Non-Compliant", "compliant": false, "score_min": 0, "score_max": 49.9 },
{ "level": "Compliant", "compliant": true, "score_min": 50, "score_max": 79.9 },
{ "level": "Fully Compliant", "compliant": true, "score_min": 80 }
]
}
],
"controlBundles": [
{
"name": "Project Information",
"identifier": "com.example.org",
"version": "1.0.1",
"description": "Project information for this AI use case.",
"weight": 1.0,
"labels": ["project_info"],
"controls": [
{
"identifier": "org.name",
"name": "Organization Name",
"question": "Company or Organization Name",
"labels": ["org.name"],
"answerType": "TEXT_TEXT"
},
{
"identifier": "org.department",
"name": "Business Owner",
"question": "Business Owner (Division/Department/Unit)",
"labels": ["branch"],
"answerType": "TEXT_TEXT"
},
{
"identifier": "org.project",
"name": "Project Name",
"question": "Project Name",
"labels": ["project.name"],
"answerType": "TEXT_TEXT"
},
{
"identifier": "org.project.desc",
"name": "Project Description",
"question": "Project Description",
"labels": ["project.Description"],
"answerType": "TEXT_TEXT"
},
{
"identifier": "org.project.owner",
"name": "Project Owner",
"question": "Project Owner",
"labels": ["project.owner"],
"answerType": "TEXT_TEXT"
}
]
},
{
"name": "General Information",
"identifier": "com.example.general",
"version": "1.0.1",
"description": "General information for this AI use case.",
"weight": 1.0,
"labels": ["use_case_info"],
"controls": [
{
"identifier": "info.usercase",
"name": "AI Use Case / Purpose",
"description": "Describe the specific function, process, or business objective that the AI solution is designed to support or enhance.",
"question": "AI Use Case / Purpose:",
"labels": ["info.usercase"],
"answerType": "TEXT_TEXT"
},
{
"identifier": "info.app",
"name": "AI Application / System Name:",
"description": "Provide the name of the AI application or system.",
"question": "AI Application / System Name:",
"labels": ["info.app"],
"answerType": "TEXT_TEXT"
},
{
"identifier": "info.deployenv",
"name": "System Deployment Environment",
"description": "Specify the type of environment used to deploy or host this AI system.",
"question": "System Deployment Environment",
"labels": ["info.deployenv"],
"answerType": "SCORE_MULTIPLE_CHOICE",
"answerOptions": [
{
"type": "SCORE",
"value": 1,
"answer": "On-cloud (AWS)",
"identifier": "com.example.prescreen.deployenv.on_cloud_aws",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 1,
"answer": "On-cloud (Azure)",
"identifier": "com.example.prescreen.deployenv.on_cloud_azure",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 1,
"answer": "On-cloud (GCP)",
"identifier": "com.example.prescreen.deployenv.on_cloud_gcp",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 1,
"answer": "On-cloud (Other)",
"identifier": "com.example.prescreen.deployenv.on_cloud_other",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 1,
"answer": "On-premises",
"identifier": "com.example.prescreen.deployenv.on_premises",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 1,
"answer": "Hybrid (Cloud + on-premises)",
"identifier": "com.example.prescreen.deployenv.hybrid",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 1,
"answer": "SaaS (Third-party Hosted)",
"identifier": "com.example.prescreen.deployenv.saas",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
}
]
},
{
"identifier": "info.devapproach",
"name": "AI Development Approach",
"description": "Specify the type of AI model used in this system.",
"question": "AI Development Approach:",
"labels": ["info.devapproach"],
"answerType": "SCORE_MULTIPLE_CHOICE",
"answerOptions": [
{
"type": "SCORE",
"value": 1,
"answer": "External Prebuilt AI Service",
"identifier": "com.example.prescreen.devapproach.external_prebuilt_ai_service",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 1,
"answer": "In-house Custom Model Development",
"identifier": "com.example.prescreen.devapproach.in_house_custom_model_development",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 1,
"answer": "Fine-tuned Pretrained Model",
"identifier": "com.example.prescreen.devapproach.fine_tuned_pretrained_model",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 1,
"answer": "Open-Source Model Integration",
"identifier": "com.example.prescreen.devapproach.open_source_model_integration",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 1,
"answer": "Hybrid (External + Internal)",
"identifier": "com.example.prescreen.devapproach.hybrid",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 1,
"answer": "Third-party SaaS AI Solution",
"identifier": "com.example.prescreen.devapproach.third_party_saas_ai_solution",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "TEXT_TEXT",
"value": 1,
"answer": "Other (please specify): ",
"identifier": "com.example.prescreen.devapproach.other",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
}
]
},
{
"identifier": "info.vendor",
"name": "AI Model / Vendor Used",
"description": "Specify the model name, version, and vendor (e.g., GPT-4 by OpenAI).",
"question": "AI Model / Vendor Used:",
"labels": ["info.vendor"],
"answerType": "TEXT_TEXT"
},
{
"identifier": "info.datasources",
"name": "Primary Data Sources",
"description": "Identify the key data types used in this AI use case (e.g., financial transactions, customer profiles, audio data).",
"question": "Primary Data Sources:",
"labels": ["info.datasources"],
"answerType": "TEXT_TEXT"
}
]
},
{
"name": "Pre-RAI Screening Checklist",
"identifier": "com.example.prescreen",
"version": "1.0.1",
"description": "The purpose of this pre-screen checklist is to identify applicable checklist items.",
"weight": 1.0,
"labels": ["project_info", "operational_risks"],
"compliance_min_percent": 0,
"score_max": 0,
"controls": [
{
"identifier": "project.sysinterface",
"name": "User Interface with AI",
"description": "End-users interact directly with the AI (e.g., type, speak, or upload data).",
"question": "Does the system have an interface that allows end-users to input data or interact with the AI directly?",
"labels": ["project.ai.sysinterface"],
"answerType": "SCORE_MULTIPLE_CHOICE",
"answerOptions": [
{
"type": "SCORE",
"value": 1,
"answer": "Yes: The system has an interface that allows users to input data or interact directly with the AI.",
"identifier": "com.example.prescreen.sysinterface.yes",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 0,
"answer": "No: The system does not have an interface that allows users to input data or interact directly with the AI. It functions only as a backend engine for internal organizational use (e.g., data analytics, decision support).",
"identifier": "com.example.prescreen.sysinterface.no",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
}
]
},
{
"identifier": "project.sysfreeforminputs",
"name": "Free-Form Input or Prompt",
"description": "AI accepts open-ended inputs (not just fixed choices), like voice or typed queries.",
"question": "Does the system accept free-form inputs from end-users or backend sources?",
"labels": ["project.ai.sysinterface"],
"answerType": "SCORE_MULTIPLE_CHOICE",
"answerOptions": [
{
"type": "SCORE",
"value": 1,
"answer": "Yes: The system supports free-form inputs (e.g., text prompts, voice commands, or images). These inputs are open-ended and unstructured, allowing flexible interaction.",
"identifier": "com.example.prescreen.freeforminputs.yes",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 0,
"answer": "No: The system does not accept or interpret free-form inputs for generating content or making decisions. It only processes structured or predefined inputs.",
"identifier": "com.example.prescreen.freeforminputs.no",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
}
]
},
{
"identifier": "project.systrainedmodel",
"name": "Output from Trained Model",
"description": "AI generates results based on prior training, not just user-uploaded content.",
"question": "Does the AI system use a trained model that interprets user prompts to guide its responses or generate outputs?",
"labels": ["project.ai.systrainedmodel"],
"answerType": "SCORE_MULTIPLE_CHOICE",
"answerOptions": [
{
"type": "SCORE",
"value": 1,
"answer": "Yes: The system uses a trained AI model that interprets user prompts to guide its responses.",
"identifier": "com.example.prescreen.trainedmodel.yes",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 0,
"answer": "No: The system does not generate responses based on a trained model's generalization. It only processes or summarizes the specific content provided by the user.",
"identifier": "com.example.prescreen.trainedmodel.no",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
}
]
},
{
"identifier": "project.sysmodelresponse",
"name": "Model Access or Adjustability",
"description": "The model can be accessed or adjusted by your team (or vendor upon request).",
"question": "Can you influence or customize how the AI model responds, either by modifying the model itself or by shaping its behavior through prompt design, system instructions, or configuration options?",
"labels": ["project.ai.sysmodelresponse"],
"answerType": "SCORE_MULTIPLE_CHOICE",
"answerOptions": [
{
"type": "SCORE",
"value": 1,
"answer": "Yes: You can influence the AI's output through direct fine-tuning or retraining of the model, or by shaping its behavior using prompt design, system-level instructions, or configuration settings.",
"identifier": "com.example.prescreen.modelresponse.yes",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 0,
"answer": "No: You cannot influence how the AI responds. The system behaves in a fixed manner and does not support model fine-tuning, prompt engineering, or configuration changes.",
"identifier": "com.example.prescreen.modelresponse.no",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
}
]
},
{
"identifier": "project.sysdata",
"name": "Use of Personal or Sensitive Data",
"description": "The system uses or produces output based on personal or sensitive data.",
"question": "Does the AI system collect, process, store, or generate outputs based on personal or sensitive data?",
"labels": ["project.ai.sysmodelresponse"],
"answerType": "SCORE_MULTIPLE_CHOICE",
"answerOptions": [
{
"type": "SCORE",
"value": 1,
"answer": "Yes: The system handles any form of personal or sensitive data, whether directly or indirectly.",
"identifier": "com.example.prescreen.sysdata.yes",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
},
{
"type": "SCORE",
"value": 0,
"answer": "No: The system does not handle any personal or sensitive data in any form.",
"identifier": "com.example.prescreen.sysdata.no",
"thresholds": [0, 0.5, 1],
"riskScore": [0, 1],
"alignmentScore": [1, 1]
}
]
}
]
}
]
}
Key Patterns in This Example
This configuration demonstrates several important patterns:
| Pattern | Where | Description |
|---|---|---|
| Text-only bundle | com.example.org | Uses only TEXT_TEXT controls for metadata collection. Labeled project_info so it is not scored. |
| Mixed bundle | com.example.general | Combines TEXT_TEXT and SCORE_MULTIPLE_CHOICE controls. Uses use_case_info label. |
| Screening bundle | com.example.prescreen | All SCORE_MULTIPLE_CHOICE with Yes/No pattern. Sets score_max: 0 and compliance_min_percent: 0. |
| Descriptive option identifiers | com.example.prescreen | Every answer option carries an identifier such as ...sysdata.yes so screening rules can target it. These are deliberately not compliance identifiers — the controls describe the system rather than assessing it. |
| TEXT_TEXT option type | info.devapproach | Last answer option uses "type": "TEXT_TEXT" to allow free-text “Other” input alongside scored options. |
| Threshold scoring on SCORE options | All scored controls | Even SCORE type options include thresholds, riskScore, and alignmentScore for risk computation. |
| Report label | Policy labels | report.project.assessment_details.hide suppresses assessment detail in the generated report. |
| Compliance tiers | Policy | Three compliance levels with non-overlapping score ranges; highest tier omits score_max. |
| Project type scoping | Policy | applicableProjectTypes restricts which project types can use this policy. |
Enum Reference
AnswerType
| Value | Description |
|---|---|
SCORE_CHECKBOX | Multi-select with scoring |
SCORE_MULTIPLE_CHOICE | Single-select with scoring |
TEXT_TEXT | Single-line text input |
TEXT_TEXT_MULTI | Multi-line text input |
TEXT_TEXT_CHECKLIST | Checklist text input |
TEST_SCORE | Numeric input with threshold scoring |
CARD | Structured card data entry |
DOC_UPLOAD | File upload |
AnswerOptionType
| Value | Description |
|---|---|
SCORE | Fixed numeric score |
SCORE_THRESHOLD | Threshold-based scoring with buckets |
TEXT_TEXT | Text-only (no scoring) |
DimensionAggregationType
| Value | Description |
|---|---|
SUM | Sum all scores in the dimension |
AVG | Average all scores |
MAX | Take the maximum score |
MIN | Take the minimum score |
PERCENT | Calculate as a percentage |
DimensionScoreType
| Value | Description |
|---|---|
NA | Not applicable |
INFO | Informational severity |
WARNING | Warning severity |
CRITICAL | Critical severity |
PolicyLevel
| Value | Description |
|---|---|
SYSTEM | System-wide, available to all orgs |
ORGANIZATION | Scoped to a single organization |
ControlDataType
Input format hint for free-text answers and card fields.
| Value | Description |
|---|---|
TEXT | Plain text |
EMAIL | Email address |
DATE | Date |
ProjectType
| Value | Description |
|---|---|
AI_SYSTEM | Top-level AI system |
FUNCTIONAL_MODEL | Functional component of an AI system |
MODEL_CANDIDATE | ML model under evaluation |
MODEL_CHAMPION | Selected champion model |
AGENT_CANDIDATE | AI agent under evaluation |
VENDOR_AGENT | Third-party vendor agent |
VENDOR_MODEL | Third-party vendor model |
DATASET | Dataset |
ORGANIZATION | Organization-level |
Risk & Alignment Scoring
How status is produced
Status comes from the compliance labels described in Compliance Identifiers, rolled up in two stages:
Control a compliance label per answered control from your policy
Assessment rolls up the control labels platform thresholds
Project rolls up the assessment statuses platform thresholds
The thresholds that govern both roll-ups are configured once for the deployment and are not part of policy configuration — see System Configuration.
The numeric score fields
Answer options can also carry value, thresholds, riskScore and alignmentScore. These are a separate, older numeric aggregate. They do not produce a control’s compliance label, and changing them does not move an assessment’s status.
Where they still apply:
thresholdsandalignmentScoreon aTEST_SCOREcontrol’s option do determine that control’s label, through the bucket mapping described in Test score controls.- The numeric aggregate is surfaced on the policy-level project tables under Governance.
If you are authoring a new policy, set the compliance identifiers first: they are what determines status. Carry the numeric fields only where you need the aggregate or a TEST_SCORE bucket.
Versioning
Both policies and control bundles are versioned independently. This allows:
- Policy version bumps when the compliance structure changes (new bundles added, compliance levels adjusted).
- Control bundle version bumps when controls are added, removed, or modified.
The combination of identifier + version must be unique across the platform (within the same policy level).
Best Practices
-
Put a compliance identifier on every scored answer option:
SCORE_MULTIPLE_CHOICEandSCORE_CHECKBOXoptions need one offully_compliant,partially_compliant,not_compliantornot_applicableas their suffix. Without one the control is silently excluded from scoring. Screening questions are the deliberate exception — see Compliance Identifiers. -
Use reverse-domain identifiers: Follow the pattern
com.yourorg.policyname.bundlenamefor globally unique identifiers. -
Version carefully: Bump the version when making changes. Existing assessments reference a specific
identifier:versionpair. -
Set compliance levels: Define clear compliance tiers with non-overlapping score ranges.
-
Choose policy labels deliberately: A policy’s labels decide which governance tab its assessments appear in and which role reviews them, and bundle labels drive risk categories (
operational_risk,ai_tests). See Policy Labels and Special Labels. -
Mix answer types: Combine scored controls (
SCORE_CHECKBOX,SCORE_MULTIPLE_CHOICE) with qualitative controls (TEXT_TEXT,DOC_UPLOAD) for comprehensive assessments. -
Define thresholds consistently: Always ensure the
thresholdsarray has one more element than thealignmentScoreandriskScorearrays. Include thresholds onSCOREoptions too if you need risk/alignment computation. -
Keep controls atomic: Each control should ask one clear question. Use control bundles to group related questions.
-
Use
operational_risk(singular): Only the exact labeloperational_riskis recognized by the risk engine. Variants likeoperational_riskswill not trigger risk computation.