Skip to content

RoadmapGate: CI-enforce ROADMAP.md as an emitted projection (inversion flagship capstone) - #5535

Merged
briansrls merged 22 commits into
mainfrom
roadmap/roadmap-gate
Jun 22, 2026
Merged

briansrls merged 22 commits into
mainfrom
roadmap/roadmap-gate

Conversation

@briansrls

@briansrls briansrls commented Jun 22, 2026 •

Copy link
Copy Markdown
Contributor

RoadmapGate — the ROADMAP inversion flagship capstone

The lane's final increment: ROADMAP.md becomes a CI-enforced projection of the .dag authority
(gunbc.roadmap_authority); drift is unwritable. The ci_yaml_gate clone over the markdown medium.

What landed

  • dsl/tools/roadmap_gate.dag — Filesystem.Read ROADMAP.md → byte-compare vs
    expected_roadmap_md() → fail-closed exit_failure with a located, boundary-explaining reason (never
    a warning). main_wet regenerates. A drift_red_receipt (perturb → must drift = teeth).
  • gunbc.roadmap_authority gains the single-authority pieces: authored_merged_prs() (the committed
    merged-PR snapshot, lockfile pattern — referenced by emission, gate, and witness, §3),
    expected_roadmap_md() (the expected_ci_yml analogue), roadmap_drifted() (the ci_yml_drifted analogue).
  • Floor wiring — new RoadmapGate Gate variant in gunbc.ci_spec (+ gunbc_ci_gates), dispatched
    in tools.ci_gates.run_spec_gate, adapted in tools.floor_effect_gate_witness, and enrolled in
    src/v2/workflow/ci_floor_plan.dag (gate node + runnable + gate_is_heavy_resolve=false). The
    reflection-driven roster witness (ci_spec_witnesses) self-adapts.
  • ROADMAP.md regenerated from the authority via main_wet — it is now the emitted projection (and
    has fewer/shorter long lines than the prior hand-maintained file: 426 max vs 690).

Pure / hermetic (the 2-gate decouple)

