Skip to content

Plan 47: roadmaps, capability maps and design slices - #36

Merged
darko-mijic merged 82 commits into
mainfrom
feature/roadmap-and-slices-v0
Oct 22, 2026
Merged

darko-mijic merged 82 commits into
mainfrom
feature/roadmap-and-slices-v0

Conversation

@darko-mijic

@darko-mijic darko-mijic commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

The owner asked for one well-rounded PR on how a corpus reads where it stands and what comes next:

  • Epics. Filtering by altitude showed one epic over 106 features and 298 stories, and no view drew
    refinement.
  • A roadmap with priority, tied to the PR descriptions: what to design next and what to build
    next, in order.
  • More diagram kinds, and a deep review of the annotations behind them: the architecturally
    significant patterns and abstractions, curated rather than generated. The labels were too small at
    desktop width, and the maturity map read as a list.
  • Architectural slices: features that must be reviewed as a whole, designed in rounds of growing
    detail, within limits.
  • Plans become the roadmap: designed, grouped, prioritized Specs instead of prose plans, with this
    PR setting the precedent for retiring plans/ and reviews/.

This PR builds all five. Its intent is pack:roadmaps-and-slices-v1
(26 Specs and 23 executable examples), and the Protocol now plans from its own roadmap,
pack:roadmap. Plan 47
is the last numbered plan.

What this PR introduces

The arc's behavior and contract Specs state ready, and each is bound to the code that realizes it
and the tests that verify it, except the executable-examples epic, which has no resolving verifier
yet. The validator reports that gap, and one more on the role vocabulary, a ready model. The three
decisions carry no delivery facts by design, and the release and baseline views stay scoped. Recipe numbers are the
catalog's (docs/agent-surface/recipes.md).

Epics and the capability map

The Protocol's features now sit under nine epics. Seven hub Specs that already stated a capability
were enriched in place to epic, executable examples gained an epic of its own, and self-hosting
stays an epic. Every Spec is reached by an epic, and every ready Spec kept its floor. An epic may be
any kind of Spec, since kind and altitude are independent coordinates on the one primitive (MD-48).

The capability map (recipe 52) reads each epic with its distinct refinement descendants: their rungs,
binding facts and open questions, and any Spec no epic reaches. The Studio gains a Capabilities
lens after Packs, a refinement drawing, and an epic filter on the index. Start at
consumers.capability-map and
protocol.capability-epics.

The roadmap

A roadmap is a Pack whose manifest states order: priority. Its member order is the owner's advisory
priority, with no new relation, no date and no gate (MD-46). Everything else is read from the graph
each time. Each entry's refinement subtree gives its need, the part that holds it, and what it
rests on. The needs are:

  • to design;
  • to state: the floor allows ready and only a person's statement stands before it;
  • to build;
  • built.

Three surfaces read a roadmap:

  • recipe 53, the roadmap reading;
  • the Studio's Roadmap page, which shows it as a board;
  • recipe 55, which renders it as the forward section of a PR description, so the next-PR plan is
    the roadmap. This description's forward section below is that memo.

The roadmap ran its own cycle in this PR. Recipe 53 read this arc's six entries as built, so the
PR removed them, as MD-47 says the completing PR does. Start at
consumers.roadmap and
decisions.roadmap-priority.

Diagrams the graph has data for

A catalog judges every Mermaid diagram type against the graph's data. Kept:

  • a dependency drawing over a Pack, slice or roadmap;
  • a refinement tree for the capability map;
  • an architecture drawing scoped to the components a slice touches, realized and planned;
  • the maturity map as a grid of counts, which reads as one sentence when every member shares a cell;
  • a requirement drawing on each Spec page;
  • a component uses table beside the architecture drawing.

Refused, with the trigger that would bring each back: sequence (a flow is one prose line, so the graph
has no message order), state, Gantt (the graph holds no dates) and journey. Labels lead with the title
at 14 pixels, and ids shorten with a marked elision. A wide drawing keeps its size and scrolls inside
its figure, where it used to shrink its labels to 6 to 8 pixels. Edges route around boxes, and every
drawing offers its Mermaid source to copy. Start at
spec-studio.diagram-kinds.

Design slices

A design slice reads a Pack, some of its members, or an ordered list of Specs as one design:

  • how the members rest on each other;
  • the components they touch, realized and planned;
  • the decisions and open questions in scope;
  • what each member needs for its next rung.

It is a reading composed on each run, never a new grouping. Recipe 54 answers it, and the Studio gains
a slice page per Pack. How much design each round adds is guidance in the authoring skill ("Design in
rounds"), because an "over-designed" check would police content quality. Start at
consumers.design-slice.

The annotation review: a curated register

Every engine anchor and every bare source file was read against the significance criterion, now
clarified: a unit qualifies when a designer must understand its contract or responsibility, and being
exported is not enough. The owner accepted the change table, which keeps every realization claim:

  • 14 additions, 11 merges and 1 drop;
  • role fixes and 3 component uses;
  • the contract decoder moved to the reader component, after recipe 32 and the self-binding tests
    showed it adds no layer crossing.

Each unit's label now states its responsibility. A role vocabulary defines each role word, and the
architecture page lists each component's significant units by role. Start at
protocol.significant-units-review.

Plans and reviews become the roadmap and the pull request

MD-47 replaces both:

  • Planning: plans/ is frozen at this plan. The handbook names pack:roadmap and recipe 53, and
    the gate checks the roadmap Pack in the graph rather than a current plan.
  • The arc's record: the branch until its first coherent commit is pushed, then the draft pull
    request.
  • Review findings: against Specs, they travel as a change proposal checked by recipe 38 and posted
    with recipe 49's memo. Against code, they are line comments.
  • Evidence no test or recipe carries: committed on the branch, linked at that commit, and removed
    before merge.

The removal of plans/ and reviews/ is the next PR, first on the roadmap. Three canonical examples
live in this PR:

Start at protocol.roadmap-replaces-plans
and decisions.roadmap-over-plans. An adopter
gets the same path in the upgrade guide and a small
roadmap in the worked example.

See it

This PR's Studio: https://libar-dev.github.io/software-delivery-protocol/preview/36/, built from
each push's merge commit, with CI's runs and the diff from main. The screenshots below were captured
in headless Chrome at 1440 pixels (390 for the phone view); the commands are in
evidence/pr36/README.md.

main (da4b141) This PR
Architecture
Maturity map
Trace graph

New pages:

Page Capture
Capabilities: nine epics with their rollups
The index narrowed to one epic
The roadmap with this arc's six entries built, before they left
The roadmap after: the cleanup first, then the next PR's work
A design slice: the design as a whole
The slice's dependency drawing
The architecture the slice touches
The component uses table
A requirement drawing, examples folded beside their tests
The platform's capabilities (one epic), at b038bd4
The platform's architecture
The platform's history-view slice
The roadmap on a phone

No human view shows the vault here. Its notes now say "Members, in advisory priority order" for a
roadmap.

The corpus, measured

Re-measured at the head; re-run the recipes rather than inheriting these.

Measure At main At the head
Specs, Packs, recipes 405, 7, 51 456, 9, 55
Epics; Specs no epic reaches 1; 110 9; 0
Stated ready 399 447, every one at a ready floor
Validation 0 errors, 1 warning 0 errors, 3 warnings, all honest verifier gaps
Drift alarm (recipe 2) empty empty
Build backlog (recipe 1) edit-model, intent-composition the same two, now the roadmap's entry 4 and its child

The design diff from main (recipe 35): 51 Specs added, 52 changed (the hubs enriched to epic, the
Studio contracts aligned, the Pack carrier and model), none removed; 4 Packs changed; 88 binding changes.

Rulings

Made by the owner (2026-10-22, through the coordinating session):

Ruling Carrying entry
Ratified: an optional Pack manifest field order: priority makes member order an advisory priority (MD-46) decisions.roadmap-priority
Ratified: plan and review files stop carrying the delivery record. The record is the branch until the first coherent commit is pushed, then the draft PR. No check refuses a new plan file (MD-47) decisions.roadmap-over-plans
Ratified: epics of any kind keep their kind (MD-48) decisions.epics-of-any-kind
Accepted: the annotation review's change table, the decoder's move conditional on no added layer crossing (it added none) protocol.significant-units-review
Words: "roadmap"; "need" for what an entry needs next; "to state"; "design slice" a guidance-only label CONTEXT.md
Release and baseline views stay deferred; trigger: the first published release projections-model.roadmap-views
The nine epic boundaries as designed; the ready statements at the floor; the delivery-record cleanup first on the roadmap protocol.capability-epics, pack:roadmap

Delegated, then confirmed by the owner. The executing thread made these after two independent
advisors and the lane reviews; the owner confirmed all eight on 2026-10-22. Plan 47 lists the other
delegated rulings.

Ruling Carrying entry
One decision carries plan and review files; evidence lives on the branch at a pinned commit, not in a new folder decisions.roadmap-over-plans
The significance criterion clarified in its four places, as drift repair rather than a new decision model.structural-patterns
A roadmap entry's scope is its refinement subtree; pages refine their readings so an entry reads built only when its pages are consumers.roadmap
The memo's derived column is "Purpose and reach", never the owner's reason for a place consumers.roadmap.memo
A drawing keeps its size within an 880-pixel budget and scrolls inside its figure; titles lead; a pair's edges draw as one arrow; dense drawings fold by height spec-studio.diagram-kinds.legibility
Mermaid source is copyable text and needs no decision refining MD-44 or MD-32 spec-studio.diagram-kinds.mermaid-source
An example folds into its parent only when nothing is lost; a slice's drawings consume its answer consumers.design-slice
The design-rounds guidance joins the authoring skill and its on-ramp consumers.authoring-on-ramp

Registry and glossary. In DECISIONS.md: MD-46, a roadmap
states advisory priority; MD-47, the roadmap and the pull request over plan and review files; MD-48,
epics of any kind. In CONTEXT.md: new rows roadmap and need; the
capability / domain row broadened to epics of every kind; architecturally significant unit
clarified; design slice added to the guidance-only labels.

How it was built and reviewed

  • Design. Five design lanes ran first. Each was designed by one model family, reviewed by another
    and answered by the first, with prototypes on the Protocol's corpus and a copy of libar-platform.
    The design records are at reviews/plan47-design/ and the
    annotation review. Two advisors (Opus 5.5 and
    GPT-6-Astra) then reviewed the decisions as change proposals.

  • Build. Three build waves followed: 11 lanes, each built by GPT-6.1-Sol, reviewed by Opus 5.5 and
    fixed test-first. Each wave was integrated in one pass and checked on CI's route (Node 20, npm 10,
    a fresh clone) before its push.

  • Close review. Four independent reviews ran before this PR was marked ready:

    • an adversarial code review (Opus 5.5);
    • a design-honesty review (GPT-6-Astra);
    • CodeRabbit's CLI, scoped by directory (25 runs under its 100-file limit);
    • Greptile's CLI, on throwaway commits from main that each hold one directory group, since the
      whole branch exceeds its limit. Findings that only the split produced were set aside.

    Every remaining finding was fixed test-first. Among them:

    • the requirement drawing claimed "no declared verifying example" on 63 of 78 pages that had one;
    • drawings ran far past their budget;
    • Mermaid source failed to parse on a backtick title;
    • recipe 53 renumbered places after an unresolved member;
    • priority read as reading order on the Pack page, the vault and the design diff;
    • the gate read the roadmap's frontmatter instead of the graph;
    • a maturity cell's link could not open its list;
    • the Studio build had become 2.7 times slower. It now builds within about five percent of main's
      time on the same machine, and the Studio tests build their page set once.
  • After the PR was marked ready, Greptile's hosted review found three more issues, each fixed
    test-first in 3d520678:

    • a slice page never named a manifest member that resolves to no Spec, so an incomplete Pack read
      as complete;
    • a roadmap card or waiting-list link under the Need filter opened a row the filter kept hidden;
    • print expanded Mermaid source the reader had left closed.
  • A flaky test. CI's push run once timed out a watch example at 5 s. The example already waited on
    cycle events, so its file now carries the heavy-test timeout, and a test reads each watch example's
    registered timeout. That test failed at 5,000 ms first.

Try it

git clone https://github.com/libar-dev/software-delivery-protocol && cd software-delivery-protocol
git checkout 3d520678f48720bc4bc9ce59eea9c94ca18e710d && npm ci

# The Protocol's next work, and its forward section for a PR description
pnpm --silent sdp:q "$(cat dist/recipes/53-the-roadmap.js)" --params '{"pack":"pack:roadmap"}'
pnpm --silent sdp:q "$(cat dist/recipes/55-the-roadmap-memo.js)" --params '{"pack":"pack:roadmap"}' --json | jq -r .memo

# Every epic and its descendants; one Pack read as one design
pnpm --silent sdp:q "$(cat dist/recipes/52-the-capability-map.js)"
pnpm --silent sdp:q "$(cat dist/recipes/54-the-design-slice.js)" --params '{"pack":"pack:roadmaps-and-slices-v1"}'

# The Studio, then open generated/spec-studio/capabilities.html, roadmap.html and slices/
node dist/cli/sdp.js studio . --exclude explorations --exclude examples --exclude test/fixtures/import/parity

Feedback wanted most:

  • whether the roadmap's four needs and its board read right to you;
  • whether the nine epics draw the boundaries you would (projections is the broad one: the Studio, the
    vault and the agent surface);
  • whether the significant-units register is the curated map you meant;
  • whether the precedent for plans and reviews reads clearly enough for the cleanup PR to follow
    without a plan file.

The next PR

Recipe 55's memo over pack:roadmap, rendered at this head:

The next work, from the roadmap

Roadmap: The Protocol's roadmap pack:roadmap

To state means the floor allows ready and a person still judges the statement. Built means every Spec of the entry's work states ready and has an implementation binding; it reports no passing test and no deployment.

The Protocol's next work, first entry first. The order is a preference: it dates, gates and sequences nothing, and what each entry still needs is read from the graph each time.

First the cleanup that removes the frozen plans, review reports and superseded concept material, as the roadmap and the pull request record make possible. Then the two steps a reader of the Studio's pages could not take, the words of a test line that checks a declaration and an outside register's entries, and then the composed-intent model the build backlog holds. What the first adopter's mass update asks for joins when the owner selects it; a capture landing adds nothing here. An entry leaves by an edit to this manifest once its selected work is complete or no longer belongs among the next work.

To design

Place Entry Next Purpose and reach
1 The Protocol removes its frozen plans, review reports and superseded concept material spec:protocol.delivery-record-cleanup itself idea → scoped, held by kind-evidence-present; blocked by spec:protocol.delivery-record-cleanup#question.durableContent Remove plans/, reviews/ and the superseded concept material from the tree, after moving into the graph the durable content they still hold, so the repository keeps one delivery record: the graph, git and the pull requests.
2 A pinned declaration shows the words of each test line that cites it spec:consumers.spec-studio.cited-line-text itself scoped → defined, held by no-blocking-open-questions; blocked by spec:consumers.spec-studio.cited-line-text#question.lineText The declarations page names each citing line by file and line only, so the reader leaves the page to read it, and has no route at all when the page set carries no source link.
3 An outside register is a named Studio input, so a cited token links to its entry spec:consumers.spec-studio.register-input itself scoped → defined, held by no-blocking-open-questions; blocked by spec:consumers.spec-studio.register-input#question.registerEntry, spec:consumers.spec-studio.register-input#question.inputForm A cited token reads as bare text on every page, and the register that defines it is neither linked nor shown.

To build

Place Entry Purpose and reach Rests on
4 Views compose scoped intent instead of patching canonical source spec:consumers.edit-model Let a view frame a requested change without giving derived surfaces a direct write path to canonical source. nothing unbuilt

Waiting on the owner

  • spec:protocol.delivery-record-cleanup#question.durableContent (blocking), place 1: Which content in plans/, reviews/ and the concept documents does no Spec, test, decision or recipe carry yet, and where does each piece belong?
  • spec:consumers.spec-studio.cited-line-text#question.lineText (blocking), place 2: May the Studio show source text the graph does not hold, and if so is it recorded in the graph beside the citation or read as a named input?

Deferred, with their triggers

  • spec:carrier.sdp-import.feature-adapter#question.featureAdapter: Which bare .feature constructs can an import adapter preserve honestly? Trigger: an adopter migrates a gen-1 .feature corpus into the Protocol
  • spec:consumers.impact-graph.symbol-reach#question.symbolIdentity: Which language-neutral identity and extraction boundary can support exhaustive symbol reach without freezing a single compiler's representation into the Protocol? Trigger: a reader needs symbol-level reach that file-level imports and curated anchors cannot give
  • spec:consumers.projections-model.roadmap-views#question.releaseReader: Does a reader need release or baseline views that the roadmap, the recipes and git tags do not serve? Trigger: the first published release
  • spec:consumers.reference-projection#question.namedOutsideReader: Does a human reader outside the repository need a reference projection the four shipped roots do not serve? The taxonomy row is not that reader. Trigger: a named consumer outside the repository, with a way to measure that demand inside the arc that builds the projection
  • spec:consumers.structural-mermaid#question.namedStructuralReader: Does a reader need diagrams rooted at code units, which census tables and Spec-rooted one-hop Mermaid do not serve? Trigger: a named reader with that need, plus a decision that refines spec:decisions.shipped-projections-frozen for the affected Mermaid rendering or supersedes that ruling whole
  • spec:observation.runtime-overlay#question.observationIdentity: Which external observation identity and freshness boundary is small enough for the graph while still supporting an honest observed delivery fact? Trigger: An adopter needs runtime measurements linked to measurable Spec targets and can supply an observation identity and freshness policy for review.

Why this order (the owner's reasons, not the memo's):

  1. The cleanup comes first because the owner ruled that a dedicated PR removes plans/ and
    reviews/ once this precedent lands.
  2. The two Studio captures close the steps a reader could not take in PR 35's reader tasks.
  3. The composed-intent model is the whole build backlog.

What the platform's mass update asks for joins on the owner's word. Release readiness stays off the
roadmap until the owner names its items.

Answered since the memo was rendered. On 2026-10-22 the owner let the provisional answers of
both waiting questions stand. Each answer is recorded at the start of its own arc, not in this PR:

  • #durableContent (place 1): the cleanup arc's first commit is a measured inventory of what
    plans/, reviews/ and the concept documents still carry that no Spec, test, decision or recipe
    does, each piece with its home. A cross-family review checks the inventory before anything is
    deleted.
  • #lineText (place 2): the extractor records the citing line's text, trimmed and bounded, on the
    citation row it already writes, as inferred data that confers nothing; the Studio reads no
    source. #lineBound's provisional answer stands too: a bound of a few hundred code units, cut at
    a word boundary and marked as cut, the whole line one source link away.

Re-entry: this PR merged. The cleanup arc opens with the inventory and records its answer.

Refused, durably:

  • a rung stated by tooling;
  • priority as a date, a schedule, a gate or a new relation;
  • a roadmap that lists every feature;
  • a slice or a capability as a new grouping primitive;
  • an "over-designed" check;
  • a diagram derived from prose;
  • an anchor added for coverage;
  • a tool that edits a carrier itself;
  • a count, date or plan number inside a Spec.

🤖 Generated with Claude Code

RetriggerView in GreptileConfidence Score: 4/5

The reported issues are non-blocking: they affect slice completeness, filtered roadmap navigation, and printed review readability rather than preventing the new readings from operating.

Findings

  1. P2 Missing members disappear ▶
  2. P2 Roadmap links stay hidden ▶
  3. P2 Closed source prints anyway ▶

Summary

This PR adds graph-backed roadmaps, capability maps and design slices, plus Studio pages and richer diagrams.

  • Roadmaps show what each planned entry needs next.
  • Capability maps show each epic and the Specs refined beneath it.
  • Design slices bring a Pack's connected design details into one reading.
  • Studio diagrams add new views and stay readable at different sizes.
  • The roadmap and pull request become the Protocol's forward plan.

The reported issues do not block merging. They affect completeness within the slice view, filtered roadmap navigation, and printed review readability.

Reviews (1) · Last reviewed commit: "evidence: remove PR 36's screenshots and..." · Reviewed by Greptile

darko-mijic and others added 20 commits October 22, 2026 08:13
…n slices

The owner asked for epics and a capability map, a roadmap with advisory
priority tied to the PR descriptions, more diagram kinds with a curated
annotation review, design slices, and the roadmap replacing the numbered
plans. This commit states that intent in the graph before any design pass:

- pack:roadmaps-and-slices-v1 with fourteen captures at idea, one per
  item, in the order the arc would build them;
- two captures from PR 35's forward lanes, so the first roadmap has real
  upcoming work beyond this arc;
- the two owner decisions as decision captures that refine the planning
  truths decision: priority in the graph, and retiring the plans;
- plan 47 as a thin DRAFTED pointer, named by the handbook;
- the self-hosting oracle transcribed for the sixteen new Specs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lane S of plan 47's design wave. A design slice is a reading, not an
artifact: a Pack read whole, narrowed to a perspective's members, or an
ordered list of Specs, composed from the graph on each invocation.

- spec:consumers.design-slice states defined: recipe 54's rules and answer
  shape, composing rule coverage, the architecture map, the realization
  comparison and the decision and open-question registers; members rest on
  each other as the statement queue reads them, with depth and cycles; the
  components touched through members' code, through the code that realizes
  what the slice rests on, and through planned component designs; decisions
  and questions in scope; summary by default, detail as Pack design reads it.
- spec:consumers.spec-studio.slice-page states defined: one slice page per
  Pack beside the Pack page, its sections, tables and drawings; its ready
  waits on the diagram kinds lane G designs.
- reviews/assets/plan47-prototypes/S-design-slice: the draft recipe body,
  the page builder, four slice pages over the Protocol's corpus and the
  platform copy, sample answers and screenshots.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Drafts the roadmap priority decision (order: priority on a Pack manifest) and
