Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Cross-project long-term memory over the user's Obsidian brain vault: recall relevant notes before a task, and persist distilled conclusions (decisions, pitfalls, solutions, progress) back after a task. The vault is an aggregation/projection layer — repo-local artifacts stay the per-project source of truth, and sync direction is repo → brain. Explicitly invoked by the model or operator; never executed from hooks. Use when the user asks to recall project memory, persist lessons to Obsidian, initia
.claude/skills/ancienttwo-obsidian-memory/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 424% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 306% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 4% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 117% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 179% | 0% |
index.md is in sync.tasks/, docs/, MEMORY.md, the code) are each project's source of truth; the vault is only a cross-project aggregation/projection layer, and the direction is always repo → brain. When the vault conflicts with current state, current state wins, and the vault gets corrected on the spot.index.md is the human reading entrypoint.[BrainPromote]-style advisory string, and never reads or writes vault state.brainRoot from ~/.repo-harness/config.json.<brainRoot>/<project-slug>/; <project-slug> is the repo directory name or a name the user gives.Having no brainRoot configured is a legitimate steady state, not a defect awaiting repair. Unconfigured simply means this machine does not use the vault layer: the in-repo artifacts remain a complete, authoritative memory surface, and at closeout the conclusions go into the existing slots such as tasks/lessons.md and docs/researches/. Do not create a vault just so this skill can run. Only when the user explicitly wants the vault layer enabled, point them at repo-harness install --brain-root <path> or repo-harness update --brain-root <path>.
Run this only when the sub-vault does not exist or the user explicitly asks:
<brainRoot>/<project-slug>/ containing index.md plus, as needed, decisions/, patterns/, notes/, references/, runbooks/ (align with the vault's existing categories; do not invent a new taxonomy).index.md records a one-line project background, long-lived preferences, a pointer to current progress, and links to each subdirectory; wiki-link it into the vault root index.md..md file inside the vault must also invoke the official obsidian-markdown skill (the authority for frontmatter, wiki-links, callouts, and other formatting); use the official obsidian-cli skill for search, open, and task operations against a running vault. This skill only owns judgment and indexing (what to write, when to write it, how to organize it); it does not define a Markdown dialect of its own. If either official skill is missing, report fail-closed instead of degrading to hand-written formatting.index.md first, then rg that sub-vault by task keywords (widening to adjacent domains when necessary), and read the full text of at most the 3 most relevant notes.main == origin/main == <sha>, whether a worktree is clean, test pass counts, and the snapshot output of a given command run. These start rotting the moment they are written down, and they already have an authoritative source.index.md; when a note on the same topic already exists, update that file rather than opening a duplicate page, and correct outdated conclusions directly.Inside a repo-harness-managed repository, the brain_path declared in .ai/harness/brain-manifest.json is a machine projection of repo-harness brain sync; hand-written content there is overwritten by the next sync. This skill never writes a path the manifest declares; memory notes land in subdirectories the manifest does not own, such as notes/ and decisions/. Externalizing documents like docs/reference-configs/ goes through the existing brain promote/sync channel; this skill does not duplicate that transport.
| Layer | Ownership | What it holds | |-------|-----------|---------------| | repo tasks/lessons.md, docs/researches/, MEMORY.md | per-project source of truth | rules and knowledge actionable inside the project | | host auto-memory (Claude Code project memory, Codex chronicle, etc.) | session-level runtime cache | the current turn's context; must not be cited as fact — promote anything with lasting value to an authority layer first | | user-level cross-project preference files | source of truth for cross-project preferences | user habits, cross-project pitfalls, tooling preferences | | Obsidian vault (this skill) | optional cross-project aggregation projection | distilled decisions/patterns/pitfalls/progress, reusable by humans and by several runtimes |
A given fact is written out in full in exactly one authority layer; every other layer carries a pointer.
| Situation | Rule | |-----------|------| | Wanting to trigger this automatically from a hook | Forbidden; a hook only emits advisory text, and persistence happens when the model invokes this skill explicitly during closeout | | brainRoot not configured | Legitimate steady state; report and stop — do not guess a path and do not create a vault on the user's behalf | | Memory contradicts current state | Current state wins; correct or delete the stale note | | Wanting to write something every single task | Persist only what clears the gates; when there is nothing, say plainly that this round has nothing to persist | | Wanting to archive a long conversation or code block verbatim | Do not store the original text; store the conclusion plus a link back to the repo | | Wanting to paste in an acceptance report | CI runs, commits, PRs, and release state get pointers only | | Configuration knowledge containing sensitive values | Rewrite with <PLACEHOLDER> before storing | | A claim that something "is already wired up" | Grep the target file to verify on the spot; wiring that exists only in a document is not wiring |
brain-manifest.json invariant that hooks neither read nor write external vault state.~/.claude/skills/obsidian-memory/ and ~/.codex/skills/obsidian-memory/ hold identical content, verified with cmp.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 16,455 | 6,971 | -58% | 1 | 1 | 0% | 1,690 | 2,559 | +51% | 0 | 0 | — |
case-02 | fail→fail | 14,007 | 12,476 | -11% | 1 | 1 | 0% | 1,763 | 2,419 | +37% | 0 | 0 | — |
case-03 | fail→fail | 12,065 | 7,390 | -39% | 1 | 1 | 0% | 1,984 | 2,608 | +31% | 0 | 0 | — |
case-04 | fail→fail | 7,512 | 5,805 | -23% | 1 | 1 | 0% | 1,061 | 3,066 | +189% | 0 | 0 | — |
case-05 | fail→pass | 5,906 | 16,826 | +185% | 1 | 1 | 0% | 974 | 5,106 | +424% | 0 | 0 | — |
case-06 | pass→fail | 13,046 | 14,436 | +11% | 1 | 1 | 0% | 1,904 | 2,761 | +45% | 0 | 0 | — |
case-07 | fail→pass | 7,715 | 13,633 | +77% | 1 | 1 | 0% | 1,089 | 4,419 | +306% | 0 | 0 | — |
case-08 | fail→pass | 20,490 | 7,125 | -65% | 1 | 1 | 0% | 3,174 | 3,308 | +4% | 0 | 0 | — |
case-09 | pass→pass | 6,921 | 9,904 | +43% | 1 | 1 | 0% | 1,161 | 3,515 | +203% | 0 | 0 | — |
case-10 | fail→pass | 9,117 | 3,022 | -67% | 1 | 1 | 0% | 1,164 | 2,526 | +117% | 0 | 0 | — |
case-11 | fail→pass | 9,735 | 5,513 | -43% | 1 | 1 | 0% | 990 | 2,760 | +179% | 0 | 0 | — |
case-12 | fail→pass | 15,544 | 8,365 | -46% | 1 | 1 | 0% | 2,340 | 3,199 | +37% | 0 | 0 | — |
case-13 | fail→pass | 8,365 | 4,545 | -46% | 1 | 1 | 0% | 1,230 | 2,860 | +133% | 0 | 0 | — |
case-14 | pass→pass | 12,097 | 6,350 | -48% | 1 | 1 | 0% | 1,945 | 3,088 | +59% | 0 | 0 | — |
case-15 | pass→pass | 8,753 | 5,061 | -42% | 1 | 1 | 0% | 1,448 | 2,845 | +96% | 0 | 0 | — |
case-16 | fail→pass | 10,620 | 5,559 | -48% | 1 | 1 | 0% | 1,417 | 2,827 | +100% | 0 | 0 | — |
case-17 | fail→pass | 12,976 | 4,502 | -65% | 1 | 1 | 0% | 1,883 | 2,752 | +46% | 0 | 0 | — |
case-18 | fail→pass | 9,734 | 9,230 | -5% | 1 | 1 | 0% | 1,621 | 3,652 | +125% | 0 | 0 | — |
case-19 | pass→pass | 10,254 | 5,399 | -47% | 1 | 1 | 0% | 1,379 | 3,015 | +119% | 0 | 0 | — |
case-20 | pass→pass | 12,932 | 9,626 | -26% | 1 | 1 | 0% | 1,834 | 3,502 | +91% | 0 | 0 | — |
case-21 | pass→pass | 13,909 | 10,520 | -24% | 1 | 1 | 0% | 2,557 | 3,691 | +44% | 0 | 0 | — |
case-22 | fail→pass | 12,747 | 8,548 | -33% | 1 | 1 | 0% | 2,093 | 3,560 | +70% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +45 percentage points is the difference between those two pass rates over the 18 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.