Spec Studio

A roadmap renders as the forward section of a pull request description

spec:consumers.roadmap.memoUse Case / Behavior · storyready floor ready

New since the base graph base da4b141. See the diff.

Base input: schema 0.11.0, 405 Specs.

Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

Design: 11 design entries · no pinned declarations · no decisions

Findings: no errors, no warnings

specs/consumers/roadmap.memo.sdp.md

No open questions and no blocking questions; implementation binding present, verifier binding present, and expected-outcome oracle none.

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. Written by hand, it drifts from the Specs it names and is rewritten each time. The roadmap memo renders it from the roadmap reading at the head of the branch, so the forward section a description carries is the roadmap the graph holds. The memo states what the graph holds and nothing more: it copies each entry's purpose from its own intent and derives its dependency reach, and the owner's reason for an entry's place, the re-entry condition of the next pull request and the durable refused list stay the description author's words around it.

Intent
actor
The author of a pull request description, and the owner reading it.
problem
A description's forward section is written by hand from plan files and recipe answers, so it drifts from the roadmap and the Specs it names.
outcome
Render a roadmap's entries, what waits on the owner and the deferred questions as Markdown a pull request description carries as its forward section, so the plan a description proposes is the roadmap the graph holds.
Behavior
rule.memoRecipe line 26 · specs/consumers/roadmap.memo.sdp.md:26
Recipe 55 renders one roadmap's reading, recipe 53's answer for that Pack, as one Markdown memo a pull request description carries as its forward section; the roadmap page shows the same bytes.

no example exercises it

rule.sections line 27 · specs/consumers/roadmap.memo.sdp.md:27
The memo holds, in order: the roadmap's title, a line saying what to state and built mean, and its framing; the entries to design, to state and to build, each need in priority order with every entry's place; what waits on the owner; the questions that name no decider; the entries built and still listed; the unresolved members with their original places and ids; and the deferred open questions with their triggers. The to design and to build sections always appear and say when they hold no entry; every other section is left out when it holds no row.

no example exercises it

rule.purposeAndReach line 28 · specs/consumers/roadmap.memo.sdp.md:28
An entry's purpose and reach is read, never authored: its intent's problem, or its outcome when it states no problem, then how many Specs outside its scope wait on it and how many of its parts are ready to build now. These values state its purpose and its place in the graph's structure, never why the owner selected the entry or gave it its place; the description's author may state that reason around the memo, and the memo adds no status, date, estimate or assignment to a pull request.

no example exercises it

rule.holds line 29 · specs/consumers/roadmap.memo.sdp.md:29
An entry to design names the parts that set its need, its own first, each with its stated next rung and the clauses and dependency targets that hold it, then its blocking questions and its decisions below ready; an entry to state names the waiting statements the statement queue puts before its own, inside the entry, elsewhere on the roadmap and outside it, as advice on the order of statements and never as a readiness requirement; an entry to build names each Spec it rests on that is not built.

no example exercises it

rule.authorsOwn line 30 · specs/consumers/roadmap.memo.sdp.md:30
The memo derives no reason for the priority and carries no re-entry condition or refused list; the description's author writes those around it.

no example exercises it

rule.readingOrderNoted line 31 · specs/consumers/roadmap.memo.sdp.md:31
A memo of a Pack whose order is reading order says so under the framing, so no description presents it as a priority.

no example exercises it

rule.deterministic line 32 · specs/consumers/roadmap.memo.sdp.md:32
One graph and one set of parameters render one memo, byte for byte.

no example exercises it

0 unkeyed rules.

Design
memoRecipe line 36 · specs/consumers/roadmap.memo.sdp.md:36
recipe 55, the roadmap memo, takes params.pack and params.decider as recipe 53 does; without pack it reads the one Pack whose manifest states order: priority, and with none or several it returns { diagnostics: [{ parameter, problem }], memo: null }; otherwise it answers { diagnostics: [], memo }, the memo one string.
memoHead line 37 · specs/consumers/roadmap.memo.sdp.md:37
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, the line 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. and 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.

Cited at

  • test/recipes.test.ts:8384
memoDesign line 38 · specs/consumers/roadmap.memo.sdp.md:38
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 ; .

Cited at

  • test/recipes.test.ts:8385
memoState line 39 · specs/consumers/roadmap.memo.sdp.md:39
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 ; .

Cited at

  • test/recipes.test.ts:8386
memoBuild line 40 · specs/consumers/roadmap.memo.sdp.md:40
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.

Cited at

  • test/recipes.test.ts:8387
