sdlc-handoff · git:20261104.bf29262 · 2026-11-04 · sha256 0d4bacca0f1b6fa3

sdlc-handoff git:20261104.bf29262A

Immutable. This exact content never changes and is served at /api/v1/blob/0d4bacca0f1b6fa3.

---
name: sdlc-handoff
description: 'Session handoff and takeover that works with any coding agent. 会话交接与会话接手:旧会话上下文将满、或任务要换会话/换机器/换 agent 继续时,把当前任务压缩成一张自足的交接卡(write);新会话读取交接卡并直接继续(resume),覆盖开发、排查、梳理、调研、文档等任意任务。Use when 交接、接手、继续上次的工作、上下文满了、换个会话做、上次做到哪了、pick up where I left off, handoff, resume previous work, context is full. 用法:/sdlc-handoff write|resume|list'
license: MIT
---

# 交接(sdlc-handoff)

> **定位**:上下文将满、或要换会话/换机器/换 agent 时,把「任务做到哪」压成一张**自足的交接卡**;新会话凭卡直接继续,不必重述背景。覆盖开发、排查、梳理、调研、文档任意任务——不限于 SDLC 某一阶段。

**路径基准**:文中 `scripts/...`、`references/...` 一律相对本文件所在目录(技能根目录)解析。

**平台无关**:本 skill 不依赖任何具体 agent 的目录、环境变量、工具名或斜杠行为。脚本无法执行时,按 [manual-collect.md](references/manual-collect.md) 用现有工具采集同样字段;会话记录读不到时,靠交接卡本身继续。

## 三种动作

| 用户意图 | 动作 |
|---|---|
| 「交接一下」「上下文满了」「换个会话做」「换 agent 继续」 | write |
| 「接手」「继续上次」「上次做到哪了」「按这张卡继续」 | resume |
| 「有哪些交接卡」「列一下交接」 | list |
| 同一会话内只是历史太长、任务仍在推进 | 不做交接,用 agent 自带的上下文压缩 |

无参数时给出三选一,不要猜;同时说明「同一会话内只是历史太长」可以不走交接。**list** 即执行 resume 第 1 步的扫描与展示(时间 / 任务 / `next`)后结束,不进入接手。

## write:产出交接卡

1. **空会话不产卡**:本会话无实质工作(无文件改动、无工具调用记录)时直接说明,建议开新会话即可。
2. **采集硬事实**:执行 `bash <技能根>/scripts/collect.sh`。脚本不可执行或环境不支持时,按 [manual-collect.md](references/manual-collect.md) 逐项采集。
3. **补会话外状态**:若工具集提供后台进程/长任务列表,记录仍在运行的项;否则在卡里写明「未检查」。
4. **写卡**:按 [handoff-template.md](references/handoff-template.md) 的 8 段结构落盘到「落盘与命名」约定的位置。
5. **自检**(逐条过,不通过就改):
   - 8 段齐全,`next` 是单条可直接执行的下一步
   - 正文 ≤120 行;单个代码块 ≤10 行
   - 每项「已完成」都带 `已跑通` / `未验证` / `仅编译`,未验证不得写成已完成
   - 未提交改动、后台任务、临时产物都有落点
   - 无 diff、无大段代码、无原文照抄
6. **交付启动语**:输出新会话的第一句话 `接手 <交接卡绝对路径>`,并建议会话名(`<任务关键词>-<日期>`)。不写死任何平台的斜杠命令。

## resume:接手

1. **定位卡片**:给了路径就用路径;否则按修改时间扫描 `<项目根>/.handoff/` → `~/.handoff/`。命中多张时列 top3(时间 / 任务 / `next`),让用户挑,不猜。
2. **漂移校验**(只用 git,不依赖平台):
   - `repo` 与当前项目根不一致 → 说明「卡来自另一个目录」
   - `branch` 不一致 → 直接指出
   - `head` 不在当前 HEAD 的祖先链上 → 疑似 rebase / force-push
   - `dirty_files` 与当前 `git status --porcelain | wc -l` 不一致 → 列出新增/消失的改动
   - **只报告,不阻断**;用户没要求就不要回滚任何文件。
3. **读卡并给接手确认**(≤10 行):目标 / 断点位置 / 下一步 / 风险或未决问题。
4. **按需补细节**:卡不足以判断、且 `session_ref` 可达时,执行
   `python3 <技能根>/scripts/digest_transcript.py --session <session_ref> --tail 40`。
   不可达或解析失败就跳过,靠卡继续——**绝不要求用户重述背景**。
5. **直接执行 `next`**:不重述全部背景、不重做「已完成」里的步骤、不推翻已记录决策。只有 `next` 存在真正歧义时,问一个具体问题。
6. **收尾留痕**:在卡末尾追加一行 `- [时间] 已推进:<结果>`(有新增待办就补在待办段),避免过期卡被当成现行状态。

## 交接卡里的 8 段

1. **目标与验收口径**——做完的标志
2. **已完成**——每项带验证状态
3. **断点位置**——精确到 `文件:行` 或正在跑的命令
4. **关键决策与已否决方案**——代码里读不到的,防新会话重走死路
5. **改动清单**——来自 git 事实,不贴 diff
6. **有序待办**——每步可独立执行,标注依赖
7. **未决问题**——需要人拍板的
8. **指针**——会话记录 / 计划文档 / 后台任务 / 临时产物

正文预算 120 行。写不下说明这张卡该拆。

## 落盘与命名

```
<项目根>/.handoff/YYYYMMDD-HHmm-<slug>.md      # 项目内优先
~/.handoff/YYYYMMDD-HHmm-<slug>.md             # 非 git 目录 / 跨项目兜底
```

- `<slug>`:任务描述小写化、非字母数字转 `-`、截断到 40 字符
- `HANDOFF_DIR` 可覆盖全局兜底目录
- 项目内目录建议加进 `.gitignore`;需要跨机器时可自行决定是否提交

## 红线

- **不贴 diff、不贴代码、不抄原文**:只给 `文件:行` 指针
- **不把未验证写成已完成**:验证状态必须显式标注
- **resume 不重做、不翻案**:已记录决策只有在用户明确推翻时才改
- **不写凭据**:token、密钥、真实公司名与内网地址一律用 `<占位>`
- **不覆盖旧卡**:永远按时间戳新建
- **不诱导平台依赖**:不要在卡里写「用某个命令恢复」,启动语只写自然语言

## 脚本

| 脚本 | 作用 | 缺失时 |
|---|---|---|
| `scripts/collect.sh` | 采集 git 状态、改动清单、最近提交、已有交接卡、可选会话/临时产物 | 按 [manual-collect.md](references/manual-collect.md) 手工采集 |
| `scripts/digest_transcript.py` | 把 JSONL 会话记录压成「用户原话 + 动作时间线 + 触碰文件」,供 resume 补细节 | 跳过该增强,靠交接卡继续 |