Spec Studio

A Pack has a Markdown manifest carrier

spec:carrier.markdown-pack-authoringUse Case / Behavior · featureready floor ready

Packs: pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/carrier/markdown-pack-authoring.sdp.md

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

Intent
outcome
Let a Markdown Pack manifest carry the same grouping identity, framing, membership, and model references as the TypeScript form.
Behavior
rule line 21 · specs/carrier/markdown-pack-authoring.sdp.md:21
Routing is by envelope id namespace: pack: reifies as a Pack manifest; spec: keeps the Spec path; any other namespace is refused as extract/invalid-id.
rule line 22 · specs/carrier/markdown-pack-authoring.sdp.md:22
The pack envelope is closed to exactly id (required, pack: namespace), specs (required YAML list of spec: ids, manifest order; may be empty), modelRefs (optional YAML list of spec: ids), and order (optional; its one lawful value is priority, and any other value refuses with extract/invalid-frontmatter). A derived-name key is refused as extract/reserved-property. Any other key — including the Spec envelope keys kind, altitude, readiness and relations, and title — refuses with extract/unrecognized-property. Symmetrically, specs or modelRefs on a spec: carrier refuse the same way.
rule line 23 · specs/carrier/markdown-pack-authoring.sdp.md:23
The body H1 is the Pack title. All remaining body prose is the framing, owned by the Pack node. Any ## section heading refuses with extract/unrecognized-heading — a Pack has no section tier.
rule line 24 · specs/carrier/markdown-pack-authoring.sdp.md:24
A Markdown manifest and a TypeScript manifest of the same Pack derive the identical Pack node (the file field aside) and identical belongsTo edges. The same id authored in both carriers is the standing duplicate-id refusal.
rule line 25 · specs/carrier/markdown-pack-authoring.sdp.md:25
The TypeScript pack() builder stays a lawful per-ID option and the import source; sdp import remains Spec-only and does not convert pack manifests.

5 unkeyed rules.

Verifying examples

A Markdown Pack twin matches its TypeScript manifest · spec:carrier.markdown-pack-authoring.markdown-ts-parity · ready floor ready

Executable Spec

Given an extraction root holding the pack carrier {carrierSource: "the Markdown twin of a TS manifest"}
When the extractor derives the graph
Then the graph holds the pack {packId: "pack:probe.parity"} whose membership names {memberId: "spec:probe.member"}
Then the Markdown and TypeScript Pack nodes are equal apart from carrier file paths, and their membership edges are equal: {equal: true}

Open example

A Spec key on a Pack envelope is refused · spec:carrier.markdown-pack-authoring.spec-envelope-refused · ready floor ready

Executable Spec

Given an extraction root holding the pack carrier {carrierSource: "a Markdown pack manifest carrying kind: behavior"}
When the extractor derives the graph
Then the report names the refusal {findingId: "extract/unrecognized-property"} and the graph holds no pack node

Open example

Example space

Given an extraction root holding the pack carrier {carrierSource:string}
When the extractor derives the graph
Then the graph holds the pack {packId:string} whose membership names {memberId:string}
Then the report names the refusal {findingId:string} and the graph holds no pack node
Then the Markdown and TypeScript Pack nodes are equal apart from carrier file paths, and their membership edges are equal: {equal:boolean}
Verification

