Spec Studio

sdp studio publishes the Studio as one page set

spec:consumers.spec-studio.publisherUse Case / Behavior · storyready floor ready

Changed since the base graph base da4b141: rule.pageSet

Base input: schema 0.11.0, 405 Specs.

Packs: 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.

Intent
outcome
Publish the Studio under its own root as one page set the graph and its named inputs alone determine, which opens through file:// and uploads to a static host unchanged.
Behavior
rule.verb line 25 · specs/consumers/spec-studio.publisher.sdp.md:25
sdp 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:26
A run writes nothing outside its root, writes no stamp, and leaves every carrier and source file under the root byte-identical.

no example exercises it

rule.readsNoNetwork line 27 · specs/consumers/spec-studio.publisher.sdp.md:27
A run reads no network: every byte it reads is a file under the root, a file its flags name, or a file the package ships.

no example exercises it

rule.wholesale line 28 · specs/consumers/spec-studio.publisher.sdp.md:28
A run writes its page set to generated/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:29
Every command that enters the shared build, sdp 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:1763
rule.checkClean line 30 · specs/consumers/spec-studio.publisher.sdp.md:30
sdp 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:31
Findings never withhold the page set: a run over a graph with validation findings still publishes and returns the validation exit code, and each finding shows on the index, and also on its subject's page when its subject is a Spec or a Pack. A run whose extraction fails publishes nothing and returns nonzero.

no example exercises it

rule.pageSet line 32 · specs/consumers/spec-studio.publisher.sdp.md:32
The page set holds index.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:33
Two runs over one graph and the same inputs write byte-identical files, and no file holds a time, a commit, an absolute path or a host name of the run's own.

no example exercises it

rule.linksResolve line 34 · specs/consumers/spec-studio.publisher.sdp.md:34
Every link a page writes stays inside the page set: it resolves to a page the run wrote and, with a fragment, to an element id that page carries, apart from the search page's term fragment search.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.

Example space

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}
Verification

Verifier bindings

  • test:protocol.studio-data · anchored · test anchor binding present · test/studio-data.test.ts:26

    External run evidence from test/studio-data.test.ts

    Test anchors: test:protocol.studio-data. Specs verified by those bindings: spec:consumers.spec-studio.data, spec:consumers.spec-studio.publisher.

    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
    counts every Pack exactly as recipe 29Studio data over 'Protocol'passed555.49 ms
    keeps one search record per node, fields unchanged and bindings decodedStudio data over 'Protocol'passed417.56 ms
    matches recipe 23's exact rows for suffixStudio data over 'Protocol'passed439.94 ms
    matches recipe 23's exact rows for ruleStudio data over 'Protocol'passed440.19 ms
    matches recipe 23's exact rows for typeStudio data over 'Protocol'passed451.18 ms
    matches recipe 23's exact rows for outcomeStudio data over 'Protocol'passed360.45 ms
    matches recipe 23's exact rows for orderStudio data over 'Protocol'passed386.84 ms
    matches recipe 23's exact rows for decisionStudio data over 'Protocol'passed459.59 ms
    matches recipe 23's exact rows for graphOnlyStudio data over 'Protocol'passed460.52 ms
    keeps rails in Pack-id and authored-member order, with severity and space ownershipStudio data over 'Protocol'passed384.07 ms
    counts every Pack exactly as recipe 29Studio data over 'checkout'passed3.14 ms
    keeps one search record per node, fields unchanged and bindings decodedStudio data over 'checkout'passed2.34 ms
    matches recipe 23's exact rows for suffixStudio data over 'checkout'passed2.95 ms
    matches recipe 23's exact rows for ruleStudio data over 'checkout'passed4.28 ms
    matches recipe 23's exact rows for typeStudio data over 'checkout'passed4.34 ms
    matches recipe 23's exact rows for outcomeStudio data over 'checkout'passed7.48 ms
    matches recipe 23's exact rows for orderStudio data over 'checkout'passed4.54 ms
    matches recipe 23's exact rows for decisionStudio data over 'checkout'passed4.2 ms
    matches recipe 23's exact rows for graphOnlyStudio data over 'checkout'passed4.38 ms
    keeps rails in Pack-id and authored-member order, with severity and space ownershipStudio data over 'checkout'passed3.52 ms
    serializes embedded JSON with no literal less-than characternot recordedpassed0.34 ms
    encodes uppercase ids without case-insensitive page collisionsnot recordedpassed0.32 ms
    preserves coined non-string entries, question and rule addresses and their linesnot recordedpassed0.85 ms
    keeps term addresses, keys and physical lines aligned with recipe 23not recordedpassed5.18 ms
    shares only parameterless recipe answers within one Studio evaluationnot recordedpassed1.6 ms
  • test:protocol.studio-publisher · anchored · test anchor binding present · test/studio-publisher.test.ts:26

    External run evidence from test/studio-publisher.test.ts

    Test anchors: test:protocol.studio-publisher. Specs verified by those bindings: spec:consumers.spec-studio, spec:consumers.spec-studio.publisher.

    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
    validates once and passes the build report through the reader and recipe evaluationsStudio publicationpassed63.16 ms
    publishes the layout, copies fixture assets and replaces stale pages and temporary siblingsStudio publicationpassed29.14 ms
    writes byte-identical pages twice and opens every placeholder link inside the page setStudio publicationpassed50.97 ms
    publishes validation findings and returns nonzero without withholding the pagesStudio publicationpassed17.66 ms
    shows a finding with an anchor subject or no subject only on the indexStudio publicationpassed9.35 ms
    leaves no root or temporary after an extraction failureStudio publicationpassed5.46 ms
    build invalidates the Studio and its temporary siblingStudio publicationpassed3.24 ms
    validate invalidates the Studio and its temporary siblingStudio publicationpassed2.84 ms
    view invalidates the Studio and its temporary siblingStudio publicationpassed5.54 ms
    census invalidates the Studio and its temporary siblingStudio publicationpassed4.17 ms
    mermaid invalidates the Studio and its temporary siblingStudio publicationpassed3.82 ms
    gherkin invalidates the Studio and its temporary siblingStudio publicationpassed4.73 ms
    refuses extraction when invalidation cannot remove the StudioStudio publicationpassed0.64 ms
    check-clean accepts clean pages and replaces them with identical bytesStudio publicationpassed28.74 ms
    check-clean refuses missing output and removes itStudio publicationpassed18.89 ms
    check-clean refuses drift output and removes itStudio publicationpassed40.87 ms
    check-clean refuses stale output and removes itStudio publicationpassed22.5 ms
    check-clean refuses independently divergent rendersStudio publicationpassed25.67 ms
    removes output when an asset cannot be readStudio publicationpassed8.4 ms
    refuses a renderer path that would overwrite authored sourceStudio publicationpassed6.22 ms
    dispatches studio with shared exclusions and advertises only its ruled flagsStudio publicationpassed9.67 ms

