outcomeA repeated question key refuses its carrier
spec:model.open-question-keys.repeated-key-refusedPacks: pack:self-hosting-v1
Design: no design entries · no pinned declarations · no decisions
Findings: no errors, no warnings
specs/model/open-question-keys.repeated-key-refused.sdp.md
No open questions and no blocking questions; implementation binding none, verifier binding present, and expected-outcome oracle none.
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?"}
a second Spec that names {address: "spec:probe.subject#question.aggregateReach"} in its narrative and declares dependsOn on the firstWhen
the extractor reifies both carriers and the graph is validated
Then
the first carrier is reified: {reified: false}
the extraction findings name {extractMessage: "open question keys must be unique"}
the graph holds the question keys {keys: ""}
the report holds {mentionErrors: 1} prose-mention errorsComposing needs the script.
Intent
- Execute the uniqueness refusal, and show that the address then names a missing Spec.
assumptions- The world is the one of the keyed-question example, with two questions in the first carrier that carry the same key. The first carrier is refused whole, so the graph holds no question key and the address's Spec is absent.
Behavior
Examples
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 errorsVerification
Verifier bindings
- test:protocol.open-question-keys.repeated-key-refused · verifies a repeated question key refuses its carrier whole · anchored · test anchor binding present ·
test/self-hosting-open-question-keys.test.ts:357External run evidence from
test/self-hosting-open-question-keys.test.tsTest 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
Name Suite Result Duration executes the bound example against a fresh world A keyed question is reified and its address resolves (spec:model.open-question-keys.keyed-question-resolves) passed 25.4 ms executes the bound example against a fresh world A renamed question key fails the mention that addresses it (spec:model.open-question-keys.renamed-key-breaks) passed 4.02 ms executes the bound example against a fresh world A repeated question key refuses its carrier (spec:model.open-question-keys.repeated-key-refused) passed 2.97 ms
Design view
Requirement drawing
- Satisfying or referencing units: no recorded binding.
The diagram as text
- spec:model.open-question-keys.repeated-key-refused: A repeated question key refuses its carrier · declared Spec
- spec:model.open-question-keys: An open question may carry a key that addresses it · declared Spec
- 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-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
- 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 and chosen syntax: requirementDiagram; exact refines, satisfies and verifies, with claim words in nodes and per-edge comments.
Decisions
No decision record named.
Runtime
No implementation neighborhood recorded.
Runtime observation: not tracked.
Evidence
Runtime observation: not tracked.
Build attestations: not tracked.
Deployments: not tracked.
Bills of materials: not tracked.
Impact
- E2: verifies · declared
The diagram as text
- spec:model.open-question-keys: An open question may carry a key that addresses it
- spec:model.open-question-keys.repeated-key-refused: A repeated question key refuses its carrier
- 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
Mermaid source
Copyable source; the Studio draws static SVG.
Preferred syntax: flowchart. Chosen syntax: labelled flowchart, preserving exact relations, claims and folds.
Rests on
- refines · spec:model.open-question-keys · stated ready, floor ready
Rested on by
No Spec rests on this Spec.
Relations
| Relation and direction | Other end | Claim | Reason | Exercised keys |
|---|---|---|---|---|
| refines · outgoing | An open question may carry a key that addresses itspec:model.open-question-keys · resolves | declared | None | None |
| verifies · outgoing | An open question may carry a key that addresses itspec:model.open-question-keys · resolves | declared | None | keyGrammar, markdownMarker |
Bindings
Implementation binding: none
Design reference: none
Verifier binding: present
- test:protocol.open-question-keys.repeated-key-refused · verifies a repeated question key refuses its carrier whole · anchored ·
test/self-hosting-open-question-keys.test.ts:357· 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.