Verifier bindings

  • spec:carrier.markdown-pack-authoring.markdown-ts-parity · A Markdown Pack twin matches its TypeScript manifest · declared · example enabled · specs/carrier/markdown-pack-authoring.markdown-ts-parity.sdp.md

    External run evidence from test/self-hosting-pack-markdown.test.ts

    Test anchors: test:protocol.markdown-pack-authoring.markdown-ts-parity, test:protocol.markdown-pack-authoring.spec-envelope-refused. Specs verified by those bindings: spec:carrier.markdown-pack-authoring, spec:carrier.markdown-pack-authoring.markdown-ts-parity, spec:carrier.markdown-pack-authoring.spec-envelope-refused.

    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
    executes the bound example against a fresh worldA Markdown Pack twin matches its TypeScript manifest (spec:carrier.markdown-pack-authoring.markdown-ts-parity)passed29.16 ms
    executes the bound example against a fresh worldA Spec key on a Pack envelope is refused (spec:carrier.markdown-pack-authoring.spec-envelope-refused)passed1.66 ms
  • spec:carrier.markdown-pack-authoring.spec-envelope-refused · A Spec key on a Pack envelope is refused · declared · example enabled · specs/carrier/markdown-pack-authoring.spec-envelope-refused.sdp.md
  • test:protocol.roadmap-priority · checks Pack priority extraction, comparison and Studio change notes · anchored · test anchor binding present · test/roadmap-priority.test.ts:44

    External run evidence from test/roadmap-priority.test.ts

    Test anchors: test:protocol.roadmap-priority. Specs verified by those bindings: spec:carrier.markdown-pack-authoring, spec:consumers.design-diff, spec:consumers.spec-studio.diff-page, spec:consumers.spec-studio.pack-page, spec:extraction.pack-member-order, spec:model.pack-aggregate.

    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
    derives equal Markdown and TypeScript Pack nodes and edges, serializes order last, and exposes it through the readerroadmap priority manifestpassed45.69 ms
    refuses the invalid Markdown value readingroadmap priority manifestpassed1.85 ms
    refuses the invalid Markdown value arbitraryroadmap priority manifestpassed1.57 ms
    refuses the invalid Markdown value trueroadmap priority manifestpassed1.49 ms
    refuses the invalid Markdown value nullroadmap priority manifestpassed1.94 ms
    refuses the invalid Markdown value []roadmap priority manifestpassed1.71 ms
    refuses the invalid Markdown value {}roadmap priority manifestpassed1.43 ms
    refuses the invalid TypeScript value "reading"roadmap priority manifestpassed7.24 ms
    refuses the invalid TypeScript value "arbitrary"roadmap priority manifestpassed2.88 ms
    refuses the invalid TypeScript value trueroadmap priority manifestpassed3.36 ms
    refuses the invalid TypeScript value nullroadmap priority manifestpassed3.31 ms
    refuses the invalid TypeScript value []roadmap priority manifestpassed9.61 ms
    refuses the invalid TypeScript value {}roadmap priority manifestpassed3.83 ms
    refuses the invalid TypeScript value undefinedroadmap priority manifestpassed2.87 ms
    refuses the invalid TypeScript value chosenOrderroadmap priority manifestpassed4.04 ms
    names a removed Pack by its order meaning (priority true)roadmap priority design diffpassed19.39 ms
    names a removed Pack by its order meaning (priority false)roadmap priority design diffpassed17.38 ms
    names an added roadmap and preserves manifest order in its member deltaroadmap priority design diffpassed26.27 ms
    labels Pack membership by its order meaning (priority true)roadmap priority design diffpassed15.16 ms
    labels Pack membership by its order meaning (priority false)roadmap priority design diffpassed6.39 ms
    states order values when a change is not a known roadmap transitionroadmap priority design diffpassed11.93 ms
    documents the order comparison fields, default and diagnostic in the recipe contractroadmap priority design diffpassed1.3 ms
    compares a priority transition to true without a membership editroadmap priority design diffpassed10.9 ms
    compares a priority transition to false without a membership editroadmap priority design diffpassed6.76 ms
    reads an absent order as reading order in a base schema that predates the fieldroadmap priority design diffpassed14.49 ms
    marks the absent side of an added or removed roadmap as null (true)roadmap priority design diffpassed10.48 ms
    marks the absent side of an added or removed roadmap as null (false)roadmap priority design diffpassed4.24 ms
    diagnoses an unknown order at the base without reporting an order changeroadmap priority design diffpassed3.41 ms
    diagnoses an unknown order at the head without reporting an order changeroadmap priority design diffpassed4.06 ms
    still compares membership and member order when the base order is unknownroadmap priority design diffpassed5.37 ms
    still compares membership and member order when the head order is unknownroadmap priority design diffpassed9.28 ms
    keeps an order-only change in the selected Pack's comparison scoperoadmap priority design diffpassed3.1 ms
    shows no roadmap transition for a membership-only change (priority true)roadmap priority design diffpassed8.38 ms
    shows no roadmap transition for a membership-only change (priority false)roadmap priority design diffpassed7.43 ms
    shows the roadmap transition to true on the diff and Pack pagesroadmap priority design diffpassed8.78 ms
    shows the roadmap transition to false on the diff and Pack pagesroadmap priority design diffpassed17.15 ms

