vaultspec-core
Document syntaxLink to Document syntax
Create documents with vaultspec-core vault add; record execution with
vaultspec-core vault exec log, which creates the plan’s ledger when needed.
Who owns whatLink to Who owns what
Frontmatter, field by field:
Field |
Who changes it |
How |
|---|---|---|
|
The tool |
Set from |
|
The tool |
Set at scaffold; the filename embeds the same date. |
|
The tool |
Refreshed by every command that writes the document. |
|
The tool |
Records which body structure the document follows. |
|
The tool |
A fingerprint of the body that |
|
You |
|
|
You |
Through |
|
The tool |
Marks a file that is rebuilt rather than authored. |
Bodies, by document type:
Body |
Who changes it |
How |
|---|---|---|
Prose in any scaffolded document |
You |
|
Rows in a plan |
You |
|
Rows in a ledger |
The tool |
|
A feature index, whole file |
The tool |
|
Plan rows look like ordinary Markdown, but their identifiers connect planned work to execution records. Change rows and checkboxes through the plan tools.
Editing safelyLink to Editing safely
Use set-body to replace prose and update modified and body_hash. By default, it
validates the result before writing and rejects changes with validation errors:
Command
vaultspec-core vault set-body <document> --body-file new-body.md
vaultspec-core vault edit <document> # body and frontmatter in one write
vaultspec-core vault rename <document> --to <new-stem> # also re-points incoming links
If you edit in your own editor instead, the document’s body_hash no longer matches its
body, and nothing has restamped modified. Run this afterwards:
Command
vaultspec-core vault check all --fix
Review the changed files, then rerun validation.
Before enabling commit-time checks with pre-commit install, review
hook behavior and project policy.
Installing .pre-commit-config.yaml alone does not activate the hooks.
FrontmatterLink to Frontmatter
Newly generated documents carry these six fields:
File contents
---
tags:
- '#plan'
- '#payment-retries'
date: '2026-02-06'
modified: '2026-02-06'
body_schema: 'body-v2'
body_hash: 'sha256:...'
related:
- '[[2026-02-06-payment-retries-adr]]'
---
Plans add tier; generated indexes add generated:
Type |
Extra field |
Holds |
|---|---|---|
plan |
|
The plan structure: |
index |
|
Always |
Execution ledgers link to their parent plan in related; each row carries its Step
identifier. See execution logging.
ADRs also use supersedes and superseded_by for replacement relationships, maintained
by vaultspec-core vault adr supersede. Their decision status is in the body heading,
not a frontmatter field. Follow the
decision lifecycle when changing it. Use the
owning commands for supported fields; don’t invent metadata.
The tag pairLink to The tag pair
Exactly two tags. One names the directory, one names the feature.
Directory |
Tag |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The feature tag is kebab-case and shared by that feature’s records. Filtering for
#payment-retries finds its records; their links can lead to decisions and evidence
under other feature tags. A feature does not need every document type.
Use only the directory tag and the feature tag; vault add --tags rejects additional
tags.
LinkingLink to Linking
Put links between vault documents in related: as quoted Obsidian-style wiki-links:
File contents
related:
- '[[2026-02-06-payment-retries-research]]'
- '[[2026-02-06-payment-retries-adr]]'
When creating a document, set links with vaultspec-core vault add --related.
Afterwards, use link add or
link remove.
Quote wiki-links so YAML reads them as strings, not nested sequences.
Store document stems without directories or
.md:[[document-stem]].Link only to existing documents. The
danglingcheck reports unresolved links.
Plans link their governing ADRs, even across feature tags. Supporting evidence is
reachable through those ADRs; direct evidence links are optional. A decision-free plan
can have an empty related list. See
choosing the route.
The body-links check rejects wiki-links and Markdown path links in body prose. Cite
code by locator instead, in backticks: src/billing/retry.py:42, commit abc1234, or
vaultspec-core@0.1.59.
Keep references one-way: vault documents cite code; source code must not cite vault documents.
Generated metadataLink to Generated metadata
The modified-stamp check compares the body against its stored body_hash, not
filesystem timestamps. Without a stored hash, it can’t detect an unstamped body edit.
The body-sections check uses body_schema to check the document’s sections. Newly
scaffolded documents use body-v2. See
validation and repair.
Template placeholdersLink to Template placeholders
Creation commands fill {feature} from --feature and {title} or {topic} from
--title. Complete remaining prose placeholders before committing.
Placeholder |
Filled by |
|---|---|
|
|
|
|
The placeholders check reports recognized tokens, date forms, and enum forms left in
body prose as errors. It skips comments, fenced code, and inline code except in
headings. It doesn’t check every brace expression or fill missing content. See the
check reference for commands and options.
FilenamesLink to Filenames
Core generates filenames in these forms:
Document |
Pattern |
|---|---|
Top-level |
|
With a topic infix |
|
Ledger |
|
Feature index |
|
Narrative segments are lowercase kebab-case. Ledgers use their parent plan’s date and
feature in both the folder and filename:
.vault/exec/2026-02-04-editor-demo/2026-02-04-editor-demo-ledger.md.
For adr, audit, reference, and research, use
vault add –topic to distinguish multiple records for
a feature.
Plan structureLink to Plan structure
Edit plan rows with the plan commands. Execution ledgers reference the plan’s Step identifiers.
TiersLink to Plan structure, Tiers
The tier declared in frontmatter decides which containers exist. Use the smallest structure that helps coordinate the work, not a tier based solely on file or worker count:
Tier |
Structure |
|---|---|
|
Steps only |
|
Phases above Steps |
|
Waves above Phases above Steps |
|
An Epic frame above Waves, and a declared project-management association |
Change tiers with vaultspec-core vault plan tier promote or tier demote. Promotion
preserves canonical identifiers. See the
plan command reference for demotion and collapse
options.
Row formatLink to Plan structure, Row format
One row per cohesive, verifiable change. For an L1 plan:
- [ ] `S07` - Make retry backoff configurable and verify its limits; `src/billing, tests/billing`.
Reading that row left to right:
Part |
Example |
|---|---|
Checkbox, two states only |
|
Display path, in backticks |
|
Spaced ASCII hyphen |
|
Imperative-verb action |
|
Semicolon |
|
File scope, in backticks |
|
Trailing period |
|
[ ] is open and [x] is closed. The format has no in-progress marker.
Write plain ASCII hyphens. The PLAN060 rule rejects em-dashes and en-dashes anywhere
in a plan: body, headings, frontmatter, and comment hints. vault plan check --fix
replaces them with an ASCII spaced hyphen.
Display pathsLink to Plan structure, Display paths
The identifier written in a row depends on the tier:
Tier |
Step path |
Phase heading |
Wave heading |
|---|---|---|---|
|
|
none |
none |
|
|
|
none |
|
|
|
|
Display paths reflect the current grouping. Moving a Phase to another Wave changes its Steps’ display paths without changing their canonical identifiers.
IdentifiersLink to Plan structure, Identifiers
Canonical identifiers (S##, P##, W##) are numbered per plan and stay stable across
moves and tier changes. A Step’s number is independent of its Phase.
Removed identifiers aren’t reused. The next Step number exceeds the highest live or retired Step number.
Route every identifier-affecting change through the commands:
Command
vaultspec-core vault plan step add <plan> --phase P02 --action "..." --scope "src/x.py"
vaultspec-core vault plan step check <plan> S07
vaultspec-core vault plan step remove <plan> S07
Run vaultspec-core vault plan check <plan> to check plan conventions;
vault check all does not include them. See
plan commands for options.
Duplicated canonical identifiers make ledger references ambiguous. Review the execution records before repairing a conflict; validation cannot determine which Step an existing record meant.
Step sizeLink to Plan structure, Step size
Keep implementation and its verification together when they form one cohesive change. Split work when it needs an independent completion state, not for every file or edit. Step size is a planning judgment; no structural check decides it.
Where to go nextLink to Where to go next
The framework manual covers the workflow these documents record. Verifying a workspace and a vault covers the checks named on this page and what each one proves.