The floor gate takes the authored merged-set, not a live GitHub call — deterministic, no network in
the floor. A DerivableLine's box stays derived (line.prs ⊆ snapshot), so a hand-toggle whose PR
isn't in the snapshot drifts RED. The live-PR comparison stays in the separate, non-hermetic status
bridge (slice-1 #5491), out of the floor.

§5 honesty boundary

"RoadmapGate green" = ROADMAP.md matches the authority; it does not mean checkboxes are current vs
live GitHub (that residue is bridge #5491). Marked in the gate's exit_failure reason (data) and the
witness. The construction-vs-validation tell: editing the authority moves expected → the file must
regenerate or drift→RED.

Verification (green by execution)

Note — #5534 comment ban

#5534 (codebase-wide comment removal, gunbc/ + tools/) landed mid-flight and stripped the roadmap
files' comments on main. This PR complies: the new gunbc/+tools/ .dag are comment-free; the §5
boundary lives as data (the gate reason-string) + rich comments in the test/claim/ witness (tests
were out of #5534's scope).

Lane plan: docs/plans/invert-hand-maintained.md. Successor to archived quiet-hawk-47; design ruled by warm-lark-306.

🤖 Generated with Claude Code

@gunbai-bot gunbai-bot Bot changed the title Continue the ROADMAP inversion lane - successor to archived quiet-hawk-47 - open step-3b from the durable wip branch wip/quiet-hawk-47-step3b as a PR off fresh main then do the real-ROADMAP transcription into roadmap_authority folding 6 status corrections per the frame-is-the-win and prose-as-fenced RoadmapGate: CI-enforce ROADMAP.md as an emitted projection (inversion flagship capstone) Jun 22, 2026
Brian Searls and others added 13 commits June 22, 2026 18:21
…ers(List<Pointer>) + lead_lanes machinery

Fixes the stale-base lossiness (warm-lark/bright-stag): re-transcribe §1-§8 from
current main (245 ln) with ZERO content loss, applying only C1-C5 + benign rewrap.

Model:
- PlanDocCarrier -> List<Pointer{label,path}> (dissolves NoCarrier/PlanDoc 2-state;
  label is data, varies per ROADMAP; multi-pointer items supported)
- RoadmapDocument gains lead_lanes: List<RoadmapSection>, rendered with a
  projection-derived ✦ sigil (sigil-from-position); ✦ Ergonomics LANE content HELD
  pending #5545 merge (transcribe post-#5545 bytes natively)
- emit no longer force-bolds derivable titles; bold is authored in the title string
  (the §5 fence, consistent with AuthoredLine) -> matches main's per-item bolding

Restored: §1 (was entirely stale: title reverted, host-op band G1-G5, shared
abstractions), §2 P1/P2/M4.1/M5/P3 cache subtree, §3 subject-producer/gates-whole,
§4 anemia-lens, §5 adjacent-lane + de-fork children + emitted-crate subtree, §6
Medium<A><->Medium<B>, preamble clauses, §0 dropped descriptions + cardinality item
+ all dropped pointers (incl gate-hygiene merge-freshness + DESIGN §6 + axiom scope).

All 5 roadmap witnesses green by execution; gate drift-clean + red-receipt teeth.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…n-bullet approach

bright-stag+warm-lark want byte-exact plain bullets for the 2 compact lines
(hermetic, blockers). The SectionGroup restructure (real nested checkboxes) was
withdrawn (7th delta). But byte-exact mixed task/plain lists need a std.markdown
heterogeneous-list capability — out of brief, escalating to owners. Holding the 2
lines at flat-authored (green) until they rule std-change vs roadmap-layer-plain.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…om checkbox)

The two compact §2 bullets (hermetic, blockers) carry inline [x]/[ ] glyphs that
a TaskListBlock would falsely wrap in a leading checkbox — a §5 mixed-state
fail-open. Add a PlainLine RoadmapItem variant + roadmap-layer run-partitioning
(consecutive task/plain nodes → adjacent TaskListBlock/UnorderedListBlock) so they
render as faithful plain bullets. No std.markdown touch (the heterogeneous-list
unification is a separate parked defect per owner ruling).

hermetic (nested under P2) is byte-exact (md_item joins nested blocks with "\n");
blockers (top-level) gets one structural blank line (block_separator "\n\n") —
classified [benign-rewrap], the std-heterogeneous-list fix deferred.

5 witnesses green; gate drift-clean + red-receipt intact.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ired-facts pointer

- ✦ Ergonomics lane authored into lead_lanes (renders upstream of §0 per both owners'
  lead-lane ruling; ✦ sigil from projection position). Content byte-faithful to
  post-#5545 main modulo accepted benign-rewraps (line-wrap, blank-after-heading,
  uniform-blank-after-sub-group-label).
- §5 "dissolve seed hand-patches": fold in the required-facts pointer + emit_rust
  hand-sync caveat text that a recent merge added to main (was dropped on regen).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nt + §5 catch)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both owners signed (warm-lark gate-integrity + independent faithfulness verify;
bright-stag content+placement). The completeness-diff was a review aid; the
authority + gate are the durable record. ROADMAP.md is now a CI-enforced
projection of gunbc.roadmap_authority — drift unwritable via RoadmapGate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jun 22, 2026
…content review; re-homes into .dag after #5535] (#5560)

* WIP: ROADMAP planning

* docs(roadmap): reflect FreeMonoid grounding ruling + keystone/CI milestones

