Obsidian vault

pack:obsidian-vault-v1specs/obsidian-vault.pack.sdp.md

Exported from the Spec Studio

pack:obsidian-vault-v1

Where the design stands

  • 23 members in authored reading order; no unresolved members.
  • No members held below their stated next rung.
  • No members waiting only for their author's statement.
  • 49 design entries and 25 pinned declarations.
  • No open questions and no blocking questions.
  • 6 members with an implementation binding.
  • 1 member with a design reference.
  • 18 outside Specs the Pack rests on; 12 outside Specs rest on the Pack; 5 outside Specs verify it; no outside Specs supersede it.

Maturity map

23 members at stated ready and floor ready: full member list.

Stated readiness by floor reached
Rows: stated readiness, idea to ready. Columns: floor reached, none to ready. Each mark counts one member; above 100 members a cell is solid. Floor none is distinct from idea.

Outlined diagonal: matches. Right of diagonal: floor above statement. Left of diagonal: statement above floor.

Maturity map for Obsidian vaultFloor reached →Stated readiness ↓noneideascopeddefinedreadyideascopeddefinedreadystated ready, floor ready: 23 members23
Maturity map as text
Counts by stated readiness and floor reached. To the right the floor exceeds the statement; to the left the statement exceeds the floor.
Stated rung / floor reachedfloor nonefloor ideafloor scopedfloor definedfloor ready
stated idea—————
stated scoped—————
stated defined—————
stated ready————23
stated ready, floor ready · 23 members
Mermaid source

Preferred syntax: block. Fixed categorical cells; membership appears in comments.

Framing

A human interface for iterating on designs: the one graph regenerated as an Obsidian vault of linked notes, read beside the carriers an agent edits. First the vault, its verb and its place among the projections, with the decision that its generator owns one folder of the vault and never touches a note a person wrote. Then its notes and links, its tables, the loop a design pass runs through it, and the skill that teaches an agent to keep the vault and answer a pass from it. Each Spec is followed by the examples that will verify it. Last, the one model change the vault asks for, an address for a Model term, so a concept links as exactly as a Spec does.

Members

1. An Obsidian vault lets a person iterate on designs from the one graphbehavior · ready floor ready · 0 open, 0 blocking questions · implementation binding present · verifier binding present

spec:consumers.obsidian-vault

Design

13 design entries · 5 pinned declarations

Decisions

Open questions

None.

Implementation binding: present

  • impl:protocol.vault-command · validates after vault preflight and retains prior notes behind a failed-extraction index · src/cli/vault-command.ts:191 · role publisher · component component:protocol.cli · layer edge · context protocol
  • impl:protocol.vault-notes · renders reader contexts, declared relations and keyed terms as linked notes · src/projections/vault/notes.ts:45 · role projection · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.vault-sync · guards every owned entry and records transitional hashes before atomic file replacement · src/projections/vault/sync.ts:98 · role publisher · component component:protocol.projections · layer edge · context protocol

Design reference: none

Verifier binding: present

9 verifiers, 9 enabled · 9 verifying examples, 9 enabled

2. The vault's generator owns one folder and synchronizes itdecision · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding none

spec:decisions.vault-owned-folder

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: present

  • impl:protocol.vault-command · validates after vault preflight and retains prior notes behind a failed-extraction index · src/cli/vault-command.ts:191 · role publisher · component component:protocol.cli · layer edge · context protocol
  • impl:protocol.vault-sync · guards every owned entry and records transitional hashes before atomic file replacement · src/projections/vault/sync.ts:98 · role publisher · component component:protocol.projections · layer edge · context protocol

Verifier binding: none

3. A fresh vault is written the same way twice and every link resolvesexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.fresh-vault

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

4. A regeneration removes a note that left the graph and keeps a person's notesexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.person-notes-survive

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

5. A note a person wrote inside the generated folder refuses the regenerationexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.unknown-note-refused

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

6. A generated note a person changed refuses the regeneration and keeps the editexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.changed-note-refused

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

7. A person's file under a temporary's name refuses the regenerationexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.hidden-file-refused

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

8. A vault directory the build removes refuses the run and keeps a person's notesexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.vault-in-build-path-refused

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

9. A run after a stopped synchronization finishes itexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.interrupted-run-recovered

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

10. A failed extraction keeps the notes and says so on the indexexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.failed-extraction-keeps-notes

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

11. The run after a failed extraction passes the guard and restores the indexexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.failed-extraction-recovered

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

12. Every Spec, Pack, code unit and keyed term is a note, and every relation is a linkbehavior · ready floor ready · 0 open, 0 blocking questions · implementation binding present · verifier binding present

spec:consumers.obsidian-vault.notes

Design

17 design entries · 8 pinned declarations

Open questions

None.

Implementation binding: present

  • impl:protocol.vault-notes · renders reader contexts, declared relations and keyed terms as linked notes · src/projections/vault/notes.ts:45 · role projection · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.vault-sections · renders sections in graph order with keyed entry block ids · src/projections/vault/sections.ts:10 · role projection · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.vault-text · renders checked mentions and escapes Obsidian syntax outside code spans · src/projections/vault/text.ts:30 · role codec · component component:protocol.projections · layer edge · context protocol

Design reference: none

Verifier binding: present

5 verifiers, 5 enabled · 4 verifying examples, 4 enabled

14. A mention of an entry that does not exist stays as writtenexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.notes.unresolved-mention-stays

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

16. Two Specs whose notes differ only in case refuse the runexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.notes.case-collision-refused

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

17. A Pack's members and the standing queries are tables over the reader's valuesbehavior · ready floor ready · 0 open, 0 blocking questions · implementation binding present · verifier binding present

spec:consumers.obsidian-vault.bases

Design

9 design entries · 5 pinned declarations

Open questions

None.

Implementation binding: present

  • impl:protocol.vault-bases · serializes standing query predicates over reader properties as Obsidian Bases · src/projections/vault/bases.ts:43 · role projection · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.vault-notes · renders reader contexts, declared relations and keyed terms as linked notes · src/projections/vault/notes.ts:45 · role projection · component component:protocol.projections · layer edge · context protocol

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · 1 verifying example, 1 enabled

18. Each standing view selects what its source selectsexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.bases.views-match-sources

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

19. A design pass is followed and answered from the vaultbehavior · ready floor ready · 0 open, 0 blocking questions · implementation binding present · verifier binding present

spec:consumers.obsidian-vault.iteration

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: present

  • impl:protocol.vault-sync · guards every owned entry and records transitional hashes before atomic file replacement · src/projections/vault/sync.ts:98 · role publisher · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.vault-text · renders checked mentions and escapes Obsidian syntax outside code spans · src/projections/vault/text.ts:30 · role codec · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.vault-watch · reuses the coalescing watcher with source suffixes and a synchronous vault cycle · src/cli/vault-command.ts:219 · role service · component component:protocol.cli · layer edge · context protocol

Design reference: none

Verifier binding: present

2 verifiers, 2 enabled · 2 verifying examples, 2 enabled

20. A carrier edit under watch rewrites only the notes it changesexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

21. An anchor added in a source file under watch rewrites the Spec's noteexample · ready floor ready · 0 open, 0 blocking questions · implementation binding none · verifier binding present

spec:consumers.obsidian-vault.iteration.watch-source-anchor

Design

No design entries · no pinned declarations

Open questions

None.

Implementation binding: none

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

22. The vault skill teaches agents to keep an Obsidian vault of the graphbehavior · ready floor ready · 0 open, 0 blocking questions · implementation binding present · verifier binding present

spec:consumers.vault-on-ramp

Design

No design entries · no pinned declarations

Decisions

Open questions

None.

Implementation binding: present

  • impl:protocol.vault-on-ramp · asserts realization of the shipped vault skill document · test/skills.test.ts:1995

Design reference: none

Verifier binding: present

1 verifier, 1 enabled · no verifying examples, 0 enabled

23. A Model term may carry a key that addresses itrule · ready floor ready · 0 open, 0 blocking questions · implementation binding present · verifier binding present

spec:model.term-addresses

Design

10 design entries · 7 pinned declarations

Decisions

  • spec:decisions.checked-mentions · stated ready
  • spec:decisions.shipped-projections-frozen · stated ready

Open questions

None.

Implementation binding: present

  • impl:protocol.address-and-cycle-recipes · asserts realization of the shipped address resolution and dependency cycle recipes · test/recipes.test.ts:3568
  • impl:protocol.entry-locations · builds the carrier entry location table · src/extract/derive.ts:78 · role extractor · component component:protocol.extract · layer application · context protocol
  • impl:protocol.key-markers · normalizes step and term markers across the three carriers · src/extract/key-markers.ts:136 · role codec · component component:protocol.extract · layer application · context protocol
  • impl:protocol.open-section-order · preserves authored open-section and model-term order and Pack field order · src/extract/serialize.ts:105 · role codec · component component:protocol.extract · layer application · context protocol
  • impl:protocol.prose-mentions · checks that prose mentions resolve and warns once per unbacked Spec pair · src/validate/validators.ts:1370 · role validator · component component:protocol.validate · layer domain · context protocol
  • impl:protocol.register-recipes · asserts realization of the shipped register recipes · test/recipes.test.ts:2057
  • impl:protocol.sdp-import-markdown-emit · emits the Markdown document twin for an imported Spec · src/import/emit-markdown.ts:253 · role codec · component component:protocol.import · layer application · context protocol
  • impl:protocol.spec-sections · typed Spec section shapes · src/model/sections.ts:138 · role contract · component component:protocol.model · layer domain · context protocol
  • impl:protocol.stable-ids · stable ID grammar parser · src/ids.ts:173 · role codec · component component:protocol.model · layer domain · context protocol

Design reference: none

Verifier binding: present

6 verifiers, 6 enabled · 5 verifying examples, 5 enabled

Boundary

Rests on (18)
SpecStated rungImplementation bindingJoined members
spec:consumers.binding-language-views
spec:consumers.binding-language-views
readypresentdependsOn: spec:consumers.obsidian-vault.notes
spec:consumers.edit-model
spec:consumers.edit-model
readynonedependsOn: spec:consumers.obsidian-vault.iteration
spec:consumers.intent-composition
spec:consumers.intent-composition
readynonedependsOn: spec:consumers.vault-on-ramp
spec:consumers.intent-composition.proposal
spec:consumers.intent-composition.proposal
readypresentdependsOn: spec:consumers.obsidian-vault.iteration
spec:consumers.pack-design
spec:consumers.pack-design
readypresentdependsOn: spec:consumers.obsidian-vault.bases
spec:consumers.projections-model
spec:consumers.projections-model
readypresentrefines: spec:consumers.obsidian-vault
spec:consumers.reader
spec:consumers.reader
readypresentdependsOn: spec:consumers.obsidian-vault
spec:consumers.reading-on-ramp
spec:consumers.reading-on-ramp
readypresentrefines: spec:consumers.vault-on-ramp
spec:consumers.validate-watch
spec:consumers.validate-watch
readypresentdependsOn: spec:consumers.obsidian-vault.iteration
spec:consumers.wholesale-view-rewrite
spec:consumers.wholesale-view-rewrite
readypresentdependsOn: spec:consumers.obsidian-vault
spec:decisions.checked-mentions
spec:decisions.checked-mentions
readynonedecidedBy: spec:model.term-addresses
spec:decisions.shipped-projections-frozen
spec:decisions.shipped-projections-frozen
readynonedecidedBy: spec:consumers.obsidian-vault, spec:model.term-addresses
spec:extraction.determinism
spec:extraction.determinism
readypresentconstrainedBy: spec:consumers.obsidian-vault
spec:extraction.entry-locations
spec:extraction.entry-locations
readypresentdependsOn: spec:model.term-addresses
spec:model.rule-keys
spec:model.rule-keys
readypresentdependsOn: spec:model.term-addresses
spec:model.spec-sections
spec:model.spec-sections
readypresentrefines: spec:model.term-addresses
spec:model.stable-ids
spec:model.stable-ids
readypresentdependsOn: spec:model.term-addresses
spec:validation.prose-mentions
spec:validation.prose-mentions
readypresentdependsOn: spec:consumers.obsidian-vault.notes
Rested on by (12)
SpecStated rungImplementation bindingJoined members
spec:carrier.markdown-body-grammar
spec:carrier.markdown-body-grammar
readypresentdependsOn: spec:model.term-addresses
spec:consumers.agent-surface.address-and-cycle-recipes
spec:consumers.agent-surface.address-and-cycle-recipes
readypresentdependsOn: spec:model.term-addresses
spec:consumers.agent-surface.register-recipes
spec:consumers.agent-surface.register-recipes
readypresentdependsOn: spec:model.term-addresses
spec:consumers.spec-studio.glossary-page
spec:consumers.spec-studio.glossary-page
readypresentdependsOn: spec:model.term-addresses
spec:consumers.spec-studio.spec-page
spec:consumers.spec-studio.spec-page
readypresentdependsOn: spec:model.term-addresses
spec:consumers.upgrade-kit.capability-adoption
spec:consumers.upgrade-kit.capability-adoption
readypresentdependsOn: spec:model.term-addresses
spec:model.term-addresses.keyed-term-resolves
spec:model.term-addresses.keyed-term-resolves
readynonerefines: spec:model.term-addresses
spec:model.term-addresses.malformed-term-marker-refused
spec:model.term-addresses.malformed-term-marker-refused
readynonerefines: spec:model.term-addresses
spec:model.term-addresses.repeated-term-key-refused
spec:model.term-addresses.repeated-term-key-refused
readynonerefines: spec:model.term-addresses
spec:model.term-addresses.typescript-term-imports-keyed
spec:model.term-addresses.typescript-term-imports-keyed
readynonerefines: spec:model.term-addresses
spec:model.term-addresses.unknown-term-key-refused
spec:model.term-addresses.unknown-term-key-refused
readynonerefines: spec:model.term-addresses
spec:validation.prose-mentions
spec:validation.prose-mentions
readypresentdependsOn: spec:model.term-addresses
Verified by (5)
SpecStated rungImplementation bindingJoined members
spec:model.term-addresses.keyed-term-resolves
spec:model.term-addresses.keyed-term-resolves
readynoneverifies: spec:model.term-addresses
spec:model.term-addresses.malformed-term-marker-refused
spec:model.term-addresses.malformed-term-marker-refused
readynoneverifies: spec:model.term-addresses
spec:model.term-addresses.repeated-term-key-refused
spec:model.term-addresses.repeated-term-key-refused
readynoneverifies: spec:model.term-addresses
spec:model.term-addresses.typescript-term-imports-keyed
spec:model.term-addresses.typescript-term-imports-keyed
readynoneverifies: spec:model.term-addresses
spec:model.term-addresses.unknown-term-key-refused
spec:model.term-addresses.unknown-term-key-refused
readynoneverifies: spec:model.term-addresses
Superseded by (0)

None.

Members with no verifier binding

The graph records bindings and never runs, so no page shows a run result. Decision records are left out: a decision never needs a verifier binding.

None.

Findings

None.

1. An Obsidian vault lets a person iterate on designs from the one graph

spec:consumers.obsidian-vault

An Obsidian vault lets a person iterate on designs from the one graph

spec:consumers.obsidian-vaultUse Case / Behavior · featureready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

Design: 13 design entries · 5 pinned declarations · 2 decisions

Findings: no errors, no warnings

specs/consumers/obsidian-vault.sdp.md

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

The Design Review links a Spec's relations both ways and gives keyed Pack questions a separate carrier-line link, but it offers no built-in filtering of a Pack or navigation from arbitrary prose mentions to their entries. The Spec Studio serves a person who iterates on a design in the repository and a pull request reviewer who holds only a link. A linked-notes view lets a person follow relations, filter members by rung and design columns, open entries by address and see each pass's edits arrive. It is a projection of its own, not the Studio's local half: the Studio's page set serves a reader who holds a link, the vault serves a person who iterates in a notes app, and each has its own verb; the verb that writes every projection root writes the vault too.

Obsidian already does that for linked Markdown notes with properties: backlinks, a graph view, search, and filterable tables it calls Bases. The first prototype, in explorations/obsidian-vault/, wrote notes from dumped graph and reader values, with relations and checked mentions as wikilinks, entry addresses as block links, and Bases for Pack members and standing queries. The second prototype checked the vault this Pack designs on the Protocol's corpus and the first adopter's: links that resolve, Bases whose views select what their recipes select, two identical renders, and a person's notes that survive. Its measurements remain in reviews/assets/plan46-prototypes/vault-measurements.md; git holds the replaced prototype.

The principle is a linked-notes view regenerated from the one graph; Obsidian and its Bases are the representation chosen first. Like every projection, the vault states no truth, and two runs over one graph write the same bytes, so no note names a commit or a time. Intent is still written only in the carriers. One thing sets the vault apart from the other projections: a person keeps it open and writes notes of their own in it. So the command owns one folder of the vault and a list of what it wrote there, and synchronizes that folder instead of rewriting a root wholesale; the vault's owned-folder decision, spec:decisions.vault-owned-folder, says why. For the same reason the vault never lies where the shared build removes files, and a run refuses rather than guess whose a file is.

The default vault sits under generated/, which discovery skips and an adopter usually keeps out of git. A person who wants to keep the intent notes they write in the vault points --out at a directory of their own.

Intent
actor
A person in the repository who designs a capability in passes while an agent edits the carriers.
problem
The Markdown Design Review offers no built-in Pack filters or navigation from arbitrary prose mentions to their entries, so a person iterating on a design still reads carrier files alongside it.
outcome
Generate an Obsidian vault from the one graph, in which a person reads, navigates and filters the corpus and follows each pass's edits, while the carriers stay the only place intent is written.
risks
  • A notes app invites editing, and an edit to a generated note never reaches the carrier.
Behavior

The world writes a probe corpus of one Pack and its member Specs, runs the vault command with the vault under the root's generated/ directory unless a point names another, and reads the vault from disk; a second run reads the same graph. The world leaves a stopped run's files by running the command with its first rename failing, which leaves the file list recording both contents and a whole temporary beside its target, and a failed run's files by running it while the member's carrier is one the extractor refuses, then repairing that carrier. A fresh vault is one the command writes into an empty directory from the same graph.

rule.ownProjection line 39 · specs/consumers/obsidian-vault.sdp.md:39
The vault is a projection of its own, written only through its synchronization, which sdp vault and the verb that writes every projection root run, and no part of the Studio's page set.

no example exercises it

rule.verb line 40 · specs/consumers/obsidian-vault.sdp.md:40
sdp vault [root | --root PATH] [--exclude PATH]... [--out DIR] [--watch] validates the graph as sdp validate does and then synchronizes the vault at DIR, by default generated/obsidian-vault/ under the root; the root is given as an argument or by --root, never both, and defaults to the working directory, each exclusion is a root-relative path prefix as for the publishers, and --out resolves against the working directory; a root given both ways, --root or --out given twice or without a value, and any other option refuse the run.

spec:consumers.obsidian-vault.fresh-vault · enabled

rule.outsideExtraction line 41 · specs/consumers/obsidian-vault.sdp.md:41
A vault directory inside the root must lie under a directory discovery skips or under an excluded prefix, so no file in the vault is ever read as a carrier or a source; any other vault directory inside the root refuses the run before the build, writing and removing nothing.

no example exercises it

rule.apartFromBuild line 42 · specs/consumers/obsidian-vault.sdp.md:42
A vault directory that is, lies inside or holds a path the shared build writes or removes, as spec:consumers.obsidian-vault#design.buildOwnedPaths lists, refuses the run before the build, writing and removing nothing, so no build ever removes a file in the vault.

spec:consumers.obsidian-vault.vault-in-build-path-refused · enabled

rule.ownedFolder line 43 · specs/consumers/obsidian-vault.sdp.md:43
The command writes only the generated folder sdp/ inside the vault; Obsidian's settings, a person's intent notes and every other file of the vault lie outside it and are never written, moved or removed.

spec:consumers.obsidian-vault.fresh-vault · enabled, spec:consumers.obsidian-vault.person-notes-survive · enabled, spec:consumers.obsidian-vault.vault-in-build-path-refused · enabled

rule.guard line 44 · specs/consumers/obsidian-vault.sdp.md:44
Before the build and before any cleanup, a run inspects sdp/ and every entry under it, names that begin with a dot included, and refuses when sdp/ or an entry under it is a symbolic link or neither a file nor a directory, when the file list is not well formed, when a file other than the file list, the command's own temporaries and a .DS_Store file is one the list does not name, or when a listed file other than a .base file has bytes matching no content the list records for it; a refused run writes nothing, removes nothing, names each such path and exits 1. A .DS_Store file under sdp/ is ignored. A listed .base file whose bytes a person changed is kept, even when it leaves the generated set; the run warns with its path and the words delete it to regenerate, keeps its recorded content in the list, and goes on. Without a file list, every file under sdp/ other than .DS_Store is one the list does not name.

spec:consumers.obsidian-vault.changed-note-refused · enabled, spec:consumers.obsidian-vault.failed-extraction-recovered · enabled, spec:consumers.obsidian-vault.hidden-file-refused · enabled, spec:consumers.obsidian-vault.unknown-note-refused · enabled

rule.synchronize line 45 · specs/consumers/obsidian-vault.sdp.md:45
A run that passes the guard first removes each file the list names that the new set no longer holds, except a changed .base file; then it writes each generated file whose bytes differ from the file on disk through a temporary sibling renamed into place, except a changed .base file, leaves every file whose bytes already match untouched, removes every directory under sdp/ left empty, and writes the file list last.

spec:consumers.obsidian-vault.interrupted-run-recovered · enabled, spec:consumers.obsidian-vault.person-notes-survive · enabled

rule.interruptedRun line 46 · specs/consumers/obsidian-vault.sdp.md:46
Before it changes any file, a run records in the file list both the content each path holds and the content it will hold, so a run stopped at any point leaves every generated file other than a kept, changed .base file matching the list, and the next run recognizes each, and each whole temporary, as its own and completes the synchronization; a temporary cut short while it was written matches no recorded content, so the guard refuses it as unknown and the person deletes it.

spec:consumers.obsidian-vault.interrupted-run-recovered · enabled

rule.standsApart line 47 · specs/consumers/obsidian-vault.sdp.md:47
The vault is not one of the five projection roots the shared build rewrites: the build's invalidation never removes it, and the repository's projection suite does not certify it. The verb that writes every projection root also synchronizes the vault, at the directory sdp vault would use for the same root unless that verb names another, through the same directory checks and guard, before it publishes any root; a refusal there leaves the vault untouched and fails that run. sdp vault enters the shared build, so it removes the five projection roots as sdp validate does.

no example exercises it

rule.deterministic line 48 · specs/consumers/obsidian-vault.sdp.md:48
Without kept, changed .base files, two runs over one graph write byte-identical files under sdp/, the file list included, and no file there holds a time, a commit, an absolute path or a host name.

spec:consumers.obsidian-vault.fresh-vault · enabled

rule.linksResolve line 49 · specs/consumers/obsidian-vault.sdp.md:49
Every wikilink, embed and block link a generated note writes resolves to a file the run wrote or kept and, with a block, to a block id that file carries; no note links outside the vault, a carrier or source file is named by its root-relative path in a code span, and text in a code span or a fenced block, where Obsidian reads no link, is no link.

spec:consumers.obsidian-vault.fresh-vault · enabled

rule.findingsShown line 50 · specs/consumers/obsidian-vault.sdp.md:50
Findings never withhold the vault: a run over a graph with validation findings still synchronizes and returns the validation exit code. A finding whose subject is a Spec or a Pack with a note shows on that note; every other finding shows on the index with its severity, its validator, its file and line when known and its message; and the index counts every finding by severity.

no example exercises it

rule.failedExtraction line 51 · specs/consumers/obsidian-vault.sdp.md:51
A run whose extraction fails keeps every generated file but the index and the file list: it rewrites the index to open with a warning naming the failure, through the steps spec:consumers.obsidian-vault#rule.interruptedRun and spec:consumers.obsidian-vault#rule.synchronize state, so the file list ends recording the warning index, and exits 1. The next run that succeeds finds the index matching the list and writes it whole again; with no earlier run, the failed run leaves only that index and the file list under sdp/.

spec:consumers.obsidian-vault.failed-extraction-keeps-notes · enabled, spec:consumers.obsidian-vault.failed-extraction-recovered · enabled

rule.plainNotes line 52 · specs/consumers/obsidian-vault.sdp.md:52
Notes are plain Markdown with YAML properties, wikilinks and block ids, which other notes tools read; only the .base files are Obsidian's own.

no example exercises it

rule.openAsVault line 53 · specs/consumers/obsidian-vault.sdp.md:53
A person opens the vault directory itself as an Obsidian vault, and every link and Base filter names its target by a path from that directory.

no example exercises it

0 unkeyed rules.

Verifying examples

A generated note a person changed refuses the regeneration and keeps the edit · spec:consumers.obsidian-vault.changed-note-refused · ready floor ready

Executable Spec

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files an earlier run wrote"}
Given the vault holds {extra: "a generated note a person changed"}
Given the member {change: "stays in the corpus"}
When the vault command runs at that root
Then the run exits {exitCode: 1}
Then the run refuses the path {refusedPath: "sdp/specs/probe/spec.probe.member.md"} as {refusal: "changed"}
Then every file the person wrote is byte-identical: {personFilesKept: true}

Open example

A failed extraction keeps the notes and says so on the index · spec:consumers.obsidian-vault.failed-extraction-keeps-notes · ready floor ready

Executable Spec

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files an earlier run wrote"}
Given the vault holds {extra: "an intent note and Obsidian settings outside the generated folder"}
Given the member {change: "has a carrier the extractor refuses"}
When the vault command runs at that root
Then the run exits {exitCode: 1}
Then the member's note is present: {memberNote: true}
Then the index note warns that the last regeneration failed: {indexWarns: true}
Then every generated file matches a content the file list records for it: {listMatches: true}
Then every file the person wrote is byte-identical: {personFilesKept: true}

Open example

The run after a failed extraction passes the guard and restores the index · spec:consumers.obsidian-vault.failed-extraction-recovered · ready floor ready

Executable Spec

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files a run whose extraction failed left"}
Given the vault holds {extra: "an intent note and Obsidian settings outside the generated folder"}
Given the member {change: "stays in the corpus"}
When the vault command runs at that root
Then the run exits {exitCode: 0}
Then the index note warns that the last regeneration failed: {indexWarns: false}
Then the generated folder is byte-identical to a fresh vault's, the file list included: {matchesFresh: true}
Then every file the person wrote is byte-identical: {personFilesKept: true}

Open example

A fresh vault is written the same way twice and every link resolves · spec:consumers.obsidian-vault.fresh-vault · ready floor ready

Executable Spec

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "nothing"}
Given the vault holds {extra: "no other file"}
Given the member {change: "stays in the corpus"}
When the vault command runs at that root
Then the run exits {exitCode: 0}
Then a second run over the same graph leaves every generated file byte-identical: {byteIdentical: true}
Then the member's note is present: {memberNote: true}
Then every link a generated note writes resolves inside the vault: {linksResolve: true}

Open example

A person's file under a temporary's name refuses the regeneration · spec:consumers.obsidian-vault.hidden-file-refused · ready floor ready

Executable Spec

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files an earlier run wrote"}
Given the vault holds {extra: "a file a person wrote inside the generated folder under a temporary's name"}
Given the member {change: "stays in the corpus"}
When the vault command runs at that root
Then the run exits {exitCode: 1}
Then the run refuses the path {refusedPath: "sdp/specs/probe/.spec.probe.member.md.sdp-tmp"} as {refusal: "unknown"}
Then every file the person wrote is byte-identical: {personFilesKept: true}

Open example

A run after a stopped synchronization finishes it · spec:consumers.obsidian-vault.interrupted-run-recovered · ready floor ready

Executable Spec

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files a run stopped at its first rename left"}
Given the vault holds {extra: "an intent note and Obsidian settings outside the generated folder"}
Given the member {change: "changes its title"}
When the vault command runs at that root
Then the run exits {exitCode: 0}
Then the generated folder is byte-identical to a fresh vault's, the file list included: {matchesFresh: true}
Then every file the person wrote is byte-identical: {personFilesKept: true}

Open example

A regeneration removes a note that left the graph and keeps a person's notes · spec:consumers.obsidian-vault.person-notes-survive · ready floor ready

Executable Spec

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files an earlier run wrote"}
Given the vault holds {extra: "an intent note and Obsidian settings outside the generated folder"}
Given the member {change: "leaves the corpus"}
When the vault command runs at that root
Then the run exits {exitCode: 0}
Then the member's note is present: {memberNote: false}
Then every file the person wrote is byte-identical: {personFilesKept: true}
Then every link a generated note writes resolves inside the vault: {linksResolve: true}

Open example

A note a person wrote inside the generated folder refuses the regeneration · spec:consumers.obsidian-vault.unknown-note-refused · ready floor ready

Executable Spec

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files an earlier run wrote"}
Given the vault holds {extra: "a note a person wrote inside the generated folder"}
Given the member {change: "leaves the corpus"}
When the vault command runs at that root
Then the run exits {exitCode: 1}
Then the run refuses the path {refusedPath: "sdp/specs/probe/mine.md"} as {refusal: "unknown"}
Then the member's note is present: {memberNote: true}
Then every file the person wrote is byte-identical: {personFilesKept: true}

Open example

A vault directory the build removes refuses the run and keeps a person's notes · spec:consumers.obsidian-vault.vault-in-build-path-refused · ready floor ready

Executable Spec

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given the vault command names the vault directory {out: "generated/design-review"}
Given a vault whose generated folder holds {generated: "nothing"}
Given the vault holds {extra: "an intent note and Obsidian settings outside the generated folder"}
When the vault command runs at that root
Then the run exits {exitCode: 1}
Then the run refuses the vault directory as {placement: "overlapping a path the build owns"}
Then every file the person wrote is byte-identical: {personFilesKept: true}

Open example

Example space

Given an extraction root holding a Pack and its member Specs, among them {member:string}
Given the vault command names the vault directory {out:string}
Given a vault whose generated folder holds {generated:"nothing"|"the files an earlier run wrote"|"the files a run stopped at its first rename left"|"the files a run whose extraction failed left"}
Given the vault holds {extra:"no other file"|"an intent note and Obsidian settings outside the generated folder"|"a note a person wrote inside the generated folder"|"a file a person wrote inside the generated folder under a temporary's name"|"a generated note a person changed"}
Given the member {change:"stays in the corpus"|"leaves the corpus"|"changes its title"|"has a carrier the extractor refuses"}
When the vault command runs at that root
Then the run exits {exitCode:number}
Then the run refuses the path {refusedPath:string} as {refusal:"unknown"|"changed"}
Then the run refuses the vault directory as {placement:"overlapping a path the build owns"|"inside the extraction"}
Then the index note warns that the last regeneration failed: {indexWarns:boolean}
Then every generated file matches a content the file list records for it: {listMatches:boolean}
Then the generated folder is byte-identical to a fresh vault's, the file list included: {matchesFresh:boolean}
Then a second run over the same graph leaves every generated file byte-identical: {byteIdentical:boolean}
Then the member's note is present: {memberNote:boolean}
Then every file the person wrote is byte-identical: {personFilesKept:boolean}
Then every link a generated note writes resolves inside the vault: {linksResolve:boolean}
Design
layout line 56 · specs/consumers/obsidian-vault.sdp.md:56
the generated folder sdp/ holds index.md, specs.base, specs/<family>/<note>.md, packs/<note>.md beside packs/<note>.base, code/<namespace>/<note>.md, terms/<note>.md and the file list .sdp-vault.json; <family> is the first segment of a Spec's path, <namespace> a code unit's or anchor's namespace, and <note> the note name spec:consumers.obsidian-vault.notes#design.noteName states.
fileList line 57 · specs/consumers/obsidian-vault.sdp.md:57
{ "schema": "sdp-vault/1", "files": { "<path under sdp/>": ["<sha256 hex of the file's bytes>"] } } in sdp/.sdp-vault.json, paths sorted in code-unit order, JSON with two-space indentation and a closing newline; a path lists one content after a completed run and at most two while a run is under way, the content it held first.

no citation recorded

wellFormedList line 58 · specs/consumers/obsidian-vault.sdp.md:58
a file list is well formed when it parses to the fileList shape, every path is relative to sdp/, /-separated, with no empty, . or .. segment, and names neither the file list nor a temporary, every content is 64 lowercase hex digits, every path lists one or two contents, and the file's bytes equal the serialization spec:consumers.obsidian-vault#design.fileList states of what it parses to, so a repeated or reordered path is not well formed.
temporaryName line 59 · specs/consumers/obsidian-vault.sdp.md:59
a file is written as .<name>.sdp-tmp in its own directory and renamed over <name>; a temporary a run finds is the command's own only when its bytes match a content the file list records for <name>, and the run removes it after the guard passes; the file list's own temporary is the command's own only when it is itself a well-formed file list; any other file of a temporary's name is one the list does not name.
buildOwnedPaths line 60 · specs/consumers/obsidian-vault.sdp.md:60
under the root, generated/graph.json, generated/contracts/, generated/registrars.json, generated/imports.json, generated/design-review/, generated/census/, generated/mermaid/, generated/gherkin/ and generated/spec-studio/, each with its .tmp sibling, and every path the shared build comes to write or remove.

Cited at

  • test/skills.test.ts:2037
guardMessage line 61 · specs/consumers/obsidian-vault.sdp.md:61
one stderr line per refused path, with <path> relative to the vault: sdp vault: <path> is not a file this command wrote (unknown), sdp vault: <path> has changed since this command wrote it (changed), sdp vault: <path> is a link or a special file, which this command never writes (not a file) or sdp vault: sdp/.sdp-vault.json is not a file list this command wrote (malformed); then sdp vault: nothing was written or removed; keep what you wrote outside sdp/, then delete each refused path, or delete sdp/ whole.
outsideExtractionMessage line 62 · specs/consumers/obsidian-vault.sdp.md:62
sdp vault: the vault <out> lies inside the root and would be read as source; choose a directory under generated/, under an excluded prefix, or outside the root.

