Every agent session starts from zero. The model is new, the context window is empty, and whatever I explained last Tuesday is gone. So every agent I use reads the same folder of Markdown before it acts. My homelab skill says it in one line:
Always ground actions in the user’s vault references first, then verify live state with read-only commands before making changes.
That line runs under Hermes. The same folder also serves Claude Code and pi. Since May 10 it has grown to 827 notes, 51 source records, and 174 claims that other notes can cite by ID. No database, no embeddings, no vendor. It is a directory with rules strict enough that any agent can read it, write to it, and not wreck it. And when an agent does get something wrong, the mistake has an address: I can open the file and see which source it came from.
I packaged it as a starter kit. The rest of this post is the case for it.
Seanathon/vault-starterMIT · free · clone, fork, or use as a templateView on GitHub Borrowed rules, not invented ones
Note-taking systems fail when the owner stops maintaining them. An agent changes that, because the agent does the maintenance. It needs rules it can follow without supervision, and I didn’t want to invent them. The kit takes one mechanism from each of ten existing methods and ships a page on each, so your agent knows which rule applies when.
| Source | What the kit takes |
|---|---|
| PARA | The top-level split: projects, areas, resources, archive |
| Johnny.Decimal | Numeric prefixes (00-meta, 30-projects) so every path is stable |
| Karpathy’s LLM-wiki gist | raw/ → wiki/ → contract file, plus index.md and an append-only log.md |
| Diátaxis | Tutorial, how-to, reference, explanation, as a doc_type field |
| Zettelkasten | Atomic notes that link out at least twice |
| GTD | The inbox: capture, clarify, file |
| Obsidian community patterns | Hub notes, daily notes, Bases dashboards |
| James Phoenix’s “Symlinked Project Docs” | Only a project’s docs/ folder leaves the vault |
| HumanLayer’s CLAUDE.md guidance | A short root contract, detail loaded on demand |
| Typst’s docs, the DHQ documentation paper | Reference models for navigable docs |
The rule that makes mistakes traceable is raw/ is immutable. Sources go in untouched, synthesis goes in wiki/, and every wiki page links back to its source. When an agent is wrong, I can see where the wrongness entered.
A morning brief, before anything clever
The plainest use is at work. My work vault shares the skeleton and none of the research machinery. Every morning a Claude automation pulls from GitHub, Slack, Notion, and Gmail and drops a brief into 00-inbox/daily-briefs/, one file per date. I show up, read it, and know who I need to talk to, what they’re waiting on me for, and which loose ends are mine. There are 37 of them so far.
That vault even numbers its folders differently, because work wanted the inbox at 00. The contract didn’t care. The kit is less a system to adopt than a skeleton to bend. At work it’s a morning brief. At home it’s a research library, which takes more machinery.
A knowledge graph without GraphRAG
A vault that only files things becomes a bookmark graveyard. Mine had 70 bookmarks before I noticed I couldn’t say what was in any of them. Part of the fix was admitting two jobs had been sharing one folder. Cataloging websites, products, tools, and codebases I want to find again moved to Board, a self-hosted curation tool I built for exactly that. The vault kept one job: holding what I actually know.
That still left the question of how to make knowledge out of what I read, and the obvious answers didn’t fit. The memory built into ChatGPT or Claude belongs to one product, and I can’t put it in git or hand it to a different agent. Notion is a good place for people to read, but its pages live in Notion’s database, not in files an agent can grep and diff. GraphRAG means embedding everything, extracting a graph, and running a vector store, which is a lot of infrastructure for 50 papers, and the graph ends up somewhere I can’t open in an editor.
The kit keeps the graph in the Markdown instead.
/know captures a link in under a minute. /deepen reads it properly and writes each claim as one bullet with a block ID:
- Event gists carry the situational load and fact triples only support it:
ablating gists collapses LoCoMo LLM-judge from 76.2 to 48.9, while
ablating facts costs 89.6 to 87.2 on Complex-TR. (Evidence: ablation,
Table 5.) ^claim-gists-carry-episodic-content
Then it links the source to the rest of the vault with one of five typed relations: supports, extends, contradicts, special-case-of, supersedes. That is the graph. It diffs in git and reads in any editor, and Obsidian draws it for free.
The whole vault
One hub, Agent Loop Engineering, and everything it cites
The design choice I’d defend hardest is that two skills refuse to run. /classify won’t propose a theme with fewer than three sources, and /synthesize won’t write a hub from one. The refusal says what would unlock it:
this theme has 2 sources;
/knowone more on the same topic, or name a third source yourself, and I’ll run this again.
Most agent tooling fails by producing something plausible out of nothing. This fails closed: no hub note exists unless three sources back it, so an agent can’t spin a confident summary out of one blog post. /review then lists what you saved but never read and quizzes you on it.
Then the vault answers back
Everything above is the cost. /consult is the return. When I need to decide something, I ask the vault instead of a blank model: /consult recursive language models, or a design question for work. The agent searches the claims and the typed links first, reads any relevant source it has only skimmed, and answers in a fixed shape:
- Answer first, for this decision.
- Grounds, each cited to a claim:
[[Source#^claim-slug]]. - Tensions, where sources disagree. These get surfaced, never averaged away.
- Gaps, what the vault doesn’t know yet, which becomes the next
/know.
Anything that comes from the model’s general knowledge instead of the vault is labeled as such. Every run leaves a line in the log, so the consultation itself is traceable:
/consult: Recursive Language Models (RLMs) — 5 vault notes (0 deepened), 7 claims, 3 tensions
That’s the loop the rest of the kit exists to feed. Research I captured months ago shows up, cited, in a decision I’m making today, and I don’t have to remember having read it. Across both vaults I’ve run it more than a dozen times so far, on questions as small as that one and as large as a design review that weighed 51 claims from 33 sources.
It holds up with someone else writing
The real test was handing it to someone else. On August 18 I exported the kit into a vault for Radiator, a project I’m building with another engineer. It’s still in development, and the waitlist is open. That vault added two rules: every technical claim cites path:line at a pinned commit, and every change lands as a pull request.
In 40 days it reached 222 source records, 1,594 claim blocks, 63 tracked open questions, and 120 pull requests, most of them written by the other engineer through a different agent. The contract held with a writer who wasn’t me. That is the only test of “any agent can use it” I trust.
The gap between the two vaults isn’t all the kit’s doing. Radiator had the claim rules from day one, covers one project, and is mostly code and papers, which are easy to write claims about. My personal vault has notes about car maintenance.
The kit ships with all of it: the skeleton, the contract, a setup interview, the six research skills, and the ten method pages. The first thing it will do is refuse to synthesize anything. Capture three sources and it gets friendlier.