Spec Studio

Enrichment keeps one Spec while its detail changes

spec:model.enrichment-lifecycleDomain Model · featureready floor ready

Packs: pack:design-iteration-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/model/enrichment-lifecycle.sdp.md

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

Intent
outcome
Keep a Spec useful after implementation without copying its detail into a second artifact that drifts from it.
Model
enrichment lifecycle line 18 · specs/model/enrichment-lifecycle.sdp.md:18
The same Spec gains and may later slim typed detail without changing identity or moving truth into another artifact type.
distillation boundary line 19 · specs/model/enrichment-lifecycle.sdp.md:19
A Design entry may leave its Spec once the Spec is implemented with a verifier and a bound artifact carries the entry: a pinned declaration whose realizing unit exists, or a bound example. Prose that explains why always stays, so each explanation keeps one home, and implemented code alone justifies neither keeping nor deleting detail.
slimming candidate line 20 · specs/model/enrichment-lifecycle.sdp.md:20
A Design entry past the distillation boundary. A recipe reports the candidates and never deletes one; removing an entry stays the author's edit.
Design
slimmingRecipe line 24 · specs/model/enrichment-lifecycle.sdp.md:24
recipe 39, slimming candidates, takes an optional params.pack and returns { totals: { specs, potentialCandidates }, rows, leftOut }, each row { spec, key, line, declaration, implementations, verifiers } for a pinned declaration on a Spec that carries both implemented and has-verifier.
slimmingScope line 25 · specs/model/enrichment-lifecycle.sdp.md:25
rows are potential candidates the author compares with the bound artifacts, because a binding names a whole Spec and the graph proves no entry-level realization for a declaration or an example; leftOut states both limits, and prose entries are never candidates.
Verification

Verifier bindings

  • test:protocol.slimming-recipe · anchored · test anchor binding present · test/curation-recipes.test.ts:39

    External run evidence from test/curation-recipes.test.ts

    Test anchors: test:protocol.curation-recipe, test:protocol.slimming-recipe. Specs verified by those bindings: spec:consumers.impact-graph.curation-assist, spec:model.enrichment-lifecycle.

    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
    requires both facts and uses recipe 24's opening span rule, with lines and bindingsslimming candidates recipepassed8.45 ms
    selects only Pack members and returns no rows for a clean Packslimming candidates recipepassed2.54 ms
    distinguishes an unknown Pack from a clean existing Packslimming candidates recipepassed1.83 ms
    includes enabled example verifier bindings without claiming they realize an entryslimming candidates recipepassed1.44 ms
    returns diagnostics and no rows for invalid imports input undefinedcuration report recipepassed1.13 ms
    returns diagnostics and no rows for invalid imports input nullcuration report recipepassed1.03 ms
    returns diagnostics and no rows for invalid imports input []curation report recipepassed0.56 ms
    returns diagnostics and no rows for invalid imports input 'imports'curation report recipepassed0.63 ms
    returns diagnostics and no rows for invalid imports input {}curation report recipepassed0.73 ms
    returns diagnostics and no rows for invalid imports input { schema: 'sdp-imports/2', …(2) }curation report recipepassed0.52 ms
    returns diagnostics and no rows for invalid imports input { schema: 'sdp-imports/1', files: [] }curation report recipepassed0.49 ms
    returns diagnostics and no rows for invalid imports input { schema: 'sdp-imports/1', …(2) }curation report recipepassed0.47 ms
    returns diagnostics and no rows for invalid imports input { schema: 'sdp-imports/1', …(3) }curation report recipepassed0.58 ms
    returns diagnostics and no rows for invalid imports input { schema: 'sdp-imports/1', …(3) }curation report recipepassed0.59 ms
    returns diagnostics and no rows for invalid imports input { schema: 'sdp-imports/1', …(2) }curation report recipepassed0.58 ms
    returns diagnostics and no rows for invalid imports input { schema: 'sdp-imports/1', …(2) }curation report recipepassed0.44 ms
    returns diagnostics and no rows for invalid imports input { schema: 'sdp-imports/1', …(2) }curation report recipepassed0.47 ms
    returns diagnostics and no rows for invalid limit 0curation report recipepassed0.51 ms
    returns diagnostics and no rows for invalid limit -1curation report recipepassed0.4 ms
    returns diagnostics and no rows for invalid limit 1.5curation report recipepassed0.48 ms
    returns diagnostics and no rows for invalid limit "1"curation report recipepassed0.4 ms
    returns diagnostics and no rows for invalid limit nullcuration report recipepassed0.36 ms
    returns diagnostics and no rows for invalid limit truecuration report recipepassed0.48 ms
    recognizes every lawful component-id segment and keeps invalid convention values outcuration report recipepassed0.7 ms
    echoes import exclusions without changing the supplied graph or inferring omissionscuration report recipepassed2.33 ms
    joins directed component pairs, ranks uncovered files and reports incomplete input and unrealized designscuration report recipepassed1.13 ms
    applies the limit only to uncovered rows and counts distinct file pairscuration report recipepassed0.93 ms
    aggregates file pairs for a component pair and picks the first sample in path ordercuration report recipepassed0.81 ms
    uses code-unit order for tied ranks and samples, and defaults to twenty uncovered rowscuration report recipepassed1.57 ms
    keeps several component bindings in one file and ignores inferred structural edgescuration report recipepassed0.95 ms
    builds a small fixture imports file and supplies its object to the recipe, backing uses through a barrelcuration report recipepassed473.8 ms
    reports missing or malformed parameter data {}curation report recipepassed0.68 ms
    reports missing or malformed parameter data {"imports":{}}curation report recipepassed0.4 ms
    reports missing or malformed parameter data {"imports":{"schema":"sdp-imports/1","adapter":"typescript","files":[{"file":"code/idle.ts","imports":[]},{"file":"code/a.ts","imports":["code/index.ts","code/leaf.ts"]},{"file":"code/index.ts","imports":["code/leaf.ts"]},{"file":"code/leaf.ts","imports":["code/a.ts"]},{"file":"code/loose.ts","imports":[]}]},"limit":-1}curation report recipepassed0.4 ms
    reports missing or malformed parameter data {"imports":{"schema":"sdp-imports/1","adapter":"typescript","files":[{"file":"code/idle.ts","imports":[]},{"file":"code/a.ts","imports":["code/index.ts","code/leaf.ts"]},{"file":"code/index.ts","imports":["code/leaf.ts"]},{"file":"code/leaf.ts","imports":["code/a.ts"]},{"file":"code/loose.ts","imports":[]}]},"limit":1.5}curation report recipepassed8.89 ms
