Spec Studio

The runs page shows the run records the build was given, joined to test files

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

Packs: pack:self-hosting-v1, pack:spec-studio-v1

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

Findings: no errors, no warnings

specs/consumers/spec-studio.runs-page.sdp.md

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

CI keeps the results of its test runs; the graph records only that a verifier is bound. Given run records in the Common Test Report Format, the build shows each run and the test files it joins, so a reviewer reads what ran where the verifiers are anchored. A result is evidence from a file, never the verdict of one verifier, and never a delivery fact.

Intent
outcome
Let a person read, from a link, the test runs the build was given, which anchored test files each joins, and which records join none, each labelled as external evidence.
Behavior
rule.onlyWithRuns line 23 · specs/consumers/spec-studio.runs-page.sdp.md:23
The page set holds runs.html only when the build was given run records; without them, no page, link or row names a run.

no example exercises it

rule.namesEachRun line 24 · specs/consumers/spec-studio.runs-page.sdp.md:24
The page names each run by its position among the inputs and its own fields: its tool and version, its build name and number, its branch, its commit, and its start and stop times as recorded, a field the record lacks reading not recorded.

spec:consumers.spec-studio.runs-page.external-evidence · enabled

rule.externalEvidence line 25 · specs/consumers/spec-studio.runs-page.sdp.md:25
Every place a run shows, on this page, in the tests lens and on a Spec page, says in words that it is external run evidence from a test file, and none says that a Spec or a verifier passed.

spec:consumers.spec-studio.runs-page.external-evidence · enabled

rule.runSections line 26 · specs/consumers/spec-studio.runs-page.sdp.md:26
For each run the page shows how many of its tests passed, failed, were skipped, pending or other, in words, then each test file it joins, with the test anchors in that file, the Specs they verify, linked, and each test's name, suite, result in words and duration, then the records that join no test anchor, each with its reason, no file path or no test anchor in that file.

spec:consumers.spec-studio.runs-page.external-evidence · enabled

rule.commitShown line 27 · specs/consumers/spec-studio.runs-page.sdp.md:27
Each run shows its commit, and the page never says a run is fresh or stale; a stamp present beside the page set names the corpus commit the publishing step recorded, so a reader compares the two.

no example exercises it

Cited at

  • test/skills.test.ts:1841
rule.diagnosticsShown line 28 · specs/consumers/spec-studio.runs-page.sdp.md:28
An input recipe 45 cannot read as a run record shows with its problem, and the other inputs still show.

no example exercises it

rule.packPageSentence line 29 · specs/consumers/spec-studio.runs-page.sdp.md:29
Given run records, the sentence over a Pack page's members with no verifier binding also says that the runs page, the tests lens and the Spec pages of the Specs their files verify show the run records as external evidence from test files; it never says that no page shows a run result.

no example exercises it

0 unkeyed rules.

Verifying examples

The runs page shows a run as external evidence from a test file · spec:consumers.spec-studio.runs-page.external-evidence · ready floor ready

Executable Spec

Given one CTRF report whose tool is {tool: "vitest"} at version {version: "3.2.4"}, and whose tests in an anchored test file {passed: 2} passed and {failed: 1} failed
When the build renders the runs page
Then the run's heading reads {heading: "Run 1: external run evidence from vitest 3.2.4"}
Then the page lists {rows: 3} results under that test file
Then a page says that a Spec or a verifier passed: {verdict: false}

Open example

Example space

Given one CTRF report whose tool is {tool:string} at version {version:string}, and whose tests in an anchored test file {passed:number} passed and {failed:number} failed
When the build renders the runs page
Then the run's heading reads {heading:string}
Then the page lists {rows:number} results under that test file
Then a page says that a Spec or a verifier passed: {verdict:boolean}
UI
runHeader line 32 · specs/consumers/spec-studio.runs-page.sdp.md:32
Run <n>: external run evidence from <tool> <version>, <n> the input's position counting from 1 and the version left out when the record names none, then a line with the build, branch, commit and times, each labelled, a time written as an ISO 8601 UTC time from the milliseconds the record holds.
fileRow line 33 · specs/consumers/spec-studio.runs-page.sdp.md:33
the file as text with a copy action, the anchors in it as code, the Specs they verify as links, then a table of results with columns name, suite, result and duration. A duration shows milliseconds with at most two decimals, rounded and without trailing zeroes, as 2.84 ms, 0.46 ms or 12 ms; short headers and one-word cells never break inside a word.
unjoinedRow line 34 · specs/consumers/spec-studio.runs-page.sdp.md:34
the test's name, its file path or no file path, its result in words, and the reason.
Verification

