> ## Documentation Index
> Fetch the complete documentation index at: https://vietbui.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Onboarding: Run llm-wiki as an Agent-First Harness

> This guide is for someone adopting this repo as their own agent-first knowledge harness —

# Onboarding: Run llm-wiki as an Agent-First Harness

This guide is for someone adopting this repo as their own **agent-first knowledge harness** —
a system where an AI coding agent does the reading, writing, linking, and quality-checking, and
you stay in the loop as the curator and decision-maker.

It is a tutorial, not a reference. Follow it top to bottom once. For deep operational detail
afterward, see [`GUIDE.md`](GUIDE.md) (skills, MCP tools, scenario playbooks) and
[`README.md`](README.md) (architecture and install detail).

***

## What "agent-first, human-second" means here

Most documentation is written for humans, and an AI agent reads it as a side effect. This repo
inverts the priority: **the primary reader is the agent**, and the human-readable view is a
projection of the same content.

That inversion is cheaper than it sounds, because of one finding the wiki itself has on file
(see [Software Documentation](/concepts/software-documentation)):

> Practices that make docs LLM-friendly are the same practices that make docs human-friendly.

So you do not maintain two things. You maintain one corpus that is:

* **Self-contained per page** — an agent retrieves a single page out of context and it still
  makes sense. Humans benefit identically.
* **Consistently named** — stable terminology so retrieval matches and humans don't get
  whiplash from synonyms.
* **Semantically structured** — heading hierarchy and `[[wikilinks]]` encode relationships the
  agent (and a reader) can traverse.

The division of labor:

| You (human)                                       | The agent                                  |
| ------------------------------------------------- | ------------------------------------------ |
| Curate sources (drop files into `raw/` / `pdfs/`) | Read sources fully                         |
| Ask questions, make decisions                     | Write summary / concept / entity pages     |
| Approve direction, catch bad premises             | Maintain cross-links, `index.md`, `log.md` |
| Review periodically                               | Catch contradictions, log its own mistakes |

The agent **owns the wiki layer**. You **own the curation and the calls**.

***

## The harness, in one picture

This repo is not just a folder of markdown. It is a harness with four moving parts that make the
agent reliable across sessions:

