上下文到 80% 就先写交接,再压缩。**压缩是察觉不到的** —— 压完之后的我读不出缺了什么,摘要看起来完整、自洽、没有窟窿。 这个技能只管一件事:把「摘要留不下的东西」单独写进 HANDOFF.md。 核心判据:**一条未验证的预判,和一条验过的结论,在摘要里长得一模一样。** 触发方式:/handoff-before-compact,或用户说「写交接」「刷一下 HANDOFF」 「快满了」「压缩前准备一下」。 自动触发:交接门禁(hooks/handoff-gate.mjs)在上下文过 80% 且交接过期时 拦住收工,并点名要求跑这个技能。
Install
npx skillscat add 843773296-rgb/lanxiu-yunshang-agent/handoff-before-compact Install via the SkillsCat registry.
压缩前先交接
这个技能在防什么
上下文满了会自动压缩。压缩保的是「读起来连贯」,不保「哪些事还没验」。
压完之后的我拿到一份摘要:结构完整、前因后果俱全、没有任何一处写着
「这里缺了点东西」。于是我接着往下干 —— 而这时候已经没了的,是:
- 判据:当时为什么这么判。摘要会留下结论,压掉理由。
下一轮要改这个决定时,不知道原来是权衡过的还是随手定的。 - 作废的结果:「那一轮读的是建到一半的库,结论不作数」。
摘要很容易压成「跑过了」。 - 未验证的预判:「预计会减到 48 个」和「已经减到 48 个」,
在摘要里长得一模一样。
最后这条是要害,也是整个方法的判据:
两个必须触发相反动作的状态,在表示上一模一样。
「预判」要触发的下一步是「去验」,「结论」要触发的下一步是「往下用」。
摘要把它们写成同一句话,下一轮就会拿预判当事实用。
交接里写什么(六项)
不要复述摘要能留下的东西。 做了什么、改了哪些文件、踩了什么坑,
自动摘要留得住,重写一遍是浪费。只写下面六项:
1. 未验证的预判 —— 每条都要带「怎么验」
写成这样,不要写成结论句:
🔮 预判:工具从 60 减到 48。没验。
验法:把 13 个冻结流程按「中间结果要不要经过模型」逐条重判,数出来对一下。
关键是那个「🔮」和「没验」—— 让预判在形状上就跟结论不一样,
这样摘要再怎么压,也压不成一句肯定的话。
2. 判据 —— 为什么这么判,不是判了什么
工具 vs 技能的分界线是「中间结果要不要经过模型」,
不是「实现里有几步」(后者是代码的形状,不是信息的流向 —— 这条栽过)。
判据比结论值钱:结论会过期,判据能重新算出新结论。
3. 作废的结果 —— 跑过但不算数的
❌ 那轮门禁读的是重建到一半的库,结果不作数,别拿它当基线。
摘要不会主动标这个,因为它看起来就是一次正常的运行。
4. 禁区 —— 说好不能碰的
逐字抄,别转述。转述会把「只读」变成「尽量别改」。
5. 下一步的第一个动作 —— 具体到能直接执行
不写「继续优化工具」,写:
打开
backend/api.py,从任务查询那 5 个开始,按判据逐条标「工具 / 技能」。
6. 悬而未决的问题 —— 等人拍板的
换货差价退回原渠道还是退余额?等业务定,定之前别写实现。
怎么写
- 先读现有的 HANDOFF.md —— 这是刷新不是重写。
已经写过且仍然成立的,原样留着;只改变化了的。 - 顶部写一行:
最后刷新:<日期> · 上下文 <X>% · 本次变化:…… - 六项按顺序写,每项没有内容就写「无」,不要省略标题 ——
少一个标题,下一轮读的人不知道是「没有」还是「忘了写」。 - 写完在回复最后单独写一行,原样告诉用户:
「交接已刷新,建议现在输入 /compact」
为什么最后那一行必须是我说给用户听的
模型没有办法自己触发压缩。 /compact 是用户键入的命令,
没有对应的工具。门禁能拦住我不收工,能逼我写交接,
但压缩这一步只能由人按下去。
所以流程的最后一环是一句话交接给人。不说这句,就会一直拖到
自动压缩在某个随机时刻触发 —— 那时候交接虽然写好了(门禁保证的),
但触发点不由人选,可能正好在一件事做了一半的时候。
自测
门禁自身带 10 条自测,写在 hook 里而不是外挂脚本(外挂的会跟本体分家,
改了本体忘了改脚本,脚本就慢慢烂掉 —— 而烂掉的样子和好着的样子一模一样)。
node ~/.claude/hooks/handoff-gate.mjs --selftest7 个咬合破坏点验过,每个红的都正好是对应那一条。