the plans-over-roadmap decision to defined for the owner; designs the roadmap
reading (recipe 53, four lanes from each entry's refinement subtree), its
Studio page and the forward-section memo (recipe 55) to defined; reshapes the
roadmap views capture around the named reader; takes the cited-line and
register-input captures to scoped; authors pack:roadmap as the first roadmap;
prototypes the page and memo on the Protocol and a platform copy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The waiting list keeps the statement queue's order across the roadmap; each
entry lists its parts with what holds them, the waiting statements before its
own, and rests on any outside parent of a descendant; questions with no decider
are listed apart; entry ids carry their roadmap's name; the design diff reports
a Pack becoming a roadmap; the roadmap is selected, not filled by captures; and
an arc's record has a home before its first push. Probes check each fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lded examples

The design slice now marks each relation between members as ordering or not,
folds an example only when its refines is its one typed relation, lists every
member component design as its own row with recipe 43's rows attached, carries
the unit edges behind each uses pair, planned uses and the outside neighbors,
and pins its diagnostics. The slice page consumes the answer for both drawings,
uses the drawing kinds' element ids, keeps folded examples readable in a
disclosure and stacks member rows on a phone. The prototype adds a probe corpus
for planned components and folded examples.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The five lanes merged above are reconciled into one design:

- the dependency drawing carries the slice's `orders` mark and folds an
  example only when the slice does; the scoped architecture reads the
  slice's design rows apart from its anchored components; the slice page
  depends on the two drawing kinds it draws;
- the epic-kind decision moves into the decisions family as
  spec:decisions.epics-of-any-kind;
- the significant-units panel lane A proposed is authored at defined
  under the architecture lens;
- the arc Pack, the Studio Pack and the self-hosting Pack list the new
  Specs; the self-hosting oracle is transcribed for every change;
- plan 47 records what the wave added, dropped and reshaped, the
  delegated rulings, the owner's decisions and the proposed build waves;
  reviews/plan47-design/ keeps each lane's brief, design, reviews and
  answer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The page and memo now show this branch's own state: three entries to
design, five to state and one to build, the capability map held by the
epic-kind decision.

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

coderabbitai Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 260 files, which is 160 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration
📥 Commits

Reviewing files that changed from the base of the PR and between da4b141 and 3d52067.

⛔ Files ignored due to path filters: 49
  • plans/47-roadmaps-capability-maps-and-slices.md is excluded by !plans/**
  • test/consumers.design-slice.chain.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.design-slice.component-absent.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.design-slice.component-differing.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.design-slice.component-matching.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.design-slice.component-unreadable.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.design-slice.component-unrelated.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.design-slice.decision-backlink.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.design-slice.dependency-cycle.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.design-slice.folded-example.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.design-slice.independent-example.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.design-slice.outside-components.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.design-slice.outside-holding.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.design-slice.outside-satisfied.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.design-slice.outside-unbound.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.roadmap.blocking-part.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.roadmap.buildable-part.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.roadmap.built-work.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.roadmap.design-part.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.roadmap.drifting-part.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.roadmap.missing-evidence.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.roadmap.outside-parent.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.roadmap.statement-order.test.generated.ts is excluded by !**/*.generated.*
  • test/consumers.roadmap.statement-part.test.generated.ts is excluded by !**/*.generated.*
  • test/fixtures/checkout-v1/expected-census/index.md is excluded by !test/fixtures/*/**
  • test/fixtures/checkout-v1/expected-design-review/index.md is excluded by !test/fixtures/*/**
  • test/fixtures/checkout-v1/expected-design-review/pack/checkout-roadmap.md is excluded by !test/fixtures/*/**
  • test/fixtures/checkout-v1/expected-design-review/spec/orders.order-model.md is excluded by !test/fixtures/*/**
  • test/fixtures/checkout-v1/expected-design-review/spec/orders.order-placement-flow.md is excluded by !test/fixtures/*/**
  • test/fixtures/checkout-v1/expected-graph.json is excluded by !test/fixtures/*/**
  • test/fixtures/checkout-v1/expected-mermaid/index.md is excluded by !test/fixtures/*/**
  • test/fixtures/checkout-v1/expected-mermaid/pack/checkout-roadmap.md is excluded by !test/fixtures/*/**
  • test/fixtures/checkout-v1/expected-mermaid/spec/orders.order-model.md is excluded by !test/fixtures/*/**
  • test/fixtures/checkout-v1/expected-mermaid/spec/orders.order-placement-flow.md is excluded by !test/fixtures/*/**
  • test/fixtures/extract/annotation-forms/expected-graph.json is excluded by !test/fixtures/*/**
  • test/fixtures/studio/platform-architecture.json is excluded by !test/fixtures/*/**
  • test/fixtures/studio/platform-traces.json is excluded by !test/fixtures/*/**
  • test/self-hosting-oracle/anchors.ts is excluded by !test/self-hosting-oracle/**
  • test/self-hosting-oracle/carrier.ts is excluded by !test/self-hosting-oracle/**
  • test/self-hosting-oracle/consumers.ts is excluded by !test/self-hosting-oracle/**
  • test/self-hosting-oracle/decisions.ts is excluded by !test/self-hosting-oracle/**
  • test/self-hosting-oracle/declared-relations.ts is excluded by !test/self-hosting-oracle/**
  • test/self-hosting-oracle/extraction.ts is excluded by !test/self-hosting-oracle/**
  • test/self-hosting-oracle/index.ts is excluded by !test/self-hosting-oracle/**
  • test/self-hosting-oracle/model.ts is excluded by !test/self-hosting-oracle/**
  • test/self-hosting-oracle/pack-members.ts is excluded by !test/self-hosting-oracle/**
  • test/self-hosting-oracle/protocol.ts is excluded by !test/self-hosting-oracle/**
  • test/self-hosting-oracle/structural-edges.ts is excluded by !test/self-hosting-oracle/**
  • test/self-hosting-oracle/validation.ts is excluded by !test/self-hosting-oracle/**
📒 Files selected for processing: 260
  • .agents/skills/sdp-agent-surface/SKILL.md
  • .agents/skills/sdp-authoring/SKILL.md
  • .agents/skills/sdp-sessions/SKILL.md
  • .agents/skills/sdp-studio/SKILL.md
  • AGENTS.md
  • CONTEXT.md
  • check-self-hosting-gates.mjs
  • contract-dependent-suites.mjs
  • docs/agent-surface/recipes.md
  • docs/agent-surface/upgrade-guide.md
  • docs/concept/DECISIONS.md
  • examples/checkout-v1/README.md
  • examples/checkout-v1/specs/roadmap.pack.sdp.md
  • specs/carrier/markdown-authoring.sdp.md
  • specs/carrier/markdown-pack-authoring.sdp.md
  • specs/consumers/agent-surface.answer-shapes.sdp.md
  • specs/consumers/agent-surface.sdp.md
  • specs/consumers/authoring-on-ramp.sdp.md
  • specs/consumers/capability-map.sdp.md
  • specs/consumers/delivery-session-on-ramp.sdp.md
  • specs/consumers/design-diff.sdp.md
  • specs/consumers/design-slice.chain.sdp.md
  • specs/consumers/design-slice.component-absent.sdp.md
  • specs/consumers/design-slice.component-differing.sdp.md
  • specs/consumers/design-slice.component-matching.sdp.md
  • specs/consumers/design-slice.component-unreadable.sdp.md
  • specs/consumers/design-slice.component-unrelated.sdp.md
  • specs/consumers/design-slice.decision-backlink.sdp.md
  • specs/consumers/design-slice.dependency-cycle.sdp.md
  • specs/consumers/design-slice.folded-example.sdp.md
  • specs/consumers/design-slice.independent-example.sdp.md
  • specs/consumers/design-slice.outside-components.sdp.md
  • specs/consumers/design-slice.outside-holding.sdp.md
  • specs/consumers/design-slice.outside-satisfied.sdp.md
  • specs/consumers/design-slice.outside-unbound.sdp.md
  • specs/consumers/design-slice.sdp.md
  • specs/consumers/engine-provenance.sdp.md
  • specs/consumers/graph-first-planning.sdp.md
  • specs/consumers/obsidian-vault.notes.sdp.md
  • specs/consumers/projections-model.roadmap-views.sdp.md
  • specs/consumers/projections-model.sdp.md
  • specs/consumers/review-perspectives.sdp.md
  • specs/consumers/roadmap.blocking-part.sdp.md
  • specs/consumers/roadmap.buildable-part.sdp.md
  • specs/consumers/roadmap.built-work.sdp.md
  • specs/consumers/roadmap.design-part.sdp.md
  • specs/consumers/roadmap.drifting-part.sdp.md
  • specs/consumers/roadmap.memo.sdp.md
  • specs/consumers/roadmap.missing-evidence.sdp.md
  • specs/consumers/roadmap.outside-parent.sdp.md
  • specs/consumers/roadmap.sdp.md
  • specs/consumers/roadmap.statement-order.sdp.md
  • specs/consumers/roadmap.statement-part.sdp.md
  • specs/consumers/spec-studio.capability-map-page.sdp.md
  • specs/consumers/spec-studio.cited-line-text.sdp.md
  • specs/consumers/spec-studio.components.sdp.md
  • specs/consumers/spec-studio.data.recipe-answers.sdp.md
  • specs/consumers/spec-studio.data.sdp.md
  • specs/consumers/spec-studio.diagram-kinds.capability-tree.sdp.md
  • specs/consumers/spec-studio.diagram-kinds.dependency.sdp.md
  • specs/consumers/spec-studio.diagram-kinds.edge-routing.sdp.md
  • specs/consumers/spec-studio.diagram-kinds.legibility.sdp.md
  • specs/consumers/spec-studio.diagram-kinds.maturity-picture.sdp.md
  • specs/consumers/spec-studio.diagram-kinds.mermaid-source.sdp.md
  • specs/consumers/spec-studio.diagram-kinds.requirement-trace.sdp.md
  • specs/consumers/spec-studio.diagram-kinds.scoped-architecture.sdp.md
  • specs/consumers/spec-studio.diagram-kinds.sdp.md
  • specs/consumers/spec-studio.diagrams.sdp.md
  • specs/consumers/spec-studio.diff-page.sdp.md
  • specs/consumers/spec-studio.export.sdp.md
  • specs/consumers/spec-studio.index-page.sdp.md
  • specs/consumers/spec-studio.lenses.architecture.sdp.md
  • specs/consumers/spec-studio.lenses.architecture.unit-register.sdp.md
  • specs/consumers/spec-studio.lenses.packs.sdp.md
  • specs/consumers/spec-studio.lenses.sdp.md
  • specs/consumers/spec-studio.navigation.sdp.md
  • specs/consumers/spec-studio.pack-page.maturity-map.sdp.md
  • specs/consumers/spec-studio.pack-page.sdp.md
  • specs/consumers/spec-studio.pack.sdp.md
  • specs/consumers/spec-studio.page-elements.sdp.md
  • specs/consumers/spec-studio.publisher.sdp.md
  • specs/consumers/spec-studio.register-input.sdp.md
  • specs/consumers/spec-studio.roadmap-page.sdp.md
  • specs/consumers/spec-studio.sdp.md
  • specs/consumers/spec-studio.slice-page.sdp.md
  • specs/consumers/spec-studio.spec-page.sdp.md
  • specs/consumers/upgrade-kit.sdp.md
  • specs/decisions/architectural-annotation.sdp.md
  • specs/decisions/epics-of-any-kind.sdp.md
  • specs/decisions/roadmap-over-plans.sdp.md
  • specs/decisions/roadmap-priority.sdp.md
  • specs/extraction/build-pipeline.sdp.md
  • specs/extraction/derive-graph.sdp.md
  • specs/extraction/determinism.sdp.md
  • specs/extraction/example-runner.sdp.md
  • specs/extraction/executable-contracts.sdp.md
  • specs/extraction/executable-examples.sdp.md
  • specs/extraction/pack-member-order.sdp.md
  • specs/extraction/schema-versioning.declared-version.sdp.md
  • specs/model/core-model.sdp.md
  • specs/model/pack-aggregate.sdp.md
  • specs/model/planned-architecture.sdp.md
  • specs/model/structural-patterns.sdp.md
  • specs/observation/run-evidence.sdp.md
  • specs/observation/runtime-overlay.sdp.md
  • specs/protocol/capability-epics.sdp.md
  • specs/protocol/delivery-record-cleanup.sdp.md
  • specs/protocol/roadmap-replaces-plans.sdp.md
  • specs/protocol/role-vocabulary.sdp.md
  • specs/protocol/significant-units-review.sdp.md
  • specs/protocol/structural-self-binding.sdp.md
  • specs/roadmap.pack.sdp.md
  • specs/roadmaps-and-slices.pack.sdp.md
  • specs/self-hosting.pack.sdp.md
  • specs/validation/architecture-constraints.sdp.md
  • specs/validation/corpus-rules.sdp.md
  • specs/validation/duplicate-ids.sdp.md
  • specs/validation/external-registers.sdp.md
  • specs/validation/readiness-floor.sdp.md
  • specs/validation/two-check-families.sdp.md
  • src/adapters/vitest.ts
  • src/cli/build-args.ts
  • src/cli/build-command.ts
  • src/cli/corpus-rules.ts
  • src/cli/help.ts
  • src/cli/import-publish.ts
  • src/cli/import-scan.ts
  • src/cli/output.ts
  • src/cli/params.ts
  • src/cli/sdp.ts
  • src/cli/studio-inputs.ts
  • src/cli/validate-view-command.ts
  • src/codegen/contracts.ts
  • src/extract/derive.ts
  • src/extract/gherkin-kind-honesty.ts
  • src/extract/gherkin.ts
  • src/extract/index.ts
  • src/extract/markdown-body-content.ts
  • src/extract/markdown-body.ts
  • src/extract/markdown-frontmatter.ts
  • src/extract/markdown-yaml-policy.ts
  • src/extract/markdown.ts
  • src/extract/reify.ts
  • src/extract/serialize.ts
  • src/graph/delivery-facts.ts
  • src/graph/entry-address.ts
  • src/graph/schema.ts
  • src/import/import.ts
  • src/import/markdown-fidelity.ts
  • src/model/anchors.ts
  • src/model/pack.ts
  • src/notation/example-space.ts
  • src/notation/slots.ts
  • src/projections/design-review-context.ts
  • src/projections/design-review-markdown.ts
  • src/projections/design-review-pack-sections.ts
  • src/projections/design-review-pages.ts
  • src/projections/design-review.ts
  • src/projections/gherkin-view.ts
  • src/projections/studio/data.ts
  • src/projections/studio/diagrams/architecture.ts
  • src/projections/studio/diagrams/bands.ts
  • src/projections/studio/diagrams/capability.ts
  • src/projections/studio/diagrams/index.ts
  • src/projections/studio/diagrams/layout.ts
  • src/projections/studio/diagrams/mermaid.ts
  • src/projections/studio/diagrams/model.ts
  • src/projections/studio/diagrams/requirement.ts
  • src/projections/studio/diagrams/routing.ts
  • src/projections/studio/diagrams/slice.ts
  • src/projections/studio/diagrams/svg.ts
  • src/projections/studio/inputs.ts
  • src/projections/studio/pages/architecture-page.ts
  • src/projections/studio/pages/architecture-register.ts
  • src/projections/studio/pages/capabilities-page.ts
  • src/projections/studio/pages/code-spans.ts
  • src/projections/studio/pages/diff-page.ts
  • src/projections/studio/pages/export-page.ts
  • src/projections/studio/pages/frame.ts
  • src/projections/studio/pages/glossary-page.ts
  • src/projections/studio/pages/html.ts
  • src/projections/studio/pages/index-page.ts
  • src/projections/studio/pages/index.ts
  • src/projections/studio/pages/maturity-map.ts
  • src/projections/studio/pages/pack-page.ts
  • src/projections/studio/pages/queue-page.ts
  • src/projections/studio/pages/register-answers.ts
  • src/projections/studio/pages/registers-page.ts
  • src/projections/studio/pages/requirement-view.ts
  • src/projections/studio/pages/roadmap-page.ts
  • src/projections/studio/pages/search-page.ts
  • src/projections/studio/pages/slice-page.ts
  • src/projections/studio/pages/spec-page.ts
  • src/projections/studio/pages/spec-structure.ts
  • src/projections/studio/pages/text.ts
  • src/projections/studio/paths.ts
  • src/projections/studio/recipes.ts
  • src/projections/studio/slice-answer.ts
  • src/projections/studio/studio.css
  • src/projections/vault/notes.ts
  • src/reader/concept-match.ts
  • src/reader/evaluate-body.ts
  • src/reader/reader.ts
  • src/runner/index.ts
  • src/studio-elements/compose.ts
  • src/studio-elements/copy.ts
  • src/studio-elements/diagram.ts
  • src/studio-elements/expander.ts
  • src/studio-elements/filter.ts
  • src/studio-elements/index.ts
  • src/studio-elements/intent-panel-element.ts
  • src/studio-elements/proposal.ts
  • src/studio-elements/scenario-editor.ts
  • src/studio-elements/search-results.ts
  • src/studio-elements/search.ts
  • src/studio-elements/stamp.ts
  • src/studio-elements/views.ts
  • src/testing/index.ts
  • src/validate/graph-index.ts
  • src/validate/readiness-floor.ts
  • src/validate/validators.ts
  • test/builders.typecheck.ts
  • test/check-self-hosting-gates.test.ts
  • test/checkout-v1.test.ts
  • test/cli.test.ts
  • test/graph-schema.test.ts
  • test/helpers/design-slice-probe.ts
  • test/helpers/roadmap-probe.ts
  • test/helpers/structural-coverage.ts
  • test/helpers/studio-dom.ts
  • test/helpers/validator-audit.ts
  • test/helpers/validator-probes.ts
  • test/iteration-recipes.test.ts
  • test/reach-examples.test.ts
  • test/reader.test.ts
  • test/recipes.test.ts
  • test/roadmap-examples.test.ts
  • test/roadmap-priority.test.ts
  • test/roadmap.test.ts
  • test/self-hosting-design-slice.test.ts
  • test/self-hosting-graph.test.ts
  • test/skills.test.ts
  • test/structural-coverage.test.ts
  • test/studio-capabilities.test.ts
  • test/studio-data.test.ts
  • test/studio-diagram-catalog.test.ts
  • test/studio-diagram-core.test.ts
  • test/studio-elements.test.ts
  • test/studio-pages.test.ts
  • test/studio-panels.test.ts
  • test/studio-publisher.test.ts
  • test/studio-roadmap.test.ts
  • test/studio-s1.test.ts
  • test/studio-s2.test.ts
  • test/studio-s3.test.ts
  • test/studio-s5.test.ts
  • test/studio-slice.test.ts
  • test/upgrade-kit.test.ts
  • test/vault.test.ts
  • test/x2b-studio.test.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

The owner ruled the design checkpoint and gave the build go:

- a roadmap states advisory priority as the member order of a Pack whose
  manifest says `order: priority` (MD-46);
- the roadmap replaces the plans, frozen at plan 47; no check refuses a
  new plan file, which would police the workflow (MD-47);
- epics of any kind keep their kind (MD-48), and the glossary row
  broadens;
- the annotation review's change table is accepted, the decoder moving
  to the reader component only if it adds no layer crossing;
- "need" names what a roadmap entry needs next; "roadmap" and "need"
  join the glossary; "design slice" is a guidance-only label.

On the same delegation the arc's 22 Specs whose floor allowed it state
ready; each reports an honest verifier gap until its build binds one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@darko-mijic

Copy link
Copy Markdown
Contributor Author

Advisory review: Opus 5.5 (extra-high effort), opinion

One of two independent advisors on plan 47's decision items; the other advisor's review is in its own comment. The executing thread rules after reading both. Read at 2dc5c44.

Plan 47: the Opus advisory on the owner's decision items

Read at 2dc5c44c. Summary:

  1. Agree: the priority home (1), epics of any kind (3), the nine epics (4), the accepted set with the decoder moved to the reader (5), the deferred release views (8) and Mermaid source with no decision (13).
  2. Item 2 needs changes. Drop the reviews/ record file and the plan-number ceiling, and keep one decision for plans and reviews. A proposal scopes Specs only, so findings on code and other files go as line comments. Evidence stays on the arc's branch, pinned, and is removed before merge.
  3. Not ready to build as designed: four ready shared Studio contracts (lenses, index filters, data and recipe answers, navigation) still describe four lenses and no recipes 52 to 55. Integrate them before any ready statement (added item 15).
  4. Roadmap entries leave out their own pages and the legibility and routing Specs, so an entry can read "built" while the part the owner asked to see is unbuilt. Five refines close the gap (added item 14).
  5. Use "need" rather than "lane". Add a uses matrix as a table, always fold the boundary band, and draw the maturity grid only when two cells hold members. The significance edit is drift repair plus an aligned MD-38 sentence, not a new decision.

Note for the executing thread: while I read, the working tree carried uncommitted edits to 26 files: ready statements, rows MD-46 to MD-48, the lane-to-need rename, the dropped ceiling and a changed CONTEXT.md. My verdicts read the commit. proposal.json passes recipe 38 at the commit with 47 changes, 0 moved and 0 unresolved; the change numbers below are recipe 38's index, counted from 0. Against the working tree it shows 19 changes moved, because of those edits, and 0 unresolved.

1. Where priority lives: agree, confidence 4

A Pack already keeps an authored member order and states no truth, so order: priority only names what that order means. It adds one optional field and no relation. spec:decisions.roadmap-priority keeps it safe: no check reads a roadmap's content, statements keep the statement queue's dependency order, and the design diff reports a change in what an order means separately from a reorder. The refused alternatives are refused for the right reasons. A reserved id reads meaning from a name. Priority outside the graph needs a new input on every surface. A precedes relation was already refused by MD-33. When the field ships, delete the framing sentence in specs/roadmap.pack.sdp.md that starts "Until the roadmap priority decision is ratified".
What would change my mind: a second ordering meaning (risk, value) asked for on the same field, which would turn order into a small vocabulary that needs its own ruling.

2. The SDP-native alternatives to plans and reviews: agree with changes, confidence 4 (evidence placement 3)

  • Record before the first push. Drop reviews/<pack>-record.md: the commits are the record, the first message naming the base, the Pack and the owner's instruction that opened the arc, recipes 29, 33, 1 and 20 giving what is outstanding, and a work-in-progress commit replacing "account for it in the plan".
  • Review findings. schemas/sdp-proposal-1.schema.json admits only Spec ids and entry addresses as scope, so findings on code, the handbook, skills or scripts must go as pull request line comments, a gap in the recommendation; an open finding becomes an open question, and the commit that applies a proposal carries its reason and base.
  • Evidence no preview carries. Commit it on the branch with its commands, pin the description's links to that commit and remove it before merge: main merges with merge commits and GitHub keeps refs/pull/<n>/head, so links keep working while the tree stops collecting assets (reviews/ holds 41 MB, mostly assets), and adopter measurements, being recipe answers at a pin, go in the description as a table with commands.
  • One decision or two. One, since plans and reviews share the principle (one home per truth: the graph, git, the pull request) and the consequences (the handbook, the description standard, the gate), and a reviews-only decision would fail "hard to reverse"; keep both ids and broaden the titles (proposal changes 0 to 16).
  • Ceiling check. Leave it out: the cleanup pull request removes plans/ next, so the constant would be dead within one pull request, and refusing a kind of file sits closer to policing workflow than to checking the record.

What would change my mind: a requirement that review discussion be readable without GitHub, which would need a committed memo home; or the cleanup pull request slipping by more than one arc, which would justify the ceiling.

3. Epics of any kind: agree, confidence 5

Kind and altitude are independent coordinates on the one primitive. Three of the hubs that already state capabilities are model or rule Specs (spec:model.core-model, spec:consumers.projections-model, spec:validation.two-check-families). A behavior wrapper over them would be a second owner of the same outcome. The decision passes the three-part test, if narrowly: once adopters state model epics, a narrowing forces wrappers everywhere. At the commit, the record still says "Proposed for the owner" and its blocking question holds spec:consumers.capability-map and spec:protocol.capability-epics below ready. Rewrite it as a ruling (proposal change 20). It earns a registry row.
What would change my mind: an adopter's map that cannot be read because model epics have no features under them.

4. The nine epic boundaries: agree, confidence 4

Re-measured: all 432 Specs reached. Projections has 185 descendants (the agent surface 47, the Studio 66, the vault 20). The Studio is a feature whose 63 story descendants make its altitude honest. Raising it to an epic would change a coordinate with no new outcome to state. The agent surface already refined projections on main; only its altitude changed. Corpus rules belong under the agent surface because their findings sit outside the two check families, so they cannot go under validation's epic.
What would change my mind: if projections' 19 direct children cannot be read at a glance on the capabilities page, state the Studio as a nested epic, the same pattern as the agent surface. That is a one-line edit.

5. The engine's accepted set: agree with one change, confidence 4 (decoder 3)

The change table keeps every realization claim, and the merge ledger names each target transfer. Putting the decoder in the reader keeps the component graph acyclic: it adds codegen to reader and reader to notation. The other acyclic home, codegen, would make the reader depend on a generator, which is worse. The decoder's imports are type-only (GraphSchema, Finding), and that counts under #rule.dependencyEvidence. The change: reviews/ is retiring, so the review's durable content has to land before the file goes. That means the per-component "Start here" guidance (in each component anchor's label or its comment prose) and each unit's responsibility (in its label), applied in wave 1. The decoder's reason goes in the Spec's narrative (proposal change 24). Without this, the cleanup pull request deletes the curated map the owner asked for, since the panel reads only anchors (#rule.recordedOnly).
What would change my mind: the architecture crossings recipe (32) showing that reader membership adds a crossing the review missed.

6. The significance criterion: drift repair, with MD-38's sentence aligned; confidence 4

If "exported public surface" were sufficient, every export would need an anchor. That is the coverage quota MD-38 refuses ("Anchors are curated, never a coverage quota"), and the model term already said "that warrants". The sharpening narrows nothing MD-38 decided, so it needs no refining decision and no registry row. It fails "hard to reverse" in any case. Still, MD-38's consequence, "The engine significance criterion stays exported public surface or cross-component reach", would then contradict the term it governs. Align that sentence in this arc under delegation, list it among the delegated rulings, and edit the term, #rule.criterion and CONTEXT.md in the same commit (proposal changes 21 to 23).
What would change my mind: evidence that MD-38 meant export as sufficient, for example an adopter anchoring every export because the decision told it to.

7. Words: agree with changes, confidence 4

  • "roadmap" joins the glossary (row below).
  • "need" over "lane". "Lane" already means a pull request's work streams, plan 47's design lanes and edge routing's channels (spec:consumers.spec-studio.diagram-kinds.edge-routing). The memo is pasted into the very description that has "lanes". Rename the rule key #needs too, so the key does not read as the new word.
  • "to state" fits the house verb ("stated readiness", "statement queue"). Keep it.
  • "design slice" becomes a guidance-only label, which answers spec:consumers.design-slice#question.sliceTerm.

What would change my mind: an outside reader test where "to state" reads as a state machine. In that case use "to state ready" as the board heading only.

8. Release and baseline views stay deferred: agree, confidence 4

The package installs from a commit and has no published release. The trigger is concrete, and git tags with the roadmap serve until then.
What would change my mind: a release cut during this build.

9. ready statements at the build go: agree with changes, confidence 4

Delegated ready statements have precedent in plans 43 and 45. At the commit, these are not ready to build as designed:

  • (a) The shared contracts the new pages extend are ready and contradict them. spec:consumers.spec-studio.lenses#rule.order names four lenses, index-page#rule.filters has no epic filter, data.recipe-answers names no recipe from 52 to 55, and navigation#rule.topEntries has no Roadmap. Lane E's integration text was never applied. See added item 15 and proposal changes 31 to 40.
  • (b) spec:decisions.roadmap-over-plans and spec:protocol.roadmap-replaces-plans need item 2's rewrite.
  • (c) spec:decisions.epics-of-any-kind is still proposal text.
  • (d) The roadmap trio needs the rename before ready, because their keys are cited.
  • (e) spec:consumers.graph-first-planning's plan-file rule must narrow, as roadmap-over-plans says it will. No edit carries that yet (proposal change 16).
  • (f) spec:consumers.projections-model.roadmap-views stays scoped.

Registry rows go to the three decisions and not to the MD-38 alignment. The gate's order: priority check can turn on only after the field ships.
What would change my mind: a build-time discovery in edge routing ("the search is the build's") large enough to change its contract. If so, state that Spec ready after its prototype passes on both corpora.

10. The roadmap's shape: agree with changes, confidence 3

One owner-selected Pack with derived needs is right. Measured with the drafted recipe 53: 9 entries, 3 to design, 5 to state, 1 to build. But 6 of the 9 are this pull request's own work, which it removes at close, so the merged example will show 3 entries. Before close, ask the owner to select the next arc's entries, for example from the platform's mass-update asks, so the merged roadmap shows four to six real upcoming bodies of work. Fix the entry scopes as well (item 14).
What would change my mind: the owner preferring a short roadmap at merge to stand as the honest state.

11. Dense drawings: agree with a uses matrix as a table; maturity picture only when divergent; confidence 3

Fourteen components with about 40 uses route as parallel bundles. A 14 × 14 table ordered by layer stays legible at any density, needs no layout, fold or bound, and reads only anchored uses. Make it a table on the architecture lens rather than a Mermaid kind (proposal changes 41 to 44). Most of the arc's dependency-drawing crossings run to unfolded "Outside this scope" boxes the slice page already lists, so always fold the boundary band, keeping as boxes only the outside Specs that hold a member (change 45). The maturity grid spends 20 cells to say "63 ready, ready" on a settled Pack. Draw it only when two or more cells hold members, and write one sentence otherwise (change 46).
What would change my mind: an owner reading in which the grid's empty diagonal is itself the message.

12. Studio growth: agree, confidence 4

A separate slice page keeps the Pack page in the author's order and gives the slice its own order, members others rest on first. Capabilities after Packs is right. No Spec places Roadmap in the top navigation, so put it first after the lenses, ahead of Queue (change 40). The top navigation now reaches about 14 entries. If it wraps past two lines at 1440, group Questions, Decisions, Declarations and Backlog under one Registers entry.
What would change my mind: phone-width screenshots showing the navigation hiding the page title.

13. Mermaid source without a decision: agree, confidence 4

MD-44 refuses Mermaid rendered in the page, a runtime. A read-only text area renders nothing. MD-32 freezes the sdp mermaid root, which this does not touch.
What would change my mind: source written as files into a published root, or a page loading Mermaid to preview it.

Added items

14. Roadmap entries miss the work the owner sees: confidence 3

An entry's scope is its refinement subtree. The capability map, design slice and roadmap pages refine the Studio, and legibility and edge routing refine the diagram contract, so none of them falls under its roadmap entry. When recipes 52 to 54 ship, entries 1 to 4 read "built" while the pages, labels and routing the owner asked for are still unbuilt. Each refinement is genuine: a page is its reading's outcome for a person, and "keep their labels readable" is in diagram-kinds' outcome. A Spec both refining and depending on the same target already happens in the corpus (spec:validation.corpus-rules to spec:consumers.agent-surface). Proposal changes 26 to 30.

15. Integrate the shared Studio contracts before any ready: confidence 5

This is measured at the commit, as item 9 (a) describes. Apply lane E's integration text (reviews/plan47-epics-integration-proposals.md), adding the slice and roadmap pages and recipes 53 to 55 to data.recipe-answers and Roadmap to the navigation. Proposal changes 31 to 40 give the exact text.

16. The canonical examples the owner asked for: confidence 4

The Protocol's own pack:roadmap is one example, inside a 432-Spec corpus. Add a small one an adopter can copy: examples/checkout-v1/specs/roadmap.pack.sdp.md with order: priority and two or three entries chosen so recipe 53 shows at least two needs, with recipe 53's and 55's answers pinned in test/recipes.test.ts. Add a section to the upgrade guide too (text below). libar-platform keeps design/PLAN.md, ROADMAP.md, STATE.md, SESSIONS.md and finding ledgers marked fixed or open. It is the adopter that needs the path.

Exact text for files that are not Specs

AGENTS.md. Replace the status blockquote stack, from "> plan 46 is EXECUTED" through "read the latest ✅ EXECUTED/RUN plan for settled ground.", with:

> **Next work** is read from the graph: run the roadmap, recipe 53, over `pack:roadmap`
> (`pnpm --silent sdp:q "$(cat dist/recipes/53-the-roadmap.js)" --params '{"pack":"pack:roadmap"}'`),
> follow each entry to its Packs and carrying Specs, and read the open arc's draft pull request for
> its record. `plans/` and `reviews/` are frozen history of earlier arcs, kept until a cleanup arc
> removes them; nothing is added to either. Corpus counts, readiness, and findings are **derived,
> never quoted** — re-run
> `pnpm --silent sdp validate . --exclude explorations --exclude examples --exclude test/fixtures/import/parity`
> and read recipes 8 and 11. Recipe 1 is the operational backlog, not the census. Never invoke a bare `sdp`.

In "Where to look", replace the plans/ row and the reviews/ row with:

| `pack:roadmap` + recipe 53 | **the next work** — the owner's advisory priority over upcoming capabilities, each entry placed by the graph as to design, to state, to build or built; the open arc's record is its draft pull request | before writing code |
| `plans/`, `reviews/` | **frozen history** of earlier arcs: plans, session reviews, prompts and assets; read for provenance; nothing is added | rarely |

In "The build path", replace "Live work is the highest primary-numbered plan under plans/ — read it before writing code." with "Live work is read from the roadmap, recipe 53 over pack:roadmap — run it before writing code."

In "Working discipline", replace these bullets:

- **Design vs execution.** Distinguish design work (Specs, decisions, open questions) from execution (code, tests, docs). A design session edits carriers and leaves the code its Specs will change alone.
- **Tests are the evidence.** A change proves itself with a test that fails without it, and the corpus's state with a recipe anyone can re-run. Keep a separate evidence artifact only for what no test, recipe or preview can carry, such as a prototype of a view not yet built or a screenshot: commit it on the arc's branch with the commands that made it, link it from the pull request description pinned to that commit, and remove it before the merge.
- **Commits are recovery boundaries, not workflow gates.** The owner's instruction that opens an arc authorizes commits on its branch; record it in the arc's first commit message with the base and the arc's Pack, and repeat it in the draft description after the first push. Otherwise ask before committing. Prefer a commit after a coherent logical unit and its relevant quality gate, but never force one per todo, create empty commits, absorb unrelated or pre-existing changes, or commit from an unsafe dirty baseline. A session that must stop with no clean boundary commits its work in progress with a message saying what is incomplete. Push only on the user's explicit request; never use `git stash`.
- **Reviews travel as proposals.** A review's findings against Specs are one change proposal (`schemas/sdp-proposal-1.schema.json`), checked by recipe 38 against the base it names and posted to the pull request as recipe 49's memo; findings against code or other files are review comments on their lines; a finding left open becomes an open question with `decider`, `provisional` and `links`. The commit that applies a proposal carries its reason line and base. No review file is committed; briefs and prompts stay in the session.

In "PR descriptions as durable context", replace "commit them under reviews/assets/pr<n>/ with a short README naming the commit and the commands." with "commit them on the arc's branch under evidence/ with a short README naming the commands, pin the description's links to that commit, and remove the folder before the merge." Replace the "Plan the next PR" bullet with:

- **Plan the next PR.** Every description keeps a forward section: recipe 55's memo over `pack:roadmap`, rendered at the head, with the re-entry condition and the durable refused list in your words around it. The pull request that completes an entry's selected work removes it from the roadmap in the same change; entries join or move only on the owner's word.

In "Audit, then publish", replace "Check the description against the plan," with "Check the description against the arc's Pack,".

CONTEXT.md. Replace the capability row and add two rows:

| **capability / domain** | a **`Pack` grouping** and/or the Capability Map projection over epic Specs of every kind and their declared `refines` descendants; Pack membership and refinement stay distinct (`spec:consumers.capability-map`, `spec:decisions.epics-of-any-kind`) | a kind or an altitude |
| **roadmap** | a `Pack` whose manifest states `order: priority`: its member order is the corpus's advisory priority over the next bodies of work, and each entry's need is read from the graph each time; it dates, gates and sequences nothing (`spec:decisions.roadmap-priority`, `spec:consumers.roadmap`) | "plan" · "schedule" · "backlog" (recipe 1's answer) |
| **need** (of a roadmap entry) | the derived step of a roadmap entry or one of its Specs: **to design** (its floor does not reach `ready`), **to state** (the floor reaches `ready` and only a person's statement stands before it), **to build** (states `ready`, not `implemented`) or **built**; never authored (`spec:consumers.roadmap`) | "lane" (a pull request's work streams) · "status" · "stage" |

Replace the definition in the "architecturally significant unit" row with lane A's text in reviews/plan47-annotation-review.md ("a code unit with exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand (being exported or ranking high on imports is not enough by itself), and that warrants …"). In "Guidance-only labels", replace "design pass, design diff, design backlog and curation report" with "design pass, design diff, design backlog, design slice and curation report".

.agents/skills/sdp-authoring/SKILL.md. Replace the two bullets that open "Group a body of work in a Pack" and "A plan file points to the Pack" with:

- Group a body of work in a Pack named for its capability, never a number or a date; keep its Specs in reading order. Membership confers no readiness, delivery fact or gate; the Pack remains a review aggregate after the work ends.
- Hold advisory priority over the next work in a roadmap, a Pack whose manifest states `order: priority`, and read it with recipe 53; its order confers nothing. Keep an arc's execution record in git and its pull request description. A corpus that keeps plan documents of its own lets them point to Packs and carrying Specs; they confer nothing.

.agents/skills/sdp-sessions/SKILL.md. Replace "Follow sdp-authoring for capability-based Pack names and plan pointers." with "Follow sdp-authoring for capability-based Pack names, and read the next work from the roadmap (recipe 53)."

check-self-hosting-gates.mjs. Replace check 4 with the handbook tokens pack:roadmap and recipe 53, plus the manifest line order: priority once the field ships. Keep the plan-16, -17 and -18 historical checks until the cleanup arc. Add no ceiling.

docs/agent-surface/upgrade-guide.md. Insert a section after "Organize features in epics":

## Move planning and review records into the graph

Author your next bodies of work as Specs and group each in a Pack named for its capability. Make one Pack your roadmap by stating `order: priority` in its manifest and listing the next few entries, first entry first; recipe 53 places each by what it needs, and recipe 55 renders the forward section of a pull request description. Turn each open review finding about a Spec into an open question with `decider`, `provisional` and `links`, or into a change proposal checked by recipe 38; a status such as fixed or open is git history and the graph, never a field. Keep your plan and state documents if you want them; they confer nothing, so point them at Packs and recipes instead of copying counts.

@darko-mijic

Copy link
Copy Markdown
Contributor Author

Advisory review: Opus 5.5, change proposal

The advisor's Spec edits as one change proposal (sdp-proposal/1), rendered by recipe 49, the proposal memo. Recipe 38, the proposal check, against the graph sdp build writes at the base 2dc5c44: no schema problems, 47 changes, every scope resolves at head; 19 changes read as moved because the owner's rulings were committed since the base, so each is reconciled by hand before it is applied. The exact JSON closes the memo.

Change proposal

Base: 2dc5c44cb4d6a162be6d8fb49c33451f5601a898
Reason: Opus advisory on plan 47: retire plans and reviews into git and the pull request, rename the roadmap's step, close the integration gaps before ready

Change 1

Scope: spec:decisions.roadmap-over-plans
Request:

Replace the H1 title with this text, and extend the opening paragraph so it names committed review reports and their assets beside the plan file.

Reason: The owner retired reviews/ as well as plans/; one decision carries both because the principle and the consequences are shared.

# Plan and review files stop carrying the delivery record once the roadmap and the pull request do

Change 2

Scope: spec:decisions.roadmap-over-plans
Request:

Replace the `decision:` entry of the Decision section with this text.

Reason: Drops the short-lived reviews/ record file, which the owner's retirement of reviews/ leaves without a home, and states the review alternative.

- decision: The Protocol reads its forward planning from its roadmap and keeps its delivery record in git and its pull requests; it adds no plan file and no review file, and `plans/` and `reviews/` stand as frozen history until a later arc removes or archives them. An agent opening the next work runs the roadmap recipe over the roadmap Pack the handbook names and follows each entry to its Packs and carrying Specs. Before an arc's first authorized push its commits are its record: the first commit message names the arc's base, its Pack and the owner's instruction that opened it, each later message says what its unit did, and outstanding work is read from the arc's Pack, the backlogs and the open-question register. At the first authorized push the draft pull request description takes the record: its story, lanes, rulings with who made them, acceptance as measured, deferrals and refusals. A review's findings against Specs travel as a change proposal, checked against the base it names and posted to the pull request as its memo; a finding against code or another file is a review comment on its line; a finding left open becomes an open question with its decider, provisional reading and links. Evidence no test, recipe or preview carries is committed on the arc's branch, linked from the description pinned to that commit, and removed before the merge, which keeps the commit reachable. Briefs and prompts stay in the session. The handbook names the roadmap Pack and the roadmap recipe where it named the current plan, and the self-hosting gate checks that instead of a current plan.

Change 3

Scope: spec:decisions.roadmap-over-plans
Request:

Replace the rationale entry that opens `Hard to reverse` with this text.

Reason: The trade-off now covers reviews and drops the record file.

- rationale: Hard to reverse: the handbook, the skills, the description standard and a gate point every session at the newest plan and at committed review files, and every session's first read changes. Surprising without context: a reader finds two folders that stopped. A real trade-off: one forward-planning carrier in the graph and one record per arc in git and its pull request, with nothing to keep in step, against review findings and pre-push state living in commit messages and pull request threads rather than in files a person can search in the tree.

Change 4

Scope: spec:decisions.roadmap-over-plans
Request:

Replace the alternative that opens `Keep each arc's whole execution record in a committed file under reviews/` with these three alternatives, one line each.

Reason: Records the refused record file, the refused review reports and the refused plan ceiling.

- alternative: Keep an arc's record in a file under `reviews/` until its first push, then only its link: the file repeats what the commits already say, outlives the arc as a stub, and keeps `reviews/` growing after its retirement.
- alternative: Keep review reports as committed files beside the change proposal: the proposal is the reviewable shape, an applied edit is git history and an open finding is an open question, so a report file repeats all three and goes stale with the next edit.
- alternative: A gate check that refuses a numbered plan above the last frozen one: the cleanup arc removes the folder, so the check guards a window of one pull request, and refusing a kind of file is closer to policing the workflow than to checking the record.

Change 5

Scope: spec:decisions.roadmap-over-plans
Request:

Replace the consequence that opens `The handbook drops its stack of plan statuses` with this text.

Reason: No plan-number ceiling; the historical checks end with the folders.

- consequence: The handbook drops its stack of plan statuses for a short pointer to the roadmap and its recipe. The self-hosting gate's current-record check refuses a handbook that does not name the roadmap Pack and recipe, and a roadmap Pack manifest that is missing or does not state priority order; its frozen historical checks, its green-gate legs and its ban on plan status in the registry and the glossary stay until the cleanup arc removes the folders they read.

Change 6

Scope: spec:decisions.roadmap-over-plans
Request:

Replace the consequence that opens `The commit strategy that authorizes commits` with this text.

Reason: Git is the event log before the first push.

- consequence: The owner's instruction that opens an arc authorizes commits on its branch, as a plan's commit strategy did; the arc's first commit message records it and the draft description repeats it after the first push. A session that must stop with no clean boundary commits its work in progress on the arc's branch with a message saying what is incomplete, rather than accounting for it in a file.

Change 7

Scope: spec:decisions.roadmap-over-plans
Request:

Replace the consequence that opens `The plan files stay as they are` with this text.

Reason: The owner scheduled the removal for a separate pull request.

- consequence: The plan and review files stay as they are until a dedicated cleanup arc removes or archives them; until then nothing is added to either, and a file in either changes only to correct the record it keeps.

Change 8

Scope: spec:protocol.roadmap-replaces-plans
Request:

Replace the H1 title with this text.

Reason: The behavior now covers reviews.

# The Protocol reads its next work from its roadmap and keeps its delivery record in git and its pull requests

Change 9

Scope: spec:protocol.roadmap-replaces-plans#rule.plansFrozen
Request:

Replace the rule with this text.

Replaces: spec:protocol.roadmap-replaces-plans#rule.plansFrozen
Reason: Both folders freeze.

- rule: [#plansFrozen] `plans/` and `reviews/` keep the plans and review records of the arcs that had them as history until a cleanup arc removes or archives them; no file is added to either, and a file in either changes only to correct the record it keeps.

Change 10

Scope: spec:protocol.roadmap-replaces-plans#rule.executionRecord
Request:

Replace the rule with this text.

Replaces: spec:protocol.roadmap-replaces-plans#rule.executionRecord
Reason: Git replaces the proposed reviews/ record file.

- rule: [#executionRecord] Before an arc's first authorized push its commits are its record: the first commit message names the arc's base, its Pack and the owner's instruction that opened it, each later message says what its unit did, and outstanding work is read from the arc's Pack, the backlogs and the open-question register. At the first authorized push the draft pull request description takes the record: its branch and base, working rules, lanes, the rulings with who made them, acceptance as measured, deferrals and refusals. Nothing here authorizes a push, and no check reads the record.

Change 11

Scope: spec:protocol.roadmap-replaces-plans#rule.executionRecord
Request:

Add this rule after the execution-record rule.

Follows: spec:protocol.roadmap-replaces-plans#rule.executionRecord
Reason: A proposal scopes Specs only, so code and file findings need their own home.

- rule: [#reviewFindings] A review's findings against Specs travel as one change proposal on the proposal schema, checked by the proposal check against the base it names and posted to the pull request as the proposal memo; a finding against code or another file is a review comment on its line; a finding left open becomes an open question with its `decider`, `provisional` reading and `links`; the commit that applies a proposal carries its reason line and base. No review file is committed, and a brief or prompt stays in the session that used it.

Change 12

Scope: spec:protocol.roadmap-replaces-plans#rule.executionRecord
Request:

Add this rule after the review-findings rule.

Follows: spec:protocol.roadmap-replaces-plans#rule.executionRecord
Reason: Answers where evidence lives once reviews/assets retires.

- rule: [#evidence] Evidence no test, recipe or preview carries, such as a prototype of a view not yet built, an adopter measurement's raw output or a screenshot for the description, is committed on the arc's branch with the commands that made it, linked from the description pinned to that commit, and removed before the merge; the merge keeps the commit reachable, so the link lasts.

Change 13

Scope: spec:protocol.roadmap-replaces-plans#rule.gateRecord
Request:

Replace the rule with this text.

Replaces: spec:protocol.roadmap-replaces-plans#rule.gateRecord
Reason: No plan-number ceiling.

- rule: [#gateRecord] The self-hosting gate's current-record check refuses a handbook that does not name the roadmap Pack or the roadmap recipe, and a roadmap Pack manifest that is missing or does not state `order: priority`; it keeps the frozen historical checks, the documented green-gate legs, and the ban on plan status in the decision registry and the glossary until the cleanup arc removes the folders they read.

Change 14

Scope: spec:protocol.roadmap-replaces-plans#design.recordFile
Request:

Remove this Design entry; no record file exists.

Reason: The record file is dropped.

Change 15

Scope: spec:protocol.roadmap-replaces-plans#design.frozenCeiling
Request:

Remove this Design entry; the gate keeps no plan-number ceiling.

Reason: The ceiling check is dropped.

Change 16

Scope: spec:protocol.roadmap-replaces-plans#design.gateMessages
Request:

Replace the Design entry with this text.

Replaces: spec:protocol.roadmap-replaces-plans#design.gateMessages
Reason: Drops the ceiling message.

- gateMessages: `AGENTS.md — the handbook does not name the roadmap Pack`, `AGENTS.md — the handbook does not name the roadmap recipe`, `specs/roadmap.pack.sdp.md — the roadmap Pack's manifest is missing`, and `specs/roadmap.pack.sdp.md — the roadmap Pack's manifest does not state order: priority`.

Change 17

Scope: spec:consumers.graph-first-planning
Request:

Replace the unkeyed rule that opens `A plan file points to the Pack and carrying Specs` with this text, as the roadmap-over-plans decision's consequence requires.

Reason: The decision says this rule narrows; no edit carries it yet.

- rule: A corpus that keeps plan documents lets each point to its Packs and carrying Specs for intended truth and derived state; a plan document confers nothing, and plan numbering, recorded work order and staleness never become graph structure or workflow authority. Advisory priority over the next work lives in a roadmap Pack.

Change 18

Scope: spec:consumers.roadmap
Request:

Rename the derived step from lane to need throughout the Spec: the answer fields `lane` become `need`, the Design key `laneValues` becomes `needValues`, the rule keys `specLane` and `entryLane` become `specNeed` and `entryNeed`, and the rule key `needs` becomes `entryDetail` so the key no longer reads as the new word; prose `lane` becomes `need`, keeping the values to design, to state, to build, built and settled.

Reason: A PR description's lanes, a design wave's lanes and edge routing's lanes already use the word; the memo is pasted into the description.

Change 19

Scope: spec:consumers.roadmap.memo
Request:

Rename lane to need in prose and in every field the memo reads from recipe 53, matching the roadmap Spec's rename.

Reason: Keeps the memo on the roadmap's word.

Change 20

Scope: spec:consumers.spec-studio.roadmap-page
Request:

Rename lane to need in prose and fields, and the rule keys `laneLists` and `laneFilter` to `needLists` and `needFilter`; the board's column headings stay To design, To state, To build and Built.

Reason: Keeps the page on the roadmap's word.

Change 21

Scope: spec:decisions.epics-of-any-kind
Request:

Remove the blocking question `epicKinds`, and replace the Decision section's entries with these, so the record states the ruling rather than a proposal.

Reason: The record still says Proposed for the owner and holds two Specs below ready.

- context: The glossary's capability row names a Capability Map over high-altitude behavior Specs, while kind and altitude are independent coordinates on the one primitive and the hubs that already state the Protocol's capabilities include model and rule Specs.
- decision: Any Spec stated at epic altitude is an epic and keeps its kind; the capability map reads every such Spec and its refinement descendants, and no view selects capabilities by kind.
- rationale: Hard to reverse: once corpora state model and rule epics, narrowing to behavior would force wrappers across every corpus. Surprising without context: the ratified glossary row named behavior Specs. A real trade-off: one outcome owner per capability against a map whose entries share one kind.
- alternative: Keep behavior-only capability epics and add behavior wrappers over the model and rule hubs: each wrapper restates an outcome another Spec owns, a second owner that drifts, only so a view can read it.
- consequence: The glossary's capability row names a Capability Map over epic Specs of every kind and their declared refinement descendants.
- consequence: A hub whose outcome already names a capability is enriched in place to epic altitude, keeping its id, kind and readiness.

Change 22

Scope: spec:model.structural-patterns
Request:

Replace the definition of the Model term `architecturally significant unit` with this text.

Reason: Makes the existing `warrants` clause concrete; drift repair, since exported-as-sufficient would make anchoring a coverage quota the decision refuses.

- **architecturally significant unit** — A code unit with exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand to change a system guarantee. Ports, shared data shapes, pipeline stages, decision tables, catalogs, layout policies and adapters may qualify; being exported, re-exporting other units or ranking high on imports is not enough by itself. Its anchor records component membership, a role and references to the designs it answers to. An architectural dependency is declared as `uses`, normally between components; a unit's own `uses` is optional.

Change 23

Scope: spec:protocol.structural-self-binding#rule.criterion
Request:

Replace the rule with this text.

Replaces: spec:protocol.structural-self-binding#rule.criterion
Reason: Aligns the ready rule with the model term.

- rule: [#criterion] The engine applies the structural-patterns model's significance criterion: exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand; being exported alone is not enough.

Change 24

Scope: spec:decisions.architectural-annotation
Request:

Replace the consequence that opens `The engine significance criterion stays exported public surface or cross-component reach` with this text, keeping the rest of the section unchanged; record it in the pull request's delegated-rulings table as an alignment of ratified wording.

Reason: Leaving the ratified text reading export as sufficient would contradict the model term it governs.

- consequence: The engine significance criterion requires exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand, as `spec:model.structural-patterns` defines it; being exported alone is not enough. Code never satisfies a decision Spec directly (the binding-grain ruling, MD-37), and an anchor is never pointed at an unfinished Spec to manufacture coverage.

Change 25

Scope: spec:protocol.significant-units-review
Request:

Remove the open questions `acceptedRoster` and `notationBoundary` once ruled, and add this sentence to the narrative after its first paragraph; the roster oracle carries the membership itself.

Reason: Keeps the why once, in the Spec, after the review file retires.

The example-space decoder belongs to the reader component although its file sits under `src/notation/`: it reads graph shapes and emits findings, and as a notation member it would tie notation, graph and validate into one uses cycle, while as a reader member notation stays a leaf codec.

Change 26

Scope: spec:consumers.design-slice
Request:

Remove the non-blocking question `sliceTerm` once the glossary lists design slice among its guidance-only labels.

Reason: The words ruling answers it.

Change 27

Scope: spec:consumers.spec-studio.capability-map-page
Request:

Declare `refines` on spec:consumers.capability-map with the reason `the page is the capability map's reading for a person`, keeping the existing refinement and dependency.

Relation: declare spec:consumers.spec-studio.capability-map-page refines spec:consumers.capability-map
Reason: Without it the roadmap entry reads built when recipe 52 ships and the page does not.

Change 28

Scope: spec:consumers.spec-studio.slice-page
Request:

Declare `refines` on spec:consumers.design-slice with the reason `the page is the design slice's reading for a person`, keeping the existing refinement and dependency.

Relation: declare spec:consumers.spec-studio.slice-page refines spec:consumers.design-slice
Reason: Puts the slice page in its roadmap entry's scope.

Change 29

Scope: spec:consumers.spec-studio.roadmap-page
Request:

Declare `refines` on spec:consumers.roadmap with the reason `the page is the roadmap's reading for a person`, keeping the existing refinement and dependency.

Relation: declare spec:consumers.spec-studio.roadmap-page refines spec:consumers.roadmap
Reason: Puts the roadmap page in its roadmap entry's scope.

Change 30

Scope: spec:consumers.spec-studio.diagram-kinds.legibility
Request:

Declare `refines` on spec:consumers.spec-studio.diagram-kinds with the reason `readable labels are part of the outcome the diagram kinds state`, keeping the refinement of the diagram contract.

Relation: declare spec:consumers.spec-studio.diagram-kinds.legibility refines spec:consumers.spec-studio.diagram-kinds
Reason: The owner's legibility ask is outside the diagram-kinds entry's scope today.

Change 31

Scope: spec:consumers.spec-studio.diagram-kinds.edge-routing
Request:

Declare `refines` on spec:consumers.spec-studio.diagram-kinds with the reason `arrows that cover no label serve the readable drawings the diagram kinds state`, keeping the refinement of the diagram contract.

Relation: declare spec:consumers.spec-studio.diagram-kinds.edge-routing refines spec:consumers.spec-studio.diagram-kinds
Reason: Same scope gap as legibility.

Change 32

Scope: spec:consumers.spec-studio.lenses
Request:

Replace the title, the narrative paragraph and the Intent outcome with these three lines, in that order.

Reason: The shared lens contract is ready and still says four lenses.

# Five lenses read the graph as Packs, capabilities, architecture, tests and evidence
Each lens is a page with a Spec of its own, so each builds on the graph it reads today: the Packs, capabilities, architecture and tests lenses read what the graph records, and the evidence lens reads not tracked until the graph records an observation. This Spec keeps what the five share.
- outcome: Let a person see the graph five ways, by Pack, by capability, by architecture, by verification and by evidence, from one top navigation.

Change 33

Scope: spec:consumers.spec-studio.lenses#rule.order
Request:

Replace the rule with this text.

Replaces: spec:consumers.spec-studio.lenses#rule.order
Reason: Integrates the Capabilities lens.

- rule: [#order] The lenses are pages of the page set, reached from the top navigation in the order Packs, capabilities, architecture, tests, evidence; the index page is the Packs lens and the default landing page.

Change 34

Scope: spec:consumers.spec-studio.lenses#ui.lensPages
Request:

Replace the UI entry with this text.

Replaces: spec:consumers.spec-studio.lenses#ui.lensPages
Reason: Integrates the Capabilities lens.

- lensPages: `index.html` for the Packs lens, `capabilities.html` for the capabilities lens, `architecture.html`, `tests.html` and `evidence.html`, each opening with its name and one sentence saying what it reads.

Change 35

Scope: spec:consumers.spec-studio.lenses.packs
Request:

Replace the narrative paragraph before Intent with this text.

Reason: The narrative says no view draws capabilities.

Packs collect Specs for review, while the separate Capabilities page reads authored refinement. The index remains the landing page and keeps each Pack's members in authored order.

Change 36

Scope: spec:consumers.spec-studio.lenses.packs#rule.packGrouping
Request:

Replace the rule with this text.

Replaces: spec:consumers.spec-studio.lenses.packs#rule.packGrouping
Reason: The glossary cites this rule for draws no capability tree.

- rule: [#packGrouping] The Packs lens groups Specs by Pack, each Pack's members in authored order. The separate Capabilities page reads refinement; selecting an epic narrows the index's Specs section without changing any Pack.

Change 37

Scope: spec:consumers.spec-studio.index-page#rule.filters
Request:

Replace the rule with this text.

Replaces: spec:consumers.spec-studio.index-page#rule.filters
Reason: Integrates the epic filter.

- rule: [#filters] Filters narrow the Specs section by kind, altitude, stated rung, floor reached, implementation binding, verifier binding, Pack and epic; each filter takes one value or any, the epic filter also takes no epic, the filters combine, and the section says how many of its rows it shows. Without script every row shows.

Change 38

Scope: spec:consumers.spec-studio.data#rule.readerValues
Request:

Replace the Contract entry with this text.

Replaces: spec:consumers.spec-studio.data#rule.readerValues
Reason: Integrates recipe 52 into the index.

- [#readerValues] The build renders the index from `specs()`, `packs()`, `findings()`, each Spec's design columns and the epic memberships recipe 52 answers, a Pack page from `packContext` and the Pack totals, a Spec page from `specContext`, and the search page from the search index; every page's rail renders the rail values. A page states no value the reader did not return or a named recipe did not answer, apart from counts the build takes of those values.

Change 39

Scope: spec:consumers.spec-studio.data.recipe-answers#design.recipeEvaluations
Request:

Replace the Design entry with this text.

Replaces: spec:consumers.spec-studio.data.recipe-answers#design.recipeEvaluations
Reason: The new pages read recipes 52 to 55, which the ready data contract does not name.

- recipeEvaluations: a build evaluates each of these once, with no parameter unless one is named: recipes 17, 20, 24, 31, 33, 43, 44, 46, 51 and 53; recipe 52 with `{ detail: true }`; recipe 29 with `{ pack: id }` and recipe 54 with `{ pack: id, detail: true }` for every Pack; recipe 55 with `{ pack: id }` for every Pack whose manifest states `order: priority`; recipe 21 with `{ spec: id }` and recipe 30 with `{ specs: [id] }` for every Spec; recipe 34 with `{ spec: id }` for every Spec that is not an example, Specs in no Pack included; given a base graph, recipe 35 with `{ base, detail: true }`, and with `{ base, pack: id, detail: true }` for every Pack; given run records, recipe 45 with `{ runs }`.

Change 40

Scope: spec:consumers.spec-studio.data.recipe-answers#design.pageRecipes
Request:

Replace the Design entry with this text.

Replaces: spec:consumers.spec-studio.data.recipe-answers#design.pageRecipes
Reason: Names which page reads which new recipe.

- pageRecipes: the index renders reader values and each Spec's `epicIds` from recipe 52; the glossary renders reader values only; the capabilities lens renders recipe 52; the architecture lens renders recipes 17 and 43; the tests lens renders every recipe 34 answer, recipe 44, and recipe 45 given run records; a Spec page renders its recipe 21, 30 and 34 answers, its own space from recipe 44, the recipe 51 rows that cite its entries, the recipe 45 files whose `specs` hold its id, and its own row of recipe 35's whole-corpus answer; a Pack page renders the totals of its recipe 29 answer and, given a base graph, its own recipe 35 answer; a slice page renders its Pack's recipe 54 answer; the roadmap page renders recipe 53 and each roadmap's recipe 55 memo; the registers render recipes 20, 31, 24 beside recipe 51's rows, and 33; the owner queue renders recipe 46; the diff page renders recipe 35's whole-corpus answer; the runs page renders recipe 45; an export renders the values of the pages it holds.

Change 41

Scope: spec:consumers.spec-studio.navigation#rule.topEntries
Request:

Replace the rule with this text.

Replaces: spec:consumers.spec-studio.navigation#rule.topEntries
Reason: No Spec places the Roadmap entry; it leads the planning pages.

- rule: [#topEntries] After the lens entries, the top navigation lists Roadmap, Queue, Questions, Decisions, Declarations, Backlog and Glossary, then Diff when the build was given a base graph and Runs when it was given run records, each linking its page; the search field follows them.

Change 42

Scope: spec:consumers.spec-studio.diagram-kinds#rule.drawnKinds
Request:

Replace the rule with this text.

Replaces: spec:consumers.spec-studio.diagram-kinds#rule.drawnKinds
Reason: Adds the matrix the dense architecture drawing needs.

- rule: [#drawnKinds] The Studio adds dependency depth, capability refinement, scoped architecture, a component uses matrix beside the architecture lens's drawing, and the maturity map as a grid of counts; requirement traceability replaces the realization drawing on a Spec page. Equivalent Mermaid forms share one Studio drawing.

Change 43

Scope: spec:consumers.spec-studio.diagram-kinds#design.architecture
Request:

Add this Design entry after `architecture`.

Follows: spec:consumers.spec-studio.diagram-kinds#design.architecture
Reason: Answers item 11 at the cost of one table.

- usesMatrix: Draw a component uses matrix, a design structure matrix, beside the architecture lens's drawing: one row and one column per realized component in one order, a mark where the row's component uses the column's. A table stays legible at any number of uses, where routed edges between a dozen components run in parallel bundles. It is an HTML table read from anchored uses, needs no layout, bound or fold, and offers no Mermaid source because Mermaid has no matrix form.

Change 44

Scope: spec:consumers.spec-studio.lenses.architecture#ui.architecturePage
Request:

Replace the UI entry with this text.

Replaces: spec:consumers.spec-studio.lenses.architecture#ui.architecturePage
Reason: Places the matrix.

- architecturePage: in order, the page title `Architecture`, the summary sentences, the architecture diagram or its fold with one section per context, the component uses matrix, the `Designed, not built` section, the component details in id order, and the `Unresolved structure` section when it has rows.

Change 45

Scope: spec:consumers.spec-studio.lenses.architecture#ui.architecturePage
Request:

Add this UI entry after `architecturePage`.

Follows: spec:consumers.spec-studio.lenses.architecture#ui.architecturePage
Reason: States the matrix's shape.

- usesMatrix: a table captioned `Which components use which`, one row and one column per realized component, ordered by layer from `edge` to `infrastructure`, unlayered components last, then by id; the cell where a row's component uses a column's holds a mark linking that use in the row component's detail, every other cell is empty, and each header names the component's label with its id as code.

Change 46

Scope: spec:consumers.spec-studio.diagram-kinds.dependency#rule.fold
Request:

Replace the rule with this text.

Replaces: spec:consumers.spec-studio.diagram-kinds.dependency#rule.fold
Reason: Most of the arc drawing's crossings run to unfolded outside boxes the slice page already lists.

- rule: [#fold] The boundary band always folds into one box per relation type that names its count, keeping as its own box each outside Spec that holds a member's stated next rung or states below defined, and every folded Spec stays a row of the text equivalent; above the shared bound, whole depth bands fold in descending box count, ties by ascending depth; if the drawing still exceeds the bound, the SVG is omitted and the text equivalent opens.

Change 47

Scope: spec:consumers.spec-studio.diagram-kinds.maturity-picture#rule.fullMembership
Request:

Add this rule after `fullMembership`.

Follows: spec:consumers.spec-studio.diagram-kinds.maturity-picture#rule.fullMembership
Reason: A settled Pack spends twenty cells on one number.

- rule: [#oneCell] When every member falls in one cell, a sentence naming that cell and its count, followed by the cell's member list, stands in place of the grid; the grid draws when two or more cells hold members.

The proposal

{
  "schema": "sdp-proposal/1",
  "base": "2dc5c44cb4d6a162be6d8fb49c33451f5601a898",
  "reason": "Opus advisory on plan 47: retire plans and reviews into git and the pull request, rename the roadmap's step, close the integration gaps before ready",
  "changes": [
    {
      "scope": [
        "spec:decisions.roadmap-over-plans"
      ],
      "request": "Replace the H1 title with this text, and extend the opening paragraph so it names committed review reports and their assets beside the plan file.",
      "text": "# Plan and review files stop carrying the delivery record once the roadmap and the pull request do",
      "reason": "The owner retired reviews/ as well as plans/; one decision carries both because the principle and the consequences are shared."
    },
    {
      "scope": [
        "spec:decisions.roadmap-over-plans"
      ],
      "request": "Replace the `decision:` entry of the Decision section with this text.",
      "text": "- decision: The Protocol reads its forward planning from its roadmap and keeps its delivery record in git and its pull requests; it adds no plan file and no review file, and `plans/` and `reviews/` stand as frozen history until a later arc removes or archives them. An agent opening the next work runs the roadmap recipe over the roadmap Pack the handbook names and follows each entry to its Packs and carrying Specs. Before an arc's first authorized push its commits are its record: the first commit message names the arc's base, its Pack and the owner's instruction that opened it, each later message says what its unit did, and outstanding work is read from the arc's Pack, the backlogs and the open-question register. At the first authorized push the draft pull request description takes the record: its story, lanes, rulings with who made them, acceptance as measured, deferrals and refusals. A review's findings against Specs travel as a change proposal, checked against the base it names and posted to the pull request as its memo; a finding against code or another file is a review comment on its line; a finding left open becomes an open question with its decider, provisional reading and links. Evidence no test, recipe or preview carries is committed on the arc's branch, linked from the description pinned to that commit, and removed before the merge, which keeps the commit reachable. Briefs and prompts stay in the session. The handbook names the roadmap Pack and the roadmap recipe where it named the current plan, and the self-hosting gate checks that instead of a current plan.",
      "reason": "Drops the short-lived reviews/ record file, which the owner's retirement of reviews/ leaves without a home, and states the review alternative."
    },
    {
      "scope": [
        "spec:decisions.roadmap-over-plans"
      ],
      "request": "Replace the rationale entry that opens `Hard to reverse` with this text.",
      "text": "- rationale: Hard to reverse: the handbook, the skills, the description standard and a gate point every session at the newest plan and at committed review files, and every session's first read changes. Surprising without context: a reader finds two folders that stopped. A real trade-off: one forward-planning carrier in the graph and one record per arc in git and its pull request, with nothing to keep in step, against review findings and pre-push state living in commit messages and pull request threads rather than in files a person can search in the tree.",
      "reason": "The trade-off now covers reviews and drops the record file."
    },
    {
      "scope": [
        "spec:decisions.roadmap-over-plans"
      ],
      "request": "Replace the alternative that opens `Keep each arc's whole execution record in a committed file under reviews/` with these three alternatives, one line each.",
      "text": "- alternative: Keep an arc's record in a file under `reviews/` until its first push, then only its link: the file repeats what the commits already say, outlives the arc as a stub, and keeps `reviews/` growing after its retirement.\n- alternative: Keep review reports as committed files beside the change proposal: the proposal is the reviewable shape, an applied edit is git history and an open finding is an open question, so a report file repeats all three and goes stale with the next edit.\n- alternative: A gate check that refuses a numbered plan above the last frozen one: the cleanup arc removes the folder, so the check guards a window of one pull request, and refusing a kind of file is closer to policing the workflow than to checking the record.",
      "reason": "Records the refused record file, the refused review reports and the refused plan ceiling."
    },
    {
      "scope": [
        "spec:decisions.roadmap-over-plans"
      ],
      "request": "Replace the consequence that opens `The handbook drops its stack of plan statuses` with this text.",
      "text": "- consequence: The handbook drops its stack of plan statuses for a short pointer to the roadmap and its recipe. The self-hosting gate's current-record check refuses a handbook that does not name the roadmap Pack and recipe, and a roadmap Pack manifest that is missing or does not state priority order; its frozen historical checks, its green-gate legs and its ban on plan status in the registry and the glossary stay until the cleanup arc removes the folders they read.",
      "reason": "No plan-number ceiling; the historical checks end with the folders."
    },
    {
      "scope": [
        "spec:decisions.roadmap-over-plans"
      ],
      "request": "Replace the consequence that opens `The commit strategy that authorizes commits` with this text.",
      "text": "- consequence: The owner's instruction that opens an arc authorizes commits on its branch, as a plan's commit strategy did; the arc's first commit message records it and the draft description repeats it after the first push. A session that must stop with no clean boundary commits its work in progress on the arc's branch with a message saying what is incomplete, rather than accounting for it in a file.",
      "reason": "Git is the event log before the first push."
    },
    {
      "scope": [
        "spec:decisions.roadmap-over-plans"
      ],
      "request": "Replace the consequence that opens `The plan files stay as they are` with this text.",
      "text": "- consequence: The plan and review files stay as they are until a dedicated cleanup arc removes or archives them; until then nothing is added to either, and a file in either changes only to correct the record it keeps.",
      "reason": "The owner scheduled the removal for a separate pull request."
    },
    {
      "scope": [
        "spec:protocol.roadmap-replaces-plans"
      ],
      "request": "Replace the H1 title with this text.",
      "text": "# The Protocol reads its next work from its roadmap and keeps its delivery record in git and its pull requests",
      "reason": "The behavior now covers reviews."
    },
    {
      "scope": [
        "spec:protocol.roadmap-replaces-plans#rule.plansFrozen"
      ],
      "request": "Replace the rule with this text.",
      "text": "- rule: [#plansFrozen] `plans/` and `reviews/` keep the plans and review records of the arcs that had them as history until a cleanup arc removes or archives them; no file is added to either, and a file in either changes only to correct the record it keeps.",
      "replaces": "spec:protocol.roadmap-replaces-plans#rule.plansFrozen",
      "reason": "Both folders freeze."
    },
    {
      "scope": [
        "spec:protocol.roadmap-replaces-plans#rule.executionRecord"
      ],
      "request": "Replace the rule with this text.",
      "text": "- rule: [#executionRecord] Before an arc's first authorized push its commits are its record: the first commit message names the arc's base, its Pack and the owner's instruction that opened it, each later message says what its unit did, and outstanding work is read from the arc's Pack, the backlogs and the open-question register. At the first authorized push the draft pull request description takes the record: its branch and base, working rules, lanes, the rulings with who made them, acceptance as measured, deferrals and refusals. Nothing here authorizes a push, and no check reads the record.",
      "replaces": "spec:protocol.roadmap-replaces-plans#rule.executionRecord",
      "reason": "Git replaces the proposed reviews/ record file."
    },
    {
      "scope": [
        "spec:protocol.roadmap-replaces-plans#rule.executionRecord"
      ],
      "request": "Add this rule after the execution-record rule.",
      "text": "- rule: [#reviewFindings] A review's findings against Specs travel as one change proposal on the proposal schema, checked by the proposal check against the base it names and posted to the pull request as the proposal memo; a finding against code or another file is a review comment on its line; a finding left open becomes an open question with its `decider`, `provisional` reading and `links`; the commit that applies a proposal carries its reason line and base. No review file is committed, and a brief or prompt stays in the session that used it.",
      "follows": "spec:protocol.roadmap-replaces-plans#rule.executionRecord",
      "reason": "A proposal scopes Specs only, so code and file findings need their own home."
    },
    {
      "scope": [
        "spec:protocol.roadmap-replaces-plans#rule.executionRecord"
      ],
      "request": "Add this rule after the review-findings rule.",
      "text": "- rule: [#evidence] Evidence no test, recipe or preview carries, such as a prototype of a view not yet built, an adopter measurement's raw output or a screenshot for the description, is committed on the arc's branch with the commands that made it, linked from the description pinned to that commit, and removed before the merge; the merge keeps the commit reachable, so the link lasts.",
      "follows": "spec:protocol.roadmap-replaces-plans#rule.executionRecord",
      "reason": "Answers where evidence lives once reviews/assets retires."
    },
    {
      "scope": [
        "spec:protocol.roadmap-replaces-plans#rule.gateRecord"
      ],
      "request": "Replace the rule with this text.",
      "text": "- rule: [#gateRecord] The self-hosting gate's current-record check refuses a handbook that does not name the roadmap Pack or the roadmap recipe, and a roadmap Pack manifest that is missing or does not state `order: priority`; it keeps the frozen historical checks, the documented green-gate legs, and the ban on plan status in the decision registry and the glossary until the cleanup arc removes the folders they read.",
      "replaces": "spec:protocol.roadmap-replaces-plans#rule.gateRecord",
      "reason": "No plan-number ceiling."
    },
    {
      "scope": [
        "spec:protocol.roadmap-replaces-plans#design.recordFile"
      ],
      "request": "Remove this Design entry; no record file exists.",
      "reason": "The record file is dropped."
    },
    {
      "scope": [
        "spec:protocol.roadmap-replaces-plans#design.frozenCeiling"
      ],
      "request": "Remove this Design entry; the gate keeps no plan-number ceiling.",
      "reason": "The ceiling check is dropped."
    },
    {
      "scope": [
        "spec:protocol.roadmap-replaces-plans#design.gateMessages"
      ],
      "request": "Replace the Design entry with this text.",
      "text": "- gateMessages: `AGENTS.md — the handbook does not name the roadmap Pack`, `AGENTS.md — the handbook does not name the roadmap recipe`, `specs/roadmap.pack.sdp.md — the roadmap Pack's manifest is missing`, and `specs/roadmap.pack.sdp.md — the roadmap Pack's manifest does not state order: priority`.",
      "replaces": "spec:protocol.roadmap-replaces-plans#design.gateMessages",
      "reason": "Drops the ceiling message."
    },
    {
      "scope": [
        "spec:consumers.graph-first-planning"
      ],
      "request": "Replace the unkeyed rule that opens `A plan file points to the Pack and carrying Specs` with this text, as the roadmap-over-plans decision's consequence requires.",
      "text": "- rule: A corpus that keeps plan documents lets each point to its Packs and carrying Specs for intended truth and derived state; a plan document confers nothing, and plan numbering, recorded work order and staleness never become graph structure or workflow authority. Advisory priority over the next work lives in a roadmap Pack.",
      "reason": "The decision says this rule narrows; no edit carries it yet."
    },
    {
      "scope": [
        "spec:consumers.roadmap"
      ],
      "request": "Rename the derived step from lane to need throughout the Spec: the answer fields `lane` become `need`, the Design key `laneValues` becomes `needValues`, the rule keys `specLane` and `entryLane` become `specNeed` and `entryNeed`, and the rule key `needs` becomes `entryDetail` so the key no longer reads as the new word; prose `lane` becomes `need`, keeping the values to design, to state, to build, built and settled.",
      "reason": "A PR description's lanes, a design wave's lanes and edge routing's lanes already use the word; the memo is pasted into the description."
    },
    {
      "scope": [
        "spec:consumers.roadmap.memo"
      ],
      "request": "Rename lane to need in prose and in every field the memo reads from recipe 53, matching the roadmap Spec's rename.",
      "reason": "Keeps the memo on the roadmap's word."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.roadmap-page"
      ],
      "request": "Rename lane to need in prose and fields, and the rule keys `laneLists` and `laneFilter` to `needLists` and `needFilter`; the board's column headings stay To design, To state, To build and Built.",
      "reason": "Keeps the page on the roadmap's word."
    },
    {
      "scope": [
        "spec:decisions.epics-of-any-kind"
      ],
      "request": "Remove the blocking question `epicKinds`, and replace the Decision section's entries with these, so the record states the ruling rather than a proposal.",
      "text": "- context: The glossary's capability row names a Capability Map over high-altitude behavior Specs, while kind and altitude are independent coordinates on the one primitive and the hubs that already state the Protocol's capabilities include model and rule Specs.\n- decision: Any Spec stated at epic altitude is an epic and keeps its kind; the capability map reads every such Spec and its refinement descendants, and no view selects capabilities by kind.\n- rationale: Hard to reverse: once corpora state model and rule epics, narrowing to behavior would force wrappers across every corpus. Surprising without context: the ratified glossary row named behavior Specs. A real trade-off: one outcome owner per capability against a map whose entries share one kind.\n- alternative: Keep behavior-only capability epics and add behavior wrappers over the model and rule hubs: each wrapper restates an outcome another Spec owns, a second owner that drifts, only so a view can read it.\n- consequence: The glossary's capability row names a Capability Map over epic Specs of every kind and their declared refinement descendants.\n- consequence: A hub whose outcome already names a capability is enriched in place to epic altitude, keeping its id, kind and readiness.",
      "reason": "The record still says Proposed for the owner and holds two Specs below ready."
    },
    {
      "scope": [
        "spec:model.structural-patterns"
      ],
      "request": "Replace the definition of the Model term `architecturally significant unit` with this text.",
      "text": "- **architecturally significant unit** — A code unit with exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand to change a system guarantee. Ports, shared data shapes, pipeline stages, decision tables, catalogs, layout policies and adapters may qualify; being exported, re-exporting other units or ranking high on imports is not enough by itself. Its anchor records component membership, a role and references to the designs it answers to. An architectural dependency is declared as `uses`, normally between components; a unit's own `uses` is optional.",
      "reason": "Makes the existing `warrants` clause concrete; drift repair, since exported-as-sufficient would make anchoring a coverage quota the decision refuses."
    },
    {
      "scope": [
        "spec:protocol.structural-self-binding#rule.criterion"
      ],
      "request": "Replace the rule with this text.",
      "text": "- rule: [#criterion] The engine applies the structural-patterns model's significance criterion: exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand; being exported alone is not enough.",
      "replaces": "spec:protocol.structural-self-binding#rule.criterion",
      "reason": "Aligns the ready rule with the model term."
    },
    {
      "scope": [
        "spec:decisions.architectural-annotation"
      ],
      "request": "Replace the consequence that opens `The engine significance criterion stays exported public surface or cross-component reach` with this text, keeping the rest of the section unchanged; record it in the pull request's delegated-rulings table as an alignment of ratified wording.",
      "text": "- consequence: The engine significance criterion requires exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand, as `spec:model.structural-patterns` defines it; being exported alone is not enough. Code never satisfies a decision Spec directly (the binding-grain ruling, MD-37), and an anchor is never pointed at an unfinished Spec to manufacture coverage.",
      "reason": "Leaving the ratified text reading export as sufficient would contradict the model term it governs."
    },
    {
      "scope": [
        "spec:protocol.significant-units-review"
      ],
      "request": "Remove the open questions `acceptedRoster` and `notationBoundary` once ruled, and add this sentence to the narrative after its first paragraph; the roster oracle carries the membership itself.",
      "text": "The example-space decoder belongs to the reader component although its file sits under `src/notation/`: it reads graph shapes and emits findings, and as a notation member it would tie notation, graph and validate into one uses cycle, while as a reader member notation stays a leaf codec.",
      "reason": "Keeps the why once, in the Spec, after the review file retires."
    },
    {
      "scope": [
        "spec:consumers.design-slice"
      ],
      "request": "Remove the non-blocking question `sliceTerm` once the glossary lists design slice among its guidance-only labels.",
      "reason": "The words ruling answers it."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.capability-map-page"
      ],
      "request": "Declare `refines` on spec:consumers.capability-map with the reason `the page is the capability map's reading for a person`, keeping the existing refinement and dependency.",
      "relation": {
        "action": "declare",
        "from": "spec:consumers.spec-studio.capability-map-page",
        "type": "refines",
        "target": "spec:consumers.capability-map"
      },
      "reason": "Without it the roadmap entry reads built when recipe 52 ships and the page does not."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.slice-page"
      ],
      "request": "Declare `refines` on spec:consumers.design-slice with the reason `the page is the design slice's reading for a person`, keeping the existing refinement and dependency.",
      "relation": {
        "action": "declare",
        "from": "spec:consumers.spec-studio.slice-page",
        "type": "refines",
        "target": "spec:consumers.design-slice"
      },
      "reason": "Puts the slice page in its roadmap entry's scope."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.roadmap-page"
      ],
      "request": "Declare `refines` on spec:consumers.roadmap with the reason `the page is the roadmap's reading for a person`, keeping the existing refinement and dependency.",
      "relation": {
        "action": "declare",
        "from": "spec:consumers.spec-studio.roadmap-page",
        "type": "refines",
        "target": "spec:consumers.roadmap"
      },
      "reason": "Puts the roadmap page in its roadmap entry's scope."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.diagram-kinds.legibility"
      ],
      "request": "Declare `refines` on spec:consumers.spec-studio.diagram-kinds with the reason `readable labels are part of the outcome the diagram kinds state`, keeping the refinement of the diagram contract.",
      "relation": {
        "action": "declare",
        "from": "spec:consumers.spec-studio.diagram-kinds.legibility",
        "type": "refines",
        "target": "spec:consumers.spec-studio.diagram-kinds"
      },
      "reason": "The owner's legibility ask is outside the diagram-kinds entry's scope today."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.diagram-kinds.edge-routing"
      ],
      "request": "Declare `refines` on spec:consumers.spec-studio.diagram-kinds with the reason `arrows that cover no label serve the readable drawings the diagram kinds state`, keeping the refinement of the diagram contract.",
      "relation": {
        "action": "declare",
        "from": "spec:consumers.spec-studio.diagram-kinds.edge-routing",
        "type": "refines",
        "target": "spec:consumers.spec-studio.diagram-kinds"
      },
      "reason": "Same scope gap as legibility."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.lenses"
      ],
      "request": "Replace the title, the narrative paragraph and the Intent outcome with these three lines, in that order.",
      "text": "# Five lenses read the graph as Packs, capabilities, architecture, tests and evidence\nEach lens is a page with a Spec of its own, so each builds on the graph it reads today: the Packs, capabilities, architecture and tests lenses read what the graph records, and the evidence lens reads not tracked until the graph records an observation. This Spec keeps what the five share.\n- outcome: Let a person see the graph five ways, by Pack, by capability, by architecture, by verification and by evidence, from one top navigation.",
      "reason": "The shared lens contract is ready and still says four lenses."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.lenses#rule.order"
      ],
      "request": "Replace the rule with this text.",
      "text": "- rule: [#order] The lenses are pages of the page set, reached from the top navigation in the order Packs, capabilities, architecture, tests, evidence; the index page is the Packs lens and the default landing page.",
      "replaces": "spec:consumers.spec-studio.lenses#rule.order",
      "reason": "Integrates the Capabilities lens."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.lenses#ui.lensPages"
      ],
      "request": "Replace the UI entry with this text.",
      "text": "- lensPages: `index.html` for the Packs lens, `capabilities.html` for the capabilities lens, `architecture.html`, `tests.html` and `evidence.html`, each opening with its name and one sentence saying what it reads.",
      "replaces": "spec:consumers.spec-studio.lenses#ui.lensPages",
      "reason": "Integrates the Capabilities lens."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.lenses.packs"
      ],
      "request": "Replace the narrative paragraph before Intent with this text.",
      "text": "Packs collect Specs for review, while the separate Capabilities page reads authored refinement. The index remains the landing page and keeps each Pack's members in authored order.",
      "reason": "The narrative says no view draws capabilities."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.lenses.packs#rule.packGrouping"
      ],
      "request": "Replace the rule with this text.",
      "text": "- rule: [#packGrouping] The Packs lens groups Specs by Pack, each Pack's members in authored order. The separate Capabilities page reads refinement; selecting an epic narrows the index's Specs section without changing any Pack.",
      "replaces": "spec:consumers.spec-studio.lenses.packs#rule.packGrouping",
      "reason": "The glossary cites this rule for draws no capability tree."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.index-page#rule.filters"
      ],
      "request": "Replace the rule with this text.",
      "text": "- rule: [#filters] Filters narrow the Specs section by kind, altitude, stated rung, floor reached, implementation binding, verifier binding, Pack and epic; each filter takes one value or any, the epic filter also takes no epic, the filters combine, and the section says how many of its rows it shows. Without script every row shows.",
      "replaces": "spec:consumers.spec-studio.index-page#rule.filters",
      "reason": "Integrates the epic filter."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.data#rule.readerValues"
      ],
      "request": "Replace the Contract entry with this text.",
      "text": "- [#readerValues] The build renders the index from `specs()`, `packs()`, `findings()`, each Spec's design columns and the epic memberships recipe 52 answers, a Pack page from `packContext` and the Pack totals, a Spec page from `specContext`, and the search page from the search index; every page's rail renders the rail values. A page states no value the reader did not return or a named recipe did not answer, apart from counts the build takes of those values.",
      "replaces": "spec:consumers.spec-studio.data#rule.readerValues",
      "reason": "Integrates recipe 52 into the index."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.data.recipe-answers#design.recipeEvaluations"
      ],
      "request": "Replace the Design entry with this text.",
      "text": "- recipeEvaluations: a build evaluates each of these once, with no parameter unless one is named: recipes 17, 20, 24, 31, 33, 43, 44, 46, 51 and 53; recipe 52 with `{ detail: true }`; recipe 29 with `{ pack: id }` and recipe 54 with `{ pack: id, detail: true }` for every Pack; recipe 55 with `{ pack: id }` for every Pack whose manifest states `order: priority`; recipe 21 with `{ spec: id }` and recipe 30 with `{ specs: [id] }` for every Spec; recipe 34 with `{ spec: id }` for every Spec that is not an example, Specs in no Pack included; given a base graph, recipe 35 with `{ base, detail: true }`, and with `{ base, pack: id, detail: true }` for every Pack; given run records, recipe 45 with `{ runs }`.",
      "replaces": "spec:consumers.spec-studio.data.recipe-answers#design.recipeEvaluations",
      "reason": "The new pages read recipes 52 to 55, which the ready data contract does not name."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.data.recipe-answers#design.pageRecipes"
      ],
      "request": "Replace the Design entry with this text.",
      "text": "- pageRecipes: the index renders reader values and each Spec's `epicIds` from recipe 52; the glossary renders reader values only; the capabilities lens renders recipe 52; the architecture lens renders recipes 17 and 43; the tests lens renders every recipe 34 answer, recipe 44, and recipe 45 given run records; a Spec page renders its recipe 21, 30 and 34 answers, its own space from recipe 44, the recipe 51 rows that cite its entries, the recipe 45 files whose `specs` hold its id, and its own row of recipe 35's whole-corpus answer; a Pack page renders the totals of its recipe 29 answer and, given a base graph, its own recipe 35 answer; a slice page renders its Pack's recipe 54 answer; the roadmap page renders recipe 53 and each roadmap's recipe 55 memo; the registers render recipes 20, 31, 24 beside recipe 51's rows, and 33; the owner queue renders recipe 46; the diff page renders recipe 35's whole-corpus answer; the runs page renders recipe 45; an export renders the values of the pages it holds.",
      "replaces": "spec:consumers.spec-studio.data.recipe-answers#design.pageRecipes",
      "reason": "Names which page reads which new recipe."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.navigation#rule.topEntries"
      ],
      "request": "Replace the rule with this text.",
      "text": "- rule: [#topEntries] After the lens entries, the top navigation lists Roadmap, Queue, Questions, Decisions, Declarations, Backlog and Glossary, then Diff when the build was given a base graph and Runs when it was given run records, each linking its page; the search field follows them.",
      "replaces": "spec:consumers.spec-studio.navigation#rule.topEntries",
      "reason": "No Spec places the Roadmap entry; it leads the planning pages."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.diagram-kinds#rule.drawnKinds"
      ],
      "request": "Replace the rule with this text.",
      "text": "- rule: [#drawnKinds] The Studio adds dependency depth, capability refinement, scoped architecture, a component uses matrix beside the architecture lens's drawing, and the maturity map as a grid of counts; requirement traceability replaces the realization drawing on a Spec page. Equivalent Mermaid forms share one Studio drawing.",
      "replaces": "spec:consumers.spec-studio.diagram-kinds#rule.drawnKinds",
      "reason": "Adds the matrix the dense architecture drawing needs."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.diagram-kinds#design.architecture"
      ],
      "request": "Add this Design entry after `architecture`.",
      "text": "- usesMatrix: Draw a component uses matrix, a design structure matrix, beside the architecture lens's drawing: one row and one column per realized component in one order, a mark where the row's component uses the column's. A table stays legible at any number of uses, where routed edges between a dozen components run in parallel bundles. It is an HTML table read from anchored uses, needs no layout, bound or fold, and offers no Mermaid source because Mermaid has no matrix form.",
      "follows": "spec:consumers.spec-studio.diagram-kinds#design.architecture",
      "reason": "Answers item 11 at the cost of one table."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.lenses.architecture#ui.architecturePage"
      ],
      "request": "Replace the UI entry with this text.",
      "text": "- architecturePage: in order, the page title `Architecture`, the summary sentences, the architecture diagram or its fold with one section per context, the component uses matrix, the `Designed, not built` section, the component details in id order, and the `Unresolved structure` section when it has rows.",
      "replaces": "spec:consumers.spec-studio.lenses.architecture#ui.architecturePage",
      "reason": "Places the matrix."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.lenses.architecture#ui.architecturePage"
      ],
      "request": "Add this UI entry after `architecturePage`.",
      "text": "- usesMatrix: a table captioned `Which components use which`, one row and one column per realized component, ordered by layer from `edge` to `infrastructure`, unlayered components last, then by id; the cell where a row's component uses a column's holds a mark linking that use in the row component's detail, every other cell is empty, and each header names the component's label with its id as code.",
      "follows": "spec:consumers.spec-studio.lenses.architecture#ui.architecturePage",
      "reason": "States the matrix's shape."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.diagram-kinds.dependency#rule.fold"
      ],
      "request": "Replace the rule with this text.",
      "text": "- rule: [#fold] The boundary band always folds into one box per relation type that names its count, keeping as its own box each outside Spec that holds a member's stated next rung or states below defined, and every folded Spec stays a row of the text equivalent; above the shared bound, whole depth bands fold in descending box count, ties by ascending depth; if the drawing still exceeds the bound, the SVG is omitted and the text equivalent opens.",
      "replaces": "spec:consumers.spec-studio.diagram-kinds.dependency#rule.fold",
      "reason": "Most of the arc drawing's crossings run to unfolded outside boxes the slice page already lists."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.diagram-kinds.maturity-picture#rule.fullMembership"
      ],
      "request": "Add this rule after `fullMembership`.",
      "text": "- rule: [#oneCell] When every member falls in one cell, a sentence naming that cell and its count, followed by the cell's member list, stands in place of the grid; the grid draws when two or more cells hold members.",
      "follows": "spec:consumers.spec-studio.diagram-kinds.maturity-picture#rule.fullMembership",
      "reason": "A settled Pack spends twenty cells on one number."
    }
  ]
}

@darko-mijic

Copy link
Copy Markdown
Contributor Author

Advisory review: GPT-6-Astra (extra-high effort), opinion

One of two independent advisors on plan 47's decision items; the other advisor's review is in its own comment. The executing thread rules after reading both. Read at 2dc5c44.

I support the roadmap, the nine epic boundaries, and the separate Studio slice page.
Use one retirement decision for plans and reviews, with git, pull requests, and commit-pinned evidence as their replacements.
Treat the significance wording as an explicit clarification of curation, aligning every carrying surface together.
Before building, repair the drawing contracts and stop presenting derived dependency counts as the owner's reason for priority.
The proposal has 25 changes; its schema and scopes pass, but 10 changes need reconciliation with concurrent working-tree edits.

  1. Where priority lives: agree. Confidence: 5/5. spec:decisions.roadmap-priority makes an explicit, optional order: priority the narrowest durable extension: membership already has authored order, and the field states its meaning without creating a relation or truth-bearing primitive. Its alternatives explain why a reserved Pack name or inferred meaning from framing would be weaker, and its consequences already require both carriers, the reader, and the design diff to preserve the distinction. Keep several roadmaps lawful for adopters while the Protocol chooses one by convention. I would change my mind if an adopter demonstrated a priority requirement that ordered Pack membership cannot express without duplicating intent.

  2. Alternatives to plans and reviews: agree with changes. Confidence: 4/5. Use one expanded spec:decisions.roadmap-over-plans and its behavior Spec to cover both retirements; the owner's choice is settled, while the current record-file provisions contradict it. Keep priority in the roadmap, intent and unresolved design questions in Specs, substantive changes and their reasons in commits, and the arc's narrative and review disposition in its draft PR; git does not recover uncommitted session context. Put prototype pages, screenshots, and adopter evidence that tests or recipes cannot carry in docs/evidence/<arc>/, with source and engine commits, input scope, reproduction instructions, and commit-pinned PR links; this directory holds assets, not another delivery ledger. Demonstrate the convention through this arc's actual Pack, a real recipe-38-checked proposal and recipe-49 memo, its resulting edit or keyed question, and the preview's diff and runs, while keeping non-Spec findings in ordinary PR comments because sdp-proposal/1 cannot scope them. Keep the handbook/roadmap consistency check and existing historical assertions until cleanup, omit the plan-number ceiling, and distinguish the preview's merge commit from the branch-head review base. I would reconsider the evidence location if a durable, commit-addressed publishing service offered equivalent preservation without depending on an expiring artifact or the latest preview.

  3. Epics of any kind: agree. Confidence: 5/5. Kind and altitude are independent under the one-primitive model, so the behavior-only glossary restriction should yield to spec:decisions.epics-of-any-kind. A behavior wrapper over model.core-model or validation.two-check-families would duplicate an existing outcome just to satisfy a view. Keep the kind visible and use the exact glossary replacement below. I would change my mind only if an epic of a particular kind could not obey the existing Spec and refinement laws; visual uniformity is insufficient.

  4. The nine epic boundaries: agree. Confidence: 4/5. Reusing seven outcome owners, adding spec:extraction.executable-examples, and keeping self-hosting about the Protocol's own practice follow spec:protocol.capability-epics without manufacturing wrappers. Nesting agent access beneath projections is defensible because scripted access is a consumer view, and corpus rules belong there by their graph-scripting operation rather than their CLI host. My fresh recipe-35 comparison against the PR's main base found 27 added and 21 changed Specs, four affected Packs, and no binding changes; all 399 previously ready Specs still state and reach ready. At the nominated head, all 432 Specs are reached by nine epics, and projections has 185 distinct descendants, so the brief's approximate 176 should not be reused as a measurement. I would revisit the broad projections boundary if adopter tasks repeatedly required a distinct outcome that no existing child owns, not merely because its descendant count is large.

  5. The engine's accepted set: agree with changes. Confidence: 4/5. Accept the annotation review's 14 additions, 11 merges, one drop, role corrections, target transfers, and three component uses, subject to the source-level promise pass and independently pinned roster it already prescribes. Its merge ledger preserves targets and distinguishes bookkeeping from proof that surviving code realizes every promise; the proposed frontmatter-anchor relocation and bare-helper exclusions are particularly well justified. src/notation/example-space.ts reads graph vocabulary and emits findings for both reader and code generation, which supports reader membership by responsibility while keeping the slot codec in notation. The concurrent working tree adds a decoderBoundary condition requiring no new layer crossing; replace that condition with review against actual declared constraints, because neither a crossing nor a lawful cycle determines ownership by itself. I would change my mind if the decoder's consumers or semantic responsibility showed it belonged to a different seam, or a merge failed the whole-Spec promise pass.

  6. The significance criterion: agree with changes. Confidence: 4/5. This can be drift repair rather than a new narrowing decision: spec:model.structural-patterns already requires a unit to warrant binding, its accepted set is owner-reviewed, and spec:decisions.architectural-annotation already says anchors are curated rather than a quota. Explaining that assessment in terms of a contract or responsibility does not make every export eligible by right, nor does it change the public-surface-or-cross-component boundary. However, update the architectural-annotation consequence explicitly alongside the Model term, structural-self-binding#rule.criterion, glossary, and guidance; leaving the old shorthand untouched would preserve the ambiguity. Keep the examples illustrative and add no validator, universal role taxonomy, or automatic exclusion of a wrapper that actually owns an independent contract. I would require a refining decision if the ruling changed that boundary or categorically prohibited units the existing curation law permits.

  7. Words: agree with changes. Confidence: 4/5. Add roadmap as a glossary term, use need for the derived reading and new answer fields, retain “to state,” and put design slice only among guidance labels. Explain that “to state” means the structural floor permits ready while a person still judges the statement, and that “built” means ready work with implementation bindings across the selected refinement subtree, not passing tests or deployment. These qualifications follow spec:consumers.roadmap and the existing binding language and are needed in both the page and the standalone memo. The concurrent edits already introduce need terminology; preserve that work rather than applying an older whole-file replacement over it. I would reconsider the labels if outside-reader checks still confused the entry's aggregate need with its own readiness or with permission to start.

  8. Release and baseline views: agree. Confidence: 5/5. Keep spec:consumers.projections-model.roadmap-views#question.releaseReader blocking and deferred, with the precise trigger “the first published release.” The trigger reopens the question of a named reader and measurable use; it does not commit the project to building either view. This avoids spending the arc on tag or approval views before the existing roadmap and git readings prove insufficient. I would reopen earlier if a concrete release reader demonstrated a need that must be resolved before publication.

  9. Ready statements at the build go: agree with changes. Confidence: 5/5. At the nominated commit, 22 of the arc's 26 Specs clear ready structurally; the epic-kind decision is scoped, two Specs are held by it, and the release/baseline capture remains scoped. Ratify the delegated decisions with registry rows, resolve their questions, and re-run promotion preflight before stating the supported rungs, leaving the release capture deferred. The retirement Specs, the inconsistent drawing contracts in item 14, and the memo's priority rationale in item 15 need correction before I would call their designs build-ready, even if concurrent edits now state ready. The other reviewed designs can proceed without waiting for implementation bindings or passing tests to become readiness requirements. I would change this assessment if a promise review exposes another unresolved build-defining choice; a clear floor alone would not rebut it.

  10. The roadmap's shape: agree. Confidence: 4/5. One living pack:roadmap, with nine selected entries at this head, demonstrates a useful near-term selection rather than a second corpus inventory. spec:consumers.roadmap#rule.scope and #rule.overlap correctly keep refinement reach explicit and shared Specs visible, while the owner controls membership and removes completed or deselected work by ordinary edits. Keep examples and decisions apart from implementation work and retain built entries honestly until an edit removes them. The platform's trial roadmap in the prototype is illustrative, not an owner-approved change to /tmp/plan47-platform. I would reconsider the entry selection if its full refinement subtrees repeatedly hid the small deliverable the owner actually intended for the next PR; that would first call for narrower selected Specs, not a new grouping primitive.

  11. Dense drawings: agree with changes. Confidence: 4/5. The architecture screenshot's labels are readable, but its parallel edges still make pairwise uses difficult to inspect; add a component uses matrix as a native HTML table alongside the drawing, using recipe 17's existing anchored pair counts. Define rows as users and columns as used components, link nonzero cells to supporting detail, label zero as no anchored use recorded, and keep planned and unresolved structure separate. This solves the demonstrated reading problem without a new Mermaid kind, layout dependency, or graph relation; the dense mixed-relation slice drawing should keep its typed edge list and existing narrowed-scope route. The maturity picture is useful for comparing stated and reached rungs, but the uniform-Pack screenshot spends most of a screen on one populated cell, so make a compact count summary the default and put the full grid in a native disclosure. I would reverse either presentation choice if the two-corpus reader task showed the existing edge list or an always-open grid answered the question more quickly and reliably.

  12. Studio growth: agree. Confidence: 4/5. spec:consumers.spec-studio.slice-page deserves a separate page because its dependency, architecture, decision, and question readings are substantial, while the Pack page retains its member-by-member contract and export. Capabilities answers where intent belongs; Roadmap answers which selected work comes next, so both merit navigation entries, with slice access contextual to its Pack. The platform history-view phone prototype supports the separation, and its one broad epic also shows why the capabilities view must work without requiring the Protocol's organization into nine epics. Keep reciprocal Pack/slice links and verify the combined navigation at narrow width, since separate lane prototypes do not prove the final combined header. I would reconsider if task-based reading showed users repeatedly needed both pages' full contents together rather than a clear link between them.

  13. Mermaid source without a new decision: agree. Confidence: 5/5. spec:consumers.spec-studio.diagram-kinds.mermaid-source#rule.sourceOnly exports text from the same selected drawing values while retaining build-time SVG and the existing copy element. It neither changes the four projections frozen by MD-32 nor replaces the renderer chosen by MD-44, so a refining decision would add ceremony without changing either ruling. Keep the specified escaping, explicit fallback syntax, full identities, and refusal to present incomplete source as complete. I would require a decision if this grew into browser Mermaid rendering, another layout provider, or a change to the shipped Mermaid projection.

  14. Drawing contract mismatches: agree with changes; repair before implementation. Confidence: 5/5. spec:consumers.spec-studio.diagram-kinds.scoped-architecture#rule.boundary incorrectly says the slice includes uses only between touched components, while spec:consumers.design-slice#rule.outsideNeighbors and #design.componentUse explicitly include pairs with an immediate outside neighbor. The slice page also specifies .dependency and .scoped-architecture element-id segments, whereas the drawing children specify .dependencies and .architecture. Preserve the slice answer's marked outside pairs, forbid further traversal, and make the page consume the drawing kinds' exact id contracts. These are small but concrete disagreements that otherwise leave separate builders choosing incompatible behavior. I would withdraw the finding if the carrying entries were aligned; successful prototype screenshots do not settle contradictory contracts.

  15. A derived memo cannot explain the owner's priority: disagree with the current wording. Confidence: 5/5. spec:consumers.roadmap.memo#rule.whyNow calls an entry's problem statement and dependency counts its “why now,” although those values cannot establish why the owner placed it ahead of another entry. Rename that column “Purpose and reach,” copy the authored intent faithfully, and describe the counts as structural facts. Leave the actual priority rationale in the author's surrounding PR text, with the manifest order remaining the sole authored priority. This preserves a useful generated forward section without inferring an owner's choice from prose or treating dependency fan-in as a priority score. I would change my mind if an explicitly authored priority-rationale contract were introduced and the memo actually read it.

Exact non-Spec text for the executing thread

Apply these when switching to the built convention, reconciling the concurrent edits; these are proposed replacements, not edits I made to the repository.

In AGENTS.md, replace the opening plan-status stack with:

> Work is read from the graph. The Protocol's next work is `pack:roadmap`, carried by
> `specs/roadmap.pack.sdp.md` with `order: priority`; run recipe 53 for each entry's
> derived need and what holds it. Read its arc Pack and carrying Specs for intent,
> decisions and open questions, and the draft pull request for the arc's narrative
> and review disposition. Before the first authorized push, substantive commits
> preserve changes and their reasons; unfinished session material stays in the session.
> Re-derive readiness, backlog and findings rather than inheriting a prior summary.
> Existing `plans/` and `reviews/` are historical evidence pending separate cleanup.

Replace the live-work sentence under “The build path” with:

Live work is read through recipe 53 over `pack:roadmap`; follow the selected entry to its arc Pack and carrying Specs.

Replace the plans/ and reviews/ rows in “Where to look” with:

| `specs/roadmap.pack.sdp.md` and recipe 53 | the selected next work, its advisory priority and derived needs | before choosing or opening work |
| `plans/` and `reviews/` | historical evidence retained until dedicated cleanup | only for an earlier arc's record |

Replace the “Tests are the evidence” bullet and the evidence-storage instruction in “Show it to a person” with this shared convention, stated once and referenced from the other location:

Tests and recipes carry repeatable evidence. Commit only evidence they cannot carry under `docs/evidence/<arc>/`, named for the capability: prototype pages, rendered screenshots and adopter measurements with their corpus and engine commits, input scope and reproduction commands. Label a prototype as proposed. Link the assets from the pull request at an immutable commit. An asset index records provenance and reproduction, never tasks, rulings or review disposition. A preview is a current view; compare its stamp with each run report's recorded commit before citing that run as evidence for it.

Replace the current-record advice inside “Commits are recovery boundaries” with:

Commit authority comes from the owner's instruction for the arc. Record substantive changes, their reasons and relevant recovery facts in commits; open the draft pull request at the first authorized push. Keep unfinished session material in the session, preserve uncommitted work, and never claim git recorded it. Resume by reading the tree, diff, commits and current graph. This convention grants no authority to commit or push.

In CONTEXT.md, use these rows for roadmap, capability/domain, and the significant-unit definition, and add the following sentence to guidance-only labels:

| **roadmap** | a Pack whose manifest states `order: priority`, giving its authored member order the meaning of advisory priority; each entry's need is derived from its refinement scope (`spec:consumers.roadmap`); membership grants no readiness, delivery fact or permission | schedule · workflow state |
| **capability / domain** | a Pack grouping and/or a Capability Map projection over epic Specs of every kind and their declared refinement descendants; Pack membership and refinement remain distinct (`spec:consumers.capability-map`) | a kind or an altitude |
| **architecturally significant unit** | a code unit with exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand to change a system guarantee; export status or import rank alone is insufficient; the owner-reviewed accepted set is curated, with component membership, role and design bindings on the realizing anchor and architectural dependencies declared as uses (`spec:model.structural-patterns`) | pattern, as a Protocol concept |

`design slice` names a per-invocation reading of selected Specs as one design (`spec:consumers.design-slice`); it names no saved grouping, primitive or workflow stage.

In .agents/skills/sdp-authoring/SKILL.md, replace the “Author a Pack” paragraph with:

Use a Markdown `*.pack.sdp.md` manifest with `id`, `specs`, optional `modelRefs` and optional `order: priority`. The H1 is the Pack title and the remaining body prose is its framing. Preserve authored membership order: it is reading order unless the manifest explicitly states priority. Follow `spec:carrier.markdown-pack-authoring` for the carrier law and `spec:decisions.roadmap-priority` for its advisory meaning. A corpus chooses its own planning records; the Protocol's convention is carried by `spec:protocol.roadmap-replaces-plans`.

Replace the first paragraph under “Curate the anchors” with the following, retaining the separate document-realization convention:

Anchors are curated, never a coverage quota. Start with public contracts and cross-component responsibilities a designer or builder must understand, and read the code before adding an identity. An export, import ranking, test expectation or desired file-impact answer does not establish significance. Leave a wrapper, forwarding barrel, empty registration or formatting helper bare unless it owns an independent contract or responsibility. One identity has one file owner; one responsibility realizing several Specs normally uses plural targets. Independent responsibilities in one file may keep separate identities. Before merging or dropping an identity, account for every target promise and its surviving realizing units. A realizing unit documents its local how, never a paraphrase of the Spec's what or why.

In .agents/skills/sdp-sessions/SKILL.md, replace the paragraph beginning “Report a review as a numbered list” with:

Hand proposed Spec edits back as one change proposal against the commit read, with exact text and resolving Spec or entry scopes. Check it with recipe 38 against the graph derived at that base, and render the human memo with recipe 49. In the Protocol, post the memo, including its exact JSON, to the pull request; keep non-Spec findings as ordinary pull request comments, and write no empty proposal for a review with no Spec edits. An unresolved design question belongs on its carrying Spec with a decider, links and a provisional reading; a deferral is blocking and names its trigger. A code defect against settled intent remains a code finding. The carrying convention is `spec:protocol.roadmap-replaces-plans`.

For the registry row currently assigned MD-47 in docs/concept/DECISIONS.md, use:

| MD-47 | graph intent and pull request records replace plan and review files | durable | The Protocol reads selected work from its roadmap, keeps intent in carrying Specs and changes in git, and presents delivery narrative, proposal memos and evidence through pull requests; existing plan and review files await separate cleanup. Narrows MD-33 for the Protocol's own practice. | [Spec](../../specs/decisions/roadmap-over-plans.sdp.md) (`spec:decisions.roadmap-over-plans`) |

In check-self-hosting-gates.mjs, remove readdirSync from the import, delete the block from const primaryPlans through const currentPlanSource, and replace the current-plan status checks before const checkScript with:

const roadmapPath = 'specs/roadmap.pack.sdp.md';
expectContains(agentsPath, agents, 'pack:roadmap',
  'the handbook does not name the roadmap Pack');
expectContains(agentsPath, agents, 'recipe 53',
  'the handbook does not name the roadmap recipe');
if (!existsSync(join(rootDir, roadmapPath))) {
  failures.push(`${roadmapPath} — the roadmap Pack's manifest is missing`);
} else {
  const frontmatter = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/u
    .exec(read(roadmapPath))?.[1] ?? '';
  if (!/^order:[ \t]+priority[ \t]*$/mu.test(frontmatter)) {
    failures.push(`${roadmapPath} — the roadmap Pack's manifest does not state order: priority`);
  }
}

Replace surfaces.currentPlan with roadmap: roadmapPath, replace currentRecord.status with roadmap: 'pack:roadmap', and use this comment for its current-record description; retain the remaining historical assertions and green-gate checks:

// Current record: the handbook names the roadmap Pack and recipe, and the
// manifest explicitly states priority order. This checks repository pointers,
// never roadmap content, work order, freshness, review disposition or plan numbers.

The gate snippet checks the explicit manifest line selected for this repository; it is not a new Protocol validator or a substitute for the carrier's conformance checks. Its test expectations must follow the new pointer and report fields when implemented.

Evidence and proposal check

I read PR 36 first, then the required repository documents and skills, queried the graph before judging Specs, read the annotation review and relevant lane material, inspected the supplied screenshots, and queried the read-only platform corpus. The recipe-35 base was derived without writing files from the clean existing plan-46 checkout, whose entire tracked tree equals da4b14193e65495ff7e3dba84383821bf6754811, the PR's main base; the local branch named main is older and was not used as that comparison base. The initial nominated-head query returned no drift alarms and only the existing verifier-gap warning on spec:model.spec-sections.

The preview stamp named merge commit 0d871373f17cbf30fd97e41abd22124a1121ecd9, and the runs page recorded that same commit; neither is silently substituted for the proposal's branch-head base.

proposal.json keeps base 2dc5c44cb4d6a162be6d8fb49c33451f5601a898. The required recipe-38 command returns empty schemaProblems and diagnostics, 25 changes, and zero unresolved scopes; all declared relation targets also resolve. Concurrent repository edits left changes 1, 2, 3, 4, 5, 16, 17, 18, 21 and 23 marked moved, so the executing thread must reconcile those changes with its current edits before applying them. The proposal preserves current readiness when replacing bodies and omits already-answered question removals. I wrote only opinion.md and proposal.json in the assigned output directory and made no repository changes.

@darko-mijic

Copy link
Copy Markdown
Contributor Author

Advisory review: GPT-6-Astra, change proposal

The advisor's Spec edits as one change proposal (sdp-proposal/1), rendered by recipe 49. Recipe 38 against the graph at the base 2dc5c44: no schema problems, 25 changes, every scope resolves at head; 10 read as moved since the base and are reconciled by hand. The exact JSON closes the memo.

Change proposal

Base: 2dc5c44cb4d6a162be6d8fb49c33451f5601a898
Reason: Make the retirement precedent usable, align significance and roadmap wording, and resolve drawing contracts before the delegated build.

Change 1

Scope: spec:decisions.roadmap-over-plans
Request:

Replace this Spec's body (after its existing frontmatter) with the exact text below; preserve its current envelope, readiness and relations, and reconcile the moved-scope report before applying.
# The Protocol replaces plan and review files with graph intent and pull request records

The roadmap selects upcoming work, carrying Specs state its intent, and git keeps changes to that intent. A pull request explains the arc and presents its review and evidence. Retiring plan and review files removes competing records; it does not remove durable evidence.

## Intent

- outcome: Give the Protocol one home for each planning and review concern while keeping its delivery narrative and evidence recoverable.

## Decision

- context: The roadmap gives advisory priority a graph home, and the pull request description already carries an arc's narrative, rulings and measured acceptance. The owner has selected retirement of both plan and review files, with their removal or archival in a separate cleanup change.
- decision: The Protocol stops using `plans/` and `reviews/` for new delivery records. Its roadmap Pack holds advisory priority; its arc Packs group the carrying Specs; those Specs own intent, rulings and open questions, with triggers on deferrals. Before the first authorized push, substantive git commits record changes and the reasons and recovery facts needed to understand them, while unfinished session material remains in the session. From the first authorized push, a draft pull request carries the arc's narrative, branch and base, working rules, lanes, rulings with their authority, measured acceptance and forward section. Reviews hand off proposed Spec edits as checked change proposals and their rendered memos on the pull request; findings outside that schema travel as ordinary pull request comments. No replacement plan file, review file or review-status primitive is introduced.
- rationale: Hard to reverse: agents, the handbook and a repository check change their entry point from the current plan to the roadmap. Surprising without context: both historical folders cease receiving delivery records. A real trade-off: the graph and git supply durable intent and changes without a second working record, while the pull request supplies the human narrative and separately preserved evidence supplies what a live preview cannot retain.
- alternative: Keep a record file until the first push: this recreates the review-file lane the owner has retired and leaves another record to reconcile.
- alternative: Put execution history, review approval or priority rationale into new Spec fields: these are not system truth, and git and the pull request already carry the history and explanation.
- alternative: Keep only links to the latest preview or expiring CI artifacts: a later run can replace the evidence a historical description cites.
- consequence: The handbook names `pack:roadmap` and recipe 53. The repository's roadmap check checks that pointer and the manifest's explicit priority order, retaining frozen historical assertions until the separate cleanup change and retaining its green-gate and semantic-surface checks. It adds no plan-number ceiling or check of roadmap content, work order, freshness or review disposition.
- consequence: The proposal schema continues to scope Specs only. A review finding that changes no Spec does not acquire an invented Spec scope, and a review with no proposed Spec changes needs no empty proposal.
- consequence: Accepted design changes are ordinary carrier edits; an unresolved design question lives on its carrying Spec with a decider, links and a provisional reading, and a deferred question is blocking with a trigger. Acceptance and rejection of a proposal remain pull request discussion and git history, never proposal fields or graph facts.
- consequence: Tests and recipes carry repeatable evidence. A preview is the current human view, with its stamp, diff and externally supplied runs; a preview URL is not an immutable acceptance record. Evidence no test or recipe can carry is committed under `docs/evidence/<arc>/`, named for the capability, with provenance and reproduction instructions and commit-pinned links from the pull request; it carries no task ledger, ruling table or review disposition.
- consequence: Commit and push authority comes from the owner's instruction and is not created by this record convention. Git cannot preserve uncommitted session state; a later session reconstructs current work from the tree, diff, commits and graph rather than claiming a missing session was recovered.
- consequence: Existing plans, reviews and their assets remain available until the dedicated cleanup change removes or archives them and updates their historical checks and links. This decision imposes no record convention on an adopter.

Change 2

Scope: spec:protocol.roadmap-replaces-plans
Request:

Replace this Spec's body (after its existing frontmatter) with the exact text below; preserve its current envelope, readiness and relations, and reconcile the moved-scope report before applying.
# The Protocol reads work from its roadmap and records delivery through git and pull requests

An arc's Pack groups its intent; its carrying Specs state the design and decisions. The roadmap selects upcoming work. Git preserves changes and the pull request explains them, with review handoffs and evidence beside the explanation.

## Intent

- actor: A person or agent opening, reviewing or resuming the Protocol's work.
- problem: Plan and review files duplicate intent, narrative and evidence already carried elsewhere and make sessions reconcile competing records.
- outcome: Make the roadmap, carrying Specs, git and pull request sufficient to choose, review and recover work without a new plan or review file.

## Behavior

- rule: [#readsRoadmap] An agent opening the Protocol's next work runs recipe 53 over the roadmap Pack the handbook names and follows each entry to its Packs and carrying Specs.
- rule: [#oneRoadmap] The Protocol keeps one living roadmap Pack, edited in place. Its owner selects captured work for the upcoming pull requests; landing a capture does not add it. Entries leave by an ordinary manifest edit when the selected work is complete or no longer belongs among the next work, and move on the owner's word, with git as history.
- rule: [#plansFrozen] The Protocol adds no delivery record under `plans/` or `reviews/`. Existing material remains historical evidence until a separate cleanup change removes or archives it and updates its links and historical checks.
- rule: [#executionRecord] Before the first authorized push, substantive commits preserve the changes and their reasons and relevant recovery facts; unfinished briefs, prompts and session state remain in the session. From that push, a draft pull request carries the arc's narrative, branch and base, working rules, lanes, rulings with their authority, acceptance as measured, deferrals and refusals. Neither a commit message nor a pull request authorizes a commit or push. A session resuming without its predecessor's context reads the tree, diff, commits and graph and does not claim that git preserved uncommitted state.
- rule: [#forwardSection] Each description's forward section is the roadmap memo rendered at the branch's head, with the re-entry condition, the owner's explanation of priority and the refused list in the author's words around it. The pull request that completes an entry's selected work removes it from the roadmap in the same change; entries join or move only on the owner's word, and nothing checks either.
- rule: [#reviewHandoff] Proposed Spec edits travel as the change proposal of `spec:consumers.intent-composition.proposal`, checked by recipe 38 against a graph derived at its named base and rendered by recipe 49 under `spec:consumers.intent-composition.proposal.memo`; the memo, including its exact JSON, is posted to the pull request. Moved, unresolved or incomparable scopes are reviewed before application. Findings about code, tests, Packs or other files that request no Spec edit remain ordinary pull request comments, and a review with no proposed Spec edits has no proposal.
- rule: [#openFindings] An unresolved question about intended design lives on its carrying Spec with `decider`, `provisional` and `links`; a deferral is a blocking question with its re-entry `trigger`. A code defect against settled intent remains a code finding until repaired and does not become an invented design question. Proposal disposition is kept in pull request discussion and git, never in the proposal or graph.
- rule: [#acceptanceEvidence] Acceptance links bound examples and their run evidence, and re-derives recipe measurements for the description at the cited commit. The preview's runs page reports external test-file results, not individual verifier verdicts; each report's recorded commit is compared with the preview stamp before it is used as evidence for that preview. The diff page compares with its explicitly supplied base. The description names the measured commit and commands rather than inheriting prior results.
- rule: [#evidenceAssets] Preserve evidence no test or recipe can carry under the evidence path, including prototypes for unbuilt views, rendered screenshots and adopter measurements that need external inputs. Its provenance names the corpus and engine commits, input scope, commands and whether it depicts a proposal or a built view. The pull request links to the assets at an immutable commit; the preview remains a current view, and no asset index carries an execution or review ledger.
- rule: [#canonicalExample] The arc that introduces this convention demonstrates the complete chain with its own roadmap and arc Pack, a real addressed proposal rendered as a memo, a resulting carrier edit or an unresolved keyed question, a stamped preview and diff, and acceptance evidence. The pull request links each part so an adopter can follow the example without a plan or review file.
- rule: [#handbookPointer] The handbook names the roadmap Pack and recipe 53 where it named the current plan, and keeps no stack of plan-status lines.
- rule: [#gateRecord] The repository's roadmap check refuses a handbook that does not name the roadmap Pack or recipe 53 and a roadmap manifest that is missing or does not explicitly state `order: priority`. It retains frozen historical checks until the separate cleanup change, documented green-gate legs and the ban on plan status in the decision registry and glossary. It checks no plan-number ceiling, roadmap content, freshness, work order or review disposition.

## Design

- roadmapPack: `pack:roadmap`, carried by `specs/roadmap.pack.sdp.md`.
- evidencePath: `docs/evidence/<arc>/`, with `<arc>` the capability name; an asset index names only evidence provenance and reproduction, never work status.
- handbookTokens: the gate reads the handbook for `pack:roadmap` and `recipe 53`, and the roadmap manifest's frontmatter for the explicit `order: priority` declaration.
- gateMessages: `AGENTS.md — the handbook does not name the roadmap Pack`, `AGENTS.md — the handbook does not name the roadmap recipe`, `specs/roadmap.pack.sdp.md — the roadmap Pack's manifest is missing`, and `specs/roadmap.pack.sdp.md — the roadmap Pack's manifest does not state order: priority`.

## Verification — reviewed

- Follow the introducing arc's linked example from roadmap entry to intent, proposal memo, disposition and commit-specific evidence without reading a plan or review file.
- Resume from a branch without a draft pull request using its tree, diff, commits and current graph, and identify any context that existed only in the previous session.
- Check the roadmap pointer and manifest refusals with a missing pointer and a missing priority declaration; an empty roadmap, a built entry and preference contrary to dependency create no new finding.

Change 3

Scope: spec:protocol.roadmap-replaces-plans
Request:

Declare the dependency used by the review and acceptance convention.

Relation: declare spec:protocol.roadmap-replaces-plans dependsOn spec:consumers.intent-composition.proposal

    - spec:consumers.intent-composition.proposal

Change 4

Scope: spec:protocol.roadmap-replaces-plans
Request:

Declare the dependency used by the review and acceptance convention.

Relation: declare spec:protocol.roadmap-replaces-plans dependsOn spec:consumers.intent-composition.proposal.memo

    - spec:consumers.intent-composition.proposal.memo

Change 5

Scope: spec:protocol.roadmap-replaces-plans
Request:

Declare the dependency used by the review and acceptance convention.

Relation: declare spec:protocol.roadmap-replaces-plans dependsOn spec:observation.run-evidence

    - spec:observation.run-evidence

Change 6

Scope: spec:model.structural-patterns
Request:

Replace only the unkeyed architecturally significant unit Model term, clarifying the existing warrants-binding test without changing its public-surface or cross-component boundary.
- **architecturally significant unit** — A code unit with exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand to change a system guarantee. Ports, shared data shapes, pipeline stages, decision tables, catalogs, layout policies and adapters may qualify; being exported, re-exporting other units or appearing in an import ranking is insufficient by itself. Its anchor records component membership, a role and references to the designs it answers to. An architectural dependency is declared as `uses`, normally between components; a unit's own `uses` is optional.

Change 7

Scope: spec:protocol.structural-self-binding#rule.criterion
Request:

Replace this entry with the following text.

Replaces: spec:protocol.structural-self-binding#rule.criterion

- rule: [#criterion] The engine applies the structural-patterns model's significance criterion: exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand; being exported alone is insufficient.

Change 8

Scope: spec:decisions.architectural-annotation
Request:

Align only the consequence beginning The engine significance criterion; retain the decision's curated-set boundary and all other consequences.
- consequence: The engine significance criterion requires exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand; being exported alone is insufficient. This clarifies which units warrant binding in the owner-reviewed accepted set, without requiring an anchor for every export or changing any validator. Code never satisfies a decision Spec directly (the binding-grain ruling, MD-37), and an anchor is never pointed at an unfinished Spec to manufacture coverage.

Change 9

Scope: spec:consumers.projections-model.roadmap-views#question.releaseReader
Request:

Replace this entry with the following text.

Replaces: spec:consumers.projections-model.roadmap-views#question.releaseReader

- [blocking #releaseReader] Does a reader need release or baseline views that the roadmap, the recipes and git tags do not serve?
  - decider: owner
  - provisional: Keep release and baseline views deferred; the trigger opens this question and does not authorize either view's build.
  - trigger: the first published release

Change 10

Scope: spec:consumers.spec-studio.diagram-kinds.scoped-architecture#rule.boundary
Request:

Replace this entry with the following text.

Replaces: spec:consumers.spec-studio.diagram-kinds.scoped-architecture#rule.boundary

- rule: [#boundary] Draw only the uses boundary the supplied design-slice architecture answer includes; never traverse it in layout. Its `uses` includes anchored pairs between touched components and pairs with one immediate outside neighbour, marked `outside: true`, as `spec:consumers.design-slice#rule.outsideNeighbors` states. Fold supplied outside neighbours into one `outside scope` box per context and layer while keeping their identities and original unit edges in the text equivalent; never add pairs between two outside components. Planned uses remain separate and never increase an anchored count.

Change 11

Scope: spec:consumers.spec-studio.slice-page#ui.drawingIds
Request:

Replace this entry with the following text.

Replaces: spec:consumers.spec-studio.slice-page#ui.drawingIds

- drawingIds: Both drawings take the Pack id as their subject and use their drawing kind's element-id contract. The dependency text and arrow ids are `diagram.<pack id>.dependencies.text` and `diagram.<pack id>.dependencies.arrow`; scoped architecture uses `diagram.<pack id>.architecture.text` and `diagram.<pack id>.architecture.arrow`. The kinds also own viewport, source, fold and occurrence suffixes; the page invents no singular dependency or scoped-architecture alias.

Change 12

Scope: spec:consumers.spec-studio.lenses.architecture#rule.membershipAndUses
Request:

Add a static component-uses table as the inexpensive alternative to tracing a dense drawing.

Follows: spec:consumers.spec-studio.lenses.architecture#rule.membershipAndUses

- rule: [#usesMatrix] Beside the architecture drawing, offer a native disclosure labelled `Component uses matrix`, built from recipe 17's resolved component rows and anchored component-pair counts. Rows are using components and columns are used components, both in component-id order; a nonzero cell shows the count of original anchored unit edges and links to the using component's Uses detail, while zero reads `0` with the legend `No anchored use recorded`. Use row and column headers with full identities available as text, keep the table in a named local scroll region, and retain it without script and in print. Planned uses, unresolved endpoints and same-component unit uses stay in their existing separate readings and never enter this matrix; the matrix is a table, not another SVG or Mermaid drawing.

Change 13

Scope: spec:consumers.spec-studio.lenses.architecture#ui.architecturePage
Request:

Replace this entry with the following text.

Replaces: spec:consumers.spec-studio.lenses.architecture#ui.architecturePage

- architecturePage: In order, the page title `Architecture`, the summary sentences, the architecture diagram or its fold with one section per context, the `Component uses matrix` disclosure, the `Designed, not built` section, the component details in id order, and the `Unresolved structure` section when it has rows.

Change 14

Scope: spec:consumers.spec-studio.diagram-kinds.maturity-picture#design.bound
Request:

Add a compact default presentation so a uniform distribution does not consume the whole first view.

Follows: spec:consumers.spec-studio.diagram-kinds.maturity-picture#design.bound

- presentation: The Pack page first shows a compact text summary of populated stated-rung and floor pairs, each with its exact count and a link to its complete member list. The full grid is in a native disclosure labelled `Stated readiness by floor reached`, closed initially; counts, lists and disclosure remain available without script, and print opens the grid. A uniform Pack reads in one line before the disclosure, with no quality or completion score.

Change 15

Scope: spec:consumers.spec-studio.diagram-kinds#design.kanban
Request:

Align the catalog's roadmap terminology.

Replaces: spec:consumers.spec-studio.diagram-kinds#design.kanban

- kanban: Defer a separate readiness board because the maturity map shows both stated and reached rungs; refuse workflow states or inferred work order. The roadmap page's HTML lists by need already provide the categorical board over explicit graph values. Re-enter for Mermaid kanban export when a reader needs to copy that board.

Change 16

Scope: spec:protocol.significant-units-review
Request:

Settle decoder membership by responsibility; replace the working tree's decoderBoundary rule if present, otherwise add this rule after roleMeaning. Do not condition the choice on an absence of layer crossings.
- rule: [#decoderBoundary] Example-space decoding belongs to the reader component because it interprets graph-owned vocabulary and bound points for reader and code-generation consumers. Its file may stay under notation; membership follows the responsibility. Reader uses notation for the slot codec, and code generation uses reader for decoding while retaining its direct notation dependency. Review the resulting crossings against declared architecture constraints; neither a crossing nor a lawful uses cycle by itself selects a different membership.

Change 17

Scope: spec:consumers.spec-studio.roadmap-page#rule.board
Request:

Add a concise explanation of the derived needs beside the board.

Follows: spec:consumers.spec-studio.roadmap-page#rule.board

- rule: [#readingLegend] Beside the board, explain: `To state means the structural floor permits ready; a person still decides whether to state it. Built means every work Spec in the entry's refinement scope states ready and has an implementation binding; it reports neither a passing test nor deployment. The entry's own readiness is shown separately.`

Change 18

Scope: spec:consumers.roadmap.memo
Request:

Replace only the opening narrative paragraph; preserve current readiness, relations and need terminology.
A pull request description ends with a forward section: the next work in priority order, what waits on the owner and what is deferred until its trigger. The roadmap memo renders that reading from the graph at the branch's head. It copies each entry's purpose from its intent and derives its dependency reach; the owner's reason for the priority, the next pull request's re-entry condition and the durable refused list stay the description author's words around it.

Change 19

Scope: spec:consumers.roadmap.memo#rule.whyNow
Request:

Replace this entry with the following text.

Replaces: spec:consumers.roadmap.memo#rule.whyNow

- rule: [#whyNow] The Purpose and reach cell copies the entry's intent problem, or its outcome when no problem is stated, and reports how many Specs outside its scope rest on it and how many of its parts are ready to build now. These values explain purpose and graph structure; they do not derive why the owner selected this entry or its priority. The description's author may state that reason around the memo, and the memo adds no date, estimate or assignment.

Change 20

Scope: spec:consumers.roadmap.memo#rule.authorsOwn
Request:

Replace this entry with the following text.

Replaces: spec:consumers.roadmap.memo#rule.authorsOwn

- rule: [#authorsOwn] The memo derives no priority rationale and carries no re-entry condition or refused list; the description's author writes those around it.

Change 21

Scope: spec:consumers.roadmap.memo#design.memoDesign
Request:

Rename the derived column Purpose and reach without changing its source values or other formatting.

Replaces: spec:consumers.roadmap.memo#design.memoDesign

- memoDesign: the section `### To design` holds a table with the columns `Place`, `Entry`, `Next` and `Purpose and reach`; `Next` reads, for at most three of the work rows with the entry's need, the entry's own first and the rest in Spec-id order, the row's id as a code span or `itself` for the entry's own, its stated rung and stated next rung as code spans joined by ` → `, then `held by` and each clause id followed by its targets as code spans in parentheses, or `nothing holds it`; then `and <n> more parts to design` when rows are left out; then `blocked by` and each blocking question's address as a code span, or its Spec id when unkeyed; then `decided by` and each decision below `ready` as a code span with its stated rung; the parts joined by `; `.

Change 22

Scope: spec:consumers.roadmap.memo#design.memoState
Request:

Rename the derived column Purpose and reach without changing its source values or other formatting.

Replaces: spec:consumers.roadmap.memo#design.memoState

- memoState: the section `### To state` holds a table with the columns `Place`, `Entry`, `Earlier waiting statements` and `Purpose and reach`; the third column reads `No preceding waiting statement in the statement queue.` when the entry's `earlierStatements` is empty, and otherwise `in this entry` followed by those inside it as code spans, `on the roadmap` followed by those at another entry as code spans each with `(place <n>)`, and `<n> outside the roadmap`, each part present only when it holds a row and the parts joined by `; `.

Change 23

Scope: spec:consumers.roadmap.memo#design.memoBuild
Request:

Rename the derived column Purpose and reach without changing its source values or other formatting.

Replaces: spec:consumers.roadmap.memo#design.memoBuild

- memoBuild: the section `### To build` holds a table with the columns `Place`, `Entry`, `Purpose and reach` and `Rests on`; `Rests on` lists each Spec the entry rests on as a code span with its need, or reads `nothing unbuilt`.

Change 24

Scope: spec:consumers.roadmap.memo#design.memoEntry
Request:

Rename the derived column Purpose and reach without changing its source values or other formatting.

Replaces: spec:consumers.roadmap.memo#design.memoEntry

- memoEntry: an `Entry` cell is the entry's title followed by its id as a code span; the `Purpose and reach` cell is the intent line, ending with a full stop when it ends with none, then `Waited on by <n>.` when Specs wait on it and `<n> of its parts ready to build now.` for an entry not to build that has such parts.

Change 25

Scope: spec:consumers.roadmap.memo#design.memoHead
Request:

Add the same binding and human-statement explanation to a standalone memo.

Replaces: spec:consumers.roadmap.memo#design.memoHead

- memoHead: the memo opens with the line `## The next work, from the roadmap`, a blank line, the line `Roadmap: ` followed by the Pack's title and its id as a code span, a blank line, each paragraph of the framing as authored followed by a blank line, and for a reading-order Pack the line `This Pack's order is reading order, not a stated priority.` and a blank line. Before the framing, write `To state means the structural floor permits ready and a person still decides. Built reports readiness statements and implementation bindings across the entry's work, not passing tests or deployment.`, followed by a blank line.

The proposal

{
  "schema": "sdp-proposal/1",
  "base": "2dc5c44cb4d6a162be6d8fb49c33451f5601a898",
  "reason": "Make the retirement precedent usable, align significance and roadmap wording, and resolve drawing contracts before the delegated build.",
  "changes": [
    {
      "scope": [
        "spec:decisions.roadmap-over-plans"
      ],
      "request": "Replace this Spec's body (after its existing frontmatter) with the exact text below; preserve its current envelope, readiness and relations, and reconcile the moved-scope report before applying.",
      "text": "# The Protocol replaces plan and review files with graph intent and pull request records\n\nThe roadmap selects upcoming work, carrying Specs state its intent, and git keeps changes to that intent. A pull request explains the arc and presents its review and evidence. Retiring plan and review files removes competing records; it does not remove durable evidence.\n\n## Intent\n\n- outcome: Give the Protocol one home for each planning and review concern while keeping its delivery narrative and evidence recoverable.\n\n## Decision\n\n- context: The roadmap gives advisory priority a graph home, and the pull request description already carries an arc's narrative, rulings and measured acceptance. The owner has selected retirement of both plan and review files, with their removal or archival in a separate cleanup change.\n- decision: The Protocol stops using `plans/` and `reviews/` for new delivery records. Its roadmap Pack holds advisory priority; its arc Packs group the carrying Specs; those Specs own intent, rulings and open questions, with triggers on deferrals. Before the first authorized push, substantive git commits record changes and the reasons and recovery facts needed to understand them, while unfinished session material remains in the session. From the first authorized push, a draft pull request carries the arc's narrative, branch and base, working rules, lanes, rulings with their authority, measured acceptance and forward section. Reviews hand off proposed Spec edits as checked change proposals and their rendered memos on the pull request; findings outside that schema travel as ordinary pull request comments. No replacement plan file, review file or review-status primitive is introduced.\n- rationale: Hard to reverse: agents, the handbook and a repository check change their entry point from the current plan to the roadmap. Surprising without context: both historical folders cease receiving delivery records. A real trade-off: the graph and git supply durable intent and changes without a second working record, while the pull request supplies the human narrative and separately preserved evidence supplies what a live preview cannot retain.\n- alternative: Keep a record file until the first push: this recreates the review-file lane the owner has retired and leaves another record to reconcile.\n- alternative: Put execution history, review approval or priority rationale into new Spec fields: these are not system truth, and git and the pull request already carry the history and explanation.\n- alternative: Keep only links to the latest preview or expiring CI artifacts: a later run can replace the evidence a historical description cites.\n- consequence: The handbook names `pack:roadmap` and recipe 53. The repository's roadmap check checks that pointer and the manifest's explicit priority order, retaining frozen historical assertions until the separate cleanup change and retaining its green-gate and semantic-surface checks. It adds no plan-number ceiling or check of roadmap content, work order, freshness or review disposition.\n- consequence: The proposal schema continues to scope Specs only. A review finding that changes no Spec does not acquire an invented Spec scope, and a review with no proposed Spec changes needs no empty proposal.\n- consequence: Accepted design changes are ordinary carrier edits; an unresolved design question lives on its carrying Spec with a decider, links and a provisional reading, and a deferred question is blocking with a trigger. Acceptance and rejection of a proposal remain pull request discussion and git history, never proposal fields or graph facts.\n- consequence: Tests and recipes carry repeatable evidence. A preview is the current human view, with its stamp, diff and externally supplied runs; a preview URL is not an immutable acceptance record. Evidence no test or recipe can carry is committed under `docs/evidence/<arc>/`, named for the capability, with provenance and reproduction instructions and commit-pinned links from the pull request; it carries no task ledger, ruling table or review disposition.\n- consequence: Commit and push authority comes from the owner's instruction and is not created by this record convention. Git cannot preserve uncommitted session state; a later session reconstructs current work from the tree, diff, commits and graph rather than claiming a missing session was recovered.\n- consequence: Existing plans, reviews and their assets remain available until the dedicated cleanup change removes or archives them and updates their historical checks and links. This decision imposes no record convention on an adopter.\n"
    },
    {
      "scope": [
        "spec:protocol.roadmap-replaces-plans"
      ],
      "request": "Replace this Spec's body (after its existing frontmatter) with the exact text below; preserve its current envelope, readiness and relations, and reconcile the moved-scope report before applying.",
      "text": "# The Protocol reads work from its roadmap and records delivery through git and pull requests\n\nAn arc's Pack groups its intent; its carrying Specs state the design and decisions. The roadmap selects upcoming work. Git preserves changes and the pull request explains them, with review handoffs and evidence beside the explanation.\n\n## Intent\n\n- actor: A person or agent opening, reviewing or resuming the Protocol's work.\n- problem: Plan and review files duplicate intent, narrative and evidence already carried elsewhere and make sessions reconcile competing records.\n- outcome: Make the roadmap, carrying Specs, git and pull request sufficient to choose, review and recover work without a new plan or review file.\n\n## Behavior\n\n- rule: [#readsRoadmap] An agent opening the Protocol's next work runs recipe 53 over the roadmap Pack the handbook names and follows each entry to its Packs and carrying Specs.\n- rule: [#oneRoadmap] The Protocol keeps one living roadmap Pack, edited in place. Its owner selects captured work for the upcoming pull requests; landing a capture does not add it. Entries leave by an ordinary manifest edit when the selected work is complete or no longer belongs among the next work, and move on the owner's word, with git as history.\n- rule: [#plansFrozen] The Protocol adds no delivery record under `plans/` or `reviews/`. Existing material remains historical evidence until a separate cleanup change removes or archives it and updates its links and historical checks.\n- rule: [#executionRecord] Before the first authorized push, substantive commits preserve the changes and their reasons and relevant recovery facts; unfinished briefs, prompts and session state remain in the session. From that push, a draft pull request carries the arc's narrative, branch and base, working rules, lanes, rulings with their authority, acceptance as measured, deferrals and refusals. Neither a commit message nor a pull request authorizes a commit or push. A session resuming without its predecessor's context reads the tree, diff, commits and graph and does not claim that git preserved uncommitted state.\n- rule: [#forwardSection] Each description's forward section is the roadmap memo rendered at the branch's head, with the re-entry condition, the owner's explanation of priority and the refused list in the author's words around it. The pull request that completes an entry's selected work removes it from the roadmap in the same change; entries join or move only on the owner's word, and nothing checks either.\n- rule: [#reviewHandoff] Proposed Spec edits travel as the change proposal of `spec:consumers.intent-composition.proposal`, checked by recipe 38 against a graph derived at its named base and rendered by recipe 49 under `spec:consumers.intent-composition.proposal.memo`; the memo, including its exact JSON, is posted to the pull request. Moved, unresolved or incomparable scopes are reviewed before application. Findings about code, tests, Packs or other files that request no Spec edit remain ordinary pull request comments, and a review with no proposed Spec edits has no proposal.\n- rule: [#openFindings] An unresolved question about intended design lives on its carrying Spec with `decider`, `provisional` and `links`; a deferral is a blocking question with its re-entry `trigger`. A code defect against settled intent remains a code finding until repaired and does not become an invented design question. Proposal disposition is kept in pull request discussion and git, never in the proposal or graph.\n- rule: [#acceptanceEvidence] Acceptance links bound examples and their run evidence, and re-derives recipe measurements for the description at the cited commit. The preview's runs page reports external test-file results, not individual verifier verdicts; each report's recorded commit is compared with the preview stamp before it is used as evidence for that preview. The diff page compares with its explicitly supplied base. The description names the measured commit and commands rather than inheriting prior results.\n- rule: [#evidenceAssets] Preserve evidence no test or recipe can carry under the evidence path, including prototypes for unbuilt views, rendered screenshots and adopter measurements that need external inputs. Its provenance names the corpus and engine commits, input scope, commands and whether it depicts a proposal or a built view. The pull request links to the assets at an immutable commit; the preview remains a current view, and no asset index carries an execution or review ledger.\n- rule: [#canonicalExample] The arc that introduces this convention demonstrates the complete chain with its own roadmap and arc Pack, a real addressed proposal rendered as a memo, a resulting carrier edit or an unresolved keyed question, a stamped preview and diff, and acceptance evidence. The pull request links each part so an adopter can follow the example without a plan or review file.\n- rule: [#handbookPointer] The handbook names the roadmap Pack and recipe 53 where it named the current plan, and keeps no stack of plan-status lines.\n- rule: [#gateRecord] The repository's roadmap check refuses a handbook that does not name the roadmap Pack or recipe 53 and a roadmap manifest that is missing or does not explicitly state `order: priority`. It retains frozen historical checks until the separate cleanup change, documented green-gate legs and the ban on plan status in the decision registry and glossary. It checks no plan-number ceiling, roadmap content, freshness, work order or review disposition.\n\n## Design\n\n- roadmapPack: `pack:roadmap`, carried by `specs/roadmap.pack.sdp.md`.\n- evidencePath: `docs/evidence/<arc>/`, with `<arc>` the capability name; an asset index names only evidence provenance and reproduction, never work status.\n- handbookTokens: the gate reads the handbook for `pack:roadmap` and `recipe 53`, and the roadmap manifest's frontmatter for the explicit `order: priority` declaration.\n- gateMessages: `AGENTS.md — the handbook does not name the roadmap Pack`, `AGENTS.md — the handbook does not name the roadmap recipe`, `specs/roadmap.pack.sdp.md — the roadmap Pack's manifest is missing`, and `specs/roadmap.pack.sdp.md — the roadmap Pack's manifest does not state order: priority`.\n\n## Verification — reviewed\n\n- Follow the introducing arc's linked example from roadmap entry to intent, proposal memo, disposition and commit-specific evidence without reading a plan or review file.\n- Resume from a branch without a draft pull request using its tree, diff, commits and current graph, and identify any context that existed only in the previous session.\n- Check the roadmap pointer and manifest refusals with a missing pointer and a missing priority declaration; an empty roadmap, a built entry and preference contrary to dependency create no new finding.\n"
    },
    {
      "scope": [
        "spec:protocol.roadmap-replaces-plans"
      ],
      "request": "Declare the dependency used by the review and acceptance convention.",
      "relation": {
        "action": "declare",
        "from": "spec:protocol.roadmap-replaces-plans",
        "type": "dependsOn",
        "target": "spec:consumers.intent-composition.proposal"
      },
      "text": "    - spec:consumers.intent-composition.proposal"
    },
    {
      "scope": [
        "spec:protocol.roadmap-replaces-plans"
      ],
      "request": "Declare the dependency used by the review and acceptance convention.",
      "relation": {
        "action": "declare",
        "from": "spec:protocol.roadmap-replaces-plans",
        "type": "dependsOn",
        "target": "spec:consumers.intent-composition.proposal.memo"
      },
      "text": "    - spec:consumers.intent-composition.proposal.memo"
    },
    {
      "scope": [
        "spec:protocol.roadmap-replaces-plans"
      ],
      "request": "Declare the dependency used by the review and acceptance convention.",
      "relation": {
        "action": "declare",
        "from": "spec:protocol.roadmap-replaces-plans",
        "type": "dependsOn",
        "target": "spec:observation.run-evidence"
      },
      "text": "    - spec:observation.run-evidence"
    },
    {
      "scope": [
        "spec:model.structural-patterns"
      ],
      "request": "Replace only the unkeyed architecturally significant unit Model term, clarifying the existing warrants-binding test without changing its public-surface or cross-component boundary.",
      "text": "- **architecturally significant unit** — A code unit with exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand to change a system guarantee. Ports, shared data shapes, pipeline stages, decision tables, catalogs, layout policies and adapters may qualify; being exported, re-exporting other units or appearing in an import ranking is insufficient by itself. Its anchor records component membership, a role and references to the designs it answers to. An architectural dependency is declared as `uses`, normally between components; a unit's own `uses` is optional."
    },
    {
      "scope": [
        "spec:protocol.structural-self-binding#rule.criterion"
      ],
      "request": "Replace this entry with the following text.",
      "text": "- rule: [#criterion] The engine applies the structural-patterns model's significance criterion: exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand; being exported alone is insufficient.",
      "replaces": "spec:protocol.structural-self-binding#rule.criterion"
    },
    {
      "scope": [
        "spec:decisions.architectural-annotation"
      ],
      "request": "Align only the consequence beginning The engine significance criterion; retain the decision's curated-set boundary and all other consequences.",
      "text": "- consequence: The engine significance criterion requires exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand; being exported alone is insufficient. This clarifies which units warrant binding in the owner-reviewed accepted set, without requiring an anchor for every export or changing any validator. Code never satisfies a decision Spec directly (the binding-grain ruling, MD-37), and an anchor is never pointed at an unfinished Spec to manufacture coverage."
    },
    {
      "scope": [
        "spec:consumers.projections-model.roadmap-views#question.releaseReader"
      ],
      "request": "Replace this entry with the following text.",
      "text": "- [blocking #releaseReader] Does a reader need release or baseline views that the roadmap, the recipes and git tags do not serve?\n  - decider: owner\n  - provisional: Keep release and baseline views deferred; the trigger opens this question and does not authorize either view's build.\n  - trigger: the first published release",
      "replaces": "spec:consumers.projections-model.roadmap-views#question.releaseReader"
    },
    {
      "scope": [
        "spec:consumers.spec-studio.diagram-kinds.scoped-architecture#rule.boundary"
      ],
      "request": "Replace this entry with the following text.",
      "text": "- rule: [#boundary] Draw only the uses boundary the supplied design-slice architecture answer includes; never traverse it in layout. Its `uses` includes anchored pairs between touched components and pairs with one immediate outside neighbour, marked `outside: true`, as `spec:consumers.design-slice#rule.outsideNeighbors` states. Fold supplied outside neighbours into one `outside scope` box per context and layer while keeping their identities and original unit edges in the text equivalent; never add pairs between two outside components. Planned uses remain separate and never increase an anchored count.",
      "replaces": "spec:consumers.spec-studio.diagram-kinds.scoped-architecture#rule.boundary"
    },
    {
      "scope": [
        "spec:consumers.spec-studio.slice-page#ui.drawingIds"
      ],
      "request": "Replace this entry with the following text.",
      "text": "- drawingIds: Both drawings take the Pack id as their subject and use their drawing kind's element-id contract. The dependency text and arrow ids are `diagram.<pack id>.dependencies.text` and `diagram.<pack id>.dependencies.arrow`; scoped architecture uses `diagram.<pack id>.architecture.text` and `diagram.<pack id>.architecture.arrow`. The kinds also own viewport, source, fold and occurrence suffixes; the page invents no singular dependency or scoped-architecture alias.",
      "replaces": "spec:consumers.spec-studio.slice-page#ui.drawingIds"
    },
    {
      "scope": [
        "spec:consumers.spec-studio.lenses.architecture#rule.membershipAndUses"
      ],
      "request": "Add a static component-uses table as the inexpensive alternative to tracing a dense drawing.",
      "text": "- rule: [#usesMatrix] Beside the architecture drawing, offer a native disclosure labelled `Component uses matrix`, built from recipe 17's resolved component rows and anchored component-pair counts. Rows are using components and columns are used components, both in component-id order; a nonzero cell shows the count of original anchored unit edges and links to the using component's Uses detail, while zero reads `0` with the legend `No anchored use recorded`. Use row and column headers with full identities available as text, keep the table in a named local scroll region, and retain it without script and in print. Planned uses, unresolved endpoints and same-component unit uses stay in their existing separate readings and never enter this matrix; the matrix is a table, not another SVG or Mermaid drawing.",
      "follows": "spec:consumers.spec-studio.lenses.architecture#rule.membershipAndUses"
    },
    {
      "scope": [
        "spec:consumers.spec-studio.lenses.architecture#ui.architecturePage"
      ],
      "request": "Replace this entry with the following text.",
      "text": "- architecturePage: In order, the page title `Architecture`, the summary sentences, the architecture diagram or its fold with one section per context, the `Component uses matrix` disclosure, the `Designed, not built` section, the component details in id order, and the `Unresolved structure` section when it has rows.",
      "replaces": "spec:consumers.spec-studio.lenses.architecture#ui.architecturePage"
    },
    {
      "scope": [
        "spec:consumers.spec-studio.diagram-kinds.maturity-picture#design.bound"
      ],
      "request": "Add a compact default presentation so a uniform distribution does not consume the whole first view.",
      "text": "- presentation: The Pack page first shows a compact text summary of populated stated-rung and floor pairs, each with its exact count and a link to its complete member list. The full grid is in a native disclosure labelled `Stated readiness by floor reached`, closed initially; counts, lists and disclosure remain available without script, and print opens the grid. A uniform Pack reads in one line before the disclosure, with no quality or completion score.",
      "follows": "spec:consumers.spec-studio.diagram-kinds.maturity-picture#design.bound"
    },
    {
      "scope": [
        "spec:consumers.spec-studio.diagram-kinds#design.kanban"
      ],
      "request": "Align the catalog's roadmap terminology.",
      "text": "- kanban: Defer a separate readiness board because the maturity map shows both stated and reached rungs; refuse workflow states or inferred work order. The roadmap page's HTML lists by need already provide the categorical board over explicit graph values. Re-enter for Mermaid kanban export when a reader needs to copy that board.",
      "replaces": "spec:consumers.spec-studio.diagram-kinds#design.kanban"
    },
    {
      "scope": [
        "spec:protocol.significant-units-review"
      ],
      "request": "Settle decoder membership by responsibility; replace the working tree's decoderBoundary rule if present, otherwise add this rule after roleMeaning. Do not condition the choice on an absence of layer crossings.",
      "text": "- rule: [#decoderBoundary] Example-space decoding belongs to the reader component because it interprets graph-owned vocabulary and bound points for reader and code-generation consumers. Its file may stay under notation; membership follows the responsibility. Reader uses notation for the slot codec, and code generation uses reader for decoding while retaining its direct notation dependency. Review the resulting crossings against declared architecture constraints; neither a crossing nor a lawful uses cycle by itself selects a different membership."
    },
    {
      "scope": [
        "spec:consumers.spec-studio.roadmap-page#rule.board"
      ],
      "request": "Add a concise explanation of the derived needs beside the board.",
      "text": "- rule: [#readingLegend] Beside the board, explain: `To state means the structural floor permits ready; a person still decides whether to state it. Built means every work Spec in the entry's refinement scope states ready and has an implementation binding; it reports neither a passing test nor deployment. The entry's own readiness is shown separately.`",
      "follows": "spec:consumers.spec-studio.roadmap-page#rule.board"
    },
    {
      "scope": [
        "spec:consumers.roadmap.memo"
      ],
      "request": "Replace only the opening narrative paragraph; preserve current readiness, relations and need terminology.",
      "text": "A pull request description ends with a forward section: the next work in priority order, what waits on the owner and what is deferred until its trigger. The roadmap memo renders that reading from the graph at the branch's head. It copies each entry's purpose from its intent and derives its dependency reach; the owner's reason for the priority, the next pull request's re-entry condition and the durable refused list stay the description author's words around it."
    },
    {
      "scope": [
        "spec:consumers.roadmap.memo#rule.whyNow"
      ],
      "request": "Replace this entry with the following text.",
      "text": "- rule: [#whyNow] The Purpose and reach cell copies the entry's intent problem, or its outcome when no problem is stated, and reports how many Specs outside its scope rest on it and how many of its parts are ready to build now. These values explain purpose and graph structure; they do not derive why the owner selected this entry or its priority. The description's author may state that reason around the memo, and the memo adds no date, estimate or assignment.",
      "replaces": "spec:consumers.roadmap.memo#rule.whyNow"
    },
    {
      "scope": [
        "spec:consumers.roadmap.memo#rule.authorsOwn"
      ],
      "request": "Replace this entry with the following text.",
      "text": "- rule: [#authorsOwn] The memo derives no priority rationale and carries no re-entry condition or refused list; the description's author writes those around it.",
      "replaces": "spec:consumers.roadmap.memo#rule.authorsOwn"
    },
    {
      "scope": [
        "spec:consumers.roadmap.memo#design.memoDesign"
      ],
      "request": "Rename the derived column Purpose and reach without changing its source values or other formatting.",
      "text": "- memoDesign: the section `### To design` holds a table with the columns `Place`, `Entry`, `Next` and `Purpose and reach`; `Next` reads, for at most three of the work rows with the entry's need, the entry's own first and the rest in Spec-id order, the row's id as a code span or `itself` for the entry's own, its stated rung and stated next rung as code spans joined by ` → `, then `held by` and each clause id followed by its targets as code spans in parentheses, or `nothing holds it`; then `and <n> more parts to design` when rows are left out; then `blocked by` and each blocking question's address as a code span, or its Spec id when unkeyed; then `decided by` and each decision below `ready` as a code span with its stated rung; the parts joined by `; `.",
      "replaces": "spec:consumers.roadmap.memo#design.memoDesign"
    },
    {
      "scope": [
        "spec:consumers.roadmap.memo#design.memoState"
      ],
      "request": "Rename the derived column Purpose and reach without changing its source values or other formatting.",
      "text": "- memoState: the section `### To state` holds a table with the columns `Place`, `Entry`, `Earlier waiting statements` and `Purpose and reach`; the third column reads `No preceding waiting statement in the statement queue.` when the entry's `earlierStatements` is empty, and otherwise `in this entry` followed by those inside it as code spans, `on the roadmap` followed by those at another entry as code spans each with `(place <n>)`, and `<n> outside the roadmap`, each part present only when it holds a row and the parts joined by `; `.",
      "replaces": "spec:consumers.roadmap.memo#design.memoState"
    },
    {
      "scope": [
        "spec:consumers.roadmap.memo#design.memoBuild"
      ],
      "request": "Rename the derived column Purpose and reach without changing its source values or other formatting.",
      "text": "- memoBuild: the section `### To build` holds a table with the columns `Place`, `Entry`, `Purpose and reach` and `Rests on`; `Rests on` lists each Spec the entry rests on as a code span with its need, or reads `nothing unbuilt`.",
      "replaces": "spec:consumers.roadmap.memo#design.memoBuild"
    },
    {
      "scope": [
        "spec:consumers.roadmap.memo#design.memoEntry"
      ],
      "request": "Rename the derived column Purpose and reach without changing its source values or other formatting.",
      "text": "- memoEntry: an `Entry` cell is the entry's title followed by its id as a code span; the `Purpose and reach` cell is the intent line, ending with a full stop when it ends with none, then `Waited on by <n>.` when Specs wait on it and `<n> of its parts ready to build now.` for an entry not to build that has such parts.",
      "replaces": "spec:consumers.roadmap.memo#design.memoEntry"
    },
    {
      "scope": [
        "spec:consumers.roadmap.memo#design.memoHead"
      ],
      "request": "Add the same binding and human-statement explanation to a standalone memo.",
      "text": "- memoHead: the memo opens with the line `## The next work, from the roadmap`, a blank line, the line `Roadmap: ` followed by the Pack's title and its id as a code span, a blank line, each paragraph of the framing as authored followed by a blank line, and for a reading-order Pack the line `This Pack's order is reading order, not a stated priority.` and a blank line. Before the framing, write `To state means the structural floor permits ready and a person still decides. Built reports readiness statements and implementation bindings across the entry's work, not passing tests or deployment.`, followed by a blank line.",
      "replaces": "spec:consumers.roadmap.memo#design.memoHead"
    }
  ]
}

@darko-mijic

Copy link
Copy Markdown
Contributor Author

Rulings on the advisory review

The executing thread's rulings after reading both advisors, on the owner's delegation. The owner's
own rulings (relayed by the coordinating session) are final and are not re-opened here: the
priority field (MD-46), plans retired (MD-47) with the record before the first push being the
branch itself and the draft PR opened at the first coherent commit, epics of any kind (MD-48), the
accepted change table with the decoder condition, the words, and release views deferred. The
changes below are applied as ordinary carrier edits; each proposal change is named by its recipe 38
index.

Item Ruling Applied from
Plans and reviews One decision carries both: spec:decisions.roadmap-over-plans broadens to plan and review files. Review findings against Specs travel as a change proposal checked by recipe 38 and posted as recipe 49's memo; findings against code or other files are pull request comments; an open finding becomes an open question with decider, provisional and links; a proposal's base is the branch-head commit read, never the preview's merge commit Opus 0 to 16, Astra 0 to 4, reconciled with the owner's record ruling
Evidence no test or recipe carries Committed on the arc's branch with its commands, linked from the description at that commit, and removed before merge; the merge-commit history and the pull request's head ref keep the links working, and no folder accumulates. Opus over Astra's docs/evidence/, which would start a new store Opus, item 2
The significance criterion Drift repair: the Model term, #rule.criterion, the glossary row and the architectural-annotation decision's consequence sentence change together to "a contract or responsibility a designer or builder must understand; export status or import rank alone is insufficient". The boundary is unchanged, so no new decision and no registry row Opus 21 to 23, Astra 5 to 7
The decoder The owner's condition stands: the decoder joins the reader only if recipe 32 and the self-binding tests show no added layer crossing; Astra's responsibility-only rule is not applied. Its reason lands in the Spec when wave 1 measures it not applied: Astra 15, Opus 24
The annotation review's durable content Lands in the anchors before reviews/ retires: each unit's responsibility in its label, each component's reading guidance in its anchor Opus, item 5 (wave 1)
Roadmap entry scope The capability map, slice and roadmap pages refine their readings, and legibility and edge routing refine the diagram kinds, so an entry reads built only when its pages, labels and routing are Opus 26 to 30
Shared Studio contracts Aligned before the pages are built: five lenses with Capabilities after Packs, the epic filter, recipes 52 to 55 in the recipe answers, a slice page per Pack, Roadmap in the navigation after the lenses Opus 31 to 40, lane S's page-set edits
Drawing contracts The scoped architecture keeps the slice answer's marked outside pairs and traverses no further; the slice page uses the drawing kinds' own element-id segments Astra 9, 10
Dense drawings A component uses table, rows using and columns used, beside the architecture drawing; the dependency drawing always folds its boundary to the outside Specs that hold a member; a maturity map whose members share one cell reads as one sentence with the grid in a closed disclosure Opus 41 to 46, Astra 11 to 13
The memo's column "Why now" becomes "Purpose and reach": an entry's own intent and structural reach, never the owner's reason for its place, which stays in the author's own words around the memo Astra 17 to 24
Words on the page The board and the memo say that "to state" means the floor allows ready and a person still judges it, and "built" means implementation bindings across the entry's work, not passing tests or a deployment Astra 16, 24
Smaller items The release views' question keeps its trigger; the catalog's kanban row uses the roadmap's words; the slice term question closes with the guidance label Astra 8, 14; Opus 25
Already done by the rulings The rename to "need", the epic-kind decision's text Opus 17 to 20
The roadmap at merge The owner is asked to select the next arc's entries before close, so the merged roadmap shows real upcoming work beyond this PR's own Opus, item 10
An adopter's example A small roadmap in the worked example and an upgrade-guide section on moving planning and review records into the graph Opus, item 16 (wave 3)

darko-mijic and others added 22 commits October 22, 2026 14:26
…ignificant-units panel, the maturity picture, the requirement drawing

Conflicts resolved as the union of all four lanes. Two lanes added a text
equivalent to the diagram contract with different shapes: the panels'
original boxes and edges keep the name textEquivalent, and the capability
page's pre-rendered refinement text is renamed textEquivalentHtml at its one
producer. The Mermaid source disclosure takes a supplied source first, then
an explanation, then the lane kinds. CSS keeps the print rule for maturity
sources and every lane's block. The oracle keeps every lane's anchors,
comment anchors and accepted units; frozen totals carry all four lanes'
deltas and the pinned warnings are the five no lane binds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t drawings

- The dependency drawing exports Mermaid as `flowchart TB`, so each member
  points down at what it rests on, matching the deepest-first depth bands.
- The scoped-architecture legend names uses (anchored), plans to use
  (declared) and realizes (anchored) when present. Uses and planned uses
  alone keep one relation family and no per-edge label; a realization link
  makes the families mixed, so each link carries its label and a supplied
  legend now keeps any edge-key list beside it.
- The requirement drawing gives examples and decision records, which code
  never satisfies, no satisfying-binding label.
- The perspectives narrative names the five lenses, and the Studio skill
  routes to the capabilities, roadmap and slice pages.

Each carrier entry changes with its oracle transcription.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pack: pack:roadmaps-and-slices-v1. Base: 08b59e2. Owner working rules: build this lane test-first, commit coherent units after their gates, never push or merge, never use git stash, leave .omo and plans alone. The executing thread owns arc closure.

Replace current-plan selection with the handbook roadmap pointers and priority manifest check. Teach graph-based planning, review records, design rounds and epic organization. Targeted gate: 250 tests passed across self-hosting graph, handbook gate, skills and upgrade kit; touched TypeScript and script lint passed.
Add a priority Pack over order placement and the order vocabulary. Pin the complete roadmap answer and forward memo, and transcribe the additional Pack and membership edges in the checkout golden. Recipe and checkout suites: 392 tests passed. Mutation of the expected need failed as required and was restored.
The six shipped readings and shared static drawing core collectively realize the catalog. Move its core references to satisfies, bind its six drawing sites and a verifier for drawn, equivalent, deferred and refused families. Update the hand-transcribed oracle and remove the resolved gap. Diagram and graph suites: 108 tests passed; the catalog mutation failed as required and was restored.
Narrow the checkout lookup to a Pack and keep catalog choice keys in a tuple. Typecheck and the 10 checkout/catalog tests pass.
Review the golden changes for one additional Pack and its two membership edges. Keep reader summaries and per-Pack claim checks valid for both Packs. All 115 reader, schema, census, Design Review and Mermaid tests pass; typecheck passes.
Update checkout counts and page counts for its additional Pack, and assert the two resolved self-hosting gaps are absent. Consolidate the session recipe guidance and clarify when a review carries no proposal. The handbook and 168 skill tests pass, as do all 100 isolated CLI tests; the duplicate roadmap-pointer probe failed before the guidance was consolidated.
Align the upgrade guide's pinned section order with its epic and roadmap adoption guidance.

Proposal base: a9e4c2b. Restore the curation exception and identity guidance, commit safeguards, and adopter wording. Replace captured recipe snapshots with transcribed expectations and strengthen scoped handbook and catalog checks.

Validation: npm run check passed on this tree, including 3,253 tests, self-hosting and example projection checks, and preflight.
… entry point

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pull request that completes an entry's selected work removes it from
the roadmap in the same change (MD-47). Recipe 53 read all six of this
arc's entries as built, so they leave pack:roadmap; the next PR's two
captures and the composed-intent model the build backlog holds remain.

PR 36's screenshots sit under evidence/pr36/ with the commands that made
them; the description links them at this commit, and they are removed
before merge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owner's dedicated cleanup removes plans/, reviews/ and superseded
concept material after this PR, following MD-47's precedent, once the
durable content they still hold has moved into the graph. It is captured
at idea, with that inventory as its blocking question, and leads the
roadmap ahead of the two Studio captures and the composed-intent model.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner's working rules: build lane F2 on p47/f2-roadmap from
f9e3a10 for
pack:roadmaps-and-slices-v1. Work only in this lane worktree, test first,
keep the green gate green, commit coherent units, and never push, merge,
stash or touch .omo/. Keep plans and reviews frozen.

Preserve unresolved manifest members and all original roadmap places,
carry advisory priority into Pack and vault views, read the roadmap gate
from the generated graph, and escape memo HTML outside code spans.
Align the upgrade, evidence, role and proposal guidance with the close
rulings, updating carrying Specs and their independent oracle rows.

Validation: npm run check passed; focused recipe and regression suites
passed; an expected-place mutation failed and was restored.
Owner-authorized lane p47/f1-drawings from f9e3a10 for
pack:roadmaps-and-slices-v1. Working rules: build the ready Specs test-first,
keep npm run check green, update carrying intent and its oracle together,
commit coherent work in this worktree, never push or merge, never stash,
and leave .omo and the original platform checkout untouched.

Keep examples and outside intent in honest requirement bands, combine
parallel relations, fold dense drawings, escape Mermaid backticks, and
render question prose. Reuse routing work, recipe answers and page lookups.
Share heavy Studio fixtures through beforeAll, index fragment checks, and
cancel native filter resets before browser defaults can undo them.

Validation: npm run check; both-corpus build and drawing measurements;
byte-identical performance comparison; offline Mermaid parser; native
browser reset probe and inspected 1440-pixel captures.
Reason: align the roadmap decision with its rules, bind the Pack-page
regression, and cover missing graph input and roadmap comparison cases.
Review base: 1509db8.
Lane base: f9e3a10.
Arc: pack:roadmaps-and-slices-v1 on p47/f2-roadmap.

Keep the lane isolated and gate each coherent unit. Do not push, merge,
stash, or touch .omo/. The decision wording follows the lane brief's
already-authorized proposal-base and evidence-retention corrections.
Answer the F1 review of 300de7e on the lane based at f9e3a10: preserve exact Mermaid relations and example bands, keep only useful measured folds, bind their tests, freeze recipe memo answers, and retain native form reset. The height and fold wording corrections travel with their hand-transcribed oracle rows.
…urfaces, gate and guidance

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

# Conflicts:
#	test/self-hosting-graph.test.ts
…d build time

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

# Conflicts:
#	test/self-hosting-graph.test.ts
The requirement drawing, the slice and architecture drawings, the trace
graph and the capability pages, recaptured at the close fixes' head;
head-protocol-roadmap-after.png shows the roadmap after this PR removed
its six built entries and the cleanup joined first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Greptile's review of the src group found the Pack page drew its
maturity map before the page's expander opened, so a cell link pointed
at a closed member list the expander could not reach. The expander now
opens before the map; the map's element keeps no behavior of its own,
and the test that the map lies inside the expander failed first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Its waves, the close review and its dispositions, and the acceptance
measured at close; forward work now reads from pack:roadmap (recipe 53)
and each arc's record is its branch and then its pull request (MD-47).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The roadmap over plan and review files (MD-47) keeps evidence that no test or
recipe carries on the arc's branch only: the description links it at the
commit that holds it, d02c406, and the branch removes it before merge.
Removed: evidence/pr36/, reviews/plan47-design/, the annotation review, the
epics integration proposals and reviews/assets/plan47-prototypes/. Plan 47
names that commit as their home.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@darko-mijic darko-mijic changed the title Plan 47: roadmaps, capability maps and design slices (design checkpoint) Plan 47: roadmaps, capability maps and design slices Oct 22, 2026
@darko-mijic
darko-mijic marked this pull request as ready for review October 22, 2026 17:00
Comment thread src/projections/studio/studio.css Resolved
…, keep closed source out of print

Greptile's hosted review of PR 36 at 4a3af0e left three findings, each fixed
test-first; each new test failed before its fix.

- A slice page now names each manifest member that resolves to no Spec beside
  its summary. Recipe 54 kept them in scope.unresolved, but the Studio's
  SliceAnswer dropped them, so an incomplete Pack read as complete. The slice
  page's summary rule states it (spec:consumers.spec-studio.slice-page).
- sdp-filter clears its choices when a followed link or a fragment change
  targets a row it hides, says so in its output and scrolls to the target. Before,
  a roadmap card under the Need filter opened its disclosure inside a hidden
  row. Pages still read in full without script
  (spec:consumers.spec-studio.page-elements).
- sdp-expander no longer opens Mermaid source for print. A source the reader
  opened stays open and prints; a closed one stays closed and hidden
  (spec:consumers.spec-studio.export, ...diagram-kinds.mermaid-source).

The changed rules are transcribed in the self-hosting oracle, and three test
stand-ins for the document gained the lookup and listeners the filter now uses. Both page
behaviors were checked in headless Chrome on the Protocol's Studio.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@darko-mijic
darko-mijic merged commit b5e0a8b into main Oct 22, 2026
6 checks passed
@darko-mijic
darko-mijic deleted the feature/roadmap-and-slices-v0 branch October 22, 2026 18:05
darko-mijic added a commit that referenced this pull request Oct 31, 2026
Owner working rules: commit, push, update PR #34, and make article evidence regenerable and CI-checked.
Source baseline: b5e0a8b (main, PR #36).
Branch base: f9dfa0c.
Arc Pack: none; docs/articles is the living editorial record.

Expand the series to five full drafts and five outlined follow-ups. Add the Studio/UX and future-AI narratives, regenerate article evidence, and feature the series from the repository README. Condense the annotation context and archive the detailed scout.
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