Verifier bindings

  • spec:consumers.spec-studio.runs-page.external-evidence · The runs page shows a run as external evidence from a test file · declared · example enabled · specs/consumers/spec-studio.runs-page.external-evidence.sdp.md

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

    Test anchors: test:protocol.run-absolute, test:protocol.run-external, test:protocol.run-unjoined, test:protocol.studio-graph-only, test:protocol.studio-inputs-both-given, test:protocol.studio-stamp-apart. Specs verified by those bindings: spec:consumers.spec-studio.data.inputs, spec:consumers.spec-studio.data.inputs.both-given, spec:consumers.spec-studio.data.inputs.graph-only, spec:consumers.spec-studio.runs-page, spec:consumers.spec-studio.runs-page.external-evidence, spec:consumers.spec-studio.sharing, spec:consumers.spec-studio.sharing.stamp-written-apart, spec:observation.run-evidence, spec:observation.run-evidence.absolute-path-joins, spec:observation.run-evidence.unanchored-file-unjoined.

    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
    recipe 45 joins normalized paths, preserves records and graph facts, and diagnoses other inputsnot recordedpassed32.43 ms
    renders external run evidence with result rows, metadata, diagnostics and conditional navigationnot recordedpassed64.35 ms
    reads repeated --runs before extraction and leaves input bytes untouchednot recordedpassed65.17 ms
    stamps apart, touches no page, refuses bad sources and removes the stamp on rebuildnot recordedpassed33.53 ms
    executes the bound example against a fresh worldA test whose reporter wrote an absolute path joins its anchored file (spec:observation.run-evidence.absolute-path-joins)passed6.06 ms
    executes the bound example against a fresh worldA test in a file with no test anchor is reported as unjoined (spec:observation.run-evidence.unanchored-file-unjoined)passed7.32 ms
    executes the bound example against a fresh worldThe runs page shows a run as external evidence from a test file (spec:consumers.spec-studio.runs-page.external-evidence)passed10.49 ms
    executes the bound example against a fresh worldWithout inputs the page set is the graph's alone (spec:consumers.spec-studio.data.inputs.graph-only)passed26.8 ms
    executes the bound example against a fresh worldBoth inputs add their pages, named, and the same inputs write the same bytes (spec:consumers.spec-studio.data.inputs.both-given)passed76.23 ms
    executes the bound example against a fresh worldThe stamp is written beside the page set, and a later build removes it (spec:consumers.spec-studio.sharing.stamp-written-apart)passed31.42 ms
    the stamp links source locations only after an HTTP stamp loads, encoding path segmentsnot recordedpassed4.11 ms
    recipe 45 picks the longest suffix and scopes through enabled examples at file grainnot recordedpassed8.33 ms
    ships a reusable preview, disabled by default, and deploys its own pull requests with runs and diffnot recordedpassed8.77 ms
    the tests lens counts file results once per Spec and names every run inputnot recordedpassed22.51 ms
    the Pack sentence keeps the graph's binding limit and positively names external evidencenot recordedpassed19.64 ms
    run metadata labels build and branch, and absent fields read not recordednot recordedpassed0.51 ms
    unjoined records escape outside names and explain both reason codes in wordsnot recordedpassed8.74 ms
    run files show the file alone, bindings and Suite, with one header per runnot recordedpassed8.99 ms
    recipe 45 does not join a suffix inside a path segmentnot recordedpassed3.02 ms
    stamp defaults to unknown and a stamped page set passes check-cleannot recordedpassed30.07 ms
    every reusable preview job's permissions fit the CI caller's grantnot recordedpassed15.2 ms
    PR checks and preview stamps name the same default merge checkoutnot recordedpassed7.86 ms
    preview download is optional and cancelled or skipped checks do not call itnot recordedpassed7.96 ms
    deploy checks the enabled Pages source before writing: gh-pagesnot recordedpassed28.99 ms
    deploy checks the enabled Pages source before writing: mainnot recordedpassed34.99 ms
    deploy checks the enabled Pages source before writing: disablednot recordedpassed11.65 ms
    deploy succeeds only once Pages publishes the pushed commit: an unrelated errored build is newestnot recordedpassed127.2 ms
    deploy succeeds only once Pages publishes the pushed commit: a retried build follows an errored onenot recordedpassed62.59 ms
    deploy succeeds only once Pages publishes the pushed commit: the build errorsnot recordedpassed40.96 ms
    deploy succeeds only once Pages publishes the pushed commit: the commit is never builtnot recordedpassed902.58 ms
    deploy succeeds only once Pages publishes the pushed commit: the answer arrives after the waitnot recordedpassed1531.29 ms
    preview still stamps and uploads rendered pages when evidence is absent and validation failsnot recordedpassed92.59 ms
    places external file rows under their verifier and renders shared files oncenot recordedpassed41.84 ms
    accepts the preview workflow's base and run flags togethernot recordedpassed22.06 ms
    formats external run durations to at most two decimals on every pagenot recordedpassed21.61 ms

