diff --git a/.codestable/epics/cs-continuous-learning-lifecycle.md b/.codestable/epics/cs-continuous-learning-lifecycle.md index 8b6443b..c29c7c6 100644 --- a/.codestable/epics/cs-continuous-learning-lifecycle.md +++ b/.codestable/epics/cs-continuous-learning-lifecycle.md @@ -61,12 +61,14 @@ canonical guard/knowledge 才是稳定归宿。 ### 开工:有效命中必须说明影响 -只有 scope 符合、未退役、经当前代码/测试/canonical 文档核实,并真实改变计划或验证的条目才算 -有效命中。四个 task skill 必须报告:`经验命中:{path}({status});核验:{fact};影响: +应用前 read-repair 只做一次有界、最低成本的定向核实,优先读取已有代码、测试或 canonical 文档; +不得仅为核实 lesson 运行大范围测试或反复复现。一次定向核实仍不足时跳过该 lesson,不阻塞正常任务。 +只有 scope 符合、未退役、当前事实成立,并真实改变计划或验证,或明确排除一个具体且合理的错误路径 +的条目才算有效命中。四个 task skill 必须报告:`经验命中:{path}({status});核验:{fact};影响: {plan_or_check}`。纯关键词碰撞不报告为有效命中,也不能把“读过”冒充“采用”。 -应用前 read-repair:`retired` 不应用;`observed` / `validated` 先核实再用;只是相关但没有改变 -行为时不制造复用证据;当前事实明确反证时立即停止应用并走窄退役,证据不足时不猜。 +`retired` 不应用;`observed` / `validated` 经上述核实再用;只是相关但没有改变行为时不制造复用证据; +当前事实明确反证时立即停止应用并走窄退役,证据不足时不猜。 ### 任务中:静默识别晶化时刻 @@ -110,7 +112,7 @@ date: YYYY-MM-DD | status | 判据 | |---|---| | `observed` | 单次任务有证据,尚未在独立后续任务验证 | -| `validated` | 非创建该 lesson 的任务和 agent invocation 中有效命中,真实改善行为并验证成功 | +| `validated` | 非创建该 lesson 的任务和 agent invocation 中有效命中,真实改善行为并验证成功;具体表现为改变计划或验证,或明确排除一个具体且合理的错误路径 | | `retired` | 被事实反证、范围完全失效或已被更强 owner 替代;不得应用且不再复活原结论 | 旧 lesson 缺 `status` 按 `observed` 读取,不批量迁移;只有真实状态变化或 `cs-keep` 本来就要更新 @@ -119,7 +121,8 @@ date: YYYY-MM-DD 创建、改写规则/scope、晋升、删除与跨项目反馈仍须用户显式 `cs-keep` 诉求、接受普通候选,或 Epic 最终毕业 gate。为实现不中断的 read-repair,仅对已有且有效命中的 lesson 开放两种窄维护: -- `observed -> validated`:独立后续任务确实采用并验证成功,只补一次代表性证据; +- `observed -> validated`:独立后续任务确实采用并验证成功,只补一次代表性证据;必须记录 lesson + 实际改变的计划或验证,或明确排除的具体且合理错误路径,以及本次通过的验收证据; - `observed|validated -> retired`:当前仓库事实直接反证,只写原因与替代/反证指针。 窄维护不新建事实、不改规则、不扩 scope、不新增 gate,随当次代码、证据和游标进入同一语义原子 @@ -199,8 +202,10 @@ README 精简结构、全部 Markdown ≤300、plugin/package/distribution tests ## 验收标准 -- 四 task skills 对有效命中报告路径、核验与具体影响;候选静默、普通最多一条、Epic 最终处理。 -- 三态可解析且按需迁移;退役不再应用,validated 稳定命中无 churn,机械化与单一 owner 优先。 +- 四 task skills 的 read-repair 有界且不阻塞正常任务;有效命中报告路径、核验与具体影响,并允许 + “明确排除具体且合理的错误路径”作为真实影响;候选静默、普通最多一条、Epic 最终处理。 +- 三态可解析且按需迁移;validated 记录具体行为变化与本次通过的验收证据,退役不再应用,稳定命中 + 无 churn,机械化与单一 owner 优先。 - 新 lesson 与跨项目分享保持显式授权;无 transcript、feedback runtime、global lessons 或新 skill。 - paired 单测证明四类 invocation 独立、B prompt 相同、只有 lesson 差异、半 pair 不完成、成本不低估。 - 冻结实验在两个 model family 上以非 `[underpowered]` 证据满足 verdict;否则本 Epic 保持未完成。 diff --git a/.codestable/work/epic-cs-continuous-learning-lifecycle.md b/.codestable/work/epic-cs-continuous-learning-lifecycle.md index d4e8198..0b6e7f0 100644 --- a/.codestable/work/epic-cs-continuous-learning-lifecycle.md +++ b/.codestable/work/epic-cs-continuous-learning-lifecycle.md @@ -1,7 +1,7 @@ --- epic: ../epics/cs-continuous-learning-lifecycle.md phase: executing -approved_revision: 4b0b8e8e0596e7ee42611864843512ecd9402970bb3682b5605f0dc0f8dcf01a +approved_revision: 44ae22f3cc8cb675686a143bf0deff5a06bd7231ceb8f92274042e0a4bcd17e7 current_item: LEARN-3 next_action: wait for fresh owner authorization before any real probe; do not resume the interrupted checkpoint blocked_by: null @@ -265,3 +265,13 @@ remote_publish: each-milestone 后续真实 probe 与新 identity calibration 均等待 owner 逐次显式授权,不恢复中断 checkpoint。 - pipeline 输入已重置为 `prepared-awaiting-commit` / probe pending / `real_llm_runs_started=false`;该字段只 描述尚未运行的新 source。真实 probe、CLI 或 calibration 均须 owner 重新逐次授权,本流程不自动执行。 +- owner 批准持续学习契约澄清方向:read-repair 只做一次有界、最低成本的定向核实且不得为 lesson + 反复复现或运行大范围测试;排除具体且合理的错误路径也算真实影响;`validated` 必须记录行为变化与 + 本次通过的验收证据。稳定契约已同步回永久 Epic,按 lifecycle 重置批准 revision 并等待 fresh review + 后的 owner 确认;目标、范围、验收阈值与子项定义未改变。 +- 契约 tests-first 先得 `5 failed, 35 passed`,同步 5 个 shipped Skill、ADR-006 与中英文 WORKFLOW 后 + 转为 `40 passed`;连同分发/package 测试为 `75 passed, 1 skipped`,plugin checker 通过。freeze 仍为 + prepared/pending/false,33 inputs / 26 external inputs 逐项匹配,未执行真实 CLI、probe 或模型运行。 +- 契约澄清 fresh review:Paseo `c06c2e6a`,Opus 5 / high / plan,冻结 patch `2ccbaf55...d9619`、 + tree `649332c7...293b02`;`0 blocking / 0 important / 3 nit`,新永久 Epic hash + `44ae22f3...d17e7` 可确认。owner 随后正式确认该 revision;三条 nit 均为可选措辞粒度,不影响合入。 diff --git a/WORKFLOW.en.md b/WORKFLOW.en.md index f13a3f6..d24098d 100644 --- a/WORKFLOW.en.md +++ b/WORKFLOW.en.md @@ -90,16 +90,19 @@ a durable record; remove it when complete unless the owner asks to retain it. ## Project-Local Continuous Learning -- Each task skill observes silently during the task. It reports - `lesson hit: {path} ({status}); check: {fact}; impact: {plan_or_check}` only after current code, tests, or - canonical docs confirm the lesson and it actually changes the plan or verification; keyword overlap alone is - not reuse. +- Each task skill observes silently during the task. Read-repair performs one bounded, lowest-cost targeted check + against existing code, tests, or canonical docs; it must not run broad tests or repeat reproductions solely to + verify a lesson. If that check is insufficient, it skips the lesson without blocking the task. It reports + `lesson hit: {path} ({status}); check: {fact}; impact: {plan_or_check}` only when current facts hold and the + lesson changes the plan or verification, or explicitly rules out a concrete, plausible wrong path; keyword + overlap alone is not reuse. - A crystallization candidate exists only in the current session. Ordinary work shows at most one candidate and stays quiet without a strong signal. Epic items add no pause: each may place one deduplicated candidate in the existing cursor evidence, and the final graduation list handles them together. -- The lesson lifecycle is observed / validated / retired. A new lesson starts observed, reaches validated only - after successful use in an independent later task, and becomes retired when facts contradict it, its scope - expires, or a stronger owner exists. +- The lesson lifecycle is observed / validated / retired. A new lesson starts observed and reaches validated only + after successful use in an independent later task that records the lesson-caused plan or verification change, + or the concrete plausible wrong path it ruled out, together with the task's passing acceptance evidence. It + becomes retired when facts contradict it, its scope expires, or a stronger owner exists. - Read-repair permits only narrow state maintenance on an existing matched lesson; stable validated hits create no file churn. New lessons still require explicit authorization, as do rule/scope rewrites, promotion, deletion, and cross-project sharing; none may be inferred from task-execution authorization. diff --git a/WORKFLOW.md b/WORKFLOW.md index 26521c6..aaac2af 100644 --- a/WORKFLOW.md +++ b/WORKFLOW.md @@ -56,13 +56,15 @@ bug / 行为异常 -> cs-issue ----------> cs-review(高风险或按需) ## 项目内持续学习 -- 四个 task skill 在任务内静默观察,只把经当前代码、测试或 canonical 文档核实且真实改变计划或 - 验证的 lesson 报告为 `经验命中:{path}({status});核验:{fact};影响:{plan_or_check}`; - 纯关键词碰撞不算复用。 +- 四个 task skill 在任务内静默观察。lesson 只做一次有界、最低成本的定向核实,不为此运行大范围 + 测试或反复复现;仍不足时跳过,不阻塞正常任务。只有当前事实成立,且真实改变计划或验证,或 + 明确排除一个具体且合理的错误路径时,才报告为 + `经验命中:{path}({status});核验:{fact};影响:{plan_or_check}`;纯关键词碰撞不算复用。 - 晶化候选只存在于当前会话内。普通任务最多展示一条最高价值候选,无强信号就不显示; Epic 子项不新增暂停,每项最多把一条去重候选写入既有游标证据区,最终毕业清单统一处理。 - lesson 生命周期为 observed / validated / retired。新条目从 observed 开始,只有独立后续任务中 - 的有效命中和成功验证才能进入 validated;事实反证、scope 失效或已有更强 owner 时进入 retired。 + 的有效命中和成功验证才能进入 validated,并须记录实际行为变化与本次通过的验收证据;事实反证、 + scope 失效或已有更强 owner 时进入 retired。 - read-repair 只允许已有命中条目的窄状态维护;稳定 validated 命中不写文件。 新 lesson 仍需显式授权,规则/scope 改写、晋升、删除和跨项目分享也不能从任务执行授权中推断。 - 机械 guard 优先:能在当前任务范围内落成测试、checker、lint、类型或 helper 的错误,不再写重复 diff --git a/docs/adr/006-project-learning-lifecycle.md b/docs/adr/006-project-learning-lifecycle.md index 92c48e9..f2da370 100644 --- a/docs/adr/006-project-learning-lifecycle.md +++ b/docs/adr/006-project-learning-lifecycle.md @@ -75,7 +75,7 @@ canonical owner。网络波动、拼写、活动记录、泛化口号和已被 | status | 判据 | |---|---| | `observed` | 单次任务有证据,尚未在独立后续任务验证 | -| `validated` | 非创建该 lesson 的后续任务和 agent invocation 中有效命中,真实改善行为并验证成功 | +| `validated` | 非创建该 lesson 的后续任务和 agent invocation 中有效命中,真实改善行为并验证成功;具体表现为改变计划或验证,或明确排除一个具体且合理的错误路径 | | `retired` | 被仓库事实反证、范围完全失效,或已被更强 owner 替代;不得再应用 | 旧 lesson 缺少 `status` 时按 `observed` 读取,不批量迁移;只有真实状态变化或 `cs-keep` 本来就要 @@ -83,8 +83,10 @@ canonical owner。网络波动、拼写、活动记录、泛化口号和已被 ### Read-repair 与窄维护授权 -task skill 应用 lesson 前必须 read-repair:`retired` 不应用;`observed` / `validated` 先用当前代码、 -测试或 canonical 文档核实。只有条目 scope 符合、事实仍成立且真实改变计划或验证时,才报告 +task skill 应用 lesson 前必须 read-repair:`retired` 不应用;`observed` / `validated` 只做一次有界、最低成本的定向核实, +优先读取已有代码、测试或 canonical 文档;不得仅为核实 lesson 运行大范围测试 +或反复复现。一次定向核实仍不足时跳过该 lesson,不阻塞正常任务。只有条目 scope 符合、事实仍成立, +且真实改变计划或验证,或明确排除一个具体且合理的错误路径时,才报告 `经验命中:{path}({status});核验:{fact};影响:{plan_or_check}`;纯关键词碰撞或只是读过不算 有效命中。 @@ -92,7 +94,8 @@ task skill 应用 lesson 前必须 read-repair:`retired` 不应用;`observed 普通任务候选,或 Epic 最终毕业 gate。为使 read-repair 不中断任务,仅对已有且有效命中的 lesson 开放两种无需新增确认的窄维护: -- `observed -> validated`:独立后续任务确实采用并验证成功,只补一次代表性证据; +- `observed -> validated`:独立后续任务确实采用并验证成功,只补一次代表性证据;必须记录 lesson + 实际改变的计划或验证,或明确排除的具体且合理错误路径,以及本次通过的验收证据; - `observed|validated -> retired`:当前仓库事实直接反证,或发现已有 canonical owner,只写退役原因 与替代/反证指针。 diff --git a/docs/why-codestable.en.md b/docs/why-codestable.en.md index ce259da..87a69ba 100644 --- a/docs/why-codestable.en.md +++ b/docs/why-codestable.en.md @@ -59,8 +59,9 @@ Only active cross-session state uses a temporary work cursor. Ordinary work reli ## Experience Evolves Through Verification Experience is not an activity log. CodeStable silently recognizes crystallization moments that truly change a -plan, root cause, or verification, and keeps a candidate only when it has evidence, applies beyond the exact diff, -and has no stronger owner. Without a strong signal, completion gains no extra ritual. +plan, root cause, or verification, or explicitly rules out a concrete, plausible wrong path. It keeps a candidate +only when it has evidence, applies beyond the exact diff, and has no stronger owner. Without a strong signal, +completion gains no extra ritual. A lesson is staging, not a permanent archive. An independent later task validates it; changed facts retire it; and mechanizable failures move into tests or checkers. The project accumulates methods that reduce failure instead diff --git a/docs/why-codestable.md b/docs/why-codestable.md index 3887ede..172cd8f 100644 --- a/docs/why-codestable.md +++ b/docs/why-codestable.md @@ -56,8 +56,8 @@ CodeStable 坚持一个事实只有一个 canonical owner:稳定产品事实 ## 经验通过验证演化 -经验不是活动日志。CodeStable 在任务中静默识别真正改变方案、根因或验证的晶化时刻,只把有证据、 -适用于本次精确 diff 之外且尚无更强 owner 的结论作为候选。没有强信号时不增加收尾仪式。 +经验不是活动日志。CodeStable 在任务中静默识别真正改变方案、根因或验证,或明确排除一个具体且合理的错误路径 +的晶化时刻,只把有证据、适用于本次精确 diff 之外且尚无更强 owner 的结论作为候选。没有强信号时不增加收尾仪式。 lesson 是 staging,不是永久档案。它先被观察,再由独立后续任务验证;事实变化时会退役,能机械化 时则进入测试或 checker。这样项目积累的是降低失败率的方法,而不是不断增长的文字规则。 diff --git a/experiments/cs-learning-transfer-001/freeze.json b/experiments/cs-learning-transfer-001/freeze.json index 0242258..659f8c9 100644 --- a/experiments/cs-learning-transfer-001/freeze.json +++ b/experiments/cs-learning-transfer-001/freeze.json @@ -61,11 +61,11 @@ ".claude/skills/eval-cs-skill/scripts/scorers/learning_transfer.py": "d34ba315c065b880c0043af94a9ca87bd275d7b18e4ee3d8346858d33fdbebce", ".claude/skills/eval-cs-skill/scripts/sequence.py": "c4059892481527bce85964b80375f23524b4427b3d879fa84e7b99c821e958b5", "experiments/seeds/dispatchboard-learning/build-seed.py": "4c7f7090abe69aca0b6be2a3568c85a91345374a4879f94da9f6704f028689b1", - "plugins/codestable/skills/cs-epic/SKILL.md": "4f67e0efc6aa446eceaf3e57bf31b4fcc18af7ba87ce927be6b4bbb0d35407aa", - "plugins/codestable/skills/cs-feat/SKILL.md": "54261caf4d0cb8f01b225c3041d41476691efbaa29a5390e7f9887c9cbfb70ff", - "plugins/codestable/skills/cs-issue/SKILL.md": "203ca2710355a56a12236c2d55f57e7264b744be4f13edd633af4f352be1b707", - "plugins/codestable/skills/cs-keep/SKILL.md": "3d2d2cbb0114b963b1847f3d2caaa2d58db193cbf1cf38039d5b52044d3dd6ca", - "plugins/codestable/skills/cs-refactor/SKILL.md": "a225c692ce7776f9305b14cbb7c424656304cbe2b59c0a70aeedb3802e5b01b8" + "plugins/codestable/skills/cs-epic/SKILL.md": "e3f4c89ce04e41db022935bf251a012fe2cf613226d24f339569ef9d65e510dd", + "plugins/codestable/skills/cs-feat/SKILL.md": "df8d3de6f7bb4925024f24d93290c9a644bf24b2359588eeee51cc57ce9c7047", + "plugins/codestable/skills/cs-issue/SKILL.md": "fa36e43ff0785e13fcfdc222fd87b15fb22a38bbb5e9872c338a401a1320e88a", + "plugins/codestable/skills/cs-keep/SKILL.md": "1d8f56aae90ab45b0ab966ae15c42d8d958e1a3a1a29ca2e196871afda90354d", + "plugins/codestable/skills/cs-refactor/SKILL.md": "a3b5e29ae6919969e659799faed8513dbd8dad7b3713cee09aae1edcf35e7871" }, "inputs": { "_asset_mutations.py": "fe952ddc35ddc1fd0976627043383f9b4d4ec05fd8202ac5fe963bdd0b904210", diff --git a/plugins/codestable/skills/cs-epic/SKILL.md b/plugins/codestable/skills/cs-epic/SKILL.md index 759143d..7fd71c0 100644 --- a/plugins/codestable/skills/cs-epic/SKILL.md +++ b/plugins/codestable/skills/cs-epic/SKILL.md @@ -20,8 +20,10 @@ argument-hint: "[大需求描述]" ## 持续学习 -检索到 lesson 后先做 read-repair。只有 scope 符合、未退役、经当前代码/测试/canonical 文档核实, -并真实改变计划或验证的条目才算有效命中;按 +检索到 lesson 后先做 read-repair。只做一次有界、最低成本的定向核实,优先读取已有代码、测试或 +canonical 文档;不得仅为核实 lesson 运行大范围测试或反复复现。仍不足时跳过该 lesson,不阻塞正常任务。 +只有 scope 符合、未退役、当前事实成立,并真实改变计划或验证,或明确排除一个具体且合理的错误路径 +的条目才算有效命中;按 `经验命中:{path}({status});核验:{fact};影响:{plan_or_check}` 报告。`retired` 不应用; `observed` / `validated` 先核实再用;旧 lesson 缺 `status` 按 `observed` 读取,不批量迁移。只是相关 但没有改变行为时不制造复用证据;当前事实明确反证时立即停止应用,证据不足时不猜。 @@ -36,7 +38,8 @@ owner。网络波动、拼写、泛化口号、活动记录,以及已被机械 创建、改写规则/scope、晋升、删除与跨项目反馈仍须用户显式授权。为不中断 read-repair,仅对已有且 有效命中的 lesson 开放两种窄维护:`observed -> validated` 仅在独立后续任务确实采用并验证成功时 -发生,只补一次代表性证据;`observed|validated -> retired` 仅在当前仓库事实直接反证或发现已有 +发生,只补一次代表性证据;必须记录 lesson 实际改变的计划或验证,或明确排除的具体且合理错误路径, +以及本次通过的验收证据。`observed|validated -> retired` 仅在当前仓库事实直接反证或发现已有 canonical owner 时发生,只写原因与替代/反证指针。窄维护不新建事实、不改规则、不扩 scope、不新增 gate,随当次代码、证据和 游标进入同一语义原子 milestone;稳定 validated 命中不写文件。需要改写结论或证据不足时只给 diff --git a/plugins/codestable/skills/cs-feat/SKILL.md b/plugins/codestable/skills/cs-feat/SKILL.md index 5255c8d..884e060 100644 --- a/plugins/codestable/skills/cs-feat/SKILL.md +++ b/plugins/codestable/skills/cs-feat/SKILL.md @@ -20,8 +20,10 @@ argument-hint: "[功能描述]" ## 持续学习 -检索到 lesson 后先做 read-repair。只有 scope 符合、未退役、经当前代码/测试/canonical 文档核实, -并真实改变计划或验证的条目才算有效命中;按 +检索到 lesson 后先做 read-repair。只做一次有界、最低成本的定向核实,优先读取已有代码、测试或 +canonical 文档;不得仅为核实 lesson 运行大范围测试或反复复现。仍不足时跳过该 lesson,不阻塞正常任务。 +只有 scope 符合、未退役、当前事实成立,并真实改变计划或验证,或明确排除一个具体且合理的错误路径 +的条目才算有效命中;按 `经验命中:{path}({status});核验:{fact};影响:{plan_or_check}` 报告。`retired` 不应用; `observed` / `validated` 先核实再用;旧 lesson 缺 `status` 按 `observed` 读取,不批量迁移。只是相关 但没有改变行为时不制造复用证据;当前事实明确反证时立即停止应用,证据不足时不猜。 @@ -36,7 +38,8 @@ owner。网络波动、拼写、泛化口号、活动记录,以及已被机械 创建、改写规则/scope、晋升、删除与跨项目反馈仍须用户显式授权。为不中断 read-repair,仅对已有且 有效命中的 lesson 开放两种窄维护:`observed -> validated` 仅在独立后续任务确实采用并验证成功时 -发生,只补一次代表性证据;`observed|validated -> retired` 仅在当前仓库事实直接反证或发现已有 +发生,只补一次代表性证据;必须记录 lesson 实际改变的计划或验证,或明确排除的具体且合理错误路径, +以及本次通过的验收证据。`observed|validated -> retired` 仅在当前仓库事实直接反证或发现已有 canonical owner 时发生,只写原因与替代/反证指针。窄维护不新建事实、不改规则、不扩 scope、不新增 gate,随当次代码、证据和 游标进入同一语义原子 milestone;稳定 validated 命中不写文件。需要改写结论或证据不足时只给 diff --git a/plugins/codestable/skills/cs-issue/SKILL.md b/plugins/codestable/skills/cs-issue/SKILL.md index aa5d108..fd29b00 100644 --- a/plugins/codestable/skills/cs-issue/SKILL.md +++ b/plugins/codestable/skills/cs-issue/SKILL.md @@ -18,8 +18,10 @@ argument-hint: "[问题描述]" ## 持续学习 -检索到 lesson 后先做 read-repair。只有 scope 符合、未退役、经当前代码/测试/canonical 文档核实, -并真实改变计划或验证的条目才算有效命中;按 +检索到 lesson 后先做 read-repair。只做一次有界、最低成本的定向核实,优先读取已有代码、测试或 +canonical 文档;不得仅为核实 lesson 运行大范围测试或反复复现。仍不足时跳过该 lesson,不阻塞正常任务。 +只有 scope 符合、未退役、当前事实成立,并真实改变计划或验证,或明确排除一个具体且合理的错误路径 +的条目才算有效命中;按 `经验命中:{path}({status});核验:{fact};影响:{plan_or_check}` 报告。`retired` 不应用; `observed` / `validated` 先核实再用;旧 lesson 缺 `status` 按 `observed` 读取,不批量迁移。只是相关 但没有改变行为时不制造复用证据;当前事实明确反证时立即停止应用,证据不足时不猜。 @@ -34,7 +36,8 @@ owner。网络波动、拼写、泛化口号、活动记录,以及已被机械 创建、改写规则/scope、晋升、删除与跨项目反馈仍须用户显式授权。为不中断 read-repair,仅对已有且 有效命中的 lesson 开放两种窄维护:`observed -> validated` 仅在独立后续任务确实采用并验证成功时 -发生,只补一次代表性证据;`observed|validated -> retired` 仅在当前仓库事实直接反证或发现已有 +发生,只补一次代表性证据;必须记录 lesson 实际改变的计划或验证,或明确排除的具体且合理错误路径, +以及本次通过的验收证据。`observed|validated -> retired` 仅在当前仓库事实直接反证或发现已有 canonical owner 时发生,只写原因与替代/反证指针。窄维护不新建事实、不改规则、不扩 scope、不新增 gate,随当次代码、证据和 游标进入同一语义原子 milestone;稳定 validated 命中不写文件。需要改写结论或证据不足时只给 diff --git a/plugins/codestable/skills/cs-keep/SKILL.md b/plugins/codestable/skills/cs-keep/SKILL.md index e9b53f8..be74cc7 100644 --- a/plugins/codestable/skills/cs-keep/SKILL.md +++ b/plugins/codestable/skills/cs-keep/SKILL.md @@ -56,13 +56,13 @@ date: YYYY-MM-DD | status | 判据 | |---|---| | `observed` | 单次任务已有证据,尚未在独立后续任务验证 | -| `validated` | 非创建该 lesson 的任务和 agent invocation 中有效命中,真实改善行为并验证成功 | +| `validated` | 非创建该 lesson 的任务和 agent invocation 中有效命中,真实改善行为并验证成功;具体表现为改变计划或验证,或明确排除一个具体且合理的错误路径 | | `retired` | 被仓库事实反证、scope 完全失效或已有更强 canonical owner;不得应用且不再复活原结论 | - 新 lesson 一律从 `observed` 开始;不能把创建该 lesson 的同一任务自证为 validated,也不因命中 次数或模型自评晋级。 - 旧 lesson 缺 `status` 按 `observed` 读取,不批量迁移;只在真实状态变化或本来就要更新时补字段。 -- `observed -> validated` 只在独立后续任务确实采用并验证成功时发生,并只补一次代表性证据。 +- `observed -> validated` 只在独立后续任务确实采用并验证成功时发生,并只补一次代表性证据;必须记录 lesson 实际改变的计划或验证,或明确排除的具体且合理错误路径,以及本次通过的验收证据。 - `observed|validated -> retired` 只写反证/替代原因与指针。retired 条目上的新结论必须另建 observed lesson,不继承旧条目的 validated 身份。 - 稳定 validated 命中不产生文件 churn。不得保存原始对话、逐次命中日志或无限 evidence history。 diff --git a/plugins/codestable/skills/cs-refactor/SKILL.md b/plugins/codestable/skills/cs-refactor/SKILL.md index 735fe4e..3be810c 100644 --- a/plugins/codestable/skills/cs-refactor/SKILL.md +++ b/plugins/codestable/skills/cs-refactor/SKILL.md @@ -17,8 +17,10 @@ argument-hint: "[重构目标]" ## 持续学习 -检索到 lesson 后先做 read-repair。只有 scope 符合、未退役、经当前代码/测试/canonical 文档核实, -并真实改变计划或验证的条目才算有效命中;按 +检索到 lesson 后先做 read-repair。只做一次有界、最低成本的定向核实,优先读取已有代码、测试或 +canonical 文档;不得仅为核实 lesson 运行大范围测试或反复复现。仍不足时跳过该 lesson,不阻塞正常任务。 +只有 scope 符合、未退役、当前事实成立,并真实改变计划或验证,或明确排除一个具体且合理的错误路径 +的条目才算有效命中;按 `经验命中:{path}({status});核验:{fact};影响:{plan_or_check}` 报告。`retired` 不应用; `observed` / `validated` 先核实再用;旧 lesson 缺 `status` 按 `observed` 读取,不批量迁移。只是相关 但没有改变行为时不制造复用证据;当前事实明确反证时立即停止应用,证据不足时不猜。 @@ -33,7 +35,8 @@ owner。网络波动、拼写、泛化口号、活动记录,以及已被机械 创建、改写规则/scope、晋升、删除与跨项目反馈仍须用户显式授权。为不中断 read-repair,仅对已有且 有效命中的 lesson 开放两种窄维护:`observed -> validated` 仅在独立后续任务确实采用并验证成功时 -发生,只补一次代表性证据;`observed|validated -> retired` 仅在当前仓库事实直接反证或发现已有 +发生,只补一次代表性证据;必须记录 lesson 实际改变的计划或验证,或明确排除的具体且合理错误路径, +以及本次通过的验收证据。`observed|validated -> retired` 仅在当前仓库事实直接反证或发现已有 canonical owner 时发生,只写原因与替代/反证指针。窄维护不新建事实、不改规则、不扩 scope、不新增 gate,随当次代码、证据和 游标进入同一语义原子 milestone;稳定 validated 命中不写文件。需要改写结论或证据不足时只给 diff --git a/tests/test_skill_contracts.py b/tests/test_skill_contracts.py index 626321f..b08b5af 100644 --- a/tests/test_skill_contracts.py +++ b/tests/test_skill_contracts.py @@ -31,7 +31,11 @@ LESSON_READ_REPAIR_CONTRACT = { "旧 lesson 缺 `status` 按 `observed` 读取", "`retired` 不应用", "`observed` / `validated` 先核实再用", + "只做一次有界、最低成本的定向核实", + "不得仅为核实 lesson 运行大范围测试或反复复现", + "仍不足时跳过该 lesson,不阻塞正常任务", "只是相关但没有改变行为时不制造复用证据", + "明确排除一个具体且合理的错误路径", "当前事实明确反证时立即停止应用", "证据不足时不猜", } @@ -60,6 +64,8 @@ NARROW_LESSON_MAINTENANCE_CONTRACT = { "`observed -> validated`", "独立后续任务确实采用并验证成功", "只补一次代表性证据", + "必须记录 lesson 实际改变的计划或验证", + "本次通过的验收证据", "`observed|validated -> retired`", "当前仓库事实直接反证", "发现已有 canonical owner", @@ -380,6 +386,9 @@ def test_keep_owns_the_three_state_lesson_lifecycle() -> None: "`validated`", "非创建该 lesson 的任务和 agent invocation 中有效命中", "真实改善行为并验证成功", + "明确排除一个具体且合理的错误路径", + "必须记录 lesson 实际改变的计划或验证", + "本次通过的验收证据", "`retired`", "不得应用且不再复活原结论", "旧 lesson 缺 `status` 按 `observed` 读取", diff --git a/tests/test_v2_architecture_contract.py b/tests/test_v2_architecture_contract.py index 6912ffb..56693e0 100644 --- a/tests/test_v2_architecture_contract.py +++ b/tests/test_v2_architecture_contract.py @@ -99,16 +99,21 @@ def test_v1_feedback_promoter_is_explicitly_legacy_only() -> None: def test_project_learning_lifecycle_is_an_accepted_narrow_staging_contract() -> None: adr6 = ROOT / "docs/adr/006-project-learning-lifecycle.md" + epic = ROOT / ".codestable/epics/cs-continuous-learning-lifecycle.md" assert adr6.is_file() + assert epic.is_file() assert _frontmatter(adr6)["status"] == "Accepted" text = adr6.read_text(encoding="utf-8") for anchor in ( "在任务中静默观察", "最多保留 3 条候选", "read-repair", + "一次有界、最低成本的定向核实", + "具体且合理的错误路径", "必须优先机械化", "`observed -> validated`", + "本次通过的验收证据", "`observed|validated -> retired`", "显式授权", "feedback runtime", @@ -120,6 +125,14 @@ def test_project_learning_lifecycle_is_an_accepted_narrow_staging_contract() -> ): assert anchor in text + epic_text = epic.read_text(encoding="utf-8") + for anchor in ( + "一次有界、最低成本的定向核实", + "明确排除一个具体且合理的错误路径", + "本次通过的验收证据", + ): + assert anchor in epic_text + def test_project_learning_does_not_restore_feedback_or_global_runtime_state() -> None: active_skills = { diff --git a/tests/test_v2_documentation_contract.py b/tests/test_v2_documentation_contract.py index 848aeac..256f9f0 100644 --- a/tests/test_v2_documentation_contract.py +++ b/tests/test_v2_documentation_contract.py @@ -496,6 +496,9 @@ def test_project_learning_lifecycle_is_bilingual_and_low_interruption() -> None: for anchor in ( "任务内静默观察", "经验命中:{path}({status});核验:{fact};影响:{plan_or_check}", + "一次有界、最低成本的定向核实", + "明确排除一个具体且合理的错误路径", + "本次通过的验收证据", "observed / validated / retired", "普通任务最多展示一条", "Epic 子项不新增暂停", @@ -507,6 +510,9 @@ def test_project_learning_lifecycle_is_bilingual_and_low_interruption() -> None: for anchor in ( "observes silently during the task", "lesson hit: {path} ({status}); check: {fact}; impact: {plan_or_check}", + "one bounded, lowest-cost targeted check", + "explicitly rules out a concrete, plausible wrong path", + "the task's passing acceptance evidence", "observed / validated / retired", "at most one candidate", "Epic items add no pause", @@ -520,6 +526,12 @@ def test_project_learning_lifecycle_is_bilingual_and_low_interruption() -> None: ("README.md", "README.en.md", "边做边识别晶化时刻", "recognizes crystallization moments while working"), ("SKILL_CATALOG.md", "SKILL_CATALOG.en.md", "observed / validated / retired", "observed / validated / retired"), ("docs/why-codestable.md", "docs/why-codestable.en.md", "经验不是活动日志", "Experience is not an activity log"), + ( + "docs/why-codestable.md", + "docs/why-codestable.en.md", + "排除一个具体且合理的错误路径", + "rules out a concrete, plausible wrong path", + ), ) for zh_path, en_path, zh_anchor, en_anchor in public_pairs: assert _contains_contract(_read(zh_path), zh_anchor)