Spec Studio

Every prose value has one typed owner

spec:carrier.prose-ownership-ruleBusiness Rule · storyready floor ready

Packs: pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/carrier/prose-ownership-rule.sdp.md

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

Intent
outcome
Keep free prose in the graph without ambiguous attachment.
Rule
rule line 20 · specs/carrier/prose-ownership-rule.sdp.md:20
Narrative lives before the first H2 and is owned directly by the Spec; it is Spec content, never an envelope field.
rule line 21 · specs/carrier/prose-ownership-rule.sdp.md:21
A description belongs to one typed section; under spec:carrier.markdown-body-grammar, the primary behavior heading and Example space share the behavior section's one description, so leading prose may occur under either, never both. Constraints has no description owner; its explanatory prose belongs in narrative or Intent.
rule line 22 · specs/carrier/prose-ownership-rule.sdp.md:22
Unowned prose — prose standing under no typed owner — is refused loudly rather than attached by guess or dropped in silence.
rule line 23 · specs/carrier/prose-ownership-rule.sdp.md:23
Prose is graph content inside its typed owner, never a file pointer or a heading-path key: a consumer reads prose from the graph without re-parsing the document, and churned document structure carries no identity.
rule line 24 · specs/carrier/prose-ownership-rule.sdp.md:24
Additional typed prose owners are stated by spec:model.relation-reasons for a relation's reason and spec:model.open-question-fields for a question's provisional and trigger lines.

5 unkeyed rules.

Verification

