Spec Studio

The floor names what blocks the floor's next rung

spec:validation.next-rung-floorBusiness Rule · storyready floor ready

Packs: pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/validation/next-rung-floor.sdp.md

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

Intent
problem
The floor is evaluated only at the stated rung, so promotion preflight answers no unmet clause for a Spec that states defined and cannot state ready, and an author or an adopter's page walks the floor table one rung up with its own code. A failed typed-dependency clause names the clause and not the dependencies that break it, so the same page recomputes which targets stand below defined.
outcome
Let the one evaluator answer for any named rung, name the floor's next rung's unmet clauses in the reader, and name the targets that fail the typed-dependency clause, so no consumer evaluates the floor a second way.
Rule
rule line 17 · specs/validation/next-rung-floor.sdp.md:17
The evaluator takes an optional rung to evaluate. Given one, it evaluates the cumulative clauses of every rung up to and including it; without one, it evaluates up to the stated rung. A Spec of an unratified kind, or an evaluation with no ratified rung to reach, yields no failure, and the descriptor conformance error owns that case.
rule line 18 · specs/validation/next-rung-floor.sdp.md:18
The floor's next rung is the rung above derived readiness: idea when no rung derives, and none when derived readiness is ready. Because derived readiness is the highest rung whose cumulative clauses all pass, the failures at the floor's next rung are that rung's own clauses, and there is at least one whenever that rung exists for a Spec of a ratified kind.
rule line 19 · specs/validation/next-rung-floor.sdp.md:19
The reader's Spec context carries these failures as nextRungFailures, beside floorFailures for the stated rung and statedNextRungFailures for the stated next rung, which spec:consumers.pack-design owns. All three come from the one evaluator, and nextRungFailures is empty when derived readiness is ready.
rule line 20 · specs/validation/next-rung-floor.sdp.md:20
A failure of the typed-dependency clause carries its targets: every distinct resolving refines, dependsOn, constrainedBy, or decidedBy target that states a rung below defined, or that is not a Spec, each with its relation type, its id, and its stated rung when it is a Spec. Targets sort by relation type in that order and then by id in code-unit order. No other clause carries targets.
rule line 21 · specs/validation/next-rung-floor.sdp.md:21
Promotion preflight reports the floor's next rung with its failures, each with its targets when it has them, and the first of them. The report is never a promotion: stating any rung stays a human's edit.

5 unkeyed rules.

Verifying examples

A scoped Spec held by a blocking question is told the clause · spec:validation.next-rung-floor.blocking-question · ready floor ready

Executable Spec

Given the graph holds a rule spec {specId: "spec:probe.held"} stating readiness {statedReadiness: "scoped"}
Given the spec {structure: "records a blocking open question"}
When the reader builds the spec's context
Then the floor reached is {floorReached: "scoped"} and the next rung is {nextRung: "defined"}
Then the next rung's first unmet clause is {clauseId: "no-blocking-open-questions"}
Then that failure names the targets {targets: ""}
Then the stated rung's floor failures number {currentFailures: 0}

Open example

A defined Spec resting on a scoped dependency is told which one · spec:validation.next-rung-floor.typed-dependency-targets · ready floor ready

Executable Spec

Given the graph holds a rule spec {specId: "spec:probe.subject"} stating readiness {statedReadiness: "defined"}
Given the spec {structure: "depends on a spec stating scoped"}
When the reader builds the spec's context
Then the floor reached is {floorReached: "defined"} and the next rung is {nextRung: "ready"}
Then the next rung's first unmet clause is {clauseId: "typed-dependency-targets-are-defined"}
Then that failure names the targets {targets: "dependsOn spec:probe.basis (scoped)"}
Then the stated rung's floor failures number {currentFailures: 0}

Open example

Example space

Given the graph holds a rule spec {specId:string} stating readiness {statedReadiness:"scoped"|"defined"}
Given the spec {structure:"depends on a spec stating scoped"|"records a blocking open question"}
When the reader builds the spec's context
Then the floor reached is {floorReached:"scoped"|"defined"} and the next rung is {nextRung:"defined"|"ready"}
Then the next rung's first unmet clause is {clauseId:string}
Then that failure names the targets {targets:string}
Then the stated rung's floor failures number {currentFailures:number}
Verification

