Files
buzz/schema
Hayt 152c5070b5 fix(buzz-db): add NIP-FI Carl r2 guards — policy monotonicity, admission result cardinality, denial attempt binding
Finding 1 (policy revision monotonicity): add
identity_enrollment_policy_revision_guard_v1() BEFORE INSERT on
identity_enrollment_policies. Uses a per-community advisory lock via
hashtextextended so concurrent writers serialize the max-revision read,
then asserts both policy_revision and effective_at strictly exceed the
current community maximum (FI-INV-06 — stable assertion policy).

Finding 2 (admission result ↔ kind-11 receipt cardinality): add
authorization_admission_result_guard_v1(), bidirectional deferred
constraint trigger on both authorization_operation_receipts (kind-11
receipt must have exactly one result) and authorization_admission_results
(result must attach to a kind-11 receipt). Mirrors the pattern of the
existing authorization_operation_receipt_event_guard_v1.

Finding 3 (denial event ↔ attempt binding): add
authorization_denial_attempt_guard_v1(), bidirectional deferred
constraint trigger on both authorization_events (kind-9 event must have
exactly one denial attempt) and
authorization_authentication_denial_attempts (attempt must reference an
existing kind-9 event). The existing FK binds (audit_event_kind=9) but
does not require a kind-9 event to have a matching attempt row; this
guard closes that gap.

All three fixes applied identically in migrations/0041, migrations/0042,
and schema/schema.sql; the parity assertion continues to pass.

Tests added (all three mutation-sensitive, two-sided):
- identity_enrollment_policy_revision_is_monotonic
- authorization_admission_result_requires_kind_11_receipt_bidirectional
- authorization_denial_attempt_requires_kind_9_event_bidirectional

No new tables; fence exclusion list unchanged; #[ignore] deletion suite
need not rerun.

Co-authored-by: Will Pfleger <pfleger.will@gmail.com>
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
Signed-off-by: Hayt <9e1c23a3fd83f61da34420e4e88ff1b16e45cafcc0cd9019eb07d4ecfa8ca9b0@buzz.block.builderlab.xyz>
2026-08-31 14:05:38 -04:00
..