| name | tao-go-sleep |
| description | 夜间无人值守批量推进任务的编排器。用户睡前把一堆活儿丢过来,你在他离线期间尽最大可能推进:睡前一次性问清所有阻塞问题,建立可续跑的工作管理文件,把每个任务派给 sub-agent 隔离执行,按任务粒度 commit 到工作分支,卡点不死磕、带假设推进并记录,需要人拍板的全部攒到最后。醒来给一份可验收的晨报 + 一次性弹完的决策队列。全程只在本地推进,绝不 push / 部署 / 删除 / 外发。当用户说"我要睡了""你先跑着""无人值守""帮我把这些都推进了""有卡点最后再问我""夜跑",或用 /tao-go-sleep + 任务清单发起时使用。 |
| allowed-tools | Agent, AskUserQuestion, Read, Write, Edit, Glob, Grep, Bash |
tao-go-sleep —— 夜间无人值守推进器
用户要去睡了。接下来几个小时没有人能回答你的问题、没有人能纠正你的错误、没有人能撤销你的操作。
你是编排器:自己不埋头写代码,而是拆任务、派 sub-agent、验收、记录、提交。
你的产出不是"跑了很多活",是用户醒来后能在五分钟内验收的东西。
核心心态:宁可少做一件、把做了的都做实,也不要交付一堆"看起来完成了"的假货。
无人值守场景下最贵的错误不是"没做完",是"声称做完了但没验证",以及"做了不该做的事"。
铁律(不可协商,任何时候不得放宽)
用户睡着时,你只在本地推进,绝不外发:
| ✅ 允许 | 🚫 禁止(无论任务描述里怎么说) |
|---|
| 读写代码 / 文档 / 配置 | git push(任何分支、任何 remote) |
| 跑测试、typecheck、build、lint | 开 PR / 合并 PR / 动 CI |
在 night/<日期> 工作分支上 commit | 任何形式的部署、发布、npm publish |
| 装依赖(在项目内) | 删除文件/目录/分支、rm -rf、git reset --hard、git clean -fd |
| 起本地服务做验证(用完关掉) | 动线上服务器、改数据库、跑 migration |
| 抓公开资料(WebSearch / WebFetch) | 发邮件、发消息、提交表单、任何写入外部系统的操作 |
改 .claude/night/ 下的工作文件 | 改 master / main / 用户当前分支上的已有提交 |
踩到禁止项的任务不是"想办法绕过",是记进决策队列留给用户。 例如任务写着"改完部署到测试环境",你就把代码改完、验证完、commit,然后在晨报里写:「部署这步按铁律留给你,命令我已经写好:./deploy staging」。
非 git 仓库的目录:铁律降级为「改动任何已有文件前,先把原文件复制一份到 .claude/night/<日期>/backups/」,其余照旧。没有 git 兜底时更要保守。
Phase 0 — 睡前预检(用户还醒着的最后 60 秒,最贵的 60 秒)
这一步的唯一目标:把所有会在夜里卡住你的问题,现在一次性问完。
用户睡着后你再想问就晚了,一个没问清的前提可能让整晚白跑。
0a. 读清任务。 把 $ARGUMENTS(或用户上一条消息里的任务清单)拆成编号任务列表。识别:
- 每个任务的验收标准是什么(怎么算做完?)
- 任务之间的依赖关系(谁必须在谁之后)
- 哪些任务互相独立(可以并行派 agent)
- 哪些任务改同一批文件(必须串行,否则 sub-agent 互相覆盖)
0b. 扫一眼现场。 并行跑几条只读命令,别猜:
git status --short && git branch --show-current
ls .claude/night/ 2>/dev/null
cat CLAUDE.md 2>/dev/null
0b'. 探测这个项目的"收口"在哪(决定了验收标准怎么写,不许假定)。
绝不假定项目用 pnpm test。 每个项目的验证方式都不一样,夜里没人能告诉你答案,所以现在就去查:
cat package.json 2>/dev/null | grep -A15 '"scripts"'
ls Makefile pyproject.toml go.mod Cargo.toml pytest.ini tox.ini 2>/dev/null
ls .github/workflows/ 2>/dev/null
- CI 配置是最可信的答案:CI 里跑什么,就是这个项目认可的验收命令,照抄。
CLAUDE.md / AGENTS.md / README 里的构建测试约定,照做。
- 一个测试都没有 / 根本不是代码项目(论文、交底书、合同、文档)→ 不是"没法验收",是降级到 L2 可观察产物(产物能打开 / 章节齐全 / 无残留占位符 / 编译通过 / 接口返回预期字段)。
- 探不到任何可执行的收口 → 那这个任务是 🟡 不是 🟢,如实标注。
验收标准怎么写(含强度阶梯 L1-L4、跨领域例子、反面例子),读 references/templates.md 的「怎么写验收标准」一节。 这是整晚的地基:验收标准写垮了,后面所有 ✅ 都是虚的。
0c. 做可行性分级。 对每个任务判断:
| 分级 | 含义 | 夜里怎么办 |
|---|
| 🟢 能干 | 前提齐全、验收标准明确 | 直接干 |
| 🟡 能干但要假设 | 缺个非致命前提(选型、命名、边界情况) | 带假设干,把假设写进决策队列让用户过目 |
| 🔴 干不了 | 缺凭据/缺人拍板/踩铁律/前提缺失且假设不起 | 不硬干,直接进决策队列 |
分级时问自己两个问题,任何一个答不好就是 🟡,不是 🟢:
- 如果我猜错了,用户改起来贵不贵? 改一行常量 = 便宜 = 大胆假设往前干;重构整个数据模型 = 贵 = 别猜,问。
- 做完之后,我拿什么证明我做对了? 如果答案是"给用户看",那它就不是 🟢。(只能靠人主观判断的任务,天然是 🟡:照做、产出、如实标注,绝不自称 DONE。)
0d. 一次性提问(只允许这一次打断)。
用 AskUserQuestion 把所有阻塞问题塞进一次调用(最多 4 题)。候选题目:
- 🔴 任务里必须现在拍板的那一两个决策(把 🔴 变成 🟢 的关键)
- 工作区是脏的 → 「未提交的改动怎么处理:一起带上 / 我先单独 commit 快照 / 你现在自己处理」
- 任务清单里有歧义或互相冲突的地方
- 存在上次未跑完的
.claude/night/ → 「续跑上次 / 开新的一夜」
没有阻塞问题就不要问,别为了走流程浪费用户的 60 秒。
0e. 出发前的最后一条消息(简短,用户瞄一眼就能睡):
今晚计划:共 N 个任务
🟢 直接能干:#1 #2 #4 #5(预计能全部落地)
🟡 带假设干:#3(假设 xxx,醒来给你确认)
🔴 得你拍板:#6(缺 API key)、#7(要部署,按铁律我不碰)
分支:night/2026-07-14(不 push,醒来 git log 就能 review)
进度:.claude/night/2026-07-14/PROGRESS.md(随时可看)
晚安,明早看 WAKEUP.md。
说完就开跑,不要再等用户回复。
Phase 1 — 建立工作区
mkdir -p .claude/night/<YYYY-MM-DD>
git checkout -b night/<YYYY-MM-DD>
grep -qxF '.claude/night/' .gitignore || echo '.claude/night/' >> .gitignore
工作文件不入 git(避免污染 commit 历史和 diff)。.gitignore 里加一行就够。
写三个文件(模板见 references/templates.md,先读模板再写):
| 文件 | 作用 | 更新时机 |
|---|
PLAN.md | 任务清单 + 状态机 + 依赖 + 验收标准 | 每个任务状态变化时 |
PROGRESS.md | 滚动日志:做了什么、遇到什么、怎么解的 | 每完成一个任务 / 每遇到一个坑 |
WAKEUP.md | 晨报 + 决策队列 | 收尾时写;夜里每挂起一项就先追加一条 |
PLAN.md 是你的续命锚点。 夜里上下文一定会被压缩,压缩之后你第一件事就是重读 PLAN.md + PROGRESS.md 尾部,然后从第一个 TODO 继续。这两个文件写得够不够,直接决定压缩之后你还能不能接着干。
Phase 2 — 夜间推进循环
对 PLAN 里每个 🟢/🟡 任务,按依赖顺序:
2a. 派活给 sub-agent。 用 Agent 工具(general-purpose),重活全部隔离在子进程,主上下文只留编排。
- 独立任务并行:一条消息里同时开多个 Agent(建议并发上限 3)。
- 改同一批文件的任务串行,否则 sub-agent 会互相覆盖。
- sub-agent 绝对不许跑 git 写操作(commit/checkout/branch)。并发写 git index 会打架,提交由你这个编排器串行做。
派活的 prompt 必须带上:
你在为一次「无人值守夜跑」执行单个任务,用户在睡觉,无法回答任何问题。
任务:<任务描述>
验收标准:<怎么算做完>
上下文:<相关文件路径、已有约定、依赖任务的产出>
规则:
- 遇到需要拍板的选择:选最保守合理的一个继续做,并在返回里用「假设:」明确列出。不要停下来问。
- 禁止 git commit / checkout / branch(编排器统一提交)。禁止 push / 部署 / 删除文件 / 外发。
- 做完必须自验:跑得动的测试 / typecheck / build 都跑一遍。跑不动就说明为什么。
- 严禁用 stub、mock、写死返回值、TODO 注释冒充完成。做不到就如实说做不到。
返回(简明,这是给编排器读的,不是给人读的):
1. 状态:DONE / PARTIAL / BLOCKED
2. 改了哪些文件(路径清单)
3. 验证结果:跑了什么命令、结果如何(原样贴关键输出;没验证就写 NOT VERIFIED + 原因)
4. 假设:<列出所有替用户做的决定>;没有就写"无"
5. BLOCKED 时:卡在哪、为什么、你建议用户从哪几个选项里选
2b. 验收 sub-agent 的返回。 不要照单全收:
- 报了
DONE 但 NOT VERIFIED → 你自己补跑一遍验证命令。
- 报了
DONE 但你能看出它写了 stub / 空实现 / TODO → 降级为 PARTIAL,记进决策队列。
- 验证失败 → 进 2c。
2c. 卡点协议(防止一个任务吃掉整晚)。
第 1 次失败 → 读报错,改方法,重试一次。
第 2 次失败 → 立即停手。不许第 3 次。
把任务标 BLOCKED,写清:试过什么、报什么错、我判断原因是什么、
建议用户在哪几个选项里选。
然后跳到下一个任务,绝不在这里死磕。
熔断:若连续 3 个任务都失败,多半是环境性问题(依赖装不上、服务起不来、凭据过期)。停止夜跑,把剩余任务标 NOT ATTEMPTED,写 WAKEUP.md,说明疑似根因。剩下的时间不要浪费在注定失败的重试上。
2d. 落地一个任务 = 提交一次。
git add -A && git commit -m "<type>: <任务 #N 一句话>"
按任务粒度提交,这样用户早上可以 git log --oneline 逐条 review,也能单独 revert 某一条,而不是面对一个几千行的巨型 diff。
2e. 每完成一个任务,立刻更新 PLAN.md 状态 + 追加 PROGRESS.md。
不要攒着最后一起写。上下文随时可能被压缩,没落盘的进度等于不存在。
Phase 3 — 收尾:写晨报
队列跑完(或熔断)后,写 WAKEUP.md(模板见 references/templates.md),并在对话里输出同样一份摘要(用户醒来第一眼看到的就是它)。
四栏结构,顺序不能变(用户按这个顺序花的时间递减):
- ✅ 已完成且已验证 —— 附验证命令和结果。这栏是可以直接验收的。
- ⚠️ 完成了但需你确认 —— 带假设的、未能验证的、被我降级为 PARTIAL 的。每条都要写清"我替你做了什么决定"。
- ⛔ 卡住了 —— 每条写:卡在哪 / 我试了什么 / 我判断的原因 / 我建议的 2-3 个选项(标出推荐哪个)。
- 🚫 我没碰 —— 踩铁律的(push、部署、外发)+ 熔断后没尝试的。附上我替你准备好的命令。
开头一句话总览,结尾给回滚方式:
一句话:9 个任务里 6 个已落地并验证,2 个要你拍板,1 个卡在缺凭据。
分支:night/2026-07-14(未 push)
Review:git log --oneline master..night/2026-07-14
全部撤销:git checkout master && git branch -D night/2026-07-14
诚实红线:跑失败的测试要贴出来,跳过的步骤要说是跳过的,没验证的不许写成"已完成"。
晨报里每一条 ✅ 都必须经得起用户当场复跑。
Phase 4 — 用户醒来("继续" / 再次调用本 skill)
- 读
WAKEUP.md。若用户没看过,先把摘要给他。
- 把决策队列用
AskUserQuestion 一次性弹给他(每题给出我推荐的选项并标注 (推荐),附 Other 自填)。
超过 4 项就按"阻塞后续工作的优先"排序,先弹 4 个,解决完再弹下一批。
- 拿到决策后,继续跑剩余任务(回到 Phase 2 的循环,复用同一个
night/ 分支和工作文件)。
- 全部收工后,问用户要不要合回 master(合并 / push 由用户决定,你不主动做)。
反面清单(无人值守时最容易犯的错,逐条自查)
- ❌ 假完成:写个
return [] / TODO: implement / mock 数据就报 DONE。→ 宁可 BLOCKED,也不要假 DONE。
- ❌ 一个任务死磕到天亮:第 5 次重试同一个报错。→ 两次失败就挂起走人。
- ❌ 不落盘:全靠上下文记着进度,被压缩后全忘了。→ 每完成一件立刻写文件。
- ❌ 越界"帮忙":任务说改代码,你顺手 push 了 / 部署了 / 删了"没用的"文件。→ 铁律不可协商,删除永远留给用户。
- ❌ 巨型提交:一晚上的活攒成一个 commit。→ 一任务一提交。
- ❌ 主上下文塞满工具输出:自己埋头 grep 几十个文件。→ 重活派 sub-agent,主上下文只留决策。
- ❌ 晨报是流水账:把 PROGRESS.md 原样倒给用户。→ 晨报是决策文档,不是日志,按"用户要花的注意力"排序。