1. **Rules** — `CLAUDE.md` + `@`-imported rule files + `mistakes/global-prevention-rules.md`.
   Loaded every session. They encode model-tier routing, epistemic discipline ("default stance:
   uncertain"), and citation rules. This is the agent's standing operating procedure.
2. **Skills** — invokable procedures (`wiki-context`, `pdf-ingest`, `capture-mistake`, `judge`,
   `council`, …). Deterministic triggers decide when each fires. See [Agent Skills](/concepts/agent-skills).
3. **Hooks** — a post-commit hook re-indexes the knowledge graph automatically after every
   wiki commit. The human never re-runs indexing by hand.
4. **Retrieval (RAG)** — three tools over the same corpus: in-session search (`wiki-context` via
   qmd), a standalone terminal Q\&A TUI (`wiki-chat`), and an MCP server (`wiki-mcp`) for other
   agents. See [Local Wiki RAG: LightRAG Graph Stack](/syntheses/local-rag-wiki).

Parts 1 and 4 are two ends of a deliberate spectrum, not a redundancy: Rules are **pushed** into
every session (cheap per-use, paid whether or not you need them that session); Retrieval is
**pulled** on demand (zero cost when idle, only as reliable as the agent choosing to search).
Neither pole alone is right — pure push doesn't scale past a handful of facts, pure pull risks
high-stakes knowledge never getting fetched. See [Tiered Knowledge Delivery (Push / Hook / Pull)](/concepts/tiered-knowledge-delivery) for the
three-tier model (push / hook / pull) this repo actually runs, and why "agent-first" here means
*pre-synthesized structure the agent doesn't have to search for*, not just "written for agents
to read."

The compounding effect: every source you ingest enriches existing pages, surfaces
contradictions, and adds cross-links — so the agent's answers get better over time instead of
staying flat.

***

## 15-minute quickstart

> Prerequisites and full install detail live in [`README.md`](README.md#setup). This is the
> condensed path to a working loop.

### 1. Clone and install

Prerequisites (install these yourself first — `install.sh` does **not** install them):

| Tool                                    | Why                                                                       | Install                                                                            |
| --------------------------------------- | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| [qmd](https://github.com/antiloger/qmd) | Hybrid search; called by the `post-commit` hook                           | `cargo install qmd` or [binary release](https://github.com/antiloger/qmd/releases) |
| [Node.js](https://nodejs.org)           | Runs the `docs-site/` generator + `pre-push` hook                         | `nvm install --lts` or distro package                                              |
| [zsh](https://www.zsh.org)              | The shipped `post-commit` and `pre-push` hooks have `#!/bin/zsh` shebangs | `sudo apt install zsh` (or rewrite the shebangs to `bash`)                         |
| [ollama](https://ollama.com)            | Local LLM for `wiki-index` / `wiki-chat`                                  | Download from ollama.com                                                           |

Then:

```bash theme={null}
git clone git@github.com:vietbui1999ru/llm-wiki.git ~/repos/llm-wiki
cd ~/repos/llm-wiki
bash claude-setup/scripts/install.sh
```

`install.sh` handles the rest: `uv` (if missing), copies `wiki-index` / `wiki-chat` / `wiki-mcp`
to `~/.local/bin`, pulls `nomic-embed-text` and `qwen2.5:3b` via ollama, installs the
`post-commit` and `pre-push` git hooks. Ensure `~/.local/bin` is on `$PATH`:

```bash theme={null}
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
```

### 2. Point Claude Code at the harness config

```bash theme={null}
bash claude-setup/scripts/install-claude-symlink.sh
```

Symlinks `~/.claude` → `~/repos/llm-wiki/claude-setup`. If `~/.claude` is an existing real
directory, the script moves it to `~/.claude.bak-<timestamp>` first. Re-running is a no-op.
If `~/.claude` is already a symlink to a different path, the script refuses and tells you to
remove it.

This is what makes a session **agent-first**: the rules, skills, and prevention log load
automatically.

### 3. Run your first ingest

```bash theme={null}
cp ~/Downloads/some-article.md ~/repos/llm-wiki/raw/
```

In Claude Code:

```
ingest some-article.md
```

The agent asks a few comprehension questions (to confirm *you* understood the source, not just
it), then writes the pages, updates `index.md` and `log.md`, and commits. The post-commit hook
indexes the new pages in the background. Skip the questions with `"just ingest it"`.

### 4. Query what you just built

```
search the wiki for <topic from the article>
```

The `wiki-context` skill searches, loads the relevant pages, and the agent answers with
`[[page]]` citations. That round trip — curate → ingest → query — is the entire system.

***

## The daily loop

Once set up, day-to-day work is one repeating cycle:

```
   you curate a source        →   raw/ or pdfs/
        │
   "ingest <file>"            →   agent reads, writes pages, links, commits
        │
   post-commit hook           →   qmd + graph index update (automatic)
        │
   later sessions             →   "search the wiki for X" pulls it back, cited
```

Two habits keep it healthy:

* **`lint the wiki`** periodically — the agent scans for orphan pages, stale claims, and missing
  concepts, and suggests sources to ingest next.
* **Let it log its own mistakes** — when the agent self-corrects, the `capture-mistake` skill
  files the error so the same one doesn't recur. Distilled rules live in
  `mistakes/global-prevention-rules.md` and load every session.

***

## What makes the agent trustworthy

The harness encodes a few rules worth understanding before you rely on its output (full set in
[`README.md`](README.md#authoring-rules-for-the-llm) and `mistakes/global-prevention-rules.md`):

* **Default stance: uncertain.** Claims are provisional unless backed by a cited wiki page or
  verified current docs. Unsourced claims are prefixed `(training data — verify)`.
* **Numbers need provenance.** Self-reported README figures are not benchmarks; unverified
  numbers are marked `(claimed, unverified)`.
* **Model-tier routing.** The agent classifies task complexity (Haiku / Sonnet / Opus) before
  acting and sets the model explicitly when spawning sub-agents. See [Model Tier Routing](/concepts/model-tier-routing).

These are not decoration — they are why an agent-maintained knowledge base doesn't quietly rot
into confident nonsense.

***

## Make it yours

### Swap the domain

The taxonomy (`summaries` / `entities` / `concepts` / `comparisons` / `syntheses` / `systems` /
`patterns`) is domain-agnostic. To repurpose:

1. Fork, then clear `raw/`, `wiki/`, `index.md`, `log.md`.
2. Keep `CLAUDE.md`, `claude-setup/`, and `mistakes/global-prevention-rules.md`.
3. Edit `CLAUDE.md` to describe your domain.
4. Start ingesting. The harness behavior carries over unchanged.

### Add the lean workflow to an existing project

```bash theme={null}
~/repos/llm-wiki/templates/install-agents-md.sh /path/to/project
```

This drops a cross-provider `AGENTS.md` so the same agent rules apply in your other repos.

### Tune the rules

Rule files under `claude-setup/rules/` are `@`-imported into `CLAUDE.md`. Edit them to change
model routing, communication style, or skill triggers. Changes take effect next session.

***

## Where to go next

| You want to…                                             | Go to                                          |
| -------------------------------------------------------- | ---------------------------------------------- |
| Look up a specific skill, MCP tool, or scenario playbook | [`GUIDE.md`](GUIDE.md)                         |
| Understand the system architecture (diagrams)            | [`docs/architecture.md`](docs/architecture.md) |
| See the day-to-day and multi-machine workflows           | [`docs/workflows.md`](docs/workflows.md)       |
| Read the knowledge itself                                | the published docs site, or `wiki/` directly   |
| Install detail, prerequisites, RAG cost warnings         | [`README.md`](README.md)                       |

***

*Adopting this means accepting one trade: you give the agent ownership of a layer, and in return
you stop forgetting 90% of what you read. Curate well, review often, and let it compound.*

<iframe
  srcDoc="<!doctype html><html><head><meta charset=&#x22;utf-8&#x22;><style>
html,body{margin:0;height:100%;background:#0f1117;overflow:hidden;font-family:ui-sans-serif,system-ui,-apple-system,sans-serif}
#g{width:100%;height:100%}
#hd{position:absolute;top:0;left:0;right:30px;height:22px;display:flex;align-items:center;gap:6px;padding:0 10px;color:#aeb3c2;font-size:10px;letter-spacing:.08em;text-transform:uppercase;z-index:6;cursor:move;user-select:none;touch-action:none;background:linear-gradient(#0f1117cc,#0f111700)}
#gear{position:absolute;top:5px;right:7px;z-index:7;cursor:pointer;color:#aeb3c2;background:#1b1e27;border:1px solid #2b2f3a;border-radius:6px;width:22px;height:22px;display:flex;align-items:center;justify-content:center;font-size:12px;user-select:none}
#panel{position:absolute;top:31px;right:7px;z-index:7;background:rgba(22,25,34,.96);border:1px solid #2b2f3a;border-radius:8px;padding:6px 9px 9px;display:none;width:150px;color:#c9cdd8;font-size:10px}
#panel.open{display:block}
#panel label{display:flex;justify-content:space-between;margin:7px 0 1px;color:#9aa0b0}
#panel input[type=range]{width:100%;margin:0}
#panel .row{display:flex;align-items:center;gap:6px;margin-top:8px;color:#c9cdd8}
</style><script src=&#x22;https://cdn.jsdelivr.net/npm/force-graph@1.51.4/dist/force-graph.min.js&#x22; integrity=&#x22;sha384-Hm6GpQcTNI5VqGgGS7lLxTGtEFcxu/kOVV0B7ozIZRu9blWVvigv5httJQZ2qZmY&#x22; crossorigin=&#x22;anonymous&#x22;></script></head>
<body><div id=&#x22;hd&#x22;>Graph</div><div id=&#x22;gear&#x22;>⚙</div>
<div id=&#x22;panel&#x22;>
<label>Node size<span id=&#x22;vns&#x22;></span></label><input id=&#x22;ns&#x22; type=&#x22;range&#x22; min=&#x22;0.6&#x22; max=&#x22;6&#x22; step=&#x22;0.2&#x22;>
<label>Link width<span id=&#x22;vlw&#x22;></span></label><input id=&#x22;lw&#x22; type=&#x22;range&#x22; min=&#x22;0&#x22; max=&#x22;3&#x22; step=&#x22;0.1&#x22;>
<label>Label size<span id=&#x22;vts&#x22;></span></label><input id=&#x22;ts&#x22; type=&#x22;range&#x22; min=&#x22;0&#x22; max=&#x22;8&#x22; step=&#x22;0.5&#x22;>
<label>Label opacity<span id=&#x22;vto&#x22;></span></label><input id=&#x22;to&#x22; type=&#x22;range&#x22; min=&#x22;0&#x22; max=&#x22;1&#x22; step=&#x22;0.05&#x22;>
<div id=&#x22;depthRow&#x22;><label>Depth<span id=&#x22;vd&#x22;></span></label><input id=&#x22;dp&#x22; type=&#x22;range&#x22; min=&#x22;1&#x22; max=&#x22;5&#x22; step=&#x22;1&#x22;></div>
<div class=&#x22;row&#x22;><input id=&#x22;ar&#x22; type=&#x22;checkbox&#x22;><span>Directional arrows</span></div>
</div>
<div id=&#x22;g&#x22;></div>
<script>
const NODES=[{&#x22;id&#x22;:&#x22;guides/onboarding&#x22;,&#x22;label&#x22;:&#x22;Onboarding: Run llm-wiki as an Agent-First Harness&#x22;,&#x22;group&#x22;:&#x22;guides&#x22;,&#x22;val&#x22;:3.23606797749979},{&#x22;id&#x22;:&#x22;concepts/agent-skills&#x22;,&#x22;label&#x22;:&#x22;Agent Skills&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:5.795831523312719},{&#x22;id&#x22;:&#x22;concepts/tiered-knowledge-delivery&#x22;,&#x22;label&#x22;:&#x22;Tiered Knowledge Delivery (Push / Hook / Pull)&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:3.8284271247461903},{&#x22;id&#x22;:&#x22;syntheses/local-rag-wiki&#x22;,&#x22;label&#x22;:&#x22;Local Wiki RAG: LightRAG Graph Stack&#x22;,&#x22;group&#x22;:&#x22;syntheses&#x22;,&#x22;val&#x22;:3.6457513110645907},{&#x22;id&#x22;:&#x22;concepts/model-tier-routing&#x22;,&#x22;label&#x22;:&#x22;Model Tier Routing&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:3.6457513110645907},{&#x22;id&#x22;:&#x22;concepts/software-documentation&#x22;,&#x22;label&#x22;:&#x22;Software Documentation&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:3.23606797749979},{&#x22;id&#x22;:&#x22;concepts/agent-harness&#x22;,&#x22;label&#x22;:&#x22;Agent Harness&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:7.48074069840786},{&#x22;id&#x22;:&#x22;concepts/context-compression&#x22;,&#x22;label&#x22;:&#x22;Context Compression Strategies&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:6.0990195135927845},{&#x22;id&#x22;:&#x22;syntheses/lean-agentic-workflow&#x22;,&#x22;label&#x22;:&#x22;Lean Agentic Coding Workflow&#x22;,&#x22;group&#x22;:&#x22;syntheses&#x22;,&#x22;val&#x22;:5.795831523312719},{&#x22;id&#x22;:&#x22;concepts/agent-self-correction&#x22;,&#x22;label&#x22;:&#x22;Agent Self-Correction&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:5.358898943540674},{&#x22;id&#x22;:&#x22;entities/pi-agent&#x22;,&#x22;label&#x22;:&#x22;Pi Agent (pi-mono)&#x22;,&#x22;group&#x22;:&#x22;entities&#x22;,&#x22;val&#x22;:5.123105625617661},{&#x22;id&#x22;:&#x22;concepts/agent-context-instructions&#x22;,&#x22;label&#x22;:&#x22;Agent Context Instructions&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:4.872983346207417},{&#x22;id&#x22;:&#x22;concepts/multi-vendor-adversarial-review&#x22;,&#x22;label&#x22;:&#x22;Multi-Vendor Adversarial Review&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:4.872983346207417},{&#x22;id&#x22;:&#x22;concepts/agent-subagents&#x22;,&#x22;label&#x22;:&#x22;Agent Subagents&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:4.741657386773941},{&#x22;id&#x22;:&#x22;syntheses/agent-primitive-selection&#x22;,&#x22;label&#x22;:&#x22;Agent Primitive Selection&#x22;,&#x22;group&#x22;:&#x22;syntheses&#x22;,&#x22;val&#x22;:4.464101615137754},{&#x22;id&#x22;:&#x22;systems/ai-ml&#x22;,&#x22;label&#x22;:&#x22;AI and ML Engineering&#x22;,&#x22;group&#x22;:&#x22;systems&#x22;,&#x22;val&#x22;:4.3166247903554},{&#x22;id&#x22;:&#x22;concepts/contextual-retrieval&#x22;,&#x22;label&#x22;:&#x22;Contextual Retrieval&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:4.16227766016838},{&#x22;id&#x22;:&#x22;concepts/agent-teams&#x22;,&#x22;label&#x22;:&#x22;Agent Teams&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:4.16227766016838},{&#x22;id&#x22;:&#x22;concepts/indirect-prompt-injection&#x22;,&#x22;label&#x22;:&#x22;Indirect Prompt Injection&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:4.16227766016838},{&#x22;id&#x22;:&#x22;comparisons/cc-to-cross-platform-migration&#x22;,&#x22;label&#x22;:&#x22;Claude Code → Cross-Platform Migration Matrix&#x22;,&#x22;group&#x22;:&#x22;comparisons&#x22;,&#x22;val&#x22;:4.16227766016838},{&#x22;id&#x22;:&#x22;concepts/nurture-first-development&#x22;,&#x22;label&#x22;:&#x22;Nurture-First Development (NFD)&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:4},{&#x22;id&#x22;:&#x22;concepts/shared-task-queue&#x22;,&#x22;label&#x22;:&#x22;Shared Task Queue (Cross-Worktree)&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:4},{&#x22;id&#x22;:&#x22;entities/ai-coding-agents&#x22;,&#x22;label&#x22;:&#x22;AI Coding Agents&#x22;,&#x22;group&#x22;:&#x22;entities&#x22;,&#x22;val&#x22;:3.6457513110645907},{&#x22;id&#x22;:&#x22;entities/qmd&#x22;,&#x22;label&#x22;:&#x22;qmd&#x22;,&#x22;group&#x22;:&#x22;entities&#x22;,&#x22;val&#x22;:3.6457513110645907},{&#x22;id&#x22;:&#x22;concepts/instinct-clustering&#x22;,&#x22;label&#x22;:&#x22;Instinct Clustering (Homunculus Pattern)&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:3.6457513110645907},{&#x22;id&#x22;:&#x22;concepts/knowledge-crystallization-cycle&#x22;,&#x22;label&#x22;:&#x22;Knowledge Crystallization Cycle (KCC)&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:3.449489742783178},{&#x22;id&#x22;:&#x22;patterns/design-patterns-behavioral&#x22;,&#x22;label&#x22;:&#x22;Behavioral Design Patterns&#x22;,&#x22;group&#x22;:&#x22;patterns&#x22;,&#x22;val&#x22;:3.449489742783178},{&#x22;id&#x22;:&#x22;entities/ponytail&#x22;,&#x22;label&#x22;:&#x22;Ponytail&#x22;,&#x22;group&#x22;:&#x22;entities&#x22;,&#x22;val&#x22;:3.449489742783178},{&#x22;id&#x22;:&#x22;concepts/compounding-knowledge-base&#x22;,&#x22;label&#x22;:&#x22;Compounding Knowledge Base&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:3.449489742783178},{&#x22;id&#x22;:&#x22;concepts/compound-engineering&#x22;,&#x22;label&#x22;:&#x22;Compound Engineering&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:3.23606797749979},{&#x22;id&#x22;:&#x22;syntheses/agent-diff-viewer&#x22;,&#x22;label&#x22;:&#x22;Agent Diff Viewer — Real-Time Code Review Tool&#x22;,&#x22;group&#x22;:&#x22;syntheses&#x22;,&#x22;val&#x22;:3.23606797749979},{&#x22;id&#x22;:&#x22;syntheses/builderio-control-plane-integration&#x22;,&#x22;label&#x22;:&#x22;Builder.io Patterns for Commandr + DiffViewer&#x22;,&#x22;group&#x22;:&#x22;syntheses&#x22;,&#x22;val&#x22;:3.23606797749979},{&#x22;id&#x22;:&#x22;entities/codegraphcontext&#x22;,&#x22;label&#x22;:&#x22;CodeGraphContext&#x22;,&#x22;group&#x22;:&#x22;entities&#x22;,&#x22;val&#x22;:3.23606797749979},{&#x22;id&#x22;:&#x22;concepts/domain-glossary&#x22;,&#x22;label&#x22;:&#x22;Domain Glossary (CONTEXT.md)&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:3},{&#x22;id&#x22;:&#x22;concepts/claude-code-plugins&#x22;,&#x22;label&#x22;:&#x22;Claude Code Plugins&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:3},{&#x22;id&#x22;:&#x22;entities/codex&#x22;,&#x22;label&#x22;:&#x22;OpenAI Codex&#x22;,&#x22;group&#x22;:&#x22;entities&#x22;,&#x22;val&#x22;:3},{&#x22;id&#x22;:&#x22;entities/spotme&#x22;,&#x22;label&#x22;:&#x22;SpotMe&#x22;,&#x22;group&#x22;:&#x22;entities&#x22;,&#x22;val&#x22;:3},{&#x22;id&#x22;:&#x22;concepts/wikilink-graph-extraction&#x22;,&#x22;label&#x22;:&#x22;Wikilink Graph Extraction: Reducing LightRAG Indexing Cost&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:3},{&#x22;id&#x22;:&#x22;concepts/bm25&#x22;,&#x22;label&#x22;:&#x22;BM25&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:3},{&#x22;id&#x22;:&#x22;concepts/model-task-routing&#x22;,&#x22;label&#x22;:&#x22;Model-Task Routing (OpenCode Go)&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:3},{&#x22;id&#x22;:&#x22;entities/gemini-cli&#x22;,&#x22;label&#x22;:&#x22;Gemini CLI&#x22;,&#x22;group&#x22;:&#x22;entities&#x22;,&#x22;val&#x22;:2.732050807568877},{&#x22;id&#x22;:&#x22;concepts/reranking&#x22;,&#x22;label&#x22;:&#x22;Reranking&#x22;,&#x22;group&#x22;:&#x22;concepts&#x22;,&#x22;val&#x22;:2.732050807568877},{&#x22;id&#x22;:&#x22;guides/architecture&#x22;,&#x22;label&#x22;:&#x22;llm-wiki Architecture&#x22;,&#x22;group&#x22;:&#x22;guides&#x22;,&#x22;val&#x22;:2},{&#x22;id&#x22;:&#x22;entities/opencode&#x22;,&#x22;label&#x22;:&#x22;OpenCode&#x22;,&#x22;group&#x22;:&#x22;entities&#x22;,&#x22;val&#x22;:5.358898943540674}],LINKS=[{&#x22;source&#x22;:&#x22;concepts/agent-context-instructions&#x22;,&#x22;target&#x22;:&#x22;entities/ai-coding-agents&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-harness&#x22;,&#x22;target&#x22;:&#x22;concepts/context-compression&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-harness&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-context-instructions&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-harness&#x22;,&#x22;target&#x22;:&#x22;syntheses/agent-diff-viewer&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-self-correction&#x22;,&#x22;target&#x22;:&#x22;concepts/instinct-clustering&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-self-correction&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-harness&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-self-correction&#x22;,&#x22;target&#x22;:&#x22;concepts/model-tier-routing&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-self-correction&#x22;,&#x22;target&#x22;:&#x22;syntheses/agent-primitive-selection&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-self-correction&#x22;,&#x22;target&#x22;:&#x22;concepts/context-compression&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-self-correction&#x22;,&#x22;target&#x22;:&#x22;syntheses/lean-agentic-workflow&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-self-correction&#x22;,&#x22;target&#x22;:&#x22;concepts/multi-vendor-adversarial-review&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-self-correction&#x22;,&#x22;target&#x22;:&#x22;entities/opencode&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-skills&#x22;,&#x22;target&#x22;:&#x22;concepts/compound-engineering&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-skills&#x22;,&#x22;target&#x22;:&#x22;concepts/multi-vendor-adversarial-review&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-skills&#x22;,&#x22;target&#x22;:&#x22;concepts/model-tier-routing&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-skills&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-harness&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-skills&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-subagents&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-skills&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-teams&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-skills&#x22;,&#x22;target&#x22;:&#x22;concepts/indirect-prompt-injection&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-skills&#x22;,&#x22;target&#x22;:&#x22;concepts/claude-code-plugins&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-subagents&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-teams&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-subagents&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-subagents&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-harness&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-subagents&#x22;,&#x22;target&#x22;:&#x22;concepts/context-compression&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-subagents&#x22;,&#x22;target&#x22;:&#x22;syntheses/agent-primitive-selection&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-teams&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-subagents&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-teams&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-harness&#x22;},{&#x22;source&#x22;:&#x22;concepts/agent-teams&#x22;,&#x22;target&#x22;:&#x22;concepts/shared-task-queue&#x22;},{&#x22;source&#x22;:&#x22;concepts/bm25&#x22;,&#x22;target&#x22;:&#x22;entities/qmd&#x22;},{&#x22;source&#x22;:&#x22;concepts/bm25&#x22;,&#x22;target&#x22;:&#x22;concepts/contextual-retrieval&#x22;},{&#x22;source&#x22;:&#x22;concepts/claude-code-plugins&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;concepts/claude-code-plugins&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-subagents&#x22;},{&#x22;source&#x22;:&#x22;concepts/compound-engineering&#x22;,&#x22;target&#x22;:&#x22;concepts/compounding-knowledge-base&#x22;},{&#x22;source&#x22;:&#x22;concepts/compound-engineering&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-harness&#x22;},{&#x22;source&#x22;:&#x22;concepts/compound-engineering&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-context-instructions&#x22;},{&#x22;source&#x22;:&#x22;concepts/compounding-knowledge-base&#x22;,&#x22;target&#x22;:&#x22;concepts/compound-engineering&#x22;},{&#x22;source&#x22;:&#x22;concepts/compounding-knowledge-base&#x22;,&#x22;target&#x22;:&#x22;concepts/contextual-retrieval&#x22;},{&#x22;source&#x22;:&#x22;concepts/compounding-knowledge-base&#x22;,&#x22;target&#x22;:&#x22;entities/qmd&#x22;},{&#x22;source&#x22;:&#x22;concepts/context-compression&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-harness&#x22;},{&#x22;source&#x22;:&#x22;concepts/contextual-retrieval&#x22;,&#x22;target&#x22;:&#x22;concepts/bm25&#x22;},{&#x22;source&#x22;:&#x22;concepts/contextual-retrieval&#x22;,&#x22;target&#x22;:&#x22;concepts/reranking&#x22;},{&#x22;source&#x22;:&#x22;concepts/contextual-retrieval&#x22;,&#x22;target&#x22;:&#x22;concepts/compounding-knowledge-base&#x22;},{&#x22;source&#x22;:&#x22;concepts/contextual-retrieval&#x22;,&#x22;target&#x22;:&#x22;entities/qmd&#x22;},{&#x22;source&#x22;:&#x22;concepts/domain-glossary&#x22;,&#x22;target&#x22;:&#x22;concepts/context-compression&#x22;},{&#x22;source&#x22;:&#x22;concepts/domain-glossary&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-context-instructions&#x22;},{&#x22;source&#x22;:&#x22;concepts/indirect-prompt-injection&#x22;,&#x22;target&#x22;:&#x22;entities/ai-coding-agents&#x22;},{&#x22;source&#x22;:&#x22;concepts/indirect-prompt-injection&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-context-instructions&#x22;},{&#x22;source&#x22;:&#x22;concepts/instinct-clustering&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-self-correction&#x22;},{&#x22;source&#x22;:&#x22;concepts/instinct-clustering&#x22;,&#x22;target&#x22;:&#x22;entities/opencode&#x22;},{&#x22;source&#x22;:&#x22;concepts/instinct-clustering&#x22;,&#x22;target&#x22;:&#x22;concepts/context-compression&#x22;},{&#x22;source&#x22;:&#x22;concepts/knowledge-crystallization-cycle&#x22;,&#x22;target&#x22;:&#x22;concepts/nurture-first-development&#x22;},{&#x22;source&#x22;:&#x22;concepts/knowledge-crystallization-cycle&#x22;,&#x22;target&#x22;:&#x22;concepts/compounding-knowledge-base&#x22;},{&#x22;source&#x22;:&#x22;concepts/knowledge-crystallization-cycle&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-self-correction&#x22;},{&#x22;source&#x22;:&#x22;concepts/knowledge-crystallization-cycle&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;concepts/model-task-routing&#x22;,&#x22;target&#x22;:&#x22;concepts/model-tier-routing&#x22;},{&#x22;source&#x22;:&#x22;concepts/model-task-routing&#x22;,&#x22;target&#x22;:&#x22;entities/pi-agent&#x22;},{&#x22;source&#x22;:&#x22;concepts/model-tier-routing&#x22;,&#x22;target&#x22;:&#x22;syntheses/agent-primitive-selection&#x22;},{&#x22;source&#x22;:&#x22;concepts/model-tier-routing&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-subagents&#x22;},{&#x22;source&#x22;:&#x22;concepts/model-tier-routing&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-self-correction&#x22;},{&#x22;source&#x22;:&#x22;concepts/multi-vendor-adversarial-review&#x22;,&#x22;target&#x22;:&#x22;entities/pi-agent&#x22;},{&#x22;source&#x22;:&#x22;concepts/multi-vendor-adversarial-review&#x22;,&#x22;target&#x22;:&#x22;syntheses/agent-primitive-selection&#x22;},{&#x22;source&#x22;:&#x22;concepts/nurture-first-development&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;concepts/nurture-first-development&#x22;,&#x22;target&#x22;:&#x22;concepts/compounding-knowledge-base&#x22;},{&#x22;source&#x22;:&#x22;concepts/nurture-first-development&#x22;,&#x22;target&#x22;:&#x22;concepts/context-compression&#x22;},{&#x22;source&#x22;:&#x22;concepts/reranking&#x22;,&#x22;target&#x22;:&#x22;concepts/contextual-retrieval&#x22;},{&#x22;source&#x22;:&#x22;concepts/reranking&#x22;,&#x22;target&#x22;:&#x22;concepts/bm25&#x22;},{&#x22;source&#x22;:&#x22;concepts/shared-task-queue&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;concepts/software-documentation&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-context-instructions&#x22;},{&#x22;source&#x22;:&#x22;concepts/software-documentation&#x22;,&#x22;target&#x22;:&#x22;entities/ai-coding-agents&#x22;},{&#x22;source&#x22;:&#x22;concepts/software-documentation&#x22;,&#x22;target&#x22;:&#x22;concepts/contextual-retrieval&#x22;},{&#x22;source&#x22;:&#x22;concepts/software-documentation&#x22;,&#x22;target&#x22;:&#x22;concepts/domain-glossary&#x22;},{&#x22;source&#x22;:&#x22;concepts/tiered-knowledge-delivery&#x22;,&#x22;target&#x22;:&#x22;concepts/knowledge-crystallization-cycle&#x22;},{&#x22;source&#x22;:&#x22;concepts/tiered-knowledge-delivery&#x22;,&#x22;target&#x22;:&#x22;concepts/compounding-knowledge-base&#x22;},{&#x22;source&#x22;:&#x22;concepts/tiered-knowledge-delivery&#x22;,&#x22;target&#x22;:&#x22;concepts/context-compression&#x22;},{&#x22;source&#x22;:&#x22;concepts/tiered-knowledge-delivery&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-self-correction&#x22;},{&#x22;source&#x22;:&#x22;concepts/tiered-knowledge-delivery&#x22;,&#x22;target&#x22;:&#x22;concepts/instinct-clustering&#x22;},{&#x22;source&#x22;:&#x22;concepts/tiered-knowledge-delivery&#x22;,&#x22;target&#x22;:&#x22;concepts/nurture-first-development&#x22;},{&#x22;source&#x22;:&#x22;concepts/wikilink-graph-extraction&#x22;,&#x22;target&#x22;:&#x22;syntheses/local-rag-wiki&#x22;},{&#x22;source&#x22;:&#x22;concepts/wikilink-graph-extraction&#x22;,&#x22;target&#x22;:&#x22;concepts/contextual-retrieval&#x22;},{&#x22;source&#x22;:&#x22;concepts/wikilink-graph-extraction&#x22;,&#x22;target&#x22;:&#x22;entities/qmd&#x22;},{&#x22;source&#x22;:&#x22;patterns/design-patterns-behavioral&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;systems/ai-ml&#x22;,&#x22;target&#x22;:&#x22;concepts/contextual-retrieval&#x22;},{&#x22;source&#x22;:&#x22;systems/ai-ml&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-harness&#x22;},{&#x22;source&#x22;:&#x22;systems/ai-ml&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;systems/ai-ml&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-subagents&#x22;},{&#x22;source&#x22;:&#x22;systems/ai-ml&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-teams&#x22;},{&#x22;source&#x22;:&#x22;syntheses/agent-diff-viewer&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-harness&#x22;},{&#x22;source&#x22;:&#x22;syntheses/agent-diff-viewer&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;syntheses/agent-primitive-selection&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;syntheses/agent-primitive-selection&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-subagents&#x22;},{&#x22;source&#x22;:&#x22;syntheses/agent-primitive-selection&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-teams&#x22;},{&#x22;source&#x22;:&#x22;syntheses/agent-primitive-selection&#x22;,&#x22;target&#x22;:&#x22;concepts/multi-vendor-adversarial-review&#x22;},{&#x22;source&#x22;:&#x22;syntheses/agent-primitive-selection&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-harness&#x22;},{&#x22;source&#x22;:&#x22;syntheses/builderio-control-plane-integration&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;syntheses/lean-agentic-workflow&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;syntheses/lean-agentic-workflow&#x22;,&#x22;target&#x22;:&#x22;concepts/multi-vendor-adversarial-review&#x22;},{&#x22;source&#x22;:&#x22;syntheses/lean-agentic-workflow&#x22;,&#x22;target&#x22;:&#x22;entities/opencode&#x22;},{&#x22;source&#x22;:&#x22;syntheses/lean-agentic-workflow&#x22;,&#x22;target&#x22;:&#x22;concepts/context-compression&#x22;},{&#x22;source&#x22;:&#x22;syntheses/lean-agentic-workflow&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-self-correction&#x22;},{&#x22;source&#x22;:&#x22;syntheses/lean-agentic-workflow&#x22;,&#x22;target&#x22;:&#x22;syntheses/agent-primitive-selection&#x22;},{&#x22;source&#x22;:&#x22;syntheses/local-rag-wiki&#x22;,&#x22;target&#x22;:&#x22;concepts/contextual-retrieval&#x22;},{&#x22;source&#x22;:&#x22;syntheses/local-rag-wiki&#x22;,&#x22;target&#x22;:&#x22;concepts/bm25&#x22;},{&#x22;source&#x22;:&#x22;syntheses/local-rag-wiki&#x22;,&#x22;target&#x22;:&#x22;concepts/reranking&#x22;},{&#x22;source&#x22;:&#x22;syntheses/local-rag-wiki&#x22;,&#x22;target&#x22;:&#x22;entities/qmd&#x22;},{&#x22;source&#x22;:&#x22;syntheses/local-rag-wiki&#x22;,&#x22;target&#x22;:&#x22;concepts/wikilink-graph-extraction&#x22;},{&#x22;source&#x22;:&#x22;comparisons/cc-to-cross-platform-migration&#x22;,&#x22;target&#x22;:&#x22;entities/gemini-cli&#x22;},{&#x22;source&#x22;:&#x22;comparisons/cc-to-cross-platform-migration&#x22;,&#x22;target&#x22;:&#x22;entities/opencode&#x22;},{&#x22;source&#x22;:&#x22;comparisons/cc-to-cross-platform-migration&#x22;,&#x22;target&#x22;:&#x22;entities/codex&#x22;},{&#x22;source&#x22;:&#x22;comparisons/cc-to-cross-platform-migration&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-context-instructions&#x22;},{&#x22;source&#x22;:&#x22;comparisons/cc-to-cross-platform-migration&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;comparisons/cc-to-cross-platform-migration&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-subagents&#x22;},{&#x22;source&#x22;:&#x22;entities/ai-coding-agents&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-context-instructions&#x22;},{&#x22;source&#x22;:&#x22;entities/codegraphcontext&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-harness&#x22;},{&#x22;source&#x22;:&#x22;entities/codegraphcontext&#x22;,&#x22;target&#x22;:&#x22;syntheses/local-rag-wiki&#x22;},{&#x22;source&#x22;:&#x22;entities/codex&#x22;,&#x22;target&#x22;:&#x22;comparisons/cc-to-cross-platform-migration&#x22;},{&#x22;source&#x22;:&#x22;entities/codex&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-subagents&#x22;},{&#x22;source&#x22;:&#x22;entities/codex&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;entities/gemini-cli&#x22;,&#x22;target&#x22;:&#x22;comparisons/cc-to-cross-platform-migration&#x22;},{&#x22;source&#x22;:&#x22;entities/gemini-cli&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;entities/opencode&#x22;,&#x22;target&#x22;:&#x22;concepts/instinct-clustering&#x22;},{&#x22;source&#x22;:&#x22;entities/opencode&#x22;,&#x22;target&#x22;:&#x22;concepts/context-compression&#x22;},{&#x22;source&#x22;:&#x22;entities/opencode&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-harness&#x22;},{&#x22;source&#x22;:&#x22;entities/opencode&#x22;,&#x22;target&#x22;:&#x22;entities/ai-coding-agents&#x22;},{&#x22;source&#x22;:&#x22;entities/opencode&#x22;,&#x22;target&#x22;:&#x22;concepts/claude-code-plugins&#x22;},{&#x22;source&#x22;:&#x22;entities/pi-agent&#x22;,&#x22;target&#x22;:&#x22;concepts/model-tier-routing&#x22;},{&#x22;source&#x22;:&#x22;entities/pi-agent&#x22;,&#x22;target&#x22;:&#x22;concepts/multi-vendor-adversarial-review&#x22;},{&#x22;source&#x22;:&#x22;entities/pi-agent&#x22;,&#x22;target&#x22;:&#x22;entities/opencode&#x22;},{&#x22;source&#x22;:&#x22;entities/pi-agent&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-self-correction&#x22;},{&#x22;source&#x22;:&#x22;entities/ponytail&#x22;,&#x22;target&#x22;:&#x22;entities/opencode&#x22;},{&#x22;source&#x22;:&#x22;entities/ponytail&#x22;,&#x22;target&#x22;:&#x22;entities/pi-agent&#x22;},{&#x22;source&#x22;:&#x22;entities/ponytail&#x22;,&#x22;target&#x22;:&#x22;concepts/model-task-routing&#x22;},{&#x22;source&#x22;:&#x22;entities/ponytail&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;entities/spotme&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;entities/spotme&#x22;,&#x22;target&#x22;:&#x22;entities/opencode&#x22;},{&#x22;source&#x22;:&#x22;guides/onboarding&#x22;,&#x22;target&#x22;:&#x22;concepts/software-documentation&#x22;},{&#x22;source&#x22;:&#x22;guides/onboarding&#x22;,&#x22;target&#x22;:&#x22;concepts/agent-skills&#x22;},{&#x22;source&#x22;:&#x22;guides/onboarding&#x22;,&#x22;target&#x22;:&#x22;syntheses/local-rag-wiki&#x22;},{&#x22;source&#x22;:&#x22;guides/onboarding&#x22;,&#x22;target&#x22;:&#x22;concepts/tiered-knowledge-delivery&#x22;},{&#x22;source&#x22;:&#x22;guides/onboarding&#x22;,&#x22;target&#x22;:&#x22;concepts/model-tier-routing&#x22;},{&#x22;source&#x22;:&#x22;guides/architecture&#x22;,&#x22;target&#x22;:&#x22;concepts/tiered-knowledge-delivery&#x22;}],CUR=&#x22;guides/onboarding&#x22;,MAXD=3;
const C={concepts:'#8B7CF6',patterns:'#0D9373',systems:'#E0567C',syntheses:'#E2A03F',comparisons:'#3B82F6',entities:'#14B8A6',guides:'#9CA3AF'};
function lid(x){return (x&&x.id!==undefined)?x.id:x;}
const ADJ=new Map(NODES.map(function(n){return [n.id,new Set()];}));
LINKS.forEach(function(l){var s=lid(l.source),t=lid(l.target);if(ADJ.has(s)&&ADJ.has(t)){ADJ.get(s).add(t);ADJ.get(t).add(s);}});
var opt={ns:1.8,lw:0.6,ts:3.5,to:0.75,dp:2,ar:false};
function visible(){
if(!CUR)return {nodes:NODES,links:LINKS};
var dist=new Map([[CUR,0]]),fr=[CUR];
for(var d=1;d<=opt.dp;d++){var nx=[];fr.forEach(function(u){(ADJ.get(u)||[]).forEach(function(v){if(!dist.has(v)){dist.set(v,d);nx.push(v);}});});fr=nx;}
var keep=new Set(dist.keys());
return {nodes:NODES.filter(function(n){return keep.has(n.id);}),links:LINKS.filter(function(l){return keep.has(lid(l.source))&&keep.has(lid(l.target));})};
}
var el=document.getElementById('g');
var G=ForceGraph()(el).backgroundColor('#0f1117').nodeId('id')
.warmupTicks(24).cooldownTicks(70).autoPauseRedraw(true)
.nodeColor(function(n){return C[n.group]||'#9CA3AF';}).nodeLabel('label').nodeVal(function(n){return n.val;})
.linkColor(function(){return 'rgba(255,255,255,0.12)';})
.nodeRelSize(opt.ns).linkWidth(opt.lw)
.linkDirectionalArrowLength(0).linkDirectionalArrowRelPos(1).linkDirectionalArrowColor(function(){return 'rgba(255,255,255,0.4)';})
.nodeCanvasObjectMode(function(){return 'after';})
.nodeCanvasObject(function(n,ctx,scale){var r=opt.ns*Math.sqrt(n.val||1);
if(n.id===CUR){ctx.beginPath();ctx.arc(n.x,n.y,r+1.6,0,6.283);ctx.strokeStyle='#fff';ctx.lineWidth=1.2/scale;ctx.stroke();}
if(opt.to>0&&opt.ts>0){var t=n.label.length>28?n.label.slice(0,26)+'…':n.label;ctx.globalAlpha=opt.to;ctx.font=((n.id===CUR?opt.ts+1:opt.ts))+'px ui-sans-serif,sans-serif';ctx.fillStyle=(n.id===CUR)?'#ffffff':'#aab0c0';ctx.textAlign='center';ctx.textBaseline='top';ctx.fillText(t,n.x,n.y+r+1.5);ctx.globalAlpha=1;}})
.onNodeClick(function(n){if(window.top){window.top.location.href='/'+n.id;}});
G.graphData(visible());G.d3VelocityDecay(0.4);
function fit(){G.zoomToFit(400,20);}
setTimeout(fit,350);setTimeout(fit,1100);
// Stop the render/sim loop while idle so the fixed widget never repaints during
// parent-page scroll; resume only while the pointer is over the widget.
var pt;function pause(){G.pauseAnimation();}function resume(){G.resumeAnimation();}
function idle(ms){clearTimeout(pt);pt=setTimeout(pause,ms);}
document.body.addEventListener('pointerenter',function(){clearTimeout(pt);resume();});
document.body.addEventListener('pointerleave',function(){idle(250);});
addEventListener('resize',function(){resume();G.zoomToFit(0,20);idle(700);});
idle(2000);
function apply(re){resume();G.nodeRelSize(opt.ns).linkWidth(opt.lw).linkDirectionalArrowLength(opt.ar?2.6:0);if(re){G.graphData(visible());setTimeout(fit,450);}idle(re?2200:1400);}
function bind(id,key,fmt,re){var e=document.getElementById(id),o=document.getElementById('v'+id);e.value=opt[key];if(o)o.textContent=fmt(opt[key]);e.addEventListener('input',function(){opt[key]=parseFloat(e.value);if(o)o.textContent=fmt(opt[key]);apply(re);});}
bind('ns','ns',function(v){return v.toFixed(1);},false);
bind('lw','lw',function(v){return v.toFixed(1);},false);
bind('ts','ts',function(v){return v.toFixed(1);},false);
bind('to','to',function(v){return v.toFixed(2);},false);
var dE=document.getElementById('dp'),dO=document.getElementById('vd');dE.max=MAXD;dE.value=opt.dp;dO.textContent=opt.dp;dE.addEventListener('input',function(){opt.dp=parseInt(dE.value,10);dO.textContent=opt.dp;apply(true);});
if(!CUR)document.getElementById('depthRow').style.display='none';
var aE=document.getElementById('ar');aE.checked=opt.ar;aE.addEventListener('change',function(){opt.ar=aE.checked;apply(false);});
document.getElementById('gear').addEventListener('click',function(){document.getElementById('panel').classList.toggle('open');});
var hd=document.getElementById('hd');hd.textContent='⠿  '+(CUR?'Local graph':'Knowledge graph');
// free-form placement: drag by the header. Default is bottom-right (inline style);
// a moved position is saved per parent-origin and restored on every page.
function clampPos(fe,l,t){var TW=(window.top||window),r=fe.getBoundingClientRect();return [Math.min(Math.max(0,l),Math.max(0,TW.innerWidth-r.width)),Math.min(Math.max(0,t),Math.max(0,TW.innerHeight-r.height))];}
function place(fe,l,t){var p=clampPos(fe,l,t);fe.style.left=p[0]+'px';fe.style.top=p[1]+'px';fe.style.right='auto';fe.style.bottom='auto';}
try{var sp=JSON.parse(localStorage.getItem('llmwiki_graph_pos'));if(sp&&window.frameElement)place(window.frameElement,sp.l,sp.t);}catch(e){if(window.console)console.debug('graph: saved position unavailable',e);}
hd.addEventListener('pointerdown',function(e){var fe=window.frameElement;if(!fe)return;var rect=fe.getBoundingClientRect();var sx=e.screenX,sy=e.screenY,L=rect.left,T=rect.top;place(fe,L,T);hd.setPointerCapture(e.pointerId);
function mv(ev){place(fe,L+ev.screenX-sx,T+ev.screenY-sy);}
function up(){if(hd.hasPointerCapture(e.pointerId))hd.releasePointerCapture(e.pointerId);hd.removeEventListener('pointermove',mv);hd.removeEventListener('pointerup',up);try{localStorage.setItem('llmwiki_graph_pos',JSON.stringify({l:parseFloat(fe.style.left),t:parseFloat(fe.style.top)}));}catch(e2){if(window.console)console.debug('graph: could not persist position',e2);}}
hd.addEventListener('pointermove',mv);hd.addEventListener('pointerup',up);e.preventDefault();});
</script></body></html>"
  title="Knowledge graph"
  loading="lazy"
  style={{position:"fixed",right:"18px",bottom:"18px",width:"320px",height:"340px",border:0,borderRadius:"14px",boxShadow:"0 6px 28px rgba(0,0,0,0.38)",zIndex:50,background:"#0f1117"}}
/>
