Code Project Brain
by liyouran1109
README.md
# Code Project Brain (CPB)
> A project-level second brain that grows in sync with a code repository.
> A **Knowledge State** (SQLite, the truth) sits over **CodeGraph** (facts) and a
> **Development Guide** (context), with a **Wiki** regenerated as a rebuildable
> projection — compiled into task-specific context for Claude Code, with a
> governed **Change → Delta** loop and a **Continuous Evolution** reality loop
> that keeps knowledge correct without ever letting an AI silently rewrite it.
CPB is at **v12.0.0 / protocol 12**. Implementation record:
[`docs/update8.0.md`](docs/update8.0.md) (阶段 0-9) + [`docs/update10.0.md`](docs/update10.0.md)
(知识质量阶段 P0/P1) + [`docs/update11.0.md`](docs/update11.0.md) (双层 API + Knowledge Transaction + 分层知识模型)
+ [`docs/update12.0.md`](docs/update12.0.md) (架构收敛:工具可见性 profile + 三层对象边界 + 软知识过期 + 任务路由 + Benchmark 骨架).
Design references:
[`docs/CPB Knowledge State Design.md`](docs/CPB%20Knowledge%20State%20Design.md),
[`docs/CPB Continuous Evolution Design.md`](docs/CPB%20Continuous%20Evolution%20Design.md),
[`docs/CPB Project Bootstrap Design.md`](docs/CPB%20Project%20Bootstrap%20Design.md).
```
┌──────────────┐
│ Claude Code │ (any MCP client)
└──────┬───────┘
│ MCP (72 namespaced tools / 10 namespaces)
▼
┌─────────────────────────────────────────────────────┐
│ CPB MCP Adapter (双层 API) │
│ cpb.* intent layer (8): search/context/inspect/ │
│ impact/propose/record/conflicts/history │
│ atomic layer (63, preserved): code/docs/kb/wiki/ │
│ guide/concept/knowledge/project/evolution │
└──────────────────────┬──────────────────────────────┘
▼
┌─────────────────────────────────────────────────────┐
│ CPB Engine │
│ Knowledge State (ks_* tables) ── THE TRUTH │
│ concepts(+aliases) · entities(+scope) · claims │
│ · evidence · relations · deltas · intake_events │
│ ▲ mutation via Delta (§45.2 soft gate) / │
│ Knowledge Transaction (D2 dryRun/commit) │
│ │ │
│ Concept Resolution (D1: Hybrid 5-arm fusion) + │
│ Retrieval (FTS+Graph+Vector → RRF) · Governance │
│ CodeGraph (facts) · Development Guide (context) │
│ Wiki = rebuildable projection of KS (D1b) │
│ Context Compiler · Impact · Continuous Evolution │
└─────────────────────────────────────────────────────┘
▼
SQLite (KS + CodeGraph + indexes) → .project-brain/
```
## What changed in v8.0 (vs the old v5-v7 "Markdown IS the knowledge state")
v8.0 **reversed** v7.0/v7.1: the SQLite **Knowledge State** (`ks_*` tables) is
again the source of truth; the wiki is demoted to a **rebuildable projection**
that is regenerated from the KS (never authored directly — `wiki.write`/
`wiki.create` are gone). Five locked decisions govern this:
1. **Wiki projection defaults OFF** — old wiki files are preserved read-only
until a project opts in via `wiki.generate`/`wiki regenerate`.
2. **Seed inputs = CodeGraph + Guide + repo docs, never wiki** — prevents the
seed↔wiki drift loop (bootstrap design §18).
3. **No `wiki.write`** — wiki updates are regeneration (overwrite, not patch),
so the file can never disagree with the KS.
4. **Engine is zero-LLM (§29)** — all semantic work (claim extraction, concept
discovery) is Claude's, done through MCP; the engine only persists + state.
5. **Outputs live in `.project-brain/`** (no new `.cpb/` directory).
阶段 9 adds the **Continuous Evolution** reality loop: external reality (a user
statement / document / test result) enters as a typed intake event, is linked to
the Knowledge Delta that reconciles it, and derived views (wiki/guide) are
invalidated. See [`docs/update8.0.md`](docs/update8.0.md) 阶段 9.
## What changed in v10.0 (Knowledge Quality)
v10.0 shifts the focus from feature completion to **knowledge quality /
evolution optimization** — does CPB's knowledge actually get better the longer a
project runs? (See [`docs/update10.0.md`](docs/update10.0.md).) Two landed tracks:
- **P0 — Knowledge Quality Benchmark** (§3): a deterministic, zero-LLM harness
(`project.benchmark` / `cpb benchmark`) that compiles context for a task and
compares it against human-authored expected ground truth across 7 metrics
(precision / recall / completeness / redundancy / tokenCost /
conflictCoverage / impactAccuracy). A regression net for the recall engine.
- **P1 — Consolidation / Pattern + Knowledge Scoring** (§5-§8): the engine
deterministically clusters recurring evidence (frequency ≥ 3) into candidate
**Patterns** (`evolution.patterns` / `evolution.promote_pattern`) — the middle
state of the learning loop (Event → Evidence → **Pattern** → Claim → Rule).
Per the §29 boundary contract the engine only *detects* candidates; Claude
*promotes* a Pattern to a Rule/Decision via a Knowledge Delta. Knowledge
scoring splits semantic **importance** (Claude-set) from **activity**
(`usage_count` / `last_accessed_at`, bumped on context compilation) and
combines them into a weighted score + HOT/WARM/COLD tier (scoring only this
version; physical tiering deferred).
## What changed in v11.0 (Double-Layer API + Knowledge Transaction + Layered Knowledge Model)
v11.0 lands all three decisions from [`update11.0.md`](docs/update11.0.md) §21 in one
iteration. The overarching theme (update11.0 §2): **a vector store is a recall arm,
not a knowledge system** — the correct architecture is
`Query → Concept Resolution + Retrieval (FTS+Graph+Vector) → Fusion → Ranking → Context Compiler`.
- **D1 — Alias/Vocabulary layer + Hybrid Concept Resolution (§2).** Concepts gain
aliases (`ks_concept_aliases`, migration v20, case-insensitive + source provenance).
`resolveConcepts` fuses **five arms** — exact (1.0) / alias (0.8) / fts (0.5) /
graph (0.5) / vector (0.3) — by Σ weight, dedup + sort. The Context Compiler's
concept classifier now augments exact/symbol matches with hybrid resolution.
Without a vector provider it degrades to four arms — zero breakage. Tools
`concept.resolve` / `concept.alias`; CLI `cpb resolve`.
- **D2 — Intent-level `cpb.*` MCP + Knowledge Transaction API (§7-§11).** The MCP
surface gains **8 high-level `cpb.*` tools** (search/context/inspect_concept/
impact/propose/record/conflicts/history) **on top of the 63 preserved atomic
tools** — an MCP tool is an *Agent interface*, not an internal API interface.
`cpb.propose` runs a two-phase **Knowledge Transaction**: `dryRun` previews the
predicted validation tier + gate + affected concepts + known conflicts without
writing; `commit` records a delta and applies it (auto tier) or holds it for
approval (review/manual). Claude expresses *what should change*
(`ChangeIntent[]`); CPB runs the deterministic governance
(resolve → impact → conflict → validation → delta). New `create_claim`
DeltaOpType. This addresses weak-model tool-calling instability: the LLM only
expresses intent, CPB runs governance.
- **D3 — Layered Knowledge Model (§14-§18).** **Structured Core**
(requirement/design/decision/rule/... — manual/review governance) +
**Soft Knowledge** (preference/heuristic/practice/observation — auto tier, scoped,
flows lighter) + **Open Vocabulary** + **Closed Governance**. "The vocabulary may
open; the governance stays controlled." `ks_entities` gains a `scope` column
(migration v21). `classifyValidationTier` now applies a governance tier floor: a
Structured Core type never classifies below its floor; a soft type's semantic-shift
op (modified/weakened/contradicted) skips the review escalation (the D3 relaxation);
lifecycle ops (supersede/deprecate/dispute) still bind all types. Tool
`knowledge.types`.
**§16 respected**: core Event/Delta/Schema/Ontology/Version contracts unchanged; the
63 atomic tools are all preserved; additions are incremental non-breaking. **§29
respected**: aliases are Claude-declared, governance rules are deterministic, the
engine calls no LLM/embedding. schema_version 19→21; tools 61→72 / 10 namespaces;
eg-test 410→447 + mcp-test 43→55.
P5 (external embedding models, ANN index, fusion into Context Compiler, plus
cpb.* further consolidation) remains deferred — see [`docs/TODO.md`](docs/TODO.md).
## What changed in v12.0 (Architecture Convergence)
v12.0 turns from "feature-complete" to "complexity-to-value". The engine does not
gain features; it converges so the complexity already there pays for itself, and
starts to *prove* it does. Design source: [`docs/update12.0.md`](docs/update12.0.md).
- **A1 Tool Visibility Profiles** — the 72 atomic tools (§16, all preserved) are
filtered by *profile* at MCP registration. `default` exposes the 8 intent-layer
`cpb.*` + a 6-tool read face (14 total); `advanced` exposes all 72. "Retaining 63
tools is not the problem; letting the Agent see 63 tools is." Set via `CPB_TOOLS`
env or `config.yaml` `tools.profile`. The contract is unchanged — only what a
working session *sees* narrows.
- **A2 Three Object Layers** — KS objects are explicitly Knowledge (durable truth:
entities/claims/…), Governance (lifecycle mechanisms — evidence/delta/conflict —
*not* knowledge), and Runtime (incidental: intake events/patterns). Surfaced by
`knowledge.types` so "everything is a KS first-class citizen" doesn't collapse
long-term knowledge with the mechanisms that govern it.
- **A3 Soft Knowledge expiry** — soft knowledge (preference/heuristic/practice/
observation) carries a review horizon (`review_after_days`, default 90; migration
v22). The Context Compiler downgrades a due entity to `optional` + `[needs review]`
and ranks KS entities by Knowledge Score. **Soft nudge, not a status flip** (§20
terminal-state semantics untouched). Structured Core never expires.
- **A4 Task-dependent Context Routing** — `compileContext` classifies the task intent
(bugfix/exploration/architecture/feature/default, deterministic §29) and the **wiki
layer is opt-in (default OFF)** — it is a rebuildable projection, not a required
context layer. Load it only when the task asks for docs/history. Semantic change →
protocol bump 12.
- **B Agent Benchmark scaffold** — Level 2 (context quality: `missingCritical` /
`wikiOverlap` / `routingCorrectness`) + Level 3 harness (`AgentTask`/`RunConfig`/
`RunResult` + `compareRuns`). Level 3 is protocol-only this round (no LLM
execution); see [`docs/DOGFOOD.md`](docs/DOGFOOD.md) for the live dogfood process.
**§16 respected**: 72 atomic tools retained (visibility only); core contracts
unchanged; additions incremental. **§29 respected**: profiles/freshness/router all
deterministic. schema_version 21→22; tools 72 (unchanged — profile is a visibility
dimension); eg-test 423→462 + mcp-test 47→55.
Frozen (update12.0 §23): Structural Candidate, physical HOT/WARM/COLD, standalone
Vector DB, auto Conversation Classification, auto Rule promotion, Context Cache,
external Embedding (await Benchmark proof). See [`docs/TODO.md`](docs/TODO.md).
## What changed in v10.1 (Retrieval Abstraction)
v10.1 lands **P2** from the update10.0 roadmap (§9/§10/§11): vector/embedding
as an **optional retrieval adapter, OFF by default**. The retrieval pipeline
becomes three arms — **FTS5 + Graph + Vector → RRF fusion → ranking**
(Reciprocal Rank Fusion, k=60; `score = Σ 1/(60+rank)`, dual-arm hits rank
highest; pure arithmetic, no cross-provider score calibration).
- **Pluggable `EmbeddingProvider`** (synchronous — the engine is fully sync):
the built-in `local-bow` is a deterministic token-bag hash projection (256-dim,
model-free, no network) that keeps the pipeline testable while preserving the
**§29 zero-LLM** boundary. Real embedding models inject via `config.yaml`
(async external providers are deferred to P5, since they'd break the sync
facade).
- **Semantic objects only**: embeddings cover knowledge entities
(requirement / design / decision / constraint / rule / observation,
importance ≠ low); **code symbols stay FTS + Graph** (§11). A `text_hash`
cache skips unchanged text. With no provider configured, `hybridSearch`
degrades to pure FTS5 — zero breakage.
- Tools: `knowledge.search` gains a `semantic` flag; new
`evolution.semantic_search` / `evolution.semantic_reindex`. CLI:
`cpb ksearch --semantic` / `cpb index-semantic`.
P5 (external network embedding models, ANN index via sqlite-vec, fusion into
Context Compiler, plus Document Diff, Conversation Classification, Context
Cache, physical HOT/WARM/COLD, Structural Candidate) remains deferred — see
[`docs/TODO.md`](docs/TODO.md).
## The core assets
- **Knowledge State** (`ks_*` tables) — *Truth*. Entities (requirements /
decisions / constraints / …), Claims (S+P+O triples), Evidence
(supports / verifies / contradicts), Relations (controlled ontology), Deltas
(the change protocol), intake events (reality loop). Revision-numbered,
optimistic concurrency.
- **Development Guide** (`guide/`) — *Context*. An Agent Context Map:
`index.md` is the project map that compiles to `index.compact.md` (L0
briefing). Code Anchors keep it honest against CodeGraph.
- **CodeGraph** — *Facts*. tree-sitter-parsed symbols + call/reference edges.
The ground truth that verifies Guide anchors and feeds impact analysis.
- **Wiki** (`.project-brain/wiki/`) — *Projection*. Regenerated from the KS on
demand; never the truth. Typed pages (requirement / bug / decision / …).
The **Concept hub** (`ks_concepts`, with a `parent_id` hierarchy) is the stable
semantic coordinate that ties entities, code symbols, guide sections and wiki
pages together — so a code change traces `symbol → concept → guide section` and
flags the guide stale.
## The governed loop + continuous evolution
```
Code change → Impact → affected concepts → Knowledge Delta (draft)
→ validate → approve → apply → KS → invalidate wiki/guide
Reality (user/doc/test) → intake event → [Claude drafts] → Delta → apply → completed
```
A code change reaches a concept and creates a **draft delta** with empty
operations; Claude fills the semantic operations (`project.propose_delta`), then
the proposal is validated/approved/applied. Direct KS writes
(`knowledge.create` etc.) are allowed as a low-friction path but each records an
**implicit delta** (auditable) and triggers invalidation (§45.2 soft gate).
## Quick start
```bash
# inside a code repository
cpb init # create .project-brain/ + guide skeleton + bootstrap brief
cpb index # build codegraph + guide + wiki + git indexes
cpb knowledge seed # seed Knowledge State from guide + codegraph (deterministic)
cpb status # summary: engine/protocol/guide/stale anchors/KS counts
cpb context CameraDevice # ContextPlan (Guide → KS → wiki → Code)
cpb knowledge concepts # list registered concepts
cpb wiki generate camera/capture-pipeline # regenerate a concept's wiki page from KS
cpb impact CameraDevice # blast radius + affected concepts/guide
cpb sync # detect changes → draft proposals (with deltas)
cpb proposals # list / validate / approve / apply / reject
# Continuous Evolution (阶段 9)
cpb talk "The encoder must never block capture" # ingest a user statement → event
cpb ingest docs/spec.md # ingest a document → doc evidence
cpb events # list intake events (the reality queue)
# Knowledge Quality (v10.0)
cpb consolidate # scan recurring evidence → candidate Patterns
cpb patterns # list Patterns (candidate / promoted)
cpb benchmark # run the quality benchmark (7 metrics regression net)
```
> If `cpb` is not on PATH, use `node dist/bin/cpb.js …` (after `npm run build`)
> or `npx tsx bin/cpb.ts …`.
## MCP (the AI interface) — 72 namespaced tools / 10 namespaces
**Intent layer (v11.0 D2)** — high-level front door over the atomic tools; LLM
expresses intent, CPB runs governance:
- `cpb.*` — search / context / inspect_concept / impact / propose / record / conflicts / history
**Atomic layer (63, all preserved)**:
- `code.*` — search / symbol / callers / callees / dependencies / impact
- `docs.*` — get / search / constraints / validate / apply (wiki knowledge pages)
- `kb.*` — search / requirement / bug / decision (typed wiki records)
- `wiki.*` — read / search / index / related / generate / log / stale
- `guide.*` — index / compact / current / topic / navigation / section / stale / validate
- `concept.*` — register / overview / link / forSymbol / resolve (D1) / alias (D1)
- `knowledge.*` — create / claim / evidence / search / neighbors / relation / delta / history / types (D3)
- `project.*` — context / impact / changes / sync / proposals / propose_delta / status / benchmark
- `evolution.*` — ingest_user / ingest_document / ingest_test / events / event / patterns / promote_pattern / semantic_search / semantic_reindex
Full tool reference: [`docs/USAGE.md`](docs/USAGE.md).
Architecture tour: [`docs/OVERVIEW.md`](docs/OVERVIEW.md).
## As a Claude Code Plugin
CPB ships as a **Claude Code plugin** (`cpb-claude-plugin/`) — the adapter layer
over the Engine. The Engine (`cpb`/`cpb-mcp` CLI) stays a standalone runtime; the
plugin binds via MCP, so the Engine evolves independently. See
[`cpb-claude-plugin/README.md`](cpb-claude-plugin/README.md) for install steps.
```bash
# 1. Engine on PATH (once)
npm install -g @cpb/engine # or: npm link (from this repo)
# 2. In Claude Code
/plugin marketplace add /path/to/CPB
/plugin install cpb@cpb
```
Then `/cpb:status`, `/cpb:context`, `/cpb:sync`, … — or describe the task and
the skills auto-activate.
## The demo project
`demo-src/camera/` is a small C++ camera pipeline (`CameraDevice →
FrameQueue → VideoEncoder`) with a full Guide (`guide/`: overview + architecture
+ a constraint + an ADR). It is dogfood: CPB indexes, seeds the Knowledge State,
generates wiki, drift-checks, and runs the change→delta loop on it.
## Layout
```
src/
core/ types + version (12.0.0 / protocol 12)
db/ sqlite adapter + schema.sql + migrate.ts (v22 latest)
engine/
knowledge-state/ KS core: store/concept/query/delta/seed/ontology/internal/version
+ alias (D1) / resolve (D1 Hybrid Concept Resolution) / freshness (A3 review-due) (truth, ks_* tables)
evolution/ Continuous Evolution: event/intake/invalidation/conflict/health/consolidation (reality loop + conflict + health + Pattern learning)
codegraph/ tree-sitter extractor, grammars, parser, orchestrator, queries, watcher
guide/ Development Guide: indexer/anchor/query/validator/parser/compact
wiki/ wiki projection (regenerate from KS) + indexer/query/store/log/freshness/model
knowledge/ frontmatter / freshness (drift) / recall (doc search) / docupdate
docs/ structured reads: constraints/decisions/requirements (read guide+wiki)
context/ Context Compiler + explain + explore-view + router (A4 task intent routing)
impact/ blast radius + affected concepts/guide (→ deltas) + scoring (knowledge quality score/HOT-WARM-COLD)
quality/ knowledge quality benchmark (compileContext vs expected → 7 metrics, zero-LLM) + context-benchmark (A2/B Level 2) + agent-harness (B Level 3 scaffold)
sync/ semantic-diff / changeset / proposal / pipeline (change→delta loop)
retrieval/ v10.1 P2: embedding (Provider abstraction + local-bow) / index (semantic index) / fusion (RRF hybrid)
bootstrap/ probe.ts (deterministic bootstrap brief, §29 zero-LLM)
git/ commit index + ADR mining
transaction.ts v11.0 D2: Knowledge Transaction (dryRun/commit facade over applyDelta)
api.ts unified facade (CLI + MCP share this)
staleness.ts self-heal (ensureFresh) before queries
app.ts / config.ts openBrain / paths / findProjectRoot
mcp/ 72 tools / 10 namespaces (8 cpb.* intent + 64 atomic) + stdio server (profile-filtered since v12) + profiles.ts (A1 visibility)
bin/cpb.ts CLI · bin/cpb-mcp.ts MCP server
cpb-claude-plugin/ the Claude Code adapter (skills + commands + MCP declaration)
demo-src/camera/ the dogfood demo (C++ pipeline + guide)
docs/ design docs + update8.0.md + update10.0.md (impl record) + OVERVIEW/USAGE + old/ (pre-8.0 history)
```
## Design boundaries (§19/§23/§25/§29)
Not built: auto-rewriting all docs, auto-generating all knowledge, a full IDE,
or an enterprise knowledge graph. Semantic/vector retrieval exists as an
**optional adapter, OFF by default** (v10.1 P2) — local-first SQLite+FTS5 is the
default, and the built-in `local-bow` provider is deterministic and model-free.
The engine never calls an LLM/embedding model (§29) — Claude thinks via MCP; the
engine holds facts and the state machine. Knowledge stays human-controlled; the
Guide is a governed asset — every edit goes through a Proposal/Delta. Code is the
highest source of truth (§9). Wiki is a disposable projection (§45.6).
## License
MIT.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues