# LLM Wiki Agent — Schema & Workflow Instructions This wiki is maintained entirely by your coding agent. No API key or Python scripts needed — just open this repo in Codex, OpenCode, or any agent that reads this file, and talk to it. ## How to Use Describe what you want in plain English: - *"Ingest this file: raw/papers/my-paper.md"* - *"What does the wiki say about transformer models?"* - *"Check the wiki for orphan pages and contradictions"* - *"Build the knowledge graph"* Or use shorthand triggers: - `ingest ` → runs the Ingest Workflow - `query: ` → runs the Query Workflow - `health` → runs the Health Workflow (fast, every session) - `lint` → runs the Lint Workflow (expensive, periodic) - `build graph` → runs the Graph Workflow --- ## Directory Layout ``` raw/ # Immutable source documents — never modify these wiki/ # Agent owns this layer entirely index.md # Catalog of all pages — update on every ingest log.md # Append-only chronological record overview.md # Living synthesis across all sources sources/ # One summary page per source document entities/ # People, companies, projects, products concepts/ # Ideas, frameworks, methods, theories syntheses/ # Saved query answers graph/ # Auto-generated graph data tools/ # Standalone Python scripts health.py # Structural checks (deterministic, no LLM calls) lint.py # Content quality checks (uses LLM for semantic analysis) build_graph.py # Knowledge graph generation ``` --- ## Page Format Every wiki page uses this frontmatter: ```yaml --- title: "Page Title" type: source | entity | concept | synthesis tags: [] sources: [] # list of source slugs that inform this page last_updated: YYYY-MM-DD --- ``` Use `[[PageName]]` wikilinks to link to other wiki pages. --- ## Ingest Workflow Triggered by: *"ingest "* **Supported formats:** Markdown (`.md`) is ingested directly. Non-markdown files (`.pdf`, `.docx`, `.pptx`, `.xlsx`, `.html`, `.txt`, `.csv`, `.json`, `.xml`, `.rst`, `.rtf`, `.epub`, `.ipynb`, `.yaml`, `.yml`, `.tsv`, `.wav`, `.mp3`) are auto-converted to markdown via [markitdown](https://github.com/microsoft/markitdown) before ingestion. Use `--no-convert` to skip auto-conversion. Steps (in order): 1. Read the source document fully (auto-convert if non-markdown) 2. Read `wiki/index.md` and `wiki/overview.md` for current wiki context 3. Write `wiki/sources/.md` — use the source page format below 4. Update `wiki/index.md` — add entry under Sources section 5. Update `wiki/overview.md` — revise synthesis if warranted 6. Update/create entity pages for key people, companies, projects mentioned 7. Update/create concept pages for key ideas and frameworks discussed 8. Flag any contradictions with existing wiki content 9. Append to `wiki/log.md`: `## [YYYY-MM-DD] ingest | ` 10. **Post-ingest validation** — check for broken `[[wikilinks]]`, verify all new pages are in `index.md`, print a change summary ### Source Page Format ```markdown --- title: "Source Title" type: source tags: [] date: YYYY-MM-DD source_file: raw/... --- ## Summary 2–4 sentence summary. ## Key Claims - Claim 1 - Claim 2 ## Key Quotes > "Quote here" — context ## Connections - [[EntityName]] — how they relate - [[ConceptName]] — how it connects ## Contradictions - Contradicts [[OtherPage]] on: ... ``` ### Domain-Specific Templates If the source falls into a specific domain (e.g., personal diary, meeting notes), the agent should use a specialized template instead of the default generic one above: #### Diary / Journal Template ```markdown --- title: "YYYY-MM-DD Diary" type: source tags: [diary] date: YYYY-MM-DD --- ## Event Summary ... ## Key Decisions ... ## Energy & Mood ... ## Connections ... ## Shifts & Contradictions ... ``` #### Meeting Notes Template ```markdown --- title: "Meeting Title" type: source tags: [meeting] date: YYYY-MM-DD --- ## Goal ... ## Key Discussions ... ## Decisions Made ... ## Action Items ... ``` --- ## Query Workflow Triggered by: *"query: <question>"* Steps: 1. Read `wiki/index.md` to identify relevant pages 2. Read those pages 3. Synthesize an answer with inline citations as `[[PageName]]` wikilinks 4. Ask the user if they want the answer filed as `wiki/syntheses/<slug>.md` --- ## Lint Workflow Triggered by: *"lint"* Check for: - **Orphan pages** — wiki pages with no inbound `[[links]]` from other pages - **Broken links** — `[[WikiLinks]]` pointing to pages that don't exist - **Contradictions** — claims that conflict across pages - **Stale summaries** — pages not updated after newer sources - **Missing entity pages** — entities mentioned in 3+ pages but lacking their own page - **Sparse pages** — pages with fewer than 2 outbound `[[wikilinks]]` (link density budget) - **Data gaps** — questions the wiki can't answer; suggest new sources Graph-aware checks (require `graph.json` from `build graph`): - **Hub stubs** — god nodes (degree > μ+2σ) with thin content (< 500 chars) - **Fragile bridges** — community pairs connected by only 1 edge - **Isolated communities** — clusters with zero external connections Output a lint report and ask if the user wants it saved to `wiki/lint-report.md`. --- ## Health Workflow Triggered by: *"health"* Run: `python tools/health.py` (or `python tools/health.py --json` for machine-readable output) Fast structural integrity checks — **zero LLM calls**, safe to run every session: - **Empty / stub files** — pages with no content beyond frontmatter (rate-limit damage) - **Index sync** — `wiki/index.md` entries vs actual files on disk - **Log coverage** — source pages missing a corresponding `ingest` entry in `wiki/log.md` Output a health report. Use `--save` to write to `wiki/health-report.md`. ### Health vs Lint Boundary | Dimension | `health` | `lint` | |---|---|---| | **Scope** | Structural integrity | Content quality | | **LLM calls** | Zero | Yes (semantic analysis) | | **Cost** | Free | Tokens | | **Frequency** | Every session, before other work | Every 10-15 ingests | | **Checks** | Empty files, index sync, log sync | Orphans, broken links, contradictions, gaps | | **Tool** | `tools/health.py` | `tools/lint.py` | | **Run order** | First (pre-flight) | After health passes | > Run `health` first — linting an empty file wastes tokens. --- ## Graph Workflow Triggered by: *"build graph"* First try: `python tools/build_graph.py --open` If Python/deps unavailable, build manually: 1. Search for all `[[wikilinks]]` across wiki pages 2. Build nodes (one per page) and edges (one per link) 3. Infer implicit relationships not captured by wikilinks — tag `INFERRED` with confidence score; low confidence → `AMBIGUOUS` 4. Write `graph/graph.json` with `{nodes, edges, built: date}` 5. Write `graph/graph.html` as a self-contained vis.js visualization --- ## Naming Conventions - Source slugs: `kebab-case` matching source filename - Entity pages: `TitleCase.md` (e.g. `OpenAI.md`, `SamAltman.md`) - Concept pages: `TitleCase.md` (e.g. `ReinforcementLearning.md`, `RAG.md`) ## Index Format ```markdown # Wiki Index ## Overview - [Overview](overview.md) — living synthesis ## Sources - [Source Title](sources/slug.md) — one-line summary ## Entities - [Entity Name](entities/EntityName.md) — one-line description ## Concepts - [Concept Name](concepts/ConceptName.md) — one-line description ## Syntheses - [Analysis Title](syntheses/slug.md) — what question it answers ``` ## Log Format `## [YYYY-MM-DD] <operation> | <title>` Operations: `ingest`, `query`, `health`, `lint`, `graph`, `report` --- ## Graph Health Report Triggered by: *"graph report"* or `python tools/build_graph.py --report` The `--report` flag generates a structured graph health report covering: - **Health summary** — edges/node ratio, orphan %, community count, link density - **Orphan nodes** — pages with zero graph connections - **God nodes** — hub pages with degree > μ+2σ (disproportionate connectivity) - **Fragile bridges** — community pairs connected by only 1 edge - **Phantom hubs** — `[[wikilinks]]` referenced by 2+ existing pages but pointing to non-existent pages (page creation signals) Use `--save` to write the report to `graph/graph-report.md`. --- ## Phase 3 Design Constraints (Auto-Linking — Open) Phase 3 proposes automatic `[[wikilink]]` insertion based on graph analysis. The following hard rules apply: ### Promotion Gate: `draft → stable` - Auto-linked edges start as `DRAFT` (visible in graph, not written to page body) - A dedicated `promote` pass validates source grounding + consistency - Only edges that pass get materialized as `[[wikilinks]]` in the page - **Link density budget**: a page must have ≥2 outbound wikilinks before promotion ### Hard Rules | ID | Rule | Rationale | |---|---|---| | HG-WA-01 | Graph layer MUST NOT auto-create pages from broken links — report only | LLM ingest produces hallucinated wikilinks; auto-creating amplifies noise | | HG-WA-02 | New slash commands MUST NOT duplicate existing command coverage | Prevents user confusion; merge into existing commands instead |