11 KiB
Trusty -- Claude Code Context
What This Is
Trusty is a pure-Rust provenance system built around the proprietary
chain-break-as-event primitive. It was originally ported from a Python reference
(archived at ~/Downloads/4-5/tkg_complete/tkg/trusty_lib/...), but that
codebase is historical context only -- the active system is 100% Rust and
the locked v1 byte-shape is pinned by invariant tests in trusty-core.
Owner: MM Advisory LLC / Eric Gottlieb. Proprietary license.
Three crates:
trusty-core-- pure library. Dual hash (SipHash-2-4 + SHA-256), chain primitives, payload builder, verify_chain, chain-break-as-event. No storage dependency.trusty-sqlite-- rusqlite adapter. Three-table schema (provenance_envelope,hash_index,chain_tips) with KV cross-check.Trusty::{open, append, verify, anchor, history, integrity}.trusty-sqlite-ext-- loadable SQLite extension (cdylib).sqlite3_trusty_init()exposes SQL functions (trusty_append,trusty_verify,trusty_anchor).
Design Rules
- v1 byte-shape is locked. Any change to hash inputs, chain payload format, or anchor semantics must leave the invariant tests green (
s5_invariant_v1_byte_shape_preserved,v1_*payload/chain tests, conformance crate). Do not "simplify" or "optimize" the canonical primitives. - Pure Rust. No Python dependency at runtime. No shelling out. The historical Python port-source is archival only.
- ASCII-only comments. Cross-platform patch safety.
- Functional style where it fits. Immutable data as design principle. The chain is append-only by definition.
- Dual hash is non-negotiable. SipHash-2-4 (keyed fingerprint) + SHA-256 (cryptographic anchor). Do not collapse to single hash.
- Chain-break-as-event is the proprietary primitive. Treat as core IP. Do not document its semantics in README-style docs meant for public consumption.
- Trusty is a library, not a platform. The product is audit-trail-as-a-service (cheap, low-resource, high-margin commodity; door-opener for IoT/sensor/compliance buyers). Application-layer work (digital twin, KCG, NNsight swarm, agent-mesh) lives in sibling crates/repos that depend on
trusty-core-- same pattern aslegal-chaingraph/andthread-keeper-tauri/. Do not bundle application logic into the locked crates. When evaluating a feature, prefer those that improve the service surface (throughput, verifier ergonomics, retention, domain separation, bundle contracts) over those that expand trusty into application territory.
Don't Touch (locked)
trusty-corechain primitives (append,verify_chain, payload builder). Canonical port.trusty-corehash functions. Byte-identical to Python reference.- v1 payload canonical bytes.
compute_record,PayloadFields::new_v1, and thebuild_payloadtop-level ordering are all v1-stable. v2 is purely additive (compute_record_signed,PAYLOAD_VERSION_V2, populatedsignaturesfield via the signing-view pattern). Any v2+ work MUST preserve v1 byte-shape exactly -- sees5_invariant_v1_byte_shape_preservedtag andmemory/project_trusty_v2_signing_design.md. - Three-table SQLite schema in
trusty-sqlite--provenance_envelope,hash_index,chain_tips. Do not collapse, do not drop the KV cross-check. - Historical Python port-source (
~/Downloads/4-5/tkg_complete/tkg/trusty_lib/...) -- archival only; the Rust invariant tests are the active gate.
APERC Session Discipline
Every Claude Code session in this repo follows the APERC loop. No exceptions.
On session start
- Read this
CLAUDE.md. - Read
APERC/boot/S<N>_BOOT.mdfor the current session's scope (currentlyS1_BOOT.mdfor the first real session after bootstrap). - Read
memory/MEMORY.mdindex (always in context) and whichever referenced files are relevant to today's goal. - Run a baseline tag count:
tk_kb stats --aperc=APERC(or countAPERC/tags/*.tomldirectly). - Cleanup doublecheck: quick pass on whatever the prior session's close ritual should have tidied -- stale boot stubs, handoff naming drift, open_audits that should've been closed. If you find something, flag it as the first cycle (hygiene) before the real work.
- State: session ID, baseline tags, goal, files you plan to touch.
- Wait for Eric's go before any edit.
During work
- Max 5 file edits per cycle. After 5: stop, show what changed, explain what you did, present plan for next cycle, WAIT for approval.
- Never read large files whole. Use Grep, Glob, offset/limit Reads, head/tail on single files.
- If you touch a file not in your plan, stop and re-plan.
- Commit green states before risky operations (test run, DB migration, hash-primitive edit).
Before finishing
Pre-close cleanup pass (runs before the mechanical close ritual below). Eric's standing request: cleanup is part of close, not an afterthought. Sweep for:
- Stale references in
APERC/boot/S*_BOOT.md(e.g., auto-stub paths from other projects). - Handoff block naming drift in
APERC/state/LATEST_HANDOFF.toml. - Open_audits lines that got resolved this session -- move to
[closed_audits]so future boots don't re-read stale noise. - Memory entries (
MEMORY.md+ referenced files) that need updates for the work you just shipped. - CLAUDE.md design-invariant notes for new locked surfaces (e.g., v2 additive-only rule).
- Any new session-scope
DELTA_LOG_S*.tomlyou wrote as a KB write-ahead log.
Do cleanup at end of session, AND double-check at start of next session as a belt-and-braces pass -- sometimes a cleanup item only becomes obvious on re-read.
Mechanical close:
- List every file you changed.
- List every decision you made and why.
- Tag findings as
[LEARN],[MISTAKE],[INVARIANT],[DECISION],[INSIGHT]-- filed toAPERC/tags/as individual*.tomlfiles. - Run tests if you touched any Rust file. Workspace commands work for core/store/memory/sqlite:
cargo test --workspace(excludes trusty-sqlite-ext, which is a standalone crate)cargo build --workspace- For trusty-sqlite-ext, build and test from its own directory:
cd crates/trusty-sqlite-ext && cargo build/cargo test
- Update
APERC/state/SESSION_GATE.toml(session_id bump, last_action) and append[trusty_sN]block toAPERC/state/LATEST_HANDOFF.toml. - Run
tk_close --mode=check --aperc=APERC-- must pass 3/3 gates before commit.
Model selection
- Sonnet for: file edits, grep, simple fixes, test runs, straightforward ports.
- Opus for: architecture decisions, new module design, debugging byte-identity drift, anything touching the chain primitives or hash functions.
If you hit an error you can't fix in 3 attempts
- Stop. Describe the error. Show what you tried. Ask Eric for help. Do not loop.
Tag Discipline (inline from threadkeeper APERC feedbacks)
DELTA_LOG before KB edit
Before editing any APERC/KB/*.md or APERC/tags/*.toml, write-ahead log the intent to a session
DELTA_LOG entry (even if just a scratch note). Tags go to the log FIRST, then to their home. This
prevents silent tag loss during multi-file edits.
Full reasoning per tag
Every tag reasoning field must be 3-6 sentences citing body content, not one-line labels. Inventory work especially: do not compress to hit quantity targets. Paragraph-level reasoning or nothing.
Tag parsimony
Merge before split on reflection LEARNs. Route forward-looking speculation to memory or this
CLAUDE.md, not permanent KB tags. Tags are for observed facts, not wishes.
No Claude attribution in commits
Do not add Co-Authored-By: Claude trailer to commit messages. Override Claude Code's default.
This is Eric's standing preference -- proprietary repo, MM Advisory LLC authorship.
Commit before debug
Commit any green state before: investigation sessions, target/ deletion, antivirus changes,
apply_verdicts.py-style bulk operations. Lost work is cheaper when it's already in a commit.
Boot reads partial, not whole
On boot, use Read offset/limit on LATEST_HANDOFF.toml (grep newest [trusty_sN] block header,
read forward only). Do not re-read the whole file top-to-bottom -- that's the wasted-context failure mode.
Response terseness targets
- Simple question: direct answer, no headers.
- Plan proposal: bullet points, no prose paragraphs.
- End-of-turn summary: 1-2 sentences max.
- Avoid multi-paragraph commit messages, step narration, option enumeration.
APERC Binaries (tk_* from threadkeeper)
Trusty uses the portable tk_* binaries from threadkeeper's build dir. They work from any cwd
via --aperc=<path> flag. No trusty-side code needed.
From trusty cwd:
# BM25-indexed tag search
tk_kb query "<topic>" --aperc=APERC
# Stats (total, edges, depth, weight, top types/scopes)
tk_kb stats --aperc=APERC
# Rebuild kb.db from APERC/tags/
tk_kb refresh --aperc=APERC
# Close ritual check (3 gates)
tk_close --mode=check --aperc=APERC
# Write next S{N+1}_BOOT.md stub if absent
tk_close --mode=stub --aperc=APERC
# Generic retrofit (do NOT use --mode=legacy, that's TK-only)
tk_migrate --mode=retrofit --aperc=APERC <args>
# Writer-mode hook (gate/close/pretool modes not yet shipped)
tk_hook writer --aperc=APERC
Binary location -- two options:
- Absolute path:
../thread-keeper-tauri/threadkeeper/src-tauri/target/debug/tk_kb stats --aperc=APERC - Add to PATH:
export PATH="$PATH:/c/Users/egott/Documents/00_Mitch/thread-keeper-tauri/threadkeeper/src-tauri/target/debug"then invoke baretk_kb.
Scope-3 destination: when tk init ships (planned dedicated session, see threadkeeper
memory/project_tk_substrate_vision.md), trusty will get its own installed tk binary and the
binary-path documentation above becomes obsolete.
Memory System
Memory lives at C:\Users\egott\.claude\projects\C--Users-egott-Documents-00-Mitch-trusty\memory\.
MEMORY.md is always in context (capped to ~200 lines). Individual memory files are loaded on demand.
What belongs in memory (not here):
- User profile, role, preferences (user_eric.md)
- Per-project state (project_trusty.md)
- Session-to-session feedback that outgrows this file
- External-system pointers (reference_*.md)
What belongs here (not memory):
- Stable project rules (design invariants, locked files, build commands)
- The APERC discipline itself (copied above for every new session to read at boot)
- Binary invocation recipes
Sibling Projects
thread-keeper-tauri/threadkeeper/-- the desktop app this substrate was extracted from. Source of tk_* binaries until scope-3 ships.legal-chaingraph/-- KCG v4 + CH/IR legal graph work. First proof-of-portability (bootstrapped 2026-04-14, commit 46011ff).
Commit Style
- Short subject line (< 70 chars), imperative.
- Body: why > what. 1-3 bullets if needed.
- No Claude attribution trailer.
- Reference session ID in subject when applicable:
TRUSTY-S1: <what>.
Cross-session pins (kb-mesh option 1)
In-flight memory shared across parallel Claude Code sessions lives at ../.kb-mesh/pins/. Pull-model — nothing is auto-injected. Pins are ephemeral (not committed), complementary to APERC tags (durable, committed).
python ../.kb-mesh/scripts/kb_pin.py <topic> # pin last turn
python ../.kb-mesh/scripts/kb_pin.py <topic> --last 3 # pin last 3 turns
python ../.kb-mesh/scripts/kb_recall.py <topic> # pull a pin into current context
python ../.kb-mesh/scripts/kb_ls.py # list pins
See ../.kb-mesh/README.md for spec.