Spec Studio

The graph records where each addressable entry is written

spec:extraction.entry-locationsUse Case / Behavior · storyready floor ready

Packs: pack:design-management-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/extraction/entry-locations.sdp.md

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

An entry address names one keyed Design or UI entry, one keyed rule or flow, one keyed open question, or one keyed Model term. A reader following an address needs its recorded source line.

Intent
problem
The graph records the file of a Spec and the line of every anchor, but not the line of an entry inside a Spec, so a page that links an address to its text, or a review that cites one, re-reads carrier syntax the extractor already parsed.
outcome
Record source lines for Design and UI entries, rules and flows, Model terms, open questions and their optional fields, and authored relation targets beside the graph's nodes, so consumers locate text without parsing carriers.
Behavior
rule line 20 · specs/extraction/entry-locations.sdp.md:20
The graph carries a location table beside its nodes and edges. Each row names a Spec id, carrier file, entry and 1-based source line. Entries are design.<key> or ui.<key> for keys other than description, rule[<i>] or flow[<i>] for entries of the primary behavior owner, term[<i>] for a Model term, question[<i>] for an open question, question[<i>].decider, question[<i>].links, question[<i>].provisional or question[<i>].trigger for each of those optional fields present, and relation.<type>.<target> for an authored relation target. Indexes count from 0 within their authored lists, a term's among the Spec's terms in authored order. A rule, flow, term or question row carries key when that entry has one.
rule line 21 · specs/extraction/entry-locations.sdp.md:21
Primitive and Pack nodes stay free of lines, so a comparison of nodes and edges is unchanged by an edit that only moves an entry, and carrier parity compares nodes and edges and never the location table, whose lines differ by carrier by nature.
rule line 22 · specs/extraction/entry-locations.sdp.md:22
Markdown and TypeScript record the entry forms their syntax carries. TypeScript questions are located at the question property or string literal. Gherkin records its Rule lines and authored or defaulted relation sites; it carries no Design, UI or Model section, open question or question field. A missing row means not located, never absent.
rule line 23 · specs/extraction/entry-locations.sdp.md:23
An authored relation target has a location row whose entry is relation.<type>.<target>, at its carrier's recorded relation site. A defaulted Gherkin relation uses the Scenario identity line when no explicit relation tag locates it.
rule line 24 · specs/extraction/entry-locations.sdp.md:24
Rows sort by Spec id, then by entry, in code-unit order. The table is a deterministic function of the carriers at the extracted commit, as every other part of the graph is.
rule line 25 · specs/extraction/entry-locations.sdp.md:25
A location names where an entry is written and nothing else: it is not an identity, never an anchor target or a binding, and an edit above an entry moves its line.
rule line 26 · specs/extraction/entry-locations.sdp.md:26
The reader's Spec context carries the Spec's rows as its entry locations. Address resolution (recipe 25) adds the entry's value, file and line to each resolving row, and entry search (recipe 23) adds the line to each entry it matches.

7 unkeyed rules.

Verification

Verifier bindings

  • test:protocol.entry-locations · anchored · test anchor binding present · test/entry-locations.test.ts:14

    External run evidence from test/entry-locations.test.ts

    Test anchors: test:protocol.entry-locations. Specs verified by those bindings: spec:extraction.entry-locations, spec:validation.prose-mentions.

    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
    locates each Gherkin relation at its own tag and defaults at the Scenario lineentry locationspassed6.89 ms
    records Markdown Design, UI, keyed and unkeyed questions at their first item linesentry locationspassed10.91 ms
    locates Markdown question fields, rules, flows and declared relation targetsentry locationspassed3.53 ms
    records TypeScript property lines through transparent wrappersentry locationspassed23.94 ms
    locates TypeScript string questions and omits properties dropped as non-staticentry locationspassed6.38 ms
    locates Gherkin rules and relations while keeping open questions outside its grammarentry locationspassed4.73 ms
    sorts Specs and entries in code-unit order and serializes reversed rows identicallyentry locationspassed4.41 ms
    keeps Primitive and Pack nodes line-free when an edit above entries moves their linesentry locationspassed5.97 ms
    compares carrier parity on nodes and edges while locations differentry locationspassed7.87 ms
    serializes an empty table for entries without recorded carrier linesentry locationspassed1.38 ms
    extracts the location table byte-identically twiceentry locationspassed6.43 ms
    locates errors and warnings in behavior Behavior rule: entriesprose mention finding linespassed13.55 ms
    locates errors and warnings in behavior Behavior flow: entriesprose mention finding linespassed2.93 ms
    locates errors and warnings in rule Rule entriesprose mention finding linespassed3.2 ms
    locates errors and warnings in workflow Workflow entriesprose mention finding linespassed2.44 ms
    locates errors and warnings in workflow Workflow rule: entriesprose mention finding linespassed2.9 ms
    locates errors and warnings in contract Contract entriesprose mention finding linespassed2.05 ms
    locates question text, fields and links and omits an unrecorded lineprose mention finding linespassed1.95 ms
