Spec Studio

Capability adoption counts where each capability is used and where it could apply

spec:consumers.upgrade-kit.capability-adoptionUse Case / Behavior · storyready 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/upgrade-kit.capability-adoption.sdp.md

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

Intent
problem
An adopter learns which authoring capabilities its corpus uses, and where each could apply, only by writing a query per capability.
outcome
Report, for the whole corpus, each Pack and each Spec, how many places use each capability and how many places it could apply, from the graph alone.
Behavior
rule.capabilityRows line 37 · specs/consumers/upgrade-kit.capability-adoption.sdp.md:37
Capability adoption, recipe 47, reports one row per capability with the places that use it and the places it could apply, counted from the graph, each row naming the Spec that carries the capability's law.

spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus · enabled

rule.corpusTotals line 38 · specs/consumers/upgrade-kit.capability-adoption.sdp.md:38
Beside the rows it reports the corpus's size and its readiness statements: Specs, Packs, examples, decisions, anchored component units, the Specs stated ready and the Specs whose floor allows ready.

no example exercises it

rule.perPackAndSpec line 39 · specs/consumers/upgrade-kit.capability-adoption.sdp.md:39
It counts each capability's places within each Pack's members and, on request, within each Spec, a place two members share counted once, so an adopter sees where each capability could apply.

no example exercises it

rule.outsideTheGraph line 40 · specs/consumers/upgrade-kit.capability-adoption.sdp.md:40
A capability the graph does not hold, such as the perspectives a corpus keeps as files, is counted only from data the caller passes, and its row reads null otherwise; the recipe reads no file.

spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus · enabled

rule.countsOnly line 41 · specs/consumers/upgrade-kit.capability-adoption.sdp.md:41
A count is a place a capability could apply, never a score, a ranking or a finding, and the answer carries no findings.

no example exercises it

0 unkeyed rules.

Verifying examples

Capability adoption counts keyed rules and reasoned relations · spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus · ready floor ready

Executable Spec

Given a probe corpus with {rules: 3} rule entries of which {keyed: 1} carry a key, and {relations: 2} authored relations of which {reasons: 1} carry a reason
When capability adoption runs over it without perspectives
Then the rule-key row reads {ruleKeys: "1 of 3"}
Then the relation-reason row reads {relationReasons: "1 of 2"}
Then the perspectives row reads {perspectives: "null of null"}

Open example

Example space

Given a probe corpus with {rules:number} rule entries of which {keyed:number} carry a key, and {relations:number} authored relations of which {reasons:number} carry a reason
When capability adoption runs over it without perspectives
Then the rule-key row reads {ruleKeys:string}
Then the relation-reason row reads {relationReasons:string}
Then the perspectives row reads {perspectives:string}
Design
adoptionRecipe line 44 · specs/consumers/upgrade-kit.capability-adoption.sdp.md:44
recipe 47, capability adoption, takes params.detail, false by default, true for every Spec row or a list of Spec ids for those rows, and params.perspectives, the list of perspective objects the corpus keeps, absent by default; another detail value returns { diagnostics: [{ parameter, problem }] }.
adoptionAnswer line 45 · specs/consumers/upgrade-kit.capability-adoption.sdp.md:45
{ totals, capabilities, packs, specs, leftOut }, where totals is { specs, packs, examples, decisions, componentUnits, statedReady, floorReady }, capabilities holds one row per capability in the order below, packs one row per Pack in id order, specs the Spec rows detail asks for, empty by default, and leftOut holds the one line Spec rows; pass detail: true or a list of Spec ids. whenever a Spec row is left out, and is empty otherwise.

no citation recorded

capabilityRow line 46 · specs/consumers/upgrade-kit.capability-adoption.sdp.md:46
{ capability, inUse, applicable, carriedBy }, where inUse counts the places that use the capability, applicable the places it could apply, and carriedBy is the id of the Spec that carries its law; a count the graph cannot give is null.

no citation recorded