memoEntry line 41 · specs/consumers/roadmap.memo.sdp.md:41
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.
memoWaiting line 42 · specs/consumers/roadmap.memo.sdp.md:42
the section ### Waiting on the <decider> lists one line per row of recipe 53's waiting.questions and waiting.statements, questions first and statements in the order the answer gives: a question as its address as a code span, or its Spec id when unkeyed, (blocking) when it blocks, place and the places, and its text; a statement as State , the Spec id as a code span, its stated rung and the rung its floor allows, and the places.

Cited at

  • test/recipes.test.ts:8388
memoUndecided line 43 · specs/consumers/roadmap.memo.sdp.md:43
the section ### Questions without a decider opens with the line These questions have no named decider. and a blank line, then lists one line per row of recipe 53's waiting.withoutDecider: its address as a code span, or its Spec id as a code span followed by question and its authored position from 1 when unkeyed, then (blocking) when it blocks, place and the places; the text stays on the roadmap page, so a corpus with many such questions keeps a short memo.
memoBuilt line 44 · specs/consumers/roadmap.memo.sdp.md:44
the section ### Built and still on the roadmap lists each built entry as its place, its title and its id as a code span. The section ### Unresolved members follows when recipe 53 reports unresolved members, listing each as - Place <place>: <id>, the id as a code span.
memoDeferred line 45 · specs/consumers/roadmap.memo.sdp.md:45
the section ### Deferred, with their triggers lists each open question recipe 20 marks as a deferral, in the register's order, as its address as a code span, or its Spec id when unkeyed, its text, and Trigger: with its trigger.
memoMarkup line 46 · specs/consumers/roadmap.memo.sdp.md:46
code spans follow the proposal memo's rule; outside code spans, authored <, > and & are written as &lt;, &gt; and &amp;, respectively; other authored text is written verbatim, with each line break written as a space and, inside a table cell, each | written \|; every line ends with a line feed and the memo with one.
Verification

