Spec Studio

A page takes each recipe answer from the recipe's shipped body

spec:consumers.spec-studio.data.recipe-answersContract · storyready floor ready

Changed since the base graph base da4b141: design.pageRecipes; design.recipeEvaluations; narrative

Base input: schema 0.11.0, 405 Specs.

Packs: pack:self-hosting-v1, pack:spec-studio-v1

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

Findings: no errors, no warnings

specs/consumers/spec-studio.data.recipe-answers.sdp.md

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

The lenses, the registers, the owner queue, the slice and roadmap pages, the diff and runs pages and the panels of a Spec page show recipe answers. Each takes its answer from the recipe's shipped body, evaluated over the graph the build derived, so a page and sdp q give one answer. The two Design entries name every evaluation a build runs and which page reads each answer, so a builder and a test author read one list.

Intent
outcome
Compose every recipe answer a Studio page shows by evaluating the recipe's shipped body over the graph the build derived, so a page and sdp q give one answer.
Contract
rule.recipeEvaluation line 20 · specs/consumers/spec-studio.data.recipe-answers.sdp.md:20
The build composes each recipe answer a page shows by evaluating that recipe's shipped body, the one dist/recipes/ holds, over the graph, reader and validation report it derived, with the parameters the recipe evaluations name, through the body evaluation sdp q runs; it re-implements no recipe, so a page and sdp q give one answer.

no example exercises it

rule.oncePerBuild line 21 · specs/consumers/spec-studio.data.recipe-answers.sdp.md:21
Each evaluation the recipe evaluations name runs once per build, and every page that shows its answer reads that one answer.

no example exercises it

0 unkeyed rules.

Design
recipeEvaluations line 24 · specs/consumers/spec-studio.data.recipe-answers.sdp.md:24
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 }.
pageRecipes line 25 · specs/consumers/spec-studio.data.recipe-answers.sdp.md:25
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.
Verification