Example space

  • carrierSource · string · declared by an extraction root holding the pack carrier {carrierSource}

Bound points

ExamplecarrierSource
spec:carrier.markdown-pack-authoring.markdown-ts-parity"the Markdown twin of a TS manifest"
spec:carrier.markdown-pack-authoring.spec-envelope-refused"a Markdown pack manifest carrying kind: behavior"

Oracle binding: none

Coverage

carrierSource: "the Markdown twin of a TS manifest" · spec:carrier.markdown-pack-authoring.markdown-ts-parity; "a Markdown pack manifest carrying kind: behavior" · spec:carrier.markdown-pack-authoring.spec-envelope-refused · not enumerable

Unbound

  • carrierSource: None
Design view

Requirement drawing

Requirement drawing for spec:carrier.markdown-pack-authoring
  • E6: refines, verifies · declared

Scroll horizontally to read the whole drawing.

Requirement drawing for spec:carrier.markdown-pack-authoringsatisfies · anchoredsatisfies · anchoredsatisfies · anchoredrefines · declaredrefines, verifies · declaredE6verifies · anchoredverifies · anchoredverifies · anchoredIntended Specsspec:carrier.markdown-pack-authoringA Pack has a Markdownmanifest carrier…carrier.markdown-pack-authoringdeclared SpecDeclared verifying examplesspec:carrier.markdown-pack-authoring.markdown-ts-parityA Markdown Pack twinmatches its TypeScriptmanifest…carrier.markdown-pack-authoring.markdown-ts-paritydeclared Specspec:carrier.markdown-pack-authoring.spec-envelope-refusedA Spec key on a Packenvelope is refused…carrier.markdown-pack-authoring.spec-envelope-refuseddeclared SpecSatisfying or referencingunitsimpl:protocol.markdown-pack-authoringreifies the Markdown Packmanifest into the onecarrier path…protocol.markdown-pack-authoringanchored codeimpl:protocol.markdown-yaml-policybounded YAML scalars andrelation-target forms…protocol.markdown-yaml-policyanchored codeimpl:protocol.static-reificationreifies authored carriersfrom the AST and neverevaluates them…protocol.static-reificationanchored codeTest or oracle bindingstest:protocol.markdown-pack-authoring.markdown-ts-paritythe parity point verifiesequal Markdown andTypeScript Pack derivation…protocol.markdown-pack-authoring.markdown-ts-parityanchored test binding ·binding presenttest:protocol.markdown-pack-authoring.spec-envelope-refusedthe refusal point verifiesthe Markdown Pack closedenvelope…protocol.markdown-pack-authoring.spec-envelope-refusedanchored test binding ·binding presenttest:protocol.roadmap-prioritychecks Pack priorityextraction, comparison andStudio change notes…protocol.roadmap-priorityanchored test binding ·binding presentOutside the selected setspec:model.pack-aggregateA Pack is a truth-freereview aggregate…model.pack-aggregatedeclared Spec
The diagram as text
  • spec:carrier.markdown-pack-authoring: A Pack has a Markdown manifest carrier · declared Spec
  • spec:carrier.markdown-pack-authoring.markdown-ts-parity: A Markdown Pack twin matches its TypeScript manifest · declared Spec
  • spec:carrier.markdown-pack-authoring.spec-envelope-refused: A Spec key on a Pack envelope is refused · declared Spec
  • spec:model.pack-aggregate: A Pack is a truth-free review aggregate · declared Spec
  • impl:protocol.markdown-pack-authoring: reifies the Markdown Pack manifest into the one carrier path · anchored code · src/extract/markdown-pack.ts:117
  • impl:protocol.markdown-yaml-policy: bounded YAML scalars and relation-target forms · anchored code · src/extract/markdown-yaml-policy.ts:33
  • impl:protocol.static-reification: reifies authored carriers from the AST and never evaluates them · anchored code · src/extract/reify.ts:2139
  • test:protocol.markdown-pack-authoring.markdown-ts-parity: the parity point verifies equal Markdown and TypeScript Pack derivation · anchored test binding · binding present · test/self-hosting-pack-markdown.test.ts:241
  • test:protocol.markdown-pack-authoring.spec-envelope-refused: the refusal point verifies the Markdown Pack closed envelope · anchored test binding · binding present · test/self-hosting-pack-markdown.test.ts:247
  • test:protocol.roadmap-priority: checks Pack priority extraction, comparison and Studio change notes · anchored test binding · binding present · test/roadmap-priority.test.ts:44
  • spec:carrier.markdown-pack-authoring refines spec:model.pack-aggregate · declared
  • spec:carrier.markdown-pack-authoring.markdown-ts-parity refines spec:carrier.markdown-pack-authoring · declared
  • spec:carrier.markdown-pack-authoring.markdown-ts-parity verifies spec:carrier.markdown-pack-authoring · declared
  • spec:carrier.markdown-pack-authoring.spec-envelope-refused refines spec:carrier.markdown-pack-authoring · declared
  • spec:carrier.markdown-pack-authoring.spec-envelope-refused verifies spec:carrier.markdown-pack-authoring · declared
  • impl:protocol.markdown-pack-authoring satisfies spec:carrier.markdown-pack-authoring · anchored
  • impl:protocol.markdown-yaml-policy satisfies spec:carrier.markdown-pack-authoring · anchored
  • impl:protocol.static-reification satisfies spec:carrier.markdown-pack-authoring · anchored
  • test:protocol.markdown-pack-authoring.markdown-ts-parity verifies spec:carrier.markdown-pack-authoring.markdown-ts-parity · anchored
  • test:protocol.markdown-pack-authoring.spec-envelope-refused verifies spec:carrier.markdown-pack-authoring.spec-envelope-refused · anchored
  • test:protocol.roadmap-priority verifies spec:carrier.markdown-pack-authoring · 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

  • Packs have a Markdown manifest carrier

    A Pack's Markdown carrier is a .sdp.md file routed by the pack: envelope id namespace, closed to id · specs · modelRefs, with the H1 as title and remaining prose as framing; the TypeScript pack() builder stays a lawful per-ID option and the import source.

  • A roadmap states advisory priority in the graph

    A roadmap is a Pack whose manifest states order: priority; its members' authored order is the corpus's advisory priority, first entry first. order is an optional manifest field whose one lawful value is priority, and a Pack without it keeps the reading order every Pack has. Priority is preference among bodies of work and nothing more: it carries no date, no dependency, no status and no gate, and no check, recipe or page treats a place on a roadmap as permission, obligation or sequence. Everything a roadmap shows about an entry, what it still needs and what holds it, is read from the graph each time. A corpus may keep several roadmaps, and a Spec may be listed on any number of them.

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-pack-authoring · reifies the Markdown Pack manifest into the one carrier path · src/extract/markdown-pack.ts:117

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

    Uses

    None.

  • impl:protocol.markdown-yaml-policy · bounded YAML scalars and relation-target forms · src/extract/markdown-yaml-policy.ts:33

    Component: component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · 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:carrier.markdown-pack-authoring
