| name | interruption-recovery |
| description | 4-layer interruption + recovery mechanism for long dev tasks. Auto-save on any interruption, one-command resume with full context restore. Built on top of dev-task-memory state files. |
| trigger | interrupt / recovery / resume / äžæ· / æ¢åŸ© / ç¹Œçº / ä¹å / äžæ¬¡ / 'where was I' / 'éå·¥å§' / 'æšéå·¥å§' |
| version | 1 |
| category | devops |
Interruption Recovery
Solve the #1 pain point of long-running dev tasks: David takes a break (1 hour / 1 day / 1 week),
then comes back, and the agent has no idea where they left off. Without this skill, every
interruption is a fresh start with 30 minutes of context re-explanation.
4-Layer Architecture
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Layer 1: TRIGGER (any of these starts the recovery flow) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ⢠Agent / David calls `recovery.sh <project> [reason]` â
â ⢠Pre-shutdown hook (gateway SIGTERM, system reboot) â
â ⢠Cron-triggered (auto-save every 30 min during long tasks) â
â ⢠Manual: David says "save it" / "ææ¶å·¥" / "æå€©åè¬" â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Layer 2: SNAPSHOT (state + session + git) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â 1. Locate active Hermes session (state.db + sessions.json) â
â 2. Save dev-task-state.md via dev-task-memory/save_state.py â
â 3. Sync facts to external memory (sync_external.py) â
â 4. Write docs/_meta/interruption_log.md (audit trail) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Layer 3: RESUME COMMAND (3 options for David to pick) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â A. `hermes --resume <session_id>` â exact context, same line â
â B. `hermes --continue "<name>"` â by session/project name â
â C. `hermes --skills dev-task-memory -c "<name>"` â
â â fresh session, auto-load state file as system context â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Layer 4: AGENT RESTART (loads state on first turn) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â 1. New turn begins (whichever option David picked) â
â 2. If state file exists at expected path, agent reads it â
â 3. Agent emits: "ð Resuming <project> â last activity <ts>" â
â 4. Agent summarizes Goal, Next 3-5 Steps, open Risks â
â 5. Agent asks: "Ready to continue from <step 1>?" â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
å
©å User-Facing Commands
recovery.sh (äžæ·å / äžæ·æ run)
bash ~/.hermes/profiles/developer/skills/interruption-recovery/scripts/recovery.sh \
crm-system "day 9 frontend handoff æ¶å·¥"
Output:
â
State saved. To RESUME, run one of these:
# A. Resume this specific session (preserves session_id, exact context)
hermes --profile developer --resume 20260606_215804_0fb627e3
# B. Resume by project name
hermes --profile developer --continue "crm-system"
# C. Start a FRESH session + auto-inject state
hermes --profile developer --skills dev-task-memory -c "crm-system"
resume.sh (David éè¿ / æ³ resume)
bash resume.sh crm-system
bash resume.sh crm-system --list
bash resume.sh crm-system --peek
Output ç¯äŸ:
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ð RESUME â Project: crm-system
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ð Step 1: Loading dev-task-state.md...
â
Found: /Users/davidchu/www/crm-system/docs/_meta/dev-task-state.md
Last modified: Jun 6 22:06:11 2026
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ð STATE SUMMARY
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
âââ ## ð¯ Goal âââ
Implement 3 frontend improvements in crm-system in ONE pass
âââ ## ð Decisions âââ
1. **Use Hono over Express for BFF layer**
- Why: Hono æ¯ Express 现 4x, å± Cloudflare Workers edge runtime
2. **Use Prisma migrate dev åçš db push**
- Why: Prisma db push æçŽæ¥æ¹ DB schema, å migration history
âââ ## âïž Next 3-5 Steps âââ
1. [ ] æŽ Companies 線茯衚å®å è¯ç¹«äºº sub-row
2. [ ] Man-day role dropdown é
çŸæ QuotationBuilder
3. [ ] Activity timeline é
Company + Deal
ð Step 2: Past sessions for crm-system...
â
Found 5 session(s)
ð TO RESUME â pick one:
# A. Resume most recent session EXACTLY:
hermes --profile developer --resume 20260606_215804_0fb627e3
3 å Resume æš¡åŒæ¯èŒ
| æš¡åŒ | é©çšå Žæ¯ | Pros | Cons |
|---|
A. --resume <id> | < 1 å°æäžæ·, æ³è¡è¿åæ¬å°è©± | å®å
šä¿ç context, é£ user å
typo éœ keep | åŠæ session å·² zombie / corrupted æ hang è¿ |
B. --continue "<name>" | 1-24 å°æ, session 仲å¥å£¯ | Hermes èªå·±æµ matching session | éèŠæåœå / èå¥ |
| C. Fresh + state inject | > 1 æ¥, éå 50 turns, æ³ clean slate | æ°žé work, ååè session çæ
污æ | åèå°è©± history |
David äžè¬æè©²çš C (1 æ¥åŸ), ç¹æ®æ
æ³çš A æ Bã
Trigger èªåè§žçŒé» (è· SOUL.md çŽ
ç· 24-30 é
å)
| Event | Trigger | Action |
|---|
| Task éå§ | çŽ
ç· 24 | save_state.py --project X --goal "..." |
| 30 min / 10 calls | çŽ
ç· 25 | re-save + sync_external |
| Session > 50 turns | çŽ
ç· 22 | å»ºè° /new (äœå
recovery.sh) |
| Session stuck in compaction | çŽ
ç· 29 | kick_stuck_session.sh |
| Agent delegate subagent | çŽ
ç· 30 | emit prefix éç¥ |
| äžæ· (gateway é / æ¶å·¥ / SIGTERM) | çŽ
ç· 31 (NEW) | recovery.sh èªå fire |
| David éè¿ / éæ° session | çŽ
ç· 32 (NEW) | resume.sh / èªå load state |
E2E Test çµæ (2026-06-06 22:05)
1. recovery.sh crm-system "second test 22:05"
â
Found active session: 20260606_215804_0fb627e3
â
State file saved: 2783 bytes, 2 files captured, git @ 7dc56d0
â
Interruption log written
â
Resume commands printed
2. resume.sh crm-system
â
State summary extracted (Goal, Decisions, Next Steps)
â
Past sessions found: 5 sessions
â
3 resume options printed
â±ïž Total time: < 1 second
åå
¶ä» skills å
éä¿
dev-task-memory (æ žå¿) â 5-layer state persistenceãinterruption-recovery åºäœ¢äžé¢ build èªååã
context-summarizer (existing) â èªåæ¯ 30 min å£ contextãé
å interruption-recovery å
triggerã
regression-guard (existing) â é²è bug ç¿»çŒãinterruption_log.md é
RG-XXX ID æ¹äŸ¿ auditã
hang fix v3.1.0 (commit f0d0fb4) â é é² hangãinterruption-recovery èç hang åŸå
æ¢åŸ©ã
ð èšèšä¿è
| ç¹æ§ | å¯Šäœ |
|---|
| Crash-safe | state file åº docs/_meta/ (gitignored) æ¯æ¬¡ save å¯«å®æŽ markdown, åæ partial write è® corrupted |
| Cross-machine | å ~/.hermes/memories/dev-task-facts.jsonl èœ disk, ä»»äœ machine èŠå° |
| Cross-session | hermes --resume è·š session, --continue è·š name, fresh option è·š project |
| Audit trail | docs/_meta/interruption_log.md èšäœææ interruption, å¯ grep / review |
| å single point of failure | state fileãgit historyãexternal memoryãsessions.jsonãstate.db 5 åå°æ¹éœæ snapshot |
â ïž Day 21 Lesson (2026-06-16) â Pre-existing Uncommitted Sprint Detection
æ
å¢: David sendãå以äžå¿
èŠæ§çä¿®æ£: 1. Wiki äžå³å¯ä»¥æ¯æŽå° doc, xls, txt ...ã(5 å item,å®å
š match Sprint 21 scope)ãAgent äžéå§ survey å source code èŠå°
Sprint 21 US-21.4 / US-21.1 / US-21.3 / US-21.5 å
comment æ£èœåº chat.ts /
documents.ts / wikis.ts,仲æ 1 仜 51-line retro doc 寫ååº
docs/retros/2026-06-16-sprint-21-wiki-improvements.mdã峿åæä»¥çº
ãå¿«åæ,æ·šä¿ commit + pushãâ äœ git status 顯瀺 7 modified + 3 untracked,
0 commits ahead of masterãWorking tree å
¥é¢ 5 å US å
šéš implementation å·²ç¶
åºåºŠ,åªä¿ uncommitted WIPã
æ ¹å :ãworktree æ changesãâ ãwork ä¿ WIP å奜éããäžå sprint å
work
å¯ä»¥ä¿å®å
š functional (710 tests pass) äœåŸæª commit éãåäžå session å
agent
å¯èœåå implementation + draft retro doc + verify é bun test,ç¶åŸå°±æ·å/session
zombie å/被 /new cut å,å commit éä»»äœå¢ã
Anti-pattern: Agent èŠå° git status non-zero changes ä¹åŸ default åæä¿
ãåŸé¶ implement å user å
requestã,ææ (a) duplicate work,(b) confused by
interleaved hunks,(c) blow èµ° existing logicãæ£ç¢ºåæä¿ãverify + commit + pushãã
Detection recipe (Recipe D,5 æ¥,20 ç§):
git status --short | wc -l
git diff --stat | tail -1
git diff | grep -E "^\+.*Sprint [0-9]+ US-|^\+.*US-[0-9]+\.[0-9]+"
ls docs/retros/$(date +%Y-%m-%d)-*.md 2>/dev/null
cd backend && bun test 2>&1 | tail -3
git branch -a | grep -iE "sprint|feat"
Decision matrix:
| Detection | Action |
|---|
| Changes + US comments in +lines + retro doc + tests pass | Verify each file â split per-US commits â push (åä¿åŸé¶å¯«) |
| Changes + tests fail | Diagnose failures å
,å奜 push |
Clean working tree + feat/sprint-NN-* branch æ commits | Merge feature branch |
| Clean + å matching branch + å WIP | åŸé¶ implement(æ£åžž flow) |
Fix pattern (PM-System Sprint 21 worked example,2026-06-16):
git checkout -b feat/sprint-21-wiki-improvements
cd backend && bun test
git add backend/Dockerfile backend/src/routes/documents.ts ...
git commit -m "feat(docs): ..."
git add backend/src/utils/wiki-dedup.ts backend/src/routes/wikis.ts
git commit -m "feat(wiki): ..."
git add backend/src/routes/chat.ts frontend/src/pages/ChatPage.tsx
git commit -m "feat(chat): ..."
git add docs/retros/<date>-sprint-NN-*.md
git commit -m "docs(retro): Sprint NN closure ..."
git log --oneline -5
git push -u origin feat/sprint-NN-...
git checkout master
git merge --no-ff feat/sprint-NN-... -m "merge: Sprint NN â <one-line summary>"
git push origin master
å®æŽ detection recipe + decision matrix + fix pattern + anti-pattern list:
references/post-recovery-verification.md § Recipe D
David å
ãå Xãcue è§£è®:
- ãå Xã+ working tree æå€§é changes = re-prompt of uncommitted sprint
- ãå Xã+ clean working tree = implement from scratch (æ£åžž flow)
- ãä¿® Xããship Xãåæš£ rule
- æ°žé å
git status + git diff 30 ç§ verify,å奜 assume clean start
â ïž Day 16 Lesson (2026-06-08) â git status --short Panic-Decision Pitfall
æ
å¢: David sendã宿ïŒã(post-session check-in cue), æé å
git status --short ç¬¬äžæ¬¡è·
return 22 lines å
M + A + A (modified + 2 å untracked) + 倧é filesãå³å» panic,
è·³å
¥ãçŽ
ç· 33 è§žçŒ, ahead commits / un-pushed WIP / å¯èœ revertãé茯, 浪費 5 å
follow-up tool calls (git status no-shortãgit diff --statãgit diff --name-onlyã
git diff -w åå modeãls -la new foldersãgit ls-files --error-unmatch)ãå
šéš 0 line diff
0 file modified â æçµ git status (no args) å° "On branch main / Your branch is up to date /
nothing to commit, working tree clean"ã
æ ¹å : git status --short å
output åçæŒ reality:
- Stale terminal buffer / äžæ·å
state-cache: ç¹å¥ä¿ session éå€ / context éååŸç¬¬äžæ¬¡è·
git status --short, ææ return ä¹å session å
partial outputã解決: è· git status (no
args) å
"On branch / working tree" å
©è¡çº single source of truthã
- Porcelain v1 å
X vs ?:
A (staged add) + A (intend-to-add) + M (modified) æ··å,
ç porcelain åå MM (staged + modified), 第äžçŒä»¥çºèŠèçäœå
¶å¯Šå·²ç¶ trackedã
- David èªå·± untracked å
file å
git add: worktree åºçŸ untracked æ, panic-react åè
æ introduce "agent éå
¥ David WIP" å
åé¡, è©³èŠ dev-task-memory/references/working-tree-wip-detection.mdã
Pitfall checklist(éå° git status --short 顯瀺 modified/untracked å
æå):
[ ] 1. è· `git status` (no args) â "On branch X / Your branch is up to date with 'origin/X'"
/ "nothing to commit, working tree clean" = SINGLE SOURCE OF TRUTH
[ ] 2. è· `git status --branch --porcelain` â empty = 100% clean
[ ] 3. è· `git log --oneline origin/main..HEAD` â empty = 0 ahead
[ ] 4. è· `git log --oneline main..origin/main` â empty = 0 behind
[ ] 5. è· `git diff --stat` + `git diff --cached --stat` â å
©åéœ 0 = ç clean
[ ] 6. åŠæ step 1 å° clean äœ step 2/3/4/5 æ output, ææ panic
Rule: git status --short å
modified/untracked åå¯ä»¥çŽæ¥ jump çµè«ãAlways
git status (no args) å
, å
©å source å°éœå
decideã
David å
倱æçæ
cue æš¡åŒ:
- ã宿ïŒã/ãOk?ã/ãShipped?ã = post-session check-in cue,standard verify æµçš
(çŽ
ç· 33 4-check), åä¿ panic-trigger
- ã?ã= éåžžä¿ãä»²æª ship / æå¢æ·åã, äœéœä¿ verify cue åä¿ debug cue
- ãAããBããCããXã= æ option / execute
- ãZombie?ã/ãåã= ç«å³ ship å¢, å奜ååŸ
- ã奜ã/ãBå§ã= approve äžæ¬¡ option, execute
- ãæšéå·¥å§ã/ãéå·¥å§ã= sprint planning gate (Day 15 lesson å·² capture)
仿¬¡ session å
ã宿ïŒãâ æšæº red-line 33 verify, 4 å check å
šéš pass, worktree clean,
HEAD 忥 origin, 0 aheadãAnswer = "äžå session å
task å·² ship â
, çäœ æäžäžæ"ã
èš: David å
failure-state cue pattern ä»²åº user.md (èšæ¶), Skill åéèŠ,
åªæå¢åºŠä¿é
åã宿ïŒãå
standard response templateã
â ïž Day 15 Lesson (2026-06-07) â Reconstruction recipe when state file is generic template
resume.sh / recovery.sh å
save_state.py stub detect_decisions_from_session() ä»²æª implement,
replace() å
placeholder åœäžçäœ â 寫åºåå
dev-task-state.md Goal/Decisions/Next Steps å
šéšä¿
<placeholder>ãResume agent 以çºå context,寊éä¿èŠ look harderã4-source é建 sequence(第 3 次æç,2026-06-07 Day 14.7 èœå¯Š):
git log --oneline -20 + git status + git log origin/main..HEAD (red-line 33 revert check) â ç¥éååå©
session_search(query="<project> Day <N> <key-term>") (FTS5 multi-keyword + quote) â æ bookend_start / bookend_end (5 sessions max, ±5 messages per match)
cat docs/_meta/interruption_log.md â audit trail of save events
- David å
last message â single-letter (
A/B/C/X)ã奜ãBå§ãship cue (recovery / Zombie? / å) â çŽæ¥ execute,å奜åå
茞åº:ð Resuming 段 + Goal (1 å¥) + Current state (HEAD + branch + working tree) + Decisions (max 5) + Open question (åŠææ) + Next 3-5 steps (concrete, file path) + Risksã
5 tool calls 宿 reconstruction vs 30+ å David éè¿°ã詳现 recipe + worked example (2026-06-07 crm-system Day 14.7):
references/reconstruct-context-from-git-and-sessions.md
äœæ recipe 倱æ:1 å犮æåŸãå€ task 䞊è¡ãlast message æš¡ç³ â å 1 æ¢ clarifying question,3-4 options éšäœæ likely å
next actionãåå¥œéæ°åäžäžå session å·²ç¶åéå
Q â çæ¡å·²ç¶åºåºŠã
4 å Known limitations (TODO)
sync_external.py èå®¶åªå¯« local jsonl fallback â mem0 / honcho API integration ä»²æª implement
- Agent ç¬¬äžæ¬¡å
¥æ° session åæèªå load state â David èŠäž»å run
resume.sh (æ --skills dev-task-memory flag)
recovery.sh å pre-shutdown hook èªå fire (èŠæå run)
- 3 å resume option éœä¿ CLI, å Discord
/resume slash command
â ïž Day 14.7 Lesson (2026-06-07) â Post-Recovery Verification
resume.sh æè¿ state + verify git log ä¹åŸ,仲æå
©å prod-deploy-killer
å surface åº git / state / standard smoke output å
¥é¢:
- Untracked providers â HEAD å·² commit
import { X } äœ X å
file 仲
untrackedãDev build OK (Vite æ working tree),prod git pull å¿
BUILD FAIL
(tracked tree å X)ã
- Stale Docker image bundle â
docker ps 顯瀺 Up (healthy) åçæŒ
bundle å
å«ææ° sourceãSettingsLayout / Tax UI / Deal Autocomplete å
source å·²ç¶ commit å,äœ running image bake åº 8 åéåã
å
©åå
detection recipe + fix command:references/post-recovery-verification.md
(§A untracked providers, §B stale bundle, §C stale stash detection â added
2026-06-07 Day 15 crm-system when pre-review stash 100% subsumed by Day 14.7
merge, pop æåº duplicate toIdArray definitions + 3 untracked file conflict
bail-out)ãè·å® resume.sh ä¹åŸãclaim "ready to ship / merge / PR" ä¹åè·,
Recipe C å¿
é åº git stash pop ä¹åè· â 30 ç§ save äžæ¬¡ prod build fail
â ïž Day 14.7 Final Lesson (2026-06-07) â Smoke-before-Merge Flow
Recipe A + B 解決å "verify å surface å
problem" ä¹åŸ,PR ready å
standard answer ç± "I smoke é dev" åçŽå trunk-based 4-phase flowã
2026-06-07 crm-system Day 14.7 ç¬¬äžæ¬¡ full è·å®:
Phase 1: Pre-merge ââ dev host
1a. 1-click commit untracked providers (`templates/commit-untracked-files.sh`)
1b. 1-click push to origin (`templates/push-after-commit.sh`)
Phase 2: Staging smoke ââ staging host
2a. checkout branch + pull + rebuild
2b. apply prisma migrate deploy + status (é² Day 9 P3009 drift)
2c. run 14-step E2E smoke (`templates/smoke-before-merge.sh`)
2d. if smoke FAIL â DO NOT MERGE,åå° Phase 1 fix
Phase 3: Merge ââ dev host
3a. `git checkout main && git merge --no-ff <branch> && git push`
Phase 4: Prod deploy ââ prod host (çŽ
ç· 4,å®å
šç David)
4a. `git pull origin main`
4b. `docker compose ... run --rm api bunx prisma migrate deploy`
4c. `docker compose ... run --rm api bun run db:seed` (RBAC re-seed)
4d. `docker compose ... up -d --build web` (rebuild image with new source)
4e. post-deploy smoke: 7 tabs 200 / tax 13â17 round-trip / bundle å« new feature string
3 å script äºçž chain(æ¯å print äžäžå command),David åéèŠ
èšäœé åº:commit â push â smoke,å
šéš smoke-passed å
å¯ä»¥ mergeã
Hermes-redact pitfall (class-level,ææ E2E smoke script éœæ): 寫
Authorization: Bearer $JWT åº shell å°é£ Hermes å
secret-detection
æ replace å $JWT literal è® ***(å°±ç® $JWT ä¿ shell variable éœé£),
result = curl call å
šéšçšç©º token â smoke 100% failãFix pattern:
"B" + "earer " string concat + /tmp/jwt.txt file-based tokenã詳现
template å pitfall è§£é:references/e2e-smoke-script-authoring.mdã
å®æŽ 4-phase æµçš + 3 script èšèš + é»è§£ smoke-before-merge éèŠ:
references/smoke-before-merge-flow.mdã
Reusable shell templates(ç±ä»æ¬¡ session å
/tmp/*.sh sanitized):
templates/commit-untracked-files.sh â 1-click commit + 3 safety checks
templates/push-after-commit.sh â 1-click push to origin
templates/smoke-before-merge.sh â 14-step E2E smoke(redact-safe)
𧪠E2E Validation (2026-06-07 crm-system Day 14.7)
1. recovery.sh crm-system "Smoke-before-merge ready"
â
State saved, 3 resume options printed
2. resume.sh crm-system
â
State + git log reconstructed
3. post-recovery-verification recipes A + B
â
Recipe A: 0 untracked-provider lines (3 multi-*.tsx å·² untracked ç± PR
resolution script èç,è· Recipe A ç¢ºèª "â ïž UNTRACKED-PROVIDER" å°åº)
â
Recipe B: bundle å« "æå°å
¬åž" / "æå°é·å®å¡" (dev rebuild åŸ)
4. 3 /tmp script 寫奜
â
/tmp/commit-untracked-files.sh (4.5KB) â 3 safety checks + git add 3 files + commit
â
/tmp/push-after-commit.sh (1.2KB)
â
/tmp/smoke-before-merge.sh (12.5KB) â 14 æ¥,full Hermes-redact-safe
5. PR description patched
â
å Smoke-before-Merge section + 3 script refs + å»é Known Minor Issues
â
Resolution of 4 untracked files æ¹ manual + 1-click å
©ç
6. 14-step smoke çä¿è· dev host â 14/14 PASS (login + 7 tabs + tax round-trip + audit + deals + bundle)
â ïž Day 11 Lesson (2026-06-09) â Generic Template Limitation
recovery.sh å
Step 2 è· save_state.py,äœå script å
detect_decisions_from_session()
ä¿ stub(æ°žé return []),çµå€§éšå template replace() call å miss å placeholder
(åª hit branch / commit / uncommitted changes å° 3 å)ãçµæ:寫åºåå
dev-task-state.md ä¿ generic template,Decisions / Files / Next Steps / Risks
section å
šéšä¿ <placeholder> æ **åŸ
填寫**ã
圱é¿:
- Resume åæ° session agent è®å state file,å®å
šå€±æ¶(2026-06-09 hit é 2 次)
load_state.py å
output ç䌌æ£åžžäœå
§å®¹ä¿ç©º
Mitigation(å·²åº recovery.sh å warning):
recovery.sh Step 2 ä¹åŸå° "â ïž Day 11 lesson" block
- å°æ file:
dev-task-memory/references/recovery-template-limitation.md å
workaround recipe
詳现åæå future fix blueprint(Patch D)ç:
~/.hermes/profiles/developer/skills/dev-task-memory/references/recovery-template-limitation.md
â ïž Day 15 Lesson (2026-06-07) â State-File-Generic 4-Step Reconstruction Recipe
ç¶ resume.sh å°åºåå
state file å
šéšä¿ <placeholder> / **åŸ
填寫**
(generic template),å奜 trust state file â çŽæ¥è·ä»¥äž 4 æ¥åŸå€éš source
reconstruct contextãå·²é©èææ(2026-06-07 crm-system Day 14.7 â Day 15
handoff, çšå¢å recipe 100% é建 context):
cd ~/www/<project>
git status
git log --oneline -20
git log --oneline origin/main..HEAD
git log --oneline main..origin/main
session_search query="<project> <scope keywords>" limit=5
ééµ insight:session_search å
FTS5 bookend æ©å¶ + git log å
commit
narrative,å·²ç¶æ¶µè state file æè©²èšäœå
95% å
§å®¹ãState file å
value
åä¿å®äž source of truth, èä¿ user/agent äžäžå turn å
ãæååŸå°éã
shortcutãç¶ shortcut 倱æ, git + session_search = åççè³æŽå¥œå
sourceã
å° feature-plan-alignment skill å
signal: ç¶ David è¬ãéå·¥å§ã/
ãæšéå·¥å§ã/ãstart workã, scope 屬 1+ sprint / >5 files / 4+ commits /
çŽ
ç· 16 å圱é¿, è§£è®åãapprove to start sprint planningã, åä¿
ãapprove to start codingãâ å¿
é å
plan doc 寫奜 scope options 俟 David æã
2026-06-07 æé, çŽ
ç· 22 (plan stage äžå source code) å®äœã
4-step recipe å
edge cases:
- å session_search hit:FTS5 query 倪 narrow, çš
session_search() browse shape ææè¿ 5 å session
- å git log:- å¯èœæ° project ä»²æª init, fallback å°
ls docs/ + cat docs/retros/INDEX.md(åŠæååš)
- git log æ ahead commits:å¯èœäžäžå agent çäœ un-pushed work,èŠ surface åºåå user é»èç
- å
šéš source éœå€±æ:èª å¯Šè¬ "I cannot reconstruct state, please summarise what we did last",å奜 fabricate
𧪠é©è
bash recovery.sh crm-system "test 1"
bash resume.sh crm-system
ls -la ~/www/crm-system/docs/_meta/
cat ~/www/crm-system/docs/_meta/interruption_log.md