§22 Fundamental Rights Impact Assessment (FRIA) Protocol¶
Version: v3.0
Defines the Fundamental Rights Impact Assessment (FRIA) document format, conformance prerequisite, and ML-DSA-65 signing for EU AI Act notified body submission.
Overview¶
EU AI Act Art. 27 requires deployers of high-risk AI systems to conduct a Fundamental Rights Impact Assessment before deployment. Annex IV specifies the technical file that must accompany a conformity assessment submission to a notified body. RCAN §22 defines a machine-readable FRIA document that can be generated automatically from live conformance data, signed with the robot's ML-DSA-65 identity key, and submitted as part of that technical file.
The FRIA document is generated by the castor fria generate CLI command, which sources data from ConformanceChecker.run_all(), the robot identity in the RCAN config, and robot-memory.md hardware observation entries. A print-ready HTML companion is generated alongside the canonical JSON artifact.
Conformance: FRIA generation is required at L2+ (Secure tier and above). Deployments where conformance.score < 80 or any safety.* check fails are blocked unless --force is used (which sets prerequisite_waived: true).
Document Schema¶
{
"schema": "rcan-fria-v1",
"spec_ref": "https://rcan.dev/spec/section-22",
"generated_at": "2026-04-10T14:32:01.123Z",
"system": {
"rrn": "RRN-000000000001",
"rrn_uri": "rrn://org/robot/model/id",
"robot_name": "my-robot",
"opencastor_version": "2026.4.10.0",
"rcan_version": "3.0",
"agent_provider": "anthropic",
"agent_model": "claude-sonnet-4-6"
},
"deployment": {
"annex_iii_basis": "safety_component",
"intended_use": "indoor autonomous navigation",
"prerequisite_waived": false
},
"conformance": {
"score": 87,
"pass": 24,
"warn": 2,
"fail": 0,
"checks": [
{ "check_id": "safety.estop_configured", "category": "safety", "status": "pass", "detail": "ESTOP configured" }
]
},
"human_oversight": {
"hitl_configured": true,
"confidence_gates_configured": true,
"estop_configured": true
},
"hardware_observations": [
{ "id": "mem-abc01", "text": "Left motor stalls at 50% duty under load", "confidence": 0.82, "tags": ["motor"] }
],
"signing_key": {
"alg": "ml-dsa-65",
"kid": "rpi5-key-001",
"public_key": "<base64url ML-DSA-65 public key>"
},
"sig": {
"alg": "ml-dsa-65",
"kid": "rpi5-key-001",
"value": "<base64url signature>"
}
}
Field Reference¶
| Field | Type | Required | Description |
|---|---|---|---|
schema |
string | MUST | Always "rcan-fria-v1". Identifies document type. |
spec_ref |
string | MUST | Always "https://rcan.dev/spec/section-22". Provides stable citation URL for notified bodies. |
generated_at |
string | MUST | ISO-8601 UTC timestamp of document generation. |
system.rrn |
string | MUST | Robot Registration Number (RRN). Must match config metadata.rrn. |
system.rrn_uri |
string | SHOULD | RRN URI form (rrn://org/category/model/id). Recommended for §21 registry lookup. |
system.robot_name |
string | MUST | Human-readable robot name from config. |
system.opencastor_version |
string | MUST | Runtime version that generated this document. |
system.rcan_version |
string | MUST | RCAN protocol version the robot implements. |
system.agent_provider |
string | MUST | AI provider (e.g. "anthropic", "google"). |
system.agent_model |
string | MUST | AI model identifier. |
deployment.annex_iii_basis |
string | MUST | EU AI Act Annex III classification basis. See valid values below. |
deployment.intended_use |
string | MUST | Free-text description of the deployment context. |
deployment.prerequisite_waived |
boolean | MUST | true if the conformance gate was bypassed with --force. Notified bodies must treat waived documents as provisional. |
conformance.score |
integer | MUST | Conformance score (0–100). Must be ≥ 80 for L2+ deployments unless prerequisite_waived. |
conformance.pass/warn/fail |
integer | MUST | Count of checks by status. |
conformance.checks |
array | MUST | Full list of ConformanceResult entries with check_id, category, status, detail, fix (if applicable). |
human_oversight.hitl_configured |
boolean | MUST | true if HiTL authorization gates are enabled (§8). |
human_oversight.confidence_gates_configured |
boolean | MUST | true if per-scope confidence thresholds are set (§16.2). |
human_oversight.estop_configured |
boolean | MUST | true if emergency stop is configured. |
hardware_observations |
array | SHOULD | HARDWARE_OBSERVATION entries from robot memory with confidence ≥ 0.30. Supports Art. 17 quality management evidence. |
signing_key |
object | SHOULD | ML-DSA-65 public key reference. Required for L2+ deployments. Omitted when --skip-sign is used. |
sig |
object | SHOULD | ML-DSA-65 signature over canonical JSON (sort_keys, no whitespace, sig field absent). Required for L2+ deployments. |
Annex III Classification Bases¶
The deployment.annex_iii_basis field must be one of the following values, corresponding to the EU AI Act Annex III category under which the system is classified as high-risk.
| Value | Article | Description |
|---|---|---|
safety_component |
Annex III §1 | Safety components of products covered by Union harmonisation legislation |
biometric |
Annex III §2 | Biometric identification and categorisation |
critical_infrastructure |
Annex III §3 | Critical infrastructure management and operation |
education |
Annex III §4 | Education and vocational training |
employment |
Annex III §5 | Employment, workers management and access to self-employment |
essential_services |
Annex III §6 | Access to and enjoyment of essential private services and public services and benefits |
law_enforcement |
Annex III §7 | Law enforcement |
migration |
Annex III §8 | Migration, asylum and border control management |
administration_of_justice |
Annex III §9 | Administration of justice and democratic processes |
general_purpose_ai |
Annex III §10 | General-purpose AI systems |
Conformance Prerequisite¶
Before generating a FRIA document, the runtime verifies two conditions:
- Conformance score ≥ 80/100 (100 − (failures × 10) − (warnings × 3))
- Zero
safety.*check failures
If either condition fails, the command exits with a list of blocking checks and their recommended fixes. The --force flag bypasses the gate and sets prerequisite_waived: true in the document — this field is visible to the notified body and indicates the document is provisional.
# Conformance gate blocks generation when score < 80 or safety failures exist:
$ castor fria generate --config bot.yaml --annex-iii safety_component
FRIA generation blocked — conformance gaps must be resolved:
[safety.estop_configured] Emergency stop not configured
Fix: Set safety.emergency_stop in config
Use --force to generate despite conformance gaps.
Signing (ML-DSA-65)¶
The FRIA document is signed with the robot's ML-DSA-65 identity key — the same key used for RCAN message signing (§16.6). The signature covers the canonical JSON of the document with the sig field absent:
- Serialisation:
json.dumps(doc, sort_keys=True, separators=(',', ':')) - Algorithm: ML-DSA-65 (NIST FIPS 204) — post-quantum secure
- Key binding:
signing_key.kididentifies the key used - Verification: use
signing_key.public_key(base64url ML-DSA-65 public key)
Signing is required at L2+. Use --skip-sign only for development and testing — unsigned documents omit the sig and signing_key fields entirely.
EU AI Act Article Mapping¶
| FRIA Section | EU AI Act Provision | Description |
|---|---|---|
conformance block |
Art. 9 | Risk management system — conformance score and check evidence |
system block |
Art. 13 | Transparency — system identity, model, provider |
human_oversight block |
Art. 14 | Human oversight — HiTL, confidence gates, ESTOP |
hardware_observations |
Art. 17 | Quality management — observed hardware behaviour |
| Full document + sig | Art. 27 | FRIA obligation for public sector deployers |
spec_ref citation |
Annex IV | Technical documentation — citable specification reference |
Safety Benchmarks Integration¶
The safety_benchmarks field is embedded in the FRIA document to provide quantitative evidence of runtime safety performance. Benchmark results are generated by castor safety benchmark and referenced inline. When overall_pass: true, the field satisfies the Art. 15 performance and accuracy evidence requirement for notified body review. See §23 Safety Benchmark Protocol for the full schema.
"safety_benchmarks": {
"ref": "safety-benchmark-20260411.json",
"generated_at": "2026-04-11T09:00:00.000Z",
"mode": "synthetic",
"overall_pass": true,
"results": {
"estop": { "min_ms": 0.3, "mean_ms": 1.2, "p95_ms": 4.1, "pass": true },
"bounds_check": { "min_ms": 0.1, "mean_ms": 0.4, "p95_ms": 0.9, "pass": true },
"confidence_gate": { "min_ms": 0.05,"mean_ms": 0.1, "p95_ms": 0.3, "pass": true },
"full_pipeline": { "min_ms": 0.4, "mean_ms": 1.8, "p95_ms": 5.2, "pass": true }
}
}
Compliance Package¶
A complete EU AI Act Art. 43 compliance submission for an Annex III system consists of the following companion artifacts, each with its own machine-readable schema and CLI generation command.
| Document | Schema | Article | Generated by |
|---|---|---|---|
| FRIA | rcan-fria-v1 |
Art. 43 | castor fria generate |
| Safety Benchmark | rcan-safety-benchmark-v1 |
Art. 15 | castor safety benchmark |
| Instructions for Use | rcan-ifu-v1 |
Art. 13 | castor ifu generate |
| Incident Log | rcan-incidents-v1 |
Art. 72 | castor incidents |
| EU Register Submission | rcan-eu-register-v1 |
Art. 49 | castor eu-register |
v3.0 Breaking Change: Annex III Registration Prerequisite¶
v3.0 Breaking Change: REGISTRY_REGISTER for Annex III systems now requires metadata.compliance.fria_ref. Registration attempts without this field are rejected.
Prior to v3.0, REGISTRY_REGISTER accepted registrations for Annex III systems without a FRIA reference. From v3.0, the registry enforces that a signed FRIA document reference must be present in metadata.compliance.fria_ref before registration is accepted.
{
"metadata": {
"rrn": "rrn://org/robot/model/id",
"robot_name": "my-robot",
"compliance": {
"annex_iii_basis": "safety_component",
"fria_ref": "fria-20260411-signed.json"
}
}
}
CLI Reference¶
# Generate FRIA for a safety-critical deployment
castor fria generate \
--config bob.rcan.yaml \
--annex-iii safety_component \
--intended-use "Indoor autonomous navigation" \
--output fria-bob-2026.json
# Output:
# FRIA artifact: fria-bob-2026.json
# HTML companion: fria-bob-2026.html
Outputs:
fria-{rrn}-{date}.json— Signed canonical JSON artifact (citable in Annex IV technical file)fria-{rrn}-{date}.html— Print-ready HTML companion for notified body submission