Spec Studio

An open question may carry a key that addresses it

spec:model.open-question-keysBusiness Rule · storyready floor ready

Packs: pack:self-hosting-v1

Design: no design entries · no pinned declarations · 1 decision

Findings: no errors, no warnings

specs/model/open-question-keys.sdp.md

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

Intent
problem
An open question has no identity but its position and its text, so a register or a decision that cites one breaks silently when a question above it moves, closes, or is reworded.
outcome
Let an author give an open question an optional key, so spec:<id>#question.<key> names it, resolves while it stands, and fails validation where it is renamed or removed.
Rule
rule.keyGrammar line 18 · specs/model/open-question-keys.sdp.md:18
An open question is prose, or an object with question, an optional blocking flag, an optional key, and the optional fields of spec:model.open-question-fields. A key matches ^[a-z][A-Za-z0-9]*$, the entry-address key grammar, and is unique among the open questions of one Spec. An unkeyed question stays lawful and has no address.

spec:model.open-question-keys.keyed-question-resolves · enabled, spec:model.open-question-keys.repeated-key-refused · enabled

rule.markdownMarker line 19 · specs/model/open-question-keys.sdp.md:19
In the Markdown carrier the key follows the flag inside the marker, after one space and #, as in - [blocking #aggregateReach] Does the owner widen the aggregate? or - [non-blocking #pageHome] Where does the page live?. A marker whose key text is empty or off the grammar is refused with open question keys must be lower-camel ASCII, and a key that repeats an earlier key of the same Spec is refused with open question keys must be unique, each as the structure finding extract/invalid-markdown-structure at the line of the entry, and the carrier is refused whole as for every structure refusal.

spec:model.open-question-keys.keyed-question-resolves · enabled, spec:model.open-question-keys.repeated-key-refused · enabled

