Spec Studio

Derived readiness renders beside the stated rung and warns in one direction

spec:consumers.derived-readiness-bannerBusiness Rule · featureready floor ready

Packs: pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/derived-readiness-banner.sdp.md

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

Intent
outcome
Show a reader where a Spec's stated maturity stands against the structure it earns, without turning a floor into a quota.
Rule
rule line 16 · specs/consumers/derived-readiness-banner.sdp.md:16
The page reads derived readiness as spec:validation.readiness-floor defines it and renders it beside the author's statement, never in its place.
rule line 17 · specs/consumers/derived-readiness-banner.sdp.md:17
Every Spec page renders the stated rung beside the floor reached, on one line, whether or not the two agree; the index and the Pack member table carry the same pair as two columns.
rule line 18 · specs/consumers/derived-readiness-banner.sdp.md:18
The divergence banner is raised only in the dishonest direction — the floor reached standing below the stated rung. A floor reached at or above the stated rung raises nothing, because a floor is a floor and never a quota that nags upward.
rule line 19 · specs/consumers/derived-readiness-banner.sdp.md:19
A raised banner names the first unmet clause by its clause id and its description, so the reader is told which clause to satisfy rather than only that something is wrong.
rule line 20 · specs/consumers/derived-readiness-banner.sdp.md:20
When even the idea floor is unmet, the floor reached renders as none rather than as a rung, and a raised banner states that the floor stands below idea.
rule line 21 · specs/consumers/derived-readiness-banner.sdp.md:21
The banner is rendering, never a check: the same divergence is already the readiness floor's own finding, and the page shows it in context rather than gating on it.

6 unkeyed rules.

Verifying examples

An overstated rung raises the banner and names the clause that refused · spec:consumers.derived-readiness-banner.dishonest-divergence · ready floor ready

Executable Spec

Given the graph holds a rule spec {specId: "spec:probe.overstated-rung"} whose stated readiness is {statedReadiness: "ready"}
Given the spec {structure: "records a blocking open question"}
When the Design Review renders the graph
Then the spec page renders the floor reached {floorReached: "scoped"}
Then the divergence banner is raised: {bannerRaised: true}
Then the banner names the first unmet clause {clauseId: "no-blocking-open-questions"}

Open example

A rung the structure overshoots renders as information, not as a banner · spec:consumers.derived-readiness-banner.honest-headroom · ready floor ready

Executable Spec

Given the graph holds a rule spec {specId: "spec:probe.understated-rung"} whose stated readiness is {statedReadiness: "scoped"}
Given the spec {structure: "clears every floor clause"}
When the Design Review renders the graph
Then the spec page renders the floor reached {floorReached: "ready"}
Then the divergence banner is raised: {bannerRaised: false}

Open example

Example space

Given the graph holds a rule spec {specId:string} whose stated readiness is {statedReadiness:"scoped"|"ready"}
Given the spec {structure:"clears every floor clause"|"records a blocking open question"}
When the Design Review renders the graph
Then the spec page renders the floor reached {floorReached:"scoped"|"ready"}
Then the divergence banner is raised: {bannerRaised:boolean}
Then the banner names the first unmet clause {clauseId:string}
Verification

