HIGH. The deliver loop assumes the implementer always opens a PR. When a stage commits artifacts (architect ADR, UX spec) but impl.pr===0, the engine still calls the reviewer with "PR #0" (no PR exists), marks the ticket "left open (not approved)", and continues — stranding the commits on an unmerged branch with a leftover worktree and no GitHub artifact a human can find. if (!impl) ... continue only guards null, not pr===0; the integrator runs unconditionally after approval.
Fix: detect impl.pr===0; if a branch with commits exists, open a (draft) PR from it so the work is captured; if not, force-remove the worktree. Integrator must refuse to run on pr===0. Record no-pr-opened status.
Filed 2026-06-14 from the delivery-train process-safety audit (after the 22-ticket passband run). Engine: .claude/workflows/delivery-train.js. Anchor failure: #1639 — architect committed an ADR, implementer opened no PR, reviewer got "PR #0", ticket dangled with a stranded branch + leftover worktree.
HIGH. The deliver loop assumes the implementer always opens a PR. When a stage commits artifacts (architect ADR, UX spec) but
impl.pr===0, the engine still calls the reviewer with "PR #0" (no PR exists), marks the ticket "left open (not approved)", andcontinues — stranding the commits on an unmerged branch with a leftover worktree and no GitHub artifact a human can find.if (!impl) ... continueonly guardsnull, notpr===0; the integrator runs unconditionally after approval.Fix: detect
impl.pr===0; if a branch with commits exists, open a (draft) PR from it so the work is captured; if not, force-remove the worktree. Integrator must refuse to run onpr===0. Recordno-pr-openedstatus.Filed 2026-06-14 from the delivery-train process-safety audit (after the 22-ticket passband run). Engine:
.claude/workflows/delivery-train.js. Anchor failure: #1639 — architect committed an ADR, implementer opened no PR, reviewer got "PR #0", ticket dangled with a stranded branch + leftover worktree.