Summary
Implements CLP-07-005: the CaseActor commit boundary SHOULD enforce CLP-07-001 through CLP-07-004 with a runtime guard that rejects non-canonical entries before they enter the hash chain.
The guard MUST validate, at commit time, that the candidate CaseLedgerEntry:
- Has a non-empty
payloadSnapshot (unless disposition is rejected).
- The
payloadSnapshot is a recognized protocol-significant AS2 activity type from the allowlist defined in notes/case-ledger-authority.md § "Canonical Entry Criteria".
- The
payloadSnapshot.actor is set and is a valid participant or external party identity (not the CaseActor itself unless the activity is genuinely CaseActor-authored, e.g., Announce(VulnerabilityCase)).
- Nested protocol objects in the snapshot are inlined (no bare ID-string substitutions) — CLP-07-006.
- Context values use the case URI for case-scoped snapshots — CLP-07-007.
Guard violations MUST raise a domain-specific exception (VultronCanonicalEntryError or similar) that fails the request fast rather than silently polluting the chain.
Acceptance Criteria
Reference
Source concern: #923
Parent epic: #788
Test harness: #925 (this PR MUST flip the named xfail to passing)
Docs PR: #924
ADR: docs/adr/0019-separate-case-ledger-from-process-log.md
Spec: specs/case-ledger-processing.yaml (CLP-07)
Notes: notes/case-ledger-authority.md
Summary
Implements CLP-07-005: the CaseActor commit boundary SHOULD enforce CLP-07-001 through CLP-07-004 with a runtime guard that rejects non-canonical entries before they enter the hash chain.
The guard MUST validate, at commit time, that the candidate
CaseLedgerEntry:payloadSnapshot(unless disposition isrejected).payloadSnapshotis a recognized protocol-significant AS2 activity type from the allowlist defined innotes/case-ledger-authority.md§ "Canonical Entry Criteria".payloadSnapshot.actoris set and is a valid participant or external party identity (not the CaseActor itself unless the activity is genuinely CaseActor-authored, e.g.,Announce(VulnerabilityCase)).Guard violations MUST raise a domain-specific exception (
VultronCanonicalEntryErroror similar) that fails the request fast rather than silently polluting the chain.Acceptance Criteria
_validate_canonical_entry()) runs at the CaseActor's single commit boundary beforelog_entry.append()(or equivalent).payloadSnapshotactivity types is defined in code with a clear extension pattern; adding a new allowed type is a one-line change with a corresponding test.Reference
Source concern: #923
Parent epic: #788
Test harness: #925 (this PR MUST flip the named xfail to passing)
Docs PR: #924
ADR:
docs/adr/0019-separate-case-ledger-from-process-log.mdSpec:
specs/case-ledger-processing.yaml(CLP-07)Notes:
notes/case-ledger-authority.md