Verifier bindings

  • spec:consumers.derived-readiness-banner.dishonest-divergence · An overstated rung raises the banner and names the clause that refused · declared · example enabled · specs/consumers/derived-readiness-banner.dishonest-divergence.sdp.md

    External run evidence from test/self-hosting-projections.test.ts

    Test anchors: test:protocol.binding-language-views.bound-spec-page, test:protocol.binding-language-views.pack-member-table, test:protocol.derived-readiness-banner.dishonest-divergence, test:protocol.derived-readiness-banner.honest-headroom, test:protocol.derived-readiness-banner.idea-floor-unmet, test:protocol.design-review.pure-projection, test:protocol.diagnostic-rendering.composed-location, test:protocol.diagnostic-rendering.table-cell-location, test:protocol.wholesale-view-rewrite.build-invalidates-view, test:protocol.wholesale-view-rewrite.failed-run-view-removed, test:protocol.wholesale-view-rewrite.late-stale-page, test:protocol.wholesale-view-rewrite.stale-page-removed. Specs verified by those bindings: spec:consumers.binding-language-views, spec:consumers.binding-language-views.bound-spec-page, spec:consumers.binding-language-views.pack-member-table, spec:consumers.derived-readiness-banner, spec:consumers.derived-readiness-banner.dishonest-divergence, spec:consumers.derived-readiness-banner.honest-headroom, spec:consumers.design-review, spec:consumers.design-review.pure-projection, spec:consumers.wholesale-view-rewrite, spec:consumers.wholesale-view-rewrite.build-invalidates-view, spec:consumers.wholesale-view-rewrite.failed-run-view-removed, spec:consumers.wholesale-view-rewrite.late-stale-page, spec:consumers.wholesale-view-rewrite.stale-page-removed, spec:validation.diagnostic-rendering, spec:validation.diagnostic-rendering.composed-location, spec:validation.diagnostic-rendering.table-cell-location.

    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 worldThe view is the graph read twice, and the corpus is untouched by reading it (spec:consumers.design-review.pure-projection)passed99.39 ms
    executes the bound example against a fresh worldAn overstated rung raises the banner and names the clause that refused (spec:consumers.derived-readiness-banner.dishonest-divergence)passed2.14 ms
    executes the bound example against a fresh worldA rung the structure overshoots renders as information, not as a banner (spec:consumers.derived-readiness-banner.honest-headroom)passed1.17 ms
    renders a Spec whose idea floor is unmet with no rung and a below-idea bannernot recordedpassed0.85 ms
    executes the bound example against a fresh worldA fully bound Spec renders binding language on the page and in the index (spec:consumers.binding-language-views.bound-spec-page)passed1.85 ms
    executes the bound example against a fresh worldThe Pack member table speaks the page's binding language, not a shorthand (spec:consumers.binding-language-views.pack-member-table)passed1.91 ms
    executes the bound example against a fresh worldA page from an earlier run does not survive the next one (spec:consumers.wholesale-view-rewrite.stale-page-removed)passed7.25 ms
    executes the bound example against a fresh worldA page the build's invalidation never saw still does not survive the swap (spec:consumers.wholesale-view-rewrite.late-stale-page)passed4.19 ms
    executes the bound example against a fresh worldA run that cannot produce a current view leaves no view at all (spec:consumers.wholesale-view-rewrite.failed-run-view-removed)passed2.63 ms
    executes the bound example against a fresh worldA build that never renders still takes the old view down (spec:consumers.wholesale-view-rewrite.build-invalidates-view)passed2.79 ms
    executes the bound example against a fresh worldOne finding, three location shapes, one composition rule (spec:validation.diagnostic-rendering.composed-location)passed0.65 ms
    executes the bound example against a fresh worldThe same three location shapes, rendered as table cells (spec:validation.diagnostic-rendering.table-cell-location)passed0.43 ms
  • spec:consumers.derived-readiness-banner.honest-headroom · A rung the structure overshoots renders as information, not as a banner · declared · example enabled · specs/consumers/derived-readiness-banner.honest-headroom.sdp.md
  • test:protocol.derived-readiness-banner.idea-floor-unmet · a Spec below the idea floor renders the floor reached as none and the banner below idea · anchored · test anchor binding present · test/self-hosting-projections.test.ts:518

Example space

  • specId · string · declared by the graph holds a rule spec {specId} whose stated readiness is {statedReadiness}
  • statedReadiness · "scoped" | "ready" · declared by the graph holds a rule spec {specId} whose stated readiness is {statedReadiness}
  • structure · "clears every floor clause" | "records a blocking open question" · declared by the spec {structure}

Bound points

ExamplespecIdstatedReadinessstructure
spec:consumers.derived-readiness-banner.dishonest-divergence"spec:probe.overstated-rung""ready""records a blocking open question"
spec:consumers.derived-readiness-banner.honest-headroom"spec:probe.understated-rung""scoped""clears every floor clause"

Oracle binding: none

Coverage

specId: "spec:probe.overstated-rung" · spec:consumers.derived-readiness-banner.dishonest-divergence; "spec:probe.understated-rung" · spec:consumers.derived-readiness-banner.honest-headroom · not enumerable

structure
Declared valueExamples
"clears every floor clause"spec:consumers.derived-readiness-banner.honest-headroom
"records a blocking open question"spec:consumers.derived-readiness-banner.dishonest-divergence

Unbound

  • specId: None
  • statedReadiness: None
  • structure: None
Design view

Requirement drawing