The diagram as text
  • spec:carrier.markdown-pack-authoring: A Pack has a Markdown manifest carrier
  • spec:carrier.markdown-pack-authoring.markdown-ts-parity: A Markdown Pack twin matches its TypeScript manifest
  • spec:carrier.markdown-pack-authoring.spec-envelope-refused: A Spec key on a Pack envelope is refused
  • spec:carrier.markdown-parser: The Markdown parser reifies the ruled subset
  • spec:consumers.authoring-on-ramp: Authors move one Spec from intent to reviewed evidence
  • spec:decisions.carrier-ruling: Markdown is the default Spec carrier
  • spec:decisions.pack-markdown-carrier: Packs have a Markdown manifest carrier
  • spec:decisions.roadmap-priority: A roadmap states advisory priority in the graph
  • spec:extraction.pack-member-order: A Pack node keeps its members in authored order
  • spec:model.pack-aggregate: A Pack is a truth-free review aggregate
  • spec:carrier.markdown-pack-authoring decidedBy spec:decisions.pack-markdown-carrier · declared
  • spec:carrier.markdown-pack-authoring decidedBy spec:decisions.roadmap-priority · declared
  • spec:carrier.markdown-pack-authoring dependsOn spec:carrier.markdown-parser · declared
  • spec:carrier.markdown-pack-authoring dependsOn spec:decisions.carrier-ruling · declared
  • spec:carrier.markdown-pack-authoring refines spec:model.pack-aggregate · declared
  • spec:consumers.authoring-on-ramp dependsOn spec:carrier.markdown-pack-authoring · declared
  • spec:extraction.pack-member-order dependsOn spec:carrier.markdown-pack-authoring · declared
  • spec:carrier.markdown-pack-authoring.markdown-ts-parity refines spec:carrier.markdown-pack-authoring · declared
  • spec:carrier.markdown-pack-authoring.spec-envelope-refused refines spec:carrier.markdown-pack-authoring · declared
  • spec:carrier.markdown-pack-authoring.markdown-ts-parity verifies spec:carrier.markdown-pack-authoring · declared
  • spec:carrier.markdown-pack-authoring.spec-envelope-refused verifies spec:carrier.markdown-pack-authoring · 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

