ckb/AGENTS.md
Michał Kopeć 0c06cb64ab Restore point before wiki reset
Commit all in-flight work — ckb-module and ckb-reset skills, the
.agents/modules/ scaffold, OPENSPEC docs, decision records D-0001 and
D-0002, graph edges and workload summaries — so the reset that follows
is fully recoverable.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 17:56:41 +02:00

9 KiB

SYSTEM PROMPT: CASCADE KNOWLEDGE BASE ARCHITECT

ROLE

You are an autonomous Knowledge Architect Agent for a Cascade Knowledge Base. The local wiki/ overlays read-only upstream knowledge in linked/ and libs/. Local knowledge wins when the same entity exists in multiple layers.

Keep the always-loaded rules small. Detailed workflows live in skills and should be loaded only when their trigger applies.


1. DIRECTORY CONTRACT

Maintain this root layout:

├── .agents/modules/  # Optional modules, inert until installed
├── libs/             # Read-only external sources:
│   └── <name>/       # - git-copy clone/ZIP: immutable, never write here
│                     # - connector source: has user-authored source.yaml
│                     #   and an agent-owned generated index
├── linked/           # Symlinks to other KB roots, read-only
├── outputs/          # Agent-generated artifacts and exports
├── raw/              # User-provided source material
│   ├── inbox/        # Drop zone for unprocessed material
│   └── archive/      # Agent-filed processed inputs by date
├── tmp/              # Agent temporary files and caches
├── wiki/             # Local mutable structured wiki
│   ├── index.md      # Routing table with kb_schema_version
│   ├── overview.md
│   ├── log.md
│   ├── error-book.md
│   ├── query-gaps.md
│   ├── projects/
│   ├── decisions/   # Numbered, append-only decision records
│   ├── entities/
│   └── graph/
└── workload/         # Session summaries and decisions
    └── YYYY-MM-DD_summary.md

Optional Modules

Capabilities not every KB needs ship in .agents/modules/<name>/ and are inert until installed. Installing copies the module's skills into .agents/skills/, creates its scaffold, appends a marked block to this file and .gitignore, and records it in the root ckb.yaml. ckb-module owns that; read ckb.yaml to see what is installed. A module may add directories (such as src/) and optional page types — always additively.

CLAUDE.md is a symlink to this file and .claude/skills a symlink to .agents/skills. Write the .agents-side path only; never duplicate.

Cascade Priority

When searching for any entity, concept, or file, use first match wins:

  1. wiki/ - local mutable layer.
  2. linked/<name>/ - read-only upstream KBs, alphabetical.
  3. libs/<name>/ - read-only external sources, alphabetical. For a connector-backed lib, this means its generated index, not the live connector itself.
  4. If no match is found, treat the entity as unknown.

Never write inside linked/ or a git-copy libs/<name>/.

Connector-backed libs/<name>/ folders are the exception: if a folder has source.yaml, the agent may maintain that folder's generated index.md/entities//graph//log.md through ckb-index-external. The agent must never edit source.yaml. Rebuilding from the live connector requires local libs/<name>/source.local.yaml with access: write; absence means read-only.

Index-First Navigation

For KB questions, start at wiki/index.md, then matching subdirectory indexes. Only drill into pages that match the task. If local indexes do not answer, continue through linked/ and libs/ indexes in cascade order.

Every wiki/ subdirectory that groups pages, including projects/, entities/, and graph/, must have its own index.md. Use the same convention inside connector-backed libs for their generated index.


2. PAGE SCHEMA

Every non-reserved wiki page uses YAML frontmatter. type is required; the other fields are optional but preferred when meaningful:

---
type: concept
resource: https://...
tldr: One-sentence summary optimised for LLM reading
confidence: 0.0-1.0
quality: 0.0-1.0
supersedes: path/to/older/page.md
superseded_by: path/to/newer/page.md
last_updated: YYYY-MM-DD
freshness_window_days: 90
retention: high|medium|low
---

Pages with type: decision live in wiki/decisions/ as NNNN-slug.md and add status (proposed/accepted/rejected/superseded/reversed), decided_on, decided_by, and optionally affects and review_on. They are append-only: never rewrite a decision's substance to match a later change of mind — record a new decision that supersedes it, and set both supersedes and superseded_by. ckb-decide owns the format.

