Spec Studio

The readiness planner orders the statements a person can make

spec:consumers.readiness-plannerUse Case / Behavior · featureready floor ready

Packs: pack:adopter-speed-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/readiness-planner.sdp.md

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

A corpus designed ahead of its code reaches the point where its floors allow far more than its authors have stated, and every statement waits on one person. The statements rest on each other: a Spec reviewed before what it rests on may need review again once that changes. The planner lists the waiting statements so that a Spec others rest on comes first, and lists apart the open questions only the owner settles, with what each holds. It states nothing. A rung stays a person's edit of a carrier, and the order is advice a person may set aside.

The order reads the four relations the ready floor reads. One pairing would make every decision rest on the Spec it shapes: a decision refines the Spec whose question it settles, and that Spec names the decision through decidedBy. A parent that names its own part through dependsOn or constrainedBy pairs the same way. In each pair the named Spec is what the other rests on, so the refines half orders nothing.

Intent
actor
The owner of a corpus, or an agent preparing the owner's review, with more waiting statements than a session can make.
problem
No page orders the statements a person may make, so the owner either states rungs in an order that has to be undone or rebuilds the dependency order by hand with promotion preflight and dependency footing.
outcome
Order the Specs whose floor allows a higher rung than their author stated, the Specs they rest on first, so a person makes those statements in an order that holds while tooling states nothing.
Behavior
rule.waiting line 32 · specs/consumers/readiness-planner.sdp.md:32
A waiting statement is a Spec whose floor reaches a rung above the rung it states; the queue lists every such Spec once, with the rung its floor allows, and no other Spec.

spec:consumers.readiness-planner.dependency-order · enabled, spec:consumers.readiness-planner.owner-question-holds · enabled

rule.restsOn line 33 · specs/consumers/readiness-planner.sdp.md:33
A waiting Spec rests on each other waiting Spec it names by dependsOn, constrainedBy, decidedBy or refines, the four relations the ready floor reads; no Spec rests on itself.

spec:consumers.readiness-planner.dependency-order · enabled

rule.refinesYields line 34 · specs/consumers/readiness-planner.sdp.md:34
A refines from a Spec to a Spec that names it by dependsOn, constrainedBy or decidedBy orders nothing, so a decision comes before the Spec it shapes and a part before the parent that rests on it.

spec:consumers.readiness-planner.decision-first · enabled

rule.rounds line 35 · specs/consumers/readiness-planner.sdp.md:35
A waiting Spec that rests on no waiting Spec is in round 1, the statements a person can make first; any other waiting Spec is in the round after the latest round among the waiting Specs it rests on.

spec:consumers.readiness-planner.decision-first · enabled, spec:consumers.readiness-planner.dependency-order · enabled

rule.order line 36 · specs/consumers/readiness-planner.sdp.md:36
The queue lists the waiting Specs by round, and within a round by id in code-unit order, numbering each by its place, so each comes after every waiting Spec it rests on unless the two share a cycle.

spec:consumers.readiness-planner.cycle-shares-a-round · enabled, spec:consumers.readiness-planner.dependency-order · enabled

rule.cycles line 37 · specs/consumers/readiness-planner.sdp.md:37
Waiting Specs that reach each other through those rests-on links form a cycle; its members share one round, the round after the latest round among the waiting Specs outside the cycle that any member rests on, or round 1 when there is none, and the planner lists each cycle with one closed path through it and refuses nothing.

spec:consumers.readiness-planner.cycle-shares-a-round · enabled

rule.ownerQuestions line 38 · specs/consumers/readiness-planner.sdp.md:38
Apart from the statements, the planner lists each open question whose decider names the person the caller gives, the owner by default, blocking questions first, each with the Specs it holds: a blocking question holds its own Spec below defined, and it holds every Spec whose ready the typed-dependency clause refuses because the question's own Spec states below defined.

spec:consumers.readiness-planner.owner-question-holds · enabled

rule.undecided line 39 · specs/consumers/readiness-planner.sdp.md:39
The planner counts the open questions that carry no decider, and how many of them block, so an empty list of the owner's questions never reads as nothing waiting on the owner.

no example exercises it

rule.statesNothing line 40 · specs/consumers/readiness-planner.sdp.md:40
The planner is a catalog recipe that reads the graph and states, records and gates nothing; each statement it lists stays a person's edit of the carrier, and a Spec stated out of its order is never a finding.

no example exercises it

0 unkeyed rules.

Verifying examples

