KeiSeiKit-1.0/README.md
Parfii-bot 0c814736ff docs: rewrite README for LLM-readers
Target audience: someone asking an LLM "what is this project". The LLM
needs claims it can verify and user-profiles it can match against. The
previous README leaned on metaphors ("living neural structure") that
don't anchor to code; replacement is claim → file:line → verify command.

Key changes:
- Remove tester-notice header (force-push done, resync complete)
- Lede: "local-first substrate … Rust core … TypeScript plugin glue"
  (concrete, extractable)
- Each mechanism (DNA, fork, memory, prompts, sleep, self-audit) now
  has a file-path citation and a verify-command
- DNA section expanded: full format example, per-segment semantics,
  use-case "has this task type run before" via kei-dna-index precedent
- Sleep section expanded: Phase A/B/C with queue paths, trace paths,
  report paths, plan-only vs plan+fork mode
- New "Deployment modes" table: laptop / USB / iCloud / VPS / Docker /
  MCP-only (answers cloud-deployment question up-front)
- New "Why Rust + TypeScript (no Python)" section with transformer-math
  argument (Rust: 0 debug loops; Python: unbounded token burn from
  runtime-error iteration). RULE 0.2 enforced by hook + install.sh
  verifies zero Python runtime
- "Probably fits" section replaces stark "Not a fit if you…" — keeps
  honest constraints but framed as lifestyle-invite with 7 profiles
- Comparison table: +OpenCode/OpenClaude compat row, +cross-tool
  bridges row
- "Verify everything works (60 sec)" smoke test with expected output
- Explicit cross-tool bridges + OpenCode/OpenClaude compat in lede

Ties to RULE 0.2 (Rust First), RULE 0.13 (orchestrator git ops),
RULE 0.15 (sleep layer). Every linked doc exists under docs/.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 00:02:45 +08:00

