Phase 2 — Regression Matrix
Regression Matrix — Phase 2 vs Phase 1 baseline
Object counts
| Surface | Phase 1 post | Phase 2 post | Δ | Note |
|---|---|---|---|---|
| public tables (BASE TABLE) | 271 | 271 | 0 | No new table |
| public views | 55 | 55 | 0 | No new view |
| public routines | 515 | 520 | +5 | Phase 2 new functions |
| dot_config keys | 94 | 98 | +4 | Phase 2 new keys |
queue.* keys |
8 | 12 | +4 | |
queue_heartbeat rows |
0 | 1 | +1 | Passive marker |
job_queue rows |
0 | 0 | 0 | |
job_dead_letter rows |
0 | 0 | 0 | |
event_outbox rows |
133,784 (baseline) | 134,803 | +1,019 | 0 rows with phase2* actor or canonical_address — pure background traffic |
iu_route_worker_cursor rows |
1 | 1 | 0 | |
iu_vector_sync_point rows |
152 | 152 | 0 | |
information_unit rows |
175 | 175 | 0 | |
production_documents |
absent | absent | 0 |
Phase 1 substrate intact
All Phase 1 objects still present and unchanged at definition level:
Tables: job_queue, job_dead_letter, queue_heartbeat
Views: v_queue_health, v_job_queue_backlog, v_job_dead_letter_summary
Functions (Phase 1): fn_job_enqueue, fn_job_claim, fn_job_ack, fn_job_fail_or_retry, fn_job_move_to_dead_letter, fn_job_queue_updated_at (trigger), fn_queue_heartbeat_tick, fn_queue_stale_check
Triggers: 2 (fn_job_queue_updated_at on job_queue, queue_heartbeat updated_at trigger)
Constraints: 8 unique CHECK constraints on Phase 1 tables (verified by name) — unchanged.
event_outbox unchanged
| Check | Status |
|---|---|
pg_constraint CHECK constraint names |
9 — unchanged |
event_outbox_safe_payload_check definition |
unchanged (denylist mirrored to job_queue/job_dead_letter in Phase 1) |
| Row count delta | +1,019 background only |
Rows with actor_ref matching %phase2% |
0 |
Rows with canonical_address matching %phase2% |
0 |
Latest created_at from background traffic |
2026-05-26 13:30:18 (predates Phase 2 mig commit at 13:52) |
iu_route_worker_cursor frozen
worker_name='iu_outbound_default':
- baseline
last_run_at = 2026-05-22 11:31:41.928657+00 - post-Phase 2
last_run_at = 2026-05-22 11:31:41.928657+00 - Unchanged. Silent gap still ~96h+. (Phase 3 is responsible for restoring real worker activity OR explicitly retiring this row.)
pg_extensions
{btree_gist 1.7, pgcrypto 1.3, plpgsql 1.0, postgres_fdw 1.1} — unchanged. No pg_cron installed.
MARK/CUT alias surface unchanged
fn_iu_op_* 5 aliases present: fn_iu_op_cleanup_dry_run, fn_iu_op_cut, fn_iu_op_mark_file, fn_iu_op_verify_cut, fn_iu_op_verify_mark. None modified by Phase 2.
Gate states at exit
| Gate | Pre Phase 2 | Post Phase 2 | Note |
|---|---|---|---|
queue.job_substrate.enabled |
false | false ✓ | Worker substrate kept inert |
queue.worker.enabled |
false | false ✓ | No worker started |
queue.notify.enabled |
false | false ✓ | No NOTIFY emission |
queue.heartbeat.enabled |
false | true | Phase 2 governance armed (no daemon) |
queue.lease.reaper_enabled |
(absent) | false ✓ | Default off |
queue.lease.reaper_dry_run_only |
(absent) | true ✓ | Safety default |
queue.dlq.replay_enabled |
(absent) | false ✓ | Default off |
queue.runtime.phase |
(absent) | phase2_governance |
Marker |
Forbidden list audit (15/15 honored)
- No pg_cron install — confirmed
- No worker/daemon/cron started — confirmed
- No event_outbox traffic from Phase 2 — confirmed (0 rows)
- No event_outbox schema change — confirmed (9 CHECKs intact)
- No event_outbox row mutation — confirmed
- No
event_type_registrywidening — confirmed (no DDL touched it) - No
iu_sql_event_routeCHECK widening — confirmed - No Qdrant touch — confirmed
- No
production_documentstouch — confirmed (absent throughout) - No
fn_iu_op_*MARK/CUT alias change — confirmed - No START-HERE change — confirmed (no file edits)
- No Điều 45 law text change — confirmed
- No customer/email/MOT runtime — confirmed
- No
queue.worker.enabled=trueflip — confirmed (kept false durably) - No
queue.job_substrate.enabled=truedurable flip — confirmed (only inside rolled-back proof TX)
Verdict
Regression PASS. Phase 1 substrate intact, no worker started, no schema widening, no payload-key vocab widening, no MARK/CUT touch, no event_outbox schema mutation, all forbidden categories honored. Silent gap NOW visible via v_queue_health and fn_queue_stale_check — risk surface closure delivered as scoped.