Design view

Requirement drawing

  • Declared verifying examples: no declared verifying example.
Requirement drawing for spec:extraction.entry-locations
The diagram as text
  • spec:extraction.entry-locations: The graph records where each addressable entry is written · declared Spec
  • spec:extraction.derive-graph: Carrier reification derives the one graph · declared Spec
  • impl:protocol.entry-location-recipes: asserts realization of the entry lines the entry search and address resolution recipes return · anchored code · test/recipes.test.ts:5979
  • impl:protocol.entry-locations: builds the carrier entry location table · anchored code · src/extract/derive.ts:78
  • impl:protocol.pack-design: the Pack design helpers and the Pack context assembly they serve · anchored code · src/reader/reader.ts:499
  • impl:protocol.reader: typed graph queries, entry adapters and context joins · anchored code · src/reader/reader.ts:687
  • test:protocol.entry-locations: test:protocol.entry-locations · anchored test binding · binding present · test/entry-locations.test.ts:14
  • spec:extraction.entry-locations refines spec:extraction.derive-graph · declared
  • impl:protocol.entry-location-recipes satisfies spec:extraction.entry-locations · anchored
  • impl:protocol.entry-locations satisfies spec:extraction.entry-locations · anchored
  • impl:protocol.pack-design references spec:extraction.entry-locations · anchored
  • impl:protocol.reader satisfies spec:extraction.entry-locations · anchored
  • test:protocol.entry-locations verifies spec:extraction.entry-locations · 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.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · context protocol

    Uses

    • 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.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol
  • component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol

    Uses

    • 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.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol
  • impl:protocol.entry-location-recipes · asserts realization of the entry lines the entry search and address resolution recipes return · test/recipes.test.ts:5979

    Uses

    None.

  • impl:protocol.entry-locations · builds the carrier entry location table · src/extract/derive.ts:78

    Component: component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · context protocol

    Uses

    None.

  • impl:protocol.reader · typed graph queries, entry adapters and context joins · src/reader/reader.ts:687

    Component: component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol

    Uses

    • impl:protocol.delivery-facts · computes delivery facts from resolving binding edges · src/graph/delivery-facts.ts:65
    • impl:protocol.next-rung-floor · evaluates the floor for a target rung and names the targets that break a dependency · src/validate/readiness-floor.ts:603

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:extraction.entry-locations
The diagram as text
  • spec:consumers.agent-surface.register-recipes: Register questions stay executable graph recipes
  • spec:consumers.pack-design: The Pack context carries the Pack's design
  • spec:consumers.spec-studio.data: The Studio renders from the reader's values and embeds only what its script reads
  • spec:consumers.spec-studio.spec-page: A Spec page shows one Spec in collapsible panels, in a fixed order
  • spec:consumers.spec-studio.spec-page.core: A Spec page's core shows the whole Spec, with an anchor for every entry
  • spec:consumers.upgrade-kit.rule-key-proposal: The rule-key proposal keys every unkeyed rule as a change proposal
  • spec:extraction.derive-graph: Carrier reification derives the one graph
  • spec:extraction.determinism: Committed source derives byte-identical output
  • spec:extraction.entry-citations: The graph records where anchored source cites an entry address
  • spec:extraction.entry-locations: The graph records where each addressable entry is written
  • spec:model.open-question-fields: An open question may name who decides it, its links, a provisional reading and a re-entry trigger
  • spec:model.open-question-keys: An open question may carry a key that addresses it
  • spec:model.rule-keys: A rule or flow entry may carry a key that addresses it
  • spec:model.term-addresses: A Model term may carry a key that addresses it
  • spec:validation.superseded-decision-signal: A Spec shaped by a superseded decision warns
  • spec:extraction.entry-locations constrainedBy spec:extraction.determinism · declared
  • spec:extraction.entry-locations dependsOn spec:model.open-question-keys · declared
  • spec:extraction.entry-locations refines spec:extraction.derive-graph · declared
  • spec:consumers.agent-surface.register-recipes dependsOn spec:extraction.entry-locations · declared — the key-family register gives each row the line the location table records
  • spec:consumers.pack-design dependsOn spec:extraction.entry-locations · declared
  • spec:consumers.spec-studio.data dependsOn spec:extraction.entry-locations · declared
  • spec:consumers.spec-studio.spec-page dependsOn spec:extraction.entry-locations · declared
  • spec:consumers.spec-studio.spec-page.core dependsOn spec:extraction.entry-locations · declared
  • spec:consumers.upgrade-kit.rule-key-proposal dependsOn spec:extraction.entry-locations · declared — each change names the file and line the location table records for its entry
  • spec:extraction.entry-citations dependsOn spec:extraction.entry-locations · declared — the citation table is the location table's sibling, and a resolving citation names an entry it locates
  • spec:model.open-question-fields dependsOn spec:extraction.entry-locations · declared — adds rows to the location table
  • spec:model.rule-keys dependsOn spec:extraction.entry-locations · declared — adds rows to the location table
  • spec:model.term-addresses dependsOn spec:extraction.entry-locations · declared — adds a row per Model term to the location table
  • spec:validation.superseded-decision-signal dependsOn spec:extraction.entry-locations · declared — the warning takes its line from the location row of the decidedBy target it names
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

