06 — Collaboration and Memory
Commandments VI and X: how we work together and how we keep from losing context.
Collaboration style (user + Claude)
- Plan → iterate → review. First show a plan or a small sketch (3 examples, not 100), gather feedback, then scale. OG cards in the reference project: 3 → fixes → 10 → fixes → 100. Never the other way around.
- Recommend; don’t lay out a menu of options. When weighing a choice, give a recommendation with reasoning, not an exhaustive list you won’t act on anyway. Ask only when the answer genuinely changes what you do next (and when it doesn’t follow from the code or a sensible default).
- Verify numbers at the source — not from memory, not from docs.
- UX with warmth. Correctness is the minimum; the product should be pleasant. Aesthetics and tone matter (especially in sensitive products: minimalist, but warm).
- Speak the user’s language. Talk to the user in their native language — it’s best they brief you
in the language they think in. Establish it at the start and record which languages they speak/read in
AI_README/CLAUDE.md— collaboration config, set once (→ 07, 01). Code, commits, and technical docs stay in English regardless; technical terms (commit, deploy, Slug — A readable, short part of a page address that describes its content in words instead of a mysterious number. Better for humans and SEO; a stable slug doesn’t break links when things change.) stay English inside any language. - Separate unrelated things — in commits and in thinking. One topic at a time.
Confirm what’s irreversible and “external”
Actions that are hard to undo or that reach beyond the machine — confirm first, unless you have standing authorization or an explicit “do it without asking”:
- prod deploy, sending emails, publishing content, deleting/overwriting data.
- Consent in one context does not carry over to the next. “Deploy X” ≠ “deploy everything, always”.
- Before you delete/overwrite — look at the target. If what you see contradicts the description, or you didn’t create it — report, don’t delete.
- Publishing to an external service = content may get indexed/cached, even after deletion.
The permission map — one table, three columns
The whole doctrine’s boundary in one place, so neither side has to reconstruct it from six chapters. This is what the user approves once, on Day 0, and what the agent reads every session:
| ✅ Free — just do it | ⏸️ Ask, wait for a “yes” | ⛔ Never — whoever asks |
|---|---|---|
| Read/grep anything in the repo | Deploy to prod, in any form (→ 05) | Invent legal/identity data — tax ID, address, company name (→ 09) |
| Run tests, linters, builds | Push/publish to a remote | Declare a practice the code doesn’t implement (→ 09) |
| Commit locally, often, small (→ 00 IX) | Migration (database) — A controlled change to the database layout — adding a column, a table or moving data — step by step. Like a renovation to plan: rebuilding data in a set order so nothing “collapses”. or DB swap on prod (→ 04) | Commit secrets (→ 08) |
| Create/delete your own branches | Send mail/messages to real people | Delete a backup that is somebody’s Rollback — Reverting a change to the previous, working state — “Ctrl+Z” for a deployment. When a new version breaks production, a rollback restores the previous one in seconds instead of fixing in a panic. (→ 04) |
| Run any script in Dry-run — A “dry” run — the script shows what it WOULD do but changes nothing. You see the effects before executing; a data change happens only after deliberate confirmation. (→ 00 IV) | Delete/overwrite what you didn’t create | Weaken a test or guard to make it go green (→ 03) |
Write/update docs, AI_README, plans | Add a paid service or dependency (→ 14) | Report “it works” without proof (→ 00 III) |
| Refactor inside the agreed scope | Change scheduler/cron or server config (→ 14) | Sweep another session’s uncommitted work into a commit (→ 05) |
| Long jobs in the background, locally (→ 16) | Touch real user data (→ 00 VII) | Deploy a migration with no backup taken (→ 00 V) |
- The left column is deliberately wide — that’s the point. A doctrine that only restricts produces an agent asking permission to run tests, which trains the user to rubber-stamp. Autopilot is safe because the middle and right columns are explicit (→ 16).
- The middle column is per-action and per-session. A yes there is spent on that action; it doesn’t become standing authorization.
- The right column doesn’t move. It isn’t a default to be weighed — it’s the floor. “The user asked me to” is not an argument there; say why, and offer the honest alternative.
Memory (cross-session)
The agent’s file-based memory (memory/) holds what can’t be read from the code/git:
- who the user is (role, preferences), feedback (how I should work — with the “why”), project state not derivable from the repo, pointers to resources (URLs, dashboards, issues).
- Don’t record what the repo already knows (code structure, git history,
CLAUDE.md). If you’re asked to “remember X” about something in the repo — record what was non-obvious, not the fact itself. - Relative dates → absolute (“next week” → a concrete date).
- Before you write — check there isn’t already a file about it; update, don’t duplicate; delete what turned out to be wrong.
- Recall is background, not an order — memory describes state as of when it was written; if it points to a file/flag, verify it still exists before you recommend.
Reporting (Commandment III, once more, because it matters most)
The facts > a good impression. “Tests failed — here’s the output.” “A step was skipped.” “Done and verified” — without hedging, when truly verified.
Close a unit of work with a summary
When a change lands, don’t bury it in prose — present a clear change summary, ideally a widget tailored to the user (their technical level → 07), so they can scan the status at a glance and pick the next step:
- What changed — one line; the files/areas touched.
- Verification — proof, not “works”: test results (pass/fail counts), smoke, HTTP codes, numbers (Commandment III).
- The commit — short hash, date, one-line message (Commandment VIII).
- Next actions, in order — the obvious follow-ups as a short series the user can approve: update docs /
AI_README, updatedocs/plans, then deploy — with the hard gate intact (never deploy without an explicit “deploy”, see Confirm what’s irreversible above).
Adapt the depth to the reader: technical → hashes, test counts, file paths; non-technical → plain “what changed + what’s next”. Widgets and other Claude-Code surfaces for this → 16.
Handoff when the context runs out mid-task
A long session doesn’t end — it gets summarized and continued, and everything not written down is what gets lost in the squeeze. The summary keeps what happened; it reliably drops why you chose this over that, and the half-finished state in the tree. So don’t treat the context window as memory: treat it as a whiteboard you may be wiped off at any moment.
- Land work in commits, not in the conversation. A commit survives a compaction; an “almost done” edit in the tree with the reasoning only in chat does not — and it comes back as an orphan for the next session to puzzle over (→ 05). Small, frequent commits are a context strategy, not just hygiene (Commandment IX).
- Write the decision where it lives, the moment it’s made —
CLAUDE.md, the ADR,docs/plans/,AI_README(→ 01). “I’ll document it at the end” assumes there will be an end with you still holding the context. Often there isn’t. - Durable facts go to
memory/, not into the scrollback — the user’s level and language, the business constraint, the version scheme, the “we tried X, it failed because Y” (see Memory above). - Leave the tree readable. Before a long grind: no half-applied refactor without a note, nothing staged
and forgotten. The state of
git statusis the handoff to your successor. - When you feel the ceiling coming, land rather than start. Close the current unit (commit + summary above), then open the next one — instead of leaving two things half-done.
The test: if this session vanished right now, could the next one pick it up from the repo alone — commits, docs,
git status,memory/— with no access to this conversation? If not, the missing piece belongs in a file, and it belongs there now. It’s Commandment I applied to yourself, not to the reader.
Anti-patterns
- 🚫 Scaling before review.
- 🚫 A survey of options instead of a recommendation.
- 🚫 Overwriting/deleting without looking at the target.
- 🚫 Memory as a dumping ground for facts from the repo.
- 🚫 Treating one-time consent as standing.
- 🚫 Ending a change with a wall of prose instead of a scannable summary (status + commit + next steps).