This is the compact human-readable schema for a user vault. Operational details live in the skills and executable contracts. Product code and user-vault data must remain separate.
vault/
├── .gitignore # excludes vault-local runtime/session state
├── .claude-obsidian.json # workspace identity and vault selection
├── inbox/ # visible source intake; never auto-deleted
├── .raw/ # immutable source bytes
│ └── .manifest.json # backward-compatible delta/address metadata
├── wiki/ # generated, user-owned knowledge
│ ├── index.md # catalog and navigation
│ ├── log.md # completed operation history, newest first
│ ├── hot.md # bounded recent context, not a transcript
│ ├── overview.md # high-level synthesis
│ ├── sources/
│ ├── entities/
│ ├── concepts/
│ ├── questions/
│ ├── canvases/
│ └── meta/ledgers/
│ ├── source-ledger.json
│ └── claim-ledger.json
├── .obsidian/ # user-controlled Obsidian settings
└── .vault-meta/ # ignored locks, journals, indexes, queue/config
LYT, PARA, or Zettelkasten mode may route new pages differently. Mode changes do not migrate old notes or change evidence semantics.
- Existing source payloads below
.raw/are never replaced. .raw/.manifest.jsonis mutable metadata and changes only inside the same transaction as the operation it records.- New byte capture is content-addressed by SHA-256.
- A file in
inbox/remains until the user removes it. The core may propose deletion but never executes it. - Remote locators use validated HTTPS. Credentials do not belong in URLs, source notes, bundles, queues, or tracked configuration.
Use flat YAML with plural keys and YYYY-MM-DD dates:
---
type: concept
title: Source-grounded notes
status: developing
created: 2026-07-11
updated: 2026-07-11
tags:
- knowledge
- evidence
aliases: []
address: c-000001
---Required baseline properties are type, title, status, created,
updated, and tags. aliases and address are optional unless a configured
vault policy requires them.
Common page types:
| Type | Purpose |
|---|---|
source |
Traceable summary of one source identity |
entity |
Person, organization, product, project, or other named thing |
concept |
Idea, framework, mechanism, or definition |
question |
A scoped answer with visible evidence status |
comparison |
Criteria-based contrast with cited support |
session |
User-approved summary of selected conversation content |
overview |
High-level map of a domain or vault |
meta |
Index, log, cache, convention, or maintenance page |
fold |
Extractive rollup of identified log entries |
Common statuses are seed, active, developing, evergreen, answered,
provisional, contested, deprecated, and archived. Use only statuses the
vault's dashboards and conventions understand.
- Internal references use
[[Target]]or[[Target|Alias]]. - Headings and block references use
[[Target#Heading]]and[[Target#^block]]. - Embeds use
![[Attachment.ext]]. - Callouts use
> [!type] Title. - Fenced code is data; link-like text inside it is not a graph edge.
- Prefer basename links only when the basename is unique. Use a vault-relative path when duplicates would be ambiguous.
Do not fabricate a backlink merely to make the graph symmetric. Add links that help a reader navigate or understand a relationship.
The index is a curated catalog. Every linked target must resolve. An index entry
is not evidence by itself. Every canonical page create or removal updates at
least one active catalog or MOC in the same transaction. Update wiki/index.md
when it is that active catalog; methodology-specific MOCs may satisfy the
navigation invariant instead.
The log records completed logical operations, not individual file writes. Put the newest entry first and include the operation ID, operation type, principal pages, and a grounded outcome. Do not rewrite historical child entries when creating a fold.
Hot context is short, sanitized, and useful for the next session. It may include recent facts, changed pages, active threads, and unresolved questions. It must not contain secrets, raw transcripts, tool instructions, or claims that lack the same qualification found in canonical pages.
Hooks may read and emit this file as bounded data. They do not update it.
The overview synthesizes stable, high-level structure and links to supporting pages. It changes less frequently than hot context.
The source ledger separates evidence identity from prose. Each source record may include:
- stable ID and SHA-256;
- vault-relative file locator or HTTPS locator;
- authority:
official,primary,secondary,community,synthetic, orunknown; - independence key;
- retrieval/review timestamps and
refresh_due; - review state:
unreviewed,active,superseded, orrejected; - linked pages.
The claim ledger records a falsifiable claim, note location, supporting and
contradicting source IDs, confidence, risk, review state, and assessment:
accepted, provisional, contested, unsupported, or deprecated.
Accepted claims need active, fresh, non-synthetic support. High-risk accepted claims need two independent sources. Preserve contradictions and source lineage; do not silently select a winner.
One logical mutation is one bundle:
{
"schema": "claude-obsidian.transaction.v1",
"operation_id": "ingest-example",
"operation_type": "ingest",
"expected_hashes": {
"wiki/sources/Example.md": null
},
"writes": [
{
"path": "wiki/sources/Example.md",
"mode": "create",
"content_file": "drafts/example.md",
"sha256": "DRAFT_SHA256"
}
],
"address_requests": [
{"path": "wiki/sources/Example.md", "prefix": "c"}
],
"source_manifest_updates": {}
}Inline content is UTF-8 text. content_file may contain text or binary bytes
and must match its declared hash. Raw payload paths are create-only.
Inspect before apply:
python3 scripts/claude-obsidian.py transaction inspect <bundle> --vault <vault>
python3 scripts/claude-obsidian.py transaction apply <bundle> --vault <vault> \
--approved-plan-sha256 <approval_sha256>Use the inspect result's exact approval_sha256. It binds the expanded plan
to the canonical resolved vault root, so approval for one vault cannot be
reused against another vault.
Parallel workers never apply bundles or edit shared pages. They return draft packets with evidence, target paths, and expected hashes to one orchestrator.
An ingest operation may include a create-only raw capture, source summary, entity/concept pages, provenance records, index/MOC updates, log, hot cache, and overview. Every canonical create or removal updates an active index or MOC; overview changes remain conditional on a changed high-level picture. Every extracted claim remains traceable to the source. Batch budgets bound source count, total bytes, pages, links, and elapsed work.
Query is read-only. Retrieve the smallest relevant evidence set, distinguish accepted/provisional/contested/unsupported/stale claims, cite vault pages and source records, and state gaps. If the user asks to keep the answer, invoke a separate Save operation.
Save only content the user explicitly selected. Do not capture an entire conversation by default. The saved note, provenance where needed, index, log, and hot cache form one transaction.
Research has an explicit question, source policy, egress consent, and stop budget. Web results first become a cited research dossier. Merging them into canonical pages is a separate reviewed operation.
Lint is deterministic and read-only. Report dead/ambiguous links, duplicate basenames, orphans, missing frontmatter, empty sections, stale index entries, configuration/read errors, and source/claim ledger contract violations. Repairs are separate transaction proposals.
- Run
doctorto verify vault selection. - Run
lintafter meaningful operation batches. - Run
transaction recoverafter an interrupted apply. - Use explicit
checkpointonly when Git history is wanted. - Keep backups independent from transaction journals.
- Never treat the product repository, plugin cache, a setup-file existence check, or an AI statement as proof that a capability is verified.
configuredmeans prerequisites are present.verifiedrequires a declared behavioral check to pass; a schema/self-check cannot promote the state. When no automated verifier exists, the capability stays configured and reports the tracked reason.
The executable contracts in config/ and tests are the source of truth when
this prose and behavior disagree.