Requirement drawing for spec:consumers.derived-readiness-banner
Requirement drawing for spec:consumers.derived-readiness-bannersatisfies · anchoredrefines · declaredrefines, verifies · declaredrefines, verifies · declaredverifies · anchoredverifies · anchoredverifies · anchoredIntended Specsspec:consumers.derived-readiness-bannerDerived readiness rendersbeside the stated rung andwarns in one direction…consumers.derived-readiness-bannerdeclared SpecDeclared verifying examplesspec:consumers.derived-readiness-banner.dishonest-divergenceAn overstated rung raisesthe banner and names theclause that refused…consumers.derived-readiness-banner.dishonest-divergencedeclared Specspec:consumers.derived-readiness-banner.honest-headroomA rung the structureovershoots renders asinformation, not as a banner…consumers.derived-readiness-banner.honest-headroomdeclared SpecSatisfying or referencingunitsimpl:protocol.derived-readiness-bannerrenders stated readinessbeside the structural floorand dishonest divergence…protocol.derived-readiness-banneranchored codeTest or oracle bindingstest:protocol.derived-readiness-banner.dishonest-divergencethe overstated-rung pointverifies the banner and itsfirst unmet clause…protocol.derived-readiness-banner.dishonest-divergenceanchored test binding ·binding presenttest:protocol.derived-readiness-banner.honest-headroomthe understated-rung pointverifies the one-directionbound on the banner…protocol.derived-readiness-banner.honest-headroomanchored test binding ·binding presenttest:protocol.derived-readiness-banner.idea-floor-unmeta Spec below the idea floorrenders the floor reachedas none and the bannerbelow idea…protocol.derived-readiness-banner.idea-floor-unmetanchored test binding ·binding presentOutside the selected setspec:consumers.design-reviewDesign Review renders graphcontext without becoming agate…consumers.design-reviewdeclared Spec
The diagram as text
  • spec:consumers.derived-readiness-banner: Derived readiness renders beside the stated rung and warns in one direction · declared Spec
  • spec:consumers.derived-readiness-banner.dishonest-divergence: An overstated rung raises the banner and names the clause that refused · declared Spec
  • spec:consumers.derived-readiness-banner.honest-headroom: A rung the structure overshoots renders as information, not as a banner · declared Spec
  • spec:consumers.design-review: Design Review renders graph context without becoming a gate · declared Spec
  • impl:protocol.derived-readiness-banner: renders stated readiness beside the structural floor and dishonest divergence · anchored code · src/projections/design-review-context.ts:18
  • test:protocol.derived-readiness-banner.dishonest-divergence: the overstated-rung point verifies the banner and its first unmet clause · anchored test binding · binding present · test/self-hosting-projections.test.ts:461
  • test:protocol.derived-readiness-banner.honest-headroom: the understated-rung point verifies the one-direction bound on the banner · anchored test binding · binding present · test/self-hosting-projections.test.ts:482
  • test:protocol.derived-readiness-banner.idea-floor-unmet: a Spec below the idea floor renders the floor reached as none and the banner below idea · anchored test binding · binding present · test/self-hosting-projections.test.ts:518
  • spec:consumers.derived-readiness-banner refines spec:consumers.design-review · declared
  • spec:consumers.derived-readiness-banner.dishonest-divergence refines spec:consumers.derived-readiness-banner · declared
  • spec:consumers.derived-readiness-banner.dishonest-divergence verifies spec:consumers.derived-readiness-banner · declared
  • spec:consumers.derived-readiness-banner.honest-headroom refines spec:consumers.derived-readiness-banner · declared
  • spec:consumers.derived-readiness-banner.honest-headroom verifies spec:consumers.derived-readiness-banner · declared
  • impl:protocol.derived-readiness-banner satisfies spec:consumers.derived-readiness-banner · anchored
  • test:protocol.derived-readiness-banner.dishonest-divergence verifies spec:consumers.derived-readiness-banner.dishonest-divergence · anchored
  • test:protocol.derived-readiness-banner.honest-headroom verifies spec:consumers.derived-readiness-banner.honest-headroom · anchored
  • test:protocol.derived-readiness-banner.idea-floor-unmet verifies spec:consumers.derived-readiness-banner · 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

No decision record named.

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.derived-readiness-banner · renders stated readiness beside the structural floor and dishonest divergence · src/projections/design-review-context.ts:18

    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.derived-readiness-banner
