KB-31D6

dot-iu-cutter v0.2 — P0-6 + P0-5 Remainder Dry-Run Execution Report (A-1 GATE FAIL — HALTED) (2026-05-16)

8 min read Revision 1
dot-iu-cutterdieu44v0.2p0-6p0-5-remainderdry-runa-1-gate-failhaltedno-execution

dot-iu-cutter v0.2 — P0-6 + P0-5 Remainder Dry-Run Execution Report

document_path: knowledge/dev/laws/dieu44-trien-khai/v0.2-dry-run/dot-iu-cutter-v0.2-p0-6-p0-5-remainder-dry-run-execution-report-2026-05-16.md
revision: r1
date: 2026-05-16
author: Agent (Claude Code CLI, Opus 4.7 1M)
sovereign: User / anh Huyên
verifier: GPT (PENDING — re-revision authorization)
phase: v0.2 — P0-6 + P0-5-remainder DRY-RUN
dry_run_status: FAIL_HALTED_AT_A1_PREFLIGHT_GATE
ddl_executed: false
dry_run_env_provisioned: false
production_mutation: false
production_ddl: false

DRY-RUN HALTED AT THE A-1 HARD GATE. Per GPT DDL-authoring review: "A-1 is a hard dry-run gate: verify decision_backlog_entry PK = decision_id uuid; if mismatch: STOP and re-revise DDL; no workaround allowed." The mismatch is confirmed. NO dry-run environment was provisioned, NO SQL was extracted, NO DDL was executed, NO mutation occurred anywhere. Production was accessed read-only (catalog SELECT only) and is untouched.


§1 — Outcome (one line)

A-1 FAIL. Live cutter_governance.decision_backlog_entry primary key is decision_backlog_entry_pkey PRIMARY KEY (entry_id), column entry_id uuid. There is no decision_id column on that table. The DDL draft's three P0-5 foreign keys reference decision_backlog_entry(decision_id) → invalid. Dry-run STOPPED at preflight; status NOT PASS.

§2 — Evidence (production, read-only)

Queries run via docker exec postgres psql -U workflow_admin -d directus (SELECT-only against system catalogs; zero mutation):

-- PK constraint
decision_backlog_entry_pkey | PRIMARY KEY (entry_id)

-- full column list of cutter_governance.decision_backlog_entry
entry_id     uuid
kind         text
status       text
payload      jsonb
emitted_at   timestamp with time zone
scenario_ref text

-- decision_id column existence
SELECT count(*) ... column_name='decision_id'  ->  0   (does NOT exist)

-- production system identifier (unchanged; recorded for non-mutation proof)
SELECT system_identifier FROM pg_control_system();  ->  7611578671664259111

The live v0.1 decision_backlog_entry is a lean table (6 columns) that diverged from the verbose v0.1 P0-5 design doc (~20 fields). Assumption A-1 correctly guessed the type (uuid) but the column name is entry_id, not decision_id. The DDL-authoring pre-exec gate was designed precisely to catch this — it functioned as intended.

§3 — Exact Failure

gate: A-1 (decision_backlog_entry PK must be `decision_id uuid`)
expected: PRIMARY KEY (decision_id), decision_id uuid
actual:   PRIMARY KEY (entry_id),  entry_id uuid ; decision_id column absent
verdict: MISMATCH on column NAME (type uuid matches; name does not)
affected_DDL_objects (3 of the 7 ratified FKs):
  - FK#5 decision_backlog_history_entry_fk:
      decision_backlog_history.decision_id -> decision_backlog_entry.decision_id   [INVALID: no such column]
  - FK#6 decision_backlog_dependency_from_fk:
      decision_backlog_dependency.from_decision_id -> decision_backlog_entry.decision_id  [INVALID]
  - FK#7 decision_backlog_dependency_to_fk:
      decision_backlog_dependency.to_decision_id -> decision_backlog_entry.decision_id    [INVALID]