capabilityList line 47 · specs/consumers/upgrade-kit.capability-adoption.sdp.md:47
each row as capability (carriedBy): places used, of places it could apply. ruleKeys (spec:model.rule-keys): rule and flow entries that carry a key, of all rule and flow entries; questionKeys (spec:model.open-question-keys): open questions that carry a key, of all open questions; questionFields (spec:model.open-question-fields): open questions that carry decider, links, provisional or trigger, of all open questions; relationReasons (spec:model.relation-reasons): authored relations that carry a reason, of all authored relations; exercises (spec:model.rule-keys): declared verifies edges from an example that carry exercises, of all such edges; pinnedDeclarations (spec:extraction.contract-declarations): keyed Design entries whose value opens with a code span, of every keyed Design entry other than description; componentDesigns (spec:model.planned-architecture): components that have a component design, of the distinct components a component design or a component: anchor names; stepKeys (spec:carrier.step-keys): keyed example steps, of all example steps; termKeys (spec:model.term-addresses): keyed Model terms, of all Model terms; entryCitations (spec:extraction.entry-citations): pinned declarations an anchored line cites, of all pinned declarations; perspectives (spec:consumers.review-perspectives): the perspective objects passed, of null.
packRow line 48 · specs/consumers/upgrade-kit.capability-adoption.sdp.md:48
{ id, members, capabilities }, where capabilities maps each capability but perspectives to { inUse, applicable } summed over the Pack's resolving members, except componentDesigns, which counts once each the components a member names as a component design or a component: anchor names when it satisfies a member, inUse being those that have a component design anywhere in the corpus.

no citation recorded

specRow line 49 · specs/consumers/upgrade-kit.capability-adoption.sdp.md:49
{ id, packs, inUse, couldApply }, where inUse maps each capability the Spec uses to its count and couldApply maps each capability with places left to applicable minus inUse, both leaving out perspectives and every zero, and componentDesigns counts as a Pack row does for that Spec alone; rows sort by id.

no citation recorded

Verification

Verifier bindings

  • spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus · Capability adoption counts keyed rules and reasoned relations · declared · example enabled · specs/consumers/upgrade-kit.capability-adoption.counts-a-corpus.sdp.md

    External run evidence from test/upgrade-kit.test.ts

    Test anchors: test:protocol.capability-adoption.counts-a-corpus, test:protocol.rule-key-proposal.collision-and-unkeyable, test:protocol.rule-key-proposal.proposal-applies-clean, test:protocol.upgrade-guide. Specs verified by those bindings: spec:consumers.upgrade-kit, spec:consumers.upgrade-kit.capability-adoption, spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus, spec:consumers.upgrade-kit.rule-key-proposal, spec:consumers.upgrade-kit.rule-key-proposal.collision-and-unkeyable, spec:consumers.upgrade-kit.rule-key-proposal.proposal-applies-clean.

    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
    applies unchanged scopes while sending only moved changes to a personupgrade kitpassed2.69 ms
    names a carrying Spec in every guide sectionupgrade kitpassed0.66 ms
    teaches the upgrade steps in the pinned orderupgrade kitpassed1.11 ms
    teaches epic reparenting and advisory roadmap adoptionupgrade kitpassed0.5 ms
    runs the guide's rules file on a clean corpus with no address parametersupgrade kitpassed22.82 ms
    names the recipes' carrying Specs and teaches rule-key proposal as the rule-key actionupgrade kitpassed1.68 ms
    ships the guide and names every reported capability's law and measurementupgrade kitpassed13.26 ms
    counts rules, reasons and unknown external perspectivesupgrade kitpassed7.81 ms
    coins collisions and lists an unkeyable entryupgrade kitpassed4.95 ms
    executes the bound example against a fresh worldCapability adoption counts keyed rules and reasoned relations (spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus)passed7.51 ms
    executes the bound example against a fresh worldA rule-key proposal passes the proposal check and validates once applied (spec:consumers.upgrade-kit.rule-key-proposal.proposal-applies-clean)passed14.93 ms
    executes the bound example against a fresh worldTwo rules that coin one key stay apart, and a rule with no ASCII word stays unkeyed (spec:consumers.upgrade-kit.rule-key-proposal.collision-and-unkeyable)passed13.14 ms
    counts distinct step skeletons and vocabulary keys inherited through refinescapability adoption detailspassed14.92 ms
    counts distinct step skeletons and vocabulary keys inherited through verifiescapability adoption detailspassed5.93 ms
    counts repeated vocabulary and example steps once per skeleton within a Speccapability adoption detailspassed1.83 ms
    counts all capabilities and deduplicates shared components and repeated Pack memberscapability adoption detailspassed14.29 ms
    diagnoses detail nullcapability adoption detailspassed3.74 ms
    diagnoses detail 1capability adoption detailspassed2.14 ms
    diagnoses detail "all"capability adoption detailspassed1.93 ms
    diagnoses detail {}capability adoption detailspassed1.91 ms
    diagnoses detail "spec:missing"capability adoption detailspassed1.91 ms
    diagnoses detail truecapability adoption detailspassed1.85 ms
    drops possessives and apostrophes before coining keysrule-key proposal detailspassed2.22 ms
    preserves scope and entry order and skips existing keys and tagsrule-key proposal detailspassed12.48 ms
    diagnoses both scopes even when each resolvesrule-key proposal detailspassed2.12 ms
    diagnoses invalid parameters {}rule-key proposal detailspassed1.94 ms
    diagnoses invalid parameters {"commit":""}rule-key proposal detailspassed1.99 ms
    diagnoses invalid parameters {"commit":1}rule-key proposal detailspassed1.91 ms
    diagnoses invalid parameters {"commit":"abc","pack":"pack:missing"}rule-key proposal detailspassed1.81 ms
    diagnoses invalid parameters {"commit":"abc","specs":["spec:missing"]}rule-key proposal detailspassed1.85 ms
    diagnoses invalid parameters {"commit":"abc","specs":[],"pack":"pack:missing"}rule-key proposal detailspassed3.9 ms
    diagnoses invalid parameters {"commit":"abc","specs":"all"}rule-key proposal detailspassed1.84 ms
    drops leading digit words before checking word repeatsnot recordedpassed1.97 ms