Relations

Relation and directionOther endClaimReasonExercised keys
decidedBy · outgoingPacks have a Markdown manifest carrier
spec:decisions.pack-markdown-carrier · resolves
declaredNoneNone
decidedBy · outgoingA roadmap states advisory priority in the graph
spec:decisions.roadmap-priority · resolves
declaredNoneNone
dependsOn · outgoingThe Markdown parser reifies the ruled subset
spec:carrier.markdown-parser · resolves
declaredNoneNone
dependsOn · outgoingMarkdown is the default Spec carrier
spec:decisions.carrier-ruling · resolves
declaredNoneNone
refines · outgoingA Pack is a truth-free review aggregate
spec:model.pack-aggregate · resolves
declaredNoneNone
dependsOn · incomingAuthors move one Spec from intent to reviewed evidence
spec:consumers.authoring-on-ramp · resolves
declaredNoneNone
dependsOn · incomingA Pack node keeps its members in authored order
spec:extraction.pack-member-order · resolves
declaredNoneNone
refines · incomingA Markdown Pack twin matches its TypeScript manifest
spec:carrier.markdown-pack-authoring.markdown-ts-parity · resolves
declaredNoneNone
refines · incomingA Spec key on a Pack envelope is refused
spec:carrier.markdown-pack-authoring.spec-envelope-refused · resolves
declaredNoneNone
verifies · incomingA Markdown Pack twin matches its TypeScript manifest
spec:carrier.markdown-pack-authoring.markdown-ts-parity · resolves
declaredNoneNone
verifies · incomingA Spec key on a Pack envelope is refused
spec:carrier.markdown-pack-authoring.spec-envelope-refused · resolves
declaredNoneNone

Bindings

Implementation binding: present

  • impl:protocol.markdown-pack-authoring · reifies the Markdown Pack manifest into the one carrier path · src/extract/markdown-pack.ts:117 · role extractor · component component:protocol.extract · layer application · context protocol
  • impl:protocol.markdown-yaml-policy · bounded YAML scalars and relation-target forms · src/extract/markdown-yaml-policy.ts:33 · role codec · component component:protocol.extract · layer application · 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

  • spec:carrier.markdown-pack-authoring.markdown-ts-parity · A Markdown Pack twin matches its TypeScript manifest · declared · specs/carrier/markdown-pack-authoring.markdown-ts-parity.sdp.md · example enabled
  • spec:carrier.markdown-pack-authoring.spec-envelope-refused · A Spec key on a Pack envelope is refused · declared · specs/carrier/markdown-pack-authoring.spec-envelope-refused.sdp.md · example enabled
  • test:protocol.roadmap-priority · checks Pack priority extraction, comparison and Studio change notes · anchored · test/roadmap-priority.test.ts:44 · 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.