Skip to content

ui-classed epic-child PASS cannot leave review: review-ui demanded at child scope but no verb can post one on an issue #7041

Description

@usirin

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.tsclaimOf: 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.tsnamespacesOf 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

  • A ui-classed epic child whose review-code verdict binds at the child tip can record PASS out of review without any review-ui verdict existing at child scope.
  • When the deferral arm routes, the owed review-ui namespace is carried to the epic run's tail/assembly cell and lane prove refuses ship-side merge until a whole-set review-ui verdict binds at the tail head where a preview exists.
  • A non-ui child's PASS behavior is byte-for-byte unchanged (defers nothing, stands on the whole derived set).
  • The deferral is disclosed in the lane event log entry that records the deferred PASS.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    p1Medium priorityready-for:agentAn execution engine may pick this up.status:triagedTriage signed off; ready for write-code to picktype:bugBehavior diverges from intent

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions