whereami
"Where are we at / whats next / tldr" is one of the most-repeated prompts in any long-running project, and answers degrade after every compaction. Fix: a per-repo ledger file that outlives sessions, plus a read protocol that checks reality (git/gh) rather than trusting chat memory.
The ledger: .claude/state.md (per repo)
# State — <repo>
Updated: YYYY-MM-DD (session gist)
## In flight
- <workstream>: <one-line status> — next: <action> (blocked on: <who/what>, since <date>)
## Done recently
- YYYY-MM-DD <thing shipped/merged/decided>
## Sent
- YYYY-MM-DD <recipient/channel>: <one-line gist>
## Waiting on
- <who> owes <what> since <date>
## Parked / open questions
- <item>
Read mode (default)
- Read
.claude/state.md(if missing, offer to bootstrap it from git log + open PRs + this session). - Verify against reality before answering:
git log --oneline -15,gh pr list, uncommitted changes. If ledger and reality disagree, reality wins — and fix the ledger. - Answer as TLDR ELI12: what shipped, what's in flight, what's blocked on whom, the single next action. Short — this is re-orientation, not a report.
Update mode (update, or proactively at the end of a substantial work session)
Rewrite the affected sections with what happened this session. Convert relative dates to absolute. Keep the file under ~60 lines — this is a dashboard, not a journal; prune "Done recently" past 2 weeks.
Why this also fixes parallel-session collisions
Two chats working the same repo both read/write the same ledger, so "consider this batch is already underway" no longer needs hand-pasting between chats. When starting a batch, note it under "In flight" immediately so sibling sessions see it.