Waiting Specs that rest on each other share a round and report a cycle · spec:consumers.readiness-planner.cycle-shares-a-round · ready floor ready

Executable Spec

Given a probe corpus in which {corpus: "two waiting Specs depend on each other"}
When the statement queue runs over the probe corpus
Then the queue lists {queue: "spec:probe.a, spec:probe.b"} in that order
Then round 1 holds {firstRound: "spec:probe.a, spec:probe.b"}
Then the queue reports {cycles: 1} cycles

Open example

A waiting decision comes before the Spec it shapes · spec:consumers.readiness-planner.decision-first · ready floor ready

Executable Spec

Given a probe corpus in which {corpus: "a waiting Spec names a waiting decision that refines it"}
When the statement queue runs over the probe corpus
Then the queue lists {queue: "spec:probe.decision, spec:probe.shaped"} in that order
Then round 1 holds {firstRound: "spec:probe.decision"}
Then the queue reports {cycles: 0} cycles

Open example

The Spec another rests on comes first in the queue · spec:consumers.readiness-planner.dependency-order · ready floor ready

Executable Spec

Given a probe corpus in which {corpus: "one waiting Spec depends on another"}
When the statement queue runs over the probe corpus
Then the queue lists {queue: "spec:probe.base, spec:probe.dependent"} in that order
Then round 1 holds {firstRound: "spec:probe.base"}
Then the queue reports {cycles: 0} cycles

Open example

An owner's blocking question lists the Specs it holds · spec:consumers.readiness-planner.owner-question-holds · ready floor ready

Executable Spec

Given a probe corpus in which {corpus: "a Spec carries a blocking question its owner decides and another Spec depends on it"}
When the statement queue runs over the probe corpus
Then the queue lists {queue: ""} in that order
Then the owner's questions hold {held: "spec:probe.subject, spec:probe.dependent"}

Open example

Example space

Given a probe corpus in which {corpus:"one waiting Spec depends on another"|"a waiting Spec names a waiting decision that refines it"|"two waiting Specs depend on each other"|"a Spec carries a blocking question its owner decides and another Spec depends on it"}
When the statement queue runs over the probe corpus
Then the queue lists {queue:string} in that order
Then round 1 holds {firstRound:string}
Then the queue reports {cycles:number} cycles
Then the owner's questions hold {held:string}
Design
queueRecipe line 43 · specs/consumers/readiness-planner.sdp.md:43
recipe 46, the statement queue, takes params.decider, a token on the decider field's grammar, "owner" by default; another value returns { diagnostics: [{ parameter, problem }] } and no queue.
queueAnswer line 44 · specs/consumers/readiness-planner.sdp.md:44
{ decider, totals: { waiting, firstRound, rounds, cycles, questions, blockingQuestions, withoutDecider, blockingWithoutDecider }, statements, cycles, questions }, where firstRound counts the round 1 statements, rounds the highest round, questions and blockingQuestions the listed questions, and the last two the open questions that carry no decider.

no citation recorded

statementRow line 45 · specs/consumers/readiness-planner.sdp.md:45
{ place, round, id, title, specKind, packs, statedReadiness, floorReached, restsOn }, where place counts from 1 in queue order, packs lists the Spec's Pack ids in code-unit order, floorReached is the rung its floor allows, and restsOn lists the waiting Specs it rests on, sorted by id.

no citation recorded

cycleRow line 46 · specs/consumers/readiness-planner.sdp.md:46
{ members, cycle }, members sorted by id and cycle the shortest closed path from the first member through the members, found by a breadth-first walk over the ordering relations with targets in code-unit order, as dependency cycles finds its path; rows sort by first member.

no citation recorded

questionRow line 47 · specs/consumers/readiness-planner.sdp.md:47
{ address, spec, index, question, blocking, decider, holds }, where address is the question's entry address or null when it carries no key, index its authored position from 0, and holds its own Spec followed by the Specs it holds below ready, in code-unit order, empty for a non-blocking question.

no citation recorded

questionOrder line 48 · specs/consumers/readiness-planner.sdp.md:48
blocking questions first, then the question that holds more Specs first, then by Spec id and authored position.
Verification

