A ui-classed epic child can never legally leave review: the machine demands a still-binding review-ui verdict at child scope while every verdict verb that could write one is PR-bound, and epic children open no PR by design (ADR 0285). Two gates, each correct alone, jointly unwalkable — the same deadlock class as #7035 (claim-gate discharge), different seam.
Verified at origin/main (Triage note: all reads below are at main, 2026-08-23):
packages/fabrika-cli/src/lane/prove.ts — claimOf: a child's PASS out of review returns RangeVerdict and defers nothing ("its regions carry no review:ui cell at all"); the HeadVerdicts deferral fires only when next === REVIEW_UI_STATE, a cell a child machine never routes to.
packages/fabrika-cli/src/review/classes.ts — namespacesOf deliberately fences review post (head and range paths) out of emitting review-ui; ROUTED_NAMESPACES = ["review-ui"] names it as the one namespace only the review-ui group's verbs may post.
packages/fabrika-cli/src/review-ui/ — its post/route verbs resolve live PR state, unreachable for an issue-scoped child.
Instance that surfaced it: epic #6767 tracer C (#7031) — built clean, review-code PASS posted range-scoped, then lane prove exit 23 forever; park comment 5385375560. Founder ruling comment 5387589462 authorized recording the PASS with review-ui deferred to the tail gate — and the machine had no cell that executes even that, which is how this got filed. The funnel shipped around it by hand-integration; every future sequential epic whose children touch rendered surfaces deadlocks here with no legal exit.
Acceptance criteria
Original report (verbatim)
Summary
On an epic-run child, a PASS out of review derives the full namespace set (review-code + review-ui for rendered surfaces) and refuses exit 23 until every derived namespace holds a still-binding verdict — but review-ui verdicts are PR-bound and epic children open no PR by design (ADR 0285), so a ui-classed child can never leave review. The review → review:ui deferral arm (ADR 0320, built after #6664/#6793) does not rescue child scope: this lane held the whole set at review, and --class ui on lane report did not route it.
What I was doing
Closing epic #6767's funnel lane. Tracer C (#7031) built clean (commit 2fd91d8, content cf61cd669cd94-range) and its reviewer posted a range-scoped review-code PASS on the child issue (comment 5385338205).
What I observed
lane report 6767 --token PASS --task issue_7031 --class ui refused: "unproven — range has no verdict that still binds in review-ui (absent)".
packages/fabrika-cli/src/lane/prove.ts: the deferral (defers: next === REVIEW_UI_STATE ? ROUTED_NAMESPACES : []) keys on the machine taking the review → review:ui arm; this lane's fold sat at plain review, and no sanctioned move puts a ui-classed CHILD into review:ui.
- Park comment 5385375560 documents the same wall independently.
- A founder ruling (comment 5387589462) authorized recording the PASS with review-ui deferred to the tail gate — the machine has no cell that executes it.
Why it matters
Every sequential epic whose any child touches a rendered surface deadlocks at child review with no legal exit — same class as #7035 (claim-gate discharge): two gates each correct in isolation, jointly unwalkable.
Pointers
Suggested next step (non-binding)
Let a child's PASS take the ADR 0320 deferral when a ui namespace derives but cannot bind child-side — routing review-ui to the epic tail cell, which already owes a whole-set proof where a preview exists.
Filed by an agent · session 01a02bf1-5ef0-7960-bc38-6af0f64be51b · branch main · 2026-08-23T18:42:58Z
A ui-classed epic child can never legally leave
review: the machine demands a still-bindingreview-uiverdict at child scope while every verdict verb that could write one is PR-bound, and epic children open no PR by design (ADR 0285). Two gates, each correct alone, jointly unwalkable — the same deadlock class as #7035 (claim-gate discharge), different seam.Verified at origin/main (
Triage note:all reads below are at main, 2026-08-23):packages/fabrika-cli/src/lane/prove.ts—claimOf: a child'sPASSout ofreviewreturnsRangeVerdictand defers nothing ("its regions carry noreview:uicell at all"); theHeadVerdictsdeferral fires only whennext === REVIEW_UI_STATE, a cell a child machine never routes to.packages/fabrika-cli/src/review/classes.ts—namespacesOfdeliberately fencesreview post(head and range paths) out of emittingreview-ui;ROUTED_NAMESPACES = ["review-ui"]names it as the one namespace only thereview-uigroup's verbs may post.packages/fabrika-cli/src/review-ui/— its post/route verbs resolve live PR state, unreachable for an issue-scoped child.Instance that surfaced it: epic #6767 tracer C (#7031) — built clean, review-code PASS posted range-scoped, then
lane proveexit 23 forever; park comment 5385375560. Founder ruling comment 5387589462 authorized recording the PASS with review-ui deferred to the tail gate — and the machine had no cell that executes even that, which is how this got filed. The funnel shipped around it by hand-integration; every future sequential epic whose children touch rendered surfaces deadlocks here with no legal exit.Acceptance criteria
PASSout ofreviewwithout anyreview-uiverdict existing at child scope.review-uinamespace is carried to the epic run's tail/assembly cell andlane proverefuses ship-side merge until a whole-setreview-uiverdict binds at the tail head where a preview exists.Original report (verbatim)
Summary
On an epic-run child, a
PASSout ofreviewderives the full namespace set (review-code + review-ui for rendered surfaces) and refuses exit 23 until every derived namespace holds a still-binding verdict — butreview-uiverdicts are PR-bound and epic children open no PR by design (ADR 0285), so a ui-classed child can never leavereview. Thereview → review:uideferral arm (ADR 0320, built after #6664/#6793) does not rescue child scope: this lane held the whole set atreview, and--class uionlane reportdid not route it.What I was doing
Closing epic #6767's funnel lane. Tracer C (#7031) built clean (commit 2fd91d8, content cf61cd669cd94-range) and its reviewer posted a range-scoped review-code PASS on the child issue (comment 5385338205).
What I observed
lane report 6767 --token PASS --task issue_7031 --class uirefused: "unproven — range has no verdict that still binds in review-ui (absent)".packages/fabrika-cli/src/lane/prove.ts: the deferral (defers: next === REVIEW_UI_STATE ? ROUTED_NAMESPACES : []) keys on the machine taking thereview → review:uiarm; this lane's fold sat at plainreview, and no sanctioned move puts a ui-classed CHILD intoreview:ui.Why it matters
Every sequential epic whose any child touches a rendered surface deadlocks at child review with no legal exit — same class as #7035 (claim-gate discharge): two gates each correct in isolation, jointly unwalkable.
Pointers
Suggested next step (non-binding)
Let a child's PASS take the ADR 0320 deferral when a ui namespace derives but cannot bind child-side — routing review-ui to the epic tail cell, which already owes a whole-set proof where a preview exists.
Filed by an agent · session
01a02bf1-5ef0-7960-bc38-6af0f64be51b· branchmain· 2026-08-23T18:42:58Z