---
name: night-shift
description: "Unattended overnight runs: while the user sleeps or is away for hours, the agent works through a written to-do list on its own — self-paced /loop wake-ups, one item at a time, sub-agents for the legwork, evidence and a commit for every 'done', the most conservative default for anything it would have to ask about, and a five-part report in the morning. 夜间无人值班：用户睡觉或离开几个小时，让 agent 按一份待办清单自己推进——/loop 自定节奏、一次一项、子代理分工、每项有证据和提交、要拍板的事先用最保守的默认值、早上交五段式报告。用户说「我要睡了 / 出门几小时，你自己接着做」「挂一晚上」「夜间值班」时使用。"
metadata:
  short-description: 夜间无人值班推进待办
---

# 夜间值班（Night Shift）

用户要睡觉或离开几个小时，想让 agent 在没人回答问题的情况下，自己把一份待办清单往前推。这套机制在 case C（一个停服手游的离线化项目）上跑过两整晚：开跑前人做两分钟检查，之后 agent 自己醒来、干活、记账、停下、写报告。

它不绑定游戏项目。只要有一份待办清单、每项能自动验证（测试、模拟器、截图、日志），就能用。

## 怎么开始

1. 把 [`templates/NIGHT-RUN.md`](templates/NIGHT-RUN.md) 复制进项目（建议 `docs/NIGHT-RUN.md`），把所有 `<占位>` 填掉，尤其是「绝对不做」一节。
2. 人过一遍下面的「开跑前检查」。
3. 在项目的会话里输入，**不给间隔**，让 agent 自己定节奏：

```
/loop 读 docs/NIGHT-RUN.md 并严格按它执行；每次醒来都重新读一遍它
```

之后不用管，回来看 `docs/NIGHT-REPORT.md`。

`NIGHT-RUN.md` 是指令本身。运行时 agent 自己写三个状态文件：`NIGHT-PLAN.md`（计划表，每项一行带状态）、`NIGHT-LOG.md`（一行一件事，带时间）、`NIGHT-REPORT.md`（停止前写的报告）。每次醒来都从这些文件恢复进度，不靠对话记忆，所以上下文被压缩也不会丢进度。

## 开跑前人做的检查（两分钟）

- **权限模式是 auto。** 不是的话，一个确认框就能把整晚卡死。
- **主会话模型**用平时的主力模型，不用最贵那档：整晚大部分是体力活和等待，最强模型的判断优势体现不出来，额度却烧得最快。子代理用便宜的：scout 用最便宜的，worker 用中档。
- **设备**：测试设备开着、在线；别的项目或用户自己在用的设备拔掉，或者在 `NIGHT-RUN.md` 里写明不许碰。
- **电源**：电脑插电。防睡眠 agent 自己会调，但合盖之类的操作要人自己避免。
- **git 基线**：项目最好已经是 git 仓库、工作区干净；不是的话 agent 第一次醒来会 init 并做基线提交，之后每晚都有能回退的点。

## 机制

**每次醒来的固定步骤**（按顺序，不跳）：
1. 读 PLAN 和 LOG 最后几十行，弄清上次做到哪；查有没有子会话、子代理或后台命令还在跑。只读 PLAN 引用到的文档章节，不重读大文件。
2. 调 keep-awake，防止电脑睡眠。
3. 查额度。低于阈值（默认 15%）就只做收尾。
4. 查设备在线；不在线按 `NIGHT-RUN.md` 写的办法拉起，两次不行就只做不需要设备的事。
5. 看本地时间，过了截止时间就进停止流程。

**第一次醒来**：建基线（需要时 `git init`、写 `.gitignore`、基线提交），在 LOG 第一行记下开始时间、额度、基线哈希和设备；再从项目的状态文档生成 PLAN。每项写：优先级、做什么、完成标准（状态真的变了，而且重启后还对）、涉及文件、验证方式。排序：先验证「已写未验证」的，再做收益大且独立的新东西，依赖外部条件的放最后。

**执行规则**：
- 一次只开一项，PLAN 里同时只有一项 in_progress。
- 按分工派活：大范围搜索、读长日志、通读反编译产物给 scout；规格已定的实现、补测试、批量改表给 worker；主会话只做判断、定规格、收货和上设备验证。几次工具调用能做完的小活自己做，不拆。
- 派活要写全：目标、背景（文件和行号）、只许改哪些文件、完成标准、交付格式、时限。收货时自己重跑测试、抽查 diff、确认没越界改文件；子代理说「完成了」不算数。
- 并行会话最多两个，只给互不依赖、文件不重叠的实现项。构建脚本、补丁入口、存档结构和这几个状态文件只有主会话能改。
- 验收必须有证据：截图、日志片段或存档 diff，放进 `<证据目录>/<日期>/<事项>/`，路径写进 LOG。没证据就写「已实现，待验证」。
- 同一项连续失败两次，或在它上面耗了一小时，就标 blocked，LOG 里写现象、日志路径和猜测，换下一项。不在一个坑里转圈。
- 每完成一项提交一次，提交信息写清验证状态；新踩的坑追加到项目的坑记录。
- 省上下文：长输出先落盘再让 scout 摘要；大文件不整读；给子会话的 brief 自己写全，不写「见上文」。
- 需要用户拍板的事（资源来源、数值取舍、砍不砍功能、账号和协议）：选最保守的默认值继续，记进报告的「待你决定」，不停下来等。