Example space

  • 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}

Bound points

No bound example points recorded.

Oracle binding: none

Coverage

corpus
Declared valueExamples
"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

Unbound

  • corpus: None
  • stalePage: None
  • checkClean: None
Design view

Requirement drawing

Requirement drawing for spec:consumers.spec-studio.publisher
The diagram as text
  • spec:consumers.spec-studio.publisher: sdp studio publishes the Studio as one page set · declared Spec
  • spec:consumers.spec-studio.publisher.watch: sdp studio --watch rebuilds the page set on each carrier change · declared Spec
  • spec:consumers.spec-studio.publisher.watch.matches-plain-run: Each watch cycle writes the page set a plain run writes · declared Spec
  • spec:consumers.spec-studio: The Spec Studio is a static HTML workbench over the one graph · declared Spec
  • impl:protocol.build-pipeline-emit: stages build outputs, checks determinism and invalidates projections · anchored code · src/cli/build-command.ts:251
  • impl:protocol.studio-command: validates and renders the Studio with independent byte checks and diagnostic exit codes · anchored code · src/cli/studio-command.ts:106
  • impl:protocol.studio-page-catalog: selects Studio pages, optional inputs and Pack exports · anchored code · src/projections/studio/pages/index.ts:21
  • impl:protocol.studio-paths: encodes uppercase id letters for collision-free Pack and Spec page paths · anchored code · src/projections/studio/paths.ts:2
  • impl:protocol.studio-publish: copies local assets and replaces the Studio directory through its temporary sibling · anchored code · src/projections/studio/publish.ts:24
  • impl:protocol.studio-watch: awaits the plain Studio publication in each coalesced carrier-watch cycle · anchored code · src/cli/studio-command.ts:122
  • oracle:protocol.studio-watch: oracle:protocol.studio-watch · anchored oracle binding · test/studio-s5.test.ts:346
  • test:protocol.studio-data: test:protocol.studio-data · anchored test binding · binding present · test/studio-data.test.ts:26
  • test:protocol.studio-publisher: test:protocol.studio-publisher · anchored test binding · binding present · test/studio-publisher.test.ts:26
  • test:protocol.studio-watch-plain: test:protocol.studio-watch-plain · anchored test binding · binding present · test/studio-s5.test.ts:359
  • spec:consumers.spec-studio.publisher refines spec:consumers.spec-studio · declared
  • spec:consumers.spec-studio.publisher.watch refines spec:consumers.spec-studio.publisher · declared
  • spec:consumers.spec-studio.publisher.watch.matches-plain-run refines spec:consumers.spec-studio.publisher.watch · declared
  • spec:consumers.spec-studio.publisher.watch.matches-plain-run verifies spec:consumers.spec-studio.publisher.watch · declared
  • impl:protocol.build-pipeline-emit satisfies spec:consumers.spec-studio.publisher · anchored
  • impl:protocol.studio-command satisfies spec:consumers.spec-studio.publisher · anchored
  • impl:protocol.studio-page-catalog satisfies spec:consumers.spec-studio.publisher · anchored
  • impl:protocol.studio-paths satisfies spec:consumers.spec-studio.publisher · anchored
  • impl:protocol.studio-publish satisfies spec:consumers.spec-studio.publisher · anchored
  • impl:protocol.studio-watch satisfies spec:consumers.spec-studio.publisher.watch · anchored
  • oracle:protocol.studio-watch models spec:consumers.spec-studio.publisher.watch · anchored
  • test:protocol.studio-data verifies spec:consumers.spec-studio.publisher · anchored
  • test:protocol.studio-publisher verifies spec:consumers.spec-studio.publisher · anchored
  • test:protocol.studio-watch-plain verifies spec:consumers.spec-studio.publisher.watch.matches-plain-run · 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

  • The shipped projections stay frozen

    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.

