KB-16E4

IU Core Controlled Route — 06 Consumer readiness + version_seq ruling

3 min read Revision 1
dieu44iu-core-mvpcontrolled-routeconsumer-readinessevent-outboxversion-seqv0.62026-05-21

IU Core Controlled Route — 06 Consumer readiness + version_seq ruling

event_outbox consumer readiness — NO active consumer

Survey of the production directus DB and VPS:

  • event_outbox holds 92,667 rows (57,121 in the last 7 days, all event_domain='system', event_stream='alert'). Actively written by other domains; latest row 2026-05-21 10:30.
  • No delivery-state columns. Columns: id, event_domain, event_type, event_stream, delivery_lane, event_severity, event_subject_table, event_subject_ref, canonical_address, actor_ref, source_system, correlation_id, payload_classification, safe_payload, occurred_at, created_at. There is no delivery_status / delivered_at / processed_at. event_outbox is an append-only event log, not a work queue.
  • One trigger on event_outbox: trg_event_outbox_type_validate (fn_event_type_validate, BEFORE INSERT, validation only). No AFTER trigger → an insert does not itself cause delivery.
  • No worker container (docker ps -a: postgres, directus, agent-data, claude-mcp, claude-kb, nuxt, nginx, qdrant, uptime-kuma, pg-restore-test — none is an outbox consumer). No cron references outbox/event/iu.
  • event_outbox is not a Directus collection, so Directus flows cannot trigger on it; no flow / operation options reference event_outbox.

Conclusion. event_outbox is an unconsumed append-only log. Opening the master gate enqueues iu version_applied rows that accumulate undelivered — no downstream delivery occurs. This makes the gate-open safe.

Readiness for dry_run=false (a later macro). There is no route worker of any kind. dry_run=false would not, by itself, cause delivery — but it is only meaningful once a worker that reads event_outbox / iu_route_attempt and respects the route dry_run flag is built. A route worker must be built and verified before dry_run=false is considered. This is the exact gap doc 10 of the runtime-activation macro warned about.

version_seq divergence — RULED and resolved

The COEXIST ruling left a divergence: the existing UI-feed trigger trg_aa_iu_notif_version emits only for version_seq > 1; the new outbound trigger emitted on every version.

Ruling for this phase: align the bus to version_seq > 1. Migration 007 (doc 03) patches fn_iu_outbound_on_version so the event_outbox workflow bus emits only for version_seq > 1 — identical semantics to the notification path. version_seq = 1 is the birth version, not a "version applied" bus event. Evidence: Probe A (seq=2 emits 1 row), Probe B (filter present in the deployed function), runtime/040 V7 (skips_birth_version=t). The divergence is resolved, not deferred.

Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/v0.6-iu-core-controlled-route-mastergate-structure-observability-open-goal/06-consumer-readiness-and-versionseq-ruling.md