Files
codestable__codestable/docs/adr/006-project-learning-lifecycle.md
2026-08-02 14:02:14 +08:00

10 KiB
Raw Permalink Blame History

adr, title, status, date, applies-to, enforcement, stage, lint
adr title status date applies-to enforcement stage lint
006 CodeStable 项目内持续学习生命周期 Accepted 2026-08-01
plugins/codestable/skills/cs-feat/
plugins/codestable/skills/cs-issue/
plugins/codestable/skills/cs-refactor/
plugins/codestable/skills/cs-epic/
plugins/codestable/skills/cs-keep/
.codestable/lessons/
.codestable/work/
test
author
execute
keep
review
python3 -m pytest tests/test_skill_contracts.py tests/test_v2_architecture_contract.py tests/test_v2_documentation_contract.py

ADR-006: CodeStable 项目内持续学习生命周期

Context

四个 task skill 已会检索项目 lessoncs-keep 也有证据、查重与合并门槛,但现有闭环只保证 “读过”和“写下”。任务中不会稳定识别值得复用的晶化时刻lesson 再次命中后没有统一的核验、 纠偏与退役规则;命中次数和模型自评也无法证明旧经验真实改善了后续任务。

与此同时,自动保存对话、每次任务都询问是否记录,或把所有经验长期留在 lesson会制造隐私、 噪声、双重真相和流程中断。项目需要一个低打扰、证据驱动且最终收敛到更强 owner 的学习周期, 而不是新的 feedback runtime、后台采集系统或全局知识库。

Decision

生命周期对象与唯一 owner

项目内学习采用以下分层:

对象 生命周期与 owner
Learning signal 当前任务内的可核实事件;未过门槛即丢弃
Crystallization candidate 会话内有界候选;不是项目事实,也不自动获得写入授权
Lesson 项目级 staging一条一文件只保留尚未被更强 owner 完整承接的经验
Canonical guard 测试、checker、lint、类型或 deterministic helper机械阻止同类错误
Canonical knowledge attention.md、项目既有文档、glossary 或 ADR 中的唯一事实 owner
Transfer evidence fresh 后续任务在有、无 lesson 条件下产生的 paired 结果;实验机制归 ADR-003

检索次数、“讨论过”和模型自评置信度都不是学习证据。lesson 是可删除、可纠偏的暂存层;同一事实 不得同时把 lesson 与 canonical guard/knowledge 当作并列真相。

强信号与晶化候选

四个 task skill 在任务中静默观察,内存中最多保留 3 条候选,并用新证据替换较低价值项,不为 候选创建 work、transcript 或状态文件。强信号只包括:

  • owner 纠正真实改变了方案、代码、术语或验证;
  • 可复现证据推翻根因,或同一路径失败两次后更换假设;
  • blocking/important finding 暴露尚未编码的不变量;
  • 新 red -> green 验证捕获了可复发失败;
  • 已有 lesson 真实改变本次行为,或被当前事实反证;
  • workaround 重复出现,或某方法显著降低重试、成本或风险。

候选还必须同时具备可追溯证据、可写成未来动作、适用于本次精确 diff 之外,且尚无现成 canonical owner。网络波动、拼写、活动记录、泛化口号和已被机械 owner 完整覆盖的事实直接丢弃。 排序先看失败后果,再看证据与复发可能,最后优先低成本机械化;不得生成伪精确分数。

普通任务仅在强信号成立时,于收尾展示最高价值的一条,首行固定为 晶化候选:{rule},并给出证据、范围和建议归宿;无强信号时不显示空模板。候选不暂停任务, 没有记忆写入授权就随会话结束消失。用户已明确要求“记住 / 更新 / 退役”时,同轮按 cs-keep 处理,不重复确认。

Lesson 三态

新 lesson 必须声明 statusscopedate,正文只保留可执行规则、适用/停止应用边界、最多 三个代表性证据指针和候选归宿。状态只允许:

status 判据
observed 单次任务有证据,尚未在独立后续任务验证
validated 非创建该 lesson 的后续任务和 agent invocation 中有效命中,真实改善行为并验证成功;具体表现为改变计划或验证,或明确排除一个具体且合理的错误路径
retired 被仓库事实反证、范围完全失效,或已被更强 owner 替代;不得再应用

旧 lesson 缺少 status 时按 observed 读取,不批量迁移;只有真实状态变化或 cs-keep 本来就要 更新时才补字段。retired 结论不得复活并继承 validated 身份;新结论必须重新从 observed 开始。

Read-repair 与窄维护授权

task skill 应用 lesson 前必须 read-repairretired 不应用;observed / validated 只做一次有界、最低成本的定向核实, 优先读取已有代码、测试或 canonical 文档;不得仅为核实 lesson 运行大范围测试 或反复复现。一次定向核实仍不足时跳过该 lesson不阻塞正常任务。只有条目 scope 符合、事实仍成立, 且真实改变计划或验证,或明确排除一个具体且合理的错误路径时,才报告 经验命中:{path}{status});核验:{fact};影响:{plan_or_check};纯关键词碰撞或只是读过不算 有效命中。

