Problem: the narrative docs lacked an enforceable style standard, and
agent-facing instruction (OIKOS/CAVEMAN/CONTRIBUTING) was interleaved with
human content at the repo root.
Change:
- Add .agents/shared/{writing-style,llm-wiki}.md — a lint-checkable prose
standard (with an imperative-voice exception for runbooks/recipes) and the
sources/wiki/index/log layer model.
- Move CAVEMAN.md -> .agents/shared/caveman.md,
CONTRIBUTING.md -> .agents/shared/page-templates.md,
OIKOS.md -> .agents/OIKOS.md; leave thin root stubs so old links resolve.
- Add .agents/domains/{knowledge,operations}/schema.md; operations schema
codifies "plans always live in plans/".
- Repoint live references (AGENTS, README, GLOSSARY, OIKOS) and fix OIKOS.md's
internal relative links for its new depth.
Risk: none to the operational substrate — inventory.yaml, hosts/*.yaml,
oikos/, mcp/, secrets/, bin/ untouched (verified via git status).
Verification: relative-link check across .agents/ clean; substrate churn empty.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2.9 KiB
Knowledge domain — schema
The knowledge domain is the durable, authoritative current-state documentation of the homelab: one page per node and per cross-cutting system, synthesized from live state and evidence. It answers "what exists and how does it work right now."
It follows the LLM Wiki layer model and the writing-style and page-templates rules.
The narrative / substrate split
The knowledge wiki is narrative. It sits alongside a machine-readable substrate that it describes but never contains. The split is load-bearing: several programs read the substrate at fixed paths, so the wiki reorganization never moves it.
| Layer | Location | Consumed by |
|---|---|---|
| Substrate — source of truth | inventory.yaml (root) |
MCP server, homelab CLI, oikos/ scheduler/drift/relations/gen-topology |
| Substrate — generated host records | hosts/*.yaml (root) |
mcp/server.py (HOSTS_DIR), bin/homelab; written by mcp/build_host_files.py |
| Substrate — kernel + context cards | oikos/ (code, oikos/cards/, oikos/state.json) |
MCP explain, scheduler |
| Narrative — synthesized wiki | knowledge/wiki/{hosts,containers,vms,infrastructure}/ |
humans, agents via MCP get_page / search_docs |
| Evidence — immutable sources | knowledge/sources/, investigations/ |
synthesis into wiki pages |
Wiki pages
- Node pages (
knowledge/wiki/containers/<id>-<name>.md,.../vms/<id>-<name>.md,.../hosts/<name>.md) follow the container/host template in page-templates.md: opening definition,## At a glance,## Role, service/port map, storage, auto-deploy,## Related,## Changelog. - Cross-cutting pages (
knowledge/wiki/infrastructure/<topic>.md) follow the cross-cutting template:## Why,## Components,## How to apply,## Gotchas,## Related,## Changelog. - Each
inventory.yamlhost entry carries adoc_page:field pointing at its narrative page. Changing where a page lives means updating that field (read bybin/homelab).
The two logs
- The per-page
## Changelogrecords infrastructure changes and is machine-parsed (get_changelog, the Oikos ledger). Keep the### YYYY-MM-DD — titleshape. knowledge/log.mdis append-only and records documentation-maintenance operations only (restructures, source ingests, lint sweeps):## [YYYY-MM-DD] <op> | <summary>. It never duplicates the Oikos change ledger (oikos/ledger.py).
Same-session update rule
A change to a node updates every page that references it in the same session — the node page, the
section README.md table, the root README.md, the Caddy/DNS/ingress pages, the host page, and
inventory.yaml. See page-templates.md.