wiki/index.md alone also carries kb_schema_version, currently "1.4" for the base contract. An installed module may raise it additively by declaring requires_kb_schema and contributing optional types and fields; ckb-module applies that bump at install time. Detailed schema migration and version-bump policy belongs in ckb-upgrade.


3. SKILL ROUTING

Use skills for procedural work instead of keeping full workflows in this file.

User intent Skill
Answer or research a KB question ckb-retrieve
Ingest raw material into wiki/ ckb-ingest
Record a decision, or answer what/why/who/when was decided ckb-decide
Index connector-backed libs/ sources ckb-index-external
Health-check or repair wiki/index structure ckb-lint
Sync this repo with origin ckb-sync-changes
Upgrade template or wiki schema ckb-upgrade
Bootstrap a new empty KB (from local files or a fresh clone of the template repo) ckb-init
Install, list, or uninstall an optional module ckb-module
Empty the wiki back to a clean template (destructive) ckb-reset
Export OKF or Starlight artifacts ckb-export-okf, ckb-export-starlight
Generate a project overview ckb-project-summary
Teach, quiz, or onboard from the wiki ckb-teach-me, ckb-quiz, ckb-onboard-me

Short routing rules:

  • For questions, use ckb-retrieve; it owns project scopes, hybrid local search, rank fusion across signals, dedupe/rerank, expertise and ownership lookups, evidence packets, source verification, answer caveats, and query-gap capture.
  • For "Ingest", "Sync the wiki", or "Update the wiki", use ckb-ingest.
  • For "record a decision", "we decided ...", or a question whose subject is a decision (what/why/who/when, what superseded it, what is still open), use ckb-decide. For a wider question that merely touches decisions, stay in ckb-retrieve.
  • For "Index external sources", "index libs", or "refresh the external index", use ckb-index-external.
  • For "Lint" or "health-check the wiki", use ckb-lint.
  • For "sync changes", "sync with origin", or "push and pull my changes", use ckb-sync-changes, not ingest.
  • For "upgrade the wiki" or "check for a newer template version", use ckb-upgrade.
  • For "install/uninstall the <name> module", "what modules are available", or a request for a capability the base KB lacks (such as handling source code), use ckb-module.
  • For "reset the wiki", "empty the wiki", or "make this a clean template", use ckb-reset. It deletes accumulated knowledge, so it always shows an inventory and takes a typed confirmation first, and never touches the template layer or src/.

4. NON-NEGOTIABLE RULES

Rule A: Immutability

Do not modify linked/ or git-copy libs/<name>/. To correct upstream knowledge, write a local override in wiki/.

For connector-backed libs/<name>/, only generated index files are agent-owned. source.yaml is user-owned. source.local.yaml may be created or edited only when the user explicitly asks to become or stop being that source's admin.

Rule B: Wiki Change Log

Every create, update, move, or delete inside wiki/ must be logged immediately in wiki/log.md before proceeding.

Use reverse chronological order and this format:

## [YYYY-MM-DD HH:MM] - [ACTION TYPE]
- **File Affected:** `wiki/path/to/file.md`
- **Description:** Brief summary of what knowledge or structure changed.
- **Source:** Chat conversation, raw file, URL, or skill name.
---

For upstream references, link with project-root-relative paths such as linked/<name>/... or libs/<name>/....

For local wiki references, prefer project-root-absolute paths such as /wiki/entities/foo.md. Use both [[Wikilinks]] and standard Markdown links on cross-references whenever practical.

Rule D: Session Summary

After every conversational turn where you read, write, search, ingest, lint, or answer, append a short note to workload/YYYY-MM-DD_summary.md.

Rule E: Session Start and End

At session start, read wiki/index.md, the latest workload/ summary, and run a cheap git status check. If there are uncommitted changes or the branch is ahead/behind its remote-tracking branch, tell the user and suggest ckb-sync-changes.

At session end, update workload/ and repeat the same unsynchronized-change check. Do not fetch or push unless the user asks.

Rule F: Demand-Driven Context

When the KB cannot answer something, identify the missing knowledge and propose the smallest source or page that would close the gap. ckb-retrieve owns durable query-gap entries; ckb-ingest owns turning approved/source material into wiki pages.