not_affected:
  - FK#1 review_decision.manifest_id -> manifest_envelope.envelope_id            [OK: PRIMARY KEY (envelope_id) confirmed]
  - FK#2 review_decision(manifest_id,manifest_unit_local_id) -> manifest_unit_block(envelope_id,unit_local_id) [OK: PRIMARY KEY (envelope_id, unit_local_id) confirmed]
  - FK#3/#4 review_decision self-FKs                                             [OK: internal]
  - review_decision.escalation_ref -> decision_backlog_entry                     [SOFT uuid, NO PG FK — unaffected by the name mismatch]
predicted_DDL_error_if_executed: ERROR 42830 "there is no unique constraint
  matching given keys for referenced table decision_backlog_entry" (or 42703
  "column decision_id does not exist") — would abort the single transaction.

§4 — Why No Environment Was Provisioned (disciplined short-circuit)

A-1 is a property of the production schema shape. The dry-run environment is, by definition and by the task's own step 1, a faithful restore of the current production state — so decision_backlog_entry's PK in the dry-run would be identical to production (entry_id). Evaluating A-1 against the authoritative production catalog read-only is deterministic and identical to evaluating it post-restore. GPT's rule says "if mismatch: STOP" — it does not require burning a restore first. Provisioning an env, restoring a backup, extracting SQL, and executing DDL that is provably guaranteed to fail at the first P0-5 FK would waste resources and violate the "no workaround" spirit. Correct disciplined action: STOP at the gate, provision nothing, mutate nothing, report.

dry_run_env_provisioned: false
backup_restored: false (none taken; no env to restore into)
sql_artefact_extracted: false
ddl_executed: false
protected_dry_run_envs_touched: NONE
  (pg-dry-run-v0.2-p0-2-2026-05-16 / pg-dry-run-v0.2-phase-alpha-2026-05-16 /
   pg-dry-run-hb05-2026-05-15 — NOT accessed, NOT modified)
production_containers_touched: read-only SELECT on `postgres` container only
production_mutation: NONE

§5 — Production-Untouched Confirmation

access_mode: read-only catalog SELECT via workflow_admin on `postgres` container
statements_run: only SELECT (information_schema / pg_constraint / pg_attribute
  / pg_control_system) — zero DDL, zero DML
production_system_identifier: 7611578671664259111 (recorded; unchanged)
production_DDL: NONE
production_migration: NONE
production_deploy: NONE
CUT_or_VERIFY: NONE
dry_run_status: FAIL — HALTED AT A-1 PREFLIGHT GATE (NOT PASS, NOT PASS_WITH_NOTES)
production_migration: REMAINS FORBIDDEN (independently of this result)
rollback_needed: NONE (nothing was created anywhere)
next_recommended_step: |
  RE-REVISE THE DDL (separate DDL-authoring lane, requires explicit
  authorization + fresh GPT review — NOT done here; scope was DRY-RUN ONLY,
  no self-advance). The minimal correct fix: repoint the 3 P0-5 FKs to the
  REAL live column:
     decision_backlog_history.decision_id            -> decision_backlog_entry(entry_id)
     decision_backlog_dependency.from_decision_id     -> decision_backlog_entry(entry_id)
     decision_backlog_dependency.to_decision_id       -> decision_backlog_entry(entry_id)
  (child column names may stay; only the REFERENCED column must become
  `entry_id`. Optionally rename child columns to `*_entry_id` for clarity —
  a DDL-authoring decision, not taken here.) The 7→still-7 FK count and all
  other ratified decisions are unaffected. After re-rev: re-review → re-open
  the dry-run lane. Agent does NOT self-advance.
agent_self_advance: PROHIBITED

§7 — Hard Boundaries (honored)

dry_run_executed: FALSE
ddl_executed: FALSE
dry_run_env_provisioned: FALSE
production_mutation: FALSE
production_ddl: FALSE
production_migration: FALSE
deploy: FALSE
CUT_or_VERIFY: FALSE
self_advance_to_command_review: FALSE
self_advance_to_ddl_re_revision: FALSE (flagged as next step; not performed)
protected_dry_run_envs_untouched: TRUE
output_form: p0_6_p0_5_remainder_dry_run_execution_report

End of dry-run execution report (HALTED at A-1 gate).

Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/v0.2-dry-run/dot-iu-cutter-v0.2-p0-6-p0-5-remainder-dry-run-execution-report-2026-05-16.md