Agnostic risk model
froga’s risk model is standard-agnostic: a risk is declared once with canonical primitives; a declarative projection per standard renders it into the vocabulary and artifacts that standard requires. The treatment loop — git closing the ISO 23894 cycle — is the universal core; what changes from standard to standard is only the vocabulary and the required artifacts.
“At their core, all standards are the same.”
The projection principle at the risk level
Section titled “The projection principle at the risk level”This mechanism is the exact analogue of conformance by projection applied at the risk level. The correspondence is:
| Measure level | Risk level |
|---|---|
froga conformance projects measures onto clauses | froga risk-projection projects risks onto required artifacts |
| Per-standard clause catalogue | Per-standard risk projection catalogue |
conformance/<slug>.json signed | risk-projection/<slug>.json signed |
Each projection lives in crates/froga-core/resources/risk-projections/<f>.yaml and defines:
vocabulary— how the canonical primitives are called in that standard (e.g.source: hazardin ISO 14971).required_artifacts— what artifacts the standard requires per risk, and how to satisfy them from the already-declared primitives.scoring— which scoring seam the standard uses.
The function derive_risk_projection(risks, def, bundle, ap, approval_present) (crates/froga-core/src/risk_projection.rs) applies the projection risk by risk, artifact by artifact, and produces a Covered / Partial / Gap decision per required artifact — reusing ConformanceDecision and the conformance evidence evaluator.
Canonical risk primitives
Section titled “Canonical risk primitives”Each risk in froga.yaml is declared with three causal-chain primitives:
| Primitive | Meaning |
|---|---|
source | Origin of the hazard (e.g. bias in training data) |
pathway | Route by which the hazard can cause harm |
consequence | Potential harm to people or the organisation |
The benefit_risk field declares the benefit that offsets the risk when the standard requires it (ISO 14971). All four fields are optional by default (serde(default)); their absence produces Gap for the artifacts that need them.
Scoring (likelihood × impact) follows the ScoringModel seam: the default implementation FiveByFive reproduces exactly the ISO 23894 5×5 matrix (see ISO 23894 as a projection).
Supported frameworks
Section titled “Supported frameworks”| Framework | Canonical id | source vocabulary |
|---|---|---|
| ISO 14971:2019 (medical device safety) | iso/14971@2019 | hazard → hazardous situation → harm |
| prEN 18228:2026 (AI product requirements, AI Act) | eu/pren-18228@2026 | source → pathway → consequence |
| ISO 23894:2023 (AI risk management process) | iso/23894@2023 | source → pathway → consequence |
ISO 23894 is now re-conducted as a projection: the projected residual level matches byte-for-byte the residual_overall computed by the engine (parity test included).
Using froga risk-projection
Section titled “Using froga risk-projection”froga risk-projection --repo . --framework iso/14971@2019froga risk-projection --repo . --framework eu/pren-18228@2026froga risk-projection --repo .Without --framework, the command iterates applicable_standards ∩ catalog and generates one projection per applicable framework in a single invocation (N-in-1).
The output indicates, per risk and per required artifact:
✅ COVERED— the declared primitive satisfies the artifact.⚠ PARTIAL— the primitive exists but the evidence is incomplete.❌ GAP— the primitive is not declared or the evidence signal is missing.
The signed artifact and Annex IV §5
Section titled “The signed artifact and Annex IV §5”With --out (implicit in N-in-1 mode), the command writes the signed artifacts:
.froga/risk-projection/iso_14971_2019.json ← signed FrogaArtifact<RiskProjection>.froga/risk-projection/iso_14971_2019.json.sig ← DSSE envelope · in-toto · ECDSA-P256The projection is on-demand: it is never sealed in the bundle. It is derived from the already-signed bundle.risk_analysis and signed as a separate artifact — the same pattern as froga conformance. Existing signed bundles remain byte-identical.
The control plane (cloud) reads the verified artifacts and renders them in Annex IV §5 at /[org]/systems/[slug]/annex-iv, showing the projection status per applicable framework.
New standard = one projection YAML
Section titled “New standard = one projection YAML”The payoff of the agnostic model: adding a new normative framework does not require changing the engine core. It is enough to add a projection YAML in crates/froga-core/resources/risk-projections/ with its vocabulary, required artifacts, and scoring.
Candidates already on the roadmap: ISO 31000, ISO/IEC 27001, ISO 26262 (automotive), ARP4761 (aeronautics), Basel/NIST AI RMF (finance). Each = one YAML, no rewrite of the engine.
Evidence signals and their scope
Section titled “Evidence signals and their scope”Artifacts with satisfied_by.evidence in the projection catalogues now resolve using real signals from the signed bundle — the same evaluator (evidence_present) used by froga conformance. They no longer return a fixed Gap.
Available signals and their honest proxies:
| Signal | Proxy in the bundle or AP |
|---|---|
monitoring_plan | Non-empty review_interval in the bundle or ≥ 1 measure with lifecycle: [monitoring] in the AP |
power_stats | ≥ 1 ControlResult.power present in the bundle |
approval | Real Froga-Approved-by: act in git (lifecycle Approved or UnderReview) |
signed_bundle | Bundle present (by definition, when the command is invoked) |
signed_bom | bom field present in the bundle (CycloneDX) |
affected_persons | ≥ 1 system with affected_persons declared in the AP |
foreseeable_misuse | ≥ 1 system with foreseeable_misuse declared in the AP |
Honest nuance: monitoring_plan certifies a declared plan (review_interval or lifecycle:monitoring measures), not sustained operational post-market evidence. A notified body will further distinguish whether the plan carries Art. 72 semantics (normative citation + trigger + ISO 8601 frequency — actionable plan) from an unverifiable commitment (audit-only). The decision basis states this without ambiguity.
Artifacts evaluated from risk primitives (source, pathway, consequence, benefit_risk) and from built-in criteria (residual_present, overall_residual) do not use these signals and resolve directly from the RiskAssessment.
Integration with conformance by projection
Section titled “Integration with conformance by projection”Both projections coexist and complement each other:
froga conformanceprojects at the measure level: proves that a control satisfies clauses of a standard.froga risk-projectionprojects at the risk level: proves that the risk and its management satisfy the standard’s risk process.
Both derive from the same signed bundle.json and produce independent signed artifacts. Annex IV §5 renders them together.
References
Section titled “References”- Dual-standard conformance — projection at the measure level (analogue in
froga conformance) - ISO 23894 as a projection — the
ScoringModel::FiveByFiveseam and scoring parity - CLI
frogareference — full documentation offroga risk-projection - git closes the ISO 23894 treatment loop — the treatment loop as universal core