Twinned from https://github.com/cfsh/ninefold/issues/893 by tools/beads/import_github.py's reconcile pass.
Unclaimed and unlabelled — inert backlog, per CLAUDE.md. Found while building #891 (design 006 §8.2 piece 8 / design 006a T1).
Design 006a (proposed, PR #890) specifies piece 8's oracle as a stack of three PRs, T1a first:
> T1a — merge_pr.py --why gains --json. Mechanical: explain() already computes everything; emit it as one object (state, head sha, presubmit verdict, reviewer verdict, each refusal in merge()'s order, would-merge authority, unanswered-human counts from nflib.ledger). Prose output unchanged for humans. SCHEMA constant + contract test running the real producer, per #787. No behaviour change.
T1a was never built — #891 (T1b/T1c) shipped without it, on an interim: dev.py status runs merge_pr.py --why <n> as a subprocess and reads only its exit code (ready/blocked) plus the raw stdout, printed verbatim per PR rather than as a structured one-line render.
Two consequences, both flagged live on #891's review:
status cannot render "one line: number, title fragment, and what blocks it" the way 006a's T1b spec asks (*"Four lines for four PRs, not four screens (#726 is the anti-pattern)"*). It currently prints explain()'s whole prose block per PR — 6-12 lines each — because a round-1 review finding (#891) demanded the full block rather than trusting --why's closing line alone (see #839: the closing line can say "would merge" while a ⚠ line above it carries the real published-check caveat). Structured JSON is the reconciliation: it would let status render the one-line summary 006a asks for while still surfacing the caveat losslessly, instead of choosing between "terse but lossy" and "complete but verbose".status's per-PR line has no title fragment, since the current interim reads only what --why's prose already prints.Shape of the fix, per 006a T1a: a SCHEMA constant on merge_pr.py, a --json flag alongside --why, emitting one object per the fields 006a lists; a contract test running the real producer (the #787 pattern dev.py's other --json consumers already use). Then dev.py status (in tools/nflib/devcli.py) switches from subprocess-plus-prose-passthrough to reading the structured object, and can render the one-line-per-PR format T1b actually asks for.
None.
No comments.