no citation recorded

buildOwnedMessage line 63 · specs/consumers/obsidian-vault.sdp.md:63
sdp vault: the vault <out> overlaps <path>, which every build rewrites or removes; choose another directory, such as generated/obsidian-vault/, with <path> the first overlapping path in the order spec:consumers.obsidian-vault#design.buildOwnedPaths lists them.

no citation recorded

summaryLine line 64 · specs/consumers/obsidian-vault.sdp.md:64
on stdout after a synchronization, Wrote <out>/sdp (<n> files: <w> written, <u> unchanged, <r> removed).
exitCodes line 65 · specs/consumers/obsidian-vault.sdp.md:65
0 when the vault is synchronized over a graph with no validation error; the validation exit code when it is synchronized over one with errors; 1 on a refused option, a refused vault directory, a guard refusal, a case collision, a failed extraction or a write that fails.
indexNote line 66 · specs/consumers/obsidian-vault.sdp.md:66
sdp/index.md opens with > [!info] Generated by `sdp vault` from the graph. Every file under `sdp/` is regenerated, except a `.base` file you changed: write your own notes outside it, and intent notes in `intent/`. , then # Spec graph, the finding counts by severity, ## Findings without a note with one line per finding whose subject has no Spec or Pack note, in report order, the corpus Base embedded, and a link to each Pack note in id order.

no citation recorded

findingLine line 67 · specs/consumers/obsidian-vault.sdp.md:67
- <severity> · <validator id> · <file>:<line> · <message>, leaving out the file and line when the finding names none and the line when it names only a file, with the message escaped as spec:consumers.obsidian-vault.notes#rule.textEscaped states.

no citation recorded

failedIndex line 68 · specs/consumers/obsidian-vault.sdp.md:68
after a failed extraction, sdp/index.md opens with > [!warning] The last regeneration failed, and the notes show the graph of the last one that succeeded. followed by one line per extraction error, its root-relative file and its message.
Verification

Verifier bindings

Example space

  • member · string · declared by an extraction root holding a Pack and its member Specs, among them {member}
  • out · string · declared by the vault command names the vault directory {out}
  • generated · "nothing" | "the files an earlier run wrote" | "the files a run stopped at its first rename left" | "the files a run whose extraction failed left" · declared by a vault whose generated folder holds {generated}
  • extra · "no other file" | "an intent note and Obsidian settings outside the generated folder" | "a note a person wrote inside the generated folder" | "a file a person wrote inside the generated folder under a temporary's name" | "a generated note a person changed" · declared by the vault holds {extra}
  • change · "stays in the corpus" | "leaves the corpus" | "changes its title" | "has a carrier the extractor refuses" · declared by the member {change}

Bound points

Examplememberoutgeneratedextrachange
spec:consumers.obsidian-vault.changed-note-refused"spec:probe.member"unbound"the files an earlier run wrote""a generated note a person changed""stays in the corpus"
spec:consumers.obsidian-vault.failed-extraction-keeps-notes"spec:probe.member"unbound"the files an earlier run wrote""an intent note and Obsidian settings outside the generated folder""has a carrier the extractor refuses"
spec:consumers.obsidian-vault.failed-extraction-recovered"spec:probe.member"unbound"the files a run whose extraction failed left""an intent note and Obsidian settings outside the generated folder""stays in the corpus"
spec:consumers.obsidian-vault.fresh-vault"spec:probe.member"unbound"nothing""no other file""stays in the corpus"
spec:consumers.obsidian-vault.hidden-file-refused"spec:probe.member"unbound"the files an earlier run wrote""a file a person wrote inside the generated folder under a temporary's name""stays in the corpus"
spec:consumers.obsidian-vault.interrupted-run-recovered"spec:probe.member"unbound"the files a run stopped at its first rename left""an intent note and Obsidian settings outside the generated folder""changes its title"
spec:consumers.obsidian-vault.person-notes-survive"spec:probe.member"unbound"the files an earlier run wrote""an intent note and Obsidian settings outside the generated folder""leaves the corpus"
spec:consumers.obsidian-vault.unknown-note-refused"spec:probe.member"unbound"the files an earlier run wrote""a note a person wrote inside the generated folder""leaves the corpus"
spec:consumers.obsidian-vault.vault-in-build-path-refused"spec:probe.member""generated/design-review""nothing""an intent note and Obsidian settings outside the generated folder"unbound

Oracle binding: present · oracle:protocol.vault · test/vault-examples.test.ts:140

Coverage

member: "spec:probe.member" · spec:consumers.obsidian-vault.changed-note-refused, spec:consumers.obsidian-vault.failed-extraction-keeps-notes, spec:consumers.obsidian-vault.failed-extraction-recovered, spec:consumers.obsidian-vault.fresh-vault, spec:consumers.obsidian-vault.hidden-file-refused, spec:consumers.obsidian-vault.interrupted-run-recovered, spec:consumers.obsidian-vault.person-notes-survive, spec:consumers.obsidian-vault.unknown-note-refused, spec:consumers.obsidian-vault.vault-in-build-path-refused · not enumerable

out: "generated/design-review" · spec:consumers.obsidian-vault.vault-in-build-path-refused · not enumerable

Unbound

Design view

Requirement drawing

Requirement drawing for spec:consumers.obsidian-vault

Shown as text: this drawing exceeds the height budget of 2000 pixels after folding.

The diagram as text
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • spec:consumers.obsidian-vault.bases: A Pack's members and the standing queries are tables over the reader's values · declared Spec
  • spec:consumers.obsidian-vault.changed-note-refused: A generated note a person changed refuses the regeneration and keeps the edit · declared Spec
  • spec:consumers.obsidian-vault.failed-extraction-keeps-notes: A failed extraction keeps the notes and says so on the index · declared Spec
  • spec:consumers.obsidian-vault.failed-extraction-recovered: The run after a failed extraction passes the guard and restores the index · declared Spec
  • spec:consumers.obsidian-vault.fresh-vault: A fresh vault is written the same way twice and every link resolves · declared Spec
  • spec:consumers.obsidian-vault.hidden-file-refused: A person's file under a temporary's name refuses the regeneration · declared Spec
  • spec:consumers.obsidian-vault.interrupted-run-recovered: A run after a stopped synchronization finishes it · declared Spec
  • spec:consumers.obsidian-vault.iteration: A design pass is followed and answered from the vault · declared Spec
  • spec:consumers.obsidian-vault.notes: Every Spec, Pack, code unit and keyed term is a note, and every relation is a link · declared Spec
  • spec:consumers.obsidian-vault.person-notes-survive: A regeneration removes a note that left the graph and keeps a person's notes · declared Spec
  • spec:consumers.obsidian-vault.unknown-note-refused: A note a person wrote inside the generated folder refuses the regeneration · declared Spec
  • spec:consumers.obsidian-vault.vault-in-build-path-refused: A vault directory the build removes refuses the run and keeps a person's notes · declared Spec
  • spec:decisions.vault-owned-folder: The vault's generator owns one folder and synchronizes it · declared Spec
  • spec:consumers.obsidian-vault.bases.views-match-sources: Each standing view selects what its source selects · declared Spec
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes: A carrier edit under watch rewrites only the notes it changes · declared Spec
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor: An anchor added in a source file under watch rewrites the Spec's note · declared Spec
  • spec:consumers.obsidian-vault.notes.case-collision-refused: Two Specs whose notes differ only in case refuse the run · declared Spec
  • spec:consumers.obsidian-vault.notes.entry-address-link: An entry address in prose opens the entry's block in its Spec's note · declared Spec
  • spec:consumers.obsidian-vault.notes.term-address-link: A keyed Model term gets a note, and its address in prose opens the term's block · declared Spec
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays: A mention of an entry that does not exist stays as written · declared Spec
  • spec:consumers.projections-model: Projections fan out from one graph without becoming truth stores · declared Spec
  • impl:protocol.vault-bases: serializes standing query predicates over reader properties as Obsidian Bases · anchored code · src/projections/vault/bases.ts:43
  • impl:protocol.vault-command: validates after vault preflight and retains prior notes behind a failed-extraction index · anchored code · src/cli/vault-command.ts:191
  • impl:protocol.vault-notes: renders reader contexts, declared relations and keyed terms as linked notes · anchored code · src/projections/vault/notes.ts:45
  • impl:protocol.vault-sections: renders sections in graph order with keyed entry block ids · anchored code · src/projections/vault/sections.ts:10
  • impl:protocol.vault-sync: guards every owned entry and records transitional hashes before atomic file replacement · anchored code · src/projections/vault/sync.ts:98
  • impl:protocol.vault-text: renders checked mentions and escapes Obsidian syntax outside code spans · anchored code · src/projections/vault/text.ts:30
  • impl:protocol.vault-watch: reuses the coalescing watcher with source suffixes and a synchronous vault cycle · anchored code · src/cli/vault-command.ts:219
  • oracle:protocol.vault: oracle:protocol.vault · anchored oracle binding · test/vault-examples.test.ts:140
  • oracle:protocol.vault-bases: oracle:protocol.vault-bases · anchored oracle binding · test/vault-examples.test.ts:405
  • oracle:protocol.vault-iteration: oracle:protocol.vault-iteration · anchored oracle binding · test/vault-examples.test.ts:549
  • oracle:protocol.vault-notes: oracle:protocol.vault-notes · anchored oracle binding · test/vault-examples.test.ts:291
  • test:protocol.consumers.obsidian-vault.bases.views-match-sources: test:protocol.consumers.obsidian-vault.bases.views-match-sources · anchored test binding · binding present · test/vault-examples.test.ts:747
  • test:protocol.consumers.obsidian-vault.changed-note-refused: test:protocol.consumers.obsidian-vault.changed-note-refused · anchored test binding · binding present · test/vault-examples.test.ts:674
  • test:protocol.consumers.obsidian-vault.failed-extraction-keeps-notes: test:protocol.consumers.obsidian-vault.failed-extraction-keeps-notes · anchored test binding · binding present · test/vault-examples.test.ts:702
  • test:protocol.consumers.obsidian-vault.failed-extraction-recovered: test:protocol.consumers.obsidian-vault.failed-extraction-recovered · anchored test binding · binding present · test/vault-examples.test.ts:712
  • test:protocol.consumers.obsidian-vault.fresh-vault: test:protocol.consumers.obsidian-vault.fresh-vault · anchored test binding · binding present · test/vault-examples.test.ts:653
  • test:protocol.consumers.obsidian-vault.hidden-file-refused: test:protocol.consumers.obsidian-vault.hidden-file-refused · anchored test binding · binding present · test/vault-examples.test.ts:681
  • test:protocol.consumers.obsidian-vault.interrupted-run-recovered: test:protocol.consumers.obsidian-vault.interrupted-run-recovered · anchored test binding · binding present · test/vault-examples.test.ts:695
  • test:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes: test:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · anchored test binding · binding present · test/vault-examples.test.ts:754
  • test:protocol.consumers.obsidian-vault.iteration.watch-source-anchor: test:protocol.consumers.obsidian-vault.iteration.watch-source-anchor · anchored test binding · binding present · test/vault-examples.test.ts:761
  • test:protocol.consumers.obsidian-vault.notes.case-collision-refused: test:protocol.consumers.obsidian-vault.notes.case-collision-refused · anchored test binding · binding present · test/vault-examples.test.ts:740
  • test:protocol.consumers.obsidian-vault.notes.entry-address-link: test:protocol.consumers.obsidian-vault.notes.entry-address-link · anchored test binding · binding present · test/vault-examples.test.ts:719
  • test:protocol.consumers.obsidian-vault.notes.term-address-link: test:protocol.consumers.obsidian-vault.notes.term-address-link · anchored test binding · binding present · test/vault-examples.test.ts:733
  • test:protocol.consumers.obsidian-vault.notes.unresolved-mention-stays: test:protocol.consumers.obsidian-vault.notes.unresolved-mention-stays · anchored test binding · binding present · test/vault-examples.test.ts:726
  • test:protocol.consumers.obsidian-vault.person-notes-survive: test:protocol.consumers.obsidian-vault.person-notes-survive · anchored test binding · binding present · test/vault-examples.test.ts:660
  • test:protocol.consumers.obsidian-vault.unknown-note-refused: test:protocol.consumers.obsidian-vault.unknown-note-refused · anchored test binding · binding present · test/vault-examples.test.ts:667
  • test:protocol.consumers.obsidian-vault.vault-in-build-path-refused: test:protocol.consumers.obsidian-vault.vault-in-build-path-refused · anchored test binding · binding present · test/vault-examples.test.ts:688
  • test:protocol.vault-priority: test:protocol.vault-priority · anchored test binding · binding present · test/vault.test.ts:53
  • spec:consumers.obsidian-vault refines spec:consumers.projections-model · declared — a projection for a person who iterates on designs in a notes app
  • spec:consumers.obsidian-vault.bases refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.bases.views-match-sources refines spec:consumers.obsidian-vault.bases · declared
  • spec:consumers.obsidian-vault.bases.views-match-sources verifies spec:consumers.obsidian-vault.bases · declared
  • spec:consumers.obsidian-vault.changed-note-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.changed-note-refused verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.failed-extraction-keeps-notes refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.failed-extraction-keeps-notes verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.failed-extraction-recovered refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.failed-extraction-recovered verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.fresh-vault refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.fresh-vault verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.hidden-file-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.hidden-file-refused verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.interrupted-run-recovered refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.interrupted-run-recovered verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.iteration refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes refines spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes verifies spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor refines spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor verifies spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.notes refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.notes.case-collision-refused refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.case-collision-refused verifies spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.entry-address-link refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.entry-address-link verifies spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.term-address-link refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.term-address-link verifies spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays verifies spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.person-notes-survive refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.person-notes-survive verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.unknown-note-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.unknown-note-refused verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.vault-in-build-path-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.vault-in-build-path-refused verifies spec:consumers.obsidian-vault · declared
  • spec:decisions.vault-owned-folder refines spec:consumers.obsidian-vault · declared — settles which files the vault's generator owns and how it regenerates them
  • impl:protocol.vault-bases satisfies spec:consumers.obsidian-vault.bases · anchored
  • impl:protocol.vault-command satisfies spec:consumers.obsidian-vault · anchored
  • impl:protocol.vault-command references spec:decisions.vault-owned-folder · anchored
  • impl:protocol.vault-notes satisfies spec:consumers.obsidian-vault.notes · anchored
  • impl:protocol.vault-notes satisfies spec:consumers.obsidian-vault · anchored
  • impl:protocol.vault-notes satisfies spec:consumers.obsidian-vault.bases · anchored
  • impl:protocol.vault-sections satisfies spec:consumers.obsidian-vault.notes · anchored
  • impl:protocol.vault-sync satisfies spec:consumers.obsidian-vault · anchored
  • impl:protocol.vault-sync satisfies spec:consumers.obsidian-vault.iteration · anchored
  • impl:protocol.vault-sync references spec:decisions.vault-owned-folder · anchored
  • impl:protocol.vault-text satisfies spec:consumers.obsidian-vault.notes · anchored
  • impl:protocol.vault-text satisfies spec:consumers.obsidian-vault.iteration · anchored
  • impl:protocol.vault-watch satisfies spec:consumers.obsidian-vault.iteration · anchored
  • oracle:protocol.vault models spec:consumers.obsidian-vault · anchored
  • oracle:protocol.vault-bases models spec:consumers.obsidian-vault.bases · anchored
  • oracle:protocol.vault-iteration models spec:consumers.obsidian-vault.iteration · anchored
  • oracle:protocol.vault-notes models spec:consumers.obsidian-vault.notes · anchored
  • test:protocol.consumers.obsidian-vault.bases.views-match-sources verifies spec:consumers.obsidian-vault.bases.views-match-sources · anchored
  • test:protocol.consumers.obsidian-vault.changed-note-refused verifies spec:consumers.obsidian-vault.changed-note-refused · anchored
  • test:protocol.consumers.obsidian-vault.failed-extraction-keeps-notes verifies spec:consumers.obsidian-vault.failed-extraction-keeps-notes · anchored
  • test:protocol.consumers.obsidian-vault.failed-extraction-recovered verifies spec:consumers.obsidian-vault.failed-extraction-recovered · anchored
  • test:protocol.consumers.obsidian-vault.fresh-vault verifies spec:consumers.obsidian-vault.fresh-vault · anchored
  • test:protocol.consumers.obsidian-vault.hidden-file-refused verifies spec:consumers.obsidian-vault.hidden-file-refused · anchored
  • test:protocol.consumers.obsidian-vault.interrupted-run-recovered verifies spec:consumers.obsidian-vault.interrupted-run-recovered · anchored
  • test:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes verifies spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · anchored
  • test:protocol.consumers.obsidian-vault.iteration.watch-source-anchor verifies spec:consumers.obsidian-vault.iteration.watch-source-anchor · anchored
  • test:protocol.consumers.obsidian-vault.notes.case-collision-refused verifies spec:consumers.obsidian-vault.notes.case-collision-refused · anchored
  • test:protocol.consumers.obsidian-vault.notes.entry-address-link verifies spec:consumers.obsidian-vault.notes.entry-address-link · anchored
  • test:protocol.consumers.obsidian-vault.notes.term-address-link verifies spec:consumers.obsidian-vault.notes.term-address-link · anchored
  • test:protocol.consumers.obsidian-vault.notes.unresolved-mention-stays verifies spec:consumers.obsidian-vault.notes.unresolved-mention-stays · anchored
  • test:protocol.consumers.obsidian-vault.person-notes-survive verifies spec:consumers.obsidian-vault.person-notes-survive · anchored
  • test:protocol.consumers.obsidian-vault.unknown-note-refused verifies spec:consumers.obsidian-vault.unknown-note-refused · anchored
  • test:protocol.consumers.obsidian-vault.vault-in-build-path-refused verifies spec:consumers.obsidian-vault.vault-in-build-path-refused · anchored
  • test:protocol.vault-priority verifies spec:consumers.obsidian-vault.notes · anchored

Decisions

  • spec:decisions.shipped-projections-frozen

    Re-specifying the shipped Design Review, census, Mermaid, or Gherkin projection is refused. These four projections are the ruled read surfaces over the one graph. A later decision Spec that supersedes this one replaces the ruling whole; a decision Spec that refines this one narrows it for one projection or one rendering and leaves the rest frozen. Either passes the ADR three-part test.

  • The vault's generator owns one folder and synchronizes it

    The vault's generator owns one folder of the vault, sdp/, and keeps there a file list naming every file it wrote with a hash of its content. A .DS_Store file under sdp/ is ignored. A listed .base file a person changed is kept, even when it leaves the generated set, with its recorded content unchanged in the list; the run warns with its path and the words delete it to regenerate and goes on. For every other file, a run refuses, writing and removing nothing, while that folder holds a file the list does not name or one whose content the list does not record. Otherwise it synchronizes the folder: it writes the files whose content changed, leaves the others untouched, and removes the files it wrote that the graph no longer holds. The vault is not one of the projection roots the shared build rewrites: no build removes it, a vault directory where the build writes or removes is refused, and only the vault's synchronization writes it, whether sdp vault or the verb that writes every projection root runs it.

Runtime
  • component:protocol.cli · entry points, shared build and publication · src/cli/build-command.ts:32 · layer edge · context protocol

    Uses

    • component:protocol.adapters · external runtime and source adapters · src/adapters/vitest.ts:23 · layer adapter · context protocol
    • component:protocol.codegen · contracts and registrar output · src/codegen/contracts.ts:633 · layer application · context protocol
    • 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.import · canonical conversion with a fidelity boundary · src/import/import.ts:45 · layer application · context protocol
    • component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol
    • component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · 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
  • 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.vault-command · validates after vault preflight and retains prior notes behind a failed-extraction index · src/cli/vault-command.ts:191

    Component: component:protocol.cli · entry points, shared build and publication · src/cli/build-command.ts:32 · layer edge · context protocol

    Uses

    • component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol
  • impl:protocol.vault-notes · renders reader contexts, declared relations and keyed terms as linked notes · src/projections/vault/notes.ts:45

    Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

    • impl:protocol.reader · typed graph queries, entry adapters and context joins · src/reader/reader.ts:687
  • impl:protocol.vault-sync · guards every owned entry and records transitional hashes before atomic file replacement · src/projections/vault/sync.ts:98

    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.obsidian-vault

Shown as text: this drawing exceeds the height budget of 2000 pixels after folding.

The diagram as text
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.bases: A Pack's members and the standing queries are tables over the reader's values
  • spec:consumers.obsidian-vault.changed-note-refused: A generated note a person changed refuses the regeneration and keeps the edit
  • spec:consumers.obsidian-vault.failed-extraction-keeps-notes: A failed extraction keeps the notes and says so on the index
  • spec:consumers.obsidian-vault.failed-extraction-recovered: The run after a failed extraction passes the guard and restores the index
  • spec:consumers.obsidian-vault.fresh-vault: A fresh vault is written the same way twice and every link resolves
  • spec:consumers.obsidian-vault.hidden-file-refused: A person's file under a temporary's name refuses the regeneration
  • spec:consumers.obsidian-vault.interrupted-run-recovered: A run after a stopped synchronization finishes it
  • spec:consumers.obsidian-vault.iteration: A design pass is followed and answered from the vault
  • spec:consumers.obsidian-vault.notes: Every Spec, Pack, code unit and keyed term is a note, and every relation is a link
  • spec:consumers.obsidian-vault.person-notes-survive: A regeneration removes a note that left the graph and keeps a person's notes
  • spec:consumers.obsidian-vault.unknown-note-refused: A note a person wrote inside the generated folder refuses the regeneration
  • spec:consumers.obsidian-vault.vault-in-build-path-refused: A vault directory the build removes refuses the run and keeps a person's notes
  • spec:consumers.projections-model: Projections fan out from one graph without becoming truth stores
  • spec:consumers.reader: The reader bridges agent entry points to composable graph context
  • spec:consumers.vault-on-ramp: The vault skill teaches agents to keep an Obsidian vault of the graph
  • spec:consumers.wholesale-view-rewrite: Every view run rewrites the view wholesale
  • spec:decisions.shipped-projections-frozen: The shipped projections stay frozen
  • spec:decisions.vault-owned-folder: The vault's generator owns one folder and synchronizes it
  • spec:extraction.determinism: Committed source derives byte-identical output
  • spec:consumers.obsidian-vault constrainedBy spec:extraction.determinism · declared
  • spec:consumers.obsidian-vault decidedBy spec:decisions.shipped-projections-frozen · declared — the vault is a new root, since the four shipped projections stay frozen
  • spec:consumers.obsidian-vault decidedBy spec:decisions.vault-owned-folder · declared — the generator owns one folder of the vault and synchronizes it instead of rewriting a root
  • spec:consumers.obsidian-vault dependsOn spec:consumers.reader · declared — the generator reads the graph through the reader's joined values
  • spec:consumers.obsidian-vault dependsOn spec:consumers.wholesale-view-rewrite · declared — the shared build's invalidation removes the five projection roots and never the vault
  • spec:consumers.obsidian-vault refines spec:consumers.projections-model · declared — a projection for a person who iterates on designs in a notes app
  • spec:consumers.vault-on-ramp dependsOn spec:consumers.obsidian-vault · declared — the skill teaches the verb, where the vault may lie and the guard's refusals
  • spec:consumers.obsidian-vault.bases refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.changed-note-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.failed-extraction-keeps-notes refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.failed-extraction-recovered refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.fresh-vault refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.hidden-file-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.interrupted-run-recovered refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.iteration refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.notes refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.person-notes-survive refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.unknown-note-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.vault-in-build-path-refused refines spec:consumers.obsidian-vault · declared
  • spec:decisions.vault-owned-folder refines spec:consumers.obsidian-vault · declared — settles which files the vault's generator owns and how it regenerates them
  • spec:consumers.obsidian-vault.changed-note-refused verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.failed-extraction-keeps-notes verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.failed-extraction-recovered verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.fresh-vault verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.hidden-file-refused verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.interrupted-run-recovered verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.person-notes-survive verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.unknown-note-refused verifies spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.vault-in-build-path-refused verifies spec:consumers.obsidian-vault · declared

Rests on

  • refines · spec:consumers.projections-model · stated ready, floor ready
  • dependsOn · spec:consumers.reader · stated ready, floor ready
  • dependsOn · spec:consumers.wholesale-view-rewrite · stated ready, floor ready
  • constrainedBy · spec:extraction.determinism · stated ready, floor ready
  • decidedBy · spec:decisions.shipped-projections-frozen · stated ready, floor ready
  • decidedBy · spec:decisions.vault-owned-folder · stated ready, floor ready

Rested on by

Distance 1

Distance 2

Relations

Relation and directionOther endClaimReasonExercised keys
constrainedBy · outgoingspec:extraction.determinism
spec:extraction.determinism · resolves
declaredNoneNone
decidedBy · outgoingspec:decisions.shipped-projections-frozen
spec:decisions.shipped-projections-frozen · resolves
declaredthe vault is a new root, since the four shipped projections stay frozenNone
decidedBy · outgoingThe vault's generator owns one folder and synchronizes it
spec:decisions.vault-owned-folder · resolves
declaredthe generator owns one folder of the vault and synchronizes it instead of rewriting a rootNone
dependsOn · outgoingspec:consumers.reader
spec:consumers.reader · resolves
declaredthe generator reads the graph through the reader's joined valuesNone
dependsOn · outgoingspec:consumers.wholesale-view-rewrite
spec:consumers.wholesale-view-rewrite · resolves
declaredthe shared build's invalidation removes the five projection roots and never the vaultNone
refines · outgoingspec:consumers.projections-model
spec:consumers.projections-model · resolves
declareda projection for a person who iterates on designs in a notes appNone
dependsOn · incomingThe vault skill teaches agents to keep an Obsidian vault of the graph
spec:consumers.vault-on-ramp · resolves
declaredthe skill teaches the verb, where the vault may lie and the guard's refusalsNone
refines · incomingA Pack's members and the standing queries are tables over the reader's values
spec:consumers.obsidian-vault.bases · resolves
declaredNoneNone
refines · incomingA generated note a person changed refuses the regeneration and keeps the edit
spec:consumers.obsidian-vault.changed-note-refused · resolves
declaredNoneNone
refines · incomingA failed extraction keeps the notes and says so on the index
spec:consumers.obsidian-vault.failed-extraction-keeps-notes · resolves
declaredNoneNone
refines · incomingThe run after a failed extraction passes the guard and restores the index
spec:consumers.obsidian-vault.failed-extraction-recovered · resolves
declaredNoneNone
refines · incomingA fresh vault is written the same way twice and every link resolves
spec:consumers.obsidian-vault.fresh-vault · resolves
declaredNoneNone
refines · incomingA person's file under a temporary's name refuses the regeneration
spec:consumers.obsidian-vault.hidden-file-refused · resolves
declaredNoneNone
refines · incomingA run after a stopped synchronization finishes it
spec:consumers.obsidian-vault.interrupted-run-recovered · resolves
declaredNoneNone
refines · incomingA design pass is followed and answered from the vault
spec:consumers.obsidian-vault.iteration · resolves
declaredNoneNone
refines · incomingEvery Spec, Pack, code unit and keyed term is a note, and every relation is a link
spec:consumers.obsidian-vault.notes · resolves
declaredNoneNone
refines · incomingA regeneration removes a note that left the graph and keeps a person's notes
spec:consumers.obsidian-vault.person-notes-survive · resolves
declaredNoneNone
refines · incomingA note a person wrote inside the generated folder refuses the regeneration
spec:consumers.obsidian-vault.unknown-note-refused · resolves
declaredNoneNone
refines · incomingA vault directory the build removes refuses the run and keeps a person's notes
spec:consumers.obsidian-vault.vault-in-build-path-refused · resolves
declaredNoneNone
refines · incomingThe vault's generator owns one folder and synchronizes it
spec:decisions.vault-owned-folder · resolves
declaredsettles which files the vault's generator owns and how it regenerates themNone
verifies · incomingA generated note a person changed refuses the regeneration and keeps the edit
spec:consumers.obsidian-vault.changed-note-refused · resolves
declaredNoneguard
verifies · incomingA failed extraction keeps the notes and says so on the index
spec:consumers.obsidian-vault.failed-extraction-keeps-notes · resolves
declaredNonefailedExtraction
verifies · incomingThe run after a failed extraction passes the guard and restores the index
spec:consumers.obsidian-vault.failed-extraction-recovered · resolves
declaredNonefailedExtraction, guard
verifies · incomingA fresh vault is written the same way twice and every link resolves
spec:consumers.obsidian-vault.fresh-vault · resolves
declaredNoneverb, ownedFolder, deterministic, linksResolve
verifies · incomingA person's file under a temporary's name refuses the regeneration
spec:consumers.obsidian-vault.hidden-file-refused · resolves
declaredNoneguard
verifies · incomingA run after a stopped synchronization finishes it
spec:consumers.obsidian-vault.interrupted-run-recovered · resolves
declaredNoneinterruptedRun, synchronize
verifies · incomingA regeneration removes a note that left the graph and keeps a person's notes
spec:consumers.obsidian-vault.person-notes-survive · resolves
declaredNoneownedFolder, synchronize
verifies · incomingA note a person wrote inside the generated folder refuses the regeneration
spec:consumers.obsidian-vault.unknown-note-refused · resolves
declaredNoneguard
verifies · incomingA vault directory the build removes refuses the run and keeps a person's notes
spec:consumers.obsidian-vault.vault-in-build-path-refused · resolves
declaredNoneapartFromBuild, ownedFolder

Bindings

Implementation binding: present

  • impl:protocol.vault-command · validates after vault preflight and retains prior notes behind a failed-extraction index · src/cli/vault-command.ts:191 · role publisher · component component:protocol.cli · layer edge · context protocol
  • impl:protocol.vault-notes · renders reader contexts, declared relations and keyed terms as linked notes · src/projections/vault/notes.ts:45 · role projection · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.vault-sync · guards every owned entry and records transitional hashes before atomic file replacement · src/projections/vault/sync.ts:98 · role publisher · component component:protocol.projections · layer edge · context protocol

Design reference: none

Verifier binding: present

Expected-outcome oracle: present

  • oracle:protocol.vault · test/vault-examples.test.ts:140

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

2. The vault's generator owns one folder and synchronizes it

spec:decisions.vault-owned-folder

The vault's generator owns one folder and synchronizes it

spec:decisions.vault-owned-folderDecision Record · featureready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/decisions/vault-owned-folder.sdp.md

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

Intent
outcome
Regenerate the vault from the one graph as often as a design pass needs without ever removing or rewriting a note a person wrote in it.
Decision
context
Every projection root is rewritten wholesale, and every command that enters the shared build removes all of them first, because an absent view is honest and a stale one is not. A vault is different: a person keeps it open in Obsidian, keeps Obsidian's settings in it, and writes intent notes beside the generated ones.
decision
The vault's generator owns one folder of the vault, sdp/, and keeps there a file list naming every file it wrote with a hash of its content. A .DS_Store file under sdp/ is ignored. A listed .base file a person changed is kept, even when it leaves the generated set, with its recorded content unchanged in the list; the run warns with its path and the words delete it to regenerate and goes on. For every other file, a run refuses, writing and removing nothing, while that folder holds a file the list does not name or one whose content the list does not record. Otherwise it synchronizes the folder: it writes the files whose content changed, leaves the others untouched, and removes the files it wrote that the graph no longer holds. The vault is not one of the projection roots the shared build rewrites: no build removes it, a vault directory where the build writes or removes is refused, and only the vault's synchronization writes it, whether sdp vault or the verb that writes every projection root runs it.
rationale
  • A wholesale rewrite removes whatever a person put in the root, and a regeneration that removes or rewrites a note a person wrote is refused.
  • Writing only the files that changed keeps every other note's bytes and modification time, so Obsidian keeps a person's place while a pass runs; a wholesale rename shows Obsidian every note removed and created again.
  • A list of written contents tells the generator's files from a person's without marking any note, and it is a function of the graph like the notes it lists, so the vault keeps its determinism.
alternatives
  • Rewrite the folder wholesale through a temporary sibling, as the five roots are rewritten; refused, because it moves a reader off their place and removes any note a person left in the folder.
  • Overwrite a generated note a person changed and report it afterwards; refused, because the overwrite loses what the person wrote.
  • Mark each generated note with a hash in its own properties; refused, because a person's copy of a generated note carries a valid mark and would be removed as stale, and the mark shows on every note.
  • Make the vault a sixth projection root; refused, because the shared build's invalidation would remove a person's intent notes with it.
consequences
  • While a run is under way the folder may hold notes of two generations, each note whole, and the file list lets the next run recognize what an interrupted run left.
  • A run whose extraction fails keeps the last notes and says so on the index note, so a broken carrier never empties the vault a person is reading.
  • The vault's determinism is checked by tests, since the repository's projection suite certifies the five projection roots only.
Verification

Verifier bindings

No verifier binding recorded.

Design view

Requirement drawing

  • Declared verifying examples: no declared verifying example.
  • Test or oracle bindings: no recorded binding.
Requirement drawing for spec:decisions.vault-owned-folder
The diagram as text
  • spec:decisions.vault-owned-folder: The vault's generator owns one folder and synchronizes it · declared Spec
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • impl:protocol.vault-command: validates after vault preflight and retains prior notes behind a failed-extraction index · anchored code · src/cli/vault-command.ts:191
  • impl:protocol.vault-sync: guards every owned entry and records transitional hashes before atomic file replacement · anchored code · src/projections/vault/sync.ts:98
  • spec:decisions.vault-owned-folder refines spec:consumers.obsidian-vault · declared — settles which files the vault's generator owns and how it regenerates them
  • impl:protocol.vault-command references spec:decisions.vault-owned-folder · anchored
  • impl:protocol.vault-sync references spec:decisions.vault-owned-folder · anchored
