approval-engine/tests
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
..
conftest.py Implement approval engine production readiness 2026-09-02 00:52:04 +02:00
test_api.py Implement approval engine production readiness 2026-09-02 00:52:04 +02:00
test_audit.py Harden the PEP harness and KeyCape registration request 2026-09-02 15:46:06 +02:00
test_auth.py Harden the PEP harness and KeyCape registration request 2026-09-02 15:46:06 +02:00
test_cadence.py Implement the engine spine: claim, outbox, machine, API 2026-08-29 12:52:49 +02:00
test_cas.py Finish approval engine spine 2026-09-01 23:45:48 +02:00
test_claim_contract.py Implement the engine spine: claim, outbox, machine, API 2026-08-29 12:52:49 +02:00
test_cli.py Harden the PEP harness and KeyCape registration request 2026-09-02 15:46:06 +02:00
test_machine.py Implement the engine spine: claim, outbox, machine, API 2026-08-29 12:52:49 +02:00
test_outbox.py Carry threshold evidence on issuance and use events 2026-09-06 08:10:21 +02:00
test_pep.py Harden the PEP harness and KeyCape registration request 2026-09-02 15:46:06 +02:00
test_storage.py Implement approval engine production readiness 2026-09-02 00:52:04 +02:00
test_t06_replay.py Finish approval engine spine 2026-09-01 23:45:48 +02:00