Generated banner for llm-wiki
Generated logo for llm-wiki

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.
— the description by Mehmet Goekce

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).

Folders
FolderRoleFiles
.githubagent-config5
docsdocs7
examplesexamples2
templatestemplates8
.claude-pluginfolder3
openspecfolder23

Requirements

Works with: Claude Code

Set it up

  1. Clone the repository at the commit AutoGineer scanned:

    git clone https://github.com/MehmetGoekce/llm-wiki.git && cd llm-wiki && git checkout 5fa5ee7d49a4346eeb1d92c1de7bf649e7654e91
  2. Point Claude Code at .claude-plugin/icon.png: it does not read that file on its own.

  3. cd llm-wiki && claude

  4. AutoGineer scanned these files at commit 5fa5ee7.

  5. 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
  6. 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
  7. 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| L2

What 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 ingest updates 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 lint finds orphan pages, stale content, broken refs, and credential leaks.

  • Logseq + Obsidian. Use whichever you already have. No tool switch required.

Quick Start

claude plugin marketplace add MehmetGoekce/llm-wiki
claude plugin install llm-wiki@mehmetgoekce

On Claude Code 2.1.275 or later, one line inside a session does the same:

/plugin install llm-wiki --marketplace MehmetGoekce/llm-wiki

Claude 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.md

In 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 finds templates/

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.md

Then 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.

LayerWhatSizeLoadingContains
L1Claude Code Memory~10-20 filesAuto-loaded every sessionRules, gotchas, identity, credentials
L2Wiki (Logseq/Obsidian)~50-200 pagesOn-demand via /llm-wiki queryProjects, 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| L2

The 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

CommandDescription
/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 --l1L1-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 statusMetrics 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:

LogseqObsidian
Propertiesproperty:: value (inline)YAML frontmatter
FormatOutliner (- prefix on every line)Flat markdown
File namesWiki___Tech___Strapi.mdWiki/Tech/Strapi.md
Links[[Wiki/Tech/Strapi]][[Wiki/Tech/Strapi]]
BacklinksAutomatic (graph-native)Via plugin or core feature
Block addressingEvery line is a blockParagraph-level
LicenseAGPL-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 workflow

Every 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 content

Trade-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

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.yml are 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: query may consult it, lint reports rules that are due for a check, and prune --l1 classifies, updates, moves or deletes memory files, each one only after you confirm it. lint never prints the content of a memory file. Without memory_path the 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 ingest makes 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

License

MIT -- see LICENSE for details.

openspec/specs/l1-l2-routing.md

Spec: L1/L2 Routing — Knowledge Layer Decision Logic

Description

When new knowledge is extracted (during ingest, query, or user interaction), the system must decide whether it belongs in L1 (Claude Code memory, auto-loaded every session) or L2 (wiki, queried on demand). This is the core architectural decision that makes the dual-layer cache effective. Wrong routing degrades the system: too much in L1 = slow session starts and context bloat; too little in L1 = repeated mistakes.


Requirements

The Routing Rule
  • REQ-300: The system SHALL evaluate every extracted fact against the routing question: "If the LLM does not know this right now, what happens?"

  • REQ-301: If the consequence is data loss, security incident, or production failure, the fact SHALL be routed to L1.

  • REQ-302: If the consequence is embarrassing output (wrong name, wrong address, incorrect brand voice), the fact SHALL be routed to L1.

  • REQ-303: If the consequence is incorrect but easily correctable (wrong count, outdated detail), the fact SHALL be routed to L2.

  • REQ-304: If the consequence is missing context requiring a follow-up question, the fact SHALL be routed to L2.

L1 Content Categories
  • REQ-310: Operational rules and gotchas (things that prevent mistakes in the moment) SHALL be stored in L1.

  • REQ-311: User identity and preferences (name spelling, address, communication style) SHALL be stored in L1.

  • REQ-312: Credentials and secrets (API tokens, passwords, connection strings) MUST be stored in L1. They MUST NOT be stored in L2 under any circumstances.

  • REQ-313: Tool-specific quirks that apply in every session (e.g., "PM2 reload does not work with npm start") SHALL be stored in L1.

L2 Content Categories
  • REQ-320: Project details and timelines SHALL be stored in L2.

  • REQ-321: Workflow documentation SHALL be stored in L2.

  • REQ-322: Research and learning notes SHALL be stored in L2.

  • REQ-323: Business intelligence and strategy SHALL be stored in L2.

  • REQ-324: Historical decisions and rationale SHALL be stored in L2.