Verifier bindings

  • test:protocol.studio-lenses · anchored · test anchor binding present · test/studio-s1.test.ts:273

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

    Test anchors: test:protocol.studio-architecture-planned-apart, test:protocol.studio-coverage-literal, test:protocol.studio-coverage-number, test:protocol.studio-diagram-folds-context, test:protocol.studio-diagram-folds-layer, test:protocol.studio-diagram-within-bound, test:protocol.studio-lenses, test:protocol.studio-tests-coverage-row. Specs verified by those bindings: spec:consumers.agent-surface.example-space-coverage, spec:consumers.agent-surface.example-space-coverage.number-not-enumerable, spec:consumers.agent-surface.example-space-coverage.uncovered-literal, spec:consumers.spec-studio.data.recipe-answers, spec:consumers.spec-studio.diagrams, spec:consumers.spec-studio.diagrams.folds-by-context, spec:consumers.spec-studio.diagrams.folds-by-layer, spec:consumers.spec-studio.diagrams.within-bound, spec:consumers.spec-studio.lenses, spec:consumers.spec-studio.lenses.architecture, spec:consumers.spec-studio.lenses.architecture.planned-apart, spec:consumers.spec-studio.lenses.evidence, spec:consumers.spec-studio.lenses.packs, spec:consumers.spec-studio.lenses.tests, spec:consumers.spec-studio.lenses.tests.coverage-row.

    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
    bounds and folds 12 componentsStudio diagramspassed21.4 ms
    bounds and folds 45 componentsStudio diagramspassed4.18 ms
    bounds and folds 50 componentsStudio diagramspassed10.57 ms
    keeps every edge in an open text fallbackStudio diagramspassed1.76 ms
    orders grid contexts and layers and wraps cells within the fixed width budgetStudio diagramspassed3.65 ms
    draws planned-use edges dashed independently of planned box outlinesStudio diagramspassed0.48 ms
    checks the edge bound even when boxes fitStudio diagramspassed0.41 ms
    places folded contexts and layers in their own bands below the gridStudio diagramspassed3.19 ms
    places outgoing relation bands above the subject and folds ties in relation orderStudio diagramspassed9.26 ms
    folds trace relation groups and leaves member overflow as textStudio diagramspassed2.95 ms
    keeps recipe and diagram edges in code-unit order under forced Czech collationStudio lensespassed116.83 ms
    publishes all five ordered lenses and honest evidence without scriptStudio lensespassed33.06 ms
    reads verifier binding from the delivery fact and gives absent coverage its own filter valueStudio lensespassed18.02 ms
    labels a primitive-only space with no examples not measurable and hides it under coveredStudio lensespassed14.75 ms
    classifies 'number' with points [ '1' ] and mixed=false as 'not-measurable'Studio lensespassed26.11 ms
    classifies 'string' with points [ '"a"' ] and mixed=false as 'not-measurable'Studio lensespassed22.83 ms
    classifies 'boolean' with points [ 'true' ] and mixed=false as 'not-measurable'Studio lensespassed11.69 ms
    classifies '"a"|"b"' with points [] and mixed=false as 'uncovered'Studio lensespassed9.5 ms
    classifies '"a"|"b"' with points [ '"a"' ] and mixed=false as 'uncovered'Studio lensespassed11.11 ms
    classifies '"a"|"b"' with points [ '"a"', '"b"' ] and mixed=false as 'covered'Studio lensespassed15.58 ms
    classifies '"a"|"b"' with points [ '"a"' ] and mixed=true as 'uncovered'Studio lensespassed16.25 ms
    classifies '"a"|"b"' with points [ '"a"', '"b"' ] and mixed=true as 'covered'Studio lensespassed20.2 ms
    renders member subjects, code spans, used-by counts, differences and empty componentsStudio lensespassed14.17 ms
    describes evidence sources as not trackedStudio lensespassed2.87 ms
    executes the bound example against a fresh worldAn architecture within the bound draws in one diagram, the same bytes twice (spec:consumers.spec-studio.diagrams.within-bound)passed13 ms
    executes the bound example against a fresh worldAn architecture over the bound folds by context (spec:consumers.spec-studio.diagrams.folds-by-context)passed7.68 ms
    executes the bound example against a fresh worldOne context over the bound folds by layer (spec:consumers.spec-studio.diagrams.folds-by-layer)passed8.85 ms
    executes the bound example against a fresh worldA component design no anchor realizes draws planned beside the built one (spec:consumers.spec-studio.lenses.architecture.planned-apart)passed26.33 ms
    executes the bound example against a fresh worldA Spec's row on the tests lens counts its exercised keyed rules (spec:consumers.spec-studio.lenses.tests.coverage-row)passed13.82 ms
    executes the bound example against a fresh worldA literal no example binds is reported uncovered, and an unbound child is named (spec:consumers.agent-surface.example-space-coverage.uncovered-literal)passed4.85 ms
    executes the bound example against a fresh worldA number slot is not enumerable and reports no uncovered value (spec:consumers.agent-surface.example-space-coverage.number-not-enumerable)passed3.01 ms
    reuses the build's reader and validation findings during Studio recipe evaluationnot recordedpassed3.94 ms
    documents the component and member fields recipe 17 addsnot recordedpassed1.22 ms
    evaluates each shipped recipe once for its assigned parameters and shares Pack totals, with base falsenot recordedpassed14.63 ms
    evaluates each shipped recipe once for its assigned parameters and shares Pack totals, with base truenot recordedpassed20.61 ms
    keeps label lines bounded and orders member depths numerically with outside units lastnot recordedpassed2.32 ms
    labels planned uses, reports unreadable designs and keeps unknown structure visiblenot recordedpassed8.33 ms
    gives unstated context and layer folds addressable text descriptionsnot recordedpassed1.14 ms
    names a single edge relation once in the legend and preserves its text equivalentnot recordedpassed1.75 ms
    names solid and planned uses once without repeating edge labelsnot recordedpassed0.63 ms
Design view

Requirement drawing

  • Declared verifying examples: no declared verifying example.
