Skip to main content
这一层存在的意义是要消灭两种失败模式:半成品工作(代码改了,但依赖 它的产物没跟着改)和会话失忆(下一个会话把这一个知道的东西又假设了 一遍)。指令只是提升正确行为的 概率;确定性的钩子才能保证一个 底线

会话锚定

SessionStart 上(src/session.js),Forge 每次会话记录一次 HEAD,清理 一周前的会话产物,并注入一份新鲜的定位信息:

已学到的经验

从过去的修正中挖掘出来的 Cortex 经验。

锚定的目标

既定的目标,好让漂移可以对着它衡量。

handoff 快照

上一个会话写下的、有界的 .forge/state.md

最近的提交 + 变更

最近的提交和未提交的变更 —— 证据,而不是先验假设。
新会话是基于证据定位的,而不是基于先验。

完成门

Stop 路径上唯一有资格作出回应的 guard 是 completion-gate.shsrc/gate.js)。它同步运行;负责挖掘经验的 cortex.sh stop 保持后台运行 并永远不能阻塞。 变更集合是会话范围的:来自 committer 时间不早于会话开始时间的提交里的 文件,加上工作区的变更,减去 SessionStart 时快照的脏东西 —— 所以已存在的编辑、切分支、git pull 都不会被算到代理头上。
如果代码动了,但没有对应的文档或状态产物跟进,这个门会阻塞一次, 并以一份修复清单作为原因。其他所有情况都放行,任何内部错误 也都放行(fail-open)。FORGE_STOPGATE=0 可以关掉它。
修复清单指向那些能收尾工作的工具:

Handoff 和 decisions

两个存储把知识跨会话保留下来: 两者在写入时都拒收秘密。state.md 每次会话开始时会重新注入; decisions.md 在重新决定过去某个会话已经定下的事情之前会被读一遍。

由 diff 驱动的文档扫描

forge docs sync 回答一个 diff 形状的问题:变化过的标识符(路径、 定义和被调用的符号,来自新增 删除的行)对着每份文档 产物扫描 → UPDATED / STALE(带 file:line 命中)/ VERIFIED-UNAFFECTED,并把 原因记录下来。它只做汇报;牙齿由完成门提供。
recallcortex 只是文件加提示词的记忆 —— 不是权重级别的学习。 Consolidate 是一个可能产生幻觉的摘要器,所以它保持建议性、 可由人审阅、且不含秘密。