outcomefile:// and uploads to a static host unchanged.sdp studio publishes the Studio as one page setspec:consumers.spec-studio.publisherPacks: pack:self-hosting-v1, pack:spec-studio-v1
Design: no design entries · no pinned declarations · 1 decision
Findings: no errors, no warnings
specs/consumers/spec-studio.publisher.sdp.md
No open questions and no blocking questions; implementation binding present, verifier binding present, and expected-outcome oracle none.
The Studio has its own verb and root beside the four shipped publishers, and is written the way they are. Its page set opens from the file system and uploads to a static host unchanged. The run adds no stamp, commit or time, so two runs over one graph write the same bytes, and a publishing step that wants build context writes its stamp beside the page set.
outcomefile:// and uploads to a static host unchanged.rule.verb line 25 · specs/consumers/spec-studio.publisher.sdp.md:25sdp studio [root] [--exclude PATH]... [--check-clean] validates the graph and writes the Studio's page set to <root>/generated/spec-studio/; root defaults to the working directory, and each exclusion is a root-relative path prefix, as for the shipped publishers.no example exercises it
rule.ownRoot line 26 · specs/consumers/spec-studio.publisher.sdp.md:26no example exercises it
rule.readsNoNetwork line 27 · specs/consumers/spec-studio.publisher.sdp.md:27no example exercises it
rule.wholesale line 28 · specs/consumers/spec-studio.publisher.sdp.md:28generated/spec-studio.tmp/, removes the prior root and renames the temporary into place, so no page of an earlier run survives a later one and no temporary survives a completed run.no example exercises it
rule.buildInvalidates line 29 · specs/consumers/spec-studio.publisher.sdp.md:29sdp studio among them, removes generated/spec-studio/ and its temporary sibling before extraction, beside the four roots spec:consumers.wholesale-view-rewrite#rule.buildInvalidates names; a removal failure refuses the command before extraction.no example exercises it
Cited at
test/skills.test.ts:1763rule.checkClean line 30 · specs/consumers/spec-studio.publisher.sdp.md:30sdp studio --check-clean renders an independent twin and refuses divergent renders, then compares the current root with the new render; missing or drifted output returns nonzero and is removed, and clean output is replaced wholesale with byte-identical content.no example exercises it
rule.findingsShown line 31 · specs/consumers/spec-studio.publisher.sdp.md:31no example exercises it
rule.pageSet line 32 · specs/consumers/spec-studio.publisher.sdp.md:32index.html, search.html, one packs/<name>.html and one slices/<name>.html per Pack, one specs/<name>.html per Spec, and assets/studio.css and assets/studio.js. <name> is the id after its namespace, with each uppercase ASCII letter written as _ and its lowercase, so no two pages collide on a file system that ignores case.no example exercises it
rule.deterministic line 33 · specs/consumers/spec-studio.publisher.sdp.md:33no example exercises it
rule.linksResolve line 34 · specs/consumers/spec-studio.publisher.sdp.md:34search.html#q=<term>, which names no element. No page links a carrier or source file, an editor URI or an external address; the only link that leaves the page set is one the stamp element adds in the browser from a present stamp's source template.no example exercises it
0 unkeyed rules.
Given an extraction root holding {corpus:"a Pack and its member Specs"|"a Spec with a validation error"|"a carrier the extractor refuses"} and a stale Studio page {stalePage:string}
When the studio command runs twice at that root, with check-clean {checkClean:boolean}
Then each run exits {exitCode:number}
Then the page set holds the entry page {entryPage:string}
Then the two runs wrote byte-identical files: {byteIdentical:boolean}
Then the stale page survives: {staleSurvives:boolean}
Then a temporary Studio sibling survives: {temporarySurvives:boolean}
Then every carrier and source file under the root stays byte-identical: {rootUntouched:boolean}
Then every link a page writes resolves inside the page set: {linksResolve:boolean}test/studio-data.test.ts:26test/studio-data.test.tsTest anchors: test:protocol.studio-data. Specs verified by those bindings: spec:consumers.spec-studio.data, spec:consumers.spec-studio.publisher.
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
| Name | Suite | Result | Duration |
|---|---|---|---|
| counts every Pack exactly as recipe 29 | Studio data over 'Protocol' | passed | 516.47 ms |
| keeps one search record per node, fields unchanged and bindings decoded | Studio data over 'Protocol' | passed | 443.96 ms |
| matches recipe 23's exact rows for suffix | Studio data over 'Protocol' | passed | 429.99 ms |
| matches recipe 23's exact rows for rule | Studio data over 'Protocol' | passed | 438.74 ms |
| matches recipe 23's exact rows for type | Studio data over 'Protocol' | passed | 374.75 ms |
| matches recipe 23's exact rows for outcome | Studio data over 'Protocol' | passed | 438.99 ms |
| matches recipe 23's exact rows for order | Studio data over 'Protocol' | passed | 362.31 ms |
| matches recipe 23's exact rows for decision | Studio data over 'Protocol' | passed | 302.81 ms |
| matches recipe 23's exact rows for graphOnly | Studio data over 'Protocol' | passed | 430.63 ms |
| keeps rails in Pack-id and authored-member order, with severity and space ownership | Studio data over 'Protocol' | passed | 356.57 ms |
| counts every Pack exactly as recipe 29 | Studio data over 'checkout' | passed | 3.92 ms |
| keeps one search record per node, fields unchanged and bindings decoded | Studio data over 'checkout' | passed | 3.37 ms |
| matches recipe 23's exact rows for suffix | Studio data over 'checkout' | passed | 4.05 ms |
| matches recipe 23's exact rows for rule | Studio data over 'checkout' | passed | 8.03 ms |
| matches recipe 23's exact rows for type | Studio data over 'checkout' | passed | 9.6 ms |
| matches recipe 23's exact rows for outcome | Studio data over 'checkout' | passed | 5.91 ms |
| matches recipe 23's exact rows for order | Studio data over 'checkout' | passed | 5.11 ms |
| matches recipe 23's exact rows for decision | Studio data over 'checkout' | passed | 2.74 ms |
| matches recipe 23's exact rows for graphOnly | Studio data over 'checkout' | passed | 3.89 ms |
| keeps rails in Pack-id and authored-member order, with severity and space ownership | Studio data over 'checkout' | passed | 3.39 ms |
| serializes embedded JSON with no literal less-than character | not recorded | passed | 0.34 ms |
| encodes uppercase ids without case-insensitive page collisions | not recorded | passed | 0.31 ms |
| preserves coined non-string entries, question and rule addresses and their lines | not recorded | passed | 0.83 ms |
| keeps term addresses, keys and physical lines aligned with recipe 23 | not recorded | passed | 4.8 ms |
| shares only parameterless recipe answers within one Studio evaluation | not recorded | passed | 1.52 ms |
test/studio-publisher.test.ts:26test/studio-publisher.test.tsTest anchors: test:protocol.studio-publisher. Specs verified by those bindings: spec:consumers.spec-studio, spec:consumers.spec-studio.publisher.
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
| Name | Suite | Result | Duration |
|---|---|---|---|
| validates once and passes the build report through the reader and recipe evaluations | Studio publication | passed | 50.27 ms |
| publishes the layout, copies fixture assets and replaces stale pages and temporary siblings | Studio publication | passed | 25.11 ms |
| writes byte-identical pages twice and opens every placeholder link inside the page set | Studio publication | passed | 39.7 ms |
| publishes validation findings and returns nonzero without withholding the pages | Studio publication | passed | 15.76 ms |
| shows a finding with an anchor subject or no subject only on the index | Studio publication | passed | 6.55 ms |
| leaves no root or temporary after an extraction failure | Studio publication | passed | 2.98 ms |
| build invalidates the Studio and its temporary sibling | Studio publication | passed | 3.34 ms |
| validate invalidates the Studio and its temporary sibling | Studio publication | passed | 2.46 ms |
| view invalidates the Studio and its temporary sibling | Studio publication | passed | 5.39 ms |
| census invalidates the Studio and its temporary sibling | Studio publication | passed | 4.66 ms |
| mermaid invalidates the Studio and its temporary sibling | Studio publication | passed | 5.42 ms |
| gherkin invalidates the Studio and its temporary sibling | Studio publication | passed | 3.03 ms |
| refuses extraction when invalidation cannot remove the Studio | Studio publication | passed | 0.92 ms |
| check-clean accepts clean pages and replaces them with identical bytes | Studio publication | passed | 27.5 ms |
| check-clean refuses missing output and removes it | Studio publication | passed | 17.99 ms |
| check-clean refuses drift output and removes it | Studio publication | passed | 31.43 ms |
| check-clean refuses stale output and removes it | Studio publication | passed | 26.93 ms |
| check-clean refuses independently divergent renders | Studio publication | passed | 23.75 ms |
| removes output when an asset cannot be read | Studio publication | passed | 6.12 ms |
| refuses a renderer path that would overwrite authored source | Studio publication | passed | 4.51 ms |
| dispatches studio with shared exclusions and advertises only its ruled flags | Studio publication | passed | 7.98 ms |
corpus · "a Pack and its member Specs" | "a Spec with a validation error" | "a carrier the extractor refuses" · declared by an extraction root holding {corpus} and a stale Studio page {stalePage}stalePage · string · declared by an extraction root holding {corpus} and a stale Studio page {stalePage}checkClean · boolean · declared by the studio command runs twice at that root, with check-clean {checkClean}No bound example points recorded.
Oracle binding: none
| Declared value | Examples |
|---|---|
"a Pack and its member Specs" | no example |
"a Spec with a validation error" | no example |
"a carrier the extractor refuses" | no example |
stalePage: No bound values · not enumerable
checkClean: No bound values · not enumerable
corpus: NonestalePage: NonecheckClean: NoneGiven
an extraction root holding {corpus:"a Pack and its member Specs"|"a Spec with a validation error"|"a carrier the extractor refuses"} and a stale Studio page {stalePage:string}When
the studio command runs twice at that root, with check-clean {checkClean:boolean}Then
each run exits {exitCode:number}
the page set holds the entry page {entryPage:string}
the two runs wrote byte-identical files: {byteIdentical:boolean}
the stale page survives: {staleSurvives:boolean}
a temporary Studio sibling survives: {temporarySurvives:boolean}
every carrier and source file under the root stays byte-identical: {rootUntouched:boolean}
every link a page writes resolves inside the page set: {linksResolve:boolean}Composing needs the script.
src/cli/build-command.ts:251src/cli/studio-command.ts:106src/projections/studio/pages/index.ts:21src/projections/studio/paths.ts:2src/projections/studio/publish.ts:24src/cli/studio-command.ts:122test/studio-s5.test.ts:346test/studio-data.test.ts:26test/studio-publisher.test.ts:26test/studio-s5.test.ts:359Copyable source; the Studio draws static SVG.
Preferred syntax: requirementDiagram. Chosen syntax: flowchart TB because models, folds require exact labels unavailable in requirement syntax.
Re-specifying the shipped Design Review, census, Mermaid, or Gherkin projection is refused. These four projections are the ruled read surfaces over the one graph. A later decision Spec that supersedes this one replaces the ruling whole; a decision Spec that refines this one narrows it for one projection or one rendering and leaves the rest frozen. Either passes the ADR three-part test.
component:protocol.cli · entry points, shared build and publication · src/cli/build-command.ts:32Uses
component:protocol.adapters · external runtime and source adapters · src/adapters/vitest.ts:23component:protocol.codegen · contracts and registrar output · src/codegen/contracts.ts:633component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192component:protocol.graph · the one graph and its semantic decisions · src/graph/schema.ts:34component:protocol.import · canonical conversion with a fidelity boundary · src/import/import.ts:45component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29Uses
component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192component:protocol.graph · the one graph and its semantic decisions · src/graph/schema.ts:34component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100component:protocol.notation · the leaf step codec · src/notation/slots.ts:261component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72impl:protocol.build-pipeline-emit · stages build outputs, checks determinism and invalidates projections · src/cli/build-command.ts:251Component: component:protocol.cli · entry points, shared build and publication · src/cli/build-command.ts:32
Uses
None.
impl:protocol.studio-command · validates and renders the Studio with independent byte checks and diagnostic exit codes · src/cli/studio-command.ts:106Component: component:protocol.cli · entry points, shared build and publication · src/cli/build-command.ts:32
Uses
None.
impl:protocol.studio-page-catalog · selects Studio pages, optional inputs and Pack exports · src/projections/studio/pages/index.ts:21Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29
Uses
None.
impl:protocol.studio-paths · encodes uppercase id letters for collision-free Pack and Spec page paths · src/projections/studio/paths.ts:2Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29
Uses
None.
impl:protocol.studio-publish · copies local assets and replaces the Studio directory through its temporary sibling · src/projections/studio/publish.ts:24Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29
Uses
None.
Runtime observation: not tracked.
Runtime observation: not tracked.
Build attestations: not tracked.
Deployments: not tracked.
Bills of materials: not tracked.
Shown as text: this drawing exceeds the height budget of 2000 pixels after folding.
Implementing units
impl:protocol.adopter-help · src/cli/help.ts:167impl:protocol.agent-surface-cli · src/cli/sdp.ts:94impl:protocol.build-args · src/cli/build-args.ts:11impl:protocol.generate-command · src/cli/generate-command.ts:34Referencing units
None.
Enabled verifiers: spec:consumers.command-line.generate-check-failure, spec:consumers.command-line.generate-writes-every-root, spec:consumers.command-line.verb-help-touches-nothing
Implementing units
impl:protocol.studio-base-input · src/cli/studio-inputs.ts:9impl:protocol.studio-command · src/cli/studio-command.ts:106impl:protocol.studio-inputs · src/projections/studio/inputs.ts:1Referencing units
None.
Enabled verifiers: spec:consumers.spec-studio.data.inputs.both-given, spec:consumers.spec-studio.data.inputs.graph-only
Implementing units
impl:protocol.studio-diagram-element · src/studio-elements/diagram.ts:23impl:protocol.studio-expander · src/studio-elements/expander.ts:16impl:protocol.studio-pack-export · src/projections/studio/pages/export-page.ts:35impl:protocol.studio-pack-page · src/projections/studio/pages/pack-page.ts:68Referencing units
None.
Enabled verifiers: spec:consumers.spec-studio.export.self-contained, test:protocol.studio-intent-handoff
Implementing units
impl:protocol.studio-watch · src/cli/studio-command.ts:122Referencing units
None.
Enabled verifiers: spec:consumers.spec-studio.publisher.watch.matches-plain-run
Implementing units
impl:protocol.studio-roadmap-page · src/projections/studio/pages/roadmap-page.ts:168Referencing units
None.
Enabled verifiers: test:protocol.studio-roadmap-page
Implementing units
impl:protocol.stamp-command · src/cli/stamp-command.ts:8impl:protocol.studio-preview-workflow · test/studio-s4.test.ts:742impl:protocol.studio-stamp · src/studio-elements/stamp.ts:30Referencing units
None.
Enabled verifiers: spec:consumers.spec-studio.sharing.stamp-written-apart
Implementing units
impl:protocol.studio-on-ramp · test/skills.test.ts:1693Referencing units
None.
Enabled verifiers: test:protocol.studio-on-ramp
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.command-line.generate-check-failure
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.command-line.generate-writes-every-root
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.command-line.verb-help-touches-nothing
Implementing units
impl:protocol.build-artifacts · src/cli/build-artifacts.ts:182impl:protocol.engine-provenance-cli · src/cli/sdp.ts:102Referencing units
None.
Enabled verifiers: test:protocol.engine-provenance
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.studio-inputs-both-given
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.studio-graph-only
Implementing units
impl:protocol.studio-diff · src/projections/studio/pages/diff-page.ts:91Referencing units
None.
Enabled verifiers: spec:consumers.spec-studio.diff-page.changed-entry, test:protocol.roadmap-priority
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.studio-export-contained
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.studio-watch-plain
Implementing units
None.
Referencing units
None.
Enabled verifiers: None
Packs: pack:roadmap, pack:self-hosting-v1
Implementing units
impl:protocol.studio-run-rows · src/projections/studio/pages/run-rows.ts:69impl:protocol.studio-runs-page · src/projections/studio/pages/runs-page.ts:6Referencing units
None.
Enabled verifiers: spec:consumers.spec-studio.runs-page.external-evidence
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.studio-stamp-apart
Implementing units
impl:protocol.studio-code-spans · src/projections/studio/pages/code-spans.ts:9impl:protocol.studio-frame · src/projections/studio/pages/frame.ts:6impl:protocol.studio-html · src/projections/studio/pages/html.ts:8impl:protocol.studio-text · src/projections/studio/pages/text.ts:7Referencing units
None.
Enabled verifiers: test:protocol.studio-pages
Implementing units
impl:protocol.studio-requirement-view · src/projections/studio/pages/requirement-view.ts:8impl:protocol.studio-spec-page · src/projections/studio/pages/spec-page.ts:201impl:protocol.studio-spec-structure · src/projections/studio/pages/spec-structure.ts:44Referencing units
None.
Enabled verifiers: spec:consumers.spec-studio.spec-page.cited-declaration, test:protocol.studio-architecture-maturity-requirement, test:protocol.studio-panels
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.studio-diff-changed-entry
Implementing units
impl:protocol.studio-index-page · src/projections/studio/pages/index-page.ts:8Referencing units
None.
Enabled verifiers: test:protocol.studio-pages
Implementing units
impl:protocol.studio-frame · src/projections/studio/pages/frame.ts:6impl:protocol.studio-index-page · src/projections/studio/pages/index-page.ts:8Referencing units
None.
Enabled verifiers: test:protocol.studio-navigation, test:protocol.studio-roadmap-page
Implementing units
impl:protocol.studio-owner-queue · src/projections/studio/pages/queue-page.ts:9Referencing units
None.
Enabled verifiers: spec:consumers.spec-studio.owner-queue.dependency-first
Implementing units
impl:protocol.studio-pack-page · src/projections/studio/pages/pack-page.ts:68Referencing units
None.
Enabled verifiers: test:protocol.roadmap-priority, test:protocol.studio-pages
Implementing units
component:protocol.studio-elements · src/studio-elements/index.ts:13impl:protocol.studio-copy · src/studio-elements/copy.ts:22impl:protocol.studio-expander · src/studio-elements/expander.ts:16impl:protocol.studio-filter · src/studio-elements/filter.ts:25impl:protocol.studio-search-form · src/studio-elements/search.ts:18impl:protocol.studio-search-results · src/studio-elements/search-results.ts:95impl:protocol.studio-stamp · src/studio-elements/stamp.ts:30Referencing units
None.
Enabled verifiers: test:protocol.studio-copy-source, test:protocol.studio-page-elements
Implementing units
impl:protocol.studio-registers · src/projections/studio/pages/registers-page.ts:47Referencing units
None.
Enabled verifiers: spec:consumers.spec-studio.registers.blocking-first
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.run-external
Implementing units
impl:protocol.studio-concept-match · src/reader/concept-match.ts:43impl:protocol.studio-search-page · src/projections/studio/pages/search-page.ts:5impl:protocol.studio-search-results · src/studio-elements/search-results.ts:95Referencing units
None.
Enabled verifiers: test:protocol.studio-concept-match, test:protocol.studio-page-elements, test:protocol.studio-pages
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.studio-cited-declaration
Implementing units
impl:protocol.studio-spec-page · src/projections/studio/pages/spec-page.ts:201Referencing units
None.
Enabled verifiers: test:protocol.studio-pages
Implementing units
impl:protocol.studio-run-rows · src/projections/studio/pages/run-rows.ts:69impl:protocol.studio-verification-panels · src/projections/studio/pages/spec-verification.ts:74Referencing units
None.
Enabled verifiers: spec:consumers.spec-studio.verification-panels.rule-coverage, test:protocol.studio-panels
Implementing units
impl:protocol.studio-capabilities-page · src/projections/studio/pages/capabilities-page.ts:78impl:protocol.studio-filter · src/studio-elements/filter.ts:25impl:protocol.studio-frame · src/projections/studio/pages/frame.ts:6impl:protocol.studio-index-page · src/projections/studio/pages/index-page.ts:8Referencing units
None.
Enabled verifiers: test:protocol.studio-capabilities
Implementing units
None.
Referencing units
None.
Enabled verifiers: None
Packs: pack:roadmap, pack:self-hosting-v1
Implementing units
impl:protocol.studio-diagram-source · src/projections/studio/diagrams/mermaid.ts:13impl:protocol.studio-diagrams · src/projections/studio/diagrams/svg.ts:73Referencing units
None.
Enabled verifiers: test:protocol.studio-diagram-core
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.studio-queue-dependency-first
Implementing units
impl:protocol.studio-maturity-map · src/projections/studio/pages/maturity-map.ts:7Referencing units
None.
Enabled verifiers: test:protocol.studio-architecture-maturity-requirement, test:protocol.studio-panels
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.studio-registers-blocking-first
Implementing units
impl:protocol.studio-slice-page · src/projections/studio/pages/slice-page.ts:25Referencing units
None.
Enabled verifiers: test:protocol.studio-slice-page
Implementing units
None.
Referencing units
None.
Enabled verifiers: test:protocol.studio-rule-coverage
| Relation and direction | Other end | Claim | Reason | Exercised keys |
|---|---|---|---|---|
| constrainedBy · outgoing | Committed source derives byte-identical outputspec:extraction.determinism · resolves | declared | None | None |
| decidedBy · outgoing | The shipped projections stay frozenspec:decisions.shipped-projections-frozen · resolves | declared | the Studio publishes to a root of its own beside the four frozen ones | None |
| dependsOn · outgoing | The Studio renders from the reader's values and embeds only what its script readsspec:consumers.spec-studio.data · resolves | declared | None | None |
| dependsOn · outgoing | Every view run rewrites the view wholesalespec:consumers.wholesale-view-rewrite · resolves | declared | the Studio's root is written, invalidated and certified the way the shipped roots are | None |
| refines · outgoing | The Spec Studio is a static HTML workbench over the one graphspec:consumers.spec-studio · resolves | declared | None | None |
| dependsOn · incoming | Every verb answers --help, and one verb writes every projection rootspec:consumers.command-line · resolves | declared | the Studio's page set is one of the roots the verb writes | None |
| dependsOn · incoming | The Studio reads two named inputs beside the graph, a base graph and run recordsspec:consumers.spec-studio.data.inputs · resolves | declared | each input is named by a flag of the studio verb | None |
| dependsOn · incoming | A Pack exports as one file, and every page prints as a documentspec:consumers.spec-studio.export · resolves | declared | the export files are part of the page set the publisher writes | None |
| dependsOn · incoming | The roadmap page shows the upcoming work in priority order, split by what it needsspec:consumers.spec-studio.roadmap-page · resolves | declared | an entry's element id carries the name the page set gives its roadmap's Pack page | None |
| dependsOn · incoming | A Studio build is stamped and shared from a static hostspec:consumers.spec-studio.sharing · resolves | declared | the stamp and the preview take the page set the publisher wrote | None |
| dependsOn · incoming | The Studio skill teaches agents to publish, share and read the Spec Studiospec:consumers.studio-on-ramp · resolves | declared | the skill teaches the verb, its watch and what each shared build removes | None |
| refines · incoming | sdp studio --watch rebuilds the page set on each carrier changespec:consumers.spec-studio.publisher.watch · resolves | declared | None | None |
impl:protocol.build-pipeline-emit · stages build outputs, checks determinism and invalidates projections · src/cli/build-command.ts:251component:protocol.cli · layer edge · context protocolimpl:protocol.studio-command · validates and renders the Studio with independent byte checks and diagnostic exit codes · src/cli/studio-command.ts:106component:protocol.cli · layer edge · context protocolimpl:protocol.studio-page-catalog · selects Studio pages, optional inputs and Pack exports · src/projections/studio/pages/index.ts:21component:protocol.projections · layer edge · context protocolimpl:protocol.studio-paths · encodes uppercase id letters for collision-free Pack and Spec page paths · src/projections/studio/paths.ts:2component:protocol.projections · layer edge · context protocolimpl:protocol.studio-publish · copies local assets and replaces the Studio directory through its temporary sibling · src/projections/studio/publish.ts:24component:protocol.projections · layer edge · context protocoltest/studio-data.test.ts:26test/studio-publisher.test.ts:26Runtime observation: not tracked.
Run results: not recorded in the graph.
None.
Composing needs the script.