Example space

  • rules · number · declared by a probe corpus with {rules} rule entries of which {keyed} carry a key, and {relations} authored relations of which {reasons} carry a reason
  • keyed · number · declared by a probe corpus with {rules} rule entries of which {keyed} carry a key, and {relations} authored relations of which {reasons} carry a reason
  • relations · number · declared by a probe corpus with {rules} rule entries of which {keyed} carry a key, and {relations} authored relations of which {reasons} carry a reason
  • reasons · number · declared by a probe corpus with {rules} rule entries of which {keyed} carry a key, and {relations} authored relations of which {reasons} carry a reason

Bound points

Oracle binding: present · oracle:protocol.capability-adoption · test/upgrade-kit.test.ts:322

Coverage

rules: 3 · spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus · not enumerable

keyed: 1 · spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus · not enumerable

relations: 2 · spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus · not enumerable

reasons: 1 · spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus · not enumerable

Unbound

  • rules: None
  • keyed: None
  • relations: None
  • reasons: None
Design view

Requirement drawing

Requirement drawing for spec:consumers.upgrade-kit.capability-adoption
The diagram as text
  • spec:consumers.upgrade-kit.capability-adoption: Capability adoption counts where each capability is used and where it could apply · declared Spec
  • spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus: Capability adoption counts keyed rules and reasoned relations · declared Spec
  • spec:consumers.upgrade-kit: The upgrade kit shows a corpus what it could adopt · declared Spec
  • impl:protocol.capability-adoption-recipe: realizes capability adoption in the shipped recipe catalog · anchored code · test/upgrade-kit.test.ts:514
  • oracle:protocol.capability-adoption: oracle:protocol.capability-adoption · anchored oracle binding · test/upgrade-kit.test.ts:322
  • test:protocol.capability-adoption.counts-a-corpus: test:protocol.capability-adoption.counts-a-corpus · anchored test binding · binding present · test/upgrade-kit.test.ts:345
  • spec:consumers.upgrade-kit.capability-adoption refines spec:consumers.upgrade-kit · declared
  • spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus refines spec:consumers.upgrade-kit.capability-adoption · declared
  • spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus verifies spec:consumers.upgrade-kit.capability-adoption · declared
  • impl:protocol.capability-adoption-recipe satisfies spec:consumers.upgrade-kit.capability-adoption · anchored
  • oracle:protocol.capability-adoption models spec:consumers.upgrade-kit.capability-adoption · anchored
  • test:protocol.capability-adoption.counts-a-corpus verifies spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus · 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
  • impl:protocol.capability-adoption-recipe · realizes capability adoption in the shipped recipe catalog · test/upgrade-kit.test.ts:514

    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.upgrade-kit.capability-adoption
  • E4: verifies · declared
