Work here happens in stable work blocks: stretches that survive interruption and can be picked up cold. The agent's half of that promise is mechanical - a resume pointer written to disk before anything risky, an append-only journal as the source of truth, task checkpoints that name their evidence, and one ritual that seals each block. Your half is a single page called the console, which watches without interrupting.
| Module | What it does | Writes to | Network |
|---|---|---|---|
| 5 hooks | heartbeat each turn, resume block at session start, event capture, a policy gate on writes, JSON validation on writes | local: .claude/state/, the record folder |
none |
| 7 tools | continuity, observation, map, console build, ritual runner, distribution - bash + python3 stdlib, zero pip packages | local: .claude/, .claude-iff/, the record folder |
none |
| console | one HTML page + a tiny server | reads only; buttons emit commands for you to paste | 127.0.0.1 only |
| 3 agents | anatomist (map), retro-analyst (evolution proposals), verifier (claim checking) - run inside Claude Code | governed by the policy gate | via Claude Code |
obsctl analyze | optional: labels the record with an LLM you configure. Off until you configure it. | local: the record's analysis/ |
only if you enable it |
Three truths, stated plainly - then the risk map below turns them into exact file locations and what each one is safe to share.
obsctl analyze, which is off by default and only ever talks to
the endpoint you configure - and with a local Ollama endpoint, even that never
leaves your machine. API keys live in your environment or a gitignored .env,
never in a committed file, and the tests prove a key placed in config is ignored.git push can therefore never publish
a prompt, a file body, or a secret from the record - and a CHECK-phase gate fails the
ritual if any committed file so much as names your home directory.# the only network call site in the whole system (analyze, opt-in):
grep -rn "urllib.request" .claude/tools/ .claude/hooks/
# what the hooks are wired to do:
cat .claude/settings.json
# the redaction allowlist that gates what can ever be committed:
python3 -c "import json; print(json.load(open('.claude/config/observe.json'))['seal_allowlist'])"
# the test suite, including the secrets-never-reach-segments proofs:
python3 .claude/tools/tests/run_tests.py
Claude Code will also ask you once whether to trust this project's hooks before
running any of them - nothing here executes until you say yes.Three places hold your data, with three very different sensitivities. Read the colors: safe to push is committed by design, contains your words is committed but carries text you wrote, and never share holds verbatim history that no push can reach - but a zip, a screen share, or a copied folder can.
your-repo/ safe to push ├─ .claude/ the system: tools, hooks, skills, config │ ├─ state/journal.jsonl contains your words pointers and notes you typed │ ├─ state/needs-human.jsonl contains your words questions, context, your answers │ ├─ Project-log.jsonl contains your words decisions and summaries │ └─ everything else safe to push code, config, protocols, map cards ├─ .claude-iff/ safe to push allowlisted totals + integrity anchor only └─ .env never share gitignored; machine paths, keys your-repo_claude_iff/ (sibling folder - git cannot reach it) ├─ spool/ · sealed-raw/ never share VERBATIM: prompts, file contents, tool output ├─ raw/transcripts/ never share full conversation copies ├─ vault/ never share whole-repo + chat snapshots ├─ analysis/ contains your words model-written summaries of raw events └─ segments/ metadata only allowlisted: names, times, counts ~/.claude/ (Claude Code's own home - not this system's, but part of your history) └─ projects/<your-repos>/ never share every conversation, verbatim, per project
What this means in practice:
git push is structurally safe. The record and the chat history sit
outside the repo, so no push can carry them - and a CHECK gate fails the build if a
committed file even names your home directory. The residual risk in a push is the
contains your words tier: whatever you typed into
pointers, notes, questions and answers IS committed and travels with the repo. Keep
secrets out of free text; the system cannot redact what you chose to write there.your-repo_claude_iff/ - which holds everything verbatim, forever, on purpose.
Treat that folder like a private diary that happens to sit next to your repo.~/.claude/projects/ keeps full
conversations for every repo you have worked in. Anyone with this machine's user account
can read them; cloud-sync of your home directory uploads them. That is Claude Code's
normal behavior - this system just makes it visible instead of leaving it forgotten.python3 .claude/tools/obsctl.py size shows what the record holds, and the
ritual's CHECK phase reports it every run.