Verifier bindings

  • spec:validation.next-rung-floor.blocking-question · A scoped Spec held by a blocking question is told the clause · declared · example enabled · specs/validation/next-rung-floor.blocking-question.sdp.md

    External run evidence from test/self-hosting-next-rung-floor.test.ts

    Test anchors: test:protocol.next-rung-floor.blocking-question, test:protocol.next-rung-floor.typed-dependency-targets. Specs verified by those bindings: spec:validation.next-rung-floor, spec:validation.next-rung-floor.blocking-question, spec:validation.next-rung-floor.typed-dependency-targets.

    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
    executes the bound example against a fresh worldA defined Spec resting on a scoped dependency is told which one (spec:validation.next-rung-floor.typed-dependency-targets)passed7.51 ms
    executes the bound example against a fresh worldA scoped Spec held by a blocking question is told the clause (spec:validation.next-rung-floor.blocking-question)passed1.05 ms
  • spec:validation.next-rung-floor.typed-dependency-targets · A defined Spec resting on a scoped dependency is told which one · declared · example enabled · specs/validation/next-rung-floor.typed-dependency-targets.sdp.md

Example space

  • specId · string · declared by the graph holds a rule spec {specId} stating readiness {statedReadiness}
  • statedReadiness · "scoped" | "defined" · declared by the graph holds a rule spec {specId} stating readiness {statedReadiness}
  • structure · "depends on a spec stating scoped" | "records a blocking open question" · declared by the spec {structure}

Bound points

ExamplespecIdstatedReadinessstructure
spec:validation.next-rung-floor.blocking-question"spec:probe.held""scoped""records a blocking open question"
spec:validation.next-rung-floor.typed-dependency-targets"spec:probe.subject""defined""depends on a spec stating scoped"

Oracle binding: present · oracle:protocol.next-rung-floor · test/self-hosting-next-rung-floor.test.ts:47

Coverage

specId: "spec:probe.held" · spec:validation.next-rung-floor.blocking-question; "spec:probe.subject" · spec:validation.next-rung-floor.typed-dependency-targets · not enumerable

structure
Declared valueExamples
"depends on a spec stating scoped"spec:validation.next-rung-floor.typed-dependency-targets
"records a blocking open question"spec:validation.next-rung-floor.blocking-question

Unbound

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

Requirement drawing