Mermaid source

Copyable source; the Studio draws static SVG.

Preferred syntax: requirementDiagram. Chosen syntax: flowchart TB because references require exact labels unavailable in requirement syntax.

Decisions

No decision record named.

Runtime

No implementation neighborhood recorded.

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:decisions.vault-owned-folder
The diagram as text
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.vault-on-ramp: The vault skill teaches agents to keep an Obsidian vault of the graph
  • spec:decisions.vault-owned-folder: The vault's generator owns one folder and synchronizes it
  • spec:decisions.vault-owned-folder refines spec:consumers.obsidian-vault · declared — settles which files the vault's generator owns and how it regenerates them
  • spec:consumers.obsidian-vault decidedBy spec:decisions.vault-owned-folder · declared — the generator owns one folder of the vault and synchronizes it instead of rewriting a root
  • spec:consumers.vault-on-ramp decidedBy spec:decisions.vault-owned-folder · declared — the skill keeps a person's notes outside the one folder the command owns
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
refines · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredsettles which files the vault's generator owns and how it regenerates themNone
decidedBy · incomingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredthe generator owns one folder of the vault and synchronizes it instead of rewriting a rootNone
decidedBy · incomingThe vault skill teaches agents to keep an Obsidian vault of the graph
spec:consumers.vault-on-ramp · resolves
declaredthe skill keeps a person's notes outside the one folder the command ownsNone

Bindings

Implementation binding: none

Design reference: present

  • impl:protocol.vault-command · validates after vault preflight and retains prior notes behind a failed-extraction index · src/cli/vault-command.ts:191 · role publisher · component component:protocol.cli · layer edge · context protocol
  • impl:protocol.vault-sync · guards every owned entry and records transitional hashes before atomic file replacement · src/projections/vault/sync.ts:98 · role publisher · component component:protocol.projections · layer edge · context protocol

Verifier binding: none

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

3. A fresh vault is written the same way twice and every link resolves

spec:consumers.obsidian-vault.fresh-vault

A fresh vault is written the same way twice and every link resolves

spec:consumers.obsidian-vault.fresh-vaultExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.fresh-vault.sdp.md

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

Intent
outcome
Execute the verb, the generated folder, determinism and link resolution on a vault the command writes for the first time.
Behavior

Examples

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "nothing"}
Given the vault holds {extra: "no other file"}
Given the member {change: "stays in the corpus"}
When the vault command runs at that root
Then the run exits {exitCode: 0}
Then a second run over the same graph leaves every generated file byte-identical: {byteIdentical: true}
Then the member's note is present: {memberNote: true}
Then every link a generated note writes resolves inside the vault: {linksResolve: true}
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.fresh-vault · anchored · test anchor binding present · test/vault-examples.test.ts:653
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.fresh-vault
The diagram as text
  • spec:consumers.obsidian-vault.fresh-vault: A fresh vault is written the same way twice and every link resolves · declared Spec
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • test:protocol.consumers.obsidian-vault.fresh-vault: test:protocol.consumers.obsidian-vault.fresh-vault · anchored test binding · binding present · test/vault-examples.test.ts:653
  • spec:consumers.obsidian-vault.fresh-vault refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.fresh-vault verifies spec:consumers.obsidian-vault · declared
  • test:protocol.consumers.obsidian-vault.fresh-vault verifies spec:consumers.obsidian-vault.fresh-vault · 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

No implementation neighborhood recorded.

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.obsidian-vault.fresh-vault
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.fresh-vault: A fresh vault is written the same way twice and every link resolves
  • spec:consumers.obsidian-vault.fresh-vault refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.fresh-vault verifies spec:consumers.obsidian-vault · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneNone
verifies · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneverb, ownedFolder, deterministic, linksResolve

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.fresh-vault · anchored · test/vault-examples.test.ts:653 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

4. A regeneration removes a note that left the graph and keeps a person's notes

spec:consumers.obsidian-vault.person-notes-survive

A regeneration removes a note that left the graph and keeps a person's notes

spec:consumers.obsidian-vault.person-notes-surviveExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.person-notes-survive.sdp.md

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

Intent
outcome
Execute synchronization on a vault holding a person's intent note and Obsidian's settings while a Spec leaves the corpus.
Behavior

Examples

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files an earlier run wrote"}
Given the vault holds {extra: "an intent note and Obsidian settings outside the generated folder"}
Given the member {change: "leaves the corpus"}
When the vault command runs at that root
Then the run exits {exitCode: 0}
Then the member's note is present: {memberNote: false}
Then every file the person wrote is byte-identical: {personFilesKept: true}
Then every link a generated note writes resolves inside the vault: {linksResolve: true}
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.person-notes-survive · anchored · test anchor binding present · test/vault-examples.test.ts:660
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.person-notes-survive
The diagram as text
  • spec:consumers.obsidian-vault.person-notes-survive: A regeneration removes a note that left the graph and keeps a person's notes · declared Spec
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • test:protocol.consumers.obsidian-vault.person-notes-survive: test:protocol.consumers.obsidian-vault.person-notes-survive · anchored test binding · binding present · test/vault-examples.test.ts:660
  • spec:consumers.obsidian-vault.person-notes-survive refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.person-notes-survive verifies spec:consumers.obsidian-vault · declared
  • test:protocol.consumers.obsidian-vault.person-notes-survive verifies spec:consumers.obsidian-vault.person-notes-survive · 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

No implementation neighborhood recorded.

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.obsidian-vault.person-notes-survive
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.person-notes-survive: A regeneration removes a note that left the graph and keeps a person's notes
  • spec:consumers.obsidian-vault.person-notes-survive refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.person-notes-survive verifies spec:consumers.obsidian-vault · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneNone
verifies · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneownedFolder, synchronize

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.person-notes-survive · anchored · test/vault-examples.test.ts:660 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

5. A note a person wrote inside the generated folder refuses the regeneration

spec:consumers.obsidian-vault.unknown-note-refused

A note a person wrote inside the generated folder refuses the regeneration

spec:consumers.obsidian-vault.unknown-note-refusedExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.unknown-note-refused.sdp.md

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

Intent
outcome
Execute the guard on a file the command never wrote, left inside its generated folder.
Behavior

Examples

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files an earlier run wrote"}
Given the vault holds {extra: "a note a person wrote inside the generated folder"}
Given the member {change: "leaves the corpus"}
When the vault command runs at that root
Then the run exits {exitCode: 1}
Then the run refuses the path {refusedPath: "sdp/specs/probe/mine.md"} as {refusal: "unknown"}
Then the member's note is present: {memberNote: true}
Then every file the person wrote is byte-identical: {personFilesKept: true}
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.unknown-note-refused · anchored · test anchor binding present · test/vault-examples.test.ts:667
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.unknown-note-refused
The diagram as text
  • spec:consumers.obsidian-vault.unknown-note-refused: A note a person wrote inside the generated folder refuses the regeneration · declared Spec
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • test:protocol.consumers.obsidian-vault.unknown-note-refused: test:protocol.consumers.obsidian-vault.unknown-note-refused · anchored test binding · binding present · test/vault-examples.test.ts:667
  • spec:consumers.obsidian-vault.unknown-note-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.unknown-note-refused verifies spec:consumers.obsidian-vault · declared
  • test:protocol.consumers.obsidian-vault.unknown-note-refused verifies spec:consumers.obsidian-vault.unknown-note-refused · 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

No implementation neighborhood recorded.

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.obsidian-vault.unknown-note-refused
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.unknown-note-refused: A note a person wrote inside the generated folder refuses the regeneration
  • spec:consumers.obsidian-vault.unknown-note-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.unknown-note-refused verifies spec:consumers.obsidian-vault · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneNone
verifies · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneguard

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.unknown-note-refused · anchored · test/vault-examples.test.ts:667 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

6. A generated note a person changed refuses the regeneration and keeps the edit

spec:consumers.obsidian-vault.changed-note-refused

A generated note a person changed refuses the regeneration and keeps the edit

spec:consumers.obsidian-vault.changed-note-refusedExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.changed-note-refused.sdp.md

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

Intent
outcome
Execute the guard on a generated note whose bytes a person changed after the command wrote it.
Behavior

Examples

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files an earlier run wrote"}
Given the vault holds {extra: "a generated note a person changed"}
Given the member {change: "stays in the corpus"}
When the vault command runs at that root
Then the run exits {exitCode: 1}
Then the run refuses the path {refusedPath: "sdp/specs/probe/spec.probe.member.md"} as {refusal: "changed"}
Then every file the person wrote is byte-identical: {personFilesKept: true}
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.changed-note-refused · anchored · test anchor binding present · test/vault-examples.test.ts:674
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.changed-note-refused
The diagram as text
  • spec:consumers.obsidian-vault.changed-note-refused: A generated note a person changed refuses the regeneration and keeps the edit · declared Spec
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • test:protocol.consumers.obsidian-vault.changed-note-refused: test:protocol.consumers.obsidian-vault.changed-note-refused · anchored test binding · binding present · test/vault-examples.test.ts:674
  • spec:consumers.obsidian-vault.changed-note-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.changed-note-refused verifies spec:consumers.obsidian-vault · declared
  • test:protocol.consumers.obsidian-vault.changed-note-refused verifies spec:consumers.obsidian-vault.changed-note-refused · 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

No implementation neighborhood recorded.

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.obsidian-vault.changed-note-refused
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.changed-note-refused: A generated note a person changed refuses the regeneration and keeps the edit
  • spec:consumers.obsidian-vault.changed-note-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.changed-note-refused verifies spec:consumers.obsidian-vault · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneNone
verifies · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneguard

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.changed-note-refused · anchored · test/vault-examples.test.ts:674 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

7. A person's file under a temporary's name refuses the regeneration

spec:consumers.obsidian-vault.hidden-file-refused

A person's file under a temporary's name refuses the regeneration

spec:consumers.obsidian-vault.hidden-file-refusedExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.hidden-file-refused.sdp.md

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

Intent
outcome
Execute the guard on a file whose name begins with a dot and reads as a temporary of a generated note, but whose bytes the file list does not record.
Behavior

Examples

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files an earlier run wrote"}
Given the vault holds {extra: "a file a person wrote inside the generated folder under a temporary's name"}
Given the member {change: "stays in the corpus"}
When the vault command runs at that root
Then the run exits {exitCode: 1}
Then the run refuses the path {refusedPath: "sdp/specs/probe/.spec.probe.member.md.sdp-tmp"} as {refusal: "unknown"}
Then every file the person wrote is byte-identical: {personFilesKept: true}
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.hidden-file-refused · anchored · test anchor binding present · test/vault-examples.test.ts:681
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.hidden-file-refused
The diagram as text
  • spec:consumers.obsidian-vault.hidden-file-refused: A person's file under a temporary's name refuses the regeneration · declared Spec
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • test:protocol.consumers.obsidian-vault.hidden-file-refused: test:protocol.consumers.obsidian-vault.hidden-file-refused · anchored test binding · binding present · test/vault-examples.test.ts:681
  • spec:consumers.obsidian-vault.hidden-file-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.hidden-file-refused verifies spec:consumers.obsidian-vault · declared
  • test:protocol.consumers.obsidian-vault.hidden-file-refused verifies spec:consumers.obsidian-vault.hidden-file-refused · 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

No implementation neighborhood recorded.

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.obsidian-vault.hidden-file-refused
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.hidden-file-refused: A person's file under a temporary's name refuses the regeneration
  • spec:consumers.obsidian-vault.hidden-file-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.hidden-file-refused verifies spec:consumers.obsidian-vault · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneNone
verifies · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneguard

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.hidden-file-refused · anchored · test/vault-examples.test.ts:681 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

8. A vault directory the build removes refuses the run and keeps a person's notes

spec:consumers.obsidian-vault.vault-in-build-path-refused

A vault directory the build removes refuses the run and keeps a person's notes

spec:consumers.obsidian-vault.vault-in-build-path-refusedExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.vault-in-build-path-refused.sdp.md

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

Intent
outcome
Execute the refusal of a vault directory inside a projection root the shared build removes, and show that a person's notes there survive.
Behavior

Examples

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given the vault command names the vault directory {out: "generated/design-review"}
Given a vault whose generated folder holds {generated: "nothing"}
Given the vault holds {extra: "an intent note and Obsidian settings outside the generated folder"}
When the vault command runs at that root
Then the run exits {exitCode: 1}
Then the run refuses the vault directory as {placement: "overlapping a path the build owns"}
Then every file the person wrote is byte-identical: {personFilesKept: true}
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.vault-in-build-path-refused · anchored · test anchor binding present · test/vault-examples.test.ts:688
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.vault-in-build-path-refused
The diagram as text
  • spec:consumers.obsidian-vault.vault-in-build-path-refused: A vault directory the build removes refuses the run and keeps a person's notes · declared Spec
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • test:protocol.consumers.obsidian-vault.vault-in-build-path-refused: test:protocol.consumers.obsidian-vault.vault-in-build-path-refused · anchored test binding · binding present · test/vault-examples.test.ts:688
  • spec:consumers.obsidian-vault.vault-in-build-path-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.vault-in-build-path-refused verifies spec:consumers.obsidian-vault · declared
  • test:protocol.consumers.obsidian-vault.vault-in-build-path-refused verifies spec:consumers.obsidian-vault.vault-in-build-path-refused · 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

No implementation neighborhood recorded.

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.obsidian-vault.vault-in-build-path-refused
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.vault-in-build-path-refused: A vault directory the build removes refuses the run and keeps a person's notes
  • spec:consumers.obsidian-vault.vault-in-build-path-refused refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.vault-in-build-path-refused verifies spec:consumers.obsidian-vault · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneNone
verifies · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneapartFromBuild, ownedFolder

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.vault-in-build-path-refused · anchored · test/vault-examples.test.ts:688 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

9. A run after a stopped synchronization finishes it

spec:consumers.obsidian-vault.interrupted-run-recovered

A run after a stopped synchronization finishes it

spec:consumers.obsidian-vault.interrupted-run-recoveredExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.interrupted-run-recovered.sdp.md

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

Intent
outcome
Execute the recovery from a run stopped at its first rename, which left the file list recording both contents and a whole temporary beside its target.
Behavior

Examples

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files a run stopped at its first rename left"}
Given the vault holds {extra: "an intent note and Obsidian settings outside the generated folder"}
Given the member {change: "changes its title"}
When the vault command runs at that root
Then the run exits {exitCode: 0}
Then the generated folder is byte-identical to a fresh vault's, the file list included: {matchesFresh: true}
Then every file the person wrote is byte-identical: {personFilesKept: true}
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.interrupted-run-recovered · anchored · test anchor binding present · test/vault-examples.test.ts:695
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.interrupted-run-recovered
The diagram as text
  • spec:consumers.obsidian-vault.interrupted-run-recovered: A run after a stopped synchronization finishes it · declared Spec
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • test:protocol.consumers.obsidian-vault.interrupted-run-recovered: test:protocol.consumers.obsidian-vault.interrupted-run-recovered · anchored test binding · binding present · test/vault-examples.test.ts:695
  • spec:consumers.obsidian-vault.interrupted-run-recovered refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.interrupted-run-recovered verifies spec:consumers.obsidian-vault · declared
  • test:protocol.consumers.obsidian-vault.interrupted-run-recovered verifies spec:consumers.obsidian-vault.interrupted-run-recovered · 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

No implementation neighborhood recorded.

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.obsidian-vault.interrupted-run-recovered
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.interrupted-run-recovered: A run after a stopped synchronization finishes it
  • spec:consumers.obsidian-vault.interrupted-run-recovered refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.interrupted-run-recovered verifies spec:consumers.obsidian-vault · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneNone
verifies · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneinterruptedRun, synchronize

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.interrupted-run-recovered · anchored · test/vault-examples.test.ts:695 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

10. A failed extraction keeps the notes and says so on the index

spec:consumers.obsidian-vault.failed-extraction-keeps-notes

A failed extraction keeps the notes and says so on the index

spec:consumers.obsidian-vault.failed-extraction-keeps-notesExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.failed-extraction-keeps-notes.sdp.md

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

Intent
outcome
Execute a run whose extraction fails over a vault an earlier run wrote, which keeps every note, rewrites the index with a warning and records it in the file list.
Behavior

Examples

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files an earlier run wrote"}
Given the vault holds {extra: "an intent note and Obsidian settings outside the generated folder"}
Given the member {change: "has a carrier the extractor refuses"}
When the vault command runs at that root
Then the run exits {exitCode: 1}
Then the member's note is present: {memberNote: true}
Then the index note warns that the last regeneration failed: {indexWarns: true}
Then every generated file matches a content the file list records for it: {listMatches: true}
Then every file the person wrote is byte-identical: {personFilesKept: true}
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.failed-extraction-keeps-notes · anchored · test anchor binding present · test/vault-examples.test.ts:702
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.failed-extraction-keeps-notes
The diagram as text
  • spec:consumers.obsidian-vault.failed-extraction-keeps-notes: A failed extraction keeps the notes and says so on the index · declared Spec
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • test:protocol.consumers.obsidian-vault.failed-extraction-keeps-notes: test:protocol.consumers.obsidian-vault.failed-extraction-keeps-notes · anchored test binding · binding present · test/vault-examples.test.ts:702
  • spec:consumers.obsidian-vault.failed-extraction-keeps-notes refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.failed-extraction-keeps-notes verifies spec:consumers.obsidian-vault · declared
  • test:protocol.consumers.obsidian-vault.failed-extraction-keeps-notes verifies spec:consumers.obsidian-vault.failed-extraction-keeps-notes · 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

No implementation neighborhood recorded.

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.obsidian-vault.failed-extraction-keeps-notes
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.failed-extraction-keeps-notes: A failed extraction keeps the notes and says so on the index
  • spec:consumers.obsidian-vault.failed-extraction-keeps-notes refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.failed-extraction-keeps-notes verifies spec:consumers.obsidian-vault · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneNone
verifies · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNonefailedExtraction

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.failed-extraction-keeps-notes · anchored · test/vault-examples.test.ts:702 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

11. The run after a failed extraction passes the guard and restores the index

spec:consumers.obsidian-vault.failed-extraction-recovered

The run after a failed extraction passes the guard and restores the index

spec:consumers.obsidian-vault.failed-extraction-recoveredExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.failed-extraction-recovered.sdp.md

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

Intent
outcome
Execute the run that follows a failed extraction once the carrier is repaired: the guard accepts the warning index the failed run recorded, and the vault ends as a fresh one would.
Behavior

Examples

Given an extraction root holding a Pack and its member Specs, among them {member: "spec:probe.member"}
Given a vault whose generated folder holds {generated: "the files a run whose extraction failed left"}
Given the vault holds {extra: "an intent note and Obsidian settings outside the generated folder"}
Given the member {change: "stays in the corpus"}
When the vault command runs at that root
Then the run exits {exitCode: 0}
Then the index note warns that the last regeneration failed: {indexWarns: false}
Then the generated folder is byte-identical to a fresh vault's, the file list included: {matchesFresh: true}
Then every file the person wrote is byte-identical: {personFilesKept: true}
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.failed-extraction-recovered · anchored · test anchor binding present · test/vault-examples.test.ts:712
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.failed-extraction-recovered
The diagram as text
  • spec:consumers.obsidian-vault.failed-extraction-recovered: The run after a failed extraction passes the guard and restores the index · declared Spec
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • test:protocol.consumers.obsidian-vault.failed-extraction-recovered: test:protocol.consumers.obsidian-vault.failed-extraction-recovered · anchored test binding · binding present · test/vault-examples.test.ts:712
  • spec:consumers.obsidian-vault.failed-extraction-recovered refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.failed-extraction-recovered verifies spec:consumers.obsidian-vault · declared
  • test:protocol.consumers.obsidian-vault.failed-extraction-recovered verifies spec:consumers.obsidian-vault.failed-extraction-recovered · 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

No implementation neighborhood recorded.

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.obsidian-vault.failed-extraction-recovered
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.failed-extraction-recovered: The run after a failed extraction passes the guard and restores the index
  • spec:consumers.obsidian-vault.failed-extraction-recovered refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.failed-extraction-recovered verifies spec:consumers.obsidian-vault · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneNone
verifies · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNonefailedExtraction, guard

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.failed-extraction-recovered · anchored · test/vault-examples.test.ts:712 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

12. Every Spec, Pack, code unit and keyed term is a note, and every relation is a link

spec:consumers.obsidian-vault.notes

Every Spec, Pack, code unit and keyed term is a note, and every relation is a link

spec:consumers.obsidian-vault.notesUse Case / Behavior · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.notes.sdp.md

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

A note carries the reader's values as flat properties, so Obsidian's tables filter on them, and the Spec's sections in the graph's order. Each declared relation is a wikilink in both directions with its reason, each mention in prose is a wikilink to its Spec or to its entry's block, and each keyed entry carries a block id named for its address. Backlinks and the graph view then show what rests on a Spec without a query.

Two findings from the prototypes shape the names and properties. Obsidian refuses a colon in a note's name, so a note cannot be named by its id as written. And Obsidian renders a text or list property as a link to an external address whenever its value holds no space and parses as a URL, which spec: followed by a path does, while it renders an alias as plain text. Every link also names the note's .md extension, so an id whose last segment reads like another file type's extension, such as base, still links to its note.

Intent
outcome
Write one note per Spec, Pack, code unit, test anchor, oracle anchor and keyed Model term, with graph and reader values as properties and every declared relation and checked mention as a wikilink, so a person follows the graph in both directions.
Behavior

The world writes a probe corpus whose Specs mention each other, runs the vault command, and reads the mentioning Spec's note from disk. A keyed Model term is written as spec:model.term-addresses states.

rule.oneNotePer line 26 · specs/consumers/obsidian-vault.notes.sdp.md:26
The vault holds one note per Spec, Pack, code unit, test anchor and oracle anchor, and one per Model term that carries a key, which spec:model.term-addresses gives an address; a term without a key appears only in its Spec's note, since no address can name it, and a ratified glossary term gains a note only where a Spec's Model section defines it with a key.

spec:consumers.obsidian-vault.notes.term-address-link · enabled

rule.termNoteGrain line 27 · specs/consumers/obsidian-vault.notes.sdp.md:27
A term defined in several Specs gets one note per defining Spec and term, so each definition keeps its authored owner; the term's aliases bring the notes together when a person types it.

no example exercises it

rule.noteNames line 28 · specs/consumers/obsidian-vault.notes.sdp.md:28
A note is named by its id with the colon after the namespace replaced by a dot, and a term note by term., its Spec's path, a dot and its key; one vault holds the notes of one corpus.

spec:consumers.obsidian-vault.notes.entry-address-link · enabled

rule.caseCollision line 29 · specs/consumers/obsidian-vault.notes.sdp.md:29
Two notes whose paths differ only in case refuse the run before it writes, naming both ids, so no two names collide on a file system that ignores case; the run writes and removes nothing and exits 1.

spec:consumers.obsidian-vault.notes.case-collision-refused · enabled

rule.idInAliases line 30 · specs/consumers/obsidian-vault.notes.sdp.md:30
A note's id, colon included, is written as plain text only in its aliases property and in the code span of its head line, since Obsidian shows an alias as plain text; a property that names another node holds a link to its note, and no other property value the generator composes is an id or an entry address. Authored text in a property, such as a title or a label, is written as authored, and the generator never treats one that looks like an address as an address.

spec:consumers.obsidian-vault.notes.entry-address-link · enabled

rule.readerProperties line 31 · specs/consumers/obsidian-vault.notes.sdp.md:31
A Spec note's properties are the reader's values for that Spec, listed under spec:consumers.obsidian-vault.notes#design.specProperties; every join, delivery fact, floor and rung among them is one the reader computed, and the generator computes none.

no example exercises it

rule.bindingProperties line 32 · specs/consumers/obsidian-vault.notes.sdp.md:32
A Spec's bindings are two booleans, implementationBinding true where the reader's delivery facts hold implemented and verifierBinding true where they hold has-verifier, and the note's body renders the four binding lines spec:consumers.binding-language-views states, so no rendered label is a delivery-fact name.

no example exercises it

rule.relationsBothWays line 33 · specs/consumers/obsidian-vault.notes.sdp.md:33
Each declared relation whose two ends have notes is a link on the notes at both ends, with its type, its reason, and for an example's verifies a link to the block of each rule it exercises in the verified Spec's note; an end with no note, such as a target that does not resolve, and an exercised key the verified Spec does not carry, appear on the source note as their id or key in a code span, with no link.

no example exercises it

rule.blockIds line 34 · specs/consumers/obsidian-vault.notes.sdp.md:34
Each keyed Design and UI entry, keyed open question, keyed rule or flow, and keyed Model term ends its line in its Spec's note with the block id ^<section>-<key>, with section design, ui, question, rule or term.

spec:consumers.obsidian-vault.notes.entry-address-link · enabled, spec:consumers.obsidian-vault.notes.term-address-link · enabled

rule.mentionLinks line 35 · specs/consumers/obsidian-vault.notes.sdp.md:35
A mention in any text the vault renders from the graph, found by the scanner the prose-mention validator uses, becomes a link when its Spec resolves and, for an entry address, its entry does; a mention that does not resolve stays as written. A code span holding exactly one mention becomes that link, and any other code span stays code.

spec:consumers.obsidian-vault.notes.entry-address-link · enabled, spec:consumers.obsidian-vault.notes.term-address-link · enabled, spec:consumers.obsidian-vault.notes.unresolved-mention-stays · enabled

rule.textEscaped line 36 · specs/consumers/obsidian-vault.notes.sdp.md:36
Text from the graph renders as written, except that the generator escapes what Obsidian would read as a link, an embed, a tag, a block id, a comment, a highlight or math, so no note holds a link, tag or block id the graph does not.

no example exercises it

rule.addressRoundTrip line 37 · specs/consumers/obsidian-vault.notes.sdp.md:37
Every note name and block id converts back to what it names: a note name to its id by restoring the colon after the namespace, a term note's name to its term address, and a block id in a Spec's note to its entry address, so an agent reading a link a person wrote names the entry it cites.

no example exercises it

Cited at

  • test/skills.test.ts:2143

0 unkeyed rules.

Verifying examples

Two Specs whose notes differ only in case refuse the run · spec:consumers.obsidian-vault.notes.case-collision-refused · ready floor ready

Executable Spec

Given a corpus holding the Specs {first: "spec:probe.Member"} and {second: "spec:probe.member"}
When the vault command runs over that corpus
Then the run exits {exitCode: 1}
Then the refusal names {named: "spec:probe.Member and spec:probe.member"}
Then nothing under the generated folder was written: {nothingWritten: true}

Open example

An entry address in prose opens the entry's block in its Spec's note · spec:consumers.obsidian-vault.notes.entry-address-link · ready floor ready

Executable Spec

Given a corpus holding the Spec {source: "spec:probe.source"} whose narrative mentions {mention: "spec:probe.target#design.limit"}
Given the Spec {target: "spec:probe.target"} keys the Design entry {key: "limit"}
When the vault command runs over that corpus
Then the mentioning Spec's note is {notePath: "sdp/specs/probe/spec.probe.source.md"}
Then the mention renders as {rendered: "[[sdp/specs/probe/spec.probe.target.md#^design-limit|spec:probe.target#design.limit]]"}
Then the note's aliases open with {alias: "spec:probe.source"}
Then no property but aliases holds an id or an entry address as plain text: {plainProperties: true}

Open example

A keyed Model term gets a note, and its address in prose opens the term's block · spec:consumers.obsidian-vault.notes.term-address-link · ready floor ready

Executable Spec

Given a corpus holding the Spec {source: "spec:probe.source"} whose narrative mentions {mention: "spec:probe.target#term.limit"}
Given the Spec {termSpec: "spec:probe.target"} defines a Model term with the key {termKey: "limit"}
When the vault command runs over that corpus
Then the term's note is {termNotePath: "sdp/terms/term.probe.target.limit.md"}
Then the defining Spec's note carries the block id {blockId: "term-limit"}
Then the mention renders as {rendered: "[[sdp/specs/probe/spec.probe.target.md#^term-limit|spec:probe.target#term.limit]]"}

Open example

A mention of an entry that does not exist stays as written · spec:consumers.obsidian-vault.notes.unresolved-mention-stays · ready floor ready

Executable Spec

Given a corpus holding the Spec {source: "spec:probe.source"} whose narrative mentions {mention: "spec:probe.target#design.missing"}
Given the Spec {target: "spec:probe.target"} keys the Design entry {key: "limit"}
When the vault command runs over that corpus
Then the mention renders as {rendered: "spec:probe.target#design.missing"}

Open example

Example space

Given a corpus holding the Spec {source:string} whose narrative mentions {mention:string}
Given a corpus holding the Specs {first:string} and {second:string}
Given the Spec {target:string} keys the Design entry {key:string}
Given the Spec {termSpec:string} defines a Model term with the key {termKey:string}
When the vault command runs over that corpus
Then the run exits {exitCode:number}
Then the refusal names {named:string}
Then nothing under the generated folder was written: {nothingWritten:boolean}
Then the mentioning Spec's note is {notePath:string}
Then the mention renders as {rendered:string}
Then the term's note is {termNotePath:string}
Then the defining Spec's note carries the block id {blockId:string}
Then the note's aliases open with {alias:string}
Then no property but aliases holds an id or an entry address as plain text: {plainProperties:boolean}
Design
noteName line 40 · specs/consumers/obsidian-vault.notes.sdp.md:40
<namespace>.<path> for an id <namespace>:<path>, as spec.model.rule-keys, pack.design-iteration-v1 and impl.protocol.reader; term.<path>.<key> for the term address spec:<path>#term.<key>.

no citation recorded

linkForm line 41 · specs/consumers/obsidian-vault.notes.sdp.md:41
[[<path from the vault>.md|<id or address>]], with #^<block id> after .md for an entry; every link names the file's extension, and an embedded Base is ![[sdp/packs/<note>.base]] or ![[sdp/specs.base]].

no citation recorded

blockId line 42 · specs/consumers/obsidian-vault.notes.sdp.md:42
<section>-<key>, written as ^<section>-<key> at the end of the entry's line, so spec:<id>#design.limit opens as [[sdp/specs/<family>/<note>.md#^design-limit|spec:<id>#design.limit]].

no citation recorded

propertyEncoding line 43 · specs/consumers/obsidian-vault.notes.sdp.md:43
the properties sit between two --- lines at the top of the note, one per line as <key>: <JSON value>, in the order listed below; a property the graph does not hold is left out.
specProperties line 44 · specs/consumers/obsidian-vault.notes.sdp.md:44
aliases (the id, then the title), title, specKind, altitude, statedReadiness, derivedReadiness (none when no rung derives), statedNextRung (left out when the Spec states ready), statedNextRungFailures (the failing clause ids), implementationBinding, verifierBinding, designEntries, declarations, openQuestions (a count), blockingQuestions, decisions (links to the notes of the resolving decisions the design columns name), packs (links to the Pack notes), carrier (the root-relative carrier path).

no citation recorded

packProperties line 45 · specs/consumers/obsidian-vault.notes.sdp.md:45
aliases (the id, then the title), title, manifest (the root-relative manifest path), and optional order, present as "priority" only when the Pack states it.

no citation recorded

