IU Core 30x Structure/Autocut — 04 Structure event family + worker dry-run
04 — Structure Event Family + Worker Dry-run Evidence
runtime/190 — the non-reparent structure-event family
runtime/160 registered one structure event type (structure_op_applied).
runtime/190 completes the family — the five non-reparent types the
migration-012 apply emits:
| operation_type | event_type | route_code |
|---|---|---|
add_new_piece |
structure_child_added |
iu.structure_child_added.workflow |
split_large_piece |
structure_piece_split |
iu.structure_piece_split.workflow |
merge_small_pieces |
structure_pieces_merged |
iu.structure_pieces_merged.workflow |
deprecate_piece |
structure_piece_deprecated |
iu.structure_piece_deprecated.workflow |
replace_piece |
structure_piece_replaced |
iu.structure_piece_replaced.workflow |
All five event types active=true; all five routes enabled=true, dry_run=true, fail_closed=true. The CHECK iu_outbound_route_safe_chk makes
an enabled+dry_run=false route structurally impossible. Idempotent
(ON CONFLICT DO NOTHING). Applied to production — INSERT 0 5 + INSERT 0 5.
Reversal: runtime/rollback/190.
Worker dry-run evidence — real IU-domain events (runtime/150)
runtime/180 emitted 26 new structure_op_applied events. runtime/150 (the
disabled-by-default invocation package) was invoked:
| Stage | Result |
|---|---|
| I1 pre-health | healthy=true, backlog_iu_events=26, gates open, dead_letter_open=0 |
| I2 run | status=ran seen=26 attempts_written=26 skipped=0 dead_lettered=0 |
| I3 post-health | healthy=true, backlog=0, totals seen/attempts/dead = 44/44/0 |
| I4 audit | route_attempts=44 dead_letters=0 |
Breakdown: iu.structure_op_applied.workflow, status=dry_run, n=44. Every
attempt a logged dry-run DECISION; zero downstream delivery.
The five structure_* non-reparent event types were proven to emit in
sandbox/070 (P8 — one of each) but inside a rolled-back transaction →
produced no durable event_outbox rows. Durable non-reparent emission + worker
dry-run is the next macro.
Worker invocation / scheduling
runtime/150 stays disabled-by-default — healthcheck → bounded run →
healthcheck, idempotent, no daemon, no cron. The worker gate is the single
arm/disarm point. No persistent service started, no cron activated.