Runtime
  • component:protocol.cli · entry points, shared build and publication · src/cli/build-command.ts:32 · layer edge · context protocol

    Uses

    • component:protocol.adapters · external runtime and source adapters · src/adapters/vitest.ts:23 · layer adapter · context protocol
    • component:protocol.codegen · contracts and registrar output · src/codegen/contracts.ts:633 · layer application · context protocol
    • component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · context protocol
    • component:protocol.graph · the one graph and its semantic decisions · src/graph/schema.ts:34 · layer domain · context protocol
    • component:protocol.import · canonical conversion with a fidelity boundary · src/import/import.ts:45 · layer application · context protocol
    • component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol
    • component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol
    • component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol
    • component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol
  • component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

    • component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · context protocol
    • 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.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol
    • component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol
  • impl:protocol.build-pipeline-emit · stages build outputs, checks determinism and invalidates projections · src/cli/build-command.ts:251

    Component: component:protocol.cli · entry points, shared build and publication · src/cli/build-command.ts:32 · layer edge · context protocol

    Uses

    None.

  • impl:protocol.studio-command · validates and renders the Studio with independent byte checks and diagnostic exit codes · src/cli/studio-command.ts:106

    Component: component:protocol.cli · entry points, shared build and publication · src/cli/build-command.ts:32 · layer edge · context protocol

    Uses

    None.

  • impl:protocol.studio-page-catalog · selects Studio pages, optional inputs and Pack exports · src/projections/studio/pages/index.ts:21

    Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

    None.

  • impl:protocol.studio-paths · encodes uppercase id letters for collision-free Pack and Spec page paths · src/projections/studio/paths.ts:2

    Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

    None.

  • impl:protocol.studio-publish · copies local assets and replaces the Studio directory through its temporary sibling · src/projections/studio/publish.ts:24

    Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · 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:consumers.spec-studio.publisher

Shown as text: this drawing exceeds the height budget of 2000 pixels after folding.

The diagram as text
  • spec:consumers.command-line: Every verb answers --help, and one verb writes every projection root
  • spec:consumers.spec-studio: The Spec Studio is a static HTML workbench over the one graph
  • spec:consumers.spec-studio.data: The Studio renders from the reader's values and embeds only what its script reads
  • spec:consumers.spec-studio.data.inputs: The Studio reads two named inputs beside the graph, a base graph and run records
  • spec:consumers.spec-studio.export: A Pack exports as one file, and every page prints as a document
  • spec:consumers.spec-studio.publisher: sdp studio publishes the Studio as one page set
  • spec:consumers.spec-studio.publisher.watch: sdp studio --watch rebuilds the page set on each carrier change
  • spec:consumers.spec-studio.roadmap-page: The roadmap page shows the upcoming work in priority order, split by what it needs
  • spec:consumers.spec-studio.sharing: A Studio build is stamped and shared from a static host
  • spec:consumers.studio-on-ramp: The Studio skill teaches agents to publish, share and read the Spec Studio
  • spec:consumers.wholesale-view-rewrite: Every view run rewrites the view wholesale
  • spec:decisions.shipped-projections-frozen: The shipped projections stay frozen
  • spec:extraction.determinism: Committed source derives byte-identical output
  • spec:consumers.spec-studio.publisher constrainedBy spec:extraction.determinism · declared
  • spec:consumers.spec-studio.publisher decidedBy spec:decisions.shipped-projections-frozen · declared — the Studio publishes to a root of its own beside the four frozen ones
  • spec:consumers.spec-studio.publisher dependsOn spec:consumers.spec-studio.data · declared
  • spec:consumers.spec-studio.publisher dependsOn spec:consumers.wholesale-view-rewrite · declared — the Studio's root is written, invalidated and certified the way the shipped roots are
  • spec:consumers.spec-studio.publisher refines spec:consumers.spec-studio · declared
  • spec:consumers.command-line dependsOn spec:consumers.spec-studio.publisher · declared — the Studio's page set is one of the roots the verb writes
  • spec:consumers.spec-studio.data.inputs dependsOn spec:consumers.spec-studio.publisher · declared — each input is named by a flag of the studio verb
  • spec:consumers.spec-studio.export dependsOn spec:consumers.spec-studio.publisher · declared — the export files are part of the page set the publisher writes
  • spec:consumers.spec-studio.roadmap-page dependsOn spec:consumers.spec-studio.publisher · declared — an entry's element id carries the name the page set gives its roadmap's Pack page
  • spec:consumers.spec-studio.sharing dependsOn spec:consumers.spec-studio.publisher · declared — the stamp and the preview take the page set the publisher wrote
  • spec:consumers.studio-on-ramp dependsOn spec:consumers.spec-studio.publisher · declared — the skill teaches the verb, its watch and what each shared build removes
  • spec:consumers.spec-studio.publisher.watch refines spec:consumers.spec-studio.publisher · declared

