feat(hierarchy): audit event + outbox machinery (M4-1b-i, contract 1 §5.2) #1460

Merged
fred merged 2 commits from feat/m4-1b-hierarchy-gateway into next 2026-08-28 02:22:54 +00:00
2 Commits
Author SHA1 Message Date
fred 08410dbd84 fix(hierarchy): include transfer snapshots in replay content comparison
ci/woodpecker/pr/ci Pipeline was successful
Review round 1 blocker: sameEvent omitted transferFrom/transferTo, so a
retried transfer re-routed to a different destination would silently
replay instead of conflicting. Transfer source/destination are semantic
event content per §5.2. Adds a witness varying the transfer destination
on a duplicate idempotency key; also fixes a stale cross-reference in
the db witness header.
2026-08-27 21:04:59 -05:00
fred 6a49de55bf feat(hierarchy): audit event + outbox machinery (M4-1b-i, contract 1 §5.2)
ci/woodpecker/pr/ci Pipeline was canceled
- hierarchy_audit_events: append-only semantic events (actor, verb, target
  snapshot with root-first parent chain), deletion-safe linkage (no FK into
  class tables), CHECK-enforced verb/target-kind/transfer shape, unique
  idempotency key, generated-always seq for per-target ordering, causation
  self-FK RESTRICT; hierarchy_outbox: dedicated same-transaction outbox
  (unique event_id, status enum, claim-by-CAS lifecycle) — migration 0019
- gateway HierarchyAuditRepository: same-tx append with idempotent replay
  (canonical-JSON compare, jsonb key order independent), snapshot builder,
  per-target history, outbox claim/complete/release; HierarchyModule exposes
  no routes yet (command family lands in M4-1b-ii after contract 2 merges)
- dual-leg schema witnesses (PGlite + real PG) for every constraint above;
  repository §6.4 witnesses: atomic commit, rollback residue-free, replay,
  conflicting-key refusal, events survive target deletion, CAS races
- §6.3(a) route-inventory baseline: enumerates the AppModule route surface,
  pins zero hierarchy mutation routes until M4-1b-ii
- writer-coverage scan perimeter widened from <pkg>/src to the full package
  tree (S1 residual; widened set measured free of all trigger tokens)
2026-08-27 20:49:25 -05:00