Verifier bindings

  • spec:consumers.readiness-planner.cycle-shares-a-round · Waiting Specs that rest on each other share a round and report a cycle · declared · example enabled · specs/consumers/readiness-planner.cycle-shares-a-round.sdp.md

    External run evidence from test/self-hosting-readiness-planner.test.ts

    Test anchors: test:protocol.readiness-planner.cycle-shares-a-round, test:protocol.readiness-planner.decision-first, test:protocol.readiness-planner.dependency-order, test:protocol.readiness-planner.owner-question-holds. Specs verified by those bindings: spec:consumers.readiness-planner, spec:consumers.readiness-planner.cycle-shares-a-round, spec:consumers.readiness-planner.decision-first, spec:consumers.readiness-planner.dependency-order, spec:consumers.readiness-planner.owner-question-holds.

    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 Spec another rests on comes first in the queue (spec:consumers.readiness-planner.dependency-order)passed28.37 ms
    executes the bound example against a fresh worldA waiting decision comes before the Spec it shapes (spec:consumers.readiness-planner.decision-first)passed5.84 ms
    executes the bound example against a fresh worldWaiting Specs that rest on each other share a round and report a cycle (spec:consumers.readiness-planner.cycle-shares-a-round)passed4.2 ms
    executes the bound example against a fresh worldAn owner's blocking question lists the Specs it holds (spec:consumers.readiness-planner.owner-question-holds)passed4.25 ms
    diagnoses invalid decider nullstatement queue detailspassed7.23 ms
    diagnoses invalid decider falsestatement queue detailspassed4.92 ms
    diagnoses invalid decider 1statement queue detailspassed3.28 ms
    diagnoses invalid decider ""statement queue detailspassed2.82 ms
    diagnoses invalid decider "Owner"statement queue detailspassed10.22 ms
    diagnoses invalid decider "two words"statement queue detailspassed3.6 ms
    diagnoses invalid decider "with_underscore"statement queue detailspassed2.3 ms
    orders SCCs by longest dependency chain, ignores non-ordering and self edges, and sorts ids by code unitstatement queue detailspassed5.7 ms
    yields refines to the reverse dependsOn relationstatement queue detailspassed2.38 ms
    yields refines to the reverse constrainedBy relationstatement queue detailspassed2.54 ms
    yields refines to the reverse decidedBy relationstatement queue detailspassed1.85 ms
    chooses a shortest cycle path before breaking ties by target idstatement queue detailspassed4 ms
    selects every higher floor, ignores lower or equal floors, and orders only direct waiting linksstatement queue detailspassed3.06 ms
    selects questions, counts undecided ones, and holds direct typed dependents by stated rungstatement queue detailspassed4.51 ms
  • spec:consumers.readiness-planner.decision-first · A waiting decision comes before the Spec it shapes · declared · example enabled · specs/consumers/readiness-planner.decision-first.sdp.md
  • spec:consumers.readiness-planner.dependency-order · The Spec another rests on comes first in the queue · declared · example enabled · specs/consumers/readiness-planner.dependency-order.sdp.md
  • spec:consumers.readiness-planner.owner-question-holds · An owner's blocking question lists the Specs it holds · declared · example enabled · specs/consumers/readiness-planner.owner-question-holds.sdp.md

Example space

  • corpus · "one waiting Spec depends on another" | "a waiting Spec names a waiting decision that refines it" | "two waiting Specs depend on each other" | "a Spec carries a blocking question its owner decides and another Spec depends on it" · declared by a probe corpus in which {corpus}

Bound points

Examplecorpus
spec:consumers.readiness-planner.cycle-shares-a-round"two waiting Specs depend on each other"
spec:consumers.readiness-planner.decision-first"a waiting Spec names a waiting decision that refines it"
spec:consumers.readiness-planner.dependency-order"one waiting Spec depends on another"
spec:consumers.readiness-planner.owner-question-holds"a Spec carries a blocking question its owner decides and another Spec depends on it"

Oracle binding: present · oracle:protocol.readiness-planner · test/self-hosting-readiness-planner.test.ts:81

Coverage

corpus
Declared valueExamples
"one waiting Spec depends on another"spec:consumers.readiness-planner.dependency-order
"a waiting Spec names a waiting decision that refines it"spec:consumers.readiness-planner.decision-first
"two waiting Specs depend on each other"spec:consumers.readiness-planner.cycle-shares-a-round
"a Spec carries a blocking question its owner decides and another Spec depends on it"spec:consumers.readiness-planner.owner-question-holds

Unbound

  • corpus: None
Design view

Requirement drawing