Example space

  • tool · string · declared by one CTRF report whose tool is {tool} at version {version}, and whose tests in an anchored test file {passed} passed and {failed} failed
  • version · string · declared by one CTRF report whose tool is {tool} at version {version}, and whose tests in an anchored test file {passed} passed and {failed} failed
  • passed · number · declared by one CTRF report whose tool is {tool} at version {version}, and whose tests in an anchored test file {passed} passed and {failed} failed
  • failed · number · declared by one CTRF report whose tool is {tool} at version {version}, and whose tests in an anchored test file {passed} passed and {failed} failed

Bound points

Exampletoolversionpassedfailed
spec:consumers.spec-studio.runs-page.external-evidence"vitest""3.2.4"21

Oracle binding: present · oracle:protocol.runs-page · test/studio-s4.test.ts:360

Coverage

tool: "vitest" · spec:consumers.spec-studio.runs-page.external-evidence · not enumerable

version: "3.2.4" · spec:consumers.spec-studio.runs-page.external-evidence · not enumerable

passed: 2 · spec:consumers.spec-studio.runs-page.external-evidence · not enumerable

failed: 1 · spec:consumers.spec-studio.runs-page.external-evidence · not enumerable

Unbound

  • tool: None
  • version: None
  • passed: None
  • failed: None
Design view

Requirement drawing

Requirement drawing for spec:consumers.spec-studio.runs-page
The diagram as text
  • spec:consumers.spec-studio.runs-page: The runs page shows the run records the build was given, joined to test files · declared Spec
  • spec:consumers.spec-studio.runs-page.external-evidence: The runs page shows a run as external evidence from a test file · declared Spec
  • spec:consumers.spec-studio: The Spec Studio is a static HTML workbench over the one graph · declared Spec
  • impl:protocol.studio-run-rows: renders recipe 45 file rows shared by the runs page and verification panel · anchored code · src/projections/studio/pages/run-rows.ts:69
  • impl:protocol.studio-runs-page: renders readable CTRF inputs, file results, unjoined records and diagnostics · anchored code · src/projections/studio/pages/runs-page.ts:6
  • oracle:protocol.runs-page: oracle:protocol.runs-page · anchored oracle binding · test/studio-s4.test.ts:360
  • test:protocol.run-external: test:protocol.run-external · anchored test binding · binding present · test/studio-s4.test.ts:378
  • spec:consumers.spec-studio.runs-page refines spec:consumers.spec-studio · declared
  • spec:consumers.spec-studio.runs-page.external-evidence refines spec:consumers.spec-studio.runs-page · declared
  • spec:consumers.spec-studio.runs-page.external-evidence verifies spec:consumers.spec-studio.runs-page · declared
  • impl:protocol.studio-run-rows satisfies spec:consumers.spec-studio.runs-page · anchored
  • impl:protocol.studio-runs-page satisfies spec:consumers.spec-studio.runs-page · anchored
  • oracle:protocol.runs-page models spec:consumers.spec-studio.runs-page · anchored
  • test:protocol.run-external verifies spec:consumers.spec-studio.runs-page.external-evidence · anchored