codeProperties line 46 · specs/consumers/obsidian-vault.notes.sdp.md:46
aliases (the id), label, role, layer, context, component (a link to the component's note), sourceFile (root-relative), sourceLine.

no citation recorded

termProperties line 47 · specs/consumers/obsidian-vault.notes.sdp.md:47
aliases (the term, then its address), definedIn (a link to the defining Spec's note).

no citation recorded

banner line 48 · specs/consumers/obsidian-vault.notes.sdp.md:48
the first line after the properties, > [!info] Generated by `sdp vault` from the graph. Edit the <carrier|Pack manifest|source file> `<root-relative path>`, never this note: a regeneration refuses while a note it wrote has changed. , naming the Spec's carrier, the Pack's manifest or the unit's source file.
headLine line 49 · specs/consumers/obsidian-vault.notes.sdp.md:49
under a Spec note's title, `<id>` · <kind display label> · <altitude> · stated <rung> · floor <rung or none> , then · <stated next rung>: <failing clause ids, or nothing blocks> when the Spec states less than ready.
specNoteBody line 50 · specs/consumers/obsidian-vault.notes.sdp.md:50
the banner, # <title>, the head line, the narrative's paragraphs, each section under ## <Section> in the graph's order with Intent's open questions under ### Open questions and an example's steps or an example space's vocabulary in a fenced gherkin block, then ## Relations with ### From this Spec and ### Toward this Spec, ## Bindings, ## Packs and ## Findings, each heading left out when it has nothing under it.
bindingLines line 51 · specs/consumers/obsidian-vault.notes.sdp.md:51
under ## Bindings, - Implementation binding: present or none with each realizing unit, the units that reference the Spec, - Verifier binding: present or none with each verifier, - Expected-outcome oracle: present or none, and - Runtime observation: not tracked.
packNoteBody line 52 · specs/consumers/obsidian-vault.notes.sdp.md:52
the banner, # <title>, the framing, ## Members, filterable with the Pack's Base embedded, ## Members, in advisory priority order when order is "priority", otherwise ## Members, in reading order, as a numbered list in manifest order, each a link with its stated rung, floor and stated next rung or nothing blocks, then ## Boundary with the reader's four boundary lists and ## Findings. A roadmap states Priority confers no permission or sequencing requirement. before its ordered list heading.
codeNoteBody line 53 · specs/consumers/obsidian-vault.notes.sdp.md:53
the banner, # <id>, the label, `<file>:<line>` , then link lists under ## Member of, ## Members, ## Uses, ## Used by, ## Satisfies, ## References, ## Verifies and ## Models, each left out when empty.
termNoteBody line 54 · specs/consumers/obsidian-vault.notes.sdp.md:54
the banner, # <term>, the definition, and Defined in [[<Spec note>.md#^term-<key>|<term address>]].
caseCollisionMessage line 55 · specs/consumers/obsidian-vault.notes.sdp.md:55
sdp vault: <first id> and <second id> name notes whose paths differ only in case; nothing was written, one line per colliding pair, the ids in code-unit order.

no citation recorded

escapes line 56 · specs/consumers/obsidian-vault.notes.sdp.md:56
a backslash before [[, %%, ==, $, a # that opens a tag after a space or at a line's start, and a ^ that would end a line as a block id; text inside a code span is left as written.
Verification

Verifier bindings

Example space

  • source · string · declared by a corpus holding the Spec {source} whose narrative mentions {mention}
  • mention · string · declared by a corpus holding the Spec {source} whose narrative mentions {mention}
  • first · string · declared by a corpus holding the Specs {first} and {second}
  • second · string · declared by a corpus holding the Specs {first} and {second}
  • target · string · declared by the Spec {target} keys the Design entry {key}
  • key · string · declared by the Spec {target} keys the Design entry {key}
  • termSpec · string · declared by the Spec {termSpec} defines a Model term with the key {termKey}
  • termKey · string · declared by the Spec {termSpec} defines a Model term with the key {termKey}

Bound points

ExamplesourcementionfirstsecondtargetkeytermSpectermKey
spec:consumers.obsidian-vault.notes.case-collision-refusedunboundunbound"spec:probe.Member""spec:probe.member"unboundunboundunboundunbound
spec:consumers.obsidian-vault.notes.entry-address-link"spec:probe.source""spec:probe.target#design.limit"unboundunbound"spec:probe.target""limit"unboundunbound
spec:consumers.obsidian-vault.notes.term-address-link"spec:probe.source""spec:probe.target#term.limit"unboundunboundunboundunbound"spec:probe.target""limit"
spec:consumers.obsidian-vault.notes.unresolved-mention-stays"spec:probe.source""spec:probe.target#design.missing"unboundunbound"spec:probe.target""limit"unboundunbound

Oracle binding: present · oracle:protocol.vault-notes · test/vault-examples.test.ts:291

Coverage

source: "spec:probe.source" · spec:consumers.obsidian-vault.notes.entry-address-link, spec:consumers.obsidian-vault.notes.term-address-link, spec:consumers.obsidian-vault.notes.unresolved-mention-stays · not enumerable

mention: "spec:probe.target#design.limit" · spec:consumers.obsidian-vault.notes.entry-address-link; "spec:probe.target#term.limit" · spec:consumers.obsidian-vault.notes.term-address-link; "spec:probe.target#design.missing" · spec:consumers.obsidian-vault.notes.unresolved-mention-stays · not enumerable

first: "spec:probe.Member" · spec:consumers.obsidian-vault.notes.case-collision-refused · not enumerable

second: "spec:probe.member" · spec:consumers.obsidian-vault.notes.case-collision-refused · not enumerable

target: "spec:probe.target" · spec:consumers.obsidian-vault.notes.entry-address-link, spec:consumers.obsidian-vault.notes.unresolved-mention-stays · not enumerable

key: "limit" · spec:consumers.obsidian-vault.notes.entry-address-link, spec:consumers.obsidian-vault.notes.unresolved-mention-stays · not enumerable

termSpec: "spec:probe.target" · spec:consumers.obsidian-vault.notes.term-address-link · not enumerable

termKey: "limit" · spec:consumers.obsidian-vault.notes.term-address-link · not enumerable

Unbound

Design view

Requirement drawing

Requirement drawing for spec:consumers.obsidian-vault.notes
The diagram as text
  • spec:consumers.obsidian-vault.notes: Every Spec, Pack, code unit and keyed term is a note, and every relation is a link · declared Spec
  • spec:consumers.obsidian-vault.notes.case-collision-refused: Two Specs whose notes differ only in case refuse the run · declared Spec
  • spec:consumers.obsidian-vault.notes.entry-address-link: An entry address in prose opens the entry's block in its Spec's note · declared Spec
  • spec:consumers.obsidian-vault.notes.term-address-link: A keyed Model term gets a note, and its address in prose opens the term's block · declared Spec
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays: A mention of an entry that does not exist stays as written · declared Spec
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • impl:protocol.vault-notes: renders reader contexts, declared relations and keyed terms as linked notes · anchored code · src/projections/vault/notes.ts:45
  • impl:protocol.vault-sections: renders sections in graph order with keyed entry block ids · anchored code · src/projections/vault/sections.ts:10
  • impl:protocol.vault-text: renders checked mentions and escapes Obsidian syntax outside code spans · anchored code · src/projections/vault/text.ts:30
  • oracle:protocol.vault-notes: oracle:protocol.vault-notes · anchored oracle binding · test/vault-examples.test.ts:291
  • test:protocol.consumers.obsidian-vault.notes.case-collision-refused: test:protocol.consumers.obsidian-vault.notes.case-collision-refused · anchored test binding · binding present · test/vault-examples.test.ts:740
  • test:protocol.consumers.obsidian-vault.notes.entry-address-link: test:protocol.consumers.obsidian-vault.notes.entry-address-link · anchored test binding · binding present · test/vault-examples.test.ts:719
  • test:protocol.consumers.obsidian-vault.notes.term-address-link: test:protocol.consumers.obsidian-vault.notes.term-address-link · anchored test binding · binding present · test/vault-examples.test.ts:733
  • test:protocol.consumers.obsidian-vault.notes.unresolved-mention-stays: test:protocol.consumers.obsidian-vault.notes.unresolved-mention-stays · anchored test binding · binding present · test/vault-examples.test.ts:726
  • test:protocol.vault-priority: test:protocol.vault-priority · anchored test binding · binding present · test/vault.test.ts:53
  • spec:consumers.obsidian-vault.notes refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.notes.case-collision-refused refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.case-collision-refused verifies spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.entry-address-link refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.entry-address-link verifies spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.term-address-link refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.term-address-link verifies spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays verifies spec:consumers.obsidian-vault.notes · declared
  • impl:protocol.vault-notes satisfies spec:consumers.obsidian-vault.notes · anchored
  • impl:protocol.vault-sections satisfies spec:consumers.obsidian-vault.notes · anchored
  • impl:protocol.vault-text satisfies spec:consumers.obsidian-vault.notes · anchored
  • oracle:protocol.vault-notes models spec:consumers.obsidian-vault.notes · anchored
  • test:protocol.consumers.obsidian-vault.notes.case-collision-refused verifies spec:consumers.obsidian-vault.notes.case-collision-refused · anchored
  • test:protocol.consumers.obsidian-vault.notes.entry-address-link verifies spec:consumers.obsidian-vault.notes.entry-address-link · anchored
  • test:protocol.consumers.obsidian-vault.notes.term-address-link verifies spec:consumers.obsidian-vault.notes.term-address-link · anchored
  • test:protocol.consumers.obsidian-vault.notes.unresolved-mention-stays verifies spec:consumers.obsidian-vault.notes.unresolved-mention-stays · anchored
  • test:protocol.vault-priority verifies spec:consumers.obsidian-vault.notes · 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
  • 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.vault-notes · renders reader contexts, declared relations and keyed terms as linked notes · src/projections/vault/notes.ts:45

    Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

    • impl:protocol.reader · typed graph queries, entry adapters and context joins · src/reader/reader.ts:687
  • impl:protocol.vault-sections · renders sections in graph order with keyed entry block ids · src/projections/vault/sections.ts:10

    Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

    None.

  • impl:protocol.vault-text · renders checked mentions and escapes Obsidian syntax outside code spans · src/projections/vault/text.ts:30

    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.obsidian-vault.notes
Relations of spec:consumers.obsidian-vault.notesdependsOn · declaredrefines · declareddependsOn · declareddependsOn · declaredrefines · declaredverifies · declareddependsOn · declaredOutgoing refinesspec:consumers.obsidian-vaultAn Obsidian vault lets aperson iterate on designsfrom the one graph…consumers.obsidian-vaultOutgoing dependsOnspec:consumers.binding-language-viewsViews speak bindinglanguage, never theinternal fact name…consumers.binding-language-viewsspec:model.term-addressesA Model term may carry akey that addresses it…model.term-addressesspec:validation.prose-mentionsEvery Spec id written inprose resolves…validation.prose-mentionsSubjectspec:consumers.obsidian-vault.notesEvery Spec, Pack, code unitand keyed term is a note,and every relation is a link…consumers.obsidian-vault.notesIncoming refinesspec:consumers.obsidian-vault.notes.fold.Incoming.refines4 Incoming refines, folded…consumers.obsidian-vault.notes.fold.Incoming.refinesIncoming dependsOnspec:consumers.vault-on-rampThe vault skill teachesagents to keep an Obsidianvault of the graph…consumers.vault-on-ramp
The diagram as text
  • spec:consumers.binding-language-views: Views speak binding language, never the internal fact name
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.notes: Every Spec, Pack, code unit and keyed term is a note, and every relation is a link
  • spec:consumers.obsidian-vault.notes.case-collision-refused: Two Specs whose notes differ only in case refuse the run
  • spec:consumers.obsidian-vault.notes.entry-address-link: An entry address in prose opens the entry's block in its Spec's note
  • spec:consumers.obsidian-vault.notes.term-address-link: A keyed Model term gets a note, and its address in prose opens the term's block
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays: A mention of an entry that does not exist stays as written
  • spec:consumers.vault-on-ramp: The vault skill teaches agents to keep an Obsidian vault of the graph
  • spec:model.term-addresses: A Model term may carry a key that addresses it
  • spec:validation.prose-mentions: Every Spec id written in prose resolves
  • spec:consumers.obsidian-vault.notes dependsOn spec:consumers.binding-language-views · declared — rendered binding labels must state existence rather than liveness
  • spec:consumers.obsidian-vault.notes dependsOn spec:model.term-addresses · declared — a term note exists for a Model term that carries a key and so an address
  • spec:consumers.obsidian-vault.notes dependsOn spec:validation.prose-mentions · declared — a mention can become a link because validation already refuses one that does not resolve
  • spec:consumers.obsidian-vault.notes refines spec:consumers.obsidian-vault · declared
  • spec:consumers.vault-on-ramp dependsOn spec:consumers.obsidian-vault.notes · declared — the skill converts a note name or block id back to the id or entry address it names
  • spec:consumers.obsidian-vault.notes.case-collision-refused refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.entry-address-link refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.term-address-link refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.case-collision-refused verifies spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.entry-address-link verifies spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.term-address-link verifies spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays verifies spec:consumers.obsidian-vault.notes · 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

  • refines · spec:consumers.obsidian-vault · stated ready, floor ready
  • dependsOn · spec:consumers.binding-language-views · stated ready, floor ready
  • dependsOn · spec:model.term-addresses · stated ready, floor ready
  • dependsOn · spec:validation.prose-mentions · stated ready, floor ready

Rested on by

Distance 1

Relations

Relation and directionOther endClaimReasonExercised keys
dependsOn · outgoingspec:consumers.binding-language-views
spec:consumers.binding-language-views · resolves
declaredrendered binding labels must state existence rather than livenessNone
dependsOn · outgoingA Model term may carry a key that addresses it
spec:model.term-addresses · resolves
declareda term note exists for a Model term that carries a key and so an addressNone
dependsOn · outgoingspec:validation.prose-mentions
spec:validation.prose-mentions · resolves
declareda mention can become a link because validation already refuses one that does not resolveNone
refines · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneNone
dependsOn · incomingThe vault skill teaches agents to keep an Obsidian vault of the graph
spec:consumers.vault-on-ramp · resolves
declaredthe skill converts a note name or block id back to the id or entry address it namesNone
refines · incomingTwo Specs whose notes differ only in case refuse the run
spec:consumers.obsidian-vault.notes.case-collision-refused · resolves
declaredNoneNone
refines · incomingAn entry address in prose opens the entry's block in its Spec's note
spec:consumers.obsidian-vault.notes.entry-address-link · resolves
declaredNoneNone
refines · incomingA keyed Model term gets a note, and its address in prose opens the term's block
spec:consumers.obsidian-vault.notes.term-address-link · resolves
declaredNoneNone
refines · incomingA mention of an entry that does not exist stays as written
spec:consumers.obsidian-vault.notes.unresolved-mention-stays · resolves
declaredNoneNone
verifies · incomingTwo Specs whose notes differ only in case refuse the run
spec:consumers.obsidian-vault.notes.case-collision-refused · resolves
declaredNonecaseCollision
verifies · incomingAn entry address in prose opens the entry's block in its Spec's note
spec:consumers.obsidian-vault.notes.entry-address-link · resolves
declaredNonenoteNames, idInAliases, blockIds, mentionLinks
verifies · incomingA keyed Model term gets a note, and its address in prose opens the term's block
spec:consumers.obsidian-vault.notes.term-address-link · resolves
declaredNoneoneNotePer, blockIds, mentionLinks
verifies · incomingA mention of an entry that does not exist stays as written
spec:consumers.obsidian-vault.notes.unresolved-mention-stays · resolves
declaredNonementionLinks

Bindings

Implementation binding: present

  • impl:protocol.vault-notes · renders reader contexts, declared relations and keyed terms as linked notes · src/projections/vault/notes.ts:45 · role projection · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.vault-sections · renders sections in graph order with keyed entry block ids · src/projections/vault/sections.ts:10 · role projection · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.vault-text · renders checked mentions and escapes Obsidian syntax outside code spans · src/projections/vault/text.ts:30 · role codec · component component:protocol.projections · layer edge · context protocol

Design reference: none

Verifier binding: present

Expected-outcome oracle: present

  • oracle:protocol.vault-notes · test/vault-examples.test.ts:291

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

14. A mention of an entry that does not exist stays as written

spec:consumers.obsidian-vault.notes.unresolved-mention-stays

A mention of an entry that does not exist stays as written

spec:consumers.obsidian-vault.notes.unresolved-mention-staysExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.notes.unresolved-mention-stays.sdp.md

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

Intent
outcome
Execute the mention rule on an entry address whose key its Spec does not carry, which validation reports and the vault leaves unlinked.
Behavior

Examples

Given a corpus holding the Spec {source: "spec:probe.source"} whose narrative mentions {mention: "spec:probe.target#design.missing"}
Given the Spec {target: "spec:probe.target"} keys the Design entry {key: "limit"}
When the vault command runs over that corpus
Then the mention renders as {rendered: "spec:probe.target#design.missing"}
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.notes.unresolved-mention-stays · anchored · test anchor binding present · test/vault-examples.test.ts:726
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.notes.unresolved-mention-stays
The diagram as text
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays: A mention of an entry that does not exist stays as written · declared Spec
  • spec:consumers.obsidian-vault.notes: Every Spec, Pack, code unit and keyed term is a note, and every relation is a link · declared Spec
  • test:protocol.consumers.obsidian-vault.notes.unresolved-mention-stays: test:protocol.consumers.obsidian-vault.notes.unresolved-mention-stays · anchored test binding · binding present · test/vault-examples.test.ts:726
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays verifies spec:consumers.obsidian-vault.notes · declared
  • test:protocol.consumers.obsidian-vault.notes.unresolved-mention-stays verifies spec:consumers.obsidian-vault.notes.unresolved-mention-stays · 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

No implementation neighborhood recorded.

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.obsidian-vault.notes.unresolved-mention-stays
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault.notes: Every Spec, Pack, code unit and keyed term is a note, and every relation is a link
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays: A mention of an entry that does not exist stays as written
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays verifies spec:consumers.obsidian-vault.notes · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingEvery Spec, Pack, code unit and keyed term is a note, and every relation is a link
spec:consumers.obsidian-vault.notes · resolves
declaredNoneNone
verifies · outgoingEvery Spec, Pack, code unit and keyed term is a note, and every relation is a link
spec:consumers.obsidian-vault.notes · resolves
declaredNonementionLinks

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.notes.unresolved-mention-stays · anchored · test/vault-examples.test.ts:726 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

16. Two Specs whose notes differ only in case refuse the run

spec:consumers.obsidian-vault.notes.case-collision-refused

Two Specs whose notes differ only in case refuse the run

spec:consumers.obsidian-vault.notes.case-collision-refusedExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.notes.case-collision-refused.sdp.md

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

Intent
outcome
Execute the case-collision refusal on two Spec ids that differ only in the case of one letter.
Behavior

Examples

Given a corpus holding the Specs {first: "spec:probe.Member"} and {second: "spec:probe.member"}
When the vault command runs over that corpus
Then the run exits {exitCode: 1}
Then the refusal names {named: "spec:probe.Member and spec:probe.member"}
Then nothing under the generated folder was written: {nothingWritten: true}
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.notes.case-collision-refused · anchored · test anchor binding present · test/vault-examples.test.ts:740
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.notes.case-collision-refused
The diagram as text
  • spec:consumers.obsidian-vault.notes.case-collision-refused: Two Specs whose notes differ only in case refuse the run · declared Spec
  • spec:consumers.obsidian-vault.notes: Every Spec, Pack, code unit and keyed term is a note, and every relation is a link · declared Spec
  • test:protocol.consumers.obsidian-vault.notes.case-collision-refused: test:protocol.consumers.obsidian-vault.notes.case-collision-refused · anchored test binding · binding present · test/vault-examples.test.ts:740
  • spec:consumers.obsidian-vault.notes.case-collision-refused refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.case-collision-refused verifies spec:consumers.obsidian-vault.notes · declared
  • test:protocol.consumers.obsidian-vault.notes.case-collision-refused verifies spec:consumers.obsidian-vault.notes.case-collision-refused · 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

No implementation neighborhood recorded.

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.obsidian-vault.notes.case-collision-refused
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault.notes: Every Spec, Pack, code unit and keyed term is a note, and every relation is a link
  • spec:consumers.obsidian-vault.notes.case-collision-refused: Two Specs whose notes differ only in case refuse the run
  • spec:consumers.obsidian-vault.notes.case-collision-refused refines spec:consumers.obsidian-vault.notes · declared
  • spec:consumers.obsidian-vault.notes.case-collision-refused verifies spec:consumers.obsidian-vault.notes · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingEvery Spec, Pack, code unit and keyed term is a note, and every relation is a link
spec:consumers.obsidian-vault.notes · resolves
declaredNoneNone
verifies · outgoingEvery Spec, Pack, code unit and keyed term is a note, and every relation is a link
spec:consumers.obsidian-vault.notes · resolves
declaredNonecaseCollision

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.notes.case-collision-refused · anchored · test/vault-examples.test.ts:740 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

17. A Pack's members and the standing queries are tables over the reader's values

spec:consumers.obsidian-vault.bases

A Pack's members and the standing queries are tables over the reader's values

spec:consumers.obsidian-vault.basesUse Case / Behavior · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.bases.sdp.md

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

A Base is Obsidian's table, card or list view over notes, filtered and sorted by their properties. Each Pack gets a Base of its members and the corpus one Base whose views are standing queries: the build backlog, the design backlog, the Specs whose next rung waits only for their author's statement, the Specs with blocking questions, and the decisions. In Obsidian a Pack's members read as one sortable table with implementation and verifier bindings shown as present or none, where the Design Review's Pack page is a table too wide for its page.

A view is a filter over values the generator wrote from the reader, so it agrees with the query it mirrors only while its predicate stays that simple. A view that would need a join waits until the reader carries the joined value. Keeping every filter inside a small closed grammar lets a test read each view's selection from the written files, without Obsidian, and compare it with its source over the same graph.

Intent
outcome
Give each Pack a Base of its members and the corpus a Base of standing queries, so a person filters and sorts a design by rung, floor, bindings and design columns.
Behavior

The world writes a probe corpus with a Pack whose members put at least one Spec in every standing view, runs the vault command, reads the Bases and the Spec notes' properties from disk, applies each view's clauses to those properties, and runs each view's source over the same graph.

rule.corpusBase line 22 · specs/consumers/obsidian-vault.bases.sdp.md:22
A corpus Base the command writes, sdp/specs.base, is over every Spec note, with the standing views spec:consumers.obsidian-vault.bases#design.standingViews lists; the index embeds it.

spec:consumers.obsidian-vault.bases.views-match-sources · enabled

rule.packBase line 23 · specs/consumers/obsidian-vault.bases.sdp.md:23
A Pack Base the command writes beside its note selects the Spec notes whose packs property links the Pack, with the views spec:consumers.obsidian-vault.bases#design.packViews lists; the Pack's note embeds it.

spec:consumers.obsidian-vault.bases.views-match-sources · enabled

rule.viewsMirrorSources line 24 · specs/consumers/obsidian-vault.bases.sdp.md:24
Each standing view of a Base the command writes selects, over one graph, exactly the Specs its source selects, as spec:consumers.obsidian-vault.bases#design.viewSources pairs them.

spec:consumers.obsidian-vault.bases.views-match-sources · enabled

rule.closedClauses line 25 · specs/consumers/obsidian-vault.bases.sdp.md:25
Every filter is an and list of clauses from the closed grammar spec:consumers.obsidian-vault.bases#design.filterClauses states, over properties the notes hold, so no view computes a join, a fact or a floor.

spec:consumers.obsidian-vault.bases.views-match-sources · enabled

rule.bindingDisplay line 26 · specs/consumers/obsidian-vault.bases.sdp.md:26
A Base shows the two binding properties through formulas as present or none, under the column names Implementation binding and Verifier binding, never under a delivery-fact name.

no example exercises it

rule.memberOrder line 27 · specs/consumers/obsidian-vault.bases.sdp.md:27
A Pack's note lists its members in manifest order beside its embedded Base, since a Base sorts by property and keeps no authored order.

no example exercises it

0 unkeyed rules.

Verifying examples

Each standing view selects what its source selects · spec:consumers.obsidian-vault.bases.views-match-sources · ready floor ready

Executable Spec

Given a corpus holding a Pack of {members: 6} Specs, with a Spec in every standing view
When the vault command writes the vault
Then each standing view of the corpus Base selects the Specs its source selects: {viewsMatch: true}
Then the Pack's Base selects every member and nothing else: {packMatches: true}
Then every filter clause belongs to the closed grammar: {closedClauses: true}

Open example

Example space

Given a corpus holding a Pack of {members:number} Specs, with a Spec in every standing view
When the vault command writes the vault
Then each standing view of the corpus Base selects the Specs its source selects: {viewsMatch:boolean}
Then the Pack's Base selects every member and nothing else: {packMatches:boolean}
Then every filter clause belongs to the closed grammar: {closedClauses:boolean}
Design
filterClauses line 30 · specs/consumers/obsidian-vault.bases.sdp.md:30
a clause is one of <property> == "<text>", <property> != "<text>", <property> == true, <property> == false, <property> > 0, <property>.isEmpty(), !<property>.isEmpty(), <property>.contains(link("<path>.md")) and file.inFolder("<folder>"), each written as one double-quoted YAML string.
corpusFilter line 31 · specs/consumers/obsidian-vault.bases.sdp.md:31
sdp/specs.base filters on file.inFolder("sdp/specs").

no citation recorded

standingViews line 32 · specs/consumers/obsidian-vault.bases.sdp.md:32
table views in this order, All Specs with no further clause; Build backlog with statedReadiness == "ready", specKind != "example", specKind != "decision" and implementationBinding == false; Design backlog with statedReadiness == "defined", specKind != "example", specKind != "decision" and implementationBinding == false; Nothing blocks the next rung with !statedNextRung.isEmpty() and statedNextRungFailures.isEmpty(); Blocking questions with blockingQuestions > 0; Decisions with specKind == "decision".
viewSources line 33 · specs/consumers/obsidian-vault.bases.sdp.md:33
Build backlog the rows of the build backlog recipe; Design backlog the rows of the design backlog recipe; Nothing blocks the next rung the Specs whose reader context has a statedNextRung and an empty statedNextRungFailures; Blocking questions the Specs with a blocking question in the open-question register; Decisions the rows of the decision register; each compared by Spec id over the same graph.

no citation recorded

packFilter line 34 · specs/consumers/obsidian-vault.bases.sdp.md:34
sdp/packs/<note>.base filters on file.inFolder("sdp/specs") and packs.contains(link("sdp/packs/<note>.md")).

no citation recorded

packViews line 35 · specs/consumers/obsidian-vault.bases.sdp.md:35
table views in this order, Members with no further clause and Nothing blocks the next rung with the clauses of the corpus view of that name.
memberColumns line 36 · specs/consumers/obsidian-vault.bases.sdp.md:36
Members and All Specs show file.name, title, specKind, statedReadiness, derivedReadiness, statedNextRung, statedNextRungFailures, formula.implementation, formula.verifier, designEntries, declarations, openQuestions and blockingQuestions; the other views show file.name, title and the properties their clauses read.

no citation recorded

bindingFormulas line 37 · specs/consumers/obsidian-vault.bases.sdp.md:37
implementation: 'if(implementationBinding, "present", "none")' and verifier: 'if(verifierBinding, "present", "none")' under formulas: in every Base.

no citation recorded

columnNames line 38 · specs/consumers/obsidian-vault.bases.sdp.md:38
every Base names its columns under properties: with displayName, keyed note.<property> or formula.<name>: Title, Kind, Stated, Floor reached, Next rung, What holds it, Implementation binding, Verifier binding, Design entries, Declarations, Open questions, Blocking.
Verification

Verifier bindings

Example space

  • members · number · declared by a corpus holding a Pack of {members} Specs, with a Spec in every standing view

Bound points

Oracle binding: present · oracle:protocol.vault-bases · test/vault-examples.test.ts:405

Coverage

members: 6 · spec:consumers.obsidian-vault.bases.views-match-sources · not enumerable

Unbound

  • members: None
Design view

Requirement drawing

Requirement drawing for spec:consumers.obsidian-vault.bases
The diagram as text
  • spec:consumers.obsidian-vault.bases: A Pack's members and the standing queries are tables over the reader's values · declared Spec
  • spec:consumers.obsidian-vault.bases.views-match-sources: Each standing view selects what its source selects · declared Spec
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • impl:protocol.vault-bases: serializes standing query predicates over reader properties as Obsidian Bases · anchored code · src/projections/vault/bases.ts:43
  • impl:protocol.vault-notes: renders reader contexts, declared relations and keyed terms as linked notes · anchored code · src/projections/vault/notes.ts:45
  • oracle:protocol.vault-bases: oracle:protocol.vault-bases · anchored oracle binding · test/vault-examples.test.ts:405
  • test:protocol.consumers.obsidian-vault.bases.views-match-sources: test:protocol.consumers.obsidian-vault.bases.views-match-sources · anchored test binding · binding present · test/vault-examples.test.ts:747
  • spec:consumers.obsidian-vault.bases refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.bases.views-match-sources refines spec:consumers.obsidian-vault.bases · declared
  • spec:consumers.obsidian-vault.bases.views-match-sources verifies spec:consumers.obsidian-vault.bases · declared
  • impl:protocol.vault-bases satisfies spec:consumers.obsidian-vault.bases · anchored
  • impl:protocol.vault-notes satisfies spec:consumers.obsidian-vault.bases · anchored
  • oracle:protocol.vault-bases models spec:consumers.obsidian-vault.bases · anchored
  • test:protocol.consumers.obsidian-vault.bases.views-match-sources verifies spec:consumers.obsidian-vault.bases.views-match-sources · 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.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.vault-bases · serializes standing query predicates over reader properties as Obsidian Bases · src/projections/vault/bases.ts:43

    Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

    None.

  • impl:protocol.vault-notes · renders reader contexts, declared relations and keyed terms as linked notes · src/projections/vault/notes.ts:45

    Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

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

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.obsidian-vault.bases
  • E4: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.bases: A Pack's members and the standing queries are tables over the reader's values
  • spec:consumers.obsidian-vault.bases.views-match-sources: Each standing view selects what its source selects
  • spec:consumers.pack-design: The Pack context carries the Pack's design
  • spec:consumers.obsidian-vault.bases dependsOn spec:consumers.pack-design · declared — a Pack's Base shows the members, rungs and design columns the Pack design assembles
  • spec:consumers.obsidian-vault.bases refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.bases.views-match-sources refines spec:consumers.obsidian-vault.bases · declared
  • spec:consumers.obsidian-vault.bases.views-match-sources verifies spec:consumers.obsidian-vault.bases · 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 · outgoingspec:consumers.pack-design
spec:consumers.pack-design · resolves
declareda Pack's Base shows the members, rungs and design columns the Pack design assemblesNone
refines · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneNone
refines · incomingEach standing view selects what its source selects
spec:consumers.obsidian-vault.bases.views-match-sources · resolves
declaredNoneNone
verifies · incomingEach standing view selects what its source selects
spec:consumers.obsidian-vault.bases.views-match-sources · resolves
declaredNonecorpusBase, packBase, viewsMirrorSources, closedClauses

Bindings

Implementation binding: present

  • impl:protocol.vault-bases · serializes standing query predicates over reader properties as Obsidian Bases · src/projections/vault/bases.ts:43 · role projection · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.vault-notes · renders reader contexts, declared relations and keyed terms as linked notes · src/projections/vault/notes.ts:45 · role projection · component component:protocol.projections · layer edge · context protocol

Design reference: none

Verifier binding: present

Expected-outcome oracle: present

  • oracle:protocol.vault-bases · test/vault-examples.test.ts:405

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

18. Each standing view selects what its source selects

spec:consumers.obsidian-vault.bases.views-match-sources

Each standing view selects what its source selects

spec:consumers.obsidian-vault.bases.views-match-sourcesExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.bases.views-match-sources.sdp.md

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

Intent
outcome
Execute the corpus Base, a Pack's Base and the closed clause grammar against the sources the views mirror, over one graph.
Behavior

Examples

Given a corpus holding a Pack of {members: 6} Specs, with a Spec in every standing view
When the vault command writes the vault
Then each standing view of the corpus Base selects the Specs its source selects: {viewsMatch: true}
Then the Pack's Base selects every member and nothing else: {packMatches: true}
Then every filter clause belongs to the closed grammar: {closedClauses: true}
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.bases.views-match-sources · anchored · test anchor binding present · test/vault-examples.test.ts:747
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.bases.views-match-sources
The diagram as text
  • spec:consumers.obsidian-vault.bases.views-match-sources: Each standing view selects what its source selects · declared Spec
  • spec:consumers.obsidian-vault.bases: A Pack's members and the standing queries are tables over the reader's values · declared Spec
  • test:protocol.consumers.obsidian-vault.bases.views-match-sources: test:protocol.consumers.obsidian-vault.bases.views-match-sources · anchored test binding · binding present · test/vault-examples.test.ts:747
  • spec:consumers.obsidian-vault.bases.views-match-sources refines spec:consumers.obsidian-vault.bases · declared
  • spec:consumers.obsidian-vault.bases.views-match-sources verifies spec:consumers.obsidian-vault.bases · declared
  • test:protocol.consumers.obsidian-vault.bases.views-match-sources verifies spec:consumers.obsidian-vault.bases.views-match-sources · 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

No implementation neighborhood recorded.

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.obsidian-vault.bases.views-match-sources
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault.bases: A Pack's members and the standing queries are tables over the reader's values
  • spec:consumers.obsidian-vault.bases.views-match-sources: Each standing view selects what its source selects
  • spec:consumers.obsidian-vault.bases.views-match-sources refines spec:consumers.obsidian-vault.bases · declared
  • spec:consumers.obsidian-vault.bases.views-match-sources verifies spec:consumers.obsidian-vault.bases · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingA Pack's members and the standing queries are tables over the reader's values
spec:consumers.obsidian-vault.bases · resolves
declaredNoneNone
verifies · outgoingA Pack's members and the standing queries are tables over the reader's values
spec:consumers.obsidian-vault.bases · resolves
declaredNonecorpusBase, packBase, viewsMirrorSources, closedClauses

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.bases.views-match-sources · anchored · test/vault-examples.test.ts:747 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

19. A design pass is followed and answered from the vault

spec:consumers.obsidian-vault.iteration

A design pass is followed and answered from the vault

spec:consumers.obsidian-vault.iterationUse Case / Behavior · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.iteration.sdp.md

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

A design pass is a loop: an agent edits carriers, the graph changes, a person reads the change and answers it. In a vault the reading half is cheap, because Obsidian reloads a note when its file changes, so a vault regenerated as the carriers change shows each edit where the person is already reading. Rewriting only the notes whose bytes changed keeps every other note, and the person's place in it, as it was.

The answering half must not become a second write path. The edit model refuses patches to canonical source from a view, and a person's edit to a generated note would never reach the carrier. So a regeneration refuses while a generated note has changed, and a person composes intent in notes of their own beside the generated ones, citing entries by their block links. An agent turns such a note into a change proposal, runs the proposal check, uses its per-change findings to send moved scopes to a person and apply the remaining changes as ordinary carrier edits, which git records and validation checks.

Intent
outcome
Let a person follow a design pass in the vault as an agent edits the carriers, and answer it from the vault with intent an agent hands off as a change proposal.
risks
  • Regenerating the vault while a person reads could move them off their place or overwrite a note they are editing.
Behavior

The world writes a probe corpus and starts the vault command with --watch, waits for the first run, edits one carrier or adds a comment-form anchor that satisfies the Spec in a new .ts source file, waits for the next run, records each generated file's bytes and modification time before and after, and stops the process with SIGINT.

rule.composeHome line 27 · specs/consumers/obsidian-vault.iteration.sdp.md:27
A person composes intent in notes outside the generated folder, by convention in intent/ at the top of the vault, citing entries by block link or by entry address; the vault command never writes there.

no example exercises it

rule.handOff line 28 · specs/consumers/obsidian-vault.iteration.sdp.md:28
The vault writes no carrier and no proposal.

no example exercises it

rule.watch line 29 · specs/consumers/obsidian-vault.iteration.sdp.md:29
sdp vault --watch runs once and then again after every create, change, delete or rename of a carrier or an anchored source file, a .ts or .tsx file other than a .d.ts, under the root, outside the directories discovery skips, the exclusions, the vault and every path the shared build writes; it runs the loop spec:consumers.validate-watch states, so events during a run coalesce into one pending run, findings, refusals and failed extractions print while the process stays alive, and an operator's SIGINT exits 0 and leaves no temporary under sdp/.

spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · enabled, spec:consumers.obsidian-vault.iteration.watch-source-anchor · enabled

rule.carriersOnlyForValidate line 30 · specs/consumers/obsidian-vault.iteration.sdp.md:30
The vault's source-file watching does not widen sdp validate --watch: validation watches carriers and any rules and parameter files explicitly named with --rules and its --params, but does not watch ordinary source edits.

no example exercises it

rule.inPlace line 31 · specs/consumers/obsidian-vault.iteration.sdp.md:31
A regeneration under --watch writes only the notes whose bytes change and removes the notes whose node or entry left the graph, so a note a person is reading reloads in place and every other note keeps its bytes and modification time.

spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · enabled, spec:consumers.obsidian-vault.iteration.watch-source-anchor · enabled

rule.editGuard line 32 · specs/consumers/obsidian-vault.iteration.sdp.md:32
Every generated note opens with a banner naming the file to edit instead, and a regeneration that finds a generated note changed refuses as spec:consumers.obsidian-vault#rule.guard states, naming it, so a person's edit is never overwritten and the person moves those words into an intent note.

no example exercises it

0 unkeyed rules.

Verifying examples

A carrier edit under watch rewrites only the notes it changes · spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · ready floor ready

Executable Spec

Given a vault the vault command wrote from an extraction root and now watches
When the Spec {specId: "spec:probe.member"} is edited by {edit: "a title change in its carrier"}
Then the note of that Spec shows the new title: {shown: true}
Then every note whose bytes the change leaves alone keeps its modification time: {othersUntouched: true}
Then the watch process stays alive and exits {exitCode: 0} on SIGINT

Open example

An anchor added in a source file under watch rewrites the Spec's note · spec:consumers.obsidian-vault.iteration.watch-source-anchor · ready floor ready

Executable Spec

Given a vault the vault command wrote from an extraction root and now watches
When the Spec {specId: "spec:probe.member"} is edited by {edit: "an anchor added in a source file"}
Then the note of that Spec shows an implementation binding: {bindingShown: true}
Then every note whose bytes the change leaves alone keeps its modification time: {othersUntouched: true}
Then the watch process stays alive and exits {exitCode: 0} on SIGINT

Open example

Example space

Given a vault the vault command wrote from an extraction root and now watches
When the Spec {specId:string} is edited by {edit:"a title change in its carrier"|"an anchor added in a source file"}
Then the note of that Spec shows the new title: {shown:boolean}
Then the note of that Spec shows an implementation binding: {bindingShown:boolean}
Then every note whose bytes the change leaves alone keeps its modification time: {othersUntouched:boolean}
Then the watch process stays alive and exits {exitCode:number} on SIGINT
Verification

Verifier bindings

Example space

  • specId · string · declared by the Spec {specId} is edited by {edit}
  • edit · "a title change in its carrier" | "an anchor added in a source file" · declared by the Spec {specId} is edited by {edit}

Bound points

ExamplespecIdedit
spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes"spec:probe.member""a title change in its carrier"
spec:consumers.obsidian-vault.iteration.watch-source-anchor"spec:probe.member""an anchor added in a source file"

Oracle binding: present · oracle:protocol.vault-iteration · test/vault-examples.test.ts:549

Coverage

specId: "spec:probe.member" · spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes, spec:consumers.obsidian-vault.iteration.watch-source-anchor · not enumerable

edit
Declared valueExamples
"a title change in its carrier"spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes
"an anchor added in a source file"spec:consumers.obsidian-vault.iteration.watch-source-anchor

Unbound

  • specId: None
  • edit: None
Design view

Requirement drawing

Requirement drawing for spec:consumers.obsidian-vault.iteration
Requirement drawing for spec:consumers.obsidian-vault.iterationsatisfies · anchoredsatisfies · anchoredsatisfies · anchoredmodels · anchoredrefines · declaredrefines, verifies · declaredrefines, verifies · declaredverifies · anchoredverifies · anchoredIntended Specsspec:consumers.obsidian-vault.iterationA design pass is followedand answered from the vault…consumers.obsidian-vault.iterationdeclared SpecDeclared verifying examplesspec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notesA carrier edit under watchrewrites only the notes itchanges…consumers.obsidian-vault.iteration.watch-rewrites-changed-notesdeclared Specspec:consumers.obsidian-vault.iteration.watch-source-anchorAn anchor added in a sourcefile under watch rewritesthe Spec's note…consumers.obsidian-vault.iteration.watch-source-anchordeclared SpecSatisfying or referencingunitsimpl:protocol.vault-syncguards every owned entryand records transitionalhashes before atomic filereplacement…protocol.vault-syncanchored codeimpl:protocol.vault-textrenders checked mentionsand escapes Obsidian syntaxoutside code spans…protocol.vault-textanchored codeimpl:protocol.vault-watchreuses the coalescingwatcher with sourcesuffixes and a synchronousvault cycle…protocol.vault-watchanchored codeTest or oracle bindingsoracle:protocol.vault-iterationoracle:protocol.vault-iteration…protocol.vault-iterationanchored oracle bindingtest:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notestest:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes…protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notesanchored test binding ·binding presenttest:protocol.consumers.obsidian-vault.iteration.watch-source-anchortest:protocol.consumers.obsidian-vault.iteration.watch-source-anchor…protocol.consumers.obsidian-vault.iteration.watch-source-anchoranchored test binding ·binding presentOutside the selected setspec:consumers.obsidian-vaultAn Obsidian vault lets aperson iterate on designsfrom the one graph…consumers.obsidian-vaultdeclared Spec
The diagram as text
  • spec:consumers.obsidian-vault.iteration: A design pass is followed and answered from the vault · declared Spec
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes: A carrier edit under watch rewrites only the notes it changes · declared Spec
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor: An anchor added in a source file under watch rewrites the Spec's note · declared Spec
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph · declared Spec
  • impl:protocol.vault-sync: guards every owned entry and records transitional hashes before atomic file replacement · anchored code · src/projections/vault/sync.ts:98
  • impl:protocol.vault-text: renders checked mentions and escapes Obsidian syntax outside code spans · anchored code · src/projections/vault/text.ts:30
  • impl:protocol.vault-watch: reuses the coalescing watcher with source suffixes and a synchronous vault cycle · anchored code · src/cli/vault-command.ts:219
  • oracle:protocol.vault-iteration: oracle:protocol.vault-iteration · anchored oracle binding · test/vault-examples.test.ts:549
  • test:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes: test:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · anchored test binding · binding present · test/vault-examples.test.ts:754
  • test:protocol.consumers.obsidian-vault.iteration.watch-source-anchor: test:protocol.consumers.obsidian-vault.iteration.watch-source-anchor · anchored test binding · binding present · test/vault-examples.test.ts:761
  • spec:consumers.obsidian-vault.iteration refines spec:consumers.obsidian-vault · declared
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes refines spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes verifies spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor refines spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor verifies spec:consumers.obsidian-vault.iteration · declared
  • impl:protocol.vault-sync satisfies spec:consumers.obsidian-vault.iteration · anchored
  • impl:protocol.vault-text satisfies spec:consumers.obsidian-vault.iteration · anchored
  • impl:protocol.vault-watch satisfies spec:consumers.obsidian-vault.iteration · anchored
  • oracle:protocol.vault-iteration models spec:consumers.obsidian-vault.iteration · anchored
  • test:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes verifies spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · anchored
  • test:protocol.consumers.obsidian-vault.iteration.watch-source-anchor verifies spec:consumers.obsidian-vault.iteration.watch-source-anchor · 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.cli · entry points, shared build and publication · src/cli/build-command.ts:32 · layer edge · context protocol

    Uses

    • component:protocol.adapters · external runtime and source adapters · src/adapters/vitest.ts:23 · layer adapter · context protocol
    • component:protocol.codegen · contracts and registrar output · src/codegen/contracts.ts:633 · layer application · context protocol
    • 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.import · canonical conversion with a fidelity boundary · src/import/import.ts:45 · layer application · context protocol
    • component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol
    • component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · 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
  • 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.vault-sync · guards every owned entry and records transitional hashes before atomic file replacement · src/projections/vault/sync.ts:98

    Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

    None.

  • impl:protocol.vault-text · renders checked mentions and escapes Obsidian syntax outside code spans · src/projections/vault/text.ts:30

    Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

    None.

  • impl:protocol.vault-watch · reuses the coalescing watcher with source suffixes and a synchronous vault cycle · src/cli/vault-command.ts:219

    Component: component:protocol.cli · entry points, shared build and publication · src/cli/build-command.ts:32 · 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.obsidian-vault.iteration
Relations of spec:consumers.obsidian-vault.iterationdependsOn · declareddependsOn · declaredrefines · declareddependsOn · declaredrefines · declaredverifies · declaredrefines · declaredverifies · declareddependsOn · declaredOutgoing refinesspec:consumers.obsidian-vaultAn Obsidian vault lets aperson iterate on designsfrom the one graph…obsidian-vaultOutgoing dependsOnspec:consumers.edit-modelViews compose scoped intentinstead of patchingcanonical source…edit-modelspec:consumers.intent-composition.proposalA change proposal isaddressed, based andchecked before it lands…intent-composition.proposalspec:consumers.validate-watchValidation re-runs while anauthor edits carriers…validate-watchSubjectspec:consumers.obsidian-vault.iterationA design pass is followedand answered from the vault…obsidian-vault.iterationIncoming refinesspec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notesA carrier edit under watchrewrites only the notes itchanges…obsidian-vault.iteration.watch-rewrites-changed-notesspec:consumers.obsidian-vault.iteration.watch-source-anchorAn anchor added in a sourcefile under watch rewritesthe Spec's note…obsidian-vault.iteration.watch-source-anchorIncoming dependsOnspec:consumers.vault-on-rampThe vault skill teachesagents to keep an Obsidianvault of the graph…vault-on-ramp
The diagram as text
  • spec:consumers.edit-model: Views compose scoped intent instead of patching canonical source
  • spec:consumers.intent-composition.proposal: A change proposal is addressed, based and checked before it lands
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.iteration: A design pass is followed and answered from the vault
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes: A carrier edit under watch rewrites only the notes it changes
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor: An anchor added in a source file under watch rewrites the Spec's note
  • spec:consumers.validate-watch: Validation re-runs while an author edits carriers
  • spec:consumers.vault-on-ramp: The vault skill teaches agents to keep an Obsidian vault of the graph
  • spec:consumers.obsidian-vault.iteration dependsOn spec:consumers.edit-model · declared — the vault composes intent and never patches a carrier
  • spec:consumers.obsidian-vault.iteration dependsOn spec:consumers.intent-composition.proposal · declared — intent composed in the vault hands off on the one proposal contract
  • spec:consumers.obsidian-vault.iteration dependsOn spec:consumers.validate-watch · declared — the vault's watch runs the same loop over carriers and anchored source files
  • spec:consumers.obsidian-vault.iteration refines spec:consumers.obsidian-vault · declared
  • spec:consumers.vault-on-ramp dependsOn spec:consumers.obsidian-vault.iteration · declared — the skill teaches the watch and the intent notes a design pass is answered in
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes refines spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor refines spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes verifies spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor verifies spec:consumers.obsidian-vault.iteration · 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

  • refines · spec:consumers.obsidian-vault · stated ready, floor ready
  • dependsOn · spec:consumers.edit-model · stated ready, floor ready
  • dependsOn · spec:consumers.intent-composition.proposal · stated ready, floor ready
  • dependsOn · spec:consumers.validate-watch · stated ready, floor ready

Rested on by

Distance 1

Relations

Relation and directionOther endClaimReasonExercised keys
dependsOn · outgoingspec:consumers.edit-model
spec:consumers.edit-model · resolves
declaredthe vault composes intent and never patches a carrierNone
dependsOn · outgoingspec:consumers.intent-composition.proposal
spec:consumers.intent-composition.proposal · resolves
declaredintent composed in the vault hands off on the one proposal contractNone
dependsOn · outgoingspec:consumers.validate-watch
spec:consumers.validate-watch · resolves
declaredthe vault's watch runs the same loop over carriers and anchored source filesNone
refines · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredNoneNone
dependsOn · incomingThe vault skill teaches agents to keep an Obsidian vault of the graph
spec:consumers.vault-on-ramp · resolves
declaredthe skill teaches the watch and the intent notes a design pass is answered inNone
refines · incomingA carrier edit under watch rewrites only the notes it changes
spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · resolves
declaredNoneNone
refines · incomingAn anchor added in a source file under watch rewrites the Spec's note
spec:consumers.obsidian-vault.iteration.watch-source-anchor · resolves
declaredNoneNone
verifies · incomingA carrier edit under watch rewrites only the notes it changes
spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · resolves
declaredNonewatch, inPlace
verifies · incomingAn anchor added in a source file under watch rewrites the Spec's note
spec:consumers.obsidian-vault.iteration.watch-source-anchor · resolves
declaredNonewatch, inPlace

Bindings

Implementation binding: present

  • impl:protocol.vault-sync · guards every owned entry and records transitional hashes before atomic file replacement · src/projections/vault/sync.ts:98 · role publisher · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.vault-text · renders checked mentions and escapes Obsidian syntax outside code spans · src/projections/vault/text.ts:30 · role codec · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.vault-watch · reuses the coalescing watcher with source suffixes and a synchronous vault cycle · src/cli/vault-command.ts:219 · role service · component component:protocol.cli · layer edge · context protocol

Design reference: none

Verifier binding: present

Expected-outcome oracle: present

  • oracle:protocol.vault-iteration · test/vault-examples.test.ts:549

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

20. A carrier edit under watch rewrites only the notes it changes

spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes

A carrier edit under watch rewrites only the notes it changes

spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notesExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.iteration.watch-rewrites-changed-notes.sdp.md

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

Intent
outcome
Execute the vault's watch on one carrier edit and show that every note the edit leaves alone keeps its modification time.
Behavior

Examples

Given a vault the vault command wrote from an extraction root and now watches
When the Spec {specId: "spec:probe.member"} is edited by {edit: "a title change in its carrier"}
Then the note of that Spec shows the new title: {shown: true}
Then every note whose bytes the change leaves alone keeps its modification time: {othersUntouched: true}
Then the watch process stays alive and exits {exitCode: 0} on SIGINT
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · anchored · test anchor binding present · test/vault-examples.test.ts:754
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes
The diagram as text
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes: A carrier edit under watch rewrites only the notes it changes · declared Spec
  • spec:consumers.obsidian-vault.iteration: A design pass is followed and answered from the vault · declared Spec
  • test:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes: test:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · anchored test binding · binding present · test/vault-examples.test.ts:754
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes refines spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes verifies spec:consumers.obsidian-vault.iteration · declared
  • test:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes verifies spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · 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

No implementation neighborhood recorded.

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.obsidian-vault.iteration.watch-rewrites-changed-notes
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault.iteration: A design pass is followed and answered from the vault
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes: A carrier edit under watch rewrites only the notes it changes
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes refines spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes verifies spec:consumers.obsidian-vault.iteration · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingA design pass is followed and answered from the vault
spec:consumers.obsidian-vault.iteration · resolves
declaredNoneNone
verifies · outgoingA design pass is followed and answered from the vault
spec:consumers.obsidian-vault.iteration · resolves
declaredNonewatch, inPlace

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · anchored · test/vault-examples.test.ts:754 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

21. An anchor added in a source file under watch rewrites the Spec's note

spec:consumers.obsidian-vault.iteration.watch-source-anchor

An anchor added in a source file under watch rewrites the Spec's note

spec:consumers.obsidian-vault.iteration.watch-source-anchorExample / Scenario · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/obsidian-vault.iteration.watch-source-anchor.sdp.md

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

Intent
outcome
Execute the vault's watch on a source-file edit, which sdp validate --watch ignores, and show the Spec's note gaining its binding while every other note keeps its bytes.
Behavior

Examples

Given a vault the vault command wrote from an extraction root and now watches
When the Spec {specId: "spec:probe.member"} is edited by {edit: "an anchor added in a source file"}
Then the note of that Spec shows an implementation binding: {bindingShown: true}
Then every note whose bytes the change leaves alone keeps its modification time: {othersUntouched: true}
Then the watch process stays alive and exits {exitCode: 0} on SIGINT
Verification

Verifier bindings

  • test:protocol.consumers.obsidian-vault.iteration.watch-source-anchor · anchored · test anchor binding present · test/vault-examples.test.ts:761
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:consumers.obsidian-vault.iteration.watch-source-anchor
The diagram as text
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor: An anchor added in a source file under watch rewrites the Spec's note · declared Spec
  • spec:consumers.obsidian-vault.iteration: A design pass is followed and answered from the vault · declared Spec
  • test:protocol.consumers.obsidian-vault.iteration.watch-source-anchor: test:protocol.consumers.obsidian-vault.iteration.watch-source-anchor · anchored test binding · binding present · test/vault-examples.test.ts:761
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor refines spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor verifies spec:consumers.obsidian-vault.iteration · declared
  • test:protocol.consumers.obsidian-vault.iteration.watch-source-anchor verifies spec:consumers.obsidian-vault.iteration.watch-source-anchor · 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

No implementation neighborhood recorded.

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.obsidian-vault.iteration.watch-source-anchor
  • E2: verifies · declared
The diagram as text
  • spec:consumers.obsidian-vault.iteration: A design pass is followed and answered from the vault
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor: An anchor added in a source file under watch rewrites the Spec's note
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor refines spec:consumers.obsidian-vault.iteration · declared
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor verifies spec:consumers.obsidian-vault.iteration · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingA design pass is followed and answered from the vault
spec:consumers.obsidian-vault.iteration · resolves
declaredNoneNone
verifies · outgoingA design pass is followed and answered from the vault
spec:consumers.obsidian-vault.iteration · resolves
declaredNonewatch, inPlace

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.consumers.obsidian-vault.iteration.watch-source-anchor · anchored · test/vault-examples.test.ts:761 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

22. The vault skill teaches agents to keep an Obsidian vault of the graph

spec:consumers.vault-on-ramp

The vault skill teaches agents to keep an Obsidian vault of the graph

spec:consumers.vault-on-rampUse Case / Behavior · storyready floor ready

Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

Design: no design entries · no pinned declarations · 1 decision

Findings: no errors, no warnings

specs/consumers/vault-on-ramp.sdp.md

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

A person keeps the vault open beside an agent's design pass and writes notes of their own in it. The agent has to place and refresh the vault without touching those notes, recover a refused run without losing them, and turn them into carrier edits. None of that belongs in the on-ramp for graph questions, so the vault has its own skill and the reading skill points to it.

Intent
outcome
Give an agent a shipped on-ramp that places, synchronizes and recovers the Obsidian vault without losing a person's notes, and turns the intent a person writes there into checked carrier edits.
Behavior
rule.ownSkill line 31 · specs/consumers/vault-on-ramp.sdp.md:31
The vault is taught in its own shipped skill, beside the reading, authoring, session and Studio skills, and the reading skill points to it.

no example exercises it

rule.placement line 32 · specs/consumers/vault-on-ramp.sdp.md:32
The skill teaches choosing the vault directory: --out resolves against the working directory, a vault inside the root lies under a directory discovery skips or an excluded prefix and apart from every path the build writes or removes, and a person opens that directory itself as the vault.

no example exercises it

rule.ownership line 33 · specs/consumers/vault-on-ramp.sdp.md:33
The skill teaches that the command writes only the vault's sdp/ folder, and that a person's notes, intent notes under intent/ by convention, and Obsidian's settings lie outside it.

no example exercises it

rule.synchronize line 34 · specs/consumers/vault-on-ramp.sdp.md:34
The skill teaches synchronizing and watching: sdp vault enters the shared build and removes the five page roots, sdp generate --vault DIR publishes those roots and the vault together, the watch follows carriers and TypeScript sources, and an index that opens with a failed-regeneration warning shows an older graph.

no example exercises it

rule.recover line 35 · specs/consumers/vault-on-ramp.sdp.md:35
The skill teaches recovering a refused run without losing a person's work: name what each refusal means, move the person's words out of sdp/ before deleting a refused path, and keep or delete a changed Base on purpose.

no example exercises it

rule.intentNotes line 36 · specs/consumers/vault-on-ramp.sdp.md:36
The skill teaches turning an intent note into carrier edits: convert its links to ids and entry addresses, write a change proposal against the graph the person read, run the proposal check, send a moved or uncheckable change to a person, and apply the rest through the authoring skill.

no example exercises it

rule.citesLaw line 37 · specs/consumers/vault-on-ramp.sdp.md:37
The skill cites the vault's Specs for law and the verb's --help for its flags, and restates neither.

no example exercises it

0 unkeyed rules.

Verification

Verifier bindings

  • test:protocol.vault-on-ramp · skill-asset checks verify the vault on-ramp against the verb, its guard and its notes · anchored · test anchor binding present · test/skills.test.ts:2002
Design view

Requirement drawing

  • Declared verifying examples: no declared verifying example.
Requirement drawing for spec:consumers.vault-on-ramp
Requirement drawing for spec:consumers.vault-on-rampsatisfies · anchoredrefines · declaredverifies · anchoredIntended Specsspec:consumers.vault-on-rampThe vault skill teachesagents to keep an Obsidianvault of the graph…consumers.vault-on-rampdeclared SpecSatisfying or referencingunitsimpl:protocol.vault-on-rampasserts realization of theshipped vault skill documentimpl:protocol.vault-on-rampanchored codeTest or oracle bindingstest:protocol.vault-on-rampskill-asset checks verifythe vault on-ramp againstthe verb, its guard and itsnotestest:protocol.vault-on-rampanchored test binding ·binding presentOutside the selected setspec:consumers.reading-on-rampThe reading skill teachesagents to query the graph…consumers.reading-on-rampdeclared Spec
The diagram as text
  • spec:consumers.vault-on-ramp: The vault skill teaches agents to keep an Obsidian vault of the graph · declared Spec
  • spec:consumers.reading-on-ramp: The reading skill teaches agents to query the graph · declared Spec
  • impl:protocol.vault-on-ramp: asserts realization of the shipped vault skill document · anchored code · test/skills.test.ts:1995
  • test:protocol.vault-on-ramp: skill-asset checks verify the vault on-ramp against the verb, its guard and its notes · anchored test binding · binding present · test/skills.test.ts:2002
  • spec:consumers.vault-on-ramp refines spec:consumers.reading-on-ramp · declared — a vault note is a person's reading of the one graph, and the skill turns what the person writes beside it into checked edits
  • impl:protocol.vault-on-ramp satisfies spec:consumers.vault-on-ramp · anchored
  • test:protocol.vault-on-ramp verifies spec:consumers.vault-on-ramp · 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

  • The vault's generator owns one folder and synchronizes it

    The vault's generator owns one folder of the vault, sdp/, and keeps there a file list naming every file it wrote with a hash of its content. A .DS_Store file under sdp/ is ignored. A listed .base file a person changed is kept, even when it leaves the generated set, with its recorded content unchanged in the list; the run warns with its path and the words delete it to regenerate and goes on. For every other file, a run refuses, writing and removing nothing, while that folder holds a file the list does not name or one whose content the list does not record. Otherwise it synchronizes the folder: it writes the files whose content changed, leaves the others untouched, and removes the files it wrote that the graph no longer holds. The vault is not one of the projection roots the shared build rewrites: no build removes it, a vault directory where the build writes or removes is refused, and only the vault's synchronization writes it, whether sdp vault or the verb that writes every projection root runs it.

Runtime
  • impl:protocol.vault-on-ramp · asserts realization of the shipped vault skill document · test/skills.test.ts:1995

    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.vault-on-ramp
Relations of spec:consumers.vault-on-rampdependsOn · declareddependsOn · declareddependsOn · declareddependsOn · declaredrefines · declareddecidedBy · declaredOutgoing refinesspec:consumers.reading-on-rampThe reading skill teachesagents to query the graph…consumers.reading-on-rampOutgoing dependsOnspec:consumers.intent-compositionComposed intent hands offon one proposal shape…consumers.intent-compositionspec:consumers.obsidian-vaultAn Obsidian vault lets aperson iterate on designsfrom the one graph…consumers.obsidian-vaultspec:consumers.obsidian-vault.iterationA design pass is followedand answered from the vault…consumers.obsidian-vault.iterationspec:consumers.obsidian-vault.notesEvery Spec, Pack, code unitand keyed term is a note,and every relation is a link…consumers.obsidian-vault.notesOutgoing decidedByspec:decisions.vault-owned-folderThe vault's generator ownsone folder and synchronizesit…decisions.vault-owned-folderSubjectspec:consumers.vault-on-rampThe vault skill teachesagents to keep an Obsidianvault of the graph…consumers.vault-on-ramp
The diagram as text
  • spec:consumers.intent-composition: Composed intent hands off on one proposal shape
  • spec:consumers.obsidian-vault: An Obsidian vault lets a person iterate on designs from the one graph
  • spec:consumers.obsidian-vault.iteration: A design pass is followed and answered from the vault
  • spec:consumers.obsidian-vault.notes: Every Spec, Pack, code unit and keyed term is a note, and every relation is a link
  • spec:consumers.reading-on-ramp: The reading skill teaches agents to query the graph
  • spec:consumers.vault-on-ramp: The vault skill teaches agents to keep an Obsidian vault of the graph
  • spec:decisions.vault-owned-folder: The vault's generator owns one folder and synchronizes it
  • spec:consumers.vault-on-ramp decidedBy spec:decisions.vault-owned-folder · declared — the skill keeps a person's notes outside the one folder the command owns
  • spec:consumers.vault-on-ramp dependsOn spec:consumers.intent-composition · declared — intent written in the vault is applied through a checked change proposal
  • spec:consumers.vault-on-ramp dependsOn spec:consumers.obsidian-vault · declared — the skill teaches the verb, where the vault may lie and the guard's refusals
  • spec:consumers.vault-on-ramp dependsOn spec:consumers.obsidian-vault.iteration · declared — the skill teaches the watch and the intent notes a design pass is answered in
  • spec:consumers.vault-on-ramp dependsOn spec:consumers.obsidian-vault.notes · declared — the skill converts a note name or block id back to the id or entry address it names
  • spec:consumers.vault-on-ramp refines spec:consumers.reading-on-ramp · declared — a vault note is a person's reading of the one graph, and the skill turns what the person writes beside it into checked edits
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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
decidedBy · outgoingThe vault's generator owns one folder and synchronizes it
spec:decisions.vault-owned-folder · resolves
declaredthe skill keeps a person's notes outside the one folder the command ownsNone
dependsOn · outgoingspec:consumers.intent-composition
spec:consumers.intent-composition · resolves
declaredintent written in the vault is applied through a checked change proposalNone
dependsOn · outgoingAn Obsidian vault lets a person iterate on designs from the one graph
spec:consumers.obsidian-vault · resolves
declaredthe skill teaches the verb, where the vault may lie and the guard's refusalsNone
dependsOn · outgoingA design pass is followed and answered from the vault
spec:consumers.obsidian-vault.iteration · resolves
declaredthe skill teaches the watch and the intent notes a design pass is answered inNone
dependsOn · outgoingEvery Spec, Pack, code unit and keyed term is a note, and every relation is a link
spec:consumers.obsidian-vault.notes · resolves
declaredthe skill converts a note name or block id back to the id or entry address it namesNone
refines · outgoingspec:consumers.reading-on-ramp
spec:consumers.reading-on-ramp · resolves
declareda vault note is a person's reading of the one graph, and the skill turns what the person writes beside it into checked editsNone

Bindings

Implementation binding: present

  • impl:protocol.vault-on-ramp · asserts realization of the shipped vault skill document · test/skills.test.ts:1995

Design reference: none

Verifier binding: present

  • test:protocol.vault-on-ramp · skill-asset checks verify the vault on-ramp against the verb, its guard and its notes · anchored · test/skills.test.ts:2002 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

23. A Model term may carry a key that addresses it

spec:model.term-addresses

A Model term may carry a key that addresses it

spec:model.term-addressesBusiness Rule · storyready floor ready

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

Design: 10 design entries · 7 pinned declarations · 2 decisions

Findings: no errors, no warnings

specs/model/term-addresses.sdp.md

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

A Model section defines a Spec's terms, and prose names those terms by word. A word is not a checked entry address, so a view cannot resolve it to one authored definition, and a renamed term leaves every sentence that names it silently stale. Design, UI, question and rule entries already carry keys that a mention addresses and validation checks; a key gives a Model term the same. The key is authored in a marker, as a rule's is, rather than derived from the term: a derived key would change, and break every address, whenever the term is reworded. The address segment is term, because an address names the kind of entry it reaches, as question and rule do, and the Model section's own prose is not an entry. The ratified glossary stays a document, beside the graph and outside it, so its terms gain no address; a term gains one where a Spec defines it.

Intent
problem
Prose that names a concept a Model section defines has no checked way to point at that definition, so a view cannot link it and a renamed term breaks its readers silently.
outcome
Let a Model term carry a key, addressed as spec:<id>#term.<key>, so prose cites a concept as a checked mention and every view links it exactly.
Rule

The world writes two carriers in one extraction root. The first is a story-altitude model Spec stating scoped, with an Intent outcome and a Model section holding the entries the terms slot joins with a semicolon and a space, in the carrier the slot names: in Markdown one line each, as written, and in TypeScript a .sdp.ts carrier whose model.terms object maps each entry's term to its definition, marker included. The second is a Markdown story-altitude rule Spec stating idea, with an Intent outcome and one rule; its narrative names the address, and it declares dependsOn on the first. A finding read is the first extraction finding, and an empty slot value means the extraction reports none; the term keys of every Spec in the graph are joined by a comma and a space. resolved is true when address resolution gives the address a resolving row whose value is the definition without its marker and whose file and line are those of the term's row in the location table. found is true when entry search for the words of the term that carries the address's key returns a row with that address and that line. The audit reason is the reason of the mention audit's unresolved row for the address, and empty when it lists none. The import reads the first carrier as written in TypeScript: the world imports it to Markdown, reads the emitted Model entry of its first term, extracts the imported carrier in a fresh root, and compares its term keys and definitions with the TypeScript graph's.

rule.termMarker line 32 · specs/model/term-addresses.sdp.md:32
A Model term may carry an optional key in a marker that opens its definition, after the bold term and the em dash, as in - **step key** — [#stepKey] the key a step carries; the TypeScript carrier writes the same marker at the start of the definition string. The key follows the entry-address key grammar, and an unkeyed term stays lawful and has no address. Importing a TypeScript carrier to Markdown writes the marker on the term that carries the key.

spec:model.term-addresses.keyed-term-resolves · enabled, spec:model.term-addresses.malformed-term-marker-refused · enabled, spec:model.term-addresses.typescript-term-imports-keyed · enabled

rule.authoredKey line 33 · specs/model/term-addresses.sdp.md:33
The key is authored and never derived from the term, so rewording a term or its definition keeps its address, while renaming or removing the key fails validation in every Spec that addresses it.

spec:model.term-addresses.unknown-term-key-refused · enabled

rule.uniqueTermKeys line 34 · specs/model/term-addresses.sdp.md:34
A term key is unique among the Model terms of one Spec. Term keys and the Spec's Design, UI, question and rule keys sit under different address segments and stay apart.

spec:model.term-addresses.repeated-term-key-refused · enabled

rule.markerRefusals line 35 · specs/model/term-addresses.sdp.md:35
A definition that opens with [# and does not continue as a marker is refused at its term, and a repeated term key is refused at each term that carries it; a refused Markdown carrier is refused whole, as for every structure refusal, and in the TypeScript carrier the key drops at each site and the Spec stays.

spec:model.term-addresses.malformed-term-marker-refused · enabled, spec:model.term-addresses.repeated-term-key-refused · enabled

rule.termAddress line 36 · specs/model/term-addresses.sdp.md:36
A keyed term is addressed as spec:<id>#term.<key>. The address parses, is refused in every id slot as every entry address is, and resolves while the Spec's model.termKeys carries the key; a mention of a term key the Spec does not carry is a prose-mentions error.

spec:model.term-addresses.keyed-term-resolves · enabled, spec:model.term-addresses.typescript-term-imports-keyed · enabled, spec:model.term-addresses.unknown-term-key-refused · enabled

rule line 37 · specs/model/term-addresses.sdp.md:37
The ratified glossary stays a document, so its terms gain no address; a term gains one where a Spec defines it in a Model section.
rule.termLocations line 38 · specs/model/term-addresses.sdp.md:38
The location table records every Model term its carrier locates, keyed or not, as term[<i>], with <i> the term's position among the Spec's terms in authored order and key beside a keyed term.

spec:model.term-addresses.keyed-term-resolves · enabled

rule.termReaders line 39 · specs/model/term-addresses.sdp.md:39
Address resolution resolves a term address to the term's definition with its file and line, entry search gives a keyed term its address and matches term keys as it matches rule keys, and the mention audit reports a term key the Spec does not carry as a missing entry.

spec:model.term-addresses.keyed-term-resolves · enabled, spec:model.term-addresses.unknown-term-key-refused · enabled

rule line 40 · specs/model/term-addresses.sdp.md:40
A term key mints no edge, confers no delivery fact and moves no readiness floor, and exercises names rule keys only. A term promoted to a model Spec of its own leaves its address behind, because promotion moves the content out, and every mention of the address fails until it names the new Spec.

2 unkeyed rules.

Verifying examples

spec:model.term-addresses.keyed-term-resolves · spec:model.term-addresses.keyed-term-resolves · ready floor ready

Executable Spec

Given a {carrier: "Markdown"} Spec carrier {specId: "spec:probe.subject"} whose Model terms read {terms: "- **step key** — [#stepKey] the key a step carries in its marker; - **slot** — one typed placeholder in a step"}
Given a second Spec that names {address: "spec:probe.subject#term.stepKey"} in its narrative and declares dependsOn on the first
When the extractor reifies both carriers and the graph is validated
Then the first carrier is reified: {reified: true}
Then the first extraction finding's message contains {extractMessage: ""}
Then the graph holds the term keys {keys: "stepKey"}
Then the report holds {mentionErrors: 0} prose-mention errors
Then address resolution resolves the address to the marker-free definition at its recorded term location: {resolved: true}
Then entry search for the addressed term's words finds it at that same address and line: {found: true}

spec:model.term-addresses.keyed-term-resolves

spec:model.term-addresses.malformed-term-marker-refused · spec:model.term-addresses.malformed-term-marker-refused · ready floor ready

Executable Spec

Given a {carrier: "Markdown"} Spec carrier {specId: "spec:probe.subject"} whose Model terms read {terms: "- **step key** — [#step-key] the key a step carries in its marker"}
Given a second Spec that names {address: "spec:probe.subject#term.stepKey"} in its narrative and declares dependsOn on the first
When the extractor reifies both carriers and the graph is validated
Then the first carrier is reified: {reified: false}
Then the first extraction finding's message contains {extractMessage: "term key markers must be [#<lower-camel ASCII key>] followed by one space and text"}
Then the graph holds the term keys {keys: ""}
Then the report holds {mentionErrors: 1} prose-mention errors

spec:model.term-addresses.malformed-term-marker-refused

spec:model.term-addresses.repeated-term-key-refused · spec:model.term-addresses.repeated-term-key-refused · ready floor ready

Executable Spec

Given a {carrier: "Markdown"} Spec carrier {specId: "spec:probe.subject"} whose Model terms read {terms: "- **step key** — [#stepKey] the key a step carries in its marker; - **term key** — [#stepKey] the key a Model term carries in its marker"}
Given a second Spec that names {address: "spec:probe.subject#term.stepKey"} in its narrative and declares dependsOn on the first
When the extractor reifies both carriers and the graph is validated
Then the first carrier is reified: {reified: false}
Then the first extraction finding's message contains {extractMessage: "is repeated; term keys must be unique within a Spec"}
Then the graph holds the term keys {keys: ""}
Then the report holds {mentionErrors: 1} prose-mention errors

spec:model.term-addresses.repeated-term-key-refused

spec:model.term-addresses.typescript-term-imports-keyed · spec:model.term-addresses.typescript-term-imports-keyed · ready floor ready

Executable Spec

Given a {carrier: "TypeScript"} Spec carrier {specId: "spec:probe.subject"} whose Model terms read {terms: "- **step key** — [#stepKey] the key a step carries in its marker"}
Given a second Spec that names {address: "spec:probe.subject#term.stepKey"} in its narrative and declares dependsOn on the first
When the extractor reifies both carriers and the graph is validated
Then the first carrier is reified: {reified: true}
Then the first extraction finding's message contains {extractMessage: ""}
Then the graph holds the term keys {keys: "stepKey"}
Then the report holds {mentionErrors: 0} prose-mention errors
Then the first carrier imported to Markdown writes the entry {importedEntry: "- **step key** — [#stepKey] the key a step carries in its marker"} and keeps its term keys and definitions: {keptOnImport: true}

spec:model.term-addresses.typescript-term-imports-keyed

spec:model.term-addresses.unknown-term-key-refused · spec:model.term-addresses.unknown-term-key-refused · ready floor ready

Executable Spec

Given a {carrier: "Markdown"} Spec carrier {specId: "spec:probe.subject"} whose Model terms read {terms: "- **step key** — [#stepLabel] the key a step carries in its marker"}
Given a second Spec that names {address: "spec:probe.subject#term.stepKey"} in its narrative and declares dependsOn on the first
When the extractor reifies both carriers and the graph is validated
Then the first carrier is reified: {reified: true}
Then the first extraction finding's message contains {extractMessage: ""}
Then the graph holds the term keys {keys: "stepLabel"}
Then the report holds {mentionErrors: 1} prose-mention errors
Then the mention audit lists the address as unresolved with reason {auditReason: "entry"}

spec:model.term-addresses.unknown-term-key-refused

Example space

Given a {carrier:"Markdown"|"TypeScript"} Spec carrier {specId:string} whose Model terms read {terms:string}
Given a second Spec that names {address:string} in its narrative and declares dependsOn on the first
When the extractor reifies both carriers and the graph is validated
Then the first carrier is reified: {reified:boolean}
Then the first extraction finding's message contains {extractMessage:string}
Then the graph holds the term keys {keys:string}
Then the report holds {mentionErrors:number} prose-mention errors
Then address resolution resolves the address to the marker-free definition at its recorded term location: {resolved:boolean}
Then entry search for the addressed term's words finds it at that same address and line: {found:boolean}
Then the mention audit lists the address as unresolved with reason {auditReason:string}
Then the first carrier imported to Markdown writes the entry {importedEntry:string} and keeps its term keys and definitions: {keptOnImport:boolean}
Design
termMarker line 60 · specs/model/term-addresses.sdp.md:60
- **<term>** — [#<key>] <definition> is a keyed Model entry in Markdown and terms: { "<term>": "[#<key>] <definition>" } in TypeScript; <key> matches ^[a-z][A-Za-z0-9]*$, and a marker later in the definition is plain text.

no citation recorded

termKeysField line 61 · specs/model/term-addresses.sdp.md:61
model.termKeys maps each key to the term it names, as authored, in authored order; the definitions hold the text with the marker removed; a Spec with no keyed term carries no termKeys, and the serialized graph writes it after terms.

no citation recorded

markerRefusal line 62 · specs/model/term-addresses.sdp.md:62
term key markers must be [#<lower-camel ASCII key>] followed by one space and text is the message, as the finding extract/unrecognized-property at severity error, at path model.terms.<term>.

no citation recorded

repeatedKey line 63 · specs/model/term-addresses.sdp.md:63
term key "<key>" is repeated; term keys must be unique within a Spec is the message, as the same finding, at each term that carries the key.

no citation recorded

addressSections line 64 · specs/model/term-addresses.sdp.md:64
ENTRY_ADDRESS_SECTIONS is ["design", "ui", "question", "rule", "term"], and parseId refuses any other segment with entry address must be <section>.<key> with section design, ui, question, rule, or term.

no citation recorded

missingTerm line 65 · specs/model/term-addresses.sdp.md:65
Mention in "<spec>" at <path> points to missing entry "term.<key>" of "<target>". is the prose-mentions error for a term key the target does not carry.

no citation recorded

termLocation line 66 · specs/model/term-addresses.sdp.md:66
{ spec, file, entry: "term[<i>]", key?, line } is a term's row in the location table; a mention in a definition, at model.terms.<term>, takes that row's line.

no citation recorded

resolutionRow line 67 · specs/model/term-addresses.sdp.md:67
address resolution (recipe 25) reads term through model.termKeys; a resolving row gives the marker-free definition as value and its recorded file and line. A section or entry miss gives the available term keys sorted in code-unit order. The grammar text is spec:<id>#<section>.<key>, section design, ui, question, rule, or term; key lower-camel ASCII.
searchRow line 68 · specs/model/term-addresses.sdp.md:68
entry search (recipe 23) gives a matching keyed term, in section model and entry terms.<term>, the address spec:<id>#term.<key> and the line of its term[<i>] row, matches the term key as it matches a rule key, and never walks termKeys as content.
importEmitter line 69 · specs/model/term-addresses.sdp.md:69
the TypeScript-to-Markdown import writes a keyed term as - **<term>** — [#<key>] <definition>, so a keyed TypeScript term imports keyed.
Verification

Verifier bindings

  • spec:model.term-addresses.keyed-term-resolves · A keyed term is reified and its address resolves · declared · example enabled · specs/model/term-addresses.keyed-term-resolves.sdp.md
  • spec:model.term-addresses.malformed-term-marker-refused · A term marker whose key is off the grammar refuses its carrier · declared · example enabled · specs/model/term-addresses.malformed-term-marker-refused.sdp.md
  • spec:model.term-addresses.repeated-term-key-refused · A term key repeated in one Spec refuses its carrier · declared · example enabled · specs/model/term-addresses.repeated-term-key-refused.sdp.md
  • spec:model.term-addresses.typescript-term-imports-keyed · A keyed TypeScript term keeps its address through import to Markdown · declared · example enabled · specs/model/term-addresses.typescript-term-imports-keyed.sdp.md
  • spec:model.term-addresses.unknown-term-key-refused · An address that names a term key no term carries is an error · declared · example enabled · specs/model/term-addresses.unknown-term-key-refused.sdp.md
  • test:protocol.keyed-content · anchored · test anchor binding present · test/keyed-content.test.ts:28

Example space

  • carrier · "Markdown" | "TypeScript" · declared by a {carrier} Spec carrier {specId} whose Model terms read {terms}
  • specId · string · declared by a {carrier} Spec carrier {specId} whose Model terms read {terms}
  • terms · string · declared by a {carrier} Spec carrier {specId} whose Model terms read {terms}
  • address · string · declared by a second Spec that names {address} in its narrative and declares dependsOn on the first

Bound points

ExamplecarrierspecIdtermsaddress
spec:model.term-addresses.keyed-term-resolves"Markdown""spec:probe.subject""- **step key** — [#stepKey] the key a step carries in its marker; - **slot** — one typed placeholder in a step""spec:probe.subject#term.stepKey"
spec:model.term-addresses.malformed-term-marker-refused"Markdown""spec:probe.subject""- **step key** — [#step-key] the key a step carries in its marker""spec:probe.subject#term.stepKey"
spec:model.term-addresses.repeated-term-key-refused"Markdown""spec:probe.subject""- **step key** — [#stepKey] the key a step carries in its marker; - **term key** — [#stepKey] the key a Model term carries in its marker""spec:probe.subject#term.stepKey"
spec:model.term-addresses.typescript-term-imports-keyed"TypeScript""spec:probe.subject""- **step key** — [#stepKey] the key a step carries in its marker""spec:probe.subject#term.stepKey"
spec:model.term-addresses.unknown-term-key-refused"Markdown""spec:probe.subject""- **step key** — [#stepLabel] the key a step carries in its marker""spec:probe.subject#term.stepKey"

Oracle binding: none

Coverage

carrier
Declared valueExamples
"Markdown"spec:model.term-addresses.keyed-term-resolves, spec:model.term-addresses.malformed-term-marker-refused, spec:model.term-addresses.repeated-term-key-refused, spec:model.term-addresses.unknown-term-key-refused
"TypeScript"spec:model.term-addresses.typescript-term-imports-keyed

specId: "spec:probe.subject" · spec:model.term-addresses.keyed-term-resolves, spec:model.term-addresses.malformed-term-marker-refused, spec:model.term-addresses.repeated-term-key-refused, spec:model.term-addresses.typescript-term-imports-keyed, spec:model.term-addresses.unknown-term-key-refused · not enumerable

terms: "- **step key** — [#stepKey] the key a step carries in its marker; - **slot** — one typed placeholder in a step" · spec:model.term-addresses.keyed-term-resolves; "- **step key** — [#step-key] the key a step carries in its marker" · spec:model.term-addresses.malformed-term-marker-refused; "- **step key** — [#stepKey] the key a step carries in its marker; - **term key** — [#stepKey] the key a Model term carries in its marker" · spec:model.term-addresses.repeated-term-key-refused; "- **step key** — [#stepKey] the key a step carries in its marker" · spec:model.term-addresses.typescript-term-imports-keyed; "- **step key** — [#stepLabel] the key a step carries in its marker" · spec:model.term-addresses.unknown-term-key-refused · not enumerable

address: "spec:probe.subject#term.stepKey" · spec:model.term-addresses.keyed-term-resolves, spec:model.term-addresses.malformed-term-marker-refused, spec:model.term-addresses.repeated-term-key-refused, spec:model.term-addresses.typescript-term-imports-keyed, spec:model.term-addresses.unknown-term-key-refused · not enumerable

Unbound

  • carrier: None
  • specId: None
  • terms: None
  • address: None
Design view

Requirement drawing

Requirement drawing for spec:model.term-addresses
Requirement drawing for spec:model.term-addressessatisfies · anchoredrefines, verifies · declaredrefines · declaredverifies · anchoredIntended Specsspec:model.term-addressesA Model term may carry akey that addresses it…model.term-addressesdeclared SpecDeclared verifying examples5 verifying examples · declared; 5 test bindings · anchored, folded5 verifying examples ·declared5 test bindings · anchored ·foldedSatisfying or referencingunits9 satisfying units · anchored, folded9 satisfying units ·anchoredTest or oracle bindingstest:protocol.keyed-contenttest:protocol.keyed-content…protocol.keyed-contentanchored test binding ·binding presentOutside the selected setspec:model.spec-sectionsSpec sections carry typeddetail and direct verifiersemantics…model.spec-sectionsdeclared Spec
The diagram as text
  • spec:model.term-addresses: A Model term may carry a key that addresses it · declared Spec
  • spec:model.term-addresses.keyed-term-resolves: A keyed term is reified and its address resolves · declared Spec
  • spec:model.term-addresses.malformed-term-marker-refused: A term marker whose key is off the grammar refuses its carrier · declared Spec
  • spec:model.term-addresses.repeated-term-key-refused: A term key repeated in one Spec refuses its carrier · declared Spec
  • spec:model.term-addresses.typescript-term-imports-keyed: A keyed TypeScript term keeps its address through import to Markdown · declared Spec
  • spec:model.term-addresses.unknown-term-key-refused: An address that names a term key no term carries is an error · declared Spec
  • spec:model.spec-sections: Spec sections carry typed detail and direct verifier semantics · declared Spec
  • impl:protocol.address-and-cycle-recipes: asserts realization of the shipped address resolution and dependency cycle recipes · anchored code · test/recipes.test.ts:3568
  • impl:protocol.entry-locations: builds the carrier entry location table · anchored code · src/extract/derive.ts:78
  • impl:protocol.key-markers: normalizes step and term markers across the three carriers · anchored code · src/extract/key-markers.ts:136
  • impl:protocol.open-section-order: preserves authored open-section and model-term order and Pack field order · anchored code · src/extract/serialize.ts:105
  • impl:protocol.prose-mentions: checks that prose mentions resolve and warns once per unbacked Spec pair · anchored code · src/validate/validators.ts:1370
  • impl:protocol.register-recipes: asserts realization of the shipped register recipes · anchored code · test/recipes.test.ts:2057
  • impl:protocol.sdp-import-markdown-emit: emits the Markdown document twin for an imported Spec · anchored code · src/import/emit-markdown.ts:253
  • impl:protocol.spec-sections: typed Spec section shapes · anchored code · src/model/sections.ts:138
  • impl:protocol.stable-ids: stable ID grammar parser · anchored code · src/ids.ts:173
  • test:protocol.keyed-content: test:protocol.keyed-content · anchored test binding · binding present · test/keyed-content.test.ts:28
  • test:protocol.term-addresses.keyed-term-resolves: test:protocol.term-addresses.keyed-term-resolves · anchored test binding · binding present · test/self-hosting-term-addresses.test.ts:16
  • test:protocol.term-addresses.malformed-term-marker-refused: test:protocol.term-addresses.malformed-term-marker-refused · anchored test binding · binding present · test/self-hosting-term-addresses.test.ts:63
  • test:protocol.term-addresses.repeated-term-key-refused: test:protocol.term-addresses.repeated-term-key-refused · anchored test binding · binding present · test/self-hosting-term-addresses.test.ts:110
  • test:protocol.term-addresses.typescript-term-imports-keyed: test:protocol.term-addresses.typescript-term-imports-keyed · anchored test binding · binding present · test/self-hosting-term-addresses.test.ts:157
  • test:protocol.term-addresses.unknown-term-key-refused: test:protocol.term-addresses.unknown-term-key-refused · anchored test binding · binding present · test/self-hosting-term-addresses.test.ts:204
  • spec:model.term-addresses refines spec:model.spec-sections · declared — extends entry addresses to the terms a Model section defines
  • spec:model.term-addresses.keyed-term-resolves refines spec:model.term-addresses · declared
  • spec:model.term-addresses.keyed-term-resolves verifies spec:model.term-addresses · declared
  • spec:model.term-addresses.malformed-term-marker-refused refines spec:model.term-addresses · declared
  • spec:model.term-addresses.malformed-term-marker-refused verifies spec:model.term-addresses · declared
  • spec:model.term-addresses.repeated-term-key-refused refines spec:model.term-addresses · declared
  • spec:model.term-addresses.repeated-term-key-refused verifies spec:model.term-addresses · declared
  • spec:model.term-addresses.typescript-term-imports-keyed refines spec:model.term-addresses · declared
  • spec:model.term-addresses.typescript-term-imports-keyed verifies spec:model.term-addresses · declared
  • spec:model.term-addresses.unknown-term-key-refused refines spec:model.term-addresses · declared
  • spec:model.term-addresses.unknown-term-key-refused verifies spec:model.term-addresses · declared
  • impl:protocol.address-and-cycle-recipes satisfies spec:model.term-addresses · anchored
  • impl:protocol.entry-locations satisfies spec:model.term-addresses · anchored
  • impl:protocol.key-markers satisfies spec:model.term-addresses · anchored
  • impl:protocol.open-section-order satisfies spec:model.term-addresses · anchored
  • impl:protocol.prose-mentions satisfies spec:model.term-addresses · anchored
  • impl:protocol.register-recipes satisfies spec:model.term-addresses · anchored
  • impl:protocol.sdp-import-markdown-emit satisfies spec:model.term-addresses · anchored
  • impl:protocol.spec-sections satisfies spec:model.term-addresses · anchored
  • impl:protocol.stable-ids satisfies spec:model.term-addresses · anchored
  • test:protocol.keyed-content verifies spec:model.term-addresses · anchored
  • test:protocol.term-addresses.keyed-term-resolves verifies spec:model.term-addresses.keyed-term-resolves · anchored
  • test:protocol.term-addresses.malformed-term-marker-refused verifies spec:model.term-addresses.malformed-term-marker-refused · anchored
  • test:protocol.term-addresses.repeated-term-key-refused verifies spec:model.term-addresses.repeated-term-key-refused · anchored
  • test:protocol.term-addresses.typescript-term-imports-keyed verifies spec:model.term-addresses.typescript-term-imports-keyed · anchored
  • test:protocol.term-addresses.unknown-term-key-refused verifies spec:model.term-addresses.unknown-term-key-refused · anchored
Mermaid source

Copyable source; the Studio draws static SVG.

Preferred syntax: requirementDiagram. Chosen syntax: flowchart TB because folds require exact labels unavailable in requirement syntax.

Decisions

  • spec:decisions.checked-mentions

    A Spec id in narrative or section text, outside gwt and gwt-vocabulary fences, is a mention. A mention that does not resolve is a conformance error. A mention of another Spec that shares no declared relation with the mentioning Spec, in either direction, is one warning per mentioning Spec and target Spec pair, whatever the number of locations; an address on the mentioning Spec's own id is checked for its entry and never warned. An entry address is a Spec id followed by #, the section name design, ui, question, rule, or term, a dot, and the entry's lower-camel ASCII key, as in spec:<id>#design.<key> or spec:<id>#question.<key>. A design or ui address resolves when the Spec exists and that section holds the key as its own key, other than description; a question address resolves when the Spec exists and one of its open questions carries that key; a term address resolves when the Spec exists and one of its Model terms carries that key. The # sub-part is reserved for the entry address in every namespace: a Spec's own id, a relation target, a Pack member or model reference, an anchor id or target, and the specId and ref builders all refuse it. A mention mints no edge, and the reader gains no join.

  • spec:decisions.shipped-projections-frozen

    Re-specifying the shipped Design Review, census, Mermaid, or Gherkin projection is refused. These four projections are the ruled read surfaces over the one graph. A later decision Spec that supersedes this one replaces the ruling whole; a decision Spec that refines this one narrows it for one projection or one rendering and leaves the rest frozen. Either passes the ADR three-part test.

Runtime
  • component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · 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.import · canonical conversion with a fidelity boundary · src/import/import.ts:45 · layer application · context protocol

    Uses

    • component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · 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.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol

    Uses

    None.

  • component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · 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
  • impl:protocol.address-and-cycle-recipes · asserts realization of the shipped address resolution and dependency cycle recipes · test/recipes.test.ts:3568

    Uses

    None.

  • impl:protocol.entry-locations · builds the carrier entry location table · src/extract/derive.ts:78

    Component: component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · context protocol

    Uses

    None.

  • impl:protocol.key-markers · normalizes step and term markers across the three carriers · src/extract/key-markers.ts:136

    Component: component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · context protocol

    Uses

    None.

  • impl:protocol.open-section-order · preserves authored open-section and model-term order and Pack field order · src/extract/serialize.ts:105

    Component: component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · context protocol

    Uses

    None.

  • impl:protocol.prose-mentions · checks that prose mentions resolve and warns once per unbacked Spec pair · src/validate/validators.ts:1370

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

    Uses

    None.

  • impl:protocol.register-recipes · asserts realization of the shipped register recipes · test/recipes.test.ts:2057

    Uses

    None.

  • impl:protocol.sdp-import-markdown-emit · emits the Markdown document twin for an imported Spec · src/import/emit-markdown.ts:253

    Component: component:protocol.import · canonical conversion with a fidelity boundary · src/import/import.ts:45 · layer application · context protocol

    Uses

    None.

  • impl:protocol.spec-sections · typed Spec section shapes · src/model/sections.ts:138

    Component: component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol

    Uses

    None.

  • impl:protocol.stable-ids · stable ID grammar parser · src/ids.ts:173

    Component: component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · 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:model.term-addresses
Relations of spec:model.term-addressesdecidedBy · declareddecidedBy · declareddependsOn · declareddependsOn · declaredrefines · declareddependsOn · declareddependsOn · declaredrefines · declaredverifies · declaredOutgoing refinesspec:model.spec-sectionsSpec sections carry typeddetail and direct verifiersemantics…model.spec-sectionsOutgoing dependsOnspec:extraction.entry-locationsThe graph records whereeach addressable entry iswritten…extraction.entry-locationsspec:model.rule-keysA rule or flow entry maycarry a key that addressesit…model.rule-keysspec:model.stable-idsStable IDs are theProtocol's durable join key…model.stable-idsOutgoing decidedByspec:decisions.checked-mentionsA Spec id written in proseis a checked mention…decisions.checked-mentionsspec:decisions.shipped-projections-frozenThe shipped projectionsstay frozen…decisions.shipped-projections-frozenSubjectspec:model.term-addressesA Model term may carry akey that addresses it…model.term-addressesIncoming refinesspec:model.term-addresses.fold.Incoming.refines5 Incoming refines, folded…model.term-addresses.fold.Incoming.refinesIncoming dependsOnspec:model.term-addresses.fold.Incoming.dependsOn8 Incoming dependsOn, folded…model.term-addresses.fold.Incoming.dependsOn
The diagram as text
  • spec:carrier.markdown-body-grammar: The Markdown body accepts one closed form per section
  • spec:consumers.agent-surface.address-and-cycle-recipes: Address resolution and dependency cycles stay executable graph recipes
  • spec:consumers.agent-surface.register-recipes: Register questions stay executable graph recipes
  • spec:consumers.obsidian-vault.notes: Every Spec, Pack, code unit and keyed term is a note, and every relation is a link
  • spec:consumers.spec-studio.glossary-page: The glossary page lists every term the corpus's Specs define
  • spec:consumers.spec-studio.spec-page: A Spec page shows one Spec in collapsible panels, in a fixed order
  • spec:consumers.upgrade-kit.capability-adoption: Capability adoption counts where each capability is used and where it could apply
  • spec:decisions.checked-mentions: A Spec id written in prose is a checked mention
  • spec:decisions.shipped-projections-frozen: The shipped projections stay frozen
  • spec:extraction.entry-locations: The graph records where each addressable entry is written
  • spec:model.rule-keys: A rule or flow entry may carry a key that addresses it
  • spec:model.spec-sections: Spec sections carry typed detail and direct verifier semantics
  • spec:model.stable-ids: Stable IDs are the Protocol's durable join key
  • spec:model.term-addresses: A Model term may carry a key that addresses it
  • spec:model.term-addresses.keyed-term-resolves: A keyed term is reified and its address resolves
  • spec:model.term-addresses.malformed-term-marker-refused: A term marker whose key is off the grammar refuses its carrier
  • spec:model.term-addresses.repeated-term-key-refused: A term key repeated in one Spec refuses its carrier
  • spec:model.term-addresses.typescript-term-imports-keyed: A keyed TypeScript term keeps its address through import to Markdown
  • spec:model.term-addresses.unknown-term-key-refused: An address that names a term key no term carries is an error
  • spec:validation.prose-mentions: Every Spec id written in prose resolves
  • spec:model.term-addresses decidedBy spec:decisions.checked-mentions · declared — a term address joins the address law that decision rules
  • spec:model.term-addresses decidedBy spec:decisions.shipped-projections-frozen · declared — term keys stay off the frozen projections, which read the definition unchanged
  • spec:model.term-addresses dependsOn spec:extraction.entry-locations · declared — adds a row per Model term to the location table
  • spec:model.term-addresses dependsOn spec:model.rule-keys · declared — the term-key design follows the rule-entry address pattern
  • spec:model.term-addresses dependsOn spec:model.stable-ids · declared — a term address extends the Spec entry-address grammar
  • spec:model.term-addresses refines spec:model.spec-sections · declared — extends entry addresses to the terms a Model section defines
  • spec:carrier.markdown-body-grammar dependsOn spec:model.term-addresses · declared — a Model definition may open with a term key marker
  • spec:consumers.agent-surface.address-and-cycle-recipes dependsOn spec:model.term-addresses · declared — a term address resolves through the Spec's term keys
  • spec:consumers.agent-surface.register-recipes dependsOn spec:model.term-addresses · declared — entry search and the mention audit read term addresses
  • spec:consumers.obsidian-vault.notes dependsOn spec:model.term-addresses · declared — a term note exists for a Model term that carries a key and so an address
  • spec:consumers.spec-studio.glossary-page dependsOn spec:model.term-addresses · declared — a keyed term's address links it to its definition
  • spec:consumers.spec-studio.spec-page dependsOn spec:model.term-addresses · declared — a keyed term's address names the element a glossary row links to
  • spec:consumers.upgrade-kit.capability-adoption dependsOn spec:model.term-addresses · declared — term keys are counted where Model terms are
  • spec:validation.prose-mentions dependsOn spec:model.term-addresses · declared — a term address resolves through the Spec's term keys
  • spec:model.term-addresses.keyed-term-resolves refines spec:model.term-addresses · declared
  • spec:model.term-addresses.malformed-term-marker-refused refines spec:model.term-addresses · declared
  • spec:model.term-addresses.repeated-term-key-refused refines spec:model.term-addresses · declared
  • spec:model.term-addresses.typescript-term-imports-keyed refines spec:model.term-addresses · declared
  • spec:model.term-addresses.unknown-term-key-refused refines spec:model.term-addresses · declared
  • spec:model.term-addresses.keyed-term-resolves verifies spec:model.term-addresses · declared
  • spec:model.term-addresses.malformed-term-marker-refused verifies spec:model.term-addresses · declared
  • spec:model.term-addresses.repeated-term-key-refused verifies spec:model.term-addresses · declared
  • spec:model.term-addresses.typescript-term-imports-keyed verifies spec:model.term-addresses · declared
  • spec:model.term-addresses.unknown-term-key-refused verifies spec:model.term-addresses · 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

  • refines · spec:model.spec-sections · stated ready, floor ready
  • dependsOn · spec:extraction.entry-locations · stated ready, floor ready
  • dependsOn · spec:model.rule-keys · stated ready, floor ready
  • dependsOn · spec:model.stable-ids · stated ready, floor ready
  • decidedBy · spec:decisions.checked-mentions · stated ready, floor ready
  • decidedBy · spec:decisions.shipped-projections-frozen · stated ready, floor ready

Rested on by

Distance 1

  • spec:carrier.markdown-body-grammar

    Implementing units

    • impl:protocol.markdown-body-grammar · src/extract/markdown-body.ts:120
    • impl:protocol.markdown-content · src/extract/markdown-body-content.ts:7

    Referencing units

    None.

    Enabled verifiers: spec:carrier.markdown-body-grammar.continuation-line-refused, spec:carrier.markdown-body-grammar.foreign-fence-refused, spec:carrier.markdown-body-grammar.h3-refused, spec:carrier.markdown-body-grammar.integer-term-refused, spec:carrier.markdown-body-grammar.keyed-bullet-refused, spec:carrier.markdown-body-grammar.ordered-list-refused, spec:carrier.markdown-body-grammar.plain-bullet-refused, spec:carrier.markdown-body-grammar.raw-html-refused, spec:carrier.markdown-body-grammar.repeated-field-refused, spec:carrier.markdown-body-grammar.second-primary-owner-refused, spec:carrier.markdown-body-grammar.shared-description-refused, spec:carrier.markdown-body-grammar.table-refused, spec:carrier.markdown-body-grammar.trailing-prose-refused, spec:carrier.markdown-body-grammar.unrecognized-heading-refused, spec:validation.kind-evidence.second-entry-untargeted

    Packs: pack:self-hosting-v1

  • spec:consumers.agent-surface.address-and-cycle-recipes

    Implementing units

    • impl:protocol.address-and-cycle-recipes · test/recipes.test.ts:3568

    Referencing units

    None.

    Enabled verifiers: spec:consumers.agent-surface.address-and-cycle-recipes.chain-reports-nothing, spec:consumers.agent-surface.address-and-cycle-recipes.cycle-fails-a-rules-run, spec:consumers.agent-surface.address-and-cycle-recipes.unresolved-address-fails-a-rules-run, test:protocol.address-and-cycle-recipes

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

  • spec:consumers.agent-surface.register-recipes

    Implementing units

    • impl:protocol.register-recipes · test/recipes.test.ts:2057

    Referencing units

    None.

    Enabled verifiers: test:protocol.register-recipes

    Packs: pack:self-hosting-v1

  • spec:consumers.obsidian-vault.notes

    Implementing units

    • impl:protocol.vault-notes · src/projections/vault/notes.ts:45
    • impl:protocol.vault-sections · src/projections/vault/sections.ts:10
    • impl:protocol.vault-text · src/projections/vault/text.ts:30

    Referencing units

    None.

    Enabled verifiers: spec:consumers.obsidian-vault.notes.case-collision-refused, spec:consumers.obsidian-vault.notes.entry-address-link, spec:consumers.obsidian-vault.notes.term-address-link, spec:consumers.obsidian-vault.notes.unresolved-mention-stays, test:protocol.vault-priority

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.glossary-page

    Implementing units

    • impl:protocol.studio-glossary · src/projections/studio/pages/glossary-page.ts:7

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.glossary-page.same-word-twice

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.spec-page

    Implementing units

    • impl:protocol.studio-requirement-view · src/projections/studio/pages/requirement-view.ts:8
    • impl:protocol.studio-spec-page · src/projections/studio/pages/spec-page.ts:201
    • impl:protocol.studio-spec-structure · src/projections/studio/pages/spec-structure.ts:44

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.spec-page.cited-declaration, test:protocol.studio-architecture-maturity-requirement, test:protocol.studio-panels

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.upgrade-kit.capability-adoption

    Implementing units

    • impl:protocol.capability-adoption-recipe · test/upgrade-kit.test.ts:514

    Referencing units

    None.

    Enabled verifiers: spec:consumers.upgrade-kit.capability-adoption.counts-a-corpus

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

  • spec:model.term-addresses.keyed-term-resolves

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.term-addresses.keyed-term-resolves

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

  • spec:model.term-addresses.malformed-term-marker-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.term-addresses.malformed-term-marker-refused

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

  • spec:model.term-addresses.repeated-term-key-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.term-addresses.repeated-term-key-refused

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

  • spec:model.term-addresses.typescript-term-imports-keyed

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.term-addresses.typescript-term-imports-keyed

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

  • spec:model.term-addresses.unknown-term-key-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.term-addresses.unknown-term-key-refused

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

  • spec:validation.prose-mentions

    Implementing units

    • impl:protocol.entry-address-resolution · src/graph/entry-address.ts:6
    • impl:protocol.prose-mentions · src/validate/validators.ts:1370

    Referencing units

    None.

    Enabled verifiers: test:protocol.entry-locations, test:protocol.prose-mentions

    Packs: pack:self-hosting-v1

Distance 2

  • spec:carrier.inline-code-spans

    Implementing units

    • impl:protocol.inline-code-spans · src/extract/markdown-inline-code.ts:4

    Referencing units

    None.

    Enabled verifiers: spec:carrier.inline-code-spans.description, spec:carrier.inline-code-spans.list, spec:carrier.inline-code-spans.narrative, spec:carrier.inline-code-spans.pack

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.continuation-line-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.continuation-line-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.foreign-fence-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.foreign-fence-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.h3-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.h3-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.integer-term-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.integer-term-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.keyed-bullet-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.keyed-bullet-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.ordered-list-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.ordered-list-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.plain-bullet-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.plain-bullet-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.raw-html-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.raw-html-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.repeated-field-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.repeated-field-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.second-primary-owner-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.second-primary-owner-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.shared-description-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.shared-description-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.table-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.table-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.trailing-prose-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.trailing-prose-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-body-grammar.unrecognized-heading-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-body-grammar.unrecognized-heading-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-parser

    Implementing units

    • impl:protocol.markdown-parser · src/extract/markdown.ts:37
    • impl:protocol.static-reification · src/extract/reify.ts:2139

    Referencing units

    None.

    Enabled verifiers: spec:carrier.markdown-parser.bounded-parity, test:protocol.markdown-parser

    Packs: pack:self-hosting-v1

  • spec:carrier.prose-ownership-rule

    Implementing units

    • impl:protocol.markdown-body-grammar · src/extract/markdown-body.ts:120

    Referencing units

    None.

    Enabled verifiers: test:protocol.prose-ownership

    Packs: pack:self-hosting-v1

  • spec:consumers.adopter-on-ramp

    Implementing units

    • impl:protocol.adopter-help · src/cli/help.ts:167
    • impl:protocol.adopter-on-ramp · test/skills.test.ts:712

    Referencing units

    None.

    Enabled verifiers: test:protocol.adopter-on-ramp, test:protocol.shipped-protocol-corpus

    Packs: pack:self-hosting-v1

  • spec:consumers.agent-surface.address-and-cycle-recipes.chain-reports-nothing

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.agent-surface.address-and-cycle-recipes.chain-reports-nothing

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

  • spec:consumers.agent-surface.address-and-cycle-recipes.cycle-fails-a-rules-run

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.agent-surface.address-and-cycle-recipes.cycle-fails-a-rules-run

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

  • spec:consumers.agent-surface.address-and-cycle-recipes.unresolved-address-fails-a-rules-run

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.agent-surface.address-and-cycle-recipes.unresolved-address-fails-a-rules-run

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

  • spec:consumers.agent-surface.design-recipes

    Implementing units

    • impl:protocol.design-recipes · test/recipes.test.ts:4769

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-recipes

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

  • spec:consumers.intent-composition.proposal

    Implementing units

    • impl:protocol.proposal-schema-and-recipe · test/iteration-recipes.test.ts:1510
    • impl:protocol.studio-proposal-contract · src/studio-elements/proposal.ts:1

    Referencing units

    None.

    Enabled verifiers: test:protocol.proposal-schema-and-recipe

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

  • spec:consumers.obsidian-vault.notes.case-collision-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.notes.case-collision-refused

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.obsidian-vault.notes.entry-address-link

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.notes.entry-address-link

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.obsidian-vault.notes.term-address-link

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.notes.term-address-link

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.obsidian-vault.notes.unresolved-mention-stays

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.notes.unresolved-mention-stays

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.readiness-planner

    Implementing units

    • impl:protocol.statement-queue-recipe · test/self-hosting-readiness-planner.test.ts:74

    Referencing units

    None.

    Enabled verifiers: 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

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

  • spec:consumers.roadmap.memo

    Implementing units

    • impl:protocol.roadmap-memo-recipe · test/roadmap.test.ts:27
    • impl:protocol.studio-roadmap-page · src/projections/studio/pages/roadmap-page.ts:168

    Referencing units

    None.

    Enabled verifiers: test:protocol.roadmap-memo-recipe, test:protocol.studio-roadmap-page

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.export

    Implementing units

    • impl:protocol.studio-diagram-element · src/studio-elements/diagram.ts:23
    • impl:protocol.studio-expander · src/studio-elements/expander.ts:16
    • impl:protocol.studio-pack-export · src/projections/studio/pages/export-page.ts:35
    • impl:protocol.studio-pack-page · src/projections/studio/pages/pack-page.ts:68

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.export.self-contained, test:protocol.studio-intent-handoff

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.glossary-page.same-word-twice

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-glossary-same-word-twice

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.registers

    Implementing units

    • impl:protocol.studio-registers · src/projections/studio/pages/registers-page.ts:47

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.registers.blocking-first

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.shell

    Implementing units

    • impl:protocol.studio-code-spans · src/projections/studio/pages/code-spans.ts:9
    • impl:protocol.studio-frame · src/projections/studio/pages/frame.ts:6
    • impl:protocol.studio-html · src/projections/studio/pages/html.ts:8
    • impl:protocol.studio-text · src/projections/studio/pages/text.ts:7

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-pages

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.spec-page.cited-declaration

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-cited-declaration

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.spec-page.core

    Implementing units

    • impl:protocol.studio-spec-page · src/projections/studio/pages/spec-page.ts:201

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-pages

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.verification-panels

    Implementing units

    • impl:protocol.studio-run-rows · src/projections/studio/pages/run-rows.ts:69
    • impl:protocol.studio-verification-panels · src/projections/studio/pages/spec-verification.ts:74

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.verification-panels.rule-coverage, test:protocol.studio-panels

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

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

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.capability-adoption.counts-a-corpus

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

  • spec:consumers.vault-on-ramp

    Implementing units

    • impl:protocol.vault-on-ramp · test/skills.test.ts:1995

    Referencing units

    None.

    Enabled verifiers: test:protocol.vault-on-ramp

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:extraction.entry-citations

    Implementing units

    • impl:protocol.entry-address-resolution · src/graph/entry-address.ts:6
    • impl:protocol.entry-citation-reader · src/reader/entry-citations.ts:19
    • impl:protocol.entry-citation-recipe · test/recipes.test.ts:7008
    • impl:protocol.entry-citation-scan · src/extract/entry-citations.ts:6

    Referencing units

    None.

    Enabled verifiers: spec:extraction.entry-citations.code-comment-cites-declaration, spec:extraction.entry-citations.test-title-cites-declaration, spec:extraction.entry-citations.unanchored-file-unread, spec:extraction.entry-citations.unresolved-citation

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

  • spec:model.open-question-keys

    Implementing units

    • impl:protocol.open-question-keys · src/extract/markdown-body-owner-behavior.ts:38
    • impl:protocol.open-section-order · src/extract/serialize.ts:105
    • impl:protocol.prose-mentions · src/validate/validators.ts:1370
    • impl:protocol.register-recipes · test/recipes.test.ts:2057
    • impl:protocol.sdp-import-markdown-emit · src/import/emit-markdown.ts:253
    • impl:protocol.stable-ids · src/ids.ts:173
    • impl:protocol.static-reification · src/extract/reify.ts:2139

    Referencing units

    None.

    Enabled verifiers: spec:model.open-question-keys.keyed-question-resolves, spec:model.open-question-keys.renamed-key-breaks, spec:model.open-question-keys.repeated-key-refused

    Packs: pack:self-hosting-v1

  • spec:validation.external-registers

    Implementing units

    • impl:protocol.external-registers-recipe · test/external-registers.test.ts:9

    Referencing units

    None.

    Enabled verifiers: spec:validation.external-registers.uncited-on-request, spec:validation.external-registers.unknown-and-retired

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

Distance 3

  • spec:carrier.inline-code-spans.description

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.inline-code-spans.description

    Packs: pack:self-hosting-v1

  • spec:carrier.inline-code-spans.list

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.inline-code-spans.list

    Packs: pack:self-hosting-v1

  • spec:carrier.inline-code-spans.narrative

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.inline-code-spans.narrative

    Packs: pack:self-hosting-v1

  • spec:carrier.inline-code-spans.pack

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.inline-code-spans.pack

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-authoring

    Implementing units

    • impl:protocol.markdown-parser · src/extract/markdown.ts:37

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-authoring

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-pack-authoring

    Implementing units

    • impl:protocol.markdown-pack-authoring · src/extract/markdown-pack.ts:117
    • impl:protocol.markdown-yaml-policy · src/extract/markdown-yaml-policy.ts:33
    • impl:protocol.static-reification · src/extract/reify.ts:2139

    Referencing units

    None.

    Enabled verifiers: spec:carrier.markdown-pack-authoring.markdown-ts-parity, spec:carrier.markdown-pack-authoring.spec-envelope-refused, test:protocol.roadmap-priority

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-parser.bounded-parity

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-parser.bounded-parity

    Packs: pack:self-hosting-v1

  • spec:consumers.agent-surface.answer-shapes

    Implementing units

    • impl:protocol.answer-shape-recipes · test/recipes.test.ts:6214

    Referencing units

    • impl:protocol.authoring-grammar-recipes · test/recipes.test.ts:6597
    • impl:protocol.reader · src/reader/reader.ts:687

    Enabled verifiers: test:protocol.answer-shape-recipes

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

  • spec:consumers.agent-surface.example-space-coverage

    Implementing units

    • impl:protocol.example-space-coverage-recipe · test/studio-s1.test.ts:856
    • impl:protocol.example-space-decoding · src/notation/example-space.ts:473

    Referencing units

    None.

    Enabled verifiers: spec:consumers.agent-surface.example-space-coverage.number-not-enumerable, spec:consumers.agent-surface.example-space-coverage.uncovered-literal

    Packs: pack:design-management-v1, pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.authoring-on-ramp

    Implementing units

    • impl:protocol.authoring-on-ramp · test/skills.test.ts:76
    • impl:protocol.spec-scaffolder · src/cli/new-spec-command.ts:348

    Referencing units

    None.

    Enabled verifiers: test:protocol.authoring-on-ramp

    Packs: pack:self-hosting-v1

  • spec:consumers.command-line

    Implementing units

    • impl:protocol.adopter-help · src/cli/help.ts:167
    • impl:protocol.agent-surface-cli · src/cli/sdp.ts:94
    • impl:protocol.build-args · src/cli/build-args.ts:11
    • impl:protocol.generate-command · src/cli/generate-command.ts:34

    Referencing units

    None.

    Enabled verifiers: spec:consumers.command-line.generate-check-failure, spec:consumers.command-line.generate-writes-every-root, spec:consumers.command-line.verb-help-touches-nothing

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

  • spec:consumers.context-bundle

    Implementing units

    • impl:protocol.context-bundle-recipe · test/iteration-recipes.test.ts:765

    Referencing units

    None.

    Enabled verifiers: spec:consumers.context-bundle.oversized-member-named, spec:consumers.context-bundle.parts-cover-the-pack, test:protocol.context-bundle-recipe

    Packs: pack:adopter-speed-v1, pack:design-iteration-v1, pack:design-management-v1, pack:self-hosting-v1

  • spec:consumers.delivery-session-on-ramp

    Implementing units

    • impl:protocol.delivery-session-on-ramp · test/skills.test.ts:83

    Referencing units

    None.

    Enabled verifiers: test:protocol.delivery-session-on-ramp

    Packs: pack:self-hosting-v1

  • spec:consumers.design-slice

    Implementing units

    • impl:protocol.design-slice-recipe · test/self-hosting-design-slice.test.ts:148

    Referencing units

    • impl:protocol.studio-slice-answer · src/projections/studio/slice-answer.ts:1

    Enabled verifiers: spec:consumers.design-slice.chain, spec:consumers.design-slice.component-absent, spec:consumers.design-slice.component-differing, spec:consumers.design-slice.component-matching, spec:consumers.design-slice.component-unreadable, spec:consumers.design-slice.component-unrelated, spec:consumers.design-slice.decision-backlink, spec:consumers.design-slice.dependency-cycle, spec:consumers.design-slice.folded-example, spec:consumers.design-slice.independent-example, spec:consumers.design-slice.outside-components, spec:consumers.design-slice.outside-holding, spec:consumers.design-slice.outside-satisfied, spec:consumers.design-slice.outside-unbound, test:protocol.design-slice

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.engine-provenance

    Implementing units

    • impl:protocol.build-artifacts · src/cli/build-artifacts.ts:182
    • impl:protocol.engine-provenance-cli · src/cli/sdp.ts:102

    Referencing units

    None.

    Enabled verifiers: test:protocol.engine-provenance

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

  • spec:consumers.intent-composition.proposal.memo

    Implementing units

    • impl:protocol.proposal-memo-recipe · test/recipes.test.ts:7298
    • impl:protocol.studio-proposal-memo · src/studio-elements/memo.ts:13

    Referencing units

    None.

    Enabled verifiers: spec:consumers.intent-composition.proposal.memo.shared

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.obsidian-vault.iteration

    Implementing units

    • impl:protocol.vault-sync · src/projections/vault/sync.ts:98
    • impl:protocol.vault-text · src/projections/vault/text.ts:30
    • impl:protocol.vault-watch · src/cli/vault-command.ts:219

    Referencing units

    None.

    Enabled verifiers: spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes, spec:consumers.obsidian-vault.iteration.watch-source-anchor

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.readiness-planner.cycle-shares-a-round

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.readiness-planner.cycle-shares-a-round

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

  • spec:consumers.readiness-planner.decision-first

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.readiness-planner.decision-first

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

  • spec:consumers.readiness-planner.dependency-order

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.readiness-planner.dependency-order

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

  • spec:consumers.readiness-planner.owner-question-holds

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.readiness-planner.owner-question-holds

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

  • spec:consumers.roadmap

    Implementing units

    • impl:protocol.roadmap-recipe · test/roadmap.test.ts:20

    Referencing units

    None.

    Enabled verifiers: spec:consumers.roadmap.blocking-part, spec:consumers.roadmap.buildable-part, spec:consumers.roadmap.built-work, spec:consumers.roadmap.design-part, spec:consumers.roadmap.drifting-part, spec:consumers.roadmap.missing-evidence, spec:consumers.roadmap.outside-parent, spec:consumers.roadmap.statement-order, spec:consumers.roadmap.statement-part, test:protocol.roadmap-recipe

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.cited-line-text

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:roadmap, pack:self-hosting-v1

  • spec:consumers.spec-studio.export.self-contained

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-export-contained

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.index-page

    Implementing units

    • impl:protocol.studio-index-page · src/projections/studio/pages/index-page.ts:8

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-pages

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.intent-panel

    Implementing units

    • impl:protocol.studio-compose · src/studio-elements/compose.ts:13
    • impl:protocol.studio-frame · src/projections/studio/pages/frame.ts:6
    • impl:protocol.studio-intent-panel · src/studio-elements/intent-panel.ts:51
    • impl:protocol.studio-intent-panel-element · src/studio-elements/intent-panel-element.ts:14
    • impl:protocol.studio-scenario-editor · src/studio-elements/scenario-editor.ts:17

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.intent-panel.refresh-keeps-intents, test:protocol.studio-intent-handoff

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.navigation

    Implementing units

    • impl:protocol.studio-frame · src/projections/studio/pages/frame.ts:6
    • impl:protocol.studio-index-page · src/projections/studio/pages/index-page.ts:8

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-navigation, test:protocol.studio-roadmap-page

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.owner-queue

    Implementing units

    • impl:protocol.studio-owner-queue · src/projections/studio/pages/queue-page.ts:9

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.owner-queue.dependency-first

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.pack-page

    Implementing units

    • impl:protocol.studio-pack-page · src/projections/studio/pages/pack-page.ts:68

    Referencing units

    None.

    Enabled verifiers: test:protocol.roadmap-priority, test:protocol.studio-pages

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.page-elements

    Implementing units

    • component:protocol.studio-elements · src/studio-elements/index.ts:13
    • impl:protocol.studio-copy · src/studio-elements/copy.ts:22
    • impl:protocol.studio-expander · src/studio-elements/expander.ts:16
    • impl:protocol.studio-filter · src/studio-elements/filter.ts:25
    • impl:protocol.studio-search-form · src/studio-elements/search.ts:18
    • impl:protocol.studio-search-results · src/studio-elements/search-results.ts:95
    • impl:protocol.studio-stamp · src/studio-elements/stamp.ts:30

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-copy-source, test:protocol.studio-page-elements

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.register-input

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:roadmap, pack:self-hosting-v1

  • spec:consumers.spec-studio.registers.blocking-first

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-registers-blocking-first

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.roadmap-page

    Implementing units

    • impl:protocol.studio-roadmap-page · src/projections/studio/pages/roadmap-page.ts:168

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-roadmap-page

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.search

    Implementing units

    • impl:protocol.studio-concept-match · src/reader/concept-match.ts:43
    • impl:protocol.studio-search-page · src/projections/studio/pages/search-page.ts:5
    • impl:protocol.studio-search-results · src/studio-elements/search-results.ts:95

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-concept-match, test:protocol.studio-page-elements, test:protocol.studio-pages

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.verification-panels.rule-coverage

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-rule-coverage

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.studio-on-ramp

    Implementing units

    • impl:protocol.studio-on-ramp · test/skills.test.ts:1693

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-on-ramp

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.upgrade-kit.rule-key-proposal

    Implementing units

    • impl:protocol.rule-key-proposal-recipe · test/upgrade-kit.test.ts:742

    Referencing units

    None.

    Enabled verifiers: spec:consumers.upgrade-kit.rule-key-proposal.collision-and-unkeyable, spec:consumers.upgrade-kit.rule-key-proposal.proposal-applies-clean

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

  • spec:decisions.prose-ownership

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:decisions.question-key-rendering

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:extraction.contract-declarations

    Implementing units

    • impl:protocol.pack-design · src/reader/reader.ts:499
    • impl:protocol.register-recipes · test/recipes.test.ts:2057

    Referencing units

    None.

    Enabled verifiers: test:protocol.register-recipes

    Packs: pack:self-hosting-v1

  • spec:extraction.entry-citations.code-comment-cites-declaration

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.entry-citations.code-comment-cites-declaration

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

  • spec:extraction.entry-citations.test-title-cites-declaration

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.entry-citations.test-title-cites-declaration

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

  • spec:extraction.entry-citations.unanchored-file-unread

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.entry-citations.unanchored-file-unread

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

  • spec:extraction.entry-citations.unresolved-citation

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.entry-citations.unresolved-citation

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

  • spec:extraction.entry-locations

    Implementing units

    • impl:protocol.entry-location-recipes · test/recipes.test.ts:5979
    • impl:protocol.entry-locations · src/extract/derive.ts:78
    • impl:protocol.reader · src/reader/reader.ts:687

    Referencing units

    • impl:protocol.pack-design · src/reader/reader.ts:499

    Enabled verifiers: test:protocol.entry-locations

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

  • spec:model.open-question-fields

    Implementing units

    • impl:protocol.authoring-grammar-recipes · test/recipes.test.ts:6597
    • impl:protocol.authoring-normalization · src/extract/authoring-normalization.ts:8

    Referencing units

    None.

    Enabled verifiers: spec:model.open-question-fields.dropped-list-warns, test:protocol.authoring-grammar, test:protocol.authoring-grammar-recipes

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

  • spec:model.open-question-keys.keyed-question-resolves

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.open-question-keys.keyed-question-resolves

    Packs: pack:self-hosting-v1

  • spec:model.open-question-keys.renamed-key-breaks

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.open-question-keys.renamed-key-breaks

    Packs: pack:self-hosting-v1

  • spec:model.open-question-keys.repeated-key-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.open-question-keys.repeated-key-refused

    Packs: pack:self-hosting-v1

  • spec:model.rule-keys

    Implementing units

    • impl:protocol.authoring-grammar-recipes · test/recipes.test.ts:6597
    • impl:protocol.authoring-normalization · src/extract/authoring-normalization.ts:8
    • impl:protocol.rule-exercises · src/validate/validators.ts:1479

    Referencing units

    None.

    Enabled verifiers: test:protocol.authoring-grammar, test:protocol.authoring-grammar-recipes

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

  • spec:protocol.roadmap-replaces-plans

    Implementing units

    • impl:protocol.roadmap-practice · test/check-self-hosting-gates.test.ts:52

    Referencing units

    None.

    Enabled verifiers: test:protocol.roadmap-practice

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:validation.duplicate-ids

    Implementing units

    • impl:protocol.duplicate-id-exclusion · src/extract/index.ts:93
    • impl:protocol.duplicate-ids · src/validate/validators.ts:263

    Referencing units

    None.

    Enabled verifiers: spec:validation.duplicate-ids.dual-carrier

    Packs: pack:self-hosting-v1

  • spec:validation.external-registers.uncited-on-request

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.external-registers.uncited-on-request

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

  • spec:validation.external-registers.unknown-and-retired

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.external-registers.unknown-and-retired

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

Distance 4

  • spec:carrier.envelope-contract

    Implementing units

    • impl:protocol.envelope-contract · src/extract/markdown-frontmatter.ts:33
    • impl:protocol.markdown-yaml-policy · src/extract/markdown-yaml-policy.ts:33

    Referencing units

    None.

    Enabled verifiers: test:protocol.envelope-contract

    Packs: pack:self-hosting-v1

  • spec:carrier.gherkin-authoring

    Implementing units

    • impl:protocol.gherkin-authoring · src/extract/gherkin.ts:1323
    • impl:protocol.gherkin-kind-policy · src/extract/gherkin-kind-honesty.ts:6

    Referencing units

    None.

    Enabled verifiers: spec:carrier.gherkin-authoring.authored-fact-refused, spec:carrier.gherkin-authoring.contract-parity, spec:carrier.gherkin-authoring.description-location-refused, spec:carrier.gherkin-authoring.duplicate-surface-refused, spec:carrier.gherkin-authoring.example-space-extraction, spec:carrier.gherkin-authoring.malformed-relation-refused, spec:carrier.gherkin-authoring.missing-id-refused, spec:carrier.gherkin-authoring.multi-finding-bounded, spec:carrier.gherkin-authoring.parent-child-extraction, spec:carrier.gherkin-authoring.step-less-scenario-refused, spec:carrier.gherkin-authoring.unbound-ready-refused, spec:carrier.gherkin-authoring.unknown-tag-refused, spec:carrier.gherkin-authoring.unsupported-construct-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-pack-authoring.markdown-ts-parity

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-pack-authoring.markdown-ts-parity

    Packs: pack:self-hosting-v1

  • spec:carrier.markdown-pack-authoring.spec-envelope-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.markdown-pack-authoring.spec-envelope-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.sdp-import

    Implementing units

    • component:protocol.import · src/import/import.ts:45
    • impl:protocol.import-fidelity · src/import/markdown-fidelity.ts:102
    • impl:protocol.sdp-import · src/cli/import-command.ts:71
    • impl:protocol.sdp-import-core · src/import/import.ts:58
    • impl:protocol.sdp-import-markdown-emit · src/import/emit-markdown.ts:253
    • impl:protocol.sdp-import-publish · src/cli/import-publish.ts:23
    • impl:protocol.sdp-import-scan · src/cli/import-scan.ts:62

    Referencing units

    None.

    Enabled verifiers: spec:carrier.sdp-import.round-trip

    Packs: pack:self-hosting-v1

  • spec:carrier.slot-notation

    Implementing units

    • component:protocol.notation · src/notation/slots.ts:261
    • impl:protocol.slot-notation · src/notation/slots.ts:269

    Referencing units

    None.

    Enabled verifiers: spec:carrier.slot-notation.one-literal-binding, spec:carrier.slot-notation.refused-guess, spec:carrier.slot-notation.typed-declaration

    Packs: pack:self-hosting-v1

  • spec:consumers.agent-surface.example-space-coverage.number-not-enumerable

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-coverage-number

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.agent-surface.example-space-coverage.uncovered-literal

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-coverage-literal

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.command-line.generate-check-failure

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.command-line.generate-check-failure

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

  • spec:consumers.command-line.generate-writes-every-root

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.command-line.generate-writes-every-root

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

  • spec:consumers.command-line.verb-help-touches-nothing

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.command-line.verb-help-touches-nothing

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

  • spec:consumers.context-bundle.oversized-member-named

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.context-bundle.oversized-member-named

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

  • spec:consumers.context-bundle.parts-cover-the-pack

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.context-bundle.parts-cover-the-pack

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

  • spec:consumers.design-review

    Implementing units

    • impl:protocol.design-review · src/projections/design-review.ts:44
    • impl:protocol.design-review-codec · src/projections/design-review-markdown.ts:3

    Referencing units

    None.

    Enabled verifiers: spec:consumers.design-review.pure-projection

    Packs: pack:self-hosting-v1

  • spec:consumers.design-slice.chain

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.chain

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.design-slice.component-absent

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.component-absent

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.design-slice.component-differing

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.component-differing

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.design-slice.component-matching

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.component-matching

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.design-slice.component-unreadable

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.component-unreadable

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.design-slice.component-unrelated

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.component-unrelated

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.design-slice.decision-backlink

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.decision-backlink

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.design-slice.dependency-cycle

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.dependency-cycle

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.design-slice.folded-example

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.folded-example

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.design-slice.independent-example

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.independent-example

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.design-slice.outside-components

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.outside-components

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.design-slice.outside-holding

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.outside-holding

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.design-slice.outside-satisfied

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.outside-satisfied

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.design-slice.outside-unbound

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-slice.outside-unbound

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.gherkin-view

    Implementing units

    • impl:protocol.gherkin-kind-policy · src/extract/gherkin-kind-honesty.ts:6
    • impl:protocol.gherkin-view · src/projections/gherkin-view.ts:19
    • impl:protocol.gherkin-view-cli · src/cli/gherkin-command.ts:66

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-view

    Packs: pack:self-hosting-v1

  • spec:consumers.graph-first-planning

    Implementing units

    • impl:protocol.graph-first-planning · test/skills.test.ts:290

    Referencing units

    None.

    Enabled verifiers: test:protocol.graph-first-planning

    Packs: pack:self-hosting-v1

  • spec:consumers.intent-composition.proposal.memo.shared

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-memo-shared

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.obsidian-vault.iteration.watch-source-anchor

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.iteration.watch-source-anchor

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.pack-design

    Implementing units

    • impl:protocol.pack-design · src/reader/reader.ts:499

    Referencing units

    None.

    Enabled verifiers: test:protocol.pack-design

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

  • spec:consumers.projections-model.roadmap-views

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.roadmap.blocking-part

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.roadmap.blocking-part

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.roadmap.buildable-part

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.roadmap.buildable-part

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.roadmap.built-work

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.roadmap.built-work

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.roadmap.design-part

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.roadmap.design-part

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.roadmap.drifting-part

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.roadmap.drifting-part

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.roadmap.missing-evidence

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.roadmap.missing-evidence

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.roadmap.outside-parent

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.roadmap.outside-parent

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.roadmap.statement-order

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.roadmap.statement-order

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.roadmap.statement-part

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.roadmap.statement-part

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.shipped-protocol-corpus

    Implementing units

    • impl:protocol.shipped-protocol-corpus · test/package-smoke.test.ts:252

    Referencing units

    None.

    Enabled verifiers: test:protocol.shipped-protocol-corpus

    Packs: pack:self-hosting-v1

  • spec:consumers.spec-studio.capability-map-page

    Implementing units

    • impl:protocol.studio-capabilities-page · src/projections/studio/pages/capabilities-page.ts:78
    • impl:protocol.studio-filter · src/studio-elements/filter.ts:25
    • impl:protocol.studio-frame · src/projections/studio/pages/frame.ts:6
    • impl:protocol.studio-index-page · src/projections/studio/pages/index-page.ts:8

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-capabilities

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.components

    Implementing units

    • component:protocol.studio-elements · src/studio-elements/index.ts:13
    • impl:protocol.studio-compose · src/studio-elements/compose.ts:13
    • impl:protocol.studio-diagram-element · src/studio-elements/diagram.ts:23
    • impl:protocol.studio-filter · src/studio-elements/filter.ts:25
    • impl:protocol.studio-intent-panel-element · src/studio-elements/intent-panel-element.ts:14
    • impl:protocol.studio-maturity-map · src/projections/studio/pages/maturity-map.ts:7
    • impl:protocol.studio-pack-page · src/projections/studio/pages/pack-page.ts:68
    • impl:protocol.studio-scenario-editor · src/studio-elements/scenario-editor.ts:17
    • impl:protocol.studio-search-results · src/studio-elements/search-results.ts:95
    • impl:protocol.studio-spec-structure · src/projections/studio/pages/spec-structure.ts:44
    • impl:protocol.studio-verification-panels · src/projections/studio/pages/spec-verification.ts:74

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-intent-handoff

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.data

    Implementing units

    • impl:protocol.studio-data · src/projections/studio/data.ts:279

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-data

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.diagram-kinds.dependency

    Implementing units

    • impl:protocol.studio-slice-dependencies · src/projections/studio/diagrams/slice.ts:10

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-slice-dependency

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.diagram-kinds.mermaid-source

    Implementing units

    • impl:protocol.studio-diagram-source · src/projections/studio/diagrams/mermaid.ts:13
    • impl:protocol.studio-diagrams · src/projections/studio/diagrams/svg.ts:73

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-diagram-core

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.diagram-kinds.scoped-architecture

    Implementing units

    • impl:protocol.studio-slice-architecture · src/projections/studio/diagrams/slice.ts:219

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-slice-architecture

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.intent-panel.refresh-keeps-intents

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-intents-refresh

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.lenses.tests

    Implementing units

    • impl:protocol.studio-tests-lens · src/projections/studio/pages/tests-page.ts:34

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.lenses.tests.coverage-row

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.owner-queue.dependency-first

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-queue-dependency-first

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.pack-page.maturity-map

    Implementing units

    • impl:protocol.studio-maturity-map · src/projections/studio/pages/maturity-map.ts:7

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-architecture-maturity-requirement, test:protocol.studio-panels

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.sharing

    Implementing units

    • impl:protocol.stamp-command · src/cli/stamp-command.ts:8
    • impl:protocol.studio-preview-workflow · test/studio-s4.test.ts:742
    • impl:protocol.studio-stamp · src/studio-elements/stamp.ts:30

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.sharing.stamp-written-apart

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.slice-page

    Implementing units

    • impl:protocol.studio-slice-page · src/projections/studio/pages/slice-page.ts:25

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-slice-page

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.upgrade-kit

    Implementing units

    • impl:protocol.upgrade-guide · test/upgrade-kit.test.ts:87

    Referencing units

    None.

    Enabled verifiers: test:protocol.upgrade-guide

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

  • spec:consumers.upgrade-kit.rule-key-proposal.collision-and-unkeyable

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.rule-key-proposal.collision-and-unkeyable

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

  • spec:consumers.upgrade-kit.rule-key-proposal.proposal-applies-clean

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.rule-key-proposal.proposal-applies-clean

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

  • spec:consumers.validate-watch

    Implementing units

    • impl:protocol.validate-watch · src/cli/validate-watch.ts:591

    Referencing units

    None.

    Enabled verifiers: test:protocol.validate-watch, test:protocol.validate-watch-rules

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

  • spec:decisions.carrier-ruling

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:decisions.carrier-universality

    Implementing units

    None.

    Referencing units

    • impl:protocol.gherkin-kind-policy · src/extract/gherkin-kind-honesty.ts:6

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:decisions.sdp-ts-extension

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:extraction.pack-member-order

    Implementing units

    • impl:protocol.markdown-yaml-policy · src/extract/markdown-yaml-policy.ts:33
    • impl:protocol.open-section-order · src/extract/serialize.ts:105
    • impl:protocol.pack-coherence · src/validate/validators.ts:1102
    • impl:protocol.pack-design-page · src/projections/design-review-pages.ts:120
    • impl:protocol.pack-member-order · src/extract/derive.ts:153
    • impl:protocol.reader · src/reader/reader.ts:687

    Referencing units

    None.

    Enabled verifiers: spec:extraction.pack-member-order.manifest-order-kept, test:protocol.roadmap-priority

    Packs: pack:self-hosting-v1

  • spec:model.enrichment-lifecycle

    Implementing units

    • impl:protocol.slimming-recipe · test/curation-recipes.test.ts:26

    Referencing units

    None.

    Enabled verifiers: test:protocol.slimming-recipe

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

  • spec:model.open-question-fields.dropped-list-warns

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.open-question-fields.dropped-list-warns

    Packs: pack:self-hosting-v1

  • spec:model.relation-reasons

    Implementing units

    • impl:protocol.authoring-grammar-recipes · test/recipes.test.ts:6597
    • impl:protocol.authoring-normalization · src/extract/authoring-normalization.ts:8

    Referencing units

    None.

    Enabled verifiers: test:protocol.authoring-grammar, test:protocol.authoring-grammar-recipes

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

  • spec:protocol.delivery-record-cleanup

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:roadmap, pack:self-hosting-v1

  • spec:protocol.self-hosting

    Implementing units

    • impl:protocol.self-hosting · test/self-hosting-graph.test.ts:136

    Referencing units

    None.

    Enabled verifiers: test:protocol.self-hosting

    Packs: pack:self-hosting-v1

  • spec:validation.duplicate-ids.dual-carrier

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.duplicate-ids.dual-carrier

    Packs: pack:self-hosting-v1

  • spec:validation.superseded-decision-signal

    Implementing units

    • impl:protocol.superseded-decision-signal · src/validate/validators.ts:1817

    Referencing units

    None.

    Enabled verifiers: spec:validation.superseded-decision-signal.branch-names-every-end, spec:validation.superseded-decision-signal.chain-end-named, spec:validation.superseded-decision-signal.closed-chain-named, spec:validation.superseded-decision-signal.dependency-unread, spec:validation.superseded-decision-signal.end-and-loop-named, spec:validation.superseded-decision-signal.live-replacement-warns, spec:validation.superseded-decision-signal.replaced-ruling-warns, spec:validation.superseded-decision-signal.replacement-below-ready-named, spec:validation.superseded-decision-signal.superseded-subject-silent

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

Distance 5

  • spec:carrier.gherkin-authoring.authored-fact-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-authoring.authored-fact-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.gherkin-authoring.contract-parity

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-authoring.contract-parity

    Packs: pack:self-hosting-v1

  • spec:carrier.gherkin-authoring.description-location-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-authoring.description-location-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.gherkin-authoring.duplicate-surface-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-authoring.duplicate-surface-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.gherkin-authoring.example-space-extraction

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-authoring.example-space-extraction

    Packs: pack:self-hosting-v1

  • spec:carrier.gherkin-authoring.malformed-relation-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-authoring.malformed-relation-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.gherkin-authoring.missing-id-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-authoring.missing-id-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.gherkin-authoring.multi-finding-bounded

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-authoring.multi-finding-bounded

    Packs: pack:self-hosting-v1

  • spec:carrier.gherkin-authoring.parent-child-extraction

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-authoring.parent-child-extraction

    Packs: pack:self-hosting-v1

  • spec:carrier.gherkin-authoring.step-less-scenario-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-authoring.step-less-scenario-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.gherkin-authoring.unbound-ready-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-authoring.unbound-ready-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.gherkin-authoring.unknown-tag-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-authoring.unknown-tag-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.gherkin-authoring.unsupported-construct-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.gherkin-authoring.unsupported-construct-refused

    Packs: pack:self-hosting-v1

  • spec:carrier.sdp-import.feature-adapter

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:carrier.sdp-import.round-trip

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.sdp-import.round-trip

    Packs: pack:self-hosting-v1

  • spec:carrier.slot-notation.one-literal-binding

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.slot-notation.one-literal-binding

    Packs: pack:self-hosting-v1

  • spec:carrier.slot-notation.refused-guess

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.slot-notation.refused-guess

    Packs: pack:self-hosting-v1

  • spec:carrier.slot-notation.typed-declaration

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.slot-notation.typed-declaration

    Packs: pack:self-hosting-v1

  • spec:carrier.step-keys

    Implementing units

    • impl:protocol.example-runner · src/runner/index.ts:108
    • impl:protocol.example-space-decoding · src/notation/example-space.ts:473
    • impl:protocol.executable-contracts · src/codegen/contracts.ts:647
    • impl:protocol.key-markers · src/extract/key-markers.ts:136
    • impl:protocol.open-section-order · src/extract/serialize.ts:105
    • impl:protocol.sdp-import-markdown-emit · src/import/emit-markdown.ts:253
    • impl:protocol.spec-sections · src/model/sections.ts:138

    Referencing units

    None.

    Enabled verifiers: spec:carrier.step-keys.conflicting-example-key-withheld, spec:carrier.step-keys.gherkin-keyed-step-stays-bound, spec:carrier.step-keys.key-equal-to-a-skeleton-withheld, spec:carrier.step-keys.malformed-marker-refused, spec:carrier.step-keys.renamed-key-breaks, spec:carrier.step-keys.repeated-key-refused, spec:carrier.step-keys.reworded-keyed-step-stays-bound, spec:carrier.step-keys.reworded-unkeyed-step-breaks, spec:carrier.step-keys.two-keys-on-one-step-refused, spec:carrier.step-keys.typescript-keyed-step-imports-keyed, test:protocol.keyed-content

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

  • spec:consumers.binding-language-views

    Implementing units

    • impl:protocol.binding-language-index-table · src/projections/design-review-pages.ts:201
    • impl:protocol.binding-language-spec-page · src/projections/design-review-context.ts:95

    Referencing units

    None.

    Enabled verifiers: spec:consumers.binding-language-views.bound-spec-page, spec:consumers.binding-language-views.pack-member-table

    Packs: pack:self-hosting-v1

  • spec:consumers.derived-readiness-banner

    Implementing units

    • impl:protocol.derived-readiness-banner · src/projections/design-review-context.ts:18

    Referencing units

    None.

    Enabled verifiers: spec:consumers.derived-readiness-banner.dishonest-divergence, spec:consumers.derived-readiness-banner.honest-headroom, test:protocol.derived-readiness-banner.idea-floor-unmet

    Packs: pack:self-hosting-v1

  • spec:consumers.design-review.pack-design-page

    Implementing units

    • impl:protocol.pack-design-page · src/projections/design-review-pages.ts:120

    Referencing units

    • impl:protocol.pack-design-sections · src/projections/design-review-pack-sections.ts:19

    Enabled verifiers: test:protocol.pack-design-page

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

  • spec:consumers.design-review.pure-projection

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-review.pure-projection

    Packs: pack:self-hosting-v1

  • spec:consumers.obsidian-vault.bases

    Implementing units

    • impl:protocol.vault-bases · src/projections/vault/bases.ts:43
    • impl:protocol.vault-notes · src/projections/vault/notes.ts:45

    Referencing units

    None.

    Enabled verifiers: spec:consumers.obsidian-vault.bases.views-match-sources

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.review-perspectives

    Implementing units

    • impl:protocol.perspective-filter-recipe · test/iteration-recipes.test.ts:753

    Referencing units

    None.

    Enabled verifiers: test:protocol.perspective-filter-recipe

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

  • spec:consumers.spec-studio.data.inputs

    Implementing units

    • impl:protocol.studio-base-input · src/cli/studio-inputs.ts:9
    • impl:protocol.studio-command · src/cli/studio-command.ts:106
    • impl:protocol.studio-inputs · src/projections/studio/inputs.ts:1

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.data.inputs.both-given, spec:consumers.spec-studio.data.inputs.graph-only

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.data.recipe-answers

    Implementing units

    • impl:protocol.studio-recipes · src/projections/studio/recipes.ts:34

    Referencing units

    • impl:protocol.studio-register-contracts · src/projections/studio/pages/register-answers.ts:4

    Enabled verifiers: test:protocol.studio-lenses

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.diagram-kinds.requirement-trace

    Implementing units

    • impl:protocol.studio-requirement-diagram · src/projections/studio/diagrams/requirement.ts:12
    • impl:protocol.studio-requirement-view · src/projections/studio/pages/requirement-view.ts:8

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-architecture-maturity-requirement, test:protocol.studio-diagram-core

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.diagrams

    Implementing units

    • impl:protocol.studio-architecture-diagrams · src/projections/studio/diagrams/architecture.ts:4
    • impl:protocol.studio-diagram-element · src/studio-elements/diagram.ts:23
    • impl:protocol.studio-diagram-model · src/projections/studio/diagrams/model.ts:1
    • impl:protocol.studio-diagrams · src/projections/studio/diagrams/svg.ts:73
    • impl:protocol.studio-relation-diagrams · src/projections/studio/diagrams/bands.ts:10

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.diagrams.folds-by-context, spec:consumers.spec-studio.diagrams.folds-by-layer, spec:consumers.spec-studio.diagrams.within-bound, test:protocol.studio-diagram-core

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.lenses

    Implementing units

    • impl:protocol.studio-architecture-lens · src/projections/studio/pages/architecture-page.ts:50
    • impl:protocol.studio-evidence-lens · src/projections/studio/pages/evidence-page.ts:3
    • impl:protocol.studio-frame · src/projections/studio/pages/frame.ts:6
    • impl:protocol.studio-tests-lens · src/projections/studio/pages/tests-page.ts:34

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-lenses

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.lenses.packs

    Implementing units

    • impl:protocol.studio-index-page · src/projections/studio/pages/index-page.ts:8

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-lenses

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.lenses.tests.coverage-row

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-tests-coverage-row

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.publisher

    Implementing units

    • impl:protocol.build-pipeline-emit · src/cli/build-command.ts:251
    • impl:protocol.studio-command · src/cli/studio-command.ts:106
    • impl:protocol.studio-page-catalog · src/projections/studio/pages/index.ts:21
    • impl:protocol.studio-paths · src/projections/studio/paths.ts:2
    • impl:protocol.studio-publish · src/projections/studio/publish.ts:24

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-data, test:protocol.studio-publisher

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.publisher.watch

    Implementing units

    • impl:protocol.studio-watch · src/cli/studio-command.ts:122

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.publisher.watch.matches-plain-run

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.sharing.stamp-written-apart

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-stamp-apart

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.wholesale-view-rewrite

    Implementing units

    • impl:protocol.build-pipeline-emit · src/cli/build-command.ts:251
    • impl:protocol.wholesale-view-rewrite · src/cli/validate-view-command.ts:128

    Referencing units

    None.

    Enabled verifiers: 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

    Packs: pack:self-hosting-v1

  • spec:decisions.adopt-the-nouns

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:decisions.authored-entry-order

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:decisions.concept-docs-dissolve

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:decisions.envelope-grammar-posture

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:decisions.executable-meta-model

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:decisions.gherkin-carrier-option

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:decisions.pack-design-page

    Implementing units

    None.

    Referencing units

    • impl:protocol.pack-design-page · src/projections/design-review-pages.ts:120

    Enabled verifiers: None

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

  • spec:decisions.pack-markdown-carrier

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:decisions.plain-language-references

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:decisions.protocol-naming

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:decisions.sdp-gherkin-extension

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:extraction.pack-member-order.manifest-order-kept

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.pack-member-order

    Packs: pack:self-hosting-v1

  • spec:model.design-maturity

    Implementing units

    • impl:protocol.pack-design · src/reader/reader.ts:499

    Referencing units

    None.

    Enabled verifiers: test:protocol.pack-design

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

  • spec:protocol.capability-epics

    Implementing units

    • impl:protocol.capability-epics · test/recipes.test.ts:8173

    Referencing units

    None.

    Enabled verifiers: test:protocol.capability-epics

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:protocol.structural-self-binding

    Implementing units

    • impl:protocol.structural-self-binding · test/self-hosting-oracle/structural-edges.ts:76

    Referencing units

    None.

    Enabled verifiers: test:protocol.structural-self-binding

    Packs: pack:self-hosting-v1

  • spec:validation.corpus-rules

    Implementing units

    • impl:protocol.corpus-rule-runner · src/cli/corpus-rules.ts:65
    • impl:protocol.corpus-rules · src/cli/validate-view-command.ts:79
    • impl:protocol.validate-watch · src/cli/validate-watch.ts:591

    Referencing units

    None.

    Enabled verifiers: spec:consumers.agent-surface.address-and-cycle-recipes.cycle-fails-a-rules-run, spec:consumers.agent-surface.address-and-cycle-recipes.unresolved-address-fails-a-rules-run, spec:validation.corpus-rules.copies-contain-changes, spec:validation.corpus-rules.error-finding-fails, spec:validation.corpus-rules.malformed-finding-fails, spec:validation.corpus-rules.params-edit-starts-a-cycle, spec:validation.corpus-rules.rules-edit-starts-a-cycle, spec:validation.corpus-rules.unreadable-params-fail-one-file, spec:validation.corpus-rules.warning-finding-informs

    Packs: pack:adopter-speed-v1, pack:corpus-checks-v1, pack:design-management-v1, pack:self-hosting-v1

  • spec:validation.diagnostic-rendering

    Implementing units

    • impl:protocol.diagnostic-rendering-cli · src/cli/output.ts:23
    • impl:protocol.diagnostic-rendering-design-review · src/projections/design-review-context.ts:208
    • impl:protocol.validate-summary · src/cli/validate-view-command.ts:23
    • impl:protocol.validation-contracts · src/validate/contracts.ts:5

    Referencing units

    None.

    Enabled verifiers: spec:validation.diagnostic-rendering.composed-location, spec:validation.diagnostic-rendering.table-cell-location

    Packs: pack:self-hosting-v1

  • spec:validation.superseded-decision-signal.branch-names-every-end

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.superseded-decision-signal.branch-names-every-end

    Packs: pack:self-hosting-v1

  • spec:validation.superseded-decision-signal.chain-end-named

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.superseded-decision-signal.chain-end-named

    Packs: pack:self-hosting-v1

  • spec:validation.superseded-decision-signal.closed-chain-named

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.superseded-decision-signal.closed-chain-named

    Packs: pack:self-hosting-v1

  • spec:validation.superseded-decision-signal.dependency-unread

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.superseded-decision-signal.dependency-unread

    Packs: pack:self-hosting-v1

  • spec:validation.superseded-decision-signal.end-and-loop-named

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.superseded-decision-signal.end-and-loop-named

    Packs: pack:self-hosting-v1

  • spec:validation.superseded-decision-signal.live-replacement-warns

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.superseded-decision-signal.live-replacement-warns

    Packs: pack:self-hosting-v1

  • spec:validation.superseded-decision-signal.replaced-ruling-warns

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.superseded-decision-signal.replaced-ruling-warns

    Packs: pack:self-hosting-v1

  • spec:validation.superseded-decision-signal.replacement-below-ready-named

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.superseded-decision-signal.replacement-below-ready-named

    Packs: pack:self-hosting-v1

  • spec:validation.superseded-decision-signal.superseded-subject-silent

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.superseded-decision-signal.superseded-subject-silent

    Packs: pack:self-hosting-v1

Distance 6

  • spec:carrier.step-keys.conflicting-example-key-withheld

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.step-keys.conflicting-example-key-withheld

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

  • spec:carrier.step-keys.gherkin-keyed-step-stays-bound

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.step-keys.gherkin-keyed-step-stays-bound

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

  • spec:carrier.step-keys.key-equal-to-a-skeleton-withheld

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.step-keys.key-equal-to-a-skeleton-withheld

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

  • spec:carrier.step-keys.malformed-marker-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.step-keys.malformed-marker-refused

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

  • spec:carrier.step-keys.renamed-key-breaks

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.step-keys.renamed-key-breaks

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

  • spec:carrier.step-keys.repeated-key-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.step-keys.repeated-key-refused

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

  • spec:carrier.step-keys.reworded-keyed-step-stays-bound

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.step-keys.reworded-keyed-step-stays-bound

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

  • spec:carrier.step-keys.reworded-unkeyed-step-breaks

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.step-keys.reworded-unkeyed-step-breaks

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

  • spec:carrier.step-keys.two-keys-on-one-step-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.step-keys.two-keys-on-one-step-refused

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

  • spec:carrier.step-keys.typescript-keyed-step-imports-keyed

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.step-keys.typescript-keyed-step-imports-keyed

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

  • spec:consumers.binding-language-views.bound-spec-page

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.binding-language-views.bound-spec-page

    Packs: pack:self-hosting-v1

  • spec:consumers.binding-language-views.pack-member-table

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.binding-language-views.pack-member-table

    Packs: pack:self-hosting-v1

  • spec:consumers.census-page

    Implementing units

    • impl:protocol.census-page · src/projections/census.ts:21
    • impl:protocol.census-page-cli · src/cli/census-command.ts:66

    Referencing units

    None.

    Enabled verifiers: test:protocol.census-page

    Packs: pack:self-hosting-v1

  • spec:consumers.derived-readiness-banner.dishonest-divergence

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.derived-readiness-banner.dishonest-divergence

    Packs: pack:self-hosting-v1

  • spec:consumers.derived-readiness-banner.honest-headroom

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.derived-readiness-banner.honest-headroom

    Packs: pack:self-hosting-v1

  • spec:consumers.mermaid-view

    Implementing units

    • impl:protocol.mermaid-view · src/projections/mermaid.ts:14
    • impl:protocol.mermaid-view-cli · src/cli/mermaid-command.ts:82

    Referencing units

    None.

    Enabled verifiers: test:protocol.mermaid-view

    Packs: pack:self-hosting-v1

  • spec:consumers.obsidian-vault

    Implementing units

    • impl:protocol.vault-command · src/cli/vault-command.ts:191
    • impl:protocol.vault-notes · src/projections/vault/notes.ts:45
    • impl:protocol.vault-sync · src/projections/vault/sync.ts:98

    Referencing units

    None.

    Enabled verifiers: spec:consumers.obsidian-vault.changed-note-refused, spec:consumers.obsidian-vault.failed-extraction-keeps-notes, spec:consumers.obsidian-vault.failed-extraction-recovered, spec:consumers.obsidian-vault.fresh-vault, spec:consumers.obsidian-vault.hidden-file-refused, spec:consumers.obsidian-vault.interrupted-run-recovered, spec:consumers.obsidian-vault.person-notes-survive, spec:consumers.obsidian-vault.unknown-note-refused, spec:consumers.obsidian-vault.vault-in-build-path-refused

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.obsidian-vault.bases.views-match-sources

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.bases.views-match-sources

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.data.inputs.both-given

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-inputs-both-given

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.data.inputs.graph-only

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-graph-only

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.diagram-kinds

    Implementing units

    • impl:protocol.studio-architecture-lens · src/projections/studio/pages/architecture-page.ts:50
    • impl:protocol.studio-capability-diagrams · src/projections/studio/diagrams/capability.ts:101
    • impl:protocol.studio-diagram-layout · src/projections/studio/diagrams/layout.ts:140
    • impl:protocol.studio-diagram-source · src/projections/studio/diagrams/mermaid.ts:13
    • impl:protocol.studio-diagrams · src/projections/studio/diagrams/svg.ts:73
    • impl:protocol.studio-maturity-map · src/projections/studio/pages/maturity-map.ts:7
    • impl:protocol.studio-requirement-diagram · src/projections/studio/diagrams/requirement.ts:12
    • impl:protocol.studio-slice-architecture · src/projections/studio/diagrams/slice.ts:219
    • impl:protocol.studio-slice-dependencies · src/projections/studio/diagrams/slice.ts:10

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-diagram-catalog

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.diagram-kinds.edge-routing

    Implementing units

    • impl:protocol.studio-diagram-routing · src/projections/studio/diagrams/routing.ts:38
    • impl:protocol.studio-diagrams · src/projections/studio/diagrams/svg.ts:73

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-diagram-core

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.diagram-kinds.legibility

    Implementing units

    • impl:protocol.studio-diagram-element · src/studio-elements/diagram.ts:23
    • impl:protocol.studio-diagram-layout · src/projections/studio/diagrams/layout.ts:140
    • impl:protocol.studio-diagrams · src/projections/studio/diagrams/svg.ts:73

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-diagram-core

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.diagrams.folds-by-context

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-diagram-folds-context

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.diagrams.folds-by-layer

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-diagram-folds-layer

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.diagrams.within-bound

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-diagram-within-bound

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.diff-page

    Implementing units

    • impl:protocol.studio-diff · src/projections/studio/pages/diff-page.ts:91

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.diff-page.changed-entry, test:protocol.roadmap-priority

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.lenses.architecture

    Implementing units

    • impl:protocol.studio-architecture-lens · src/projections/studio/pages/architecture-page.ts:50

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.lenses.architecture.planned-apart, test:protocol.studio-architecture-maturity-requirement

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.lenses.evidence

    Implementing units

    • impl:protocol.studio-evidence-lens · src/projections/studio/pages/evidence-page.ts:3

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-lenses

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.publisher.watch.matches-plain-run

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-watch-plain

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.runs-page

    Implementing units

    • impl:protocol.studio-run-rows · src/projections/studio/pages/run-rows.ts:69
    • impl:protocol.studio-runs-page · src/projections/studio/pages/runs-page.ts:6

    Referencing units

    None.

    Enabled verifiers: spec:consumers.spec-studio.runs-page.external-evidence

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.wholesale-view-rewrite.build-invalidates-view

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.wholesale-view-rewrite.build-invalidates-view

    Packs: pack:self-hosting-v1

  • spec:consumers.wholesale-view-rewrite.failed-run-view-removed

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.wholesale-view-rewrite.failed-run-view-removed

    Packs: pack:self-hosting-v1

  • spec:consumers.wholesale-view-rewrite.late-stale-page

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.wholesale-view-rewrite.late-stale-page

    Packs: pack:self-hosting-v1

  • spec:consumers.wholesale-view-rewrite.stale-page-removed

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.wholesale-view-rewrite.stale-page-removed

    Packs: pack:self-hosting-v1

  • spec:decisions.roadmap-priority

    Implementing units

    None.

    Referencing units

    • impl:protocol.pack-aggregate · src/model/pack.ts:23
    • impl:protocol.pack-member-order · src/extract/derive.ts:153

    Enabled verifiers: None

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:extraction.executable-contracts

    Implementing units

    • impl:protocol.example-space · src/graph/example-space.ts:117
    • impl:protocol.executable-contracts · src/codegen/contracts.ts:647

    Referencing units

    None.

    Enabled verifiers: spec:carrier.step-keys.conflicting-example-key-withheld, spec:carrier.step-keys.key-equal-to-a-skeleton-withheld, spec:carrier.step-keys.reworded-keyed-step-stays-bound, spec:carrier.step-keys.reworded-unkeyed-step-breaks, spec:extraction.executable-contracts.case-colliding-path, spec:extraction.executable-contracts.concreteness-refusal, spec:extraction.executable-contracts.multi-entry-example

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

  • spec:extraction.runnable-modules

    Implementing units

    • component:protocol.codegen · src/codegen/contracts.ts:633
    • component:protocol.testing · src/testing/index.ts:38
    • impl:protocol.example-testing-helpers · src/testing/index.ts:50
    • impl:protocol.runnable-modules · src/codegen/contracts.ts:658

    Referencing units

    None.

    Enabled verifiers: test:protocol.runnable-modules, test:protocol.runnable-modules-generation, test:protocol.runnable-modules-types

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

  • spec:protocol.role-vocabulary

    Implementing units

    • impl:protocol.role-vocabulary · test/self-hosting-graph.test.ts:143

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:protocol.significant-units-review

    Implementing units

    • impl:protocol.structural-self-binding · test/self-hosting-oracle/structural-edges.ts:76

    Referencing units

    None.

    Enabled verifiers: test:protocol.structural-self-binding

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:validation.architecture-constraints

    Implementing units

    • impl:protocol.architecture-walk-recipe · test/architecture-recipes.test.ts:10

    Referencing units

    None.

    Enabled verifiers: spec:validation.architecture-constraints.forbidden-layer-pair, spec:validation.architecture-constraints.isolated-context-as-rule, spec:validation.architecture-constraints.unstated-layer-unclassified

    Packs: pack:corpus-checks-v1, pack:design-management-v1, pack:self-hosting-v1

  • spec:validation.corpus-rules.copies-contain-changes

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.validation.corpus-rules.copies-contain-changes

    Packs: pack:corpus-checks-v1, pack:self-hosting-v1

  • spec:validation.corpus-rules.error-finding-fails

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.validation.corpus-rules.error-finding-fails

    Packs: pack:corpus-checks-v1, pack:self-hosting-v1

  • spec:validation.corpus-rules.malformed-finding-fails

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.validation.corpus-rules.malformed-finding-fails

    Packs: pack:corpus-checks-v1, pack:self-hosting-v1

  • spec:validation.corpus-rules.params-edit-starts-a-cycle

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.validation.corpus-rules.params-edit-starts-a-cycle

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

  • spec:validation.corpus-rules.rules-edit-starts-a-cycle

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.validation.corpus-rules.rules-edit-starts-a-cycle

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

  • spec:validation.corpus-rules.unreadable-params-fail-one-file

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.validation.corpus-rules.unreadable-params-fail-one-file

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

  • spec:validation.corpus-rules.warning-finding-informs

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.validation.corpus-rules.warning-finding-informs

    Packs: pack:corpus-checks-v1, pack:self-hosting-v1

  • spec:validation.diagnostic-rendering.composed-location

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.diagnostic-rendering.composed-location

    Packs: pack:self-hosting-v1

  • spec:validation.diagnostic-rendering.table-cell-location

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.diagnostic-rendering.table-cell-location

    Packs: pack:self-hosting-v1

Distance 7

  • spec:consumers.design-diff

    Implementing units

    • impl:protocol.design-diff-recipe · test/iteration-recipes.test.ts:27

    Referencing units

    None.

    Enabled verifiers: test:protocol.design-diff-recipe, test:protocol.roadmap-priority

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

  • spec:consumers.obsidian-vault.changed-note-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.changed-note-refused

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.obsidian-vault.failed-extraction-keeps-notes

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.failed-extraction-keeps-notes

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.obsidian-vault.failed-extraction-recovered

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.failed-extraction-recovered

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.obsidian-vault.fresh-vault

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.fresh-vault

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.obsidian-vault.hidden-file-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.hidden-file-refused

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.obsidian-vault.interrupted-run-recovered

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.interrupted-run-recovered

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.obsidian-vault.person-notes-survive

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.person-notes-survive

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.obsidian-vault.unknown-note-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.unknown-note-refused

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.obsidian-vault.vault-in-build-path-refused

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.consumers.obsidian-vault.vault-in-build-path-refused

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.diagram-kinds.capability-tree

    Implementing units

    • impl:protocol.studio-capability-diagrams · src/projections/studio/diagrams/capability.ts:101
    • impl:protocol.studio-diagram-source · src/projections/studio/diagrams/mermaid.ts:13

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-capabilities

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.diagram-kinds.maturity-picture

    Implementing units

    • impl:protocol.studio-maturity-map · src/projections/studio/pages/maturity-map.ts:7

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-architecture-maturity-requirement

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:consumers.spec-studio.diff-page.changed-entry

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-diff-changed-entry

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.lenses.architecture.planned-apart

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-architecture-planned-apart

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.lenses.architecture.unit-register

    Implementing units

    • impl:protocol.studio-unit-register · src/projections/studio/pages/architecture-register.ts:7

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-architecture-maturity-requirement

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.spec-studio.runs-page.external-evidence

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.run-external

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

  • spec:consumers.structural-mermaid

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

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

  • spec:decisions.adopted-registrars-committed

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:decisions.roadmap-over-plans

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:roadmaps-and-slices-v1, pack:self-hosting-v1

  • spec:decisions.vault-owned-folder

    Implementing units

    None.

    Referencing units

    • impl:protocol.vault-command · src/cli/vault-command.ts:191
    • impl:protocol.vault-sync · src/projections/vault/sync.ts:98

    Enabled verifiers: None

    Packs: pack:obsidian-vault-v1, pack:self-hosting-v1

  • spec:extraction.example-runner

    Implementing units

    • component:protocol.adapters · src/adapters/vitest.ts:23
    • component:protocol.runner · src/runner/index.ts:99
    • impl:protocol.example-runner · src/runner/index.ts:108
    • impl:protocol.example-runner-adapter · src/adapters/vitest.ts:32

    Referencing units

    None.

    Enabled verifiers: spec:extraction.example-runner.red-step-naming, spec:extraction.example-runner.step-order, test:protocol.example-runner-cleanup

    Packs: pack:self-hosting-v1

  • spec:extraction.executable-contracts.case-colliding-path

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.executable-contracts.case-colliding-path

    Packs: pack:self-hosting-v1

  • spec:extraction.executable-contracts.concreteness-refusal

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.executable-contracts.concreteness-refusal

    Packs: pack:self-hosting-v1

  • spec:extraction.executable-contracts.multi-entry-example

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.executable-contracts.multi-entry-example

    Packs: pack:self-hosting-v1

  • spec:model.pack-aggregate

    Implementing units

    • impl:protocol.pack-aggregate · src/model/pack.ts:23

    Referencing units

    None.

    Enabled verifiers: test:protocol.pack-builder, test:protocol.roadmap-priority

    Packs: pack:self-hosting-v1

  • spec:validation.architecture-constraints.forbidden-layer-pair

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.validation.architecture-constraints.forbidden-layer-pair

    Packs: pack:corpus-checks-v1, pack:self-hosting-v1

  • spec:validation.architecture-constraints.isolated-context-as-rule

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.validation.architecture-constraints.isolated-context-as-rule

    Packs: pack:corpus-checks-v1, pack:self-hosting-v1

  • spec:validation.architecture-constraints.unstated-layer-unclassified

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.validation.architecture-constraints.unstated-layer-unclassified

    Packs: pack:corpus-checks-v1, pack:self-hosting-v1

Distance 8

  • spec:decisions.pack-reified

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: None

    Packs: pack:self-hosting-v1

  • spec:extraction.example-runner.red-step-naming

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.example-runner.red-step-naming

    Packs: pack:self-hosting-v1

  • spec:extraction.example-runner.step-order

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.example-runner.step-order

    Packs: pack:self-hosting-v1

  • spec:validation.pack-coherence

    Implementing units

    • impl:protocol.pack-coherence · src/validate/validators.ts:1102

    Referencing units

    None.

    Enabled verifiers: spec:validation.pack-coherence.incoherent-aggregate

    Packs: pack:self-hosting-v1

Distance 9

  • spec:validation.pack-coherence.incoherent-aggregate

    Implementing units

    None.

    Referencing units

    None.

    Enabled verifiers: test:protocol.pack-coherence.incoherent-aggregate

    Packs: pack:self-hosting-v1

Relations

Relation and directionOther endClaimReasonExercised keys
decidedBy · outgoingspec:decisions.checked-mentions
spec:decisions.checked-mentions · resolves
declareda term address joins the address law that decision rulesNone
decidedBy · outgoingspec:decisions.shipped-projections-frozen
spec:decisions.shipped-projections-frozen · resolves
declaredterm keys stay off the frozen projections, which read the definition unchangedNone
dependsOn · outgoingspec:extraction.entry-locations
spec:extraction.entry-locations · resolves
declaredadds a row per Model term to the location tableNone
dependsOn · outgoingspec:model.rule-keys
spec:model.rule-keys · resolves
declaredthe term-key design follows the rule-entry address patternNone
dependsOn · outgoingspec:model.stable-ids
spec:model.stable-ids · resolves
declareda term address extends the Spec entry-address grammarNone
refines · outgoingspec:model.spec-sections
spec:model.spec-sections · resolves
declaredextends entry addresses to the terms a Model section definesNone
dependsOn · incomingspec:carrier.markdown-body-grammar
spec:carrier.markdown-body-grammar · resolves
declareda Model definition may open with a term key markerNone
dependsOn · incomingspec:consumers.agent-surface.address-and-cycle-recipes
spec:consumers.agent-surface.address-and-cycle-recipes · resolves
declareda term address resolves through the Spec's term keysNone
dependsOn · incomingspec:consumers.agent-surface.register-recipes
spec:consumers.agent-surface.register-recipes · resolves
declaredentry search and the mention audit read term addressesNone
dependsOn · incomingEvery Spec, Pack, code unit and keyed term is a note, and every relation is a link
spec:consumers.obsidian-vault.notes · resolves
declareda term note exists for a Model term that carries a key and so an addressNone
dependsOn · incomingspec:consumers.spec-studio.glossary-page
spec:consumers.spec-studio.glossary-page · resolves
declareda keyed term's address links it to its definitionNone
dependsOn · incomingspec:consumers.spec-studio.spec-page
spec:consumers.spec-studio.spec-page · resolves
declareda keyed term's address names the element a glossary row links toNone
dependsOn · incomingspec:consumers.upgrade-kit.capability-adoption
spec:consumers.upgrade-kit.capability-adoption · resolves
declaredterm keys are counted where Model terms areNone
dependsOn · incomingspec:validation.prose-mentions
spec:validation.prose-mentions · resolves
declareda term address resolves through the Spec's term keysNone
refines · incomingspec:model.term-addresses.keyed-term-resolves
spec:model.term-addresses.keyed-term-resolves · resolves
declaredNoneNone
refines · incomingspec:model.term-addresses.malformed-term-marker-refused
spec:model.term-addresses.malformed-term-marker-refused · resolves
declaredNoneNone
refines · incomingspec:model.term-addresses.repeated-term-key-refused
spec:model.term-addresses.repeated-term-key-refused · resolves
declaredNoneNone
refines · incomingspec:model.term-addresses.typescript-term-imports-keyed
spec:model.term-addresses.typescript-term-imports-keyed · resolves
declaredNoneNone
refines · incomingspec:model.term-addresses.unknown-term-key-refused
spec:model.term-addresses.unknown-term-key-refused · resolves
declaredNoneNone
verifies · incomingspec:model.term-addresses.keyed-term-resolves
spec:model.term-addresses.keyed-term-resolves · resolves
declaredNonetermMarker, termAddress, termLocations, termReaders
verifies · incomingspec:model.term-addresses.malformed-term-marker-refused
spec:model.term-addresses.malformed-term-marker-refused · resolves
declaredNonetermMarker, markerRefusals
verifies · incomingspec:model.term-addresses.repeated-term-key-refused
spec:model.term-addresses.repeated-term-key-refused · resolves
declaredNoneuniqueTermKeys, markerRefusals
verifies · incomingspec:model.term-addresses.typescript-term-imports-keyed
spec:model.term-addresses.typescript-term-imports-keyed · resolves
declaredNonetermMarker, termAddress
verifies · incomingspec:model.term-addresses.unknown-term-key-refused
spec:model.term-addresses.unknown-term-key-refused · resolves
declaredNoneauthoredKey, termAddress, termReaders

Bindings

Implementation binding: present

  • impl:protocol.address-and-cycle-recipes · asserts realization of the shipped address resolution and dependency cycle recipes · test/recipes.test.ts:3568
  • impl:protocol.entry-locations · builds the carrier entry location table · src/extract/derive.ts:78 · role extractor · component component:protocol.extract · layer application · context protocol
  • impl:protocol.key-markers · normalizes step and term markers across the three carriers · src/extract/key-markers.ts:136 · role codec · component component:protocol.extract · layer application · context protocol
  • impl:protocol.open-section-order · preserves authored open-section and model-term order and Pack field order · src/extract/serialize.ts:105 · role codec · component component:protocol.extract · layer application · context protocol
  • impl:protocol.prose-mentions · checks that prose mentions resolve and warns once per unbacked Spec pair · src/validate/validators.ts:1370 · role validator · component component:protocol.validate · layer domain · context protocol
  • impl:protocol.register-recipes · asserts realization of the shipped register recipes · test/recipes.test.ts:2057
  • impl:protocol.sdp-import-markdown-emit · emits the Markdown document twin for an imported Spec · src/import/emit-markdown.ts:253 · role codec · component component:protocol.import · layer application · context protocol
  • impl:protocol.spec-sections · typed Spec section shapes · src/model/sections.ts:138 · role contract · component component:protocol.model · layer domain · context protocol
  • impl:protocol.stable-ids · stable ID grammar parser · src/ids.ts:173 · role codec · component component:protocol.model · layer domain · context protocol

Design reference: none

Verifier binding: present

  • spec:model.term-addresses.keyed-term-resolves · A keyed term is reified and its address resolves · declared · specs/model/term-addresses.keyed-term-resolves.sdp.md · example enabled
  • spec:model.term-addresses.malformed-term-marker-refused · A term marker whose key is off the grammar refuses its carrier · declared · specs/model/term-addresses.malformed-term-marker-refused.sdp.md · example enabled
  • spec:model.term-addresses.repeated-term-key-refused · A term key repeated in one Spec refuses its carrier · declared · specs/model/term-addresses.repeated-term-key-refused.sdp.md · example enabled
  • spec:model.term-addresses.typescript-term-imports-keyed · A keyed TypeScript term keeps its address through import to Markdown · declared · specs/model/term-addresses.typescript-term-imports-keyed.sdp.md · example enabled
  • spec:model.term-addresses.unknown-term-key-refused · An address that names a term key no term carries is an error · declared · specs/model/term-addresses.unknown-term-key-refused.sdp.md · example enabled
  • test:protocol.keyed-content · anchored · test/keyed-content.test.ts:28 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.