Requirement drawing for spec:consumers.readiness-planner
The diagram as text
  • spec:consumers.readiness-planner: The readiness planner orders the statements a person can make · declared Spec
  • spec:consumers.readiness-planner.cycle-shares-a-round: Waiting Specs that rest on each other share a round and report a cycle · declared Spec
  • spec:consumers.readiness-planner.decision-first: A waiting decision comes before the Spec it shapes · declared Spec
  • spec:consumers.readiness-planner.dependency-order: The Spec another rests on comes first in the queue · declared Spec
  • spec:consumers.readiness-planner.owner-question-holds: An owner's blocking question lists the Specs it holds · declared Spec
  • spec:consumers.graph-first-planning: The next body of work is planned from the graph, not from a prose index · declared Spec
  • impl:protocol.statement-queue-recipe: realizes the statement queue in the shipped recipe catalog · anchored code · test/self-hosting-readiness-planner.test.ts:74
  • oracle:protocol.readiness-planner: oracle:protocol.readiness-planner · anchored oracle binding · test/self-hosting-readiness-planner.test.ts:81
  • test:protocol.readiness-planner.cycle-shares-a-round: test:protocol.readiness-planner.cycle-shares-a-round · anchored test binding · binding present · test/self-hosting-readiness-planner.test.ts:236
  • test:protocol.readiness-planner.decision-first: test:protocol.readiness-planner.decision-first · anchored test binding · binding present · test/self-hosting-readiness-planner.test.ts:220
  • test:protocol.readiness-planner.dependency-order: test:protocol.readiness-planner.dependency-order · anchored test binding · binding present · test/self-hosting-readiness-planner.test.ts:204
  • test:protocol.readiness-planner.owner-question-holds: test:protocol.readiness-planner.owner-question-holds · anchored test binding · binding present · test/self-hosting-readiness-planner.test.ts:252
  • spec:consumers.readiness-planner refines spec:consumers.graph-first-planning · declared — the planner is an advisory planning recipe that orders nothing the Protocol enforces
  • spec:consumers.readiness-planner.cycle-shares-a-round refines spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.cycle-shares-a-round verifies spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.decision-first refines spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.decision-first verifies spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.dependency-order refines spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.dependency-order verifies spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.owner-question-holds refines spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.owner-question-holds verifies spec:consumers.readiness-planner · declared
  • impl:protocol.statement-queue-recipe satisfies spec:consumers.readiness-planner · anchored
  • oracle:protocol.readiness-planner models spec:consumers.readiness-planner · anchored
  • test:protocol.readiness-planner.cycle-shares-a-round verifies spec:consumers.readiness-planner.cycle-shares-a-round · anchored
  • test:protocol.readiness-planner.decision-first verifies spec:consumers.readiness-planner.decision-first · anchored
  • test:protocol.readiness-planner.dependency-order verifies spec:consumers.readiness-planner.dependency-order · anchored
  • test:protocol.readiness-planner.owner-question-holds verifies spec:consumers.readiness-planner.owner-question-holds · 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

No decision record named.

Runtime
  • impl:protocol.statement-queue-recipe · realizes the statement queue in the shipped recipe catalog · test/self-hosting-readiness-planner.test.ts:74

    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.readiness-planner
The diagram as text
  • spec:consumers.agent-surface.address-and-cycle-recipes: Address resolution and dependency cycles stay executable graph recipes
  • spec:consumers.design-slice: A slice reads a Pack as one design, with the architecture it touches and what each member needs next
  • spec:consumers.graph-first-planning: The next body of work is planned from the graph, not from a prose index
  • spec:consumers.readiness-planner: The readiness planner orders the statements a person can make
  • spec:consumers.readiness-planner.cycle-shares-a-round: Waiting Specs that rest on each other share a round and report a cycle
  • spec:consumers.readiness-planner.decision-first: A waiting decision comes before the Spec it shapes
  • spec:consumers.readiness-planner.dependency-order: The Spec another rests on comes first in the queue
  • spec:consumers.readiness-planner.owner-question-holds: An owner's blocking question lists the Specs it holds
  • spec:consumers.roadmap: A roadmap orders the next bodies of work, and the graph says what each still needs
  • spec:consumers.spec-studio.owner-queue: The owner queue page orders the statements and questions only a person can settle
  • spec:model.open-question-fields: An open question may name who decides it, its links, a provisional reading and a re-entry trigger
  • spec:validation.next-rung-floor: The floor names what blocks the floor's next rung
  • spec:validation.typed-dependency-floor: A ready Spec rests only on settled dependencies
  • spec:consumers.readiness-planner dependsOn spec:consumers.agent-surface.address-and-cycle-recipes · declared — a cycle among waiting Specs reports in the shape dependency cycles reports
  • spec:consumers.readiness-planner dependsOn spec:model.open-question-fields · declared — the owner's questions are selected by their decider field
  • 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.readiness-planner dependsOn spec:validation.typed-dependency-floor · declared — the order reads the four typed relations the ready floor reads
  • spec:consumers.readiness-planner refines spec:consumers.graph-first-planning · declared — the planner is an advisory planning recipe that orders nothing the Protocol enforces
  • spec:consumers.design-slice dependsOn spec:consumers.readiness-planner · declared — members rest on each other as the statement queue reads the four typed relations, and a cycle reports in its shape
  • spec:consumers.roadmap dependsOn spec:consumers.readiness-planner · declared — the statements waiting on a person follow the statement queue's order
  • spec:consumers.spec-studio.owner-queue dependsOn spec:consumers.readiness-planner · declared — the page renders the statement queue the planner orders
  • spec:consumers.readiness-planner.cycle-shares-a-round refines spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.decision-first refines spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.dependency-order refines spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.owner-question-holds refines spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.cycle-shares-a-round verifies spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.decision-first verifies spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.dependency-order verifies spec:consumers.readiness-planner · declared
  • spec:consumers.readiness-planner.owner-question-holds verifies spec:consumers.readiness-planner · 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 · outgoingAddress resolution and dependency cycles stay executable graph recipes
