approval-engine/docs
tegwick 87e55e2bca Carry threshold evidence on issuance and use events
GH-DEC-2026-005 moved the distinct-approver check off the PEP onto this
engine's valid_now. secrets-engine has implemented the split and reports
it no longer verifies the threshold independently. Gate House accepted
that as correct on layering AND as a genuine reduction in defence in
depth, and named the compensating control: not a second check at the PEP,
which is the duplication the split removes, but reconstructability at the
issuer under §9.6.

The emitted events could not support that. approval.issuance carried
required_count but never who satisfied it, and approval.use carried no
threshold evidence at all, so an auditor replaying the stream could not
recompute the evaluation without reading live rows -- rows that may since
have been superseded, revoked, or expired.

Both events now carry a threshold object: required_count,
distinct_approver_count, threshold_met, and approvers with approved_at
plus assurance and evidence_ref when recorded. Tests prove reconstruction
from the use row alone, and that the claim still discloses no approver
identities -- they are evidence for audit-core, not consumer-facing, and
the claim keeps disclosing the least it can.

Writing the tests showed distinctness is already a storage invariant:
entries is UNIQUE on (approval_id, subject_id), so a repeat approver is
refused at insert and a separate entry_count could never differ from the
distinct count. Dropped that field rather than ship a number that cannot
vary, and the test now asserts the refusal instead.

88 tests pass (4 new).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TvyJPAaVCGsVheVhcCwNND

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 411227@bnt-lap001
Assistant-Session: d566f6d3-bcaf-43c3-bc5e-3ddd0f64b535
2026-09-06 08:10:21 +02:00
..
approval-claim.md Record GH-DEC-2026-005 in the claim contract itself 2026-09-06 08:02:48 +02:00
approval-consumption.md Record GH-DEC-2026-005; strike the spent G3 revisit trigger 2026-09-06 01:36:03 +02:00
caller-authentication.md Harden the PEP harness and KeyCape registration request 2026-09-02 15:46:06 +02:00
emission-cadence.md Implement approval engine production readiness 2026-09-02 00:52:04 +02:00
flex-auth-handoff.md Finish approval engine spine 2026-09-01 23:45:48 +02:00
gate-house-decision-request-claim-envelope.md chore(consistency): record decision id for GH-DEC-2026-005 2026-09-06 08:05:00 +02:00
keycape-service-registrations.md Harden the PEP harness and KeyCape registration request 2026-09-02 15:46:06 +02:00
outbox-contract.md Carry threshold evidence on issuance and use events 2026-09-06 08:10:21 +02:00
pep-integration.md Harden the PEP harness and KeyCape registration request 2026-09-02 15:46:06 +02:00
storage-operations.md Implement approval engine production readiness 2026-09-02 00:52:04 +02:00