Knowledge Base (Markdown, agent-readable)
A knowledge base (KB) here is a folder of Markdown files designed so any AI agent can navigate it without a vector database: the agent reads one index file, picks the relevant notes by their descriptions, and opens only those. Keep the whole KB readable and the index lean — the index is what gets loaded into context, so it must be high-signal.
Apply the rules below when creating a new KB, adding/editing notes, or doing a maintenance pass. When the user's request is ambiguous (new KB vs. add note vs. cleanup), ask which one before acting.
Core principles (the "why")
- Index-first navigation. The index is a map, not a container. An agent
reads
INDEX.md, selects notes by their one-line descriptions, then opens only those files. No note is "in" the KB unless it's registered in the index. - Atomicity. One topic per note. If a title needs an "and", it's probably two notes. Atomic notes are easier to find, link, and reuse.
- Stable IDs. Every note has a permanent ID that never changes and is never reused, so links survive renames and moves.
- Linked with reason. When two notes connect, state why (prerequisite, supports, contrasts, see-also). Connections carry as much value as the notes.
- Lean instructions. Keep
INDEX.mdinstructions short and high-signal — it competes for the agent's context budget. Bodies load on demand. - Structured for retrieval. Clear H1 title and H2/H3 sections so an agent can grab the relevant slice of a note, not the whole thing.
Folder structure (nested by topic)
- Topic folders are short, lowercase nouns (
auth,billing,deploys). _topic.mdis the topic-level map of content (MOC): a short intro plus links to every note in that topic. It is a convenience view;INDEX.mdremains the source of truth.
Naming rules
- Lowercase kebab-case, predictable and greppable:
topics/auth/session-tokens.md. - No spaces, no uppercase, no dates in filenames (dates live in frontmatter).
- The filename slug should match the note's
idslug portion.
Required frontmatter (every note)
id:YYYYMMDD-slug. Sortable, readable, stable. Different-titled same-day notes differ by slug; if two same-day notes would collide on the same slug, append-2,-3, … (check theINDEX.mdregistry before assigning). Once assigned, the id is permanent.summary: this exact sentence is what goes in the index registry — write it to help an agent decide whether to open the note.updated: bump it whenever the body changes.
Note body shape
- Use relative links between notes and annotate the relationship in a phrase.
- Every link target should also appear in the note's
relatedfrontmatter.
INDEX.md (the single source of truth)
INDEX.md has two parts: operating instructions for agents, and the registry.
Registry line format: `id` — **Title** — `path` — one-line description.
_topic.md (topic map)
Workflows
Create a new KB
create_directoryfor the folder structure above.write_fileINDEX.mdwith the instructions block, an empty controlled-tag list, and an empty registry.- Add the first topic folder +
_topic.md, then the first note (each viawrite_file). - Register the note in
INDEX.mdand link it from_topic.md—edit_blockboth so you touch only the changed lines.
Add a note
- Pick or create the topic folder (
list_directoryto see what's there). write_filethe note (kebab-case slug) with full frontmatter and the body shape.- Add cross-links (and mirror them in
related). - Register it in
INDEX.mdand link it in_topic.mdwithedit_block— same change.
Update a note
- Same idea, new information →
edit_blockthe note in place, bumpupdated, andedit_blockthe registry line if the scope changed. - Genuinely new idea →
write_filea new atomic note instead of expanding this one.
Maintenance pass (run on demand)
Use start_search (ripgrep) for text scans and get_file_info / list_directory
for existence checks — together they make this tractable at scale:
- Orphans (no inbound links — outbound doesn't matter):
start_searchthe KB for the note'sidand filename slug, then discount the self-matches that always exist — the note's own file,INDEX.md, and its_topic.md. Anything left is a genuine inbound reference; nothing left = orphan, so link it from a relevant note/MOC or archive it. - Broken links / drift: don't infer resolution from a text hit — a string
existing doesn't mean the file does. Confirm each registry path and
related:target exists withget_file_info(orlist_directoryper topic), and that every file on disk is registered. Use a text compare only for the titles/summaries-out-of-sync half. - Non-atomic notes: notes that grew to cover multiple topics → split them.
- Duplicates: near-identical notes → merge, keep one
id, redirect links. - Tag sprawl: read the controlled list from
INDEX.md, thenstart_searchthe frontmattertags:lines and flag any tag not on the list → reconcile. Pull candidates in bulk withread_multiple_files, apply fixes withedit_block, and report what changed.
Checklist before finishing any KB edit
- Every new/changed note has complete, valid frontmatter.
-
idis unique and unchanged; filename slug matches the id slug. - All links resolve and are mirrored in
related. -
INDEX.mdregistry and the topic_topic.mdreflect the change. - Tags are from the controlled vocabulary.
-
updatedbumped on every changed note.