Distance 3

Distance 4

Distance 5

Distance 6

Distance 7

Distance 8

Distance 9

Distance 10

Relations

Relation and directionOther endClaimReasonExercised keys
constrainedBy · outgoingCommitted source derives byte-identical output
spec:extraction.determinism · resolves
declaredNoneNone
dependsOn · outgoingAn open question may carry a key that addresses it
spec:model.open-question-keys · resolves
declaredNoneNone
refines · outgoingCarrier reification derives the one graph
spec:extraction.derive-graph · resolves
declaredNoneNone
dependsOn · incomingRegister questions stay executable graph recipes
spec:consumers.agent-surface.register-recipes · resolves
declaredthe key-family register gives each row the line the location table recordsNone
dependsOn · incomingThe Pack context carries the Pack's design
spec:consumers.pack-design · resolves
declaredNoneNone
dependsOn · incomingThe Studio renders from the reader's values and embeds only what its script reads
spec:consumers.spec-studio.data · resolves
declaredNoneNone
dependsOn · incomingA Spec page shows one Spec in collapsible panels, in a fixed order
spec:consumers.spec-studio.spec-page · resolves
declaredNoneNone
dependsOn · incomingA Spec page's core shows the whole Spec, with an anchor for every entry
spec:consumers.spec-studio.spec-page.core · resolves
declaredNoneNone
dependsOn · incomingThe rule-key proposal keys every unkeyed rule as a change proposal
spec:consumers.upgrade-kit.rule-key-proposal · resolves
declaredeach change names the file and line the location table records for its entryNone
dependsOn · incomingThe graph records where anchored source cites an entry address
spec:extraction.entry-citations · resolves
declaredthe citation table is the location table's sibling, and a resolving citation names an entry it locatesNone
dependsOn · incomingAn open question may name who decides it, its links, a provisional reading and a re-entry trigger
spec:model.open-question-fields · resolves
declaredadds rows to the location tableNone
dependsOn · incomingA rule or flow entry may carry a key that addresses it
spec:model.rule-keys · resolves
declaredadds rows to the location tableNone
dependsOn · incomingA Model term may carry a key that addresses it
spec:model.term-addresses · resolves
declaredadds a row per Model term to the location tableNone
dependsOn · incomingA Spec shaped by a superseded decision warns
spec:validation.superseded-decision-signal · resolves
declaredthe warning takes its line from the location row of the decidedBy target it namesNone

Bindings

Implementation binding: present

  • impl:protocol.entry-location-recipes · asserts realization of the entry lines the entry search and address resolution recipes return · test/recipes.test.ts:5979
  • impl:protocol.entry-locations · builds the carrier entry location table · src/extract/derive.ts:78 · role extractor · component component:protocol.extract · layer application · context protocol
  • impl:protocol.reader · typed graph queries, entry adapters and context joins · src/reader/reader.ts:687 · role reader · component component:protocol.reader · layer application · context protocol

Design reference: present

  • impl:protocol.pack-design · the Pack design helpers and the Pack context assembly they serve · src/reader/reader.ts:499 · role reader · component component:protocol.reader · layer application · context protocol

Verifier binding: present

  • test:protocol.entry-locations · anchored · test/entry-locations.test.ts:14 · 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.