Graft keeps a derived, disposable code graph in sync with a content hash
rather than a calendar, and keeps a protected block on every regenerated
node. This KB is the opposite kind of store — durable, curated, built from
material that cannot be regenerated — but several of Graft's mechanisms
port cleanly, and two of them close real gaps here.
Schema 1.5 is additive: every 1.4 page remains valid.
1. `## Crux` — verbatim source excerpts alongside the synthesis. A summary
can drift silently; a quote either still matches its source or it does
not. Lets `ckb-retrieve` ground an answer without a round-trip to the
archive, and makes drift mechanically detectable.
2. `## Notes` — human-authored and protected everywhere. Closes a real
gap: `ckb-index-external` regenerates connector pages wholesale, so an
annotation written there was previously destroyed on the next refresh.
3. `source_fingerprint`/`source_checked` — a digest of the material a page
was built from. Freshness by date says a page has aged; a fingerprint
says whether its evidence moved. Most valuable for connector-backed
libs, where documents change with no notice.
4. `lint_report.py --quick` — a deterministic one-line session-start
signal, wired into Rule E next to the existing `git status` check.
5. In-degree as a rank-fusion signal in `ckb-retrieve`, weighted below 1.0:
centrality is a prior, not evidence.
6. Blast radius — a new `ckb-ingest` step walking the graph backwards from
touched entities to find what the incoming material contradicts, before
writing anything. Ingest was additive-first, which is how a wiki
accumulates two pages that quietly disagree.
7. Edge vocabulary in `wiki/graph/index.md` rewritten as a question per
verb, and completed: `part_of` was written by `ckb-code-map` but never
declared. Added `produces`, `configures`, `validates`, `implements`.
Lint gains checks 12 (fingerprint drift), 13 (crux verbatimness) and 14
(the protected-Notes rule), verified against a synthetic fixture covering
stale digests, missing sources, fabricated quotes and paraphrased evidence.
Not adopted: the gitignored regenerable store, the MCP server and CLI
daemon, tree-sitter parsing, statusline hooks, telemetry.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ckb-index-external now goes beyond one page per document: it also
extracts people, organizations, projects, decisions, systems, and
processes each document discusses into thin, pointer-style entity
pages within the connector's own index (evidence back to source
documents, deferring to a full wiki/entities/ page where one already
exists), so the index supports "what do we know about X" lookups, not
just "what documents exist here".
New ckb-retrieve skill formalizes the retrieval half of the query
workflow: before grounding an answer in a page's tldr, follow it back
to its underlying source (a wiki page's Sources citations, or a
connector page's resource: pointer) rather than trusting the
compressed index entry as settled.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Spell out explicitly, per run: check whether the shared index store
already has a published index; if so, fetch it regardless of access
level; a write-access user always continues to rebuild and publish
back to that same store, and this is precisely what creates it there
the first time the store is empty. A read-only user never rebuilds or
publishes anything, whether or not the store already had content.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
source.yaml gains an optional index: block declaring where an
already-built index lives (a git repo or a shared resource), so a
user can fetch it instead of scanning the live connector from
scratch. Whether a given user may actually rebuild/publish an index
is now a local, per-user, gitignored source.local.yaml (access:
write|read) that defaults to read-only, letting a team designate one
or two admins per external source instead of everyone redundantly
re-indexing it. ckb-lint's checks against a connector's generated
index now respect the same read/write gate.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
libs/<name>/ now supports a second population mode alongside git-copy
clones: a user-authored source.yaml declares a live external source
(SharePoint, Google Drive, a plain URL, or another connector), and the
new ckb-index-external skill builds a self-contained generated index
for it (index.md/entities/graph/log.md), scoped entirely to that
connector and never blended into the main wiki/.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>