Verifier bindings

  • test:protocol.roadmap-memo-recipe · anchored · test anchor binding present · test/roadmap.test.ts:39

    External run evidence from test/roadmap.test.ts

    Test anchors: test:protocol.roadmap-memo-recipe, test:protocol.roadmap-recipe. Specs verified by those bindings: spec:consumers.roadmap, spec:consumers.roadmap.memo.

    Run 1: external run evidence from vitest 4.1.10

    Build: CI 380 · Branch: feature/roadmap-and-slices-v0 · Commit: 34909918bf0be0e849959644401797191cae379f · Start: 2026-10-22T17:40:31.456Z · Stop: 2026-10-22T17:42:16.171Z

    NameSuiteResultDuration
    keeps manifest places and reports an unresolved middle memberthe roadmap recipespassed45.8 ms
    escapes HTML outside code spans in memo titles and framingthe roadmap recipespassed5.87 ms
    reads the work's need: 'is ready and implemented throughout'the roadmap recipespassed30.41 ms
    reads the work's need: 'has one part ready and not implemented'the roadmap recipespassed6.44 ms
    reads the work's need: 'has one part below ready whose floor …'the roadmap recipespassed6.38 ms
    reads the work's need: 'has one part below ready whose floor …'the roadmap recipespassed13.02 ms
    reads the work's need: 'has one part implemented below ready'the roadmap recipespassed7.11 ms
    reads the work's need: 'has a ready root and one descendant w…'the roadmap recipespassed5.8 ms
    reads the work's need: 'has a ready root and one descendant h…'the roadmap recipespassed7.15 ms
    reads the work's need: 'has one descendant that also refines …'the roadmap recipespassed5.43 ms
    selects priority Packs in id order and reads an explicitly named ordinary Packthe roadmap recipespassed20.83 ms
    names holding parts and a descendant's outside parentthe roadmap recipespassed24.23 ms
    renders each unbuilt dependency once when two relations reach itthe roadmap recipespassed10.94 ms
    lists sorted incoming relations, Pack memberships and dependency placesthe roadmap recipespassed10.09 ms
    includes keyed and unkeyed blocking questions on shaping decisionsthe roadmap recipespassed5.85 ms
    finds earlier statements through a shaping decision's own waiting statementthe roadmap recipespassed5.01 ms
    ends the intent line with a full stop: A purpose?the roadmap recipespassed4.1 ms
    ends the intent line with a full stop: A purpose!the roadmap recipespassed3.66 ms
    ends the intent line with a full stop: A purposethe roadmap recipespassed3.37 ms
    ends the intent line with a full stop: A purpose.the roadmap recipespassed3.38 ms
    keeps queue order across places, including earlier statements inside, elsewhere and outsidethe roadmap recipespassed10.27 ms
    deduplicates shared descendants, preserves places, and lists decision entries apartthe roadmap recipespassed5.85 ms
    lists every unassigned question apart, including unkeyed and shared shaping decisionsthe roadmap recipespassed11.4 ms
    pins memo bytes, intent fallback, line breaks and table escapingthe roadmap recipespassed12.07 ms
    pins every populated memo section byte for bytethe roadmap recipespassed34.44 ms
    pins empty design and build sections byte for bytethe roadmap recipespassed3.37 ms
    reads purpose from intent and counts distinct waiting Specs and buildable partsthe roadmap recipespassed20.6 ms
  • test:protocol.studio-roadmap-page · anchored · test anchor binding present · test/studio-roadmap.test.ts:24

    External run evidence from test/studio-roadmap.test.ts

    Test anchors: test:protocol.studio-roadmap-page. Specs verified by those bindings: spec:consumers.roadmap.memo, spec:consumers.spec-studio.navigation, spec:consumers.spec-studio.roadmap-page.

    Run 1: external run evidence from vitest 4.1.10

    Build: CI 380 · Branch: feature/roadmap-and-slices-v0 · Commit: 34909918bf0be0e849959644401797191cae379f · Start: 2026-10-22T17:40:31.456Z · Stop: 2026-10-22T17:42:16.171Z

    NameSuiteResultDuration
    shows unresolved members with their original manifest placesStudio roadmap pagepassed47.39 ms
    publishes the empty state and navigation even with no roadmapStudio roadmap pagepassed11.25 ms
    renders the board, four need lists, numbered gaps, legend and entries listed apartStudio roadmap pagepassed1 ms
    counts empty board columns and gives each empty need list its own sentenceStudio roadmap pagepassed36.36 ms
    shows holding parts and their next-rung clauses: has one part implemented below readyStudio roadmap pagepassed37.12 ms
    shows holding parts and their next-rung clauses: has a ready root and one descendant held by a blocking questionStudio roadmap pagepassed21.82 ms
    shows holding parts and their next-rung clauses: has one descendant that also refines a Spec outside the roadmapStudio roadmap pagepassed36.47 ms
    keeps waiting questions, provisional readings, unnamed deciders and statements in recipe orderStudio roadmap pagepassed4.13 ms
    leaves out Earlier statements when no waiting statement precedes the entryStudio roadmap pagepassed23.81 ms
    uses the correct statement count and verb for 0 waiting statementsStudio roadmap pagepassed17.28 ms
    uses the correct statement count and verb for 1 waiting statementsStudio roadmap pagepassed30.27 ms
    uses the correct statement count and verb for 2 waiting statementsStudio roadmap pagepassed33.01 ms
    renders code spans and escapes authored titles consistently on the board and entryStudio roadmap pagepassed21.83 ms
    shows decisions and their questions, dependency folds, incoming work and other PacksStudio roadmap pagepassed53.9 ms
    labels an ordinary Pack answer as authored reading orderStudio roadmap pagepassed43.99 ms
    uses each roadmap's escaped page name for every local entry link and copies recipe 55's exact bytesStudio roadmap pagepassed59.65 ms
    shows every row without script and supplies the existing filter with need tokensStudio roadmap pagepassed1.39 ms
    keeps heading, memo and entry ids distinct when roadmap names contain their suffixesStudio roadmap pagepassed25.08 ms
    stacks the board at phone width using the Studio breakpointStudio roadmap pagepassed0.4 ms
Design view

Requirement drawing

  • Declared verifying examples: no declared verifying example.
Requirement drawing for spec:consumers.roadmap.memo
The diagram as text
  • spec:consumers.roadmap.memo: A roadmap renders as the forward section of a pull request description · declared Spec
  • spec:consumers.roadmap: A roadmap orders the next bodies of work, and the graph says what each still needs · declared Spec
  • impl:protocol.roadmap-memo-recipe: realizes the roadmap memo in the shipped recipe catalog · anchored code · test/roadmap.test.ts:27
  • impl:protocol.studio-roadmap-page: renders roadmap needs, holding parts and the shared Markdown memo · anchored code · src/projections/studio/pages/roadmap-page.ts:168
  • test:protocol.roadmap-memo-recipe: test:protocol.roadmap-memo-recipe · anchored test binding · binding present · test/roadmap.test.ts:39
  • test:protocol.studio-roadmap-page: test:protocol.studio-roadmap-page · anchored test binding · binding present · test/studio-roadmap.test.ts:24
  • spec:consumers.roadmap.memo refines spec:consumers.roadmap · declared
  • impl:protocol.roadmap-memo-recipe satisfies spec:consumers.roadmap.memo · anchored
  • impl:protocol.studio-roadmap-page satisfies spec:consumers.roadmap.memo · anchored
  • test:protocol.roadmap-memo-recipe verifies spec:consumers.roadmap.memo · anchored
  • test:protocol.studio-roadmap-page verifies spec:consumers.roadmap.memo · anchored