Requirement drawing for spec:validation.next-rung-floor
Requirement drawing for spec:validation.next-rung-floorsatisfies · anchoredsatisfies · anchoredmodels · anchoredrefines · declaredrefines, verifies · declaredrefines, verifies · declaredverifies · anchoredverifies · anchoredIntended Specsspec:validation.next-rung-floorThe floor names what blocksthe floor's next rung…validation.next-rung-floordeclared SpecDeclared verifying examplesspec:validation.next-rung-floor.blocking-questionA scoped Spec held by ablocking question is toldthe clause…validation.next-rung-floor.blocking-questiondeclared Specspec:validation.next-rung-floor.typed-dependency-targetsA defined Spec resting on ascoped dependency is toldwhich one…validation.next-rung-floor.typed-dependency-targetsdeclared SpecSatisfying or referencingunitsimpl:protocol.next-rung-floorevaluates the floor for atarget rung and names thetargets that break adependencyimpl:protocol.next-rung-flooranchored codeimpl:protocol.readertyped graph queries, entryadapters and context joins…protocol.readeranchored codeTest or oracle bindingsoracle:protocol.next-rung-floorexpected next-rung clauseand targets by structureoracle:protocol.next-rung-flooranchored oracle bindingtest:protocol.next-rung-floor.blocking-questionverifies the next rung'sfailure names a blockingquestion and no target…protocol.next-rung-floor.blocking-questionanchored test binding ·binding presenttest:protocol.next-rung-floor.typed-dependency-targetsverifies the next rung'sfailure names thedependency stated belowdefined…protocol.next-rung-floor.typed-dependency-targetsanchored test binding ·binding presentOutside the selected setspec:validation.readiness-floorStated readiness must clearits floor…validation.readiness-floordeclared Spec
The diagram as text
  • spec:validation.next-rung-floor: The floor names what blocks the floor's next rung · declared Spec
  • spec:validation.next-rung-floor.blocking-question: A scoped Spec held by a blocking question is told the clause · declared Spec
  • spec:validation.next-rung-floor.typed-dependency-targets: A defined Spec resting on a scoped dependency is told which one · declared Spec
  • spec:validation.readiness-floor: Stated readiness must clear its floor · declared Spec
  • impl:protocol.next-rung-floor: evaluates the floor for a target rung and names the targets that break a dependency · anchored code · src/validate/readiness-floor.ts:603
  • impl:protocol.reader: typed graph queries, entry adapters and context joins · anchored code · src/reader/reader.ts:687
  • oracle:protocol.next-rung-floor: expected next-rung clause and targets by structure · anchored oracle binding · test/self-hosting-next-rung-floor.test.ts:47
  • test:protocol.next-rung-floor.blocking-question: verifies the next rung's failure names a blocking question and no target · anchored test binding · binding present · test/self-hosting-next-rung-floor.test.ts:248
  • test:protocol.next-rung-floor.typed-dependency-targets: verifies the next rung's failure names the dependency stated below defined · anchored test binding · binding present · test/self-hosting-next-rung-floor.test.ts:234
  • spec:validation.next-rung-floor refines spec:validation.readiness-floor · declared
  • spec:validation.next-rung-floor.blocking-question refines spec:validation.next-rung-floor · declared
  • spec:validation.next-rung-floor.blocking-question verifies spec:validation.next-rung-floor · declared
  • spec:validation.next-rung-floor.typed-dependency-targets refines spec:validation.next-rung-floor · declared
  • spec:validation.next-rung-floor.typed-dependency-targets verifies spec:validation.next-rung-floor · declared
  • impl:protocol.next-rung-floor satisfies spec:validation.next-rung-floor · anchored
  • impl:protocol.reader satisfies spec:validation.next-rung-floor · anchored
  • oracle:protocol.next-rung-floor models spec:validation.next-rung-floor · anchored
  • test:protocol.next-rung-floor.blocking-question verifies spec:validation.next-rung-floor.blocking-question · anchored
  • test:protocol.next-rung-floor.typed-dependency-targets verifies spec:validation.next-rung-floor.typed-dependency-targets · 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

No decision record named.

Runtime
  • component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol

    Uses

    • component:protocol.graph · the one graph and its semantic decisions · src/graph/schema.ts:34 · layer domain · context protocol
    • component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol
    • component:protocol.notation · the leaf step codec · src/notation/slots.ts:261 · layer domain · context protocol
    • component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol
  • component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol

    Uses

  • impl:protocol.next-rung-floor · evaluates the floor for a target rung and names the targets that break a dependency · src/validate/readiness-floor.ts:603

    Component: component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol

    Uses

    None.

  • impl:protocol.reader · typed graph queries, entry adapters and context joins · src/reader/reader.ts:687

    Component: component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol

    Uses

    • impl:protocol.delivery-facts · computes delivery facts from resolving binding edges · src/graph/delivery-facts.ts:65
    • impl:protocol.next-rung-floor · evaluates the floor for a target rung and names the targets that break a dependency · src/validate/readiness-floor.ts:603

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:validation.next-rung-floor
The diagram as text
  • spec:consumers.pack-design: The Pack context carries the Pack's design
  • spec:consumers.readiness-planner: The readiness planner orders the statements a person can make
  • spec:consumers.roadmap: A roadmap orders the next bodies of work, and the graph says what each still needs
  • spec:consumers.spec-studio.data: The Studio renders from the reader's values and embeds only what its script reads
  • spec:validation.next-rung-floor: The floor names what blocks the floor's next rung
  • spec:validation.next-rung-floor.blocking-question: A scoped Spec held by a blocking question is told the clause
  • spec:validation.next-rung-floor.typed-dependency-targets: A defined Spec resting on a scoped dependency is told which one
  • spec:validation.readiness-floor: Stated readiness must clear its floor
  • spec:validation.typed-dependency-floor: A ready Spec rests only on settled dependencies
  • spec:validation.next-rung-floor dependsOn spec:validation.typed-dependency-floor · declared
  • spec:validation.next-rung-floor refines spec:validation.readiness-floor · declared
  • spec:consumers.pack-design dependsOn spec:validation.next-rung-floor · declared
  • spec:consumers.readiness-planner dependsOn spec:validation.next-rung-floor · declared — the rung each Spec's floor allows, and the targets that hold a rung, come from the one floor evaluator
  • spec:consumers.roadmap dependsOn spec:validation.next-rung-floor · declared — an entry's stated next rung and the clauses that hold it come from the one floor evaluator
  • spec:consumers.spec-studio.data dependsOn spec:validation.next-rung-floor · declared
  • spec:validation.next-rung-floor.blocking-question refines spec:validation.next-rung-floor · declared
  • spec:validation.next-rung-floor.typed-dependency-targets refines spec:validation.next-rung-floor · declared
  • spec:validation.next-rung-floor.blocking-question verifies spec:validation.next-rung-floor · declared
  • spec:validation.next-rung-floor.typed-dependency-targets verifies spec:validation.next-rung-floor · declared