The diagram as text
  • spec:consumers.derived-readiness-banner: Derived readiness renders beside the stated rung and warns in one direction
  • spec:consumers.derived-readiness-banner.dishonest-divergence: An overstated rung raises the banner and names the clause that refused
  • spec:consumers.derived-readiness-banner.honest-headroom: A rung the structure overshoots renders as information, not as a banner
  • spec:consumers.design-review: Design Review renders graph context without becoming a gate
  • spec:consumers.design-review.pack-design-page: A Pack page shows where the Pack's design stands
  • spec:consumers.spec-studio.index-page: The index says where the corpus stands and narrows every Spec
  • spec:consumers.spec-studio.pack-page: A Pack page shows the Pack's design as one card per member
  • spec:consumers.spec-studio.pack-page.maturity-map: A Pack page's maturity map places every member by its stated rung and its floor
  • spec:consumers.spec-studio.slice-page: A slice page shows a Pack's design as one whole
  • spec:consumers.spec-studio.spec-page: A Spec page shows one Spec in collapsible panels, in a fixed order
  • spec:consumers.spec-studio.spec-page.core: A Spec page's core shows the whole Spec, with an anchor for every entry
  • spec:validation.readiness-floor: Stated readiness must clear its floor
  • spec:consumers.derived-readiness-banner dependsOn spec:validation.readiness-floor · declared
  • spec:consumers.derived-readiness-banner refines spec:consumers.design-review · declared
  • spec:consumers.design-review.pack-design-page dependsOn spec:consumers.derived-readiness-banner · declared — the member table renders the stated rung and floor reached as this rule specifies
  • spec:consumers.spec-studio.index-page dependsOn spec:consumers.derived-readiness-banner · declared
  • spec:consumers.spec-studio.pack-page dependsOn spec:consumers.derived-readiness-banner · declared
  • spec:consumers.spec-studio.pack-page.maturity-map dependsOn spec:consumers.derived-readiness-banner · declared — the map sets each stated rung beside the floor reached, as the banner reads them
  • spec:consumers.spec-studio.slice-page dependsOn spec:consumers.derived-readiness-banner · declared
  • spec:consumers.spec-studio.spec-page dependsOn spec:consumers.derived-readiness-banner · declared
  • spec:consumers.spec-studio.spec-page.core dependsOn spec:consumers.derived-readiness-banner · declared
  • spec:consumers.derived-readiness-banner.dishonest-divergence refines spec:consumers.derived-readiness-banner · declared
  • spec:consumers.derived-readiness-banner.honest-headroom refines spec:consumers.derived-readiness-banner · declared
  • spec:consumers.derived-readiness-banner.dishonest-divergence verifies spec:consumers.derived-readiness-banner · declared
  • spec:consumers.derived-readiness-banner.honest-headroom verifies spec:consumers.derived-readiness-banner · 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

Relations

Relation and directionOther endClaimReasonExercised keys
dependsOn · outgoingStated readiness must clear its floor
spec:validation.readiness-floor · resolves
declaredNoneNone
refines · outgoingDesign Review renders graph context without becoming a gate
spec:consumers.design-review · resolves
declaredNoneNone
dependsOn · incomingA Pack page shows where the Pack's design stands
spec:consumers.design-review.pack-design-page · resolves
declaredthe member table renders the stated rung and floor reached as this rule specifiesNone
dependsOn · incomingThe index says where the corpus stands and narrows every Spec
spec:consumers.spec-studio.index-page · resolves
declaredNoneNone
dependsOn · incomingA Pack page shows the Pack's design as one card per member
spec:consumers.spec-studio.pack-page · resolves
declaredNoneNone
dependsOn · incomingA Pack page's maturity map places every member by its stated rung and its floor
spec:consumers.spec-studio.pack-page.maturity-map · resolves
declaredthe map sets each stated rung beside the floor reached, as the banner reads themNone
dependsOn · incomingA slice page shows a Pack's design as one whole
spec:consumers.spec-studio.slice-page · resolves
declaredNoneNone
dependsOn · incomingA Spec page shows one Spec in collapsible panels, in a fixed order
spec:consumers.spec-studio.spec-page · resolves
declaredNoneNone
dependsOn · incomingA Spec page's core shows the whole Spec, with an anchor for every entry
spec:consumers.spec-studio.spec-page.core · resolves
declaredNoneNone
refines · incomingAn overstated rung raises the banner and names the clause that refused
spec:consumers.derived-readiness-banner.dishonest-divergence · resolves
declaredNoneNone
refines · incomingA rung the structure overshoots renders as information, not as a banner
spec:consumers.derived-readiness-banner.honest-headroom · resolves
declaredNoneNone
verifies · incomingAn overstated rung raises the banner and names the clause that refused
spec:consumers.derived-readiness-banner.dishonest-divergence · resolves
declaredNoneNone
verifies · incomingA rung the structure overshoots renders as information, not as a banner
spec:consumers.derived-readiness-banner.honest-headroom · resolves
declaredNoneNone

Bindings

Implementation binding: present

  • impl:protocol.derived-readiness-banner · renders stated readiness beside the structural floor and dishonest divergence · src/projections/design-review-context.ts:18 · role projection · component component:protocol.projections · layer edge · context protocol

Design reference: none

Verifier binding: present

  • spec:consumers.derived-readiness-banner.dishonest-divergence · An overstated rung raises the banner and names the clause that refused · declared · specs/consumers/derived-readiness-banner.dishonest-divergence.sdp.md · example enabled
  • spec:consumers.derived-readiness-banner.honest-headroom · A rung the structure overshoots renders as information, not as a banner · declared · specs/consumers/derived-readiness-banner.honest-headroom.sdp.md · example enabled
  • test:protocol.derived-readiness-banner.idea-floor-unmet · a Spec below the idea floor renders the floor reached as none and the banner below idea · anchored · test/self-hosting-projections.test.ts:518 · 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.