Mermaid source

Copyable source; the Studio draws static SVG.

Preferred and chosen syntax: requirementDiagram; exact refines, satisfies and verifies, with claim words in nodes and per-edge comments.

Decisions

No decision record named.

Runtime
  • component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

    • component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · context protocol
    • component:protocol.graph · the one graph and its semantic decisions · src/graph/schema.ts:34 · layer domain · context protocol
    • component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol
    • component:protocol.notation · the leaf step codec · src/notation/slots.ts:261 · layer domain · context protocol
    • component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol
    • component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol
  • impl:protocol.roadmap-memo-recipe · realizes the roadmap memo in the shipped recipe catalog · test/roadmap.test.ts:27

    Uses

    None.

  • impl:protocol.studio-roadmap-page · renders roadmap needs, holding parts and the shared Markdown memo · src/projections/studio/pages/roadmap-page.ts:168

    Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

    None.

Runtime observation: not tracked.

Evidence

Runtime observation: not tracked.

Build attestations: not tracked.

Deployments: not tracked.

Bills of materials: not tracked.

Impact
Relations of spec:consumers.roadmap.memo
The diagram as text
  • spec:consumers.agent-surface.register-recipes: Register questions stay executable graph recipes
  • spec:consumers.intent-composition.proposal.memo: Recipe 49 renders a change proposal as the Markdown memo a person reviews
  • spec:consumers.roadmap: A roadmap orders the next bodies of work, and the graph says what each still needs
  • spec:consumers.roadmap.memo: A roadmap renders as the forward section of a pull request description
  • spec:consumers.spec-studio.roadmap-page: The roadmap page shows the upcoming work in priority order, split by what it needs
  • spec:protocol.roadmap-replaces-plans: The Protocol reads its next work from its roadmap and keeps its delivery record in git and its pull requests
  • spec:consumers.roadmap.memo dependsOn spec:consumers.agent-surface.register-recipes · declared — the deferred items come from the open-question register
  • spec:consumers.roadmap.memo dependsOn spec:consumers.intent-composition.proposal.memo · declared — the memo writes its code spans by the proposal memo's markup rules
  • spec:consumers.roadmap.memo refines spec:consumers.roadmap · declared
  • spec:consumers.spec-studio.roadmap-page dependsOn spec:consumers.roadmap.memo · declared — the page carries the roadmap memo for a description's author to copy
  • spec:protocol.roadmap-replaces-plans dependsOn spec:consumers.roadmap.memo · declared — each description's forward section is the roadmap memo
Mermaid source

Copyable source; the Studio draws static SVG.

Preferred syntax: flowchart. Chosen syntax: labelled flowchart, preserving exact relations, claims and folds.

Rests on

Rested on by

Distance 1

Distance 2

Relations

Relation and directionOther endClaimReasonExercised keys
dependsOn · outgoingRegister questions stay executable graph recipes
spec:consumers.agent-surface.register-recipes · resolves
declaredthe deferred items come from the open-question registerNone
dependsOn · outgoingRecipe 49 renders a change proposal as the Markdown memo a person reviews
spec:consumers.intent-composition.proposal.memo · resolves
declaredthe memo writes its code spans by the proposal memo's markup rulesNone
refines · outgoingA roadmap orders the next bodies of work, and the graph says what each still needs
spec:consumers.roadmap · resolves
declaredNoneNone
dependsOn · incomingThe roadmap page shows the upcoming work in priority order, split by what it needs
spec:consumers.spec-studio.roadmap-page · resolves
declaredthe page carries the roadmap memo for a description's author to copyNone
dependsOn · incomingThe Protocol reads its next work from its roadmap and keeps its delivery record in git and its pull requests
spec:protocol.roadmap-replaces-plans · resolves
declaredeach description's forward section is the roadmap memoNone

Bindings

Implementation binding: present

  • impl:protocol.roadmap-memo-recipe · realizes the roadmap memo in the shipped recipe catalog · test/roadmap.test.ts:27 · role projection
  • impl:protocol.studio-roadmap-page · renders roadmap needs, holding parts and the shared Markdown memo · src/projections/studio/pages/roadmap-page.ts:168 · role projection · component component:protocol.projections · layer edge · context protocol

Design reference: none

Verifier binding: present

  • test:protocol.roadmap-memo-recipe · anchored · test/roadmap.test.ts:39 · test anchor
  • test:protocol.studio-roadmap-page · anchored · test/studio-roadmap.test.ts:24 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

Composing (0)

Composing needs the script.