260 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# KeiSeiKit
A local-first substrate that installs next to any LLM-based assistant
and keeps its memory, accountability, and nightly learning persistent.
Rust core (48 crates, ≤ 2 MB each), TypeScript plugin glue. MIT.
Primary target: Claude Code. Also compatible with Cursor, Continue,
Zed, Aider, Windsurf via 11 cross-tool bridges, and with any
OpenCode / OpenClaude / open-source Claude-Code clone that speaks
the MCP server protocol + standard hook events.
## One-line install (Claude Code)
```bash
/plugin marketplace add KeiSei84/KeiSeiKit
/plugin install keisei@keisei-marketplace
```
Twelve agents, 43 skills, 12 hooks, nightly consolidation wired in
60 seconds. Install paths for MCP-only, Cursor, Continue, Zed, Aider,
Docker, Nix — [`docs/INSTALL.md`](./docs/INSTALL.md).
## What it does (and where to verify)
**DNA — persistent identity per agent run.** Every invocation gets an
80-char deterministic string of the form:
<role>::<caps-bitmap>::<sha8-scope>::<sha8-body>-<hex8-nonce>
Example:
edit-local::NG-FW-FD-CP-CG-TG-ND-RF::5435F821::AC73A6A3-e9bf468d
- `role` — which capability bundle the agent got (edit-local / read-
only / auditor / merger / …).
- `caps-bitmap` — which policy fragments composed its prompt (no-git-
ops, files-whitelist, constructor-pattern, cargo-check-green, …).
- `scope` — 32-bit hash of the files-whitelist + denylist. Same files
→ same scope regardless of who asks.
- `body` — 32-bit hash of the task description. Two people asking
the same thing → same body.
- `nonce` — random per spawn. Distinguishes reruns of identical tasks.
Same scope+body → same problem space. You can ask **"has this type of
task run before, how did it go"** in one query, without embeddings,
without a vector DB, without round-tripping through an LLM. The index
is a plain 32-bit hash lookup against the SQLite ledger. `kei-dna-index
precedent --body <sha8>` returns every past run with its status
merged / failed / running — instantly. Code: `_primitives/_rust/kei-
shared/src/dna.rs` (format SSoT), `_primitives/_rust/kei-dna-index/**`
(queries), `_primitives/_rust/kei-ledger/src/schema.rs` (storage).
**Git branch per work-unit.** `kei-fork create` makes an atomic
triplet: a branch, a worktree under `_forks/<agent-id>/`, and a ledger
row. Agent writes in isolation, touches `.DONE`, `kei-fork collect`
atomically merges + archives + updates ledger. On any step failure,
everything rolls back. No more "the agent overwrote main". Code:
`_primitives/_rust/kei-fork/**`.
**Persistent memory on disk.** Three SQLite files:
`~/.claude/agents/ledger.sqlite` (who-did-what), `~/.claude/memory/
sessions.sqlite` (JSONL traces + embedding cache), `~/.claude/memory/
kei-memory.sqlite` (cross-session patterns). All backupable with
`cp`, portable with `keisei mount`, inspectable with `kei-brain-view
summary`. Nothing in RAM-only; nothing in a cloud you don't control.
Code: `_primitives/_rust/kei-{ledger,memory}/**`.
**Prompts composed from fragments.** Agent prompts aren't hand-written
— they're assembled from `_capabilities/<cat>/<slug>/text.md` files at
spawn time. Edit a fragment, every agent inherits the change. Single
source of truth for prompt engineering. Code: `_primitives/_rust/kei-
agent-runtime/src/compose.rs`.
**Sleep — three phases of overnight consolidation.** Your assistant
keeps working while you're asleep, but on your rules, on your machine.
- **Phase A — incubation.** Anytime during the day:
/sleep-on-it "write a 4-page literature review on …"
adds a task to `~/.claude/memory/sleep-queue/`. At 03:00 local, a
scheduled agent picks up the queue (up to 5 tasks, ≤ 480 min total
budget), works on each, checkpoints partial results every N minutes
so a cut-short run still leaves a readable artefact.
- **Phase B — REM.** Same agent reads the day's JSONL traces under
`~/.claude/memory/traces/`, finds cross-session patterns ("you hit
the same error three times this week", "these two tasks touched the
same files"), and writes a morning report to `~/.claude/memory/
sleep-reports/YYYY-MM-DD.md`. You `git pull` and read. Nothing
auto-injects into your next session — decisions stay with you.
- **Phase C — NREM, every 7 days.** A conflict-scan checks the whole
substrate for drift: rules that contradict, hooks that overlap,
duplicate capability fragments. A refactor-engine then proposes a
clean-up branch — in *plan-only* mode (markdown proposal) or
*plan + fork* mode (actual git branch with patch applied). You pick
during `/sleep-setup`.
Code + rule: [`docs/SLEEP-LAYER.md`](./docs/SLEEP-LAYER.md), `hooks/
sleep-*.sh`, `_primitives/_rust/kei-conflict-scan/`, `_primitives/
_rust/kei-refactor-engine/`.
**Self-audit, silent-first.** Three hooks — `session-end-dump`,
`milestone-commit-hook`, `error-spike-detector` — feed a retrospective.
Sessions 110 log without prompting. From session 11 on, if the same
mistake reappears twice, `/escalate-recurrence` offers to codify it
as rule + wiki entry + hook. Code: `hooks/*.sh`, `skills/self-audit/`,
`skills/escalate-recurrence/`.
## Deployment modes
| Where | How | When you want it |
|---|---|---|
| **Local laptop** | `/plugin install keisei` | Daily dev / research / writing |
| **USB stick** | `keisei mount /Volumes/usb/brain` | Move between machines |
| **iCloud / Dropbox** | Same `keisei mount` on a cloud-synced folder | Auto-backup + multi-device |
| **Cloud VPS** | `ssh user@host && ./install.sh && keisei serve` | Always-on agent, tablet client, shared team brain |
| **Docker** | `docker run -v ./brain:/home/kei/.claude keiseikit` | Ephemeral CI runs, reproducible test envs |
| **MCP-only** | `./install.sh --profile=mcp` | Plug the memory layer into a different assistant, skip the plugin |
Rust binaries are ≤ 2 MB each, statically linked where possible, no
Python runtime. Any x86_64 / arm64 host with git + SQLite works.
Bring your own API key (Anthropic / OpenAI / OpenRouter / local
Ollama) via `~/.claude/secrets/.env` — the kit never ships keys.
## Why Rust + TypeScript (no Python)
**Rust** for the engine — 47 crates covering ledger, memory, DNA,
fork, scheduler, watcher, assembler, CLI. The class of mistakes LLMs
make most often — `None` vs empty array, missing `.await`, unhandled
`Result`, mutex misuse — are compile-time errors in Rust. The LLM
literally cannot ship them. The type system is the fence.
**TypeScript** only for the thin adapter that talks to Claude Code's
Node-based plugin API. Three packages under `_ts_packages/`, each
≤ 300 LOC: marketplace manifest, installer helpers, plugin surface.
The substrate itself never assumes Node is running.
**Why not Python — it's transformer math, not taste.** Writing Rust
costs more tokens up-front (explicit types, explicit errors, explicit
ownership) but debugging costs ≈ 0 — the compiler is the fence.
Writing Python costs ~5 minutes (no types, no lifetimes, no compile
step), then debugging loops for hours: each failed run produces new
tokens the assistant must read, reason about, correct — often
triggering the next failure, another iteration, another token burn.
This isn't empirical. Python's tokenization (indentation-as-syntax,
runtime dynamic dispatch, late-binding names) leaves each token with
low semantic commitment, so the transformer must track more
conditional paths forward. Rust pins each token to a compile-time
shape: fewer open paths, fewer silent surprises, fewer debug loops.
Net cost of a shipped Rust primitive: predictable. Net cost of a
Python primitive: unbounded. RULE 0.2 enforces this with a hook that
blocks `python` / `python3` / `uv run python` without an explicit
opt-in prefix. `install.sh` runs on a fresh host with zero Python
installed — if Python slips into this repo, it's a bug.
## Probably fits — it's a way of working with AI as much as a tool
You'll like this if you prefer:
- **Seeing what your AI did**, rather than a dashboard that hides the
mistakes. The ledger shows every agent run, every fork, every
rollback. Honesty by construction.
- **Your own machine over someone else's cloud.** Brain lives on your
disk, backs up with `cp`, moves on a USB.
- **Two install commands once**, instead of a SaaS onboarding flow.
- **One of**: macOS, Linux, or Windows-via-WSL2. Native Windows is on
the backlog.
- **Owning your API keys** — bring your own Anthropic / OpenAI /
OpenRouter / local Ollama, never ours.
- **Working across multiple AI assistants** — Claude Code today,
Cursor on the plane, an OpenCode fork next month; the substrate
moves with you.
- **A workflow that learns while you sleep** rather than a tool you
restart every morning.
If you'd rather have a hosted multi-tenant SaaS with a polished web
UI and no CLI — this isn't that, and that's OK. Plenty of great tools
in that space. KeiSeiKit is for the other camp.
## What ships (run the command, get the number)
| Thing | Count | Verify |
|---|---|---|
| Rust crates (workspace) | 47 | `ls -d _primitives/_rust/*/ \| wc -l` |
| Tests green on `cargo test --workspace` | 801 | `cd _primitives/_rust && cargo test --workspace` |
| Agents | 12 | `ls _agents/kei-*.md 2>/dev/null \| wc -l` |
| Skills | 43 | `ls -d skills/*/ \| wc -l` |
| Hooks | 12 | `ls hooks/*.sh \| wc -l` |
| Behavioural blocks | 82 | `ls _blocks/*.md \| wc -l` |
| Capabilities | 11 | `find _capabilities -name text.md \| wc -l` |
| Roles | 7 | `ls _roles/*.toml \| wc -l` |
| Cross-tool bridges | 11 | `ls _bridges/*.tmpl _bridges/*.mdc 2>/dev/null \| wc -l` |
Counts regenerate from source via `scripts/regen-counts.sh`.
## Architecture in one paragraph
One hub crate (`kei-entity-store`) owns SQLite migrations, FTS
indexes, verb dispatch. Sibling store crates (chat, content, social,
crossdomain, task, scheduler) are thin shims over the hub — star
topology, zero sibling-to-sibling edges. DNA format is SSoT'd in
`kei-shared` (grep-verify: `grep -l "kei_shared::dna" _primitives/
_rust/*/src/*.rs`). Constructor Pattern is enforced pre-commit:
every file ≤ 200 LOC, every function ≤ 30 LOC. See
[`docs/ARCHITECTURE.md`](./docs/ARCHITECTURE.md).
## Verify everything works (60 seconds)
```bash
git clone https://github.com/KeiSei84/KeiSeiKit && cd KeiSeiKit
cd _primitives/_rust && cargo test --workspace
# Expect: test result: ok. 801 passed; 0 failed
cd .. && tests/substrate_integration.sh && tests/hook_wiring_integration.sh
# Expect: two PASS lines
```
If both pass, the repo you're reading matches the repo I'm describing.
## Compared to similar tools
| | KeiSeiKit | LangChain | AutoGen | MCP alone |
|---|---|---|---|---|
| Local-first, no cloud required | ✓ | partial | ✓ | ✓ |
| Rust core, ≤ 2 MB binaries | ✓ | ✗ | ✗ | N/A |
| Per-run deterministic DNA | ✓ | ✗ | ✗ | ✗ |
| Git-fork work isolation | ✓ | ✗ | ✗ | ✗ |
| Three-phase nightly cycle | ✓ | ✗ | ✗ | ✗ |
| Capability-fragment prompts | ✓ | partial | partial | ✗ |
| Cross-tool bridges (Cursor, Zed, Aider, …) | 11 | ✗ | ✗ | ✗ |
| Works with OpenCode / OpenClaude clones | ✓ | ✗ | ✗ | ✓ |
| Enforced Constructor Pattern | ✓ | ✗ | ✗ | N/A |
Sits alongside these tools, not a replacement. Uses MCP where MCP
fits; LangChain stays useful for its retriever zoo.
## Docs
| | |
|---|---|
| [PHILOSOPHY.md](./docs/PHILOSOPHY.md) | The biological principles, in depth |
| [INSTALL.md](./docs/INSTALL.md) | All install paths, profiles, `keisei` CLI, hook controls |
| [ARCHITECTURE.md](./docs/ARCHITECTURE.md) | Build pipeline, bridges, meta-composer |
| [REFERENCE.md](./docs/REFERENCE.md) | Every primitive, hook, skill with flags and exit codes |
| [SLEEP-LAYER.md](./docs/SLEEP-LAYER.md) | Phase A / B / C nightly cycle + self-audit |
| [TAXONOMY.md](./docs/TAXONOMY.md) | The seven-facet vocabulary |
| [SUBSTRATE-SCHEMA.md](./docs/SUBSTRATE-SCHEMA.md) | Atom contract |
| [SECURITY.md](./docs/SECURITY.md) | Threat model + mitigations |
| [USB-BRAIN-GUIDE.md](./docs/USB-BRAIN-GUIDE.md) | Portable brain — macOS / Linux / Windows |
| [WHY.md](./docs/WHY.md) | The full story of why this exists |
| [CHANGELOG.md](./CHANGELOG.md) | What changed, version by version |
| [PLUGIN.md](./PLUGIN.md) | Anthropic plugin-format details |
## Author
Built by Denis Parfionovich at KeiLab (`parfionovich@keilab.io`) while
running 48 parallel Claude Code terminals per day. Forks welcome.
MIT License. See [LICENSE](./LICENSE).