Skip to content

Close the roadmap focus over prerequisites - #7419

Closed
briansrls wants to merge 1 commit into
mainfrom
roadmap-focus-closure
Closed

briansrls wants to merge 1 commit into
mainfrom
roadmap-focus-closure

Conversation

@briansrls

Copy link
Copy Markdown
Contributor

Split out of #7417 on review. The identity half is being rebuilt separately (identity on RoadmapNode, active/tombstoned lifecycle, base-vs-head permanence gate); this half is independent of it.

The bug

Owner membership alone was the wrong visibility rule. The v1 deletion lane's critical path runs through pderive-source-slot-binding, whose prerequisite namespace-canonical-binding lives in a lane the focus hid — so the page rendered the fourth link of the spine as ready, with its blocker invisible.

Nothing was red. The page lied by omission, which is worse for a dispatched agent than for a person: a worker reads a ready-looking node, starts, and stalls on work the roadmap never mentioned.

The fix

Visibility is lane membership ∪ the transitive prerequisite closure, reusing std.graph.graph_reverse_reachable_members over the roadmap's own edge relation rather than minting a second walk — the edge is already a dependency edge, reverse reachability from a lane node is exactly its ancestors, and the graph is acyclic by witness so the walk terminates by construction.

The closure found five blockers where three were visible by eye. namespace-canonical-binding has its own prerequisites, so the lane was blocked on a namespace sub-chain of three. Manual inspection would have found those one stall at a time.

Pulled-in rows are named as prerequisites in the notice rather than counted as lane work, so the lane's real size stays honest.

The discriminator is synthetic, deliberately

Per review. An earlier cut asserted count(pulled) > 0 against the live roadmap_focus_selection — which contradicts the carrier's own promise that changing or clearing the focus is a one-row view edit. It fails the moment focus is NoFocus, or a lane that legitimately has no cross-owner prerequisite, reporting a defect where none exists and making the focus row un-editable in practice.

The fixture owns its two lanes and its transitive chain, so it holds under any live focus, and it exercises transitivity (b3 pulls b2 pulls b1) — the part manual inspection misses.

claim catches
synthetic_closure_pulls_transitive_cross_lane_prerequisites a closure that stops at depth 1
synthetic_focus_with_no_external_prerequisite_pulls_nothing the empty case, as a tested outcome rather than an untested branch
synthetic_notice_names_every_pulled_prerequisite the gap the review found — the old test claimed "named as such" and never checked the notice
synthetic_visible_set_is_lane_plus_pulled double-counting or omission
no_visible_node_has_a_hidden_prerequisite the live-tree invariant, stated conditionally so it holds under every focus including NoFocus

Validation

  • whole-tree gunbc compile --target dag — 0 blocking errors
  • ROADMAP.md regenerated from the authority
  • 104 witnesses green, zero failures — roadmap_focus (12), roadmap_authority, generated_artifact_drift, roadmap_page, doc_reachability (both homes), roadmap_emit, roadmap_document

🤖 Generated with Claude Code

Owner membership alone was the wrong visibility rule. The v1 deletion lane's
critical path runs through pderive-source-slot-binding, whose prerequisite
namespace-canonical-binding lives in a lane the focus hid — so the page rendered
the fourth link of the spine as READY with its blocker invisible. Nothing was
red; the page lied by omission. That is worse for a dispatched agent than for a
person: a worker reads a ready-looking node, starts, and stalls on work the
roadmap never mentioned.

Visibility is now lane membership UNION the transitive prerequisite closure,
reusing std.graph.graph_reverse_reachable_members over the roadmap's own edge
relation rather than minting a second walk — the edge is already a dependency
edge, reverse reachability from a lane node is exactly its ancestors, and the
graph is acyclic by witness so the walk terminates by construction.

The closure found FIVE blockers where three were visible by eye:
namespace-canonical-binding has its own prerequisites, so the lane was blocked on
a namespace sub-chain of three. Manual inspection would have found those one
stall at a time, each costing a wasted attempt.

Pulled-in rows are named as prerequisites in the notice rather than counted as
lane work, so the lane's real size stays honest.

THE DISCRIMINATOR IS SYNTHETIC, deliberately (review). An earlier cut asserted
count(pulled) > 0 against the live roadmap_focus_selection, which contradicts the
carrier's own promise that changing or clearing the focus is a one-row view edit:
it fails the moment the focus is NoFocus, or a lane that legitimately has no
cross-owner prerequisite — reporting a defect where none exists and making the
focus row un-editable in practice. The fixture owns its two lanes and its
transitive cross-lane chain, so it holds under any live focus, and it exercises
TRANSITIVITY (b3 pulls b2 pulls b1) which is the part manual inspection misses.
A companion asserts the no-external-prerequisite case pulls nothing, so the empty
result is a tested outcome rather than an untested branch.

The notice claim is also strengthened per review: the test named
"pulled in and named as such" now actually checks the notice contains every
pulled id, which it previously did not.

The live-tree invariant is stated conditionally beside the fixture: whatever the
current focus is, no visible node may have a hidden prerequisite. That holds
under every focus including NoFocus, so it constrains the projection without
pinning the selection.

Split out of #7417 on review: the identity half needs identity on RoadmapNode, an
active/tombstoned lifecycle, and a base-versus-head permanence gate, and is being
rebuilt separately. This half is independent of that work.

Verified: whole-tree compile 0 blocking errors; ROADMAP.md regenerated from the
authority; 104 witnesses green with zero failures across roadmap_focus (12),
roadmap_authority, generated_artifact_drift, roadmap_page, doc_reachability (both
homes), roadmap_emit and roadmap_document.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@cursor

cursor Bot commented Jul 29, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@briansrls

Copy link
Copy Markdown
Contributor Author

Superseded by #7440, which consolidates this with the other roadmap-belt PRs. Four branches racing a moving main produced a ROADMAP.md conflict on every advance; one branch regenerating the artifact ends that. All content from this PR is carried forward and re-verified on the consolidated branch (199 witnesses green).

@briansrls briansrls closed this Jul 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant