Per Karpathy LLM Wiki design philosophy
maintain alocal、compound-accumulatingknowledge base: the user only reads + provides material + asks questions; the LLM handles the "boring parts" such as summaries,
cross-references, archiving, and bookkeeping. And outline-wiki-upload The key difference from cloud skills such as is
local files + three-layer discipline——vs the cloud MCP single-layer document.
This skill provides three deliverables:
- SKILL.md (this document)——the "constitution" of workflow + discipline
- scripts/——ingest_diff.py / lint_wiki.py / log_format.py + new in 0.18.0+
check_wiki_fixtures.py(fixtures consistency check;
lint_wiki.py --check-versioncalled automatically once), to lock down high-frequency deterministic tasks (notincluding setup_wiki——creation of the wiki repo is handled by the external workspace CLI) - references/——loaded on demand: AGENTS.md schema template + CLAUDE.md thin-shell template, detailed procedures for each operation, page templates, wiki-spec.md (CLI implementation contract), fixtures (gold standard for byte-level CLI comparison), lint-checklist §5 (semantic-merge rules, the merge basis when the agent follows .migration-plan.json)
When to use / not use
Use
- The user says in conversation "ingest/archive to wiki / ingest to wiki / organize this article into the wiki"
- The user says in conversation "is there X in the wiki / search the wiki / summarize what the wiki has about Y"
- The user says in conversation "lint wiki / wiki health check / find contradictions / find orphan pages"
- The user says in conversation "upgrade wiki / migrate to the latest spec / check wiki version / old format / reformat"—— follow §5 Migrate
- The user points to
<wiki-root>/raw/newly appearing / unarchived files - The user first mentions "I want to set up a wiki to manage research / reading notes / projects for X"
- The user mentions "how to write AGENTS.md / the boundary between raw/ and wiki/"
- The user wants to include an external code repository (Linux kernel / Ray source, etc.) as corpus into the wiki——follow
raw/external/flat symlink +.symlink-anchor.tomlpaths (see wiki-spec §13)
Do not use
- cloud collaborative wiki(Notion / Confluence / Outline Wiki / GitHub Wiki)——follow
outline-wiki-upload(write / edit) /outline-wiki-search(search / read) - one-off document generation(not cumulative)——just use the ordinary file-writing workflow
- no raw/ material + no cumulative need——the value of the skill is "compound interest"; one-off organizing does not need it
- needs a strongly structured database(with schema / SQL / full-text search backend)——when the wiki scale is ≤ several hundred pages, index.md is enough; beyond that scale, consider migrating to a dedicated tool
- multi-person real-time collaboration——this skill assumes single-person use (multi-account real-time collaboration goes to cloud wiki)
Input / Output
Information required at startup
| Information | Source | Notes |
|---|---|---|
| Wiki root | LLM_WIKI_ROOT environment variable, or asked interactively |
Example ~/wiki/llm-systems |
| Topic name | Specified once at setup, written to AGENTS.md |
Example "LLM Systems" |
| Operation type | User natural language | ingest / query / lint / migrate / setup |
| Trigger material | At ingest, give a file path or directory | Must be within raw/ Inside |
Operation artifacts
- setup → Done by the external workspace CLI (persisted according to
references/wiki-spec.md), this skill does not implement the creation logic; the artifact form is directory structure + AGENTS.md (SSOT) + CLAUDE.md (thin shell) + wiki/index.md + wiki/log.md + MEMORY/MEMORY.md + .gitignore - ingest → Add / update
wiki/sources/<slug>.md+ sync entity / concept pages + appendlog.mdentry + updateindex.md - query → Give an answer in the conversation (with citations),optionalarchive the answer as
wiki/comparisons/orwiki/syntheses/<slug>.md - lint →
logreport in: whether raw/ was modified, orphan pages, broken cross-references, stale summaries, missing frontmatter, log.md format - migrate → Run
scripts/lint_wiki.py --check-versionoutput spec version + legacy status report;--applypersist<wiki-root>/.migration-plan.jsonfor the agent to followwiki-spec.mdAppendix B to perform Edit/Write fixes; see §5 Migrate for details
Design decisions
Four-layer architecture—why four layers
Referencing the core argument of the Karpathy gist:"Knowledge accumulation depends on discipline, not willpower". Each of the four layers bears one responsibility, and they check and balance each other:
raw/Source of truth—the user is only responsible for curating raw materials (papers, clippings, PDFs, notes, podcast transcripts), read-only for the LLM.The only exception:raw/external/top level (flat layout, 0.17.0+) the LLM maycreate symlinks + write.symlink-anchor.tomlthe[[entry]]block (first onboarding + drift refresh)—see wiki-spec §13.3- wiki-spec §13.5; the remaining
raw/subtrees (articles / papers / assets / clippings / podcasts, etc.) remain read-only for the LLM. Full definition of the discipline(including the 4 rules: the LLM does not write / the user may modify / renaming breaks links / when wiki and raw conflict, raw prevails) see<wiki-root>/AGENTS.md§1 (copied by the workspace CLI to each wiki at init, template seereferences/agents-md-template.md)。raw/subdirectories may be organized freely—the CLI creates by defaultarticles/+assets/, butpodcasts//clippings//papers//external/and other custom subdirectories are equally usable;ingest_diff.pyrecursively scans the entireraw/。
- wiki-spec §13.5; the remaining
wiki/Compounding asset—the LLM owns this layer (5 content page subdirectories + index.md). Humansdo not write wiki content, only read + ask questions. Each time new material is ingested or a new question is answered, the wiki becomesthickerrather than messier.MEMORY/agent persistent memory (peer towiki/)—the experience, pitfalls, and user preferences accumulated by the LLM agent during work, physically located at<wiki-root>/MEMORY/(peer towiki/, not nested inwiki/below), shares the same ownership as wiki content pages (written by the LLM, not by the user) butdoes notfollow the single-entry constraint and is not scanned by lint as a wiki content page.MEMORY.mdIt is an index, used byAGENTS.mdvia@MEMORY/MEMORY.mdimport sessions that stay resident—avoiding MEMORY degenerating into a write-only, never-read dead store. Why move it to<wiki-root>/MEMORY/: corresponds to §Four-Layer Architecture Layer 3 (independent of wiki/ content), and in the future when publishing, MEMORY naturally remains as a private layer not shared externally. See spec §5 for detailed rules.AGENTS.mddiscipline configuration (SSOT) +CLAUDE.mdthin shell—concentrates the conventions of "how to write the wiki / what to write / what not to write" intoAGENTS.md(a tool-agnostic single source of truth), serving as the "constitution" for the agent maintaining this wiki.CLAUDE.mdis a@AGENTS.mdthin shell, only for Claude Code to read the SSOT via the auto-load convention; other agents that readAGENTS.md(Qoder / Codex / Gemini CLI, etc.) read it natively and directly. Without it, the LLM degenerates into an ordinary chatbot; with it, the LLM is a "strictly disciplined wiki maintainer".Why AGENTS.md as SSOT + CLAUDE.md thin shell(applying theyzr-multi-agent-contextmethod): one source of truth, coexistence of dual tools like Claude Code / Qoder—@importwritten inside the SSOT, both sides can load it.
Four core operations—why four
| Operation | Input | Output | Value |
|---|---|---|---|
| ingest | raw/ new file |
Summary page + cross-references + log entry | Turn raw material into a queryable structure |
| query | Natural language question | Synthesized answer (with citations) + optional archiving | Reuse + compounding: good answers don't go back into chat logs |
| lint | The entire wiki | Report contradictions / orphans / staleness | Prevent the knowledge base from rotting |
| migrate | The entire wiki (including AGENTS.md §8) | legacy report + .migration-plan.json + the latest spec-compatible wiki after agent fixes |
Don't break the accumulated old wiki when the spec evolves |
Every operationrewards both ways: ingest makes query more useful; query makes the wiki thicker; lint keeps ingest from piling up into a mess; migrate keeps a wiki that has run for 1-2 years from falling behind when the spec evolves.Running any one alone is a loss— this is the essence of "compounding". migrate differs from the other three—it isperiodically triggeredrather than triggered on every wiki operation (only run when the spec version is upgraded), but without it the old wiki willrot at the format layerrather than the content layer, which is harder to notice.
Why not use the cloud
outline-wiki-upload / outline-wiki-search goes through cloud MCP (Outline Wiki), suitable for team collaboration, external sharing,
and permission management. This skill goes throughlocal files(git is an optional opt-in), for these reasons:
- Privacy—research / reading / personal thinking don't need to go to the cloud
- Portability—pure Markdown + files, not tied to any platform
- No external dependencies—no OAuth / API key / network needed
- Version control optional—git (during setup
--gitenabled) provides history / diff; not enabling it does not affect ingest / query / lint (seewiki-spec.md§7)
Stance:wiki Works without relying on git—by default it is stored on disk as a pure directory tree; git is enabled only when, during setup, the user explicitly opts in (
--git) .
The two sets of skills do not conflict: local research accumulation → cloud sharing; the direction is one-way.
Execution Principles / Boundaries
Core Principles
Pre-operation (orient ritual, common to all operations): before each ingest / query / lint starts,Does not rely on symlinks —read the four-piece set in the following order before acting:
Read <$LLM_WIKI_ROOT>/AGENTS.md—get this wiki's topic name, boundary configuration, Page Thresholds (0.11.0+: the discipline SSOT isAGENTS.md;CLAUDE.mdis@AGENTS.mda thin shell and does not hold discipline). AGENTS.md no longer contains the tag whitelist (moved out in 0.8.0+ towiki/tags.md—see §Core Principles §11 in this section), butcontains@MEMORY/MEMORY.md+@scripts/SCRIPTS.mdimports (since 0.9.0+, written in the SSOT). When working inside the wiki root directory—Claude Code automatically loads the SSOT (including the index) via the thin-shellCLAUDE.md→@AGENTS.md; other agents that readAGENTS.md(Qoder / Codex / Gemini CLI, etc.) natively read the SSOT; elsewhere, when the skill reads AGENTS.md on demand,@does notautomatically expand; additionalRead <$LLM_WIKI_ROOT>/MEMORY/MEMORY.md+ depending on the situationRead <$LLM_WIKI_ROOT>/scripts/SCRIPTS.mdcomplete the indexRead <$LLM_WIKI_ROOT>/wiki/index.md—know which pages exist and which categories they are distributed across, avoiding duplicate creation / missed cross-referencesRead <$LLM_WIKI_ROOT>/wiki/log.md(the most recent ~30 lines is enough)—see the recent activity clearly, avoiding duplicate ingest / missed archiving of old work- 0.9.0+:
Read <$LLM_WIKI_ROOT>/scripts/SCRIPTS.md—confirm whether this wiki has available project-level extension scripts (batch ingest / external CLI glue / automation hooks); if so, explicitly execute according to the "invocation conventions" in the section; not mandatory (a wiki may have no scripts/), butbefore triggering a non-standard workflowmust first checkIf any of the four-piece set has not been fully read, do not write any wiki content. A wiki with 100+ pages should also, in
wiki/across the wholeGrep "<topic>"supplement once—looking only at index.md may miss reference relationships between entity/concept pages.
-
raw/ is controlled by the user; the LLM is read-only(for the schema see
<wiki-root>/AGENTS.md§1)—the LLM never writes/deletes/moves files underraw/; the user may add/update raw/ at any time (re-clipping and re-saving a PDF both count); changes are re-digested by ingest (updating the corresponding source page body +updated,ingest_diff.py --check-stalemarks items pending re-ingestion by mtime vs sourceupdated) The only exception:raw/external/top level (flat layout, 0.17.0+) the LLM may lead the creation of symlinks + write anchor[[entry]]blocks (see §1.bulk external code repository subsection + wiki-spec §13.3) -
wiki/ is written by the LLM—the user never handwrites wiki pages (except editing AGENTS.md, which is the schema)
-
AGENTS.md is the schema, not documentation—it is a "work code" for the LLM to read; do not stuff content into it
-
Every write must update log.md—the format is strict; the authoritative definition is in
<wiki-root>/AGENTS.md§1 (for the regex seereferences/page-templates.md§7; the script usesscripts/lint_wiki.pyshall prevail) -
Every page must have YAML frontmatter——5 required (
title/type/created/updated/tags) + recommendeddescription(index.mdentry summaries come from it). Why these 5see wiki-spec.md §9(the minimal intersection of OKF field completeness × lint consistency; fewer than 5 fields makes the "rot detection" judgment ineffective). Exceptions:wiki/index.md/wiki/log.md= 4 fields required(omitdescription)MEMORY/MEMORY.md/wiki/tags.md= no frontmatter(index fragments + tag whitelist)MEMORY/*.md(0.19.0+)= onlytitlerequired(the other 5 fields are all optional——MEMORY is the agent's private memory, frontmatter is optional decoration);typeIf extended to 7 categories (5 content pages +memory/memory-entry);tagsIf takingnotgo through thewiki/tags.mdwhitelist;reviewed/reviewed_atdoes not go into lint fallback (MEMORY has no "human review" semantic role) Authoritative definition(typevalue / reserved rules /sourcesfield specialization / credibility signalsreviewed/contested/contradictions) seereferences/page-templates.md§1 ——this clause does not re-copy, lint thresholds are synchronously governed by that location.tagsis managed in §Core Principles §11。
-
Cross-references use relative paths——
[link](sources/bigtable.md), not absolute paths, not wikilinks -
index.md is the single entry point for wiki content pages——all pages that are not log / not MEMORY must appear in
wiki/index.mdappear in -
A good answer to a query must ask "whether to archive"——what can be written back to the wiki should not be wasted in chat
-
MEMORY/is the LLM agent's private memory——when hitting pitfalls, discovering user preferences, or cross-ingest associations, proactively append; frontmatter onlytitlerequired(the other 5 fields are all optional, decoupled from the 5-required rule for wiki content pages ——spec §5.2),not mandatorily listed in index.md,but each one must be listed in a row in theMEMORY/MEMORY.mdindex(that index is imported by AGENTS.md@so it persists in the session, otherwise next time it cannot be read). See spec §5 +wiki-spec.md -
LLM modifications to reviewed pages must clear the
reviewedstamp——any LLM modification to the page body (ingest re-ingestion / query archiving / refine / any Edit/Write) invalidates the stamp;must deletereviewed+reviewed_attwo fields return to the default unreviewed state, to be re-reviewed by a human.lint_wiki.pyusesreviewed-stale(reviewed: trueexists andupdated > reviewed_at) as fallback. SSOT:page-templates.md§1。Note: the same rule also appears in
references/agents-md-template.md§2 "Cognitive Quality Signals" final paragraph——there the wiki's built-in AGENTS.md template must be self-contained (cross-repo references to SKILL.md cannot be resolved); the wording in both places is deliberately kept consistent. The SSOT ispage-templates.md§1. -
The tag whitelist is in
wiki/tags.md(from 0.8.0+ onward, see wiki-spec.md §9.1)——LLM auto-extend bullet + user audit loop (delete bullet → next lint reportstag-not-in-taxonomydecided by user);wiki/tags.mdhas no frontmatter, same form asMEMORY/MEMORY.md. Cross-spec upgrades go throughlint_wiki.py --check-version --apply。agents-md-template.mdthe "Tag Taxonomy" section is self-contained with the same rule (mandatory — the wiki repo's own template cannot reference SKILL.md across repos). -
This wiki's self-maintained scripts go through
<wiki-root>/scripts/+SCRIPTS.mdindex(since 0.9.0+, see wiki-spec.md §14)——SCRIPTS.mdby the wiki repoAGENTS.mdwith@scripts/SCRIPTS.mdimport kept resident in session; agent mustfirstRead SCRIPTS.mdlocate the section, then explicitly execute per the "invocation convention",notautomatically traversescripts/; script and index section modifications are atomic actions。scripts/not subject to §9 5 required fields, do not participate inlint_wiki.pyscanning, do not copy skill-bundled scripts (version drift risk).agents-md-template.mdthe "Wiki-local scripts" section is self-contained with the same rule.
Boundaries
- Do notedit
raw/any file under it — LLM is read-only; users may modify, and after modification ingest re-digests sole exception:raw/external/top level (flat layout, 0.17.0+) LLM may create symlink + write.symlink-anchor.toml's[[entry]]block (first onboarding + drift refresh; spec §13.3) - Do notdelete
wiki/pages under it — usearchived: truemarking + remove from index; to truly delete, delete the file directly (when git is enabled usegit rm, when not enabled use plainrm) - Do notbypass
AGENTS.mdto invent conventions — if AGENTS.md does not say,ask the user firstthen write - Do notsecretly archive during query — must first present the answer + ask the user
- Do notignore lint reports — a wiki not linted for a long time will definitely rot
- Do notuse git operations to break raw/ immutability —
git clean/git checkout -- raw/only applies when git is enabled; when git is not enabled there is no concept of "uncommitted changes" (lint automatically skips this item) - Do notuse tools other than Read to make "automatic" modifications to files in the wiki — all modifications go through Edit / Write and follow schema conventions
- Do notretain the
reviewed: truestamp after LLM modifies a page — the stamp is expired, return to default unreviewed (see core principles §10) - Do notignore
scripts/SCRIPTS.mdindex and directly traversescripts/to run scripts — must firstReadindex to locate the tool- execute per the section's invocation convention (see core principles §12)
Anti-patterns (absolutely prohibited)
- writing prose-style summaries like "first write a paragraph then paste an image" by hand in wiki pages (the root of scattered shotgun-style conflicting conventions)
- scattering the same concept across multiple entities/ files (must first search whether a page with the same name already exists)
- modifying the wiki without writing a log entry (cannot audit + cannot ingest_diff to identify new files)
- Cross-wiki mutual references without updating the other side's index (keeping the two wikis in sync is the user's responsibility)
- Using Obsidian-only syntax (
[[wikilink]]、![[embed]]) — this skill assumes generic Markdown - Copy the scripts bundled with the llm-wiki-management skill (lint_wiki.py / ingest_diff.py / log_format.py)
into
<wiki-root>/scripts/— the SSOT is in the skill repo; this wiki's self-maintained scripts must also update theSCRIPTS.mdindex section - Connecting an external code repo goes through
cp -rembedded intoraw/rather thanraw/external/symlink — losing the commit anchor + taking up space + violating spec §13 discipline
Workflow / Steps
0. One-time setup (first use) — done by the workspace CLI
Responsibility boundaries: this skill is only responsible for the wiki'sgrowth phase(ingest / query / lint). The wiki repo'screation and deletionare handled by the external workspace CLI — for CLI command names and arguments, see the CLI repo's documentation; this skill does not hard-bind to any CLI implementation. For the wiki repo's "birth form" contract, see
references/wiki-spec.md— the interface between the CLI implementation and the SKILL.
Basic flow:
# 1. 调 workspace CLI 创建 wiki 仓(具体命令以 CLI 文档为准)
workspace wiki init "LLM Systems"
# CLI 按 wiki-spec.md 落盘:目录结构 + AGENTS.md(SSOT)+ CLAUDE.md(薄壳)+
# wiki/index.md + wiki/log.md + .gitignore + scripts/SCRIPTS.md(0.9.0+)+
# git 默认跳过(用户 --git opt-in 时才 init)。完整产物清单见 wiki-spec.md §1-§7。
# 2. 把原始资料放进 raw/(用户手动 / Obsidian Web Clipper / 浏览器下载)
cp ~/Downloads/some-article.md ~/wiki/<topic-name>/raw/articles/
What the LLM agent does after taking over:
- Verify the CLI wrote to disk — read
<wiki-root>/AGENTS.mdto confirm the topic name + date were substituted correctly;wiki/index.md/wiki/log.mdexists and the frontmatter is complete;<wiki-root>/CLAUDE.mdis a thin shell - Run the orient ritual (see the blockquote referenced at the top of §Execution Principles / Boundaries)
- Ask the user whether to do a first ingest — if so, give the agent the path to the first material
Why setup and daily work are two layers: CLI = birth/death (one-time, stable structure), LLM = growth (high-frequency interaction). The biggest benefit is that the wiki schema is decoupled from the LLM workflow— the CLI can be upgraded independently in implementation (Python → Rust), while the SKILL stays unchanged.
1. Ingest (ingest new material)
Trigger: "ingest this into the wiki" / raw/ has new files / run ingest_diff.py to find un-ingested items.
Process summary(agent-driven; for the detailed 7 steps + batch processing + external code repo 5 steps, see
references/ingest-workflow.md):
- Run
scripts/ingest_diff.py <wiki-root>(for daily use add--check-stale) to find the list of un-ingested/to-be-re-ingested files - Check the key points for a single item— only for interactive single-item or small-volume scenarios: confirm the topic direction / entities with key overlaps / what the user judges should be kept
- For each file: Read the full text → extract metadata → write
wiki/sources/<slug>.md(for stale-raw go through Edit,do notWrite overwrite) → sync entity/concept (only append the "Sources" section) → updatewiki/index.md→ appendlog.md - commit(only when git is enabled): the pace is decided by the user/agent,do notauto-commit
1.bulk Batch ingest (ingesting ≥ 3 raw files at the same time)
Go through the batch path rather than one by one.One aggregation, one write, one index— avoid N repeated searches / N
index updates / N log entries. For the 5-step process + why batch processing + the details of the log title prefix Bulk: , see
references/ingest-workflow.mdthe "Batch Processing" section.
External code repos as corpus—If the user says "bring repo X into the wiki":Nono inline repo copy; go via
wiki-spec §13 symlink path
(raw/ the general discipline'sonly exception—LLM-led). 5-step onboarding (confirm symlink/target → LLM validation → read
git extension fields → create symlink + write anchor → subsequent ingest_diff scans) + drift refresh + cross-host
rebuild see references/external-repo-rebuild.md。
2. Query (cross-page synthesis)
Trigger: "is there X in the wiki" / "summarize the wiki's content on Y" / "compare A and B".
Flow:
- First look at index.md—find candidate pages by keyword / category
- Read the relevant pages(do not read raw—raw has already been digested into the source pages)
- Cross-page synthesis—cite with source links; explicitly mark contradictions: "A says X (source: ...), B says Y (source: ...), needs deeper investigation"
- Present the answer + ask about archiving—if the answer is of a "comparison / synthesis / discovered connection" nature, ask the user:
"Is this answer suitable for archiving back into the wiki as comparisons/
<slug>.md?" - After user agreement, archive—go through references/page-templates.md's
comparisonorsynthesistemplate + append a log entry
For the detailed query flow and decision rules see references/query-workflow.md。
3. Lint (health check)
Trigger: "lint wiki" / periodic (frequency thresholds see lint-checklist.md §6) / proactively suggested for large wikis.
Flow:
- Run
scripts/lint_wiki.py <wiki-root>for deterministic checks - Script coverage (10 major categories, details see
references/lint-checklist.md): raw immutability / frontmatter fields / orphan pages / broken links / log.md format / stale summaries / page size / cognitive quality and credibility signals (reviewed/contested/contradictions)/raw/external/symlink ↔ anchor association (spec §13) / fixtures consistency (0.18.0+, see §0.18.0+ section) - After the script outputs, the agent must also do semi-qualitative checks: contradictory claims / missing cross-references / suggest new ingestion directions
- Report + ask the user which to fix
For the detailed checklist see references/lint-checklist.md。
4. Memory (write persistent memory for the LLM agent)
Trigger: during ingest / query / lint, identify information worth consolidating—pitfalls, user preferences, cross-document connections.
When to write:
- Encounter a pitfall (e.g.: raw/ PDFs frequently have OCR errors; next time have the user convert the format first)
- Discover a user preference (e.g.: the user prefers tabular comparisons and dislikes prose-style summaries)
- Cross-ingest connection (two source pages point to different chapters of the same paper)
- Recurring pattern in lint reports (every lint reports some type as missing a field)
Flow summary(agent-led; the complete 8 steps + frontmatter fields + index sync rules +
full/short entry determination see references/migrate-workflow.md
MEMORY section—this file contains MEMORY writing details; or the repo root MEMORY/MEMORY.md index's own format):
- Decide whether it is worth writing—can it make future agent work smoother?
- Determine entry form:full(with why+how context) → go to 3-6;short(pure reminder) → skip directly to 5
- In
MEMORY/<slug>.mdcreate the file (kebab-case categorized by topic,notarchived by time) - write frontmatter (only
titlerequired; the other 5 fields are all optional—spec §5.2; short entries may have just 1 linetitle:) - write the body—record the concrete experience, including context / resolution steps / how to avoid it in the future
- append in sync
MEMORY/MEMORY.mdone index line (omitting it = unreadable next time, lintmemory-not-indexedas a fallback) - do notappend a log entry / do notlist it in wiki/index.md (MEMORY does not follow the single-entry constraint)
Discipline:
- Do not delete any MEMORY file—pitfall records accumulate
- when writing a new file, keep the original
createdfield; only updateupdated - Usermust notdirectly edit MEMORY/—if the user wants to add something, first tell the agent and let the agent write it
5. Migrate (upgrade wiki spec)
Trigger: the user says "upgrade wiki / migrate / check wiki version / old format / spec upgrade / whether
reformat is needed"; or lint_wiki.py reports legacy-confidence-field and other migration-period warns.
Division of responsibilities(to avoid confusion with ingest / lint):
- Script(
scripts/lint_wiki.py --check-version,includesautomatically call 0.18.0+check_wiki_fixtures.pyscan convention files) = detector, scans only and does not fix, outputs a report / writes to disk.migration-plan.json - agent = fixer, according to
.migration-plan.json+wiki-spec.mdAppendix B uses Edit/Write to modify frontmatter / move files / supplement the index / modify AGENTS.md §8; goes through plan.fixtures_actions[] to fix convention files; semantic merging followsreferences/lint-checklist.md§5 follows wiki-spec.mdAppendix B = SSOT (the basis for migration is written line by line over there); fixtures-check semantic merging follows lint-checklist §5 (separate from §3 byte compliance)- do notappend a log entry (migration is a script run, not a wiki operation event)
0.18.0+ new capability: fixtures consistency check (0.20.0+ upgraded to field-level skeleton comparison)
--check-version automatically calls scripts/check_wiki_fixtures.py scans the wiki repo's 9 types of convention files,
finding is merged into .migration-plan.json 's fixtures_actions[](parallel to legacy actions[] ).
metadata.fixtures_check_count checks—11 structural probes + 7 0.20.0+ skeleton field comparisons;
skeleton check reads references/canonical/ + references/fixtures/gitignore.txt as SSOT
(changing fixtures → check follows automatically), pure skeleton files compare all fields, growing files compare only required structure,does not touch growing content.
For the field list (what each convention file aligns with during upgrade), see
references/migrate-workflow.mdthe "fixtures field update list" section.
Brief process(agent-driven; for the detailed 8 steps + boundaries + coordination with lint, see
references/migrate-workflow.md):
- orient ritual(AGENTS.md +
wiki/index.md+wiki/log.mdthe most recent ~30 lines) - run
scripts/lint_wiki.py "$LLM_WIKI_ROOT" --check-version——dry-run report + legacy pattern grouping + conflict pages highlighted in red + fixtures-check section (each failed item includes expected/actual); also can separatelyscripts/check_wiki_fixtures.py <wiki-root> [--json]run the convention file scan - ask the user "apply all / partial / view list only"
- User agrees →
scripts/lint_wiki.py ... --check-version --applywrite to disk.migration-plan.json(including legacyactions[]+ fixturesfixtures_actions[], if it already exists, refuse to overwrite) - agent fixes in order: first
fixtures_actions[](convention file) → thenactions[](content page frontmatter) → skipskipped_conflicts[](never automatically overwrite human decisions); semantic merging follows lint-checklist §5 - Edit changes
<wiki-root>/AGENTS.md§8 "Wiki Spec Version" toto_version - rerun
lint_wiki.py --check-versionto verify;needs_migration == falseis complete - clean up temporary files: delete
<wiki-root>/.migration-plan.json+ the*.bakproduced by the upgrade (keep the wiki clean; seereferences/migrate-workflow.mdstep 8) - do notappend a log entry / do nottrigger ingest / query / lint
complete examples:references/examples.md §5 ("check whether the wiki needs upgrading to the latest spec").
reference examples
5 complete examples (setup / ingest / query / lint / migrate) are moved down to
references/examples.md——Read on demand.
Relationship to OKF (Open Knowledge Format)
This skill's output (wiki/ markdown + YAML frontmatter + index.md/log.md) deliberately stays close to
OKF v0.1——
the knowledge format of "markdown + frontmatter, readable by both humans / agents". It is OKF'spractical subset, not verbatim compliance.
Aligned:
- Each concept page has parseable YAML frontmatter (OKF §9 ①)
- Each page's frontmatter contains a non-empty
type(OKF §9 ②) - adopts the OKF recommended field
description——index.mdentry summaries come from it; do not hand-write a second copy in index (OKF §4.1) - bundle root
index.mddeclaresokf_version: "0.1"(OKF §11)
Known divergences (intentionally kept)——the local single-user wiki prioritizes "catch rot + grep-friendly", rather than cross-tool interchange:
| Dimension | This skill | OKF v0.1 | Reason for keeping |
|---|---|---|---|
index.md/log.md with frontmatter |
Yes | §6 index has no frontmatter | convenient for local parsing / grep |
log.md entries |
## [date] op | title single line |
§7 ## date + * **Update** list |
keep the op dimension,grep "^## \[" can be used |
| Cross-links | relative ../concepts/x.md |
§5 recommends bundle absolute /concepts/x.md |
all skill / lint parsing is built on relative paths; migration cost is high |
| Broken links | lint reports error | §5.3 consumers must tolerate broken links | actively catching rot on the production side is the value of lint |
type value |
fixed 5 categories 1 | §4.1 open (producer-defined) | a subset of the OKF open set |
This wiki can be "best-effort read" by any OKF consumer (the tolerant consumption model in §9 requires that it must not be rejected due to the above discrepancies), but it does not claim
100% compliance. When exchanging bundles across organizations, converge to the "fully compliant" tier (remove index/log frontmatter, change log to
## date + list, change relative links to bundle-absolute).
Boundaries with other skills
| Skill | Scenario | Medium |
|---|---|---|
| This skill (llm-wiki-management) | Personal / research local compounding knowledge base | Local Markdown (git optional opt-in) |
outline-wiki-upload |
Team / collaboration: write / edit / push diagrams to Outline | Outline Wiki MCP |
outline-wiki-search |
Team / collaboration: search / read Outline documents | Outline Wiki MCP |
design-doc-edit |
Single design document writing (including mandatory section skeleton) | Single-file Markdown |
gemini-paper-summary |
Structured summary of a single paper (including visual figure extraction) | Single-file Markdown + images |
Serializable:gemini-paper-summary figure extraction → this skill ingest archive to wiki → (future independent publish skill) → outline-wiki-upload share externally
Paper domain: local workflow for paper-topic wikis
This skill never pushes to remote. This section only specifieslocalpaper-domain conventions; publishing papers to the cloud / Outline goes througha future independent publish skill(decoupled from this skill; cross-skill orchestration glue is not this skill's responsibility).
Trigger conditions: the user wants to accumulate a batch of papers into a local wiki—gemini-paper-summary PDF extraction
is upstream, and this skill does archiving + multi-round distillation; temporary paper reading that does not want to enter the wiki does not apply to this section.
Authoritative definition:references/paper-wiki-profile.md—
including raw identity (gemini "full extraction", not PDF / not compressed summary), source page lifecycle
(quick draft → mature through multiple rounds of refine), new refine log op, and gemini-paper-summary
responsibility split, and several anti-patterns.This section does not recopy—the profile is the SSOT; when the profile changes, SKILL.md
just needs to synchronously reference the link.
Why it is a separate profile and does not pollute the general SKILL.md: the paper domain's "raw = full extraction (expensive to read once, repeatedly squeeze the text layer)" is Karpathy's "compounding" replayed inside a single paper, and should not be tied to general wiki rules; the profile makes variants on top of the general rules, and the SSOT remains clean.
Footnotes
-
The 5 categories refer to entity / concept / source / comparison / synthesis; there are also 2 reserved categories (
type: index/type: log) used only as file markers, see wiki-spec.md §8。 ↩