创建 lesson、改写规则或 scope、一般晋升、删除及跨项目反馈仍需用户显式 cs-keep 诉求、接受 普通任务候选,或 Epic 最终毕业 gate。为使 read-repair 不中断任务,仅对已有且有效命中的 lesson 开放两种无需新增确认的窄维护:

  • observed -> validated:独立后续任务确实采用并验证成功,只补一次代表性证据;必须记录 lesson 实际改变的计划或验证,或明确排除的具体且合理错误路径,以及本次通过的验收证据;
  • observed|validated -> retired:当前仓库事实直接反证,或发现已有 canonical owner只写退役原因 与替代/反证指针。

窄维护不得新建事实、改规则、扩 scope 或新增 gate必须与当次代码、证据和游标组成同一语义原子 milestone并在最终报告列出文件变化。稳定的 validated 命中不写文件。证据不足或需要改写结论时 只形成候选;发现 canonical owner 时 task skill 先 retire删除与合并仍由 cs-keep 负责。

机械化优先与 canonical 归宿

当前任务范围内能直接落成 red -> green 测试或 checker 的约束,必须优先机械化,不再写重复 lesson机械化会扩大任务范围时只给候选不借学习名义扩权。cs-keep 按以下顺序迁移:

  1. 能机械阻止的规则进入测试、checker、lint、类型或 owning skill 的 deterministic helper
  2. 高频必读且稳定的项目事实进入 attention.md,并维持不超过 25 条的预算;
  3. 同时满足难回退、缺少上下文会令人意外、源于真实取舍的结构性决定进入项目 ADR
  4. 其他稳定方法进入项目既有文档;目标不存在时请 owner 选择,不发明目录;
  5. codestable-eval 仅标记未来上游候选,本轮不导出、不上传,也不修改 shipped skill。

新 owner 写入并验证后,应在同一更新中删除完全重复的 lesson若由 task skill 发现,则先退役,留待 显式 cs-keep 清理。cs-keep 继续执行查重、合并和约 50 条 lesson 预算。

Epic 聚合

Epic 子项不得展示或询问晶化候选。每个子项至多把一条去重候选写入既有 Epic 游标的证据区, 不得为此新建 work该记录只是临时毕业输入不是项目事实。全部子项完成后毕业清单统一处理 lesson、guard、项目文档与 ADR 的归宿,并复用 Epic 最终 owner gate不新增逐项暂停或确认。

隐私与跨项目边界

不得保存原始对话、原始问答、完整思考过程、候选分支、逐次命中日志或无限 evidence history 不得扫描 transcript 来补召回率。除上述有界 Epic 游标证据外,未获写入授权的候选只存在于当前 会话内。

本 ADR 只建立项目内 session candidate -> lesson -> canonical owner 的闭环。不创建 .codestable/learning/、全局 lessons、常驻索引、后台 telemetry、集中 runtime 或第九个 skill 也不自动跨项目、团队或向 CodeStable 上游分享。未来跨项目路径必须另行获得显式授权,并经过脱敏 packet、fixture、跨模型 eval 与 regression本 Epic 只保留这一边界,不实现上传或同步。

Consequences

  • task skill 会说明经验如何被当前事实核验、又如何改变行为,避免把检索命中冒充学习效果。
  • lesson 可以随新证据晋升、纠偏和退役,最终迁移到单一机械或文档 owner减少陈旧知识与双重真相。
  • 普通任务只有高价值候选才出现一次提示Epic 则聚合到最终 gate持续学习不会增加常规暂停点。
  • 两种窄维护会让已有 lesson 随任务 diff 一起变化;实现与审查必须核对其证据、状态转换和原子性。
  • 不做 transcript 扫描、后台采集和自动跨项目共享会降低召回率,但同时限制隐私、噪声和权限风险。
  • thin-harness skills 缺少集中 runtime 强制,契约测试与 ADR-003 的 paired cross-session eval 是主要 回退防线;未达到跨模型、非 [underpowered] 的验收证据时,不得宣称学习迁移有效。

Rejected alternatives

  • 每个任务固定询问是否沉淀。拒绝:高频仪式会打断主任务,并把弱信号升级成噪声。
  • 自动保存候选、对话或反馈流。拒绝:扩大隐私与持久化边界,并重新引入本 Epic 明确排除的 feedback runtime、状态机和后台采集。
  • 把 lesson 当作永久、只增不减的知识库。拒绝事实变化后会继续误导且与测试、ADR、项目 文档形成多个 owner。
  • 命中一次或模型自评后直接标记 validated。拒绝:没有独立后续任务的行为与验证证据,无法 区分复用效果和自我确认。
  • 自动同步到全局或其他项目。拒绝:项目事实、隐私与适用范围尚未经过脱敏和跨模型回归验证。
  • 用更醒目的规则文本代替机械 guard。拒绝能由测试、checker、类型或 helper 阻止的错误, 不应继续依赖 agent 记得阅读。