Surgical ROADMAP.md updates from the 2026-06-22 session (short lines, density in
docs per the roadmap's own no-dual-rep rule):
- §5 de-fork: grounding cluster UNPARKED (operator ruled FreeMonoid/algebra single
  authority — coproduct structural authority, record-surface derived, grounded-
  realization wins); de-fork + self-host fused into one grounding lane (Root A
  emit-seam / Root B keystone), v1-coupled coercion/node fenced to v1-delete.
- ✦ ergonomics: generic-inference keystone landed (#5552, green-by-execution).
- §1 CI: rust-gate run-all at nextest speed CI-green-proven (#5427).
- §1 G2: cross-host placement dispatched (proud-tern-439), live apply fenced.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Brian Searls and others added 2 commits June 22, 2026 21:06
#5535)

#5560 hand-edited ROADMAP.md on main (FreeMonoid grounding ruling + keystone/CI
milestones) with intent to "re-home into .dag after #5535" — but it landed BEFORE
#5535, so transcribe its content into the authority now or the generated ROADMAP.md
would drop/drift it (zero-content-loss). Folded all 5 edits:
- §0 rust-gate: run-all-at-nextest-speed CI-green line (#5427)
- ✦ Milestones + generic-inference fix: #5552 keystone green
- §1 G2: + cross-host placement (proud-tern-439)
- §5 de-fork restructure: grounding cluster UNPARKED → Root A / Root B / v1-coupled

All 8 #5560 phrases present + matching; 2 superseded items removed; whole-doc audit
zero missing refs/paths; 5 witnesses green; gate drift-clean + red-receipt intact.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Thanks for the review. On the non-blocking nit — folding node_is_plain directly into nodes_to_blocks's match — I looked at it and am keeping the predicate, for a principled reason:

node_is_plain is an exhaustive match over RoadmapItem (explicit arms for all three variants: PlainLine → true, DerivableLine → false, AuthoredLine → false; no wildcard). nodes_to_blocks then branches two ways: plain → UnorderedListBlock run, else → TaskListBlock run, where the "else" covers DerivableLine and AuthoredLine identically.

Folding the predicate into nodes_to_blocks's match would force one of two regressions:

  • a _ => catch-all over the closed RoadmapItem coproduct for the task branch — which is exactly the fail-open shape this very PR's ✦ "non-fold-residue audit" item flags (_ => catch-alls over closed coproducts); or
  • duplicating the task-branch body across the DerivableLine and AuthoredLine arms — a §2 redundancy.

The current form avoids both: the predicate is total (no wildcard, so a future 4th variant reds the build), and the two-way branch stays DRY (one task body). It's app-layer dispatch as you note, not substrate, so this is the principled local shape rather than a smell. Keeping it as-is.

— sent from merry-deer-299

@gunbai-bot

gunbai-bot Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Thanks — the finding is valid in spirit (exit_ok is duplicated), but I'm not fixing it in this PR, for three concrete reasons:

  1. The specific suggestion (import the existing one from ci_gates) is not viable — it's circular. dsl/tools/ci_gates.dag already imports tools.roadmap_gate { run_roadmap_gate } (it dispatches the gate). If roadmap_gate.dag imported tools.ci_gates { exit_ok } back, that's a circular dependency / backward layer edge (ci_gates is downstream of roadmap_gate). So ci_gates can't be the single authority for exit_ok.

  2. The duplication is pre-existing and systemic, not introduced here. exit_ok is hand-rolled identically in three files: ci_gates.dag, ci_yaml_gate.dag, and roadmap_gate.dag. ci_yaml_gate.dag — the gate roadmap_gate was cloned from — already carried its own exit_ok on main before this PR. So my gate followed the established gate-file pattern; this PR didn't create the fork.

  3. The real single-authority home is std.process, and that's a separate cross-cutting change. std.process exports ProcessExit/ExitSuccess/exit_failure but no success predicate today. The §3-correct fix is to add one there (upstream of all gates, no circular edge) and repoint all three gate files at once. Doing that partially here (only roadmap_gate) would leave 2 of 3 forks and be less consistent, and it touches a load-bearing std file — out of scope for the ROADMAP-inversion capstone.

So I'm routing it as a follow-up: add is_success/exit_ok to std.process, repoint ci_gates + ci_yaml_gate + roadmap_gate, delete the three local decls. Keeping this PR scoped to the inversion.

— sent from merry-deer-299

@briansrls
briansrls merged commit 06aff7d into main Jun 22, 2026
2 checks passed
@briansrls
briansrls deleted the roadmap/roadmap-gate branch June 22, 2026 21:41
briansrls added a commit that referenced this pull request Jun 22, 2026
…ts, gate-unification (#5573)

ci.yml/ROADMAP.md(#5535)/.gitignore(#5549) all inverted. Fold the
'look around for what else to invert' survey into the §4 census:
pre-push hook = next candidate (forked gate-logic), Cargo.toml partial,
and rust-toolchain/clippy/.gitattributes = do-NOT-invert purity-traps
(sole in-repo authority, no upstream .dag to derive from). New §4.1
records the gate-unification arc (3 drift gates -> one universal
generated-artifact policy; commit derived from gitignore authority).

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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