Requirement drawing for spec:consumers.spec-studio.data.recipe-answers
The diagram as text
  • spec:consumers.spec-studio.data.recipe-answers: A page takes each recipe answer from the recipe's shipped body · declared Spec
  • spec:consumers.spec-studio.data: The Studio renders from the reader's values and embeds only what its script reads · declared Spec
  • impl:protocol.studio-recipes: evaluates shipped recipe bodies once and shares answers between Studio pages · anchored code · src/projections/studio/recipes.ts:34
  • impl:protocol.studio-register-contracts: shared recipe answer shapes for Studio registers · anchored code · src/projections/studio/pages/register-answers.ts:4
  • test:protocol.studio-lenses: test:protocol.studio-lenses · anchored test binding · binding present · test/studio-s1.test.ts:273
  • spec:consumers.spec-studio.data.recipe-answers refines spec:consumers.spec-studio.data · declared
  • impl:protocol.studio-recipes satisfies spec:consumers.spec-studio.data.recipe-answers · anchored
  • impl:protocol.studio-register-contracts references spec:consumers.spec-studio.data.recipe-answers · anchored
  • test:protocol.studio-lenses verifies spec:consumers.spec-studio.data.recipe-answers · anchored
Mermaid source

Copyable source; the Studio draws static SVG.

Preferred syntax: requirementDiagram. Chosen syntax: flowchart TB because references require exact labels unavailable in requirement syntax.

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.studio-recipes · evaluates shipped recipe bodies once and shares answers between Studio pages · src/projections/studio/recipes.ts:34

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

    Uses

    • api:protocol.evaluate-body · evaluates bodies and shipped recipes over one in-memory reader, graph and report · src/reader/evaluate-body.ts:120
    • impl:protocol.reader · typed graph queries, entry adapters and context joins · src/reader/reader.ts:687

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.spec-studio.data.recipe-answers
The diagram as text
  • spec:consumers.agent-surface.evaluation-sink: The evaluation sink runs one body and prints its return
  • spec:consumers.spec-studio.data: The Studio renders from the reader's values and embeds only what its script reads
  • spec:consumers.spec-studio.data.recipe-answers: A page takes each recipe answer from the recipe's shipped body
  • spec:consumers.spec-studio.slice-page: A slice page shows a Pack's design as one whole
  • spec:consumers.spec-studio.data.recipe-answers dependsOn spec:consumers.agent-surface.evaluation-sink · declared — the build composes recipe answers through the same body evaluation `sdp q` runs
  • spec:consumers.spec-studio.data.recipe-answers refines spec:consumers.spec-studio.data · declared
  • spec:consumers.spec-studio.slice-page dependsOn spec:consumers.spec-studio.data.recipe-answers · declared — the build evaluates the slice recipe once for each Pack, and the page reads that answer
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

Relations

Relation and directionOther endClaimReasonExercised keys
dependsOn · outgoingThe evaluation sink runs one body and prints its return
spec:consumers.agent-surface.evaluation-sink · resolves
declaredthe build composes recipe answers through the same body evaluation sdp q runsNone
refines · outgoingThe Studio renders from the reader's values and embeds only what its script reads
spec:consumers.spec-studio.data · resolves
declaredNoneNone
dependsOn · incomingA slice page shows a Pack's design as one whole
spec:consumers.spec-studio.slice-page · resolves
declaredthe build evaluates the slice recipe once for each Pack, and the page reads that answerNone

Bindings

Implementation binding: present

  • impl:protocol.studio-recipes · evaluates shipped recipe bodies once and shares answers between Studio pages · src/projections/studio/recipes.ts:34 · role service · component component:protocol.projections · layer edge · context protocol

Design reference: present

  • impl:protocol.studio-register-contracts · shared recipe answer shapes for Studio registers · src/projections/studio/pages/register-answers.ts:4 · role contract · component component:protocol.projections · layer edge · context protocol

Verifier binding: present

  • test:protocol.studio-lenses · anchored · test/studio-s1.test.ts:273 · 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.