Security Boundary
  • REQ-330: L1 memory directory MUST be git-excluded (typically at ~/.claude/projects/*/memory/ which is not in the repo).

  • REQ-331: L2 wiki MUST be assumed git-tracked. All L2 content is potentially visible in version control history.

  • REQ-332: The system SHALL treat the L1/L2 boundary as a hard security boundary for credentials. There is no "soft" credential storage in L2.

L1 Size Management
  • REQ-340: L1 SHOULD contain 10-20 files (optimal range).

  • REQ-341: If L1 exceeds approximately 30 files, the system SHOULD recommend an audit to move contextual knowledge to L2.

  • REQ-342: Each L1 file SHOULD cover one topic and be concise (a few lines, not pages of detail).

Boundary Evolution
  • REQ-350: Knowledge MAY be promoted from L2 to L1 when the same mistake is repeated across multiple sessions (pattern: operational gotcha discovered the hard way).

  • REQ-351: Knowledge MAY be demoted from L1 to L2 when it becomes historical context rather than an active operational rule (pattern: project completes, credentials rotated).

  • REQ-352: Multiple related L1 files SHOULD be merged when they cover the same system or topic, to keep L1 lean.

  • REQ-353: (Superseded by REQ-370-379.) Access-based staleness does not apply to L1: every L1 file is auto-loaded every session, so "last referenced" carries no signal. L1 staleness is detected by claim class and verification date instead.

  • REQ-354: The /llm-wiki lint command SHOULD flag L2 pages queried in every session as candidates for L1 promotion.

L1 Staleness (Claim Class + Verification Date)

A stale L1 rule does not look cold — it is loaded every session. It shows up as the agent confidently acting on an outdated assumption. Staleness is therefore tied to what kind of claim a rule makes, not to how often it is read.

  • REQ-370: An L1 memory file MAY carry the frontmatter key asserts-current-behavior with value true or false.

  • REQ-371: asserts-current-behavior: true marks a falsifiable claim about the current state of a system — a path, command, flag, version, port, API surface, tool quirk, or external behavior that can change without the rule changing (e.g. "PM2 reload does not work with npm start").

  • REQ-372: asserts-current-behavior: false marks a decision, preference, identity fact, or rationale (e.g. "no AI attribution in commits", "name is spelled with a cedilla"). Such rules SHALL never be reported as stale.

  • REQ-373: An L1 memory file with asserts-current-behavior: true MAY carry the frontmatter key verified with an ISO 8601 date (YYYY-MM-DD): the last date on which the claim was checked against evidence (see specs/prune.md REQ-910-915).

  • REQ-374: A rule is due for verification when asserts-current-behavior is true AND (verified is absent OR verified is older than l1_verify_days, default 90, see specs/config.md REQ-660).

  • REQ-375: An L1 memory file WITHOUT the asserts-current-behavior key is unclassified. Unclassified files SHALL NOT be reported as due; they SHALL only be counted (see specs/lint.md REQ-222) and offered for classification by /llm-wiki prune --l1.

  • REQ-376: The system SHALL read both keys either at the top level of the frontmatter or inside a metadata: block. When writing, it SHALL use the location the file already uses for its other metadata (a metadata: block if present, top level otherwise) and MUST NOT reorder or remove any other frontmatter keys.

  • REQ-377: The L1 index file (e.g. MEMORY.md) SHALL be exempt from classification and verification; it is an index, not a rule. Its lines are auto-loaded too, so they SHALL be maintained together with the rules they point to (see specs/prune.md REQ-926).

  • REQ-378: Detecting due rules is read-only and belongs to /llm-wiki lint (Rule 12). Acting on them — classify, re-verify, demote to L2, delete — belongs to /llm-wiki prune --l1 and requires per-item user confirmation.

  • REQ-379: Warning at the moment a due rule is about to justify an action (planning vs. action gate) is OUT OF SCOPE for this spec. L1 loading is performed by Claude Code, not by llm-wiki; the system cannot enforce a runtime gate and SHALL NOT claim to.

Routing During Ingest
  • REQ-360: During /llm-wiki ingest Phase 1, the system SHALL apply the routing rule (REQ-300-304) to each extracted fact.

  • REQ-361: Facts routed to L1 SHALL NOT be written to wiki pages. The system SHALL instead recommend saving them to the memory directory.

  • REQ-362: Facts routed to L2 SHALL proceed through the normal ingest pipeline (Phases 2-5).

  • REQ-363: If a source contains both L1 and L2 facts, the system SHALL process L2 facts via ingest AND separately recommend L1 facts for memory storage.

  • REQ-364: The system SHOULD present the routing recommendation to the user before writing, especially for ambiguous cases (severity:: important facts that could go either way).


Scenarios

Scenario 1: Operational gotcha — routes to L1
GIVEN the user ingests "SSH max 3 calls to VPS, otherwise OOM reboot"
WHEN the system evaluates L1/L2 routing
THEN the consequence of not knowing is "production failure" (OOM reboot)
AND the system SHALL recommend: "This is an L1 candidate (operational gotcha).
    Save to memory, not wiki."
AND the system SHALL NOT create a wiki page for this fact
Scenario 2: Project timeline — routes to L2
GIVEN the user ingests "Book chapter 1 deadline is April 20"
WHEN the system evaluates L1/L2 routing
THEN the consequence of not knowing is "missing context, ask follow-up"
AND the system SHALL route this to L2 (wiki)
AND proceed with normal ingest to create/update a project page
Scenario 3: Credential in source — hard L1 boundary
GIVEN the user ingests text containing "Strapi API token: abc123xyz789..."
WHEN the system evaluates L1/L2 routing
THEN the system SHALL identify this as a credential (REQ-312)
AND the system MUST route to L1
AND the system MUST NOT write the token to any wiki page
AND the system SHALL recommend: "Credential detected. Save to L1 memory only.
    Wiki is git-tracked."
Scenario 4: Mixed source — L1 and L2 facts
GIVEN the user ingests a deployment runbook containing:
    - "Always stop ClamAV before deploy" (operational gotcha)
    - "Deploy script is at scripts/deploy-vps.sh" (project context)
    - "VPS IP: 84.234.21.71" (infrastructure detail)
    - "API token: Bearer xyz..." (credential)
WHEN the system evaluates L1/L2 routing
THEN "Stop ClamAV before deploy" SHALL be recommended for L1 (prevents OOM)
AND "API token" MUST be recommended for L1 (credential, hard boundary)
AND "Deploy script path" SHALL be routed to L2 (project context)
AND "VPS IP" MAY go to either L1 or L2 (borderline: wrong IP = failed deploy,
    but easily correctable)
AND the system SHALL process L2 facts via ingest
AND separately list L1 recommendations for user action
Scenario 5: User identity — routes to L1
GIVEN the user says "My name is spelled Goekce with a cedille: Goekce"
WHEN the system evaluates L1/L2 routing
THEN the consequence of not knowing is "embarrassing output" (misspelled name)
AND the system SHALL recommend L1 storage
AND the system SHALL NOT create a wiki page for name spelling
GIVEN the L1 memory directory contains 35 files
WHEN the user runs /llm-wiki lint or /llm-wiki status
THEN the system SHALL warn: "L1 has 35 files (recommended: 10-20, audit at 30+).
    Review for candidates to demote to L2."
AND the system SHOULD point to `/llm-wiki prune --l1` for classification and verification
Scenario 7: L2 page frequently queried — promotion candidate
GIVEN the wiki page Wiki/Tech/Deployment is queried in 8 of the last 10 sessions
WHEN the user runs /llm-wiki lint
THEN the system SHALL flag the page as an L1 promotion candidate (info)
AND suggest: "Wiki/Tech/Deployment is queried almost every session.
    Consider promoting key rules to L1 memory."
Scenario 7b: Decision rule never goes stale
GIVEN L1 file feedback_no_ai_attribution.md has asserts-current-behavior: false
AND the file was last modified 400 days ago
WHEN the user runs /llm-wiki lint
THEN the system SHALL NOT report the file as due for verification
Scenario 7c: Behavior claim due for verification
GIVEN L1 file feedback_pm2_reload.md has asserts-current-behavior: true
AND verified: 2026-03-01
AND l1_verify_days is 90 and today is 2026-06-15 (106 days later)
WHEN the user runs /llm-wiki lint
THEN the system SHALL report the file as "L1 verification due" (warning)
AND suggest: "Run /llm-wiki prune --l1 to check this claim against evidence."
Scenario 7d: Metadata block is respected
GIVEN an L1 file whose frontmatter contains `metadata:` with `type: feedback`
WHEN /llm-wiki prune --l1 classifies it as asserts-current-behavior: true
THEN the key SHALL be written inside the `metadata:` block
AND name, description, and every other existing key SHALL remain unchanged and in order
Scenario 8: Ambiguous routing — user decision needed
GIVEN the user ingests "Strapi port must be 1338 everywhere"
WHEN the system evaluates L1/L2 routing
THEN the consequence could be "failed deploy" (L1) or "easily fixable config" (L2)
AND the system SHALL present both options to the user:
    "L1 (auto-loaded): Prevents port mismatch every session.
     L2 (wiki): Documented but only loaded when querying Strapi."
AND the system SHALL wait for user confirmation before routing

Acceptance Criteria

  • [ ] Every extracted fact is evaluated against the routing rule before storage

  • [ ] Credentials NEVER reach L2 wiki pages (hard security boundary)

  • [ ] L1 candidates are recommended to the user, not silently written to wiki

  • [ ] Mixed sources produce both L2 ingest AND L1 recommendations

  • [ ] L1 size warnings trigger at ~30 files

  • [ ] Ambiguous cases are presented to user for decision

  • [ ] Works with both Logseq and Obsidian L2 backends

  • [ ] Boundary evolution (promote/demote) is suggested during lint

  • [ ] L1 staleness uses claim class + verification date, never access frequency

  • [ ] Rules with asserts-current-behavior: false are never reported as stale

  • [ ] Unclassified L1 files are counted, not flagged as due

  • [ ] Frontmatter writes preserve all other keys and their order

  • [ ] No runtime planning/action gate is claimed (REQ-379)


Dependencies

  • llm-wiki.yml must specify memory_path for L1 location

  • specs/ingest.md Phase 1 calls this routing logic

  • specs/lint.md Rules 6 (credential leak) and 9 (L1/L2 duplicates) enforce boundaries

  • specs/lint.md Rule 12 detects due L1 rules; specs/prune.md --l1 acts on them

  • specs/config.md REQ-660 defines l1_verify_days

58 files · 2 not served here

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 run
  • SKILL.md: Timestamp the lint run
  • SKILL.md: Last prune run (newest archived:: date) + a recommendation when the cold-page count is high
  • SKILL.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 pages
  • SKILL.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
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