Mermaid source

Copyable source; the Studio draws static SVG.

Preferred syntax: flowchart. Chosen syntax: labelled flowchart, preserving exact relations, claims and folds.

Rests on

Rested on by

Distance 1

Distance 2

Distance 3

Distance 4

Relations

Relation and directionOther endClaimReasonExercised keys
dependsOn · outgoingA ready Spec rests only on settled dependencies
spec:validation.typed-dependency-floor · resolves
declaredNoneNone
refines · outgoingStated readiness must clear its floor
spec:validation.readiness-floor · resolves
declaredNoneNone
dependsOn · incomingThe Pack context carries the Pack's design
spec:consumers.pack-design · resolves
declaredNoneNone
dependsOn · incomingThe readiness planner orders the statements a person can make
spec:consumers.readiness-planner · resolves
declaredthe rung each Spec's floor allows, and the targets that hold a rung, come from the one floor evaluatorNone
dependsOn · incomingA roadmap orders the next bodies of work, and the graph says what each still needs
spec:consumers.roadmap · resolves
declaredan entry's stated next rung and the clauses that hold it come from the one floor evaluatorNone
dependsOn · incomingThe Studio renders from the reader's values and embeds only what its script reads
spec:consumers.spec-studio.data · resolves
declaredNoneNone
refines · incomingA scoped Spec held by a blocking question is told the clause
spec:validation.next-rung-floor.blocking-question · resolves
declaredNoneNone
refines · incomingA defined Spec resting on a scoped dependency is told which one
spec:validation.next-rung-floor.typed-dependency-targets · resolves
declaredNoneNone
verifies · incomingA scoped Spec held by a blocking question is told the clause
spec:validation.next-rung-floor.blocking-question · resolves
declaredNoneNone
verifies · incomingA defined Spec resting on a scoped dependency is told which one
spec:validation.next-rung-floor.typed-dependency-targets · resolves
declaredNoneNone

Bindings

Implementation binding: present

  • impl:protocol.next-rung-floor · evaluates the floor for a target rung and names the targets that break a dependency · src/validate/readiness-floor.ts:603 · role validator · component component:protocol.validate · layer domain · context protocol
  • impl:protocol.reader · typed graph queries, entry adapters and context joins · src/reader/reader.ts:687 · role reader · component component:protocol.reader · layer application · context protocol

Design reference: none

Verifier binding: present

Expected-outcome oracle: present

  • oracle:protocol.next-rung-floor · expected next-rung clause and targets by structure · test/self-hosting-next-rung-floor.test.ts:47

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

Composing (0)

Composing needs the script.