spec:consumers.agent-surface.address-and-cycle-recipes · resolves
declareda cycle among waiting Specs reports in the shape dependency cycles reportsNone
dependsOn · outgoingAn open question may name who decides it, its links, a provisional reading and a re-entry trigger
spec:model.open-question-fields · resolves
declaredthe owner's questions are selected by their decider fieldNone
dependsOn · outgoingThe floor names what blocks the floor's next rung
spec:validation.next-rung-floor · resolves
declaredthe rung each Spec's floor allows, and the targets that hold a rung, come from the one floor evaluatorNone
dependsOn · outgoingA ready Spec rests only on settled dependencies
spec:validation.typed-dependency-floor · resolves
declaredthe order reads the four typed relations the ready floor readsNone
refines · outgoingThe next body of work is planned from the graph, not from a prose index
spec:consumers.graph-first-planning · resolves
declaredthe planner is an advisory planning recipe that orders nothing the Protocol enforcesNone
dependsOn · incomingA slice reads a Pack as one design, with the architecture it touches and what each member needs next
spec:consumers.design-slice · resolves
declaredmembers rest on each other as the statement queue reads the four typed relations, and a cycle reports in its shapeNone
dependsOn · incomingA roadmap orders the next bodies of work, and the graph says what each still needs
spec:consumers.roadmap · resolves
declaredthe statements waiting on a person follow the statement queue's orderNone
dependsOn · incomingThe owner queue page orders the statements and questions only a person can settle
spec:consumers.spec-studio.owner-queue · resolves
declaredthe page renders the statement queue the planner ordersNone
refines · incomingWaiting Specs that rest on each other share a round and report a cycle
spec:consumers.readiness-planner.cycle-shares-a-round · resolves
declaredNoneNone
refines · incomingA waiting decision comes before the Spec it shapes
spec:consumers.readiness-planner.decision-first · resolves
declaredNoneNone
refines · incomingThe Spec another rests on comes first in the queue
spec:consumers.readiness-planner.dependency-order · resolves
declaredNoneNone
refines · incomingAn owner's blocking question lists the Specs it holds
spec:consumers.readiness-planner.owner-question-holds · resolves
declaredNoneNone
verifies · incomingWaiting Specs that rest on each other share a round and report a cycle
spec:consumers.readiness-planner.cycle-shares-a-round · resolves
declaredNonecycles, order
verifies · incomingA waiting decision comes before the Spec it shapes
spec:consumers.readiness-planner.decision-first · resolves
declaredNonerefinesYields, rounds
verifies · incomingThe Spec another rests on comes first in the queue
spec:consumers.readiness-planner.dependency-order · resolves
declaredNonewaiting, restsOn, rounds, order
verifies · incomingAn owner's blocking question lists the Specs it holds
spec:consumers.readiness-planner.owner-question-holds · resolves
declaredNoneownerQuestions, waiting

Bindings

Implementation binding: present

  • impl:protocol.statement-queue-recipe · realizes the statement queue in the shipped recipe catalog · test/self-hosting-readiness-planner.test.ts:74 · role projection

Design reference: none

Verifier binding: present

Expected-outcome oracle: present

  • oracle:protocol.readiness-planner · test/self-hosting-readiness-planner.test.ts:81

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

Composing (0)

Composing needs the script.