llm-wiki
LLM wiki kit
Created by Mehmet Goekce
Published in MehmetGoekce/llm-wiki. Publisher page
168 GitHub stars
What it is
Build Karpathy's LLM Wiki with Claude Code. L1/L2 cache architecture. Logseq + Obsidian support.
Summary from the brain’s metadata
Build Karpathy's LLM Wiki with Claude Code. L1/L2 cache architecture. Logseq + Obsidian support. Build Karpathy's LLM Wiki with Claude Code. Two-layer cache architecture (L1/L2). Supports Logseq and Obsidian.
How it works
Memory model: LLM wiki
AutoGineer overview, from the brain’s own files
Memory model: LLM wiki. Folders: .github (agent config, 5 files); docs (docs, 7 files); examples (examples, 2 files); templates (templates, 8 files).
| Folder | Role | Files |
|---|---|---|
| .github | agent-config | 5 |
| docs | docs | 7 |
| examples | examples | 2 |
| templates | templates | 8 |
| .claude-plugin | folder | 3 |
| openspec | folder | 23 |
Requirements
Works with: Claude Code
Set it up
Clone the repository at the commit AutoGineer scanned:
git clone https://github.com/MehmetGoekce/llm-wiki.git && cd llm-wiki && git checkout 5fa5ee7d49a4346eeb1d92c1de7bf649e7654e91Point Claude Code at .claude-plugin/icon.png: it does not read that file on its own.
cd llm-wiki && claude
AutoGineer scanned these files at commit 5fa5ee7.
- Not scanned by AutoGineerThe author’s README also describes installing it as a Claude Code plugin marketplace. Read its install section: AutoGineer did not scan that path. https://github.com/MehmetGoekce/llm-wiki/blob/5fa5ee7d49a4346eeb1d92c1de7bf649e7654e91/README.md#quick-start
- Not scanned by AutoGineerThe author’s README also describes installing it from a clone of its repository. Read its install section: AutoGineer did not scan that path. https://github.com/MehmetGoekce/llm-wiki/blob/5fa5ee7d49a4346eeb1d92c1de7bf649e7654e91/README.md#quick-start
Created by Mehmet Goekce. Published in MehmetGoekce/llm-wiki. Licence: MIT License.
Usage
From the brain’s own files
- ${user_config.wiki_path} (the "Wiki root:" line): your Logseq graph or Obsidian vault
- ${CLAUDE_PLUGIN_ROOT} (the setup workflow): the clone, so that setup finds templates/
Documentation by Mehmet Goekce
llm-wiki
Image: License: MIT Image: Release Image: Stars Image: Top Language Image: Last Commit
Build Karpathy's LLM Wiki with Claude Code. Two-layer cache architecture (L1/L2). Supports Logseq and Obsidian.
graph TB
subgraph "Every Session — Auto-loaded"
L1[L1: Claude Memory]
L1R[Rules & Gotchas]
L1I[Identity & Preferences]
L1C[Credentials]
L1 --> L1R
L1 --> L1I
L1 --> L1C
end
subgraph "On Demand — /llm-wiki query"
L2[L2: Wiki]
L2P[Projects & History]
L2W[Workflows & Processes]
L2K[Research & Learning]
L2 --> L2P
L2 --> L2W
L2 --> L2K
end
NEW[New Knowledge] --> ROUTE{Quick rule?}
ROUTE -->|Yes| L1
ROUTE -->|No| L2
USER[User Query] --> CLAUDE[Claude Code]
CLAUDE --> L1
CLAUDE -->|Deep question| L2What is this?
Image: Wiki graph view after setup Your wiki after a few ingests — interconnected knowledge pages in Logseq's graph view.
In April 2026, Andrej Karpathy published a gist called "LLM Wiki" that got 5,000+ stars in days. The idea: let an LLM maintain a structured, cross-referenced wiki for you. Feed it raw sources, it extracts facts, links them together, and keeps everything consistent. The wiki becomes a persistent, compounding artifact instead of a graveyard of stale notes.
Everyone loved the concept. Almost nobody built one. The gist describes what to build, not how to wire it up with real tools, real files, and real workflows. llm-wiki is the implementation. It uses Claude Code as the LLM brain and either Logseq or Obsidian as the wiki UI, with a two-layer cache architecture that turned out to be the key insight Karpathy's gist does not mention.
Why use this?
5-minute setup. Install the plugin, run
/llm-wiki setup, and you have a schema, namespaces, and git tracking. No manual design needed.Claude becomes your wiki maintainer.
/llm-wiki ingestupdates 5-15 pages with cross-references from a single source.L1/L2 architecture. Auto-loaded rules in memory (L1) + deep knowledge in the wiki (L2). No other tool has this.
Built-in quality checks.
/llm-wiki lintfinds orphan pages, stale content, broken refs, and credential leaks.Logseq + Obsidian. Use whichever you already have. No tool switch required.
Quick Start
As a Claude Code plugin (recommended)
claude plugin marketplace add MehmetGoekce/llm-wiki
claude plugin install llm-wiki@mehmetgoekceOn Claude Code 2.1.275 or later, one line inside a session does the same:
/plugin install llm-wiki --marketplace MehmetGoekce/llm-wikiClaude Code asks for one value, the Wiki root: your Logseq graph or Obsidian vault. The directory may be empty or not exist yet. Then, in any project:
/llm-wiki setup
/llm-wiki ingest "your first source"
/llm-wiki query "what do I know about X?"
/llm-wiki lint/llm-wiki setup asks which tool you use and which namespaces you want, then creates the Schema,
Dashboard, hub pages, Access-Log and llm-wiki.yml. The wiki starts sparse and gets denser with
every ingest. New releases reach you through the plugin; nothing to copy.
Tested with Claude Code 2.1.296.
Without the plugin
Clone the repository and copy the skill into the project that should use it:
git clone https://github.com/MehmetGoekce/llm-wiki.git ~/llm-wiki
mkdir -p ~/myproject/.claude/commands
cp ~/llm-wiki/SKILL.md ~/myproject/.claude/commands/wiki.mdIn the copy, replace two placeholders with absolute paths:
${user_config.wiki_path}(the "Wiki root:" line): your Logseq graph or Obsidian vault${CLAUDE_PLUGIN_ROOT}(the setup workflow): the clone, so that setup findstemplates/
On Linux (on macOS, write sed -i '' instead of sed -i):
sed -i -e 's|\${user_config.wiki_path}|/home/you/notes/wiki|g' \
-e 's|\${CLAUDE_PLUGIN_ROOT}|/home/you/llm-wiki|g' \
~/myproject/.claude/commands/wiki.mdThen run /wiki setup in that project. The copy is invoked as /wiki <command>, stays at the
version you copied, and needs the clone to stay where it is. The plugin is the recommended path.
The rest of this README writes /llm-wiki <command>. With a copied skill, type /wiki <command>.
Moving from a copied skill to the plugin
Install the plugin, enter your existing wiki directory as Wiki root, and delete the copied
.claude/commands/wiki.md from your project. The wiki itself needs no change.
Coming from v1.6.0
The plugin's commands lost their second part: /llm-wiki:wiki ingest is now /llm-wiki ingest, and
/llm-wiki:setup is now /llm-wiki setup. Update the plugin and use the new names.
The L1/L2 Architecture
This is the part not in Karpathy's gist, and it turned out to be the most important design decision.
When you start building a wiki, the instinct is to put everything in one place. That is wrong. Some knowledge must be available in every session, before you even ask a question -- things like "max 2-3 SSH calls to the VPS, never 10+" or "always use ISO 8601 dates." If the LLM has to query the wiki to learn these rules, it has already made the mistake.
Other knowledge only matters in specific contexts. The full history of a project. A detailed API workflow. Loading all of this into every session wastes the context window.
The solution maps to a concept every engineer knows: CPU cache hierarchy.
| Layer | What | Size | Loading | Contains |
|---|---|---|---|---|
| L1 | Claude Code Memory | ~10-20 files | Auto-loaded every session | Rules, gotchas, identity, credentials |
| L2 | Wiki (Logseq/Obsidian) | ~50-200 pages | On-demand via /llm-wiki query | Projects, workflows, research, deep knowledge |
graph TB
subgraph "Every Session — Auto-loaded"
L1[L1: Claude Memory]
L1R[Rules & Gotchas]
L1I[Identity & Preferences]
L1C[Credentials]
L1 --> L1R
L1 --> L1I
L1 --> L1C
end
subgraph "On Demand — /llm-wiki query"
L2[L2: Wiki]
L2P[Projects & History]
L2W[Workflows & Processes]
L2K[Research & Learning]
L2 --> L2P
L2 --> L2W
L2 --> L2K
end
NEW[New Knowledge] --> ROUTE{Quick rule<br/>or gotcha?}
ROUTE -->|Yes| L1
ROUTE -->|No| L2
USER[User Query] --> CLAUDE[Claude Code]
CLAUDE --> L1
CLAUDE -->|Deep question| L2The routing rule is simple: Would the LLM making a mistake without this knowledge be dangerous or embarrassing? Then it belongs in L1. Would the mistake be merely inconvenient? Then L2.
Credentials are a special case -- they must live in L1 because the wiki is typically git-tracked. The L1 memory directory is excluded from git, making it the only safe place for secrets.
For the full deep-dive, see docs/l1-l2-architecture.md.
Commands
| Command | Description |
|---|---|
/llm-wiki ingest <source> | Process a source (URL, file, text), update 5-15 wiki pages |
/llm-wiki query <question> | Two-stage search via hub index, synthesize answer with source attribution |
/llm-wiki prune [--months N] | LRU-Demote: evict cold pages from the live index (default 6 months) |
/llm-wiki prune --l1 | L1-Verification: classify L1 rules, check due behavior claims against local evidence, re-verify / demote / delete |
/llm-wiki lint [--fix] | Health check: orphans, stale pages, broken refs, index drift, credential leaks, due L1 claims |
/llm-wiki status | Metrics dashboard: page count, health, hot/cold profile, recent changes |
Ingest Flow
Ingest is the core operation. When you run /llm-wiki ingest "deployed v2.0 to production", here is what happens:
graph LR
SRC[Source<br/>URL / File / Text] --> A[Phase 1<br/>Analyze & Extract]
A --> B[Phase 2<br/>Scan Wiki<br/>Find affected pages]
B --> C[Phase 3<br/>Update Pages<br/>Create new / Append]
C --> D[Phase 4<br/>Quality Gate<br/>Properties? Cross-refs?<br/>No credentials?]
D --> E[Phase 5<br/>Report<br/>Pages touched / Warnings]
E --> GIT[git commit]Phase 1 -- Analyze & Extract. Claude reads the source and extracts entities, facts, relationships, and dates. It classifies each piece by domain (business, technical, content, etc.) and checks whether it belongs in L1 (quick rule) or L2 (deep knowledge).
Phase 2 -- Scan Wiki. Claude reads the schema, then scans existing pages to find which ones the new information affects. If you mention a tool that already has an entity page, it knows to update that page too.
Phase 3 -- Update Pages. New pages get all required properties from the schema. Existing pages get new facts appended; when a fact supersedes a stated state (a status, a deadline, a decision), the block is rewritten and the old wording moves into a collapsed History -- nothing is deleted, and the current state stays on top. Target: 5-15 page touches per ingest.
Phase 4 -- Quality Gate. Before committing: Do all pages have required properties? Does every page have at least one cross-reference? Are there credential patterns in the content?
Phase 5 -- Report. Summary of pages created, updated, cross-references added, and any warnings.
Query
Query is two-stage, the way a CPU resolves an address before touching memory. Stage 1 (routing): Claude reads only the hub ### Index pages of the candidate namespaces — a cheap list of routing lines ([[page]] -- description #tags) — and picks the 3 most relevant pages by description. This is the wiki's page table. Stage 2 (read): it opens only those full pages and synthesizes an answer with source attribution. A full-text grep over every page is the L3 fallback, used only when routing finds nothing. Each full-page read is logged to an append-only Access-Log together with the routing reason it was picked (the matched index description or grep term) — so the log records not just what loaded but why, and it feeds prune. If the query reveals a gap, it offers to create a new page.
Prune
Prune is the eviction layer that keeps routing precise as the wiki grows. It reads the Access-Log, finds cold pages (no read in N months, default 6), and evicts them from the live index — the routing line moves from the hub ### Index to ### Archive and the page is marked archived::. This is demotion, not deletion: the file stays in place, every incoming [[link]] stays valid, and the page is still found by the L3 grep fallback (and re-promoted automatically if queried again). Crucially, prune never renames or moves a file — the wiki tool links by page name, so a move would break every backlink. Run it on a schedule (the command does not self-schedule).
--l1 is the L1 counterpart. Access frequency cannot find stale L1 rules — every L1 file loads every session, so a stale rule never looks cold; it shows up as the agent confidently acting on an outdated assumption. So L1 files carry a claim class: asserts-current-behavior: true for claims about a system's current state (a path, flag, version, quirk) and false for decisions and preferences, which never go stale. Behavior claims carry a verified date. /llm-wiki prune --l1 classifies unclassified files (it proposes, you confirm), checks due claims against read-only local evidence, and lets you re-verify, demote the rule to L2 as history, or delete it. It does not warn mid-session when a stale rule is about to justify an action — Claude Code loads L1, so there is no hook for that; it is on the roadmap.
Lint
Lint is the automated health check. It scans every wiki page and checks 13 rules: orphan pages (no incoming links), stale content (last updated 90+ days ago but still marked high-confidence), missing required properties, broken references, hub completeness, index drift (an active page with no routing line, or a routing line with no page), archived-in-live-index (a demoted page still routed), empty pages, weak cross-referencing, credential patterns, L1/L2 duplicates, due L1 claims (behavior claims whose verified date is missing or older than l1_verify_days), and block bloat (a block grown past 600 characters of prose, or an updated:: value used as a change log). Run with --fix and Claude auto-repairs what it can — including backfilling missing routing lines into hub indexes.
The Schema
The schema is the contract between you and the LLM. Without it, the LLM creates inconsistent pages -- one uses status: active, another state:: running, a third has no status field at all. With a schema, every page follows the same structure and automated quality checks become possible.
The schema defines:
8 namespaces (Business, Tech, Content, Projects, People, Learning, Reference, Careers)
5 page types (Entity, Project, Knowledge, Feedback, Hub) with required properties
Lint rules for automated health checks
L1/L2 boundary so the system knows where new knowledge should be routed
For the complete schema reference, see docs/schema-reference.md.
Logseq vs. Obsidian
Both wiki apps are supported. Choose based on your preference:
| Logseq | Obsidian | |
|---|---|---|
| Properties | property:: value (inline) | YAML frontmatter |
| Format | Outliner (- prefix on every line) | Flat markdown |
| File names | Wiki___Tech___Strapi.md | Wiki/Tech/Strapi.md |
| Links | [[Wiki/Tech/Strapi]] | [[Wiki/Tech/Strapi]] |
| Backlinks | Automatic (graph-native) | Via plugin or core feature |
| Block addressing | Every line is a block | Paragraph-level |
| License | AGPL-3.0 (open source) | Proprietary (free for personal use) |
Logseq shines when the LLM is doing the writing -- its outliner format means every block is independently addressable, so appending new content never disrupts existing structure.
Obsidian is better if you do a lot of manual editing -- flat markdown is more natural to write by hand, and the plugin ecosystem is massive.
For a detailed comparison with migration paths, see docs/logseq-vs-obsidian.md.
Before & After
The difference between a dead wiki and a living one is page quality.
Before -- a placeholder created when the page was first made:
- type:: knowledge
- domain:: content
- ## Newsletter
- To be filled via /llm-wiki ingest.After -- synthesized from multiple sources over several ingest operations:
- type:: knowledge
- domain:: content
- confidence:: high
- created:: 2026-03-15
- updated:: 2026-04-07
- ## Company Newsletter
- Monthly newsletter targeting existing clients and prospects.
- ### Metrics
- | Metric | Value | As of |
|--------|-------|-------|
| Subscribers | ~240 | 2026-04-01 |
| Open rate | 38% | 2026-04-01 |
| Cadence | monthly | -- |
- ### Content Strategy
- 1 technical deep-dive + 1 business insight per issue
- Always include a CTA to the latest blog post
- Subject lines: question format performs 2x better
- ### Open Questions
- Segment list by industry vertical?
- A/B test send time (Tuesday AM vs Thursday AM)?
- ### Cross-References
- [[Wiki/Content/Blog]] -- Source content
- [[Wiki/Content/LinkedIn]] -- Promotion channel
- [[Wiki/Reference/Workflows]] -- Publishing workflowEvery number has a date. Decisions have rationale. Open questions are explicit. Cross-references connect to related pages.
Configuration
Setup creates llm-wiki.yml in your wiki root. You can also create it manually:
# llm-wiki.yml
tool: logseq # or "obsidian"
wiki_path: ~/Documents/MyWiki/
pages_dir: pages # relative to wiki_path
memory_path: ~/.claude/projects/my-project/memory/
l1_verify_days: 90 # optional: re-verify L1 behavior claims after N days
namespaces:
- Business
- Tech
- Content
- Projects
- People
- Learning
- Reference
- Careers
# Lint settings
lint:
stale_threshold_days: 90
min_cross_refs: 1
credential_patterns:
- "token::"
- "password::"
- "secret::"
- "api.key::"
# Ingest settings
ingest:
target_page_touches: [5, 15] # min, max pages per ingest
append_only: true # never delete content; superseded state moves to a collapsed History
# Language (for multilingual wikis)
language:
business: en # Language for business content
tech: en # Language for technical contentTrade-offs
No system is perfect. Some things to know:
The schema feels overengineered at first. With 10 pages, defining 5 page types and 8 lint rules seems like overkill. Past 50 pages, you will be grateful for the consistency. Define the schema early -- it is much harder to retrofit one later.
Two systems means you need a clear boundary. Having both L1 and L2 means you could accidentally put the same information in both places. The lint rule for L1/L2 duplicates exists precisely for this reason.
Parallel agents can conflict. If you have multiple Claude sessions writing to wiki files simultaneously, concurrent edits can cause conflicts. Treat wiki files as a shared resource.
Start with fewer hub pages. Let them emerge organically from ingest operations rather than creating empty hubs upfront.
Documentation
FAQ — Common questions before you install
Troubleshooting — Setup, integration, and runtime issues
L1/L2 Architecture — Why two layers, how to route knowledge
Schema Reference — Page types, properties, lint rules
Logseq vs. Obsidian — Detailed comparison and migration notes
Privacy
llm-wiki has no backend and collects nothing. It is a skill and a few shell scripts that run inside your own Claude Code session.
Wiki pages, the access log and
llm-wiki.ymlare written to your local Logseq graph or Obsidian vault and stay there. Whatever you ingest ends up in those files, including names or contact details if the source contains them.If you set
memory_path, the skill also reads your local Claude Code memory directory:querymay consult it,lintreports rules that are due for a check, andprune --l1classifies, updates, moves or deletes memory files, each one only after you confirm it.lintnever prints the content of a memory file. Withoutmemory_paththe skill does not touch that directory.The skill and the scripts send nothing to the author or to any third party. There is no telemetry.
The only network access is the page fetch that
ingestmakes when you pass a URL as the source.Commits are local. Nothing is pushed unless you push your wiki yourself.
Claude reads the content you work with in order to do the work. That processing is covered by your own Claude plan and Anthropic's terms, not by this plugin.
Credits
Inspired by Andrej Karpathy's LLM Wiki gist
Built with Claude Code
License
MIT -- see LICENSE for details.
openspec/specs/lint.md
Spec: /llm-wiki lint — Automated Health Checks
Description
The lint command scans all wiki pages for structural issues, data quality problems,
and security concerns. It reports findings grouped by severity and can auto-fix
certain issues when run with the --fix flag. There are 13 lint rules.
Requirements
Scanning
REQ-100: The system SHALL scan ALL files matching the wiki page pattern (Logseq:
Wiki___*.md, Obsidian:Wiki/**/*.md).REQ-101: The system SHALL read page properties, count outgoing
[[Wiki/...]]links, and check theupdated::date for every scanned page.REQ-102: The system SHALL build an incoming-link graph (page -> pages that reference it) to detect orphans.
REQ-103: The system SHALL read
llm-wiki.ymlfirst to determine tool mode and paths.
Rule 1: Orphan Detection
REQ-110: The system SHALL flag pages with 0 incoming
[[Wiki/...]]links from other wiki pages.REQ-111: Hub pages (type:: hub) SHALL be exempt from orphan detection.
REQ-112: Auto-fix (--fix): The system SHALL add the orphan page to its namespace's hub page.
Rule 2: Stale Detection
REQ-120: The system SHALL flag pages where
updated::is older than 90 days ANDconfidence::ishigh.REQ-121: Pages without a
confidence::property SHALL be exempt from stale detection (the rule only applies to knowledge-type pages).REQ-122: The 90-day threshold SHALL be calculated as: today minus the
updated::date value.REQ-123: Auto-fix (--fix): The system SHALL downgrade
confidence::fromhightostale. Theupdated::date SHALL NOT be changed by this operation (the page content has not changed, only the confidence assessment).
Rule 3: Missing Properties
REQ-130: The system SHALL check each page against the required properties for its declared
type::value (per Schema page).REQ-131: Required properties per type:
Entity: type, entity-type, created, updated, status, source
Project: type, status, created, updated, started
Knowledge: type, domain, created, updated, confidence
Feedback: type, severity, created, verified, applies-to
Hub: type, namespace
REQ-132: A page with a missing required property SHALL be flagged as a warning.
REQ-133: No auto-fix for missing properties (requires human judgment).
Rule 4: Broken References
REQ-140: The system SHALL identify all
[[Wiki/...]]links in every page and verify that the target page exists on disk.REQ-141: A link to a non-existent page SHALL be flagged as a warning.
REQ-142: Auto-fix (--fix): The system SHALL create a stub page for each broken reference with: type:: knowledge, domain:: tech, confidence:: low, created:: [today], updated:: [today], and a placeholder note "To be filled via /llm-wiki ingest".
REQ-143: Stub pages SHALL include a cross-reference back to the page that contained the broken link.
Rule 5: Hub Completeness
REQ-150: The system SHALL verify that every hub page lists ALL pages that exist in its namespace.
REQ-151: A hub page missing a child page SHALL be flagged as a warning.
REQ-152: Auto-fix (--fix): The system SHALL append the missing child page link to the hub page.
Rule 6: Credential Leak
REQ-160: The system SHALL scan all wiki page content for credential patterns:
token::,password::,secret::,api-key::,api.key::, and base64 strings matching[A-Za-z0-9+/]{40,}.REQ-161: Pattern matching SHALL be case-insensitive.
REQ-162: In Obsidian mode, the system SHALL also scan YAML frontmatter for credential patterns.
REQ-163: Any credential match SHALL be flagged as severity
critical.REQ-164: No auto-fix for credential leaks (requires manual intervention to move the credential to L1 memory).
Rule 7: Empty Pages
REQ-170: The system SHALL flag pages that contain only properties and no substantive content below the properties section.
REQ-171: A page with only type/date properties and no knowledge blocks SHALL be flagged as a warning.
REQ-172: No auto-fix (page should be filled via /llm-wiki ingest or deleted).
Rule 8: Cross-Reference Minimum
REQ-180: The system SHALL flag pages with fewer than 1 outgoing
[[Wiki/...]]link.REQ-181: Auto-fix (--fix): The system SHALL add a link to the page's namespace hub page (e.g., a page in Wiki/Tech/ gets a link to Wiki/Tech).
Rule 9: L1/L2 Duplicates
REQ-190: The system SHALL compare wiki page content against L1 memory files (at the path specified in
llm-wiki.ymlmemory_path).REQ-191: The system SHALL flag cases where substantially the same information exists in both L1 memory and L2 wiki.
REQ-192: No auto-fix (requires human decision on which location is authoritative).
Rule 10: Index Drift
REQ-193: The system SHALL flag a routing line in a hub
### Indexwhose target page does not exist on disk (orphaned routing line).REQ-194: The system SHALL flag an active (non-archived) page that has no routing line in its namespace hub
### Index(unroutable — only findable via L3 grep).REQ-195: The system SHALL flag a routing line that has no description text after the
--separator (a routing key cannot be empty).REQ-196: Auto-fix (--fix): for an unroutable page, the system SHALL backfill a routing line into the hub
### Index, deriving the description from the page title and first content block and copying the page's existing#tags. For an orphaned routing line, the system SHALL remove it.
Rule 11: Archived-in-Live-Index
REQ-197: The system SHALL flag a demoted page (marked
archived::, see specs/schema.md REQ-565) whose routing line is still in the hub### Indexinstead of### Archive(an unclean prune).REQ-198: Auto-fix (--fix): the system SHALL move the routing line from
### Indexto### Archive. It MUST NOT rename or move the page file (links are by page name).
Rule 12: L1 Verification Due
REQ-220: If
memory_pathis configured, the system SHALL scan every L1 memory file except the index file (see specs/l1-l2-routing.md REQ-377). Ifmemory_pathis absent, the rule SHALL be skipped silently.REQ-221: The system SHALL flag every L1 rule that is due for verification (specs/l1-l2-routing.md REQ-374) as a warning, reporting: file name,
verifieddate (or "never"), and age in days.REQ-222: The system SHALL report the number of unclassified L1 files (no
asserts-current-behaviorkey) as a single info finding, not one finding per file.REQ-223: Rules with
asserts-current-behavior: falseSHALL never be flagged by this rule, regardless of age.REQ-224: No auto-fix. The finding SHALL suggest
/llm-wiki prune --l1. Rule 12 MUST NOT write to L1 files, even with--fix(L1 is not git-tracked; writes need per-item confirmation).REQ-225: The system MUST NOT print the body of L1 files in the lint report (L1 may hold credentials); file names and dates only.
Rule 13: Block Bloat
REQ-230: The system SHALL flag, as a warning, every block (Obsidian: paragraph) with more than 600 characters of prose. Code blocks, tables, the Access-Log page, and content inside a
Historychild or a## Change logsection SHALL NOT count.REQ-231: The finding SHALL suggest splitting the block into current state (headline, properties, next step) and a collapsed
History(see specs/ingest.md REQ-032a).REQ-232: The system SHALL flag, as a warning, every
updated::value (page or section property; YAMLupdated) that is more than an ISO 8601 date.REQ-233: Auto-fix (--fix): for REQ-232 findings, the system SHALL cut the value to the date and move the rest verbatim into the page's collapsed
## Change logsection, one line per dated entry, newest first. Nothing SHALL be dropped.REQ-234: The system MUST NOT auto-restructure blocks flagged under REQ-230, even with
--fix— deciding what the current state is needs human (or ingest-time) judgment.
Reporting
REQ-200: The system SHALL group findings by severity: critical, warning, info.
REQ-201: The system SHALL output totals: total pages scanned, healthy pages, issues found (by rule and severity).
REQ-202: For each finding, the system SHALL report: page name, rule violated, severity, and suggested fix.
REQ-203: After auto-fix (--fix), the system SHALL output what was changed and recommend a git commit.
Dashboard
REQ-210: After lint completes, the system SHOULD update the Dashboard page (Wiki/Dashboard or Wiki___Dashboard.md) with current health metrics.
REQ-211: The Dashboard SHALL include: last lint date, total pages, issues by severity, and pages needing attention.
Scenarios
Scenario 1: Clean wiki — no issues
GIVEN a wiki with 10 pages, all with required properties, cross-references,
and current updated:: dates
AND all hub pages list their children
AND no credential patterns exist in any page
WHEN the user runs /llm-wiki lint
THEN the report SHALL show: 10 pages scanned, 0 issues found
AND no pages SHALL be modifiedScenario 2: Orphan page detected
GIVEN a page Wiki___Tech___Redis.md exists
AND no other wiki page contains a [[Wiki/Tech/Redis]] link
AND Redis is NOT a hub page
WHEN the user runs /llm-wiki lint
THEN the system SHALL flag Wiki/Tech/Redis as "orphan" (warning)
AND suggest: "Add [[Wiki/Tech/Redis]] to the Wiki/Tech hub page"Scenario 3: Orphan auto-fix
GIVEN the same orphan condition as Scenario 2
WHEN the user runs /llm-wiki lint --fix
THEN the system SHALL append [[Wiki/Tech/Redis]] to Wiki___Tech.md
AND the report SHALL show: "Fixed: Added Wiki/Tech/Redis to hub Wiki/Tech"Scenario 4: Stale page with high confidence
GIVEN a page Wiki___Tech___Strapi.md with updated:: 2026-01-01
AND the page has confidence:: high
AND today is 2026-04-10 (100 days later, exceeds 90-day threshold)
WHEN the user runs /llm-wiki lint
THEN the system SHALL flag the page as "stale" (warning)
AND suggest: "Confidence is 'high' but page is 100 days old. Review or downgrade."Scenario 5: Stale auto-fix — confidence downgraded
GIVEN the same stale condition as Scenario 4
WHEN the user runs /llm-wiki lint --fix
THEN the system SHALL change confidence:: from high to stale
AND the updated:: property SHALL remain 2026-01-01 (NOT changed)
AND the report SHALL show: "Fixed: Downgraded confidence from high to stale"Scenario 6: Credential leak detected
GIVEN a page Wiki___Tech___Deployment.md contains the text
"api-key:: " followed by a 40-character alphanumeric value
WHEN the user runs /llm-wiki lint
THEN the system SHALL flag the page as "credential leak" (critical)
AND suggest: "Move credential to L1 memory. Wiki pages are git-tracked."
AND the finding SHALL be listed first in the report (critical severity)Scenario 7: Broken reference with auto-fix
GIVEN a page Wiki___Projects___MyProject.md contains [[Wiki/Tech/NewTool]]
AND no file Wiki___Tech___NewTool.md exists
WHEN the user runs /llm-wiki lint --fix
THEN the system SHALL create a stub page Wiki___Tech___NewTool.md with:
type:: knowledge, domain:: tech, confidence:: low, created:: [today],
updated:: [today], and content "To be filled via /llm-wiki ingest"
AND the stub SHALL contain [[Wiki/Projects/MyProject]] as a cross-reference
AND the Wiki___Tech.md hub SHALL be updated to list the new pageScenario 8: Hub missing child pages
GIVEN Wiki___Tech.md (hub) lists: [[Wiki/Tech/Strapi]], [[Wiki/Tech/Stack]]
AND Wiki___Tech___Deployment.md also exists in the pages directory
WHEN the user runs /llm-wiki lint
THEN the system SHALL flag Wiki/Tech hub as "incomplete" (warning)
AND suggest: "Hub Wiki/Tech is missing child: [[Wiki/Tech/Deployment]]"Scenario 9: Empty page detected
GIVEN a page Wiki___Learning___Rust.md contains only:
type:: knowledge
domain:: tech
created:: 2026-03-15
updated:: 2026-03-15
confidence:: low
AND no content blocks exist below the properties
WHEN the user runs /llm-wiki lint
THEN the system SHALL flag the page as "empty" (warning)
AND suggest: "Page has properties but no content. Fill via /llm-wiki ingest or delete."Scenario 10: L1/L2 duplicate detected
GIVEN L1 memory file feedback_deploy_ram.md contains "Stop ClamAV before deploy"
AND wiki page Wiki___Tech___Deployment.md also contains "Stop ClamAV before deploy"
WHEN the user runs /llm-wiki lint
THEN the system SHALL flag as "L1/L2 duplicate" (info)
AND suggest: "Same info in L1 memory and L2 wiki. Decide which is authoritative."Scenario 11: Index drift — unroutable page backfilled
GIVEN a page Wiki___Tech___Redis.md exists and is active (not archived)
AND the Wiki/Tech hub `### Index` has no routing line for [[Wiki/Tech/Redis]]
WHEN the user runs /llm-wiki lint --fix
THEN the system SHALL flag Wiki/Tech/Redis as "index drift: unroutable" (warning)
AND backfill a routing line into the Wiki/Tech hub `### Index`:
"[[Wiki/Tech/Redis]] -- <description from title + first block> #<existing tags>"Scenario 12: Archived page still in the live index
GIVEN Wiki___Tech___Legacy-Foo.md has archived:: 2026-06-07 (and status:: archived, an entity page)
AND its routing line still sits in the Wiki/Tech hub `### Index`
WHEN the user runs /llm-wiki lint --fix
THEN the system SHALL flag it as "archived-in-live-index" (warning)
AND move the routing line from `### Index` to `### Archive`
AND NOT rename or move the Legacy-Foo page fileScenario 13: L1 verification due
GIVEN memory_path contains:
feedback_pm2_reload.md (asserts-current-behavior: true, verified: 2026-01-10)
feedback_rtk_hook.md (asserts-current-behavior: true, no verified)
feedback_no_ai.md (asserts-current-behavior: false)
user_address.md (no asserts-current-behavior key)
MEMORY.md (index)
AND today is 2026-06-15 and l1_verify_days is 90
WHEN the user runs /llm-wiki lint
THEN the system SHALL flag feedback_pm2_reload.md (verified 2026-01-10, 156 days) (warning)
AND flag feedback_rtk_hook.md (verified never) (warning)
AND NOT flag feedback_no_ai.md
AND report "1 unclassified L1 file — run /llm-wiki prune --l1 to classify" (info)
AND NOT inspect MEMORY.md
AND NOT print any L1 file bodyScenario 14: Rule 12 with --fix writes nothing
GIVEN the same L1 state as Scenario 13
WHEN the user runs /llm-wiki lint --fix
THEN the system SHALL report the same Rule 12 findings
AND NOT modify any L1 fileScenario 15: Oversized block flagged, not rewritten
GIVEN a hub page holds one task block with 2,400 characters of prose built from dated
"Status <date>: ..." addenda
WHEN the user runs /llm-wiki lint --fix
THEN the system SHALL flag it as "block-bloat" (warning) with the suggestion
"split into current state + collapsed History"
AND NOT modify the blockScenario 16: updated:: used as a change log
GIVEN a page has
updated:: 2026-09-28 (moved three items to Expired) — before 2026-09-20 (+1 ticket)
WHEN the user runs /llm-wiki lint --fix
THEN the system SHALL flag it as "block-bloat" (warning)
AND set updated:: 2026-09-28
AND add "2026-09-28 (moved three items to Expired)" and "2026-09-20 (+1 ticket)",
newest first, to the page's collapsed `## Change log`Acceptance Criteria
[ ] All 13 rules execute during a lint run (Rule 12 only when memory_path is set)
[ ] Findings grouped by severity: critical > warning > info
[ ] Report includes totals (pages scanned, healthy, issues by rule)
[ ] Auto-fix (--fix) only modifies rules 1, 2, 4, 5, 8, 10, 11, and the
updated::part of 13[ ] Rules 3, 6, 7, 9, 12 and oversized blocks under 13 never auto-fix (require human judgment)
[ ] Rule 12 reports due L1 rules and the unclassified count without printing L1 bodies
[ ] Index Drift (rule 10) backfills unroutable pages and removes orphaned routing lines
[ ] Archived-in-Live-Index (rule 11) moves routing lines but never renames/moves page files
[ ] Credential detection is case-insensitive and scans both content and frontmatter
[ ] Stale detection uses exact 90-day threshold from updated:: to today
[ ] Hub completeness checks ALL child pages, not just recently created ones
[ ] Works correctly in both Logseq and Obsidian page naming conventions
[ ] Dashboard page updated after lint completes
58 files · 2 not served here
- .claude-plugin/icon.png (not served here)
- .claude-plugin/marketplace.json
- .claude-plugin/plugin.json
- .github/ISSUE_TEMPLATE/bug_report.md
- .github/ISSUE_TEMPLATE/config.yml
- .github/ISSUE_TEMPLATE/feature_request.md
- .github/PULL_REQUEST_TEMPLATE.md
- .github/SECURITY.md
- .gitignore
- ATTRIBUTION.md
- CHANGELOG.md
- CONTRIBUTING.md
- LICENSE
- README.md
- SECURITY.md
- SKILL.md
- config.example.yml
- docs/diagrams.md
- docs/faq.md
- docs/graph-view.png (not served here)
- docs/l1-l2-architecture.md
- docs/logseq-vs-obsidian.md
- docs/schema-reference.md
- docs/troubleshooting.md
- examples/before-after.md
- examples/l1-memory-examples.md
- openspec/AGENTS.md
- openspec/changes/archive/2026-10-11-add-plugin-packaging/design.md
- openspec/changes/archive/2026-10-11-add-plugin-packaging/proposal.md
- openspec/changes/archive/2026-10-11-add-plugin-packaging/specs/config.md
- openspec/changes/archive/2026-10-11-add-plugin-packaging/specs/plugin.md
- openspec/changes/archive/2026-10-11-add-plugin-packaging/specs/setup.md
- openspec/changes/archive/2026-10-11-add-plugin-packaging/tasks.md
- openspec/changes/remove-shell-scripts/design.md
- openspec/changes/remove-shell-scripts/proposal.md
- openspec/changes/remove-shell-scripts/specs/config.md
- openspec/changes/remove-shell-scripts/specs/plugin.md
- openspec/changes/remove-shell-scripts/specs/setup.md
- openspec/changes/remove-shell-scripts/tasks.md
- openspec/project.md
- openspec/specs/config.md
- openspec/specs/ingest.md
- openspec/specs/l1-l2-routing.md
- openspec/specs/lint.md
- openspec/specs/plugin.md
- openspec/specs/prune.md
- openspec/specs/query.md
- openspec/specs/schema.md
- openspec/specs/setup.md
- templates/logseq/Access-Log.md
- templates/logseq/Dashboard.md
- templates/logseq/Hub.md
- templates/logseq/Schema.md
- templates/obsidian/Access-Log.md
- templates/obsidian/Dashboard.md
- templates/obsidian/Hub.md
- templates/obsidian/Schema.md
- wiki.md
Advantages
- 5-minute setup. Install the plugin, run /llm-wiki setup, and you have a schema, namespaces, and git tracking. No manual design needed. evidence: README.md
- Claude becomes your wiki maintainer. /llm-wiki ingest updates 5-15 pages with cross-references from a single source. evidence: README.md
- L1/L2 architecture. Auto-loaded rules in memory (L1) + deep knowledge in the wiki (L2). No other tool has this. evidence: README.md
- Built-in quality checks. /llm-wiki lint finds orphan pages, stale content, broken refs, and credential leaks. evidence: README.md
- Logseq + Obsidian. Use whichever you already have. No tool switch required. evidence: README.md
Limitations
- The schema feels overengineered at first. With 10 pages, defining 5 page types and 8 lint rules seems like overkill. Past 50 pages, you will be grateful for the consistency. Define the schema early -- it is much harder to retrofit one later. evidence: README.md
- Two systems means you need a clear boundary. Having both L1 and L2 means you could accidentally put the same information in both places. The lint rule for L1/L2 duplicates exists precisely for this reason. evidence: README.md
- Parallel agents can conflict. If you have multiple Claude sessions writing to wiki files simultaneously, concurrent edits can cause conflicts. Treat wiki files as a shared resource. evidence: README.md
- Start with fewer hub pages. Let them emerge organically from ingest operations rather than creating empty hubs upfront. evidence: README.md
Security
Risk level: No risk found
This brain runs
Agent instructions that run or fetch something (18)
SKILL.md:Run /llm-wiki setup to create one." If its `wiki_path` names a different directory than the wiki root above, warn once, naming both paths, and continue with the wiki root above.SKILL.md:Meant as a periodic run (default cadence N = 6 months) — wire it via your scheduler;SKILL.md:READ-ONLY and LOCAL: check existence, read files, search contents, read dependency manifests, run commands only with `--version` / `--help`.SKILL.md:Evidence basis per claim: `executed` (read-only command), `source` (read the implementing code, not run), or `file` (existence/content).SKILL.md:Skip -> file untouched, stays due for the next runSKILL.md:Timestamp the lint runSKILL.md:Last prune run (newest archived:: date) + a recommendation when the cold-page count is highSKILL.md:Comparison to last status run (if Dashboard page exists)SKILL.md:git: if the user wants git init or the root is a repository, check `git --version`.SKILL.md:Run `date +%Y-%m-%d` once.SKILL.md:Git init, only if the user agreed and the root has no `.git`: `git -C "<root>" init`.SKILL.md:Commit, only if the root is a git repository and this run created at least one file.SKILL.md:Run lint on imported pagesSKILL.md:decision:: run benchmark B1 first, then delete (2026-09-12)SKILL.md:- **Next step:** run B1, otherwise default A (check volumes, delete)SKILL.md:status: open · ticket: OPS-195 · decision: run benchmark B1 first, then delete (2026-09-12)SKILL.md:**Next step:** run B1, otherwise default A (check volumes, delete)openspec/AGENTS.md:git is optional.
Attribution and licence
- Created by
- Mehmet Goekce
- Declared authors
- Mehmet Goekce (declared in .claude-plugin/plugin.json)
- Publisher
- Mehmet Gökçe (Community)
- Source
- MehmetGoekce/llm-wiki · commit 5fa5ee7
- Licence
- MIT License (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Mehmet Goekce.
Install from source
2 of its files are not served here, so there is no ZIP. MehmetGoekce/llm-wiki at 5fa5ee7