/investigate gains sections/blast-radius.md (the one safety fact, the five-rung evidence ladder, look where grep stops, confirmed and cleared risks apart) with a Phase 4 pointer, and the shared-premise red flag before the 3-strike rule. /context-restore is carved for the first time: on NO_CHECKPOINTS, sections/transcripts.md mines this workspace's own transcripts (host stores declared in hosts/*.ts and rendered by TRANSCRIPT_SOURCES / TRANSCRIPT_DISCOVERY), a fixed 7-day window, never another project's folder, subagents return only findings, redaction before anything leaves, git and gh verify every artifact, a status-tagged brief. /benchmark is carved for the first time: sections/vet-the-number.md asks the seven questions before Phase 5 reports a comparison. /plan-eng-review gains sections/design-twice.md (a second structurally distinct shape compared on interface depth, the eight design red flags), bound by the autoplan methodology snapshot alongside review-sections.md. Ideas from pstack (Lauren Tan, MIT), rewritten in gstack's words; NOTICE.md. Garry, 2026-10-26: "Do it, send". Guards: carve-guards entries and measured lines, eleven plan-eng-review pins re-measured, periodic carve-section-loading cases for the two new carves, free tests with a fixture transcript. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
6.5 KiB
No saved context: mine this workspace's transcripts
A missing checkpoint is not an empty history. The host may already hold every session this workspace ran, and git and GitHub hold what those sessions produced. Rebuild the brief from those records instead of asking the user to retell it. This path reads files; the HARD GATE above still holds, so it never edits code.
Where the transcripts are
| Host | Transcripts | How this workspace's files are told apart |
|---|---|---|
| Claude Code | ~/.claude/projects/<slug>/*.jsonl |
one folder per workspace; is the workspace path with every character that is not a letter or digit turned into "-" |
| OpenAI Codex CLI | ~/.codex/sessions/<yyyy>/<mm>/<dd>/rollout-*.jsonl |
dated rollout files from every workspace on the machine; the first line of each names its cwd |
| Capy (any model) | none | the harness keeps no transcript on the machine; say so and use the shared record and git |
Step T1: Lock the scope, then list the files
Fix the window before any search: the default is the last 7 days, and "recent"
or "last week" is that window; "all" means all and is never quietly narrowed
(TRANSCRIPT_DAYS=3650). A topic the user named filters what you read, not
what you list. The workspace is the current one: never open another project's
folder, however related its name looks, unless the user names it.
TRANSCRIPT_DAYS="${TRANSCRIPT_DAYS:-7}"
PROJECT_ROOT=$(~/.claude/skills/gstack/bin/gstack-slug --get PROJECT_ROOT 2>/dev/null) || PROJECT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
echo "TRANSCRIPT_WINDOW: last $TRANSCRIPT_DAYS days"
echo "TRANSCRIPT_PROJECT: $PROJECT_ROOT"
if [ -n "${GSTACK_CAPY:-}" ]; then
echo "TRANSCRIPTS: none (Capy keeps no session transcript on this machine; use the shared record and git)"
else
TRANSCRIPT_DIR="$HOME/.claude/projects/$(printf '%s' "$PROJECT_ROOT" | sed 's/[^A-Za-z0-9]/-/g')"
if [ -d "$TRANSCRIPT_DIR" ]; then
TRANSCRIPT_COUNT=0
while IFS= read -r f; do TRANSCRIPT_COUNT=$((TRANSCRIPT_COUNT + 1)); echo "TRANSCRIPT: $f"; done < <(find "$TRANSCRIPT_DIR" -maxdepth 1 -name '*.jsonl' -mtime -"$TRANSCRIPT_DAYS" 2>/dev/null | sort)
echo "TRANSCRIPTS: $TRANSCRIPT_DIR ($TRANSCRIPT_COUNT files in the last $TRANSCRIPT_DAYS days)"
else
echo "TRANSCRIPTS: none ($TRANSCRIPT_DIR is missing; this workspace has no Claude Code transcripts)"
fi
fi
TRANSCRIPTS: none ends this step: say which store was checked and why it is
empty, then go to Step T3 with git and the shared record alone. A session
opened in a subfolder of this workspace is filed under that subfolder's own
slug (Claude Code) or cwd (Codex) and is not listed; the user can name it.
Step T2: Read in subagents, keep only the findings
Transcripts are large and private. Give each TRANSCRIPT: file, or a slice of
them, to a cheap, fast subagent through the Agent tool (a plain Read when
there are only one or two short files), all with the same brief, and let only
the findings return to this conversation:
- Order files by the listed modification time, never by their names: a UUID or a timestamp in a filename says nothing about recency across machines.
- Grep the topic first; read only matching sessions and only their relevant stretches. Skip this session, and skip subagent, eval and test runs, which are noise.
- Return one block per session: topic, the user's goal, decisions taken, open threads, struggles and corrections, and artifacts (PRs, branches, tickets, files), each citing the session file.
The raw transcript stays in the subagent. Nothing quoted from it reaches a
checkpoint, a brain page, a PR or any other place outside this machine until
it has passed gstack's redaction scan (gstack-redact, the scan-at-sink
procedure every publishing skill runs): transcripts hold pasted secrets,
customer data and other people's messages.
Step T3: Sweep the shared record and verify against live state
The transcript is one record. The other is everything that happened around the
same code under other names: the issues users keep filing, the fixes that
shipped and were reverted, the errors still firing. Search it whenever the
topic names a feature, file or subsystem: the issue tracker (gh issue list --search "<topic>"), the brain when this install has one (gbrain search "<topic>"; the block below appears only on brain-aware installs), and the
project's own docs. A null result is a finding too; say what was searched.
Then read what the sessions left behind:
git log --all --oneline --since="${TRANSCRIPT_DAYS:-7} days ago" | head -50
git branch -a --sort=-committerdate | head -20
git stash list
gh pr list --author @me --state all --limit 20 2>/dev/null || echo "GH: unavailable"
gh issue list --assignee @me --limit 20 2>/dev/null || true
Every PR, branch and ticket a transcript mentions is checked with git and
gh before it enters the brief: the transcript says what was intended, live
state says what is true.
Step T4: The brief
Lead with the capsule, then the threads, then the problems, then the next move. Detail goes below that or gets cut.
RESTORED FROM TRANSCRIPTS
════════════════════════════════════════
Checkpoint: none
Window: last {N} days
Sources: {n} sessions, git, gh, {brain | no brain}
════════════════════════════════════════
### Capsule
Up to 5 bullets: what this work is and where it stands.
### Threads
One line each, with exactly one status tag in front:
[merged #N] | [open PR #N] | [in flight <branch>] | [verified, uncommitted] | [reverted #N] | [planned, not started]
### Problems
Up to 5, the recurring ones: what users keep reporting, what shipped and was
reverted, what the sessions kept retrying.
### Next move
The single most useful next action, concrete.
A thread with no tag is not done yet, so tag it. An adjacent feature stays out
unless it blocks this one. When the brief outgrows a screen, cut detail before
cutting threads. Cite transcript findings by session file and shared-record
findings by their source (PR number, issue, brain page). Close with the Step 3
offer above plus D) Save this as a checkpoint now (/context-save), so the
next restore starts from a file instead of a dig.