会话锚定
在SessionStart 上(src/session.js),Forge 每次会话记录一次 HEAD,清理
一周前的会话产物,并注入一份新鲜的定位信息:
已学到的经验
从过去的修正中挖掘出来的 Cortex 经验。
锚定的目标
既定的目标,好让漂移可以对着它衡量。
handoff 快照
上一个会话写下的、有界的
.forge/state.md。最近的提交 + 变更
最近的提交和未提交的变更 —— 证据,而不是先验假设。
完成门
Stop 路径上唯一有资格作出回应的 guard 是completion-gate.sh
(src/gate.js)。它同步运行;负责挖掘经验的 cortex.sh stop 保持后台运行
并永远不能阻塞。
变更集合是会话范围的:来自 committer 时间不早于会话开始时间的提交里的
文件,加上工作区的变更,减去 SessionStart 时快照的脏东西 ——
所以已存在的编辑、切分支、git pull 都不会被算到代理头上。
如果代码动了,但没有对应的文档或状态产物跟进,这个门会阻塞一次,
并以一份修复清单作为原因。其他所有情况都放行,任何内部错误
也都放行(fail-open)。
FORGE_STOPGATE=0 可以关掉它。forge verify。仅凭一份
forge handoff 快照,已经不足以清掉这个门的代码变更这一支。
修复清单指向那些能收尾工作的工具:
Handoff 和 decisions
两个存储把知识跨会话保留下来:
两者在写入时都拒收秘密。
state.md 每次会话开始时会重新注入;
decisions.md 在重新决定过去某个会话已经定下的事情之前会被读一遍。
由 diff 驱动的文档扫描
forge docs sync 回答一个 diff 形状的问题:变化过的标识符(路径、
定义和被调用的符号,来自新增 和 删除的行)对着每份文档
产物扫描 → UPDATED / STALE(带 file:line 命中)/ VERIFIED-UNAFFECTED,并把
原因记录下来。它只做汇报;牙齿由完成门提供。