Mermaid source

Copyable source; the Studio draws static SVG.

Preferred syntax: requirementDiagram. Chosen syntax: flowchart TB because models require exact labels unavailable in requirement syntax.

Decisions

Runtime
  • 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.studio-run-rows · renders recipe 45 file rows shared by the runs page and verification panel · src/projections/studio/pages/run-rows.ts:69

    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-runs-page · renders readable CTRF inputs, file results, unjoined records and diagnostics · src/projections/studio/pages/runs-page.ts:6

    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.runs-page
The diagram as text
  • spec:consumers.spec-studio: The Spec Studio is a static HTML workbench over the one graph
  • 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.runs-page: The runs page shows the run records the build was given, joined to test files
  • spec:consumers.spec-studio.runs-page.external-evidence: The runs page shows a run as external evidence from a test file
  • spec:decisions.binding-not-liveness: Bindings state existence, not liveness
  • spec:observation.run-evidence: CI run records are joined to verifiers in a view
  • spec:consumers.spec-studio.runs-page decidedBy spec:decisions.binding-not-liveness · declared
  • spec:consumers.spec-studio.runs-page dependsOn spec:consumers.spec-studio.data.inputs · declared — the run records reach the page as the build's named runs input
  • spec:consumers.spec-studio.runs-page dependsOn spec:observation.run-evidence · declared — the page renders the run evidence recipe 45 joins from the run records
  • spec:consumers.spec-studio.runs-page refines spec:consumers.spec-studio · declared
  • spec:consumers.spec-studio.runs-page.external-evidence refines spec:consumers.spec-studio.runs-page · declared
  • spec:consumers.spec-studio.runs-page.external-evidence verifies spec:consumers.spec-studio.runs-page · 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

Relations

Relation and directionOther endClaimReasonExercised keys
decidedBy · outgoingBindings state existence, not liveness
spec:decisions.binding-not-liveness · resolves
declaredNoneNone
dependsOn · outgoingThe Studio reads two named inputs beside the graph, a base graph and run records
spec:consumers.spec-studio.data.inputs · resolves
declaredthe run records reach the page as the build's named runs inputNone
dependsOn · outgoingCI run records are joined to verifiers in a view
spec:observation.run-evidence · resolves
declaredthe page renders the run evidence recipe 45 joins from the run recordsNone
refines · outgoingThe Spec Studio is a static HTML workbench over the one graph
spec:consumers.spec-studio · resolves
declaredNoneNone
refines · incomingThe runs page shows a run as external evidence from a test file
spec:consumers.spec-studio.runs-page.external-evidence · resolves
declaredNoneNone
verifies · incomingThe runs page shows a run as external evidence from a test file
spec:consumers.spec-studio.runs-page.external-evidence · resolves
declaredNonenamesEachRun, externalEvidence, runSections

Bindings

Implementation binding: present

  • impl:protocol.studio-run-rows · renders recipe 45 file rows shared by the runs page and verification panel · src/projections/studio/pages/run-rows.ts:69 · role projection · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.studio-runs-page · renders readable CTRF inputs, file results, unjoined records and diagnostics · src/projections/studio/pages/runs-page.ts:6 · role projection · component component:protocol.projections · layer edge · context protocol

Design reference: none

Verifier binding: present

Expected-outcome oracle: present

  • oracle:protocol.runs-page · test/studio-s4.test.ts:360

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

Composing (0)

Composing needs the script.