Verifier bindings

  • test:protocol.prose-ownership · Markdown reifier tests verify prose ownership · anchored · test anchor binding present · test/markdown-reifier.test.ts:85

    External run evidence from test/markdown-reifier.test.ts

    Test anchors: test:protocol.envelope-contract, test:protocol.markdown-parser, test:protocol.prose-ownership. Specs verified by those bindings: spec:carrier.envelope-contract, spec:carrier.markdown-parser, spec:carrier.prose-ownership-rule.

    Run 1: external run evidence from vitest 4.1.10

    Build: CI 391 · Branch: cursor/media-plan-and-articles-09b1 · Commit: 076cd4f1f85640d8236e5cca1bffffa68ab79a33 · Start: 2026-10-31T15:32:20.471Z · Stop: 2026-10-31T15:34:02.073Z

    NameSuiteResultDuration
    reifies a lawful Markdown Pack manifestMarkdown frontmatter reifierpassed8.88 ms
    refuses a Spec-only key on a PackMarkdown frontmatter reifierpassed1.83 ms
    refuses Pack membership on a SpecMarkdown frontmatter reifierpassed2.21 ms
    refuses a Pack section headingMarkdown frontmatter reifierpassed1.2 ms
    refuses a wrong-namespace Pack memberMarkdown frontmatter reifierpassed0.88 ms
    refuses a reserved derived-name key on a PackMarkdown frontmatter reifierpassed0.67 ms
    refuses a pack: id that fails the id grammarMarkdown frontmatter reifierpassed0.88 ms
    reifies the frozen corpus envelopes at their id token linesMarkdown frontmatter reifierpassed9.43 ms
    maps scalar and list relations in authored orderMarkdown frontmatter reifierpassed1.69 ms
    distinguishes an explicit empty relation set from a missing relation keyMarkdown frontmatter reifierpassed1.69 ms
    refuses warning without throwingMarkdown frontmatter reifierpassed1 ms
    refuses directive without throwingMarkdown frontmatter reifierpassed0.97 ms
    refuses tag without throwingMarkdown frontmatter reifierpassed0.94 ms
    refuses anchor without throwingMarkdown frontmatter reifierpassed0.7 ms
    refuses alias without throwingMarkdown frontmatter reifierpassed0.75 ms
    refuses merge without throwingMarkdown frontmatter reifierpassed0.71 ms
    refuses complex key without throwingMarkdown frontmatter reifierpassed0.72 ms
    refuses non-string scalar without throwingMarkdown frontmatter reifierpassed0.44 ms
    refuses body delimiter without throwingMarkdown frontmatter reifierpassed0.16 ms
    caps findings and leaves a healthy sibling independently reifiableMarkdown frontmatter reifierpassed17.06 ms
    caps body findings with the frozen structure finding IDMarkdown frontmatter reifierpassed1.91 ms
    reports a genuine YAML document warningMarkdown frontmatter reifierpassed0.72 ms
    contains the YAML parser's unknown throw at the public reifier boundaryMarkdown frontmatter reifierpassed16.97 ms
    enforces the 256 KiB carrier byte limit at and immediately over its boundaryMarkdown frontmatter reifierpassed1.7 ms
    enforces the 32 KiB frontmatter byte limit at and immediately over its boundaryMarkdown frontmatter reifierpassed0.87 ms
    enforces the 16 KiB scalar byte limit at and immediately over its boundaryMarkdown frontmatter reifierpassed2.08 ms
    enforces the 2,000 node limit at and immediately over its boundaryMarkdown frontmatter reifierpassed594.17 ms
    enforces the depth limit of 16 at and immediately over its boundaryMarkdown frontmatter reifierpassed6.3 ms
    refuses duplicate relation keysMarkdown frontmatter reifierpassed0.68 ms
    refuses duplicate targets within one relation listMarkdown frontmatter reifierpassed0.43 ms
    refuses an empty relation sequenceMarkdown frontmatter reifierpassed0.48 ms
    refuses a wrong-namespace relation targetMarkdown frontmatter reifierpassed0.37 ms
    refuses an entry address in the Spec id at the field's lineMarkdown frontmatter reifierpassed0.59 ms
    refuses an entry address in a relation target at the field's lineMarkdown frontmatter reifierpassed0.4 ms
    refuses an entry address in a Pack member at the field's lineMarkdown frontmatter reifierpassed0.35 ms
    refuses an entry address in a Pack model reference at the field's lineMarkdown frontmatter reifierpassed1.93 ms
    refuses a Pack whose own id carries an entry address with the namespace reasonMarkdown frontmatter reifierpassed0.53 ms
    accepts distinct relation keys that share a targetMarkdown frontmatter reifierpassed0.53 ms
    accepts a pure CRLF carrierMarkdown frontmatter reifierpassed0.68 ms
    refuses a byte-order markMarkdown frontmatter reifierpassed0.14 ms
    refuses an indented openerMarkdown frontmatter reifierpassed0.07 ms
    refuses a document-end closerMarkdown frontmatter reifierpassed0.07 ms
    refuses a lone CR after a valid LF carrierMarkdown frontmatter reifierpassed0.06 ms
    refuses mixed CRLF and LF newlinesMarkdown frontmatter reifierpassed0.06 ms
    maps the ruled title, intent, and behavior lists from the bodyMarkdown frontmatter reifierpassed0.91 ms
    maps the ruled fences and every remaining typed ownerMarkdown frontmatter reifierpassed2.52 ms
    serializes owned prose canonically across both public carrier reifiersMarkdown frontmatter reifierpassed24.64 ms
    serializes GWT and behavior key permutations to identical bytesMarkdown frontmatter reifierpassed11.1 ms
    omits absent prose fields and rejects constraint-local prose from the TypeScript carrierMarkdown frontmatter reifierpassed5.03 ms
    uses the first minimum heading suggestion within edit distance twoMarkdown frontmatter reifierpassed2.31 ms
    refuses a missing H1 through the frozen body diagnosticMarkdown frontmatter reifierpassed0.59 ms
    refuses an empty H1 through the frozen body diagnosticMarkdown frontmatter reifierpassed0.43 ms
    refuses a heading beyond suggestion distance two through the frozen body diagnosticMarkdown frontmatter reifierpassed0.65 ms
    refuses a tied heading using the first minimum through the frozen body diagnosticMarkdown frontmatter reifierpassed0.75 ms
    refuses a blank line in a fence through the frozen body diagnosticMarkdown frontmatter reifierpassed1.94 ms
    refuses fence attributes through the frozen body diagnosticMarkdown frontmatter reifierpassed0.47 ms
    refuses an unclosed fence through the frozen body diagnosticMarkdown frontmatter reifierpassed0.42 ms
    refuses a gwt fence on a non-example through the frozen body diagnosticMarkdown frontmatter reifierpassed0.43 ms
    refuses an invalid Verification mode through the frozen body diagnosticMarkdown frontmatter reifierpassed0.46 ms
    refuses a repeated identical literal heading through the frozen body diagnosticMarkdown frontmatter reifierpassed0.36 ms
    refuses ordered dot list in narrativeMarkdown frontmatter reifierpassed0.43 ms
    refuses ordered parenthesis list in narrativeMarkdown frontmatter reifierpassed0.34 ms
    refuses star list in narrativeMarkdown frontmatter reifierpassed0.32 ms
    refuses plus list in narrativeMarkdown frontmatter reifierpassed0.33 ms
    refuses ordered dot tab list in narrativeMarkdown frontmatter reifierpassed0.31 ms
    refuses ordered parenthesis tab list in narrativeMarkdown frontmatter reifierpassed0.31 ms
    refuses star tab list in narrativeMarkdown frontmatter reifierpassed0.52 ms
    refuses plus tab list in narrativeMarkdown frontmatter reifierpassed1.2 ms
    refuses HTML comment in narrativeMarkdown frontmatter reifierpassed0.36 ms
    refuses setext equals underline in narrativeMarkdown frontmatter reifierpassed3.51 ms
    refuses setext dash underline in narrativeMarkdown frontmatter reifierpassed0.44 ms
    refuses star thematic break in narrativeMarkdown frontmatter reifierpassed0.36 ms
    refuses underscore thematic break in narrativeMarkdown frontmatter reifierpassed0.32 ms
    refuses ordered list in section proseMarkdown frontmatter reifierpassed0.32 ms
    refuses star list in section proseMarkdown frontmatter reifierpassed0.51 ms
    refuses plus list in section proseMarkdown frontmatter reifierpassed0.37 ms
    refuses setext underline in section proseMarkdown frontmatter reifierpassed0.85 ms
    refuses thematic break in section proseMarkdown frontmatter reifierpassed0.34 ms
    refuses bare HTML opener in section proseMarkdown frontmatter reifierpassed0.36 ms
    refuses dash tab list in section proseMarkdown frontmatter reifierpassed0.36 ms
    refuses HTML comment in section proseMarkdown frontmatter reifierpassed0.34 ms
    refuses processing instruction in section proseMarkdown frontmatter reifierpassed0.38 ms
    refuses declaration in section proseMarkdown frontmatter reifierpassed0.35 ms
    refuses mixed-mode Verification headings instead of overwriting the first sectionMarkdown frontmatter reifierpassed2.91 ms
    preserves Behavior rules when an example Intent appears after BehaviorMarkdown frontmatter reifierpassed0.87 ms
    refuses a GWT fence under ModelMarkdown frontmatter reifierpassed0.64 ms
    refuses an H3 under DesignMarkdown frontmatter reifierpassed0.51 ms
    refuses an open question before its H3 ownerMarkdown frontmatter reifierpassed0.61 ms
    refuses an Intent field after the open-questions H3Markdown frontmatter reifierpassed0.48 ms
    refuses frontmatter title through its ruled diagnosticMarkdown frontmatter reifierpassed0.49 ms
    refuses second H1 through its ruled diagnosticMarkdown frontmatter reifierpassed0.39 ms
    refuses near-miss heading through its ruled diagnosticMarkdown frontmatter reifierpassed0.46 ms
    refuses indented list through its ruled diagnosticMarkdown frontmatter reifierpassed0.43 ms
    refuses empty list through its ruled diagnosticMarkdown frontmatter reifierpassed0.4 ms
    refuses nested list through its ruled diagnosticMarkdown frontmatter reifierpassed0.51 ms
    refuses extra heading space through its ruled diagnosticMarkdown frontmatter reifierpassed0.35 ms
    refuses extra list space through its ruled diagnosticMarkdown frontmatter reifierpassed0.34 ms
    refuses invalid GWT phase through its ruled diagnosticMarkdown frontmatter reifierpassed0.4 ms
    refuses late description through its ruled diagnosticMarkdown frontmatter reifierpassed0.34 ms
    refuses raw HTML through its ruled diagnosticMarkdown frontmatter reifierpassed3.58 ms
    refuses inline raw HTML through its ruled diagnosticMarkdown frontmatter reifierpassed0.43 ms
    refuses trailing prose through its ruled diagnosticMarkdown frontmatter reifierpassed0.5 ms
    refuses unsupported block through its ruled diagnosticMarkdown frontmatter reifierpassed0.36 ms
    refuses reserved authored fact through its ruled diagnosticMarkdown frontmatter reifierpassed0.49 ms
    reads a key after the flag and leaves an unkeyed question without oneopen question keys in the Markdown markerpassed1.41 ms
    refuses the carrier whole on a key with an upper-case first letteropen question keys in the Markdown markerpassed0.47 ms
    refuses the carrier whole on a key with an empty keyopen question keys in the Markdown markerpassed0.39 ms
    refuses the carrier whole on a key with a hyphenopen question keys in the Markdown markerpassed0.36 ms
    refuses the carrier whole on a key with a digit firstopen question keys in the Markdown markerpassed0.37 ms
    refuses the carrier whole on a key with a space insideopen question keys in the Markdown markerpassed0.38 ms
    refuses the carrier whole on a key with a non-ASCII letteropen question keys in the Markdown markerpassed0.34 ms
    refuses the carrier whole on a key an earlier question of the Spec carriesopen question keys in the Markdown markerpassed0.6 ms
    keeps distinct keys that differ only in caseopen question keys in the Markdown markerpassed1.36 ms
    keeps today's refusal for a marker with no space before the hashopen question keys in the Markdown markerpassed0.49 ms
    keeps today's refusal for a marker with two spaces before the hashopen question keys in the Markdown markerpassed1.65 ms
    keeps today's refusal for a marker with a key without its hashopen question keys in the Markdown markerpassed0.37 ms
    refuses a keyed question outside its H3 owner as an unkeyed one is refusedopen question keys in the Markdown markerpassed0.45 ms
