Governance MKP core
EVID_CHAIN (hash‑chained VC‑signed anchors), DUTY_LEDGER (roles, SLAs, breach hooks), and the one‑switch Regulatory Mode profile.
AD‑21 [RM] — Regulatory Mode, Evidentiary Chain & Duty Ledger
This card bundles three tightly‑coupled elements:
- EVID_CHAIN — tamper‑evident, VC‑signed log anchoring for chain‑of‑custody.
- DUTY_LEDGER — role‑based duties, SLAs and breach notifications.
- Regulatory Mode [RM] — a one‑switch profile for audits/regulated deployments.
Earlier cards (AD‑08, AD‑18, AD‑20) carry pieces of this already; AD‑21 is the “tie it all together and flip one switch” spec.
Aliases: None Cluster: Governance Depends on: AD‑08 [SO], AD‑06 [DG], AD‑04 [TG], AD‑12 [OP], AD‑14 [DS], AD‑18 [SE], AD‑20 [DP]
0. For humans
What question does this answer?
“If a regulator or court shows up tomorrow, can we: (a) verify the integrity and declared provenance of the record of what happened, (b) show who was responsible for fixing it and whether they did, and (c) flip into a mode where all of this is visible and conservative by default?”
How do I know it’s live?
Sample checks:
- FHR/DDL records have sequential chain fields and
evid_chain_batch_id; post-close exports resolveevid_chain_anchor_idand proof, alongsidelegal_hold,duty_ledger_id, andbreach_notif_sent. - There is a VC‑style anchor artefact for each day/batch and an external anchor log you can verify.
- Incidents and present‑options flows link into DUTY_LEDGER entries with roles, SLAs and notifications.
- Toggling
regulatory_modevisibly changes: TTLs, gate beacons in the UI, logging detail, veto‑reason exposure and appeal hooks.
Where do I see it?
- Compliance / governance UI — view RM profile, DUTY_LEDGER tables, appeal SLAs, anchors.
- Log explorer / FHR search — filter by
evid_chain_anchor_id,duty_ledger_id,regulatory_mode,jurisdiction_profile_id. - Audit tools — run anchor verification for EVID_CHAIN, export duty chains for a given incident.
Quick checklist
- Implemented if: (1) EVID_CHAIN is canonically serialised, sequentially hash-linked, VC-signed, clock-synchronised, externally anchored, and late-bound without source-record mutation; (2) DUTY_LEDGER exists with roles, SLAs, breach hooks; (3) the AD‑08 chain/batch fields,
legal_hold,duty_ledger_id, andbreach_notif_sentexist in FHR; (4) documented Regulatory Mode profile with conservative defaults, active beacons, jurisdiction tags, shortened PC TTL, expanded logging, auto-exposed veto reasons - Key artefacts:
evid_chain_anchor.schema.json,duty_ledger.schema.json,regulatory_mode.yaml - Key FHR fields:
evid_chain_batch_id,evid_chain_stream_id,record_sequence_no,prev_record_hash,record_hash,canonicalization_scheme,canonicalization_version,hash_algorithm_id,merkle_tree_scheme_id,writer_id,signer_key_id,evid_chain_anchor_id,evid_chain_proof_ref,duty_ledger_id,breach_notif_sent,regulatory_mode,jurisdiction_profile_id,appeal_id - Key failure codes: breach notification events, appeal SLA violations
- Escalation path: incident → DUTY_LEDGER entry → breach notification → appeal with human review SLA
1. Role & questions AD‑21 answers
AD‑21 is designed to answer:
- Evidence / logs:
- “Are your logs tamper-evident and clock-synchronised, so a court or regulator can verify their integrity and declared provenance?”
- “Can we reconstruct MRP/MPM decisions without having the weights?”
- Duties & liability:
- “For a harmful flow, who owed what duties, who acknowledged what, and who fixed what?”
- Appeal & explainability:
- “Is there a clear appeal SLA and exposure of veto reasons to satisfy ‘right to contest’ clauses?”
- Regulatory posture:
- “Is there a documented ‘Regulatory Mode’ profile that tightens defaults, shortens TTLs, exposes jurisdiction tags, and turns on full logging?”
AD‑21 makes these guarantees executable: it defines the EVID_CHAIN & DUTY_LEDGER structures and the regulatory_mode profile that turns them up to 11.
2. High‑level structure & invariants
AD‑21 components
- EVID_CHAIN
- Canonically serialised, sequentially hash-linked, VC-signed, clock-synchronised log anchors; daily Merkle root anchored externally.
- Fields:
evid_chain_batch_id, sequential record-hash metadata, late-boundevid_chain_anchor_id/ proof association,legal_hold(shared with AD‑20), plus per-anchor metadata. - DUTY_LEDGER
- Role matrix (developer/deployer/operator/user), SLAs (ack/fix), remediation and breach‑notification hooks.
- Fields:
duty_ledger_id,breach_notif_sent. - Regulatory Mode [RM]
-
regulatory_mode = onprofile: conservative defaults, active gate beacons, jurisdiction tags on outputs, shortened PC TTL, expanded logging, auto‑exposed veto reasons via API/UI.
Hard invariants
You can only claim AD‑21‑conformant if:
- EVID_CHAIN uses a schema-defined record body, declared canonical serialization, domain-separated per-stream sequential record hashing with atomic sequence allocation, deterministic cross-stream batch ordering, a declared domain-separated Merkle-tree scheme, VC-signed anchors, clock synchronisation, and daily or smaller declared-batch external anchoring. Anchor association never mutates the source record.
- DUTY_LEDGER exists with roles, SLAs and breach hooks, and its IDs are referenced from FHR/UDR where duties are engaged.
- Sequential chain/batch fields, late-bound
evid_chain_anchor_id/ proof references,legal_hold,duty_ledger_id, andbreach_notif_sentexist in FHR/DDL schema via AD‑08. - A documented Regulatory Mode profile is present (AD‑21 [RM]) with:
- conservative gating defaults,
- active gate beacons,
- jurisdiction tags on outputs,
- shortened PC TTL,
- expanded logging,
- auto‑exposed veto reasons.
Degrees of freedom:
- Exact SLA numbers (e.g. 24h vs 48h for appeals),
- VC scheme choice (e.g. which VC flavour / PKI),
- External anchoring mechanism (transparency log vs notary vs internal anchor + witness),
provided the invariants are still satisfied.
3. EVID_CHAIN — Evidentiary chain
3.1 Data model
Core concept
EVID_CHAIN = canonically serialised, sequentially hash-linked FHR/DDL artefacts with VC-signed, clock-synchronised anchors, Merkle-rooted daily or by a smaller declared batch window.
Key elements:
- Canonical record and sequential hash:
- Each FHR/DDL record declares
canonicalization_scheme,canonicalization_version, andhash_algorithm_id. - The versioned schema defines
record_body_iby excluding chain outputs and late-bound/transport fields:record_hash,prev_record_hash,evid_chain_stream_id,record_sequence_no,writer_id,signer_key_id,evid_chain_anchor_id,evid_chain_proof_ref, and transport metadata. Implementations may not choose exclusions ad hoc. evid_chain_stream_ididentifies the immutable sequencing partition (for example a ledger shard/writer stream).record_sequence_nois allocated atomically and monotonically within that stream;prev_record_hashalways links to the preceding record in the same stream. A stream may have one active sequencer or an equivalent consensus/serializable allocation mechanism, never competing uncoordinated writers.- In writer order, construct the domain-separated object:
chain_input_i = {domain: "SRF-EVID-v2", record_body: record_body_i, evid_chain_stream_id, prev_record_hash, record_sequence_no, writer_id, signer_key_id}and computerecord_hash_i = H(canonicalize(chain_input_i)). The structured canonical object, rather than delimiter-free string concatenation, makes field boundaries and types unambiguous. - The record stores
record_sequence_no,prev_record_hash,record_hash,writer_id, andsigner_key_id. Sequence gaps, duplicate sequence numbers, or previous-hash mismatches are verification failures. - Merkle tree per batch/day:
- For each 24h window (or smaller declared batch), sort records by the deterministic tuple
(evid_chain_stream_id as UTF-8 bytes, record_sequence_no); duplicate tuples or a per-stream gap are verification failures. Compute Merkle rootR_dover that ordered set ofrecord_hash_ileaves using the declaredmerkle_tree_scheme_id. The default is RFC6962-style domain separation:leaf_hash = H(0x00 || record_hash_bytes)andnode_hash = H(0x01 || left_hash || right_hash); odd-node handling follows the named scheme rather than implementation preference. - VC‑signed anchor:
- Construct an “anchor credential” containing:
root_hash = R_d,merkle_tree_scheme_id,leaf_count, andevid_chain_batch_id,day = YYYY‑MM‑DD,clock_source(NTP stratum or similar),issuer(operator/developer),jurisdiction_profile_id(for RM).
- Sign this as a Verifiable Credential (VC) and publish / store immutably.
- Batch and anchor identity:
- Each record receives
evid_chain_batch_idandevid_chain_stream_idbefore emission. At batch close, the anchor receivesevid_chain_anchor_idand each record receives a Merkle proof reference through an immutable append-only association index keyed by(event_id, evid_chain_stream_id, record_sequence_no, record_hash, evid_chain_batch_id). - The original FHR/DDL/WORM record is never rewritten to insert a late-bound anchor ID. Exports may project the associated
evid_chain_anchor_idandevid_chain_proof_refalongside the unchanged source record. - External anchoring:
- Daily root
R_d(or the VC hash) is anchored to an external system (e.g. transparency log, notarised bulletin) to make tampering publicly detectable.
3.2 Protocol / mechanism
Write path
- Allocate
evid_chain_batch_id,evid_chain_stream_id, the stream-atomicrecord_sequence_no,writer_id, canonicalization identifiers, and the same-streamprev_record_hash; emit the immutable FHR/DDL record with its computedrecord_hash(AD‑08, AD‑18, AD‑20). - Append
(event_id, evid_chain_stream_id, record_sequence_no, record_hash, evid_chain_batch_id)to the batch builder; finalisation applies the declared deterministic tuple order. - At end of batch/day:
- finalise Merkle tree, compute
R_d; - issue VC anchor credential; - store signed VC and external anchor; - appendevid_chain_anchor_id, proof reference, and association timestamp to the immutable association index for each record; never rewrite the source record.
Read / verification path
For audit, given a record:
- Rebuild the schema-defined
record_body, canonicalise the domain-separated chain object, and recomputerecord_hash; verify stream identity, per-stream sequence number, writer identity, signer-key identity, and same-streamprev_record_hashlinkage. - Resolve
evid_chain_batch_idthrough the immutable association index to obtainevid_chain_anchor_idandevid_chain_proof_ref. - Fetch the corresponding VC anchor and Merkle proof.
- Verify:
- VC signature;
- declared canonicalisation and Merkle-tree scheme;
- Merkle path
record_hash_i→R_d; - external anchor consistency (if using a transparency log or similar).
This supports tamper-evident integrity, ordering, and declared-provenance claims under the stated controls. Legal admissibility and evidentiary weight remain jurisdiction- and proceeding-specific.
3.3 Legal hold interaction
Legal hold semantics are shared with AD‑20:
legal_hold = trueon a record or batch:- forbids mutation / erasure of the record;
- forbids mutation of its EVID_CHAIN anchor;
- ensures anchors for that range are retained beyond default TTLs.
The EVID_CHAIN VC may be offered as an integrity/provenance artefact in discovery, audit, or court. AD‑21 defines the infrastructure; AD‑20 defines policy on preservation and disclosure. Neither card predetermines admissibility or weight.
4. DUTY_LEDGER — Duties, SLAs, breaches
4.1 Data model
Concept
DUTY_LEDGER is the structured record of “who owed what duty, to whom, when, and whether they met it”.
Core fields (minimum):
duty_ledger_id— primary key for a duty‑bundle (one incident, one flow, one appeal, etc.).roles— {developer, deployer, operator, user} with per‑role flags:duty_present,acked,breach.sla_ack,sla_fix— SLAs in hours for acknowledgement and fix.ack_ts,fix_ts— actual times; used to evaluate SLA compliance.breach_notif_sent: bool,breach_notif_ts— whether/when breach notification was sent.
Extended fields (interplay with AD‑20/AD‑12):
harm_triage_id— link to harm triage record.udr_id— link to User Decision Record (present‑options).appeal_id,appeal_sla,appeal_resolved_ts— appeal‑path metadata (right to contest).jurisdiction_profile_id— inherited from RM profiles.
4.2 Protocol / lifecycle
DUTY_LEDGER entries are created when:
- A present‑options flow in a regulated/NO‑GO‑adjacent domain occurs (triage + duty).
- A gate or veto is later contested (appeal).
- An incident / breach affecting users or regulators is declared.
Lifecycle:
- Creation:
- Attach
duty_ledger_idto relevant FHR/UDR events. - Initialise roles, SLAs (from PEL/Regulatory Mode profile). - Acknowledgement:
- Operator or responsible role acknowledges;
ack_tsset; SLA compliance computed. - Remediation / fix:
- Fix or mitigation executed;
fix_tsset. - Breach notification (if needed):
- If SLAs breached or regulatory criteria met,
breach_notif_senttoggled; notification logged withbreach_notif_ts, recipients. - Closure: - Duty ledger entry marked resolved/closed once obligations met and notifications sent.
Placement:
- Semantics & requirements in AD‑21 (DUTY_LEDGER).
- Fields in AD‑08 [SO].
- Operational procedures in AD‑12 [OP] and present‑options policy in AD‑20 [DP].
5. Regulatory Mode [RM]
5.1 Concept & trigger
Concept
A one‑switch profile for audits and constrained deployment.
Flag:
regulatory_mode∈ {off, on} (or a richerregulatory_profile_idmapping to AD‑21 [RM] profiles).
When regulatory_mode = on, AD‑21 requires:
- conservative defaults;
- active gate beacons;
- jurisdiction tags on outputs;
- shortened PC TTL;
- expanded logging;
- auto‑exposed veto reasons via API/UI.
5.2 Behavioural changes when RM is on
Conservative defaults
- Tighten op‑points and Δ‑bands in safety/NO‑GO‑adjacent domains (by referencing AD‑16/17/19 profiles).
- Tilt MPM towards ask_first / present_options / refuse over “confident emit” in higher‑risk contexts.
Gate beacons
- Gate state becomes visible in UI/API (e.g. ring beacons like SIF:BLOCK, EHG:ASK_FIRST, SPD:NEUTRALISED).
- FHR exposes beacon fields so regulators can see which ring engaged.
Jurisdiction tags on outputs
- All relevant outputs carry
jurisdiction_profile_idand related tags, visible to both user and logs.
Shortened PC TTL
- Phenomenology Channel TTLs shorter than default (e.g. from 14d to 7d or deployment‑specific), unless DPIA says otherwise; still erase‑on‑request.
Expanded logging
- Higher sampling rates; more detailed fields turned on (e.g. full gate_eval_record, with its compact gates_snapshot projection, SPD details, UDR links) consistent with minimisation.
- EVID_CHAIN anchors and DUTY_LEDGER IDs attached to more events by default.
Auto‑exposed veto reasons
- For refusals/rollbacks/vetoes, API/UI surfaces human‑readable gate reasons (e.g. “policy X, jurisdiction Y, risk class Z”), within explainability constraints.
- FHR includes machine‑readable veto codes and references to policy/quorum sources, so appeals can be audited.
5.3 Appeal SLA & exposure
AD‑21 [RM] requires:
appeal_sla_hoursdefined per jurisdiction profile.appeal_id,appeal_open_ts,appeal_resolved_ts,appeal_outcomefields in DUTY_LEDGER / UDR.- Human‑review escalation ladder documented (AD‑14 [DS] UX; AD‑12 [OP] for runbooks).
In RM on‑mode:
- appeals must be routed to human review by default;
appeal_slametrics appear in dashboards and FHR.
6. Artefacts & FHR fields (AD‑21 slice)
Artefacts
/schemas/evid_chain_anchor.schema.json- VC structure; fields for
root_hash,batch_id,batch_window,leaf_count,merkle_tree_scheme_id,canonicalization_scheme,canonicalization_version,hash_algorithm_id,clock_source,issuer,signer_key_id, andjurisdiction_profile_id. /schemas/duty_ledger.schema.json- DUTY_LEDGER record: roles, SLAs, timestamps, breach flags, incident links.
/profiles/regulatory_mode.yaml- Regulatory mode profile:
regulatory_mode_default,- gating defaults,
- PC TTL override,
- logging knobs,
- appeal SLAs.
FHR / DDL fields
(implemented via AD‑08 [SO]; semantics from AD‑20 + AD‑21)
evid_chain_batch_id,evid_chain_stream_id,evid_chain_anchor_id(nullable before batch close),evid_chain_proof_ref(nullable before batch close)record_sequence_no,prev_record_hash,record_hashcanonicalization_scheme,canonicalization_version,hash_algorithm_id,merkle_tree_scheme_id,writer_id,signer_key_idlegal_hold,legal_hold_reason,legal_hold_ts(shared with AD‑20)duty_ledger_idbreach_notif_sent,breach_notif_tsregulatory_modeorregulatory_profile_idjurisdiction_profile_id- (in UDR/DUTY records)
harm_triage_id,appeal_id,appeal_sla,appeal_resolved_ts
7. Interfaces & cross‑links
- AD‑08 [SO] — FHR schema & observability
- Implements EVID_CHAIN & DUTY_LEDGER fields; carries
regulatory_mode,jurisdiction_profile_id, legal‑hold metadata. - AD‑20 [DP] — Data Protection & Retention
- Defines PC/OC retention, legal hold, duties & harm semantics and DPIA; AD‑21 provides the cryptographic and ledger plumbing for evidentiary chain and duties.
- AD‑04 [TG] — Truth & Norm Gates, Contestability
- Provides PEL NO‑GO gating (G1) and routing; RM uses them for conservative defaults and gate beacons.
- AD‑12 [OP] — Ops & runbooks
- Uses DUTY_LEDGER IDs and EVID_CHAIN anchors in incident/rollback runbooks and breach notifications.
- AD‑14 [DS] — UX / Decision Surfaces
- Regulatory Mode exposure: gating beacons, veto reasons, appeal UX, scope banners.
- AD‑18 [SE] & AD‑19 [CI]
- Runtime and CI honour RM profiles (e.g. extra logging, stricter thresholds, more rigorous benches) and stamp EVID_CHAIN & DUTY_LEDGER fields where relevant.
8. Acceptance: when can you say "AD‑21 is implemented"?
You can claim AD‑21 [RM] is live if:
- EVID_CHAIN records are canonically serialised, sequentially hash-linked, VC-signed, clock-synchronised, and externally anchored daily or by the declared smaller batch; source records remain immutable and anchor/proof association verifies cleanly from audit tooling.
- DUTY_LEDGER exists with roles, SLAs and breach hooks, and incidents traverse the full lifecycle: creation → acknowledgement → remediation → breach notification where required → closure.
- FHR carries the chain and batch fields registered in AD‑08, plus
legal_hold,duty_ledger_id, andbreach_notif_sent; post-close exports resolveevid_chain_anchor_idand proof without source-record mutation. - A documented Regulatory Mode profile exists (
regulatory_mode.yaml) with conservative defaults, active beacons, jurisdiction tags, shortened PC TTL, expanded logging and auto‑exposed veto reasons, switchable as one profile. - Appeals carry
appeal_idand resolve within the human‑review SLA recorded in the ledger.
Related cards:
- AD‑30 [SC] (evidentiary chain includes memory write/erase events; legal hold interacts with memory retention).
- AD‑32 [PG] (evidentiary chain includes pack authorship records, challenge events, retirement decisions; appeal path for dismissed pack challenges routes through AD‑21 governance).