Design view

Requirement drawing

  • Declared verifying examples: no declared verifying example.
Requirement drawing for spec:model.enrichment-lifecycle
The diagram as text
  • spec:model.enrichment-lifecycle: Enrichment keeps one Spec while its detail changes · declared Spec
  • spec:model.core-model: The Protocol models delivery with one enrichable Spec · declared Spec
  • impl:protocol.slimming-recipe: asserts realization of the shipped slimming-candidates recipe · anchored code · test/curation-recipes.test.ts:26
  • test:protocol.slimming-recipe: test:protocol.slimming-recipe · anchored test binding · binding present · test/curation-recipes.test.ts:39
  • spec:model.enrichment-lifecycle refines spec:model.core-model · declared
  • impl:protocol.slimming-recipe satisfies spec:model.enrichment-lifecycle · anchored
  • test:protocol.slimming-recipe verifies spec:model.enrichment-lifecycle · 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
  • impl:protocol.slimming-recipe · asserts realization of the shipped slimming-candidates recipe · test/curation-recipes.test.ts:26

    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:model.enrichment-lifecycle
The diagram as text
  • spec:consumers.delivery-session-on-ramp: Delivery sessions route work from current graph state
  • spec:extraction.contract-declarations: Pinned declarations give an adopter a derived module to typecheck
  • spec:model.core-model: The Protocol models delivery with one enrichable Spec
  • spec:model.enrichment-lifecycle: Enrichment keeps one Spec while its detail changes
  • spec:model.enrichment-lifecycle dependsOn spec:extraction.contract-declarations · declared — a slimming candidate is a pinned declaration
  • spec:model.enrichment-lifecycle refines spec:model.core-model · declared
  • spec:consumers.delivery-session-on-ramp dependsOn spec:model.enrichment-lifecycle · declared — the close guidance reads its distillation boundary for Design entries
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

Distance 5

Distance 6

Relations

Relation and directionOther endClaimReasonExercised keys
dependsOn · outgoingPinned declarations give an adopter a derived module to typecheck
spec:extraction.contract-declarations · resolves
declareda slimming candidate is a pinned declarationNone
refines · outgoingThe Protocol models delivery with one enrichable Spec
spec:model.core-model · resolves
declaredNoneNone
dependsOn · incomingDelivery sessions route work from current graph state
spec:consumers.delivery-session-on-ramp · resolves
declaredthe close guidance reads its distillation boundary for Design entriesNone

Bindings

Implementation binding: present

  • impl:protocol.slimming-recipe · asserts realization of the shipped slimming-candidates recipe · test/curation-recipes.test.ts:26

Design reference: none

Verifier binding: present

  • test:protocol.slimming-recipe · anchored · test/curation-recipes.test.ts:39 · 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.