Design view

Requirement drawing

  • Declared verifying examples: no declared verifying example.
Requirement drawing for spec:carrier.prose-ownership-rule
The diagram as text
  • spec:carrier.prose-ownership-rule: Every prose value has one typed owner · declared Spec
  • spec:decisions.prose-ownership: Prose belongs to typed graph owners · declared Spec
  • spec:carrier.markdown-authoring: Markdown authoring enters the one graph · declared Spec
  • impl:protocol.markdown-body-grammar: maps Markdown body content to typed prose owners · anchored code · src/extract/markdown-body.ts:120
  • test:protocol.prose-ownership: Markdown reifier tests verify prose ownership · anchored test binding · binding present · test/markdown-reifier.test.ts:85
  • spec:carrier.prose-ownership-rule refines spec:carrier.markdown-authoring · declared
  • spec:decisions.prose-ownership refines spec:carrier.prose-ownership-rule · declared
  • impl:protocol.markdown-body-grammar satisfies spec:carrier.prose-ownership-rule · anchored
  • test:protocol.prose-ownership verifies spec:carrier.prose-ownership-rule · 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

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
  • impl:protocol.markdown-body-grammar · maps Markdown body content to typed prose owners · src/extract/markdown-body.ts:120

    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:carrier.prose-ownership-rule