**绝对不做**：模板里是一张按项目填空的清单。至少要写：不碰哪些设备、不用哪些清数据或卸载类命令、哪些目录不许删、不 push 不发布不上传、不改系统设置、子会话上限和不许用的模型、不写「应该没问题」。改用户自己的数据之前先备份，确认备份在了再动。

**停止条件**（任一满足就停 loop）：PLAN 全部 done 或 blocked；额度低于阈值；连续三次醒来没有任何事项状态变化；到了截止时间。

**报告**五段，每段要短：
1. 已验证：事项、证据路径、提交哈希
2. 已实现未验证：为什么没验上
3. 阻塞：现象、日志路径、猜测、建议用户怎么查
4. 待你决定：每条写出用了哪个默认值、备选是什么
5. 额度消耗、回来能直接用的产物路径、所有子会话和子代理的名字与状态

**醒来间隔与 noop**：有子会话、子代理或后台命令在跑时，只定一个 1200 秒左右的兜底唤醒，主要靠它们的完成通知叫醒；没有在跑的，做完一项马上做下一项，不为「看一眼」而醒。每次调 `ScheduleWakeup` 都如实填 noop：有事项状态变化才填 false。连续的 noop 会在界面上折叠成一串，用户一眼就能看出它在空转。

## 依赖的环境

下面这些都是 Claude Code 桌面版提供的能力。换到别的环境时缺哪个，按表里的办法退化。

| 能力 | 用来做什么 | 缺了怎么办 |
|---|---|---|
| `/loop`，不给间隔 | agent 自己决定下次什么时候醒 | 用固定间隔（如 `/loop 20m …`），或外部定时任务定时发同一句提示 |
| `ScheduleWakeup` | 安排下次醒来、标 noop、停止循环 | 同上；要停时在 PLAN 顶部写 `stopped`，之后每次醒来读到就直接结束 |
| `request_keep_awake` | 防止电脑睡眠 | 开跑前人手动关掉睡眠 |
| `get_usage` | 查剩余额度、决定是否收尾 | 开跑前人看一眼额度，在 `NIGHT-RUN.md` 里用「最晚几点 / 最多几项」代替额度阈值 |
| `start_session` | 开并行会话 | 退化成子代理 |

纯命令行版本里不能开并行会话：把并行实现项交给后台跑的 worker 子代理，其余规则不变（文件不重叠、最多两个、brief 写全、收货自己验）。另外，从自动唤醒的回合里开会话可能被应用拒绝；case C 两晚实际都只用了子代理。被拒一次就直接退化，不要反复重试。

## 两晚跑出来的经验

- **子代理会卡住。** 一个 scout 跑了 `cat > 文件` 却没给输入，一直在等标准输入；一个 worker 早上 8 点多开工、下午 1 点才交，中间多半在空等。每次醒来查一遍后台任务，超过时限的停掉；主会话手里已经有上下文的活，自己做更快。
- **开始时就记额度。** 第一晚开头没记，早上报告算不出这一晚用了多少。
- **用了用户自己的数据就要还原。** 测试时换掉了用户的存档：先备份、记哈希，停止前逐字节还原，再释放共用设备的登记。
- **用户中途改规矩要落到文件里。** 用户半夜醒来说「手机也可以用」「继续，别停」，就在 PLAN 里加一个带时间的新段落，原话照抄；不要自己推断「那别的应该也可以」。
- **随机点击压测（Android `monkey`）要限定包名，并关掉轨迹球和导航键事件**：`-p <包名> --pct-trackball 0 --pct-nav 0 --pct-majornav 0 --pct-anyevent 0`。模拟器上这些事件会触发系统语音搜索，没有应用接手，把系统进程弄崩，看起来像游戏闪退。
- **「已验证」只放有证据的。** 证据目录按事项编号，报告里直接给路径，用户早上能一项项点开看。

## 效果（case C）

- 第一晚 4 小时 25 分钟：模拟器上验证了 11 项，每项都有截图或日志和一次提交；派了 5 个 worker；结束时 5 小时额度窗口显示用了 51%。
- 另一晚在模拟器上跑随机点击压测，两轮各 3000 次，0 闪退。