The diagram as text
  • spec:carrier.step-keys: An example step may carry a key that survives rewording
  • spec:consumers.review-perspectives: A Pack is read from a named perspective
  • spec:consumers.upgrade-kit: The upgrade kit shows a corpus what it could adopt
  • spec:consumers.upgrade-kit.capability-adoption: Capability adoption counts where each capability is used and where it could apply
  • spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus: Capability adoption counts keyed rules and reasoned relations
  • spec:extraction.contract-declarations: Pinned declarations give an adopter a derived module to typecheck
  • spec:extraction.entry-citations: The graph records where anchored source cites an entry address
  • spec:model.open-question-fields: An open question may name who decides it, its links, a provisional reading and a re-entry trigger
  • spec:model.open-question-keys: An open question may carry a key that addresses it
  • spec:model.planned-architecture: Components are designed ahead of their code
  • spec:model.relation-reasons: An authored relation may carry its reason
  • spec:model.rule-keys: A rule or flow entry may carry a key that addresses it
  • spec:model.term-addresses: A Model term may carry a key that addresses it
  • spec:consumers.upgrade-kit.capability-adoption dependsOn spec:carrier.step-keys · declared — step keys are counted where example steps are
  • spec:consumers.upgrade-kit.capability-adoption dependsOn spec:consumers.review-perspectives · declared — perspectives are counted from the objects the caller passes
  • spec:consumers.upgrade-kit.capability-adoption dependsOn spec:extraction.contract-declarations · declared — pinned declarations are counted where keyed Design entries are
  • spec:consumers.upgrade-kit.capability-adoption dependsOn spec:extraction.entry-citations · declared — a pinned declaration counts as cited when an anchored line cites it
  • spec:consumers.upgrade-kit.capability-adoption dependsOn spec:model.open-question-fields · declared — question keys and fields are counted where open questions are
  • spec:consumers.upgrade-kit.capability-adoption dependsOn spec:model.open-question-keys · declared — question keys are counted where open questions are
  • spec:consumers.upgrade-kit.capability-adoption dependsOn spec:model.planned-architecture · declared — component designs are selected by the convention that Spec states
  • spec:consumers.upgrade-kit.capability-adoption dependsOn spec:model.relation-reasons · declared — relation reasons are counted where authored relations are
  • spec:consumers.upgrade-kit.capability-adoption dependsOn spec:model.rule-keys · declared — rule keys and `exercises` are two of the capabilities it counts
  • spec:consumers.upgrade-kit.capability-adoption dependsOn spec:model.term-addresses · declared — term keys are counted where Model terms are
  • spec:consumers.upgrade-kit.capability-adoption refines spec:consumers.upgrade-kit · declared
  • spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus refines spec:consumers.upgrade-kit.capability-adoption · declared
  • spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus verifies spec:consumers.upgrade-kit.capability-adoption · 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
dependsOn · outgoingAn example step may carry a key that survives rewording
spec:carrier.step-keys · resolves
declaredstep keys are counted where example steps areNone
dependsOn · outgoingA Pack is read from a named perspective
spec:consumers.review-perspectives · resolves
declaredperspectives are counted from the objects the caller passesNone
dependsOn · outgoingPinned declarations give an adopter a derived module to typecheck
spec:extraction.contract-declarations · resolves
declaredpinned declarations are counted where keyed Design entries areNone
dependsOn · outgoingThe graph records where anchored source cites an entry address
spec:extraction.entry-citations · resolves
declareda pinned declaration counts as cited when an anchored line cites itNone
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
declaredquestion keys and fields are counted where open questions areNone
dependsOn · outgoingAn open question may carry a key that addresses it
spec:model.open-question-keys · resolves
declaredquestion keys are counted where open questions areNone
dependsOn · outgoingComponents are designed ahead of their code
spec:model.planned-architecture · resolves
declaredcomponent designs are selected by the convention that Spec statesNone
dependsOn · outgoingAn authored relation may carry its reason
spec:model.relation-reasons · resolves
declaredrelation reasons are counted where authored relations areNone
dependsOn · outgoingA rule or flow entry may carry a key that addresses it
spec:model.rule-keys · resolves
declaredrule keys and exercises are two of the capabilities it countsNone
dependsOn · outgoingA Model term may carry a key that addresses it
spec:model.term-addresses · resolves
declaredterm keys are counted where Model terms areNone
refines · outgoingThe upgrade kit shows a corpus what it could adopt
spec:consumers.upgrade-kit · resolves
declaredNoneNone
refines · incomingCapability adoption counts keyed rules and reasoned relations
spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus · resolves
declaredNoneNone
verifies · incomingCapability adoption counts keyed rules and reasoned relations
spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus · resolves
declaredNonecapabilityRows, outsideTheGraph

Bindings

Implementation binding: present

  • impl:protocol.capability-adoption-recipe · realizes capability adoption in the shipped recipe catalog · test/upgrade-kit.test.ts:514 · role projection

Design reference: none

Verifier binding: present

Expected-outcome oracle: present

  • oracle:protocol.capability-adoption · test/upgrade-kit.test.ts:322

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

Composing (0)

Composing needs the script.