The diagram as text
  • spec:carrier.markdown-authoring: Markdown authoring enters the one graph
  • spec:carrier.markdown-body-grammar: The Markdown body accepts one closed form per section
  • spec:carrier.prose-ownership-rule: Every prose value has one typed owner
  • spec:decisions.prose-ownership: Prose belongs to typed graph owners
  • 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.relation-reasons: An authored relation may carry its reason
  • spec:carrier.prose-ownership-rule decidedBy spec:decisions.prose-ownership · declared
  • spec:carrier.prose-ownership-rule dependsOn spec:carrier.markdown-body-grammar · declared
  • spec:carrier.prose-ownership-rule dependsOn spec:model.open-question-fields · declared
  • spec:carrier.prose-ownership-rule dependsOn spec:model.relation-reasons · declared
  • spec:carrier.prose-ownership-rule refines spec:carrier.markdown-authoring · declared
  • spec:decisions.prose-ownership refines spec:carrier.prose-ownership-rule · 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 · outgoingProse belongs to typed graph owners
spec:decisions.prose-ownership · resolves
declaredNoneNone
dependsOn · outgoingThe Markdown body accepts one closed form per section
spec:carrier.markdown-body-grammar · resolves
declaredNoneNone
dependsOn · outgoingAn open question may name who decides it, its links, a provisional reading and a re-entry trigger
spec:model.open-question-fields · resolves
declaredNoneNone
dependsOn · outgoingAn authored relation may carry its reason
spec:model.relation-reasons · resolves
declaredNoneNone
refines · outgoingMarkdown authoring enters the one graph
spec:carrier.markdown-authoring · resolves
declaredNoneNone
refines · incomingProse belongs to typed graph owners
spec:decisions.prose-ownership · resolves
declaredNoneNone

Bindings

Implementation binding: present

  • impl:protocol.markdown-body-grammar · maps Markdown body content to typed prose owners · src/extract/markdown-body.ts:120 · role codec · component component:protocol.extract · layer application · context protocol

Design reference: none

Verifier binding: present

  • test:protocol.prose-ownership · Markdown reifier tests verify prose ownership · anchored · test/markdown-reifier.test.ts:85 · 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.