Rests on

Rested on by

Distance 1

Distance 2

Distance 3

Distance 4

Relations

Relation and directionOther endClaimReasonExercised keys
constrainedBy · outgoingCommitted source derives byte-identical output
spec:extraction.determinism · resolves
declaredNoneNone
decidedBy · outgoingThe shipped projections stay frozen
spec:decisions.shipped-projections-frozen · resolves
declaredthe Studio publishes to a root of its own beside the four frozen onesNone
dependsOn · outgoingThe Studio renders from the reader's values and embeds only what its script reads
spec:consumers.spec-studio.data · resolves
declaredNoneNone
dependsOn · outgoingEvery view run rewrites the view wholesale
spec:consumers.wholesale-view-rewrite · resolves
declaredthe Studio's root is written, invalidated and certified the way the shipped roots areNone
refines · outgoingThe Spec Studio is a static HTML workbench over the one graph
spec:consumers.spec-studio · resolves
declaredNoneNone
dependsOn · incomingEvery verb answers --help, and one verb writes every projection root
spec:consumers.command-line · resolves
declaredthe Studio's page set is one of the roots the verb writesNone
dependsOn · incomingThe Studio reads two named inputs beside the graph, a base graph and run records
spec:consumers.spec-studio.data.inputs · resolves
declaredeach input is named by a flag of the studio verbNone
dependsOn · incomingA Pack exports as one file, and every page prints as a document
spec:consumers.spec-studio.export · resolves
declaredthe export files are part of the page set the publisher writesNone
dependsOn · incomingThe roadmap page shows the upcoming work in priority order, split by what it needs
spec:consumers.spec-studio.roadmap-page · resolves
declaredan entry's element id carries the name the page set gives its roadmap's Pack pageNone
dependsOn · incomingA Studio build is stamped and shared from a static host
spec:consumers.spec-studio.sharing · resolves
declaredthe stamp and the preview take the page set the publisher wroteNone
dependsOn · incomingThe Studio skill teaches agents to publish, share and read the Spec Studio
spec:consumers.studio-on-ramp · resolves
declaredthe skill teaches the verb, its watch and what each shared build removesNone
refines · incomingsdp studio --watch rebuilds the page set on each carrier change
spec:consumers.spec-studio.publisher.watch · resolves
declaredNoneNone

Bindings

Implementation binding: present

  • impl:protocol.build-pipeline-emit · stages build outputs, checks determinism and invalidates projections · src/cli/build-command.ts:251 · role service · component component:protocol.cli · layer edge · context protocol
  • impl:protocol.studio-command · validates and renders the Studio with independent byte checks and diagnostic exit codes · src/cli/studio-command.ts:106 · role publisher · component component:protocol.cli · layer edge · context protocol
  • impl:protocol.studio-page-catalog · selects Studio pages, optional inputs and Pack exports · src/projections/studio/pages/index.ts:21 · role projection · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.studio-paths · encodes uppercase id letters for collision-free Pack and Spec page paths · src/projections/studio/paths.ts:2 · role codec · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.studio-publish · copies local assets and replaces the Studio directory through its temporary sibling · src/projections/studio/publish.ts:24 · role publisher · component component:protocol.projections · layer edge · context protocol

Design reference: none

Verifier binding: present

  • test:protocol.studio-data · anchored · test/studio-data.test.ts:26 · test anchor
  • test:protocol.studio-publisher · anchored · test/studio-publisher.test.ts:26 · 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.