v0.51.0: SEP-2828 Check B outcome-to-decision pairing#186
Conversation
Pairing now enforces two checks: Check A (instance anchor on the shared attestation back-link) and Check B (the outcome record commits to a sha256 over the full signed decision wire bytes via outcomeDerived.decisionDigest). Check A alone could not say which decision a call ran under when several shared an attestation; Check B closes that gap. The field is additive, envelope version stays 1. Adds decision_digest and superseding_decision (latest decidedAt, tie broken by lowest issuerAsserted.nonce) to the public surface, a seventh conformance vector (substituted_decision_under_shared_attestation), and resolves the supersession-tie winner. Independent stdlib walker: 7/7. SEP draft updated (Check A/B, decisionDigest, supersession tie-break, refer/AskUser to escalate enum note, fallback, verification step, prior-art reconciliation). 1162 passed.
|
Caution Review failedPull request was closed or merged during review 📝 WalkthroughWalkthroughThis PR implements decision digest binding as a normative pairing check (Check B) for execution-record verification: receipts must commit to a deterministic SHA256 JCS-canonicalized digest of the decision they reference, validated against computed decision digests during pairing, alongside deterministic supersession tie-breaking by lexicographic nonce. ChangesDecision Digest Commitment for Receipt Pairing
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Adds Check B (outcome-to-decision content binding) to the SEP-2828 decision/outcome pairing, the field both independent implementers (XuebinMa/agent-guard emitter, Rul1an/Assay consumer) were waiting on.
What changes
outcomeDerived.decisionDigest:sha256:<hex>over the JCS-canonical full signed decision-record wire bytes (signature included). Optional on the type so pre-v0.51 records and the no-attestation fallback still parse, but a v0.51 emitter MUST set it.records_pairednow enforces both checks: Check A (instance anchor: samebackLinkattestation digest + nonce) and Check B (the receipt'sdecisionDigestequals this decision's digest). A receipt withoutdecisionDigestdoes not pair: content binding is mandatory, not best-effort.superseding_decision: among decision records sharing a back-link, the latestdecidedAtis effective; ties break on the lexicographically lowestissuerAsserted.nonce, so every verifier picks the same winner without a clock. Sound because the SEP constrains timestamps to RFC3339 UTC second-precision with trailingZ.substituted_decision_under_shared_attestation: Check A passes, Check B fails (the receipt commits to a different decision under the same attestation).Envelope version stays 1; the field is additive.
Verification
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Documentation
Chores