Mini Context Graph Skill
The Core Idea
Standard RAG re-discovers knowledge from scratch on every query. This skill is different:
- Wiki layer — The LLM writes and maintains persistent markdown pages (summaries, entity pages, topic syntheses). Cross-references are already there. The wiki gets richer with every ingest.
- Graph layer — Entities and relations are extracted once and stored as a navigable knowledge graph. BFS traversal answers structural queries without re-reading sources.
- Raw source layer — Original documents are stored immutably with chunks. Provenance links tie every graph node and edge back to the exact text that supports it.
The LLM writes; the Python tools handle all bookkeeping.
Three Layers
| Layer |
Where |
What the LLM does |
What Python does |
| Raw Sources |
data/documents.json |
Reads (never modifies) |
Stores chunks + metadata |
| Wiki |
wiki/ (markdown) |
Writes/updates pages |
Manages index.md + log.md |
| Graph |
data/graph.json |
Extracts entities + relations |
Persists, deduplicates, traverses |
⚡ Quick Start for Agents
from scripts.contextgraph import ContextGraphSkill
from scripts.tools import wiki_store
skill = ContextGraphSkill()
# ===== INGEST WITH FULL RAG + WIKI =====
# 1. Read references/ingestion.md and references/ontology.md first
# 2. Extract entities and relations (LLM reasoning step)
entities = [
{"name": "memory leak", "type": "issue", "supporting_text": "memory leaks cause crashes"},
{"name": "system crash", "type": "issue", "supporting_text": "system crashes due to memory leaks"},
]
relations = [
{"source": "memory leak", "target": "system crash", "type": "causes",
"confidence": 1.0, "supporting_text": "System crashes due to memory leaks."},
]
result = skill.ingest_with_content(
doc_id="doc_001",
title="System Crash Analysis",
source="/docs/incident_report.pdf",
raw_content="System crashes due to memory leaks. Memory leaks occur when objects are not released.",
entities=entities,
relations=relations,
)
# result = {"doc_id": "doc_001", "chunk_count": 1, "nodes_added": 2, "edges_added": 1}
# 3. Write a wiki summary page for this document
wiki_store.write_page(
category="summary",
title="System Crash Analysis Summary",
content="""---
title: System Crash Analysis
source_document: doc_001
tags: [summary, incident]
---
# System Crash Analysis
**Source:** incident_report.pdf
## Key Claims
- [[memory-leak]] causes [[system-crash]] (confidence: 1.0)
## Entities
- [[memory-leak]] (issue)
- [[system-crash]] (issue)
""",
summary="Incident report: memory leaks cause system crashes.",
)
# ===== QUERY WITH EVIDENCE =====
result = skill.query_with_evidence("Why does the system crash?")
# Returns: {"query": ..., "subgraph": ..., "supporting_documents": [...], "evidence_chain": ...}
# ===== WIKI SEARCH (read wiki before answering) =====
pages = wiki_store.search_wiki("memory leak")
# Returns: [{slug, category, path, snippet}, ...]
Operations
Ingest
When a user provides a new document:
- Read
references/ingestion.md — entity/relation extraction rules.
- Read
references/ontology.md — type normalization rules.
- Extract entities and relations using your LLM reasoning.
- Call
skill.ingest_with_content(...) — stores raw content + chunks + graph nodes + provenance.
- Write a wiki summary page using
wiki_store.write_page(category="summary", ...).
- Update entity pages — for each new/updated entity, write or update
wiki_store.write_page(category="entity", ...).
- Update topic pages if the document touches an existing synthesis topic.
- A single document ingest will typically touch 3–10 wiki pages.
Query
When a user asks a question:
- Check the wiki first —
wiki_store.search_wiki(query) to find relevant pages. Read them.
- If the wiki has a good answer, synthesize from wiki pages (fast path).
- If deeper graph traversal is needed, call
skill.query_with_evidence(query).
- Return the answer with evidence citations from
supporting_documents.
- If the answer is valuable, file it back as a new wiki topic page.
Lint
Periodically health-check the wiki:
from scripts.tools import wiki_store
issues = wiki_store.lint_wiki()
# Returns: {orphan_pages, missing_pages, broken_wikilinks, isolated_pages}
Ask the LLM to review and fix: broken links, orphan pages, stale claims, missing cross-references. See references/lint.md for full lint workflow.
Ingestion Constraints
- ❌ Do NOT hallucinate entities not present in the text
- ❌ Do NOT add relations without explicit textual evidence
- ❌ Do NOT add edges with confidence < 0.6
- ✅ Provide
supporting_text for every entity and relation — this enables provenance
- ✅ Write a wiki summary page for every ingested document
- ✅ Update existing entity pages when new information arrives
- ✅ Flag contradictions in wiki pages when new data conflicts with old claims
Retrieval Constraints
- 🔒 Traversal depth MUST NOT exceed 2 (config: MAX_GRAPH_DEPTH)
- 🔒 Only edges with confidence ≥ 0.6 (config: MIN_CONFIDENCE)
- 🔒 Maximum 50 nodes returned (config: MAX_NODES)
- ❌ Do NOT fabricate nodes or edges not in the graph
Full Python API Reference
| Method |
Purpose |
When to Use |
skill.ingest_with_content(doc_id, title, source, raw_content, entities, relations) |
Full RAG ingest: raw docs + graph + provenance |
Every new document |
skill.add_node(name, node_type) |
Add single entity (no provenance) |
Quick additions without a source doc |
skill.add_edge(source_name, target_name, relation, confidence) |
Add single relation |
Quick additions without a source doc |
skill.query(query) |
Graph-only retrieval → subgraph |
Structural queries |
skill.query_with_evidence(query) |
Graph + provenance → subgraph + source chunks |
Queries requiring citations |
wiki_store.write_page(category, title, content, summary) |
Write/update a wiki page |
After every ingest; after answering queries |
wiki_store.read_page(category, title) |
Read a wiki page |
Before answering; for cross-referencing |
wiki_store.search_wiki(query) |
Keyword search across wiki |
Fast path before graph traversal |
wiki_store.list_pages(category) |
List all wiki pages |
Getting an overview |
wiki_store.get_log(last_n) |
Read recent operations |
Understanding wiki history |
wiki_store.lint_wiki() |
Health check |
Periodic maintenance |
documents_store.list_documents() |
List all ingested raw sources |
Audit / provenance checking |
documents_store.search_chunks(query) |
Chunk-level search |
Finding specific evidence |
Design Philosophy
"The wiki is a persistent, compounding artifact. The cross-references are already there. The synthesis already reflects everything you've read." — Karpathy
| Layer |
What Happens |
Who Owns It |
| LLM Reasoning |
Extraction, synthesis, writing wiki pages |
Agent (.md guidance files) |
| Wiki Persistence |
Index, log, file I/O |
wiki_store.py |
| Graph Persistence |
Dedup, index, BFS traverse |
graph_store.py, retrieval_engine.py |
| Raw Source Storage |
Immutable docs + chunks + provenance |
documents_store.py |
The human curates sources and asks questions. The LLM writes the wiki, extracts the graph, and answers with citations. Python handles all bookkeeping.
1---2name: mini-context-graph3description: Build a persistent, compounding knowledge base that combines a wiki, knowledge graph, and raw source storage for structured retrieval with provenance.4---56# Mini Context Graph Skill78## The Core Idea910Standard RAG re-discovers knowledge from scratch on every query. This skill is different:11121. **Wiki layer** — The LLM writes and maintains persistent markdown pages (summaries, entity pages, topic syntheses). Cross-references are already there. The wiki gets richer with every ingest.132. **Graph layer** — Entities and relations are extracted once and stored as a navigable knowledge graph. BFS traversal answers structural queries without re-reading sources.143. **Raw source layer** — Original documents are stored immutably with chunks. Provenance links tie every graph node and edge back to the exact text that supports it.1516> The LLM writes; the Python tools handle all bookkeeping.1718---1920## Three Layers2122| Layer | Where | What the LLM does | What Python does |23|-------|-------|-------------------|-----------------|24| **Raw Sources** | `data/documents.json` | Reads (never modifies) | Stores chunks + metadata |25| **Wiki** | `wiki/` (markdown) | Writes/updates pages | Manages index.md + log.md |26| **Graph** | `data/graph.json` | Extracts entities + relations | Persists, deduplicates, traverses |2728---2930## ⚡ Quick Start for Agents3132```python33from scripts.contextgraph import ContextGraphSkill34from scripts.tools import wiki_store3536skill = ContextGraphSkill()3738# ===== INGEST WITH FULL RAG + WIKI =====39# 1. Read references/ingestion.md and references/ontology.md first40# 2. Extract entities and relations (LLM reasoning step)41entities = [42 {"name": "memory leak", "type": "issue", "supporting_text": "memory leaks cause crashes"},43 {"name": "system crash", "type": "issue", "supporting_text": "system crashes due to memory leaks"},44]45relations = [46 {"source": "memory leak", "target": "system crash", "type": "causes",47 "confidence": 1.0, "supporting_text": "System crashes due to memory leaks."},48]4950result = skill.ingest_with_content(51 doc_id="doc_001",52 title="System Crash Analysis",53 source="/docs/incident_report.pdf",54 raw_content="System crashes due to memory leaks. Memory leaks occur when objects are not released.",55 entities=entities,56 relations=relations,57)58# result = {"doc_id": "doc_001", "chunk_count": 1, "nodes_added": 2, "edges_added": 1}5960# 3. Write a wiki summary page for this document61wiki_store.write_page(62 category="summary",63 title="System Crash Analysis Summary",64 content="""---65title: System Crash Analysis66source_document: doc_00167tags: [summary, incident]68---6970# System Crash Analysis7172**Source:** incident_report.pdf7374## Key Claims7576- [[memory-leak]] causes [[system-crash]] (confidence: 1.0)7778## Entities7980- [[memory-leak]] (issue)81- [[system-crash]] (issue)82""",83 summary="Incident report: memory leaks cause system crashes.",84)8586# ===== QUERY WITH EVIDENCE =====87result = skill.query_with_evidence("Why does the system crash?")88# Returns: {"query": ..., "subgraph": ..., "supporting_documents": [...], "evidence_chain": ...}8990# ===== WIKI SEARCH (read wiki before answering) =====91pages = wiki_store.search_wiki("memory leak")92# Returns: [{slug, category, path, snippet}, ...]93```9495---9697## Operations9899### Ingest100101When a user provides a new document:1021031. Read `references/ingestion.md` — entity/relation extraction rules.1042. Read `references/ontology.md` — type normalization rules.1053. Extract entities and relations using your LLM reasoning.1064. Call `skill.ingest_with_content(...)` — stores raw content + chunks + graph nodes + provenance.1075. **Write a wiki summary page** using `wiki_store.write_page(category="summary", ...)`.1086. **Update entity pages** — for each new/updated entity, write or update `wiki_store.write_page(category="entity", ...)`.1097. **Update topic pages** if the document touches an existing synthesis topic.1108. A single document ingest will typically touch 3–10 wiki pages.111112### Query113114When a user asks a question:1151161. **Check the wiki first** — `wiki_store.search_wiki(query)` to find relevant pages. Read them.1172. If the wiki has a good answer, synthesize from wiki pages (fast path).1183. If deeper graph traversal is needed, call `skill.query_with_evidence(query)`.1194. Return the answer with evidence citations from `supporting_documents`.1205. If the answer is valuable, file it back as a new wiki topic page.121122### Lint123124Periodically health-check the wiki:125126```python127from scripts.tools import wiki_store128issues = wiki_store.lint_wiki()129# Returns: {orphan_pages, missing_pages, broken_wikilinks, isolated_pages}130```131132Ask the LLM to review and fix: broken links, orphan pages, stale claims, missing cross-references. See `references/lint.md` for full lint workflow.133134---135136## Ingestion Constraints137138- ❌ Do NOT hallucinate entities not present in the text139- ❌ Do NOT add relations without explicit textual evidence140- ❌ Do NOT add edges with confidence < 0.6141- ✅ Provide `supporting_text` for every entity and relation — this enables provenance142- ✅ Write a wiki summary page for every ingested document143- ✅ Update existing entity pages when new information arrives144- ✅ Flag contradictions in wiki pages when new data conflicts with old claims145146---147148## Retrieval Constraints149150- 🔒 Traversal depth MUST NOT exceed 2 (config: MAX_GRAPH_DEPTH)151- 🔒 Only edges with confidence ≥ 0.6 (config: MIN_CONFIDENCE)152- 🔒 Maximum 50 nodes returned (config: MAX_NODES)153- ❌ Do NOT fabricate nodes or edges not in the graph154155---156157## Full Python API Reference158159| Method | Purpose | When to Use |160|--------|---------|-------------|161| `skill.ingest_with_content(doc_id, title, source, raw_content, entities, relations)` | Full RAG ingest: raw docs + graph + provenance | Every new document |162| `skill.add_node(name, node_type)` | Add single entity (no provenance) | Quick additions without a source doc |163| `skill.add_edge(source_name, target_name, relation, confidence)` | Add single relation | Quick additions without a source doc |164| `skill.query(query)` | Graph-only retrieval → subgraph | Structural queries |165| `skill.query_with_evidence(query)` | Graph + provenance → subgraph + source chunks | Queries requiring citations |166| `wiki_store.write_page(category, title, content, summary)` | Write/update a wiki page | After every ingest; after answering queries |167| `wiki_store.read_page(category, title)` | Read a wiki page | Before answering; for cross-referencing |168| `wiki_store.search_wiki(query)` | Keyword search across wiki | Fast path before graph traversal |169| `wiki_store.list_pages(category)` | List all wiki pages | Getting an overview |170| `wiki_store.get_log(last_n)` | Read recent operations | Understanding wiki history |171| `wiki_store.lint_wiki()` | Health check | Periodic maintenance |172| `documents_store.list_documents()` | List all ingested raw sources | Audit / provenance checking |173| `documents_store.search_chunks(query)` | Chunk-level search | Finding specific evidence |174175---176177## Design Philosophy178179> "The wiki is a persistent, compounding artifact. The cross-references are already there. The synthesis already reflects everything you've read." — Karpathy180181| Layer | What Happens | Who Owns It |182|-------|-----------|-------------|183| **LLM Reasoning** | Extraction, synthesis, writing wiki pages | Agent (.md guidance files) |184| **Wiki Persistence** | Index, log, file I/O | `wiki_store.py` |185| **Graph Persistence** | Dedup, index, BFS traverse | `graph_store.py`, `retrieval_engine.py` |186| **Raw Source Storage** | Immutable docs + chunks + provenance | `documents_store.py` |187188The human curates sources and asks questions. The LLM writes the wiki, extracts the graph, and answers with citations. Python handles all bookkeeping.189