Spec Studio

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

  • spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes · A carrier edit under watch rewrites only the notes it changes · declared · example enabled · specs/consumers/obsidian-vault.iteration.watch-rewrites-changed-notes.sdp.md

    External run evidence from test/vault-examples.test.ts

    Test anchors: test:protocol.consumers.obsidian-vault.bases.views-match-sources, test:protocol.consumers.obsidian-vault.changed-note-refused, test:protocol.consumers.obsidian-vault.failed-extraction-keeps-notes, test:protocol.consumers.obsidian-vault.failed-extraction-recovered, test:protocol.consumers.obsidian-vault.fresh-vault, test:protocol.consumers.obsidian-vault.hidden-file-refused, test:protocol.consumers.obsidian-vault.interrupted-run-recovered, test:protocol.consumers.obsidian-vault.iteration.watch-rewrites-changed-notes, test:protocol.consumers.obsidian-vault.iteration.watch-source-anchor, test:protocol.consumers.obsidian-vault.notes.case-collision-refused, test:protocol.consumers.obsidian-vault.notes.entry-address-link, test:protocol.consumers.obsidian-vault.notes.term-address-link, test:protocol.consumers.obsidian-vault.notes.unresolved-mention-stays, test:protocol.consumers.obsidian-vault.person-notes-survive, test:protocol.consumers.obsidian-vault.unknown-note-refused, test:protocol.consumers.obsidian-vault.vault-in-build-path-refused. Specs verified by those bindings: spec:consumers.obsidian-vault, spec:consumers.obsidian-vault.bases, spec:consumers.obsidian-vault.bases.views-match-sources, 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.iteration, spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes, spec:consumers.obsidian-vault.iteration.watch-source-anchor, spec:consumers.obsidian-vault.notes, 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, spec:consumers.obsidian-vault.person-notes-survive, spec:consumers.obsidian-vault.unknown-note-refused, spec:consumers.obsidian-vault.vault-in-build-path-refused.

    Run 1: external run evidence from vitest 4.1.10

    Build: CI 391 · Branch: cursor/media-plan-and-articles-09b1 · Commit: 076cd4f1f85640d8236e5cca1bffffa68ab79a33 · Start: 2026-10-31T15:32:20.471Z · Stop: 2026-10-31T15:34:02.073Z

    NameSuiteResultDuration
    keeps incomplete oracle points unspecifiednot recordedpassed1.97 ms
    executes the bound example against a fresh worldA fresh vault is written the same way twice and every link resolves (spec:consumers.obsidian-vault.fresh-vault)passed40.74 ms
    executes the bound example against a fresh worldA regeneration removes a note that left the graph and keeps a person's notes (spec:consumers.obsidian-vault.person-notes-survive)passed21.7 ms
    executes the bound example against a fresh worldA note a person wrote inside the generated folder refuses the regeneration (spec:consumers.obsidian-vault.unknown-note-refused)passed5.97 ms
    executes the bound example against a fresh worldA generated note a person changed refuses the regeneration and keeps the edit (spec:consumers.obsidian-vault.changed-note-refused)passed5.29 ms
    executes the bound example against a fresh worldA person's file under a temporary's name refuses the regeneration (spec:consumers.obsidian-vault.hidden-file-refused)passed6.73 ms
    executes the bound example against a fresh worldA vault directory the build removes refuses the run and keeps a person's notes (spec:consumers.obsidian-vault.vault-in-build-path-refused)passed1.17 ms
    executes the bound example against a fresh worldA run after a stopped synchronization finishes it (spec:consumers.obsidian-vault.interrupted-run-recovered)passed34.66 ms
    executes the bound example against a fresh worldA failed extraction keeps the notes and says so on the index (spec:consumers.obsidian-vault.failed-extraction-keeps-notes)passed12.45 ms
    executes the bound example against a fresh worldThe run after a failed extraction passes the guard and restores the index (spec:consumers.obsidian-vault.failed-extraction-recovered)passed22.28 ms
    executes the bound example against a fresh worldAn entry address in prose opens the entry's block in its Spec's note (spec:consumers.obsidian-vault.notes.entry-address-link)passed14.02 ms
    executes the bound example against a fresh worldA mention of an entry that does not exist stays as written (spec:consumers.obsidian-vault.notes.unresolved-mention-stays)passed9.02 ms
    executes the bound example against a fresh worldA keyed Model term gets a note, and its address in prose opens the term's block (spec:consumers.obsidian-vault.notes.term-address-link)passed11.72 ms
    executes the bound example against a fresh worldTwo Specs whose notes differ only in case refuse the run (spec:consumers.obsidian-vault.notes.case-collision-refused)passed2.38 ms
    executes the bound example against a fresh worldEach standing view selects what its source selects (spec:consumers.obsidian-vault.bases.views-match-sources)passed30.9 ms
    executes the bound example against a fresh worldA carrier edit under watch rewrites only the notes it changes (spec:consumers.obsidian-vault.iteration.watch-rewrites-changed-notes)passed486.87 ms
    executes the bound example against a fresh worldAn anchor added in a source file under watch rewrites the Spec's note (spec:consumers.obsidian-vault.iteration.watch-source-anchor)passed626.34 ms
  • spec:consumers.obsidian-vault.iteration.watch-source-anchor · An anchor added in a source file under watch rewrites the Spec's note · declared · example enabled · specs/consumers/obsidian-vault.iteration.watch-source-anchor.sdp.md

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
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

Rested on by

Distance 1

Relations

Relation and directionOther endClaimReasonExercised keys
dependsOn · outgoingViews compose scoped intent instead of patching canonical source
spec:consumers.edit-model · resolves
declaredthe vault composes intent and never patches a carrierNone
dependsOn · outgoingA change proposal is addressed, based and checked before it lands
spec:consumers.intent-composition.proposal · resolves
declaredintent composed in the vault hands off on the one proposal contractNone
dependsOn · outgoingValidation re-runs while an author edits carriers
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.

Composing (0)

Composing needs the script.