Repository navigation
v0.9.31 — one-voice skills, sharper search, smear detection
Skills collapsed to one voice
kg-capture and kg-recall folded into kg-core, following the context-engineering shift for Claude-5-generation models: judgment-based instincts over rule lists, no doctrine repeated across layers (tool mechanics live only in the kg_* tool descriptions; the session protocol only in the preload header). Always-loaded skill text drops ~60%. A sandboxed A/B bench (Sonnet, 21 runs) confirmed equal task outcomes at about half the output tokens, with zero unnecessary searching. The description's longest instinct is deliberately search below the surface — a rich graph buries needed facts under fresher work, and a node found when truly needed earns the usefulness credit that keeps it alive.
Search core sees more and weighs better
Shared by kg_search and ambient recall: tokens contribute their ./_- subtokens, terms match through a light stem (schedule ≈ scheduling), adjacent subtokens form bigram terms with their own co-occurrence IDF, occurrences are field-weighted (id ×3, gist ×2, notes ×1 — a node about a concept outranks one that mentions it in passing), and IDF is sharpened so one term naming the right node isn't outvoted by several dull ones. Recall additionally gates on evidence (corroborated, near-unique, or named by the node's id/gist — lexical strays stay silent) and injects hits sharpest-first.
Write-side nudges
Creating a node probes its id + gist against its own graph through the same pipeline. A near-duplicate gets named with a fold-in suggestion; a gist that re-describes an entity the graph already names gets "an edge to it beats re-describing." Nudges only — the write always proceeds.
Smear detection and entity consolidation
Why search kept missing "project-central" vocabulary: chronicle-style capture re-describes entities in prose until IDF sees a saga, not a signal. The DEBT: line now reports smeared terms (term×count→hub), and /kg-maintain gains category 1: consolidate exactly one smeared entity per pass — durable facts into the hub, satellites reduced to their delta plus an edge. Capture doctrine gains the matching instinct: name things once.
Fixed
source=fork(and any future SessionStart source) now recovers the KG session from transcript markers instead of re-preloading on top of inherited context — onlyclearhard-resets.
Tests: tests/test_v0931.py (31 assertions); full suite green. Retuning validated by an offline replay of two weeks of real session prompts against real graphs.