rule line 20 · specs/model/open-question-keys.sdp.md:20
In the TypeScript carrier the key is the key property of the question object. A key that is not a string on the grammar, or that repeats an earlier key of the same Spec, is refused with the finding extract/unrecognized-property at severity error and the message property "intent.openQuestions[<n>].key" is refused: open question keys must be lower-camel ASCII or property "intent.openQuestions[<n>].key" is refused: open question keys must be unique, with <n> the zero-based position; only the key drops, and the question and the Spec stay.
rule line 21 · specs/model/open-question-keys.sdp.md:21
The serialized graph writes a question object's fields in the order question, blocking, key, decider, links, provisional, trigger, omitting an absent field. The import emitter writes a keyed question's marker as [<flag> #<key>] and its optional fields as one-line sub-items under it, so an object-form TypeScript question round-trips into Markdown.
rule.questionAddress line 22 · specs/model/open-question-keys.sdp.md:22
An entry address may name an open question as spec:<id>#question.<key>; it parses, is refused in every id slot, and resolves when the Spec exists and an open question carries the key. A missing question key is a prose-mentions error, so renaming or removing it fails validation where it is addressed.

spec:model.open-question-keys.keyed-question-resolves · enabled, spec:model.open-question-keys.renamed-key-breaks · enabled

rule line 23 · specs/model/open-question-keys.sdp.md:23
The open-question register reports each question's key, or null for an unkeyed question. The mention audit and entry search read the question address as they read a design or ui address, and entry search gives a keyed question's text the address spec:<id>#question.<key>.

3 unkeyed rules.

Verifying examples

A keyed question is reified and its address resolves · spec:model.open-question-keys.keyed-question-resolves · ready floor ready

Executable Spec

Given a Markdown Spec carrier {specId: "spec:probe.subject"} whose open questions read {questions: "- [blocking #aggregateReach] Does the owner widen the aggregate?; - [non-blocking] Is the name final?"}
Given a second Spec that names {address: "spec:probe.subject#question.aggregateReach"} in its narrative and declares dependsOn on the first
When the extractor reifies both carriers and the graph is validated
Then the first carrier is reified: {reified: true}
Then the extraction findings name {extractMessage: ""}
Then the graph holds the question keys {keys: "aggregateReach"}
Then the report holds {mentionErrors: 0} prose-mention errors

Open example

A renamed question key fails the mention that addresses it · spec:model.open-question-keys.renamed-key-breaks · ready floor ready

Executable Spec

Given a Markdown Spec carrier {specId: "spec:probe.subject"} whose open questions read {questions: "- [blocking #aggregateScope] Does the owner widen the aggregate?"}
Given a second Spec that names {address: "spec:probe.subject#question.aggregateReach"} in its narrative and declares dependsOn on the first
When the extractor reifies both carriers and the graph is validated
Then the first carrier is reified: {reified: true}
Then the extraction findings name {extractMessage: ""}
Then the graph holds the question keys {keys: "aggregateScope"}
Then the report holds {mentionErrors: 1} prose-mention errors

Open example

A repeated question key refuses its carrier · spec:model.open-question-keys.repeated-key-refused · ready floor ready

Executable Spec

Given a Markdown Spec carrier {specId: "spec:probe.subject"} whose open questions read {questions: "- [blocking #aggregateReach] Does the owner widen the aggregate?; - [non-blocking #aggregateReach] Does the aggregate keep its name?"}
Given a second Spec that names {address: "spec:probe.subject#question.aggregateReach"} in its narrative and declares dependsOn on the first
When the extractor reifies both carriers and the graph is validated
Then the first carrier is reified: {reified: false}
Then the extraction findings name {extractMessage: "open question keys must be unique"}
Then the graph holds the question keys {keys: ""}
Then the report holds {mentionErrors: 1} prose-mention errors

Open example

Example space

Given a Markdown Spec carrier {specId:string} whose open questions read {questions:string}
Given a second Spec that names {address:string} in its narrative and declares dependsOn on the first
When the extractor reifies both carriers and the graph is validated
Then the first carrier is reified: {reified:boolean}
Then the extraction findings name {extractMessage:string}
Then the graph holds the question keys {keys:string}
Then the report holds {mentionErrors:number} prose-mention errors
Verification

Verifier bindings

  • spec:model.open-question-keys.keyed-question-resolves · A keyed question is reified and its address resolves · declared · example enabled · specs/model/open-question-keys.keyed-question-resolves.sdp.md

    External run evidence from test/self-hosting-open-question-keys.test.ts

    Test anchors: test:protocol.open-question-keys.keyed-question-resolves, test:protocol.open-question-keys.renamed-key-breaks, test:protocol.open-question-keys.repeated-key-refused. Specs verified by those bindings: spec:model.open-question-keys, spec:model.open-question-keys.keyed-question-resolves, spec:model.open-question-keys.renamed-key-breaks, spec:model.open-question-keys.repeated-key-refused.

    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
    executes the bound example against a fresh worldA keyed question is reified and its address resolves (spec:model.open-question-keys.keyed-question-resolves)passed25.4 ms
    executes the bound example against a fresh worldA renamed question key fails the mention that addresses it (spec:model.open-question-keys.renamed-key-breaks)passed4.02 ms
    executes the bound example against a fresh worldA repeated question key refuses its carrier (spec:model.open-question-keys.repeated-key-refused)passed2.97 ms
  • spec:model.open-question-keys.renamed-key-breaks · A renamed question key fails the mention that addresses it · declared · example enabled · specs/model/open-question-keys.renamed-key-breaks.sdp.md
  • spec:model.open-question-keys.repeated-key-refused · A repeated question key refuses its carrier · declared · example enabled · specs/model/open-question-keys.repeated-key-refused.sdp.md

Example space

  • specId · string · declared by a Markdown Spec carrier {specId} whose open questions read {questions}
  • questions · string · declared by a Markdown Spec carrier {specId} whose open questions read {questions}
  • address · string · declared by a second Spec that names {address} in its narrative and declares dependsOn on the first

Bound points

ExamplespecIdquestionsaddress
spec:model.open-question-keys.keyed-question-resolves"spec:probe.subject""- [blocking #aggregateReach] Does the owner widen the aggregate?; - [non-blocking] Is the name final?""spec:probe.subject#question.aggregateReach"
spec:model.open-question-keys.renamed-key-breaks"spec:probe.subject""- [blocking #aggregateScope] Does the owner widen the aggregate?""spec:probe.subject#question.aggregateReach"
spec:model.open-question-keys.repeated-key-refused"spec:probe.subject""- [blocking #aggregateReach] Does the owner widen the aggregate?; - [non-blocking #aggregateReach] Does the aggregate keep its name?""spec:probe.subject#question.aggregateReach"

Oracle binding: present · oracle:protocol.open-question-keys · test/self-hosting-open-question-keys.test.ts:49

Coverage

specId: "spec:probe.subject" · spec:model.open-question-keys.keyed-question-resolves, spec:model.open-question-keys.renamed-key-breaks, spec:model.open-question-keys.repeated-key-refused · not enumerable

questions: "- [blocking #aggregateReach] Does the owner widen the aggregate?; - [non-blocking] Is the name final?" · spec:model.open-question-keys.keyed-question-resolves; "- [blocking #aggregateScope] Does the owner widen the aggregate?" · spec:model.open-question-keys.renamed-key-breaks; "- [blocking #aggregateReach] Does the owner widen the aggregate?; - [non-blocking #aggregateReach] Does the aggregate keep its name?" · spec:model.open-question-keys.repeated-key-refused · not enumerable

address: "spec:probe.subject#question.aggregateReach" · spec:model.open-question-keys.keyed-question-resolves, spec:model.open-question-keys.renamed-key-breaks, spec:model.open-question-keys.repeated-key-refused · not enumerable

Unbound

  • specId: None
  • questions: None
  • address: None
Design view

Requirement drawing

Requirement drawing for spec:model.open-question-keys
The diagram as text
  • spec:model.open-question-keys: An open question may carry a key that addresses it · declared Spec
  • spec:model.open-question-fields: An open question may name who decides it, its links, a provisional reading and a re-entry trigger · declared Spec
  • spec:model.open-question-keys.keyed-question-resolves: A keyed question is reified and its address resolves · declared Spec
  • spec:model.open-question-keys.renamed-key-breaks: A renamed question key fails the mention that addresses it · declared Spec
  • spec:model.open-question-keys.repeated-key-refused: A repeated question key refuses its carrier · declared Spec
  • spec:model.open-question-fields.dropped-list-warns: A TypeScript question list that cannot be read drops whole with a warning · declared Spec
  • spec:model.spec-sections: Spec sections carry typed detail and direct verifier semantics · declared Spec
  • impl:protocol.authoring-grammar-recipes: asserts the authoring grammar's realization in docs/agent-surface/recipes.md · anchored code · test/recipes.test.ts:6597
  • impl:protocol.authoring-normalization: normalizes rule markers and question fields after carrier reification · anchored code · src/extract/authoring-normalization.ts:8
  • impl:protocol.open-question-keys: reads an open question's optional key from its Markdown marker and refuses a bad or repeated key · anchored code · src/extract/markdown-body-owner-behavior.ts:38
  • impl:protocol.open-section-order: preserves authored open-section and model-term order and Pack field order · anchored code · src/extract/serialize.ts:105
  • impl:protocol.prose-mentions: checks that prose mentions resolve and warns once per unbacked Spec pair · anchored code · src/validate/validators.ts:1370
  • impl:protocol.register-recipes: asserts realization of the shipped register recipes · anchored code · test/recipes.test.ts:2057
  • impl:protocol.sdp-import-markdown-emit: emits the Markdown document twin for an imported Spec · anchored code · src/import/emit-markdown.ts:253
  • impl:protocol.stable-ids: stable ID grammar parser · anchored code · src/ids.ts:173
  • impl:protocol.static-reification: reifies authored carriers from the AST and never evaluates them · anchored code · src/extract/reify.ts:2139
  • oracle:protocol.open-question-fields: oracle:protocol.open-question-fields · anchored oracle binding · test/self-hosting-carrier.test.ts:342
  • oracle:protocol.open-question-keys: expected reification, question keys and mention errors by the key rules · anchored oracle binding · test/self-hosting-open-question-keys.test.ts:49
  • test:protocol.authoring-grammar: checks rule keys, question fields and relation reasons across the carriers · anchored test binding · binding present · test/authoring-grammar.test.ts:24
  • test:protocol.authoring-grammar-recipes: executes the shipped question, mention, entry, address and rule coverage recipes · anchored test binding · binding present · test/recipes.test.ts:6587
  • test:protocol.open-question-fields.dropped-list-warns: test:protocol.open-question-fields.dropped-list-warns · anchored test binding · binding present · test/self-hosting-carrier.test.ts:367
  • test:protocol.open-question-keys.keyed-question-resolves: verifies a keyed question is reified and its question address resolves · anchored test binding · binding present · test/self-hosting-open-question-keys.test.ts:329
  • test:protocol.open-question-keys.renamed-key-breaks: verifies a renamed question key fails the mention of its old address · anchored test binding · binding present · test/self-hosting-open-question-keys.test.ts:343
  • test:protocol.open-question-keys.repeated-key-refused: verifies a repeated question key refuses its carrier whole · anchored test binding · binding present · test/self-hosting-open-question-keys.test.ts:357
  • spec:model.open-question-fields refines spec:model.open-question-keys · declared
  • spec:model.open-question-fields.dropped-list-warns refines spec:model.open-question-fields · declared
  • spec:model.open-question-fields.dropped-list-warns verifies spec:model.open-question-fields · declared
  • spec:model.open-question-keys refines spec:model.spec-sections · declared
  • spec:model.open-question-keys.keyed-question-resolves refines spec:model.open-question-keys · declared
  • spec:model.open-question-keys.keyed-question-resolves verifies spec:model.open-question-keys · declared
  • spec:model.open-question-keys.renamed-key-breaks refines spec:model.open-question-keys · declared
  • spec:model.open-question-keys.renamed-key-breaks verifies spec:model.open-question-keys · declared
  • spec:model.open-question-keys.repeated-key-refused refines spec:model.open-question-keys · declared
  • spec:model.open-question-keys.repeated-key-refused verifies spec:model.open-question-keys · declared
  • impl:protocol.authoring-grammar-recipes satisfies spec:model.open-question-fields · anchored
  • impl:protocol.authoring-normalization satisfies spec:model.open-question-fields · anchored
  • impl:protocol.open-question-keys satisfies spec:model.open-question-keys · anchored
  • impl:protocol.open-section-order satisfies spec:model.open-question-keys · anchored
  • impl:protocol.prose-mentions satisfies spec:model.open-question-keys · anchored
  • impl:protocol.register-recipes satisfies spec:model.open-question-keys · anchored
  • impl:protocol.sdp-import-markdown-emit satisfies spec:model.open-question-keys · anchored
  • impl:protocol.stable-ids satisfies spec:model.open-question-keys · anchored
  • impl:protocol.static-reification satisfies spec:model.open-question-keys · anchored
  • oracle:protocol.open-question-fields models spec:model.open-question-fields · anchored
  • oracle:protocol.open-question-keys models spec:model.open-question-keys · anchored
  • test:protocol.authoring-grammar verifies spec:model.open-question-fields · anchored
  • test:protocol.authoring-grammar-recipes verifies spec:model.open-question-fields · anchored
  • test:protocol.open-question-fields.dropped-list-warns verifies spec:model.open-question-fields.dropped-list-warns · anchored
  • test:protocol.open-question-keys.keyed-question-resolves verifies spec:model.open-question-keys.keyed-question-resolves · anchored
  • test:protocol.open-question-keys.renamed-key-breaks verifies spec:model.open-question-keys.renamed-key-breaks · anchored
  • test:protocol.open-question-keys.repeated-key-refused verifies spec:model.open-question-keys.repeated-key-refused · anchored
Mermaid source

Copyable source; the Studio draws static SVG.

Preferred syntax: requirementDiagram. Chosen syntax: flowchart TB because models, folds require exact labels unavailable in requirement syntax.

Decisions

  • A Spec id written in prose is a checked mention

    A Spec id in narrative or section text, outside gwt and gwt-vocabulary fences, is a mention. A mention that does not resolve is a conformance error. A mention of another Spec that shares no declared relation with the mentioning Spec, in either direction, is one warning per mentioning Spec and target Spec pair, whatever the number of locations; an address on the mentioning Spec's own id is checked for its entry and never warned. An entry address is a Spec id followed by #, the section name design, ui, question, rule, or term, a dot, and the entry's lower-camel ASCII key, as in spec:<id>#design.<key> or spec:<id>#question.<key>. A design or ui address resolves when the Spec exists and that section holds the key as its own key, other than description; a question address resolves when the Spec exists and one of its open questions carries that key; a term address resolves when the Spec exists and one of its Model terms carries that key. The # sub-part is reserved for the entry address in every namespace: a Spec's own id, a relation target, a Pack member or model reference, an anchor id or target, and the specId and ref builders all refuse it. A mention mints no edge, and the reader gains no join.

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.import · canonical conversion with a fidelity boundary · src/import/import.ts:45 · layer application · context protocol

    Uses

  • component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol

    Uses

    None.

  • component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol

    Uses

  • impl:protocol.open-question-keys · reads an open question's optional key from its Markdown marker and refuses a bad or repeated key · src/extract/markdown-body-owner-behavior.ts:38

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

    Uses

    None.

  • impl:protocol.open-section-order · preserves authored open-section and model-term order and Pack field order · src/extract/serialize.ts:105

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

    Uses

    None.

  • impl:protocol.prose-mentions · checks that prose mentions resolve and warns once per unbacked Spec pair · src/validate/validators.ts:1370

    Component: component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol

    Uses

    None.

  • impl:protocol.register-recipes · asserts realization of the shipped register recipes · test/recipes.test.ts:2057

    Uses

    None.

  • impl:protocol.sdp-import-markdown-emit · emits the Markdown document twin for an imported Spec · src/import/emit-markdown.ts:253

    Component: component:protocol.import · canonical conversion with a fidelity boundary · src/import/import.ts:45 · layer application · context protocol

    Uses

    None.

  • impl:protocol.stable-ids · stable ID grammar parser · src/ids.ts:173

    Component: component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol

    Uses

    None.

  • impl:protocol.static-reification · reifies authored carriers from the AST and never evaluates them · src/extract/reify.ts:2139

    Component: component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · 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:model.open-question-keys
  • E6: verifies · declared (3 unit edges)
The diagram as text
  • spec:carrier.markdown-body-grammar: The Markdown body accepts one closed form per section
  • spec:consumers.authoring-on-ramp: Authors move one Spec from intent to reviewed evidence
  • spec:consumers.spec-studio.intent-panel: A composing panel on every page gathers scoped intent for an agent
  • spec:consumers.spec-studio.spec-page: A Spec page shows one Spec in collapsible panels, in a fixed order
  • spec:consumers.upgrade-kit.capability-adoption: Capability adoption counts where each capability is used and where it could apply
  • spec:decisions.checked-mentions: A Spec id written in prose is a checked mention
  • spec:decisions.question-key-rendering: The Design Review shows an open question's key
  • 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.open-question-keys.keyed-question-resolves: A keyed question is reified and its address resolves
  • spec:model.open-question-keys.renamed-key-breaks: A renamed question key fails the mention that addresses it
  • spec:model.open-question-keys.repeated-key-refused: A repeated question key refuses its carrier
  • spec:model.rule-keys: A rule or flow entry may carry a key that addresses it
  • spec:model.spec-sections: Spec sections carry typed detail and direct verifier semantics
  • spec:model.open-question-keys decidedBy spec:decisions.checked-mentions · declared
  • spec:model.open-question-keys dependsOn spec:carrier.markdown-body-grammar · declared
  • spec:model.open-question-keys refines spec:model.spec-sections · declared
  • spec:consumers.authoring-on-ramp dependsOn spec:model.open-question-keys · declared
  • spec:consumers.spec-studio.intent-panel dependsOn spec:model.open-question-keys · declared
  • spec:consumers.spec-studio.spec-page dependsOn spec:model.open-question-keys · declared
  • spec:consumers.upgrade-kit.capability-adoption dependsOn spec:model.open-question-keys · declared — question keys are counted where open questions are
  • spec:decisions.question-key-rendering dependsOn spec:model.open-question-keys · declared
  • spec:extraction.entry-locations dependsOn spec:model.open-question-keys · declared
  • spec:model.rule-keys dependsOn spec:model.open-question-keys · declared
  • spec:model.open-question-fields refines spec:model.open-question-keys · declared
  • spec:model.open-question-keys.keyed-question-resolves refines spec:model.open-question-keys · declared
  • spec:model.open-question-keys.renamed-key-breaks refines spec:model.open-question-keys · declared
  • spec:model.open-question-keys.repeated-key-refused refines spec:model.open-question-keys · declared
  • spec:model.open-question-keys.keyed-question-resolves verifies spec:model.open-question-keys · declared
  • spec:model.open-question-keys.renamed-key-breaks verifies spec:model.open-question-keys · declared
  • spec:model.open-question-keys.repeated-key-refused verifies spec:model.open-question-keys · declared
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
decidedBy · outgoingA Spec id written in prose is a checked mention
spec:decisions.checked-mentions · resolves
declaredNoneNone
dependsOn · outgoingThe Markdown body accepts one closed form per section
spec:carrier.markdown-body-grammar · resolves
declaredNoneNone
refines · outgoingSpec sections carry typed detail and direct verifier semantics
spec:model.spec-sections · resolves
declaredNoneNone
dependsOn · incomingAuthors move one Spec from intent to reviewed evidence
spec:consumers.authoring-on-ramp · resolves
declaredNoneNone
dependsOn · incomingA composing panel on every page gathers scoped intent for an agent
spec:consumers.spec-studio.intent-panel · 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 · incomingCapability adoption counts where each capability is used and where it could apply
spec:consumers.upgrade-kit.capability-adoption · resolves
declaredquestion keys are counted where open questions areNone
dependsOn · incomingThe Design Review shows an open question's key
spec:decisions.question-key-rendering · resolves
declaredNoneNone
dependsOn · incomingThe graph records where each addressable entry is written
spec:extraction.entry-locations · resolves
declaredNoneNone
dependsOn · incomingA rule or flow entry may carry a key that addresses it
spec:model.rule-keys · resolves
declaredNoneNone
refines · incomingAn open question may name who decides it, its links, a provisional reading and a re-entry trigger
spec:model.open-question-fields · resolves
declaredNoneNone
refines · incomingA keyed question is reified and its address resolves
spec:model.open-question-keys.keyed-question-resolves · resolves
declaredNoneNone
refines · incomingA renamed question key fails the mention that addresses it
spec:model.open-question-keys.renamed-key-breaks · resolves
declaredNoneNone
refines · incomingA repeated question key refuses its carrier
spec:model.open-question-keys.repeated-key-refused · resolves
declaredNoneNone
verifies · incomingA keyed question is reified and its address resolves
spec:model.open-question-keys.keyed-question-resolves · resolves
declaredNonekeyGrammar, markdownMarker, questionAddress
verifies · incomingA renamed question key fails the mention that addresses it
spec:model.open-question-keys.renamed-key-breaks · resolves
declaredNonequestionAddress
verifies · incomingA repeated question key refuses its carrier
spec:model.open-question-keys.repeated-key-refused · resolves
declaredNonekeyGrammar, markdownMarker

Bindings

Implementation binding: present

  • impl:protocol.open-question-keys · reads an open question's optional key from its Markdown marker and refuses a bad or repeated key · src/extract/markdown-body-owner-behavior.ts:38 · role codec · component component:protocol.extract · layer application · context protocol
  • impl:protocol.open-section-order · preserves authored open-section and model-term order and Pack field order · src/extract/serialize.ts:105 · role codec · component component:protocol.extract · layer application · context protocol
  • impl:protocol.prose-mentions · checks that prose mentions resolve and warns once per unbacked Spec pair · src/validate/validators.ts:1370 · role validator · component component:protocol.validate · layer domain · context protocol
  • impl:protocol.register-recipes · asserts realization of the shipped register recipes · test/recipes.test.ts:2057
  • impl:protocol.sdp-import-markdown-emit · emits the Markdown document twin for an imported Spec · src/import/emit-markdown.ts:253 · role codec · component component:protocol.import · layer application · context protocol
  • impl:protocol.stable-ids · stable ID grammar parser · src/ids.ts:173 · role codec · component component:protocol.model · layer domain · context protocol
  • impl:protocol.static-reification · reifies authored carriers from the AST and never evaluates them · src/extract/reify.ts:2139 · role extractor · component component:protocol.extract · layer application · context protocol

Design reference: none

Verifier binding: present

Expected-outcome oracle: present

  • oracle:protocol.open-question-keys · expected reification, question keys and mention errors by the key rules · test/self-hosting-open-question-keys.test.ts:49

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

Composing (0)

Composing needs the script.