dot-iu-cutter v0.2 — P0-6 + P0-5 Remainder Dry-Run Execution Report (A-1 GATE FAIL — HALTED) (2026-05-16)
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
SELECTonly) 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
§6 — Status & Next Recommended Step
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).