AGENTS.md
Contract and schema for Claude (and any other agent) working in this vault. CLAUDE.md is a symlink to this file so Claude Code and other tools see the same source of truth.
Project Overview
This repository is an Obsidian vault for personal knowledge management, not a software project. It is run as an LLM-maintained wiki (Karpathy pattern, April 2026): the agent compiles ingested material into cross-referenced markdown, maintains graph integrity, and runs periodic health checks. The human curates direction and approves substantive changes.
- Obsidian is the IDE. The agent is the programmer. The vault is the codebase.
- Everything here is plain markdown + git. No proprietary formats. The substrate outlasts any specific agent.
Directory Structure
Modified PARA, with two non-PARA folders for the agent loop:
- 0_Inbox — drain queue. Raw inputs land here, get routed into the wiki, then deleted. Not immutable raw. Four areas:
transcripts/— voice-memo transcripts pulled from Monologue (cloud app) by thefetch-monologueskill in Phase 0 ofprocess-inbox. Each carriessource: monologueand amonologue_id:UUID for provenance. Only the transcript is brought in — not Monologue’s summary (its style isn’t what this vault wants).notes/— small typed notes the user jots during the day. No cleanup needed. Processed directly byprocess-inbox.Clippings/— Obsidian Web Clipper output (web articles, already in markdown with URL frontmatter). Default route:3_Resources/Clippings/. Processed directly byprocess-inbox.- root — any other markdown files awaiting routing by
process-inbox.
- 1_Home — entry points, dashboards, daily notes.
- 2_Areas — ongoing responsibilities and domains of activity.
_Canon/— crystallized high-signal pages (durable, load-bearing). Promoted here by thecrystallizeskill.
- 3_Resources — reference materials and general knowledge.
- 4_Projects — active projects with clear goals and deadlines.
- 5_Archive — anything from 1–4 that’s older and not actively used.
- 6_Private — content that must not publish. Three reasons something lands here:
- Personal/sensitive — Zettel, Memo, Thoughts, private reflections.
- Copyrighted — third-party material held personally but not republishable (e.g.
shinkansen-n2/Japanese N2 course). - Work-confidential — employer/client material under NDA or professional confidentiality. Use
Work/as the umbrella subfolder for work-related material that isn’t tied to a single employer (e.g., general work reflections, cross-employer thoughts); use an employer-specific subfolder when one already exists (e.g.10ten/). Quartz excludes this folder unconditionally. The agent must not move items out of6_Private/without explicit user approval, even when the topic looks public-safe.
- 7_Agent — agent artifacts (see below). Excluded from publishing.
- Templates — reusable templates for creating consistent notes.
- .obsidian — configuration files for the Obsidian app.
- 7_Agent/skills — single source of truth for all agent skills, except the apm-vendored ones (
write-in-my-voice,devlog— see Skills). Every skill lives here, visible in the Obsidian sidebar. - .agents/skills, .claude/skills — symlinks to
7_Agent/skills. Any new agent folder (.codex/,.gemini/, …) must symlink its skills subfolder back to7_Agent/skills/, never duplicate. See theadd-skillskill.
7_Agent/ contents
questions.md— append-only log of things Claude couldn’t answer from the vault (log-questionwrites here).index.md— generated file-level map of the live vault (one line per note: path | title | tags | description). Regenerated by thebuild-indexskill (weekly via reconcile, or on demand). Grep this before blind-globbing the vault. Never edit by hand.log.md— append-only operations log, current quarter only. Everyprocess-inbox,reconcile,consolidate,crystallize,triagerun appends. Rotated quarterly by reconcile intolog/<YYYY-Qn>.md.log/<YYYY-Qn>.md— archived quarters of the operations log. History, never edited.notifications.md— pruned feed of high-signal items the agent wants the human to see — both action items (need input) and FYI items (just notifying). See Notifications below. Drained bytriage.monologue-processed.md— append-only dedup log of Monologue note IDs already pulled into0_Inbox/transcripts/. Written byfetch-monologue. Never pruned — even after the resulting transcript is routed and deleted from the inbox, the ID stays here so the note is never refetched.reconcile/<YYYY-Www>-reconcile.md— weekly reconcile reports (created on first run).
Frontmatter Schema
Required on every new note the agent creates:
---
created: 2026-04-17 # ISO date
lang: en # one of: de, en, ja, mixed
tags: [tag1, tag2] # English, lowercase-kebab
source: voice-memo # or: article, book, conversation, derived, manual
---Optional, per note type:
description:— one-line summary of the note. Cheap to write at creation time, and it feeds7_Agent/index.md(thebuild-indexskill prefers it over the first body line). Add it to every note the agent creates unless the title already says everything.url:— clippings, web sources.crystallized: true— set on the source when promoted to_Canon/.aliases: [...]— for disambiguation.draft: true— excludes from Quartz publishing. Use on notes that should stay in their PARA location but must not be published (e.g., a work-related note in4_Projects/that isn’t sensitive enough for6_Private/but shouldn’t go on the public site).
Human-authored notes are exempt from the schema. The agent does not retrofit frontmatter onto existing notes except during reconcile, and only for mechanical gaps on touched pages (e.g., obvious missing created: where the filename has a date).
Privacy Classification
This vault is published publicly via Quartz. Every note the agent creates or edits must be classified for privacy. When in doubt, default to private — a public note accidentally made private is a minor inconvenience; a private note accidentally published is a real problem.
What is private
Content is private if it matches any of these:
- Personal/introspective — diary entries, inner thoughts, reflections, emotions, personal goals, relationship matters, health notes.
- Professional/work-confidential — anything about employers, clients, colleagues, internal processes, meetings, work projects, compensation, or material under NDA.
- Confidential — third-party information shared in confidence, legal matters, financial details.
- Copyrighted — third-party material that can’t be republished (course content, book excerpts beyond fair use).
How to make a note private
Two mechanisms, choose based on fit:
- Route to
6_Private/— for content that is inherently private (personal reflections, work-confidential material, copyrighted content). Use the same subfolder conventions already present (e.g.,6_Private/Zettel/,6_Private/Memo/, employer-specific folders). - Add
draft: trueto frontmatter — for content that belongs in its PARA location for graph connectivity but must not be published. Good for: a project note with some sensitive detail, a resource page that references confidential work, mixed-sensitivity topics.
Rules
- Default private when uncertain. If routing is ambiguous on the privacy axis, route to
6_Private/or adddraft: true. Log the decision in7_Agent/log.md. - Never move notes out of
6_Private/without explicit user approval. - Cross-references are fine. A public note may wikilink to a private note — Quartz simply won’t resolve the link. The graph connection still works in Obsidian.
- Don’t retroactively classify existing notes. The agent only classifies notes it creates or substantially edits. Existing human-authored notes are left as-is.
Multilang Rules
German, English, and Japanese all appear in this vault. Rules keep the graph queryable while preserving content fidelity.
- Body text: in the source language. Do not translate.
- Wikilinks and note filenames: English where possible. If the concept is language-specific (a Japanese grammar point, a German idiom), use the source-language term as the filename and add an English alias.
- Structural headings (
## Summary,## References): English. - Tags: English, lowercase-kebab.
lang:frontmatter:de,en,ja, ormixed.
Furigana
When writing furigana in Japanese notes, use the novel syntax: 長い|文章《ぶんしょう》. The Furigana plugin renders this correctly in view mode.
Three-Op Protocol
All agent activity in this vault reduces to three operations. Each is implemented as a skill in 7_Agent/skills/.
Ingest — process-inbox
New source → 10–15 pages touched out. process-inbox drains the entire 0_Inbox/ (root, transcripts/, notes/, and Clippings/).
- Phase 0 — invoke
fetch-monologueto pull any new transcripts from Monologue (cloud app) into0_Inbox/transcripts/. Dedup keyed onmonologue_idvia7_Agent/monologue-processed.md. - Pick an item from
0_Inbox/(root,transcripts/,notes/, orClippings/). - Decide the route (PARA folder + filename). If ambiguous, leave the item in inbox and log the reason in
7_Agent/log.md. Work-related Monologue transcripts route to6_Private/Work/by default, or to an employer-specific subfolder if one already exists. - Create the canonical note with proper frontmatter. Preserve the original body text verbatim — add structure around it (frontmatter, wikilinks, cross-ref sections) but never rewrite, summarize, or editorialize the user’s prose.
- Update 10–15 related pages with cross-refs (wikilinks, backlinks, index entries). Aim for graph enrichment, not one-hop linking.
- Update the relevant index note in
1_Home/if one exists. - Append to
7_Agent/log.md. - Delete the inbox item.
Query — conversational, with log-question on gaps
When the user asks something:
- Search the vault first —
grep 7_Agent/index.mdfor topic discovery, then read the actual notes. Synthesize with page citations ([[wikilinks]]). - If the answer is not derivable from the vault, invoke
log-questionto append to7_Agent/questions.mdin the same turn, then answer from outside knowledge with that flagged. This step is not optional — an emptyquestions.mdmeans the loop is broken, not that there are no gaps. - If an answer is reusable (novel synthesis, research, a concept worth keeping), offer to file it as a new page. Explorations compound.
Reconcile — reconcile (weekly)
Integration pass over the last 7 days. Judgment work is scoped to the diff, not the corpus; whole-corpus mechanical checks run as the deterministic vault-doctor script.
- Run
vault-tree+recent-changes+vault-doctorto frame the week’s touched set and get the mechanical health report. - Apply mechanical fixes directly (logged, no approval needed): broken wikilinks intersecting the touched set with an unambiguous target, obvious frontmatter gaps on touched pages.
- Per touched page: check integration (outbound links, PARA fit, collisions with other touched pages, missing cross-refs within the page).
- Route candidates: promotions to
crystallize, merges toconsolidate, moves to a rename-impact check. Three-strike rule: a promotion candidate recommended in 3 consecutive weekly reports that still meets the bar is auto-promoted (crystallize’s reconcile-invoked mode) with an FYI notification; merges always stay propose-only. - Synthesize: cluster touched pages by topic, propose concept pages, cross-check against
questions.mdfor answered/raised questions. - Write report to
7_Agent/reconcile/<YYYY-Www>-reconcile.md. - Append a summary entry to
7_Agent/log.md. - Notify: fold any prior unwalked reconcile items in
notifications.mdinto one rolling action item covering all outstanding weeks; prune items whose referenced files no longer exist. - Housekeeping: regenerate
7_Agent/index.md(build-index); on the first run of a new quarter, rotatelog.mdinto7_Agent/log/<YYYY-Qn>.md.
Notifications — notifications.md + triage
7_Agent/notifications.md is the agent’s notification center for the human — a pruned feed of high-signal items the human should see. Two kinds of items:
- Action items (
- [ ] …) — require human judgment (review reconcile findings, approve a merge, decide on a promotion). - FYI items (
- …) — just notifying; no action required (a topic cluster grew, an idea got implemented, a question got answered).
The point is to guarantee the human never misses anything noteworthy — not just things that need approval.
Who writes to it:
- Non-interactive agent runs — Claude Code routines, scheduled triggers, or any session where the agent can’t prompt the user. Skills that normally propose-and-wait (
crystallize,consolidate) must instead append an action item tonotifications.mdwhen invoked non-interactively. - Batch-output skills —
reconcilealways appends an action item linking to its weekly report, regardless of session type, because the report is inherently a deferred-review artifact. - Any skill that surfaces something noteworthy — even from an interactive session — may append an FYI item if the human would want to know about it later (a successful crystallize, a pattern noticed, etc.). Use sparingly; high-value only.
Who drains it: the triage skill. Runs interactively, walks each item with the user, delegates to the right skill for action items (crystallize, consolidate, direct edit), and dismisses FYIs after the user has seen them.
Format:
- [ ] YYYY-MM-DD — <action>: <one-line message> → [[link to source]] # action item
- YYYY-MM-DD — <fyi>: <one-line message> → [[link to source]] # fyi item
Link, don’t duplicate — the source file has the detail. A full reconcile report is linked as one item, not expanded into per-finding items.
No stacking: recurring items of the same kind (weekly reconcile walk-throughs above all) must fold into one rolling item listing every outstanding instance, instead of accumulating one item per week. A 5-item backlog of identical asks is what makes the human stop triaging. Items whose referenced files no longer exist are stale — prune them (reconcile does this weekly).
Pruning: items are deleted when actioned (action items) or dismissed (FYIs), not struck through. log.md is the history; notifications.md is only what’s still outstanding. This keeps the feed readable and prevents duplicate-information bloat.
Interactive vs. non-interactive: in a normal conversational session, skills ask the user directly for action items — no queue needed. FYIs may still be appended for anything the user would want to revisit later.
Git Workflow
obsidian-gitauto-commits to main every few minutes (vault backup: YYYY-MM-DD HH:MM:SS).- Agent skills edit files directly and let obsidian-git persist. No agent branches, no PRs.
- Rollback =
git reverton the relevant commit. Keep it simple.
Scheduled routines (daily process-inbox, weekly reconcile) may wrap skill runs in their own branch/merge logic at the routine level — skills themselves stay git-unaware.
Publishing (Quartz)
- Vault is published at https://alexanderweichart.de via Quartz, which runs from outside this repository.
- Excluded from publishing:
0_Inbox/**7_Agent/**6_Private/**— unconditional. Covers personal, copyrighted, and work-confidential content (see Directory Structure).- Any note with
draft: truein frontmatter.
- Exclusion rules must be applied wherever the Quartz build reads from — not in this repo.
Obsidian CLI
- The
obsidianCLI is available for inspecting vault state from the command line. If the command isn’t installed in a given environment, don’t try to install it — skip and proceed with filesystem tools. - When the user refers to “this article” or “this note” without further context, assume they mean the focused open note (
obsidian read).
Guidelines
- Treat this as a database of markdown notes. No build steps, no compilation, no tests.
- Strict Obsidian markdown formatting. Wikilinks for internal links, Markdown links for external URLs.
- Don’t translate. Preserve source language in bodies. See Multilang Rules.
- Frontmatter on every new note the agent writes. Follow the schema above.
- Never silent-merge pages.
consolidateproposes; human approves. _Canon/is load-bearing. Don’t promote without meeting the bar (seecrystallizeskill). Sole exception: the three-strike auto-promotion via reconcile — the bar check still applies, only the wait is skipped.- Search the live scope by default.
5_Archive/(~1.4k stale files),3_Resources/Japanese/(~3.9k generated vocab helpers), and6_Private/shinkansen-n2/(course content) drown naiveGlob/Grepin noise. Prefergrep 7_Agent/index.mdfor discovery; search the heavy subtrees only when the task is actually about them.
Skills
All skills live in 7_Agent/skills/. Agent-specific folders (.agents/skills/, .claude/skills/, future .codex/skills/, etc.) are symlinks to that directory — never duplicate a skill per agent, and never create or edit skills through a symlinked path. To add a skill or onboard a new agent, follow add-skill.
Two of them are not authored here. write-in-my-voice and devlog are vendored from the apm marketplace (packages/writing) via this vault’s apm.yml, and apm install overwrites them in place. Do not edit them here — the change will be silently clobbered on the next install. Edit the source in ~/Developer/apm/packages/writing/.apm/skills/<name>/, push, then in this vault:
apm update -y && apm install # refreshes 7_Agent/skills/{write-in-my-voice,devlog}They are committed to this repo rather than installed globally because Claude Code cloud sessions have no access to ~/.claude/skills — anything a cloud session needs must live inside the repo. apm install only prunes files tracked in apm.lock.yaml, so the hand-authored skills below are never touched by it.
Vault-operational (three-op protocol + supporting ops):
process-inbox— Ingest. Drains0_Inbox/into the wiki. Phase 0 callsfetch-monologueto pull new cloud transcripts in first.fetch-monologue— Pulls new voice-memo transcripts from Monologue (cloud app) via its MCP server into0_Inbox/transcripts/. Dedup viamonologue-processed.md. Transcripts only, no summaries.collect-quote— Captures a quote (any inbox note whose first body line starts withquote:) verbatim into6_Private/Quotes/as a one-quote-per-file note, and adds it to the browsableQuotes.mdindex. Called byprocess-inbox(Phase 0.7); runnable directly when the user pastes aquote:line.warmup— session-start digest. Recent commits + open questions + last reconcile.log-question— append to7_Agent/questions.mdon query gaps.reconcile— weekly integration pass over the last 7 days of changes. Replaced the old whole-vaultlint.consolidate— merge near-duplicate pages. Propose, don’t silent-merge.crystallize— promote high-signal pages to2_Areas/_Canon/.triage— drainnotifications.mdinteractively. Walks each item with the user, delegates to the right skill for action items, dismisses FYIs once seen.reflect— end-of-session reflection. Proposes routing durable, non-obvious learnings to the right destination (skill edit,AGENTS.mdedit,log-question,crystallize). Stays silent by default; asks once, never silent-applies. Alternative to amemory.mdjunk drawer.write-post— draft or edit a blog post in the user’s voice. Loads reference posts from Posts (Notes-style vs. Essay-style) before writing, so drafts don’t sound like generic AI output.weekly-digest— write 0-n private articles synthesizing the week’s vault activity. Runs as reconcile’s final step. Posts live in6_Private/Digest/, grounded in actual vault content.
Meta:
add-skill— contract for adding a new skill (where it lives, frontmatter, agent-folder symlink pattern). Read this before creating or moving a skill.
Shared utilities (portable across agents):
vault-tree— depth-limited folder overview. Orient on structure before routing or reconciling.build-index— regenerate7_Agent/index.md, the file-level map of the live vault (path | title | tags | description per note). Grep it instead of blind-globbing.vault-doctor— deterministic whole-vault health check (broken wikilinks, orphans, frontmatter gaps, empty files). Read-only; reconcile runs it weekly and interprets.recent-changes— summarize git activity over the last N days, grouped by folder, auto-commit noise stripped.obsidian-markdown— Obsidian-flavored markdown dialect (wikilinks, embeds, callouts, properties).obsidian-cli—obsidianCLI usage.
Tips
- Voice memos live in Monologue (cloud app).
fetch-monologue(Phase 0 ofprocess-inbox) pulls new transcripts into0_Inbox/transcripts/for routing. Audio and Monologue summaries are never imported — transcript text only. - Work-related Monologue transcripts route to
6_Private/Work/by default. Use an employer-specific subfolder (e.g.6_Private/10ten/) if one already exists for that employer. - Quotes: prefix an inbox note (or memo line) with
quote:to collect it.process-inbox(Phase 0.7) →collect-quotestrips the prefix, stores the quote verbatim in6_Private/Quotes/, and adds it to the browsable6_Private/Quotes/Quotes.mdindex. Pure-quote notes live only in the collection (no double-filing); aquote:line inside a larger memo is extracted while the memo routes normally. The collection is private (quotes can be personal or copyrighted) and exempt from the 10–15-pages enrichment target. - If a note exists in
_Canon/, it’s canonical. Prefer citing it over upstream sources. - When in doubt about routing, leave the item in inbox and log the reason. Human resolves ambiguity; agent doesn’t guess.