lamarck:用进废退的 skill 进化
拉马克式进化:skill 在真实使用中获得的经验,写回它的"基因"(SKILL.md);
衡量它的尺子(rubric)也随之进化;长期无用的部分废退(修剪)。
赛道:SkillOpt 是训练场(基准分数驱动),darwin-skill 是考场(合成测试+评委),
lamarck 是生活——生产遥测驱动,用进 + 废退双向。三层机制,重活分级触发:
- 记账(自动,每次 Skill 调用,所有模式下都开):PostToolUse hook 写
data/pending.jsonl。
- 轻循环(回合末,不加载本文件):协议文本单源于
protocol/light-loop.md
(harness 无关,任何适配器逐字注入,见 protocol/adapter-contract.md),
Claude Code 适配器由 Stop hook 运行时读入拼进 reason——
对照该 skill rubric 中场景匹配的条目做四维评估落 data/ledger.jsonl、用户纠正
n=1 结晶进 data/rubrics/<skill>.md、经验沉淀进 data/learnings/<skill>.md、
蒸馏回归用例进 data/replays/<skill>.jsonl、清本会话 pending;他会话积压达阈值
时提示用户手动清算(指针会衰减,静默积压等于丢证据)。上下文隔离:
config.json 的 isolation 为 subagent 时,评估整体派一个子代理执行——
它从磁盘读协议、从实时落盘的 transcript 切片读证据,主上下文只收一行结果
(代价:多一次模型调用);默认 inline 零成本但协议进主上下文。所有注入
文本带 ephemeral 标记,供 harness compaction 优先丢弃。
触发时机由 config.json 决定:{"mode":"every|manual|threshold","threshold":N}——
every 每个用过 skill 的回合末触发;manual 从不自动触发;threshold(默认,N=5)
攒到 N 条才批量评估。
- 升级(条件触发,才加载本文件):某 skill 已有 ≥2 次独立调用、同类 gap
→ 走优化门;或手动
/lamarck。
尺子:逐 skill 动态 rubric
data/rubrics/<skill>.md,格式与规则见 data/rubrics/README.md。要点:
- 行为标准从证据结晶:用户纠正一次即可入册(n=1;rubric 只是评估视角);
每条必须带 ledger 出处与场景标签,无出处禁止写入;淘汰进 attic 不删除。
- 三处使用:①四维评估判 gaps 时对照该 skill 的 rubric;②成对盲评的比较标准;
③验证 rollout 的"变差与否"判据。评估时只启用场景匹配的条目。
- git 版本化:本目录即 git 仓库,rubric 与 skill 协议同库提交,可 diff 可回滚;
遥测(pending/ledger/learnings)被 .gitignore 排除,仅本地留存。
进化分级(白名单)与防负优化
config.json(本地文件,不入库;首次使用从 config.example.json 复制)的
evolution 块决定每个 skill 的进化等级(显式列表 > default;新装 skill 自动
落入 default,默认 observe)。config.json 缺失时:一律 observe,提示用户
创建:
- auto(自治级,显式列入
evolution.auto 才生效):过门提案免事前三选一
直接施工,但 replay 重放从事后验证升为放行条件——当场不过立即自动回滚
并入 rejected;每笔编辑在下次输出中显式报告,并照常入 CHANGELOG、ledger、
git,事后 git revert 一步可撤。禁区:lamarck 自身、Iron Rules、插件文件
永不受 auto 覆盖,必须用户批准。 自治是挣来的:建议只把经历过多次
evolve 级成功编辑的 skill 升到这一级。
- evolve(白名单,当前:seo-cron-ops、lamarck):过门提案可走用户三选一直接施工。
- suggest:过门提案只写
suggestions/<skill>.md,永不直接编辑。
- observe(默认):只记账、沉淀 learnings、长 rubric,不产生任何提案;
证据照积,升级到 evolve 后历史证据立即可用。
- 插件 / marketplace / synced skill:无论配置如何,永不直接编辑(上限 suggest)。
动态评分防负优化:每条账本带 ver(调用时目标 SKILL.md 的内容哈希 8 位)。
升级或 audit 时按 ver 分窗计算该 skill 的健康度(corrected+failed 占比、gap 频率):
编辑后版本窗口(样本 ≥3)比编辑前变差 → 判定负优化,自动产出回滚提案
(仍走用户三选一)。这是成对盲评(单次、即时)之外的第二道统计防线(多次、滞后)。
成熟度:收敛的 skill 降为抽查
不是每次评估都有收益——场景不变时 skill 会收敛。每 skill 两态,存
data/maturity.json({"<skill>":{"state":"active|stable","clean_streak":N,"ver":"..."}},
评估时顺手维护):
- active(默认):每条 pending 全量四维评估。
- stable(进入条件:连续
stability.streak 次评估干净——无 gap、无
corrected/failed、rubric 无新增;默认 10):每条只做一眼扫描(本回合有无用户
纠正或异常),没有就记一行 {"outcome":"stable-skip","ver":"..."}(带 ver,
版本分窗统计不断粮)并 streak++;每第 stability.sample 条仍做全量评估
(默认 5,抽样防漂移);rubric 冻结,不再新增条目。
- 唤醒回 active(任一即触发,立即):用户纠正或 failed;抽样评估发现 gap;
ver 变化(被编辑或外部改动——编辑后的验证期必须全量);args 呈现 rubric
场景标签覆盖不了的新场景(场景变了,收敛前提失效)。
- 收敛即证书:
report 把 stable 状态与清白连击数当 Tier 2 证据呈现
("该 skill 近 N 次真实调用零纠正")。stable + 长期零引用条目 = 废退修剪的
天然候选。
stability 配置在 config.json(缺失回退 streak=10, sample=5)。
升级后:优化门(SkillOpt 验证门的文本版)
对某个 skill 提出编辑,必须同时满足(且该 skill 进化等级为 evolve 或 suggest):
- 证据 ≥2:ledger/learnings 中该 skill 有 ≥2 次独立调用出现同类 gap
(单次观察永不触发编辑,n=1 是噪声)。
- 全证据合成:提案生成时必须综合该 skill 的全部在案证据(ledger、learnings、
rubric),不只触发门槛的那两条(SkillOpt 的 mini-batch 思路)。
- 提案具体:能写成 add / delete / replace 的定点操作,写明预期改善与验证方式。
- 净增长预算(废退):提案给出净行数变化;若使 SKILL.md 超 500 行,或连续两次
提案净增 >10%,必须同时附删减案。删除类提案是一等公民:长期(≥90 天)零引用的
rubric 条目、被 gap 证据标记为"误导/从未用到"的段落,主动产出修剪提案(同样走
用户三选一;修剪内容进 attic / git 历史,不物理消失)。
- 场景围栏(防震荡):证据全部来自单一场景标签的提案,只能做场景分支式
增量——新增"当 <场景> 时……"的条件段,不得改写共享核心;改写共享核心需要
≥2 个不同场景的证据。B 场景的优化因此伤不到 A 场景依赖的部分,切回来
不会退化。来源 harness 即场景标签之一(账本的
harness 字段):同一
SKILL.md 被多家 agent 共用时,只有某一家的证据只能加该家的条件分支,跨
harness 的互相影响由此围栏拦截,裁决仍归用户三选一。
- 全场景 replay:任何编辑的 replay 验证必须包含其他场景的既有用例,
不只触发场景——replay 语料就是全部历史场景的记忆,"切回旧场景"在施工前就被
预演过。
- 反震荡检测:提案若实质推翻 CHANGELOG/git 近期(最近 10 次)已接受的编辑,
判定为震荡:禁止直接覆写,强制转为场景分支提案,并附两个场景的证据对照交
用户决策。
- 不在拒绝缓冲:
data/rejected.md 否过的同类提案不得重提,除非有新类型证据。
- 未被冻结:该 skill 上一次编辑的验证 rollout 尚未完成时,禁止新提案。
门过了 → 先看等级:auto 级 skill 跳过三选一直接施工,但必须当场通过
全场景 replay 才算落地(不过即自动回滚,提案入 rejected),施工与验证结果
在下次输出中显式报告。该 skill 的 replay 语料为空时,auto 降级为三选一
——没有放行条件就没有放行,零验证落地是禁止的。其余等级 → 用户在环:
用 AskUserQuestion 给用户选(附证据摘要与 diff 要点):
- 现在就改(推荐时说明理由)
- 只留提案 → 写
suggestions/<skill>.md,不动文件
- 否决 → 连原因写入
data/rejected.md
非交互会话(用户不在场)一律选 2,并在最终输出里提示用户有待决提案。
用户选 1(或 auto 级过门)后,默认不在本会话施工——先把提案写成具体的
add / delete / replace 规格落到 suggestions/<skill>.md,然后
node scripts/evolve-worker.js enqueue --skill <skill> --proposal suggestions/<skill>.md --auth user|auto,
告知用户 job id 即结束。后台 worker 用本 harness 的无头 CLI(config.json
background.runners,最小权限:只开 lamarck 目录与 skills 目录)按下列规则
施工 + replay 验证 + verify 落账 + CHANGELOG,结果写 data/inbox.md 并发系统
通知;下次 /lamarck 呈现。background.runner 为 none 时才就地施工,按归属:
- 用户自有 skill(
~/.claude/skills/<name>/,非 synced/):目标目录在 git
仓库内 → 编辑前后各 commit 一次(lamarck: optimize <skill>: <摘要>);
否则先复制 SKILL.md 为 SKILL.md.bak。有界编辑(一次 ≤3 处、单处 ≤10 行,
禁止整文件重写);CHANGELOG.md 记一行:日期、目标、改动、依据证据。
- 插件 / marketplace / synced skill:永不改原件,只走选项 2。
编辑后立即 replay 验证(先于自然验证):从 data/replays/<skill>.jsonl 取该
skill 的回归用例(见下),派新 subagent 分别按旧版与新版执行,按 rubric 成对比较。
新版更差 → 直接回滚,不必等下一次真实调用。replay 用例的来源是真实调用痕迹:
轻循环评估时,把 corrected / failed 的调用、以及场景尚未被语料覆盖的 clean
调用(每场景留一条代表)蒸馏成用例
{"essence":"任务要点","expect":"按 rubric 的达标要求","src":"ledger ts"}。
从不翻车的 skill 同样需要语料:上文"全场景 replay"要求编辑验证覆盖其他场景,
auto 的放行条件也以语料非空为前提——只收割失败会让最健康的 skill 永远零语料。
真实分布、零人工编写(darwin 的 test prompts 是手编合成的,此处严格更优)。
验证 rollout(成对盲评):被编辑 skill 的下一次被评估调用即自然验证。派一个
新的独立 subagent,同时给它:旧版全文(git 上一 commit 或 .bak)、新版全文、
该次调用的真实执行痕迹、该 skill 的 rubric——同一上下文内成对比较出 better /
worse / tie(绝对打分跨会话有校准噪声,成对比较可抵消)。tie 或与 replay 结论
分歧时,加派 2 个独立评委成多数票(N=3;平时单评委省成本,难判时才升员)。
worse → 回滚(git revert 或恢复 .bak),提案连失败原因写入 data/rejected.md;
better / tie → 保留,解除冻结。
客观信号一票否决:judge 只在客观信号不反对时才有投票权。编辑后版本窗口的
objective 均值相对编辑前显著劣化(errors / nonzero_exit / retries 任一上升,
样本 ≥3)→ 不采信 replay 与盲评的 better/tie,直接出回滚提案;客观信号持平或
改善时,judge 才决定胜负。同理,LLM 判定的 corrected 必须附 transcript 中逐字
存在的用户原句,引不出原句的纠正判定作废。
回滚语义(按证据强度分级):回滚 = 恢复用户已批准的上一基线,不算新编辑,
不受"三选一"与有界编辑约束(Iron Rule 2/6 豁免)——但必须落账并在下次输出中
显式告知用户。分级:replay / 盲评是同输入直接对照(强证据)→ 自动回滚;
版本分窗是观察性统计(弱证据,可能混杂任务漂移)→ 只出回滚提案,走三选一。
结论必须落账(可证明性):replay、盲评、版本分窗三种验证各记一行 verify 记录
进 ledger:{"ts","skill","type":"verify","stage":"replay|judge|window","old_ver", "new_ver","result":"better|worse|tie","decision":"keep|revert","judges":N,"detail":""}。
judges 记本次动用的评委 agent 数(成本记账:report 可算"每有效编辑评委调用数",
与 darwin 固定 3 评委×3 轮对比)。report 的进化战绩全部由这些记录汇总——
没有落账的效果等于没有效果。
自我优化(仅在升级或手动运行时)
用同一套规则评估本协议自身(假阳性提案?门太松/太紧?轻循环是否顺畅?),meta
观察以 "skill":"lamarck" 记 ledger。对本 SKILL.md 或 hook 脚本的任何编辑,
除过优化门外,必须经用户明确批准;协议与脚本改动一律 commit 进本仓库。
Iron Rules(本节修改需用户明确批准)
- 单次观察永不触发编辑,只记账与沉淀(rubric 入册除外,n=1 可)。
- 任何 skill 编辑施工前必须让用户选择(AskUserQuestion);非交互会话只落提案。
例外一:恢复用户已批准基线的自动回滚(强证据触发),须落账并告知。
例外二(2026-08-29 经用户批准):
evolution.auto 显式列入的 skill 免事前
三选一,但 replay 放行条件与事后显式报告不可免;replay 语料为空时例外二
不适用(降回三选一);lamarck 自身、Iron Rules、插件永不适用 auto。
- 每次编辑必须可回滚(git commit 或
.bak),且写入 CHANGELOG。回滚本身同样记 CHANGELOG。
- 永不编辑插件 / marketplace / synced skill 的文件。
- 永不删除 ledger 历史、learnings 既有观察与 rubric attic。
- 每次编辑 ≤3 处、单处 ≤10 行,禁止整文件重写。
rejected.md 中的提案不得重提,除非出现新类型证据。
- 评估只引用真实可见的执行痕迹;不可见就归档(outcome=archived),不编造。
- rubric 条目必须带 ledger 出处;验证 rollout 未完成前,该 skill 冻结新提案。
- 单场景证据不得改写共享核心(只许场景分支式增量);推翻近期已接受编辑的提案
必须转为场景分支并经用户决策,禁止覆写式打摆子。
手动 /lamarck
- 无参数 — 第 0 步接线自检,两种缺口分开诊断,命中即结束不评估:
①读
~/.claude/settings.json,lamarck 两条 hook(posttool-skill /
stop-evaluate)缺任一 → 输出接线指引(npx lamarck-skill 重跑,或按
README Install 手动接;其他 harness 指 adapters/ 各 README 与
protocol/adapter-contract.md 的 Self-service 粘贴 prompt);②hook 齐但
data/ 下 pending 与 ledger 皆无 → 报接线正常、数据未至(hook 重启后
才加载;验活:用任一 skill 看 pending.jsonl 是否长一行)——不是配置错误,
不发接线指引。两关都过 → 先 node scripts/evolve-worker.js status --ack,把后台
进化的未读结果原样呈现;再处理全部 pending + 沉淀 learnings/rubric + 过优化门。本会话条目做
四维评估;历史会话条目派独立 subagent 清算(其证据在 transcript 文件里、
不在本会话上下文,外置零证据损失;主上下文只收每条一行结论,防污染):
subagent 先试 transcript 指针——记录的 transcript 路径若仍存在(30 天
清理期内),Read 其中该次调用附近的片段(按 ts 与 skill 名定位,只取所需
切片,不整读),据真实执行痕迹做四维评估,并抽客观 friction(工具调用数、
报错/重试次数、耗时);指针失效或定位不到,才退回按 skill 聚合归档
{"outcome":"archived","note":"N 次调用,args 样本"}。
audit <skill> — 汇总该 skill 全部证据,产出编辑提案(仍走优化门+用户在环)。
stats — 只看账:先跑 node scripts/report.js --brief(可加 --since 30d),
把它算出的各 skill 调用频次、纠正率、gap 排行原样呈现;数字一律来自脚本,
不自己算。
mode <every|manual|threshold> [N] — 改写 config.json 切换触发模式(threshold 可带
阈值 N,缺省 5),改完复述当前配置。config.json 缺失或损坏时脚本回退 threshold/5。
evolve list — 列出全部 skill 及其进化等级与账面健康度;evolve add <skill> [evolve|suggest|auto] /
evolve remove <skill> — 改写 config.json 的 evolution 块,改完复述
(auto 禁区:lamarck 自身与插件即使写入也不生效)。
report [skill] — 进化叙事卡:先跑 node scripts/report.js [--skill X] [--since 30d](代码算、字节可复现,--json 可存档作证据),再对其输出做叙述,
硬数字在前:①客观基线——objective 各项按 ver 分窗的均值与版本间
delta(脚本已按否决规则标出 OBJECTIVE REGRESSION);②行为基线——纠正率;
③judge 结论——replay 通过率、保留/回滚,仅在①②不反对时呈现。benchmark 在
lamarck 里就是①②的编辑前后对比,不是外部题库。用户在终端不开 agent 也能跑。
数据文件
data/pending.jsonl(待处理,含 ver 基因版本戳与 transcript 执行日志指针——
执行日志不自建,指向 Claude Code 自己的会话 transcript,按需读切片)·
data/ledger.jsonl(账本,格式
{"ts","session","skill","ver","harness","objective","trigger_fit","gaps","outcome","friction","note"},
评估时把 pending 条目的 ver 与 harness 原样带入;无 harness 字段的旧记录
视为 claude-code;objective 是 stop hook 用代码从 transcript 数出来的客观
信号 {tools,errors,nonzero_exit,retries,user_turns,lines},模型只许原样抄录,
无 transcript 时为 null——这是评估里唯一 LLM 不能扭曲的通道)·
data/learnings/<skill>.md(逐 skill 经验)· data/rubrics/<skill>.md(逐 skill 尺子,
git 版本化)· data/replays/<skill>.jsonl(真实调用蒸馏的回归用例,仅本地)·
data/maturity.json(逐 skill 成熟度状态,评估时维护)·
data/rejected.md(拒绝缓冲)· suggestions/<skill>.md(待决提案)·
data/jobs.jsonl(后台进化队列:id/skill/proposal/auth/status/seen)·
data/inbox.md(后台结果,每 job 一行,status --ack 标已读)·
data/hook-errors.log(hook 意外错误诊断,一行一条;安静=健康)·
CHANGELOG.md(编辑留痕)。off 文件:停用自动 hook(手动调用不受影响)。
文件名规则:上述逐 skill 路径中的 <skill>,把 : 写成 __
(caveman:caveman-help → caveman__caveman-help)——冒号在 Windows 上是保留字符
(NTFS 会当成备用数据流),直接用插件名会静默写坏。JSON 里的 skill 键与
maturity.json 的键保留带冒号的真名,只有文件名做这层映射。
存储设计决定:账本用 append-only JSONL 而非 sqlite——当前量级(日十条级)模型直读
zero 依赖;若将来到万行级或需要复杂联查,data/*.jsonl 可一键导入 sqlite(本机已有
sqlite3),现在不预建。
1---2name: lamarck3description: Lamarckian skill evolution - continuously monitors every real skill invocation, drives governed evolution of observed skills, and evolves itself by the same rules while running. Harness-agnostic (adapters for Claude Code, Codex, Cursor, pi share one ledger); in the reference adapter a PostToolUse hook logs each invocation (stamped with the skill's genome hash for per-version regression windows) and a Stop hook runs a light evaluation loop injected at turn end (this SKILL.md is not reloaded per turn). Per-skill dynamic rubrics (git-versioned) define what "good" means per skill; a trust ladder in config.json controls which skills may be edited (auto/evolve/suggest/observe, default observe). Read this file only when escalating (enough same-type evidence for an edit) or on manual invocation. Use when the stop hook says to escalate, or when asked to review skill performance, optimize or improve a skill, audit the skill ledger, distill skill learnings, manage the evolution whitelist, or switch trigger mode.4license: MIT5---67# lamarck:用进废退的 skill 进化89拉马克式进化:skill 在**真实使用**中获得的经验,写回它的"基因"(SKILL.md);10衡量它的**尺子(rubric)也随之进化**;长期无用的部分**废退**(修剪)。11赛道:SkillOpt 是训练场(基准分数驱动),darwin-skill 是考场(合成测试+评委),12lamarck 是生活——生产遥测驱动,用进 + 废退双向。三层机制,重活分级触发:1314- **记账**(自动,每次 Skill 调用,所有模式下都开):PostToolUse hook 写 `data/pending.jsonl`。15- **轻循环**(回合末,**不加载本文件**):协议文本单源于 `protocol/light-loop.md`16 (harness 无关,任何适配器逐字注入,见 `protocol/adapter-contract.md`),17 Claude Code 适配器由 Stop hook 运行时读入拼进 reason——18 对照该 skill rubric 中场景匹配的条目做四维评估落 `data/ledger.jsonl`、用户纠正19 n=1 结晶进 `data/rubrics/<skill>.md`、经验沉淀进 `data/learnings/<skill>.md`、20 蒸馏回归用例进 `data/replays/<skill>.jsonl`、清本会话 pending;他会话积压达阈值21 时提示用户手动清算(指针会衰减,静默积压等于丢证据)。**上下文隔离**:22 `config.json` 的 `isolation` 为 `subagent` 时,评估整体派一个子代理执行——23 它从磁盘读协议、从实时落盘的 transcript 切片读证据,主上下文只收一行结果24 (代价:多一次模型调用);默认 `inline` 零成本但协议进主上下文。所有注入25 文本带 ephemeral 标记,供 harness compaction 优先丢弃。26 **触发时机由 `config.json` 决定**:`{"mode":"every|manual|threshold","threshold":N}`——27 `every` 每个用过 skill 的回合末触发;`manual` 从不自动触发;`threshold`(默认,N=5)28 攒到 N 条才批量评估。29- **升级**(条件触发,才加载本文件):某 skill 已有 **≥2 次独立调用、同类 gap**30 → 走优化门;或手动 `/lamarck`。3132## 尺子:逐 skill 动态 rubric3334`data/rubrics/<skill>.md`,格式与规则见 `data/rubrics/README.md`。要点:3536- **行为标准从证据结晶**:用户纠正一次即可入册(n=1;rubric 只是评估视角);37 每条必须带 ledger 出处与场景标签,无出处禁止写入;淘汰进 attic 不删除。38- **三处使用**:①四维评估判 gaps 时对照该 skill 的 rubric;②成对盲评的比较标准;39 ③验证 rollout 的"变差与否"判据。评估时只启用场景匹配的条目。40- **git 版本化**:本目录即 git 仓库,rubric 与 skill 协议同库提交,可 diff 可回滚;41 遥测(pending/ledger/learnings)被 .gitignore 排除,仅本地留存。4243## 进化分级(白名单)与防负优化4445`config.json`(本地文件,不入库;首次使用从 `config.example.json` 复制)的46`evolution` 块决定每个 skill 的进化等级(显式列表 > `default`;新装 skill 自动47落入 `default`,默认 `observe`)。**config.json 缺失时:一律 `observe`,提示用户48创建**:4950- **auto**(自治级,显式列入 `evolution.auto` 才生效):过门提案**免事前三选一51 直接施工**,但 replay 重放从事后验证升为**放行条件**——当场不过立即自动回滚52 并入 rejected;每笔编辑在下次输出中显式报告,并照常入 CHANGELOG、ledger、53 git,事后 `git revert` 一步可撤。**禁区:lamarck 自身、Iron Rules、插件文件54 永不受 auto 覆盖,必须用户批准。** 自治是挣来的:建议只把经历过多次55 evolve 级成功编辑的 skill 升到这一级。56- **evolve**(白名单,当前:seo-cron-ops、lamarck):过门提案可走用户三选一直接施工。57- **suggest**:过门提案只写 `suggestions/<skill>.md`,永不直接编辑。58- **observe**(默认):只记账、沉淀 learnings、长 rubric,**不产生任何提案**;59 证据照积,升级到 evolve 后历史证据立即可用。60- 插件 / marketplace / synced skill:无论配置如何,永不直接编辑(上限 suggest)。6162**动态评分防负优化**:每条账本带 `ver`(调用时目标 SKILL.md 的内容哈希 8 位)。63升级或 `audit` 时按 `ver` 分窗计算该 skill 的健康度(corrected+failed 占比、gap 频率):64编辑后版本窗口(样本 ≥3)比编辑前变差 → 判定负优化,自动产出**回滚提案**65(仍走用户三选一)。这是成对盲评(单次、即时)之外的第二道统计防线(多次、滞后)。6667## 成熟度:收敛的 skill 降为抽查6869不是每次评估都有收益——场景不变时 skill 会收敛。每 skill 两态,存70`data/maturity.json`(`{"<skill>":{"state":"active|stable","clean_streak":N,"ver":"..."}}`,71评估时顺手维护):7273- **active**(默认):每条 pending 全量四维评估。74- **stable**(进入条件:连续 `stability.streak` 次评估干净——无 gap、无75 corrected/failed、rubric 无新增;默认 10):每条只做一眼扫描(本回合有无用户76 纠正或异常),没有就记一行 `{"outcome":"stable-skip","ver":"..."}`(带 ver,77 版本分窗统计不断粮)并 streak++;**每第 `stability.sample` 条仍做全量评估**78 (默认 5,抽样防漂移);rubric 冻结,不再新增条目。79- **唤醒回 active(任一即触发,立即)**:用户纠正或 failed;抽样评估发现 gap;80 **ver 变化**(被编辑或外部改动——编辑后的验证期必须全量);args 呈现 rubric81 场景标签覆盖不了的新场景(场景变了,收敛前提失效)。82- **收敛即证书**:`report` 把 stable 状态与清白连击数当 Tier 2 证据呈现83 ("该 skill 近 N 次真实调用零纠正")。stable + 长期零引用条目 = 废退修剪的84 天然候选。8586`stability` 配置在 `config.json`(缺失回退 streak=10, sample=5)。8788## 升级后:优化门(SkillOpt 验证门的文本版)8990对某个 skill 提出编辑,必须同时满足(**且该 skill 进化等级为 evolve 或 suggest**):9192- **证据 ≥2**:ledger/learnings 中该 skill 有 ≥2 次**独立调用**出现同类 gap93 (单次观察永不触发编辑,n=1 是噪声)。94- **全证据合成**:提案生成时必须综合该 skill 的**全部**在案证据(ledger、learnings、95 rubric),不只触发门槛的那两条(SkillOpt 的 mini-batch 思路)。96- **提案具体**:能写成 add / delete / replace 的定点操作,写明预期改善与验证方式。97- **净增长预算(废退)**:提案给出净行数变化;若使 SKILL.md 超 500 行,或连续两次98 提案净增 >10%,必须同时附删减案。删除类提案是一等公民:长期(≥90 天)零引用的99 rubric 条目、被 gap 证据标记为"误导/从未用到"的段落,主动产出修剪提案(同样走100 用户三选一;修剪内容进 attic / git 历史,不物理消失)。101- **场景围栏(防震荡)**:证据全部来自单一场景标签的提案,只能做**场景分支式102 增量**——新增"当 <场景> 时……"的条件段,不得改写共享核心;改写共享核心需要103 **≥2 个不同场景**的证据。B 场景的优化因此伤不到 A 场景依赖的部分,切回来104 不会退化。**来源 harness 即场景标签之一**(账本的 `harness` 字段):同一105 SKILL.md 被多家 agent 共用时,只有某一家的证据只能加该家的条件分支,跨106 harness 的互相影响由此围栏拦截,裁决仍归用户三选一。107- **全场景 replay**:任何编辑的 replay 验证必须包含**其他场景**的既有用例,108 不只触发场景——replay 语料就是全部历史场景的记忆,"切回旧场景"在施工前就被109 预演过。110- **反震荡检测**:提案若实质推翻 CHANGELOG/git 近期(最近 10 次)已接受的编辑,111 判定为震荡:禁止直接覆写,强制转为场景分支提案,并附两个场景的证据对照交112 用户决策。113- **不在拒绝缓冲**:`data/rejected.md` 否过的同类提案不得重提,除非有新类型证据。114- **未被冻结**:该 skill 上一次编辑的验证 rollout 尚未完成时,禁止新提案。115116门过了 → 先看等级:**auto 级 skill 跳过三选一直接施工**,但必须当场通过117全场景 replay 才算落地(不过即自动回滚,提案入 rejected),施工与验证结果118在下次输出中显式报告。**该 skill 的 replay 语料为空时,auto 降级为三选一**119——没有放行条件就没有放行,零验证落地是禁止的。其余等级 → **用户在环**:120用 AskUserQuestion 给用户选(附证据摘要与 diff 要点):1211221. **现在就改**(推荐时说明理由)1232. **只留提案** → 写 `suggestions/<skill>.md`,不动文件1243. **否决** → 连原因写入 `data/rejected.md`125126非交互会话(用户不在场)一律选 2,并在最终输出里提示用户有待决提案。127128用户选 1(或 auto 级过门)后,**默认不在本会话施工**——先把提案写成具体的129add / delete / replace 规格落到 `suggestions/<skill>.md`,然后130`node scripts/evolve-worker.js enqueue --skill <skill> --proposal suggestions/<skill>.md --auth user|auto`,131告知用户 job id 即结束。后台 worker 用本 harness 的无头 CLI(`config.json`132`background.runners`,最小权限:只开 lamarck 目录与 skills 目录)按下列规则133施工 + replay 验证 + verify 落账 + CHANGELOG,结果写 `data/inbox.md` 并发系统134通知;下次 `/lamarck` 呈现。`background.runner` 为 `none` 时才就地施工,按归属:135136- **用户自有 skill**(`~/.claude/skills/<name>/`,非 `synced/`):目标目录在 git137 仓库内 → 编辑前后各 commit 一次(`lamarck: optimize <skill>: <摘要>`);138 否则先复制 `SKILL.md` 为 `SKILL.md.bak`。有界编辑(一次 ≤3 处、单处 ≤10 行,139 禁止整文件重写);`CHANGELOG.md` 记一行:日期、目标、改动、依据证据。140- **插件 / marketplace / synced skill**:永不改原件,只走选项 2。141142**编辑后立即 replay 验证**(先于自然验证):从 `data/replays/<skill>.jsonl` 取该143skill 的回归用例(见下),派新 subagent 分别按旧版与新版执行,按 rubric 成对比较。144新版更差 → 直接回滚,不必等下一次真实调用。replay 用例的来源是**真实调用痕迹**:145轻循环评估时,把 corrected / failed 的调用、以及**场景尚未被语料覆盖的 clean146调用**(每场景留一条代表)蒸馏成用例147`{"essence":"任务要点","expect":"按 rubric 的达标要求","src":"ledger ts"}`。148从不翻车的 skill 同样需要语料:上文"全场景 replay"要求编辑验证覆盖其他场景,149auto 的放行条件也以语料非空为前提——只收割失败会让最健康的 skill 永远零语料。150真实分布、零人工编写(darwin 的 test prompts 是手编合成的,此处严格更优)。151152**验证 rollout(成对盲评)**:被编辑 skill 的下一次被评估调用即自然验证。派一个153**新的独立 subagent**,同时给它:旧版全文(git 上一 commit 或 `.bak`)、新版全文、154该次调用的真实执行痕迹、该 skill 的 rubric——同一上下文内成对比较出 better /155worse / tie(绝对打分跨会话有校准噪声,成对比较可抵消)。**tie 或与 replay 结论156分歧时,加派 2 个独立评委成多数票**(N=3;平时单评委省成本,难判时才升员)。157worse → 回滚(git revert 或恢复 `.bak`),提案连失败原因写入 `data/rejected.md`;158better / tie → 保留,解除冻结。159160**客观信号一票否决**:judge 只在客观信号不反对时才有投票权。编辑后版本窗口的161`objective` 均值相对编辑前显著劣化(errors / nonzero_exit / retries 任一上升,162样本 ≥3)→ 不采信 replay 与盲评的 better/tie,直接出回滚提案;客观信号持平或163改善时,judge 才决定胜负。同理,LLM 判定的 `corrected` 必须附 transcript 中逐字164存在的用户原句,引不出原句的纠正判定作废。165166**回滚语义(按证据强度分级)**:回滚 = 恢复用户已批准的上一基线,**不算新编辑**,167不受"三选一"与有界编辑约束(Iron Rule 2/6 豁免)——但必须落账并在下次输出中168显式告知用户。分级:replay / 盲评是同输入直接对照(强证据)→ **自动回滚**;169版本分窗是观察性统计(弱证据,可能混杂任务漂移)→ 只出**回滚提案**,走三选一。170171**结论必须落账(可证明性)**:replay、盲评、版本分窗三种验证各记一行 verify 记录172进 ledger:`{"ts","skill","type":"verify","stage":"replay|judge|window","old_ver",173"new_ver","result":"better|worse|tie","decision":"keep|revert","judges":N,"detail":""}`。174`judges` 记本次动用的评委 agent 数(成本记账:report 可算"每有效编辑评委调用数",175与 darwin 固定 3 评委×3 轮对比)。`report` 的进化战绩全部由这些记录汇总——176没有落账的效果等于没有效果。177178## 自我优化(仅在升级或手动运行时)179180用同一套规则评估本协议自身(假阳性提案?门太松/太紧?轻循环是否顺畅?),meta181观察以 `"skill":"lamarck"` 记 ledger。对本 SKILL.md 或 hook 脚本的任何编辑,182除过优化门外,**必须经用户明确批准**;协议与脚本改动一律 commit 进本仓库。183184## Iron Rules(本节修改需用户明确批准)1851861. 单次观察永不触发编辑,只记账与沉淀(rubric 入册除外,n=1 可)。1872. 任何 skill 编辑施工前必须让用户选择(AskUserQuestion);非交互会话只落提案。188 例外一:恢复用户已批准基线的自动回滚(强证据触发),须落账并告知。189 例外二(2026-08-29 经用户批准):`evolution.auto` 显式列入的 skill 免事前190 三选一,但 replay 放行条件与事后显式报告不可免;replay 语料为空时例外二191 不适用(降回三选一);lamarck 自身、Iron Rules、插件永不适用 auto。1923. 每次编辑必须可回滚(git commit 或 `.bak`),且写入 CHANGELOG。回滚本身同样记 CHANGELOG。1934. 永不编辑插件 / marketplace / synced skill 的文件。1945. 永不删除 ledger 历史、learnings 既有观察与 rubric attic。1956. 每次编辑 ≤3 处、单处 ≤10 行,禁止整文件重写。1967. `rejected.md` 中的提案不得重提,除非出现新类型证据。1978. 评估只引用真实可见的执行痕迹;不可见就归档(outcome=archived),不编造。1989. rubric 条目必须带 ledger 出处;验证 rollout 未完成前,该 skill 冻结新提案。19910. 单场景证据不得改写共享核心(只许场景分支式增量);推翻近期已接受编辑的提案200 必须转为场景分支并经用户决策,禁止覆写式打摆子。201202## 手动 `/lamarck`203204- 无参数 — **第 0 步接线自检**,两种缺口分开诊断,命中即结束不评估:205 ①读 `~/.claude/settings.json`,lamarck 两条 hook(posttool-skill /206 stop-evaluate)缺任一 → 输出**接线指引**(`npx lamarck-skill` 重跑,或按207 README Install 手动接;其他 harness 指 `adapters/` 各 README 与208 `protocol/adapter-contract.md` 的 Self-service 粘贴 prompt);②hook 齐但209 `data/` 下 pending 与 ledger 皆无 → 报**接线正常、数据未至**(hook 重启后210 才加载;验活:用任一 skill 看 pending.jsonl 是否长一行)——不是配置错误,211 不发接线指引。两关都过 → 先 `node scripts/evolve-worker.js status --ack`,把后台212 进化的未读结果原样呈现;再处理全部 pending + 沉淀 learnings/rubric + 过优化门。本会话条目做213 四维评估;**历史会话条目派独立 subagent 清算**(其证据在 transcript 文件里、214 不在本会话上下文,外置零证据损失;主上下文只收每条一行结论,防污染):215 subagent 先试 transcript 指针——记录的 `transcript` 路径若仍存在(30 天216 清理期内),Read 其中该次调用附近的片段(按 ts 与 skill 名定位,只取所需217 切片,不整读),据真实执行痕迹做四维评估,并抽客观 friction(工具调用数、218 报错/重试次数、耗时);指针失效或定位不到,才退回按 skill 聚合归档219 `{"outcome":"archived","note":"N 次调用,args 样本"}`。220- `audit <skill>` — 汇总该 skill 全部证据,产出编辑提案(仍走优化门+用户在环)。221- `stats` — 只看账:先跑 `node scripts/report.js --brief`(可加 `--since 30d`),222 把它算出的各 skill 调用频次、纠正率、gap 排行原样呈现;**数字一律来自脚本,223 不自己算**。224- `mode <every|manual|threshold> [N]` — 改写 `config.json` 切换触发模式(threshold 可带225 阈值 N,缺省 5),改完复述当前配置。config.json 缺失或损坏时脚本回退 threshold/5。226- `evolve list` — 列出全部 skill 及其进化等级与账面健康度;`evolve add <skill> [evolve|suggest|auto]` /227 `evolve remove <skill>` — 改写 `config.json` 的 evolution 块,改完复述228 (auto 禁区:lamarck 自身与插件即使写入也不生效)。229- `report [skill]` — 进化叙事卡:先跑 `node scripts/report.js [--skill X]230 [--since 30d]`(代码算、字节可复现,`--json` 可存档作证据),再对其输出做叙述,231 **硬数字在前**:①客观基线——`objective` 各项按 `ver` 分窗的均值与版本间232 delta(脚本已按否决规则标出 OBJECTIVE REGRESSION);②行为基线——纠正率;233 ③judge 结论——replay 通过率、保留/回滚,仅在①②不反对时呈现。benchmark 在234 lamarck 里就是①②的编辑前后对比,不是外部题库。用户在终端不开 agent 也能跑。235236## 数据文件237238`data/pending.jsonl`(待处理,含 `ver` 基因版本戳与 `transcript` 执行日志指针——239执行日志不自建,指向 Claude Code 自己的会话 transcript,按需读切片)·240`data/ledger.jsonl`(账本,格式241`{"ts","session","skill","ver","harness","objective","trigger_fit","gaps","outcome","friction","note"}`,242评估时把 pending 条目的 `ver` 与 `harness` 原样带入;无 harness 字段的旧记录243视为 claude-code;`objective` 是 stop hook **用代码从 transcript 数出来**的客观244信号 `{tools,errors,nonzero_exit,retries,user_turns,lines}`,模型只许原样抄录,245无 transcript 时为 null——这是评估里唯一 LLM 不能扭曲的通道)·246`data/learnings/<skill>.md`(逐 skill 经验)· `data/rubrics/<skill>.md`(逐 skill 尺子,247git 版本化)· `data/replays/<skill>.jsonl`(真实调用蒸馏的回归用例,仅本地)·248`data/maturity.json`(逐 skill 成熟度状态,评估时维护)·249`data/rejected.md`(拒绝缓冲)· `suggestions/<skill>.md`(待决提案)·250`data/jobs.jsonl`(后台进化队列:id/skill/proposal/auth/status/seen)·251`data/inbox.md`(后台结果,每 job 一行,`status --ack` 标已读)·252`data/hook-errors.log`(hook 意外错误诊断,一行一条;安静=健康)·253`CHANGELOG.md`(编辑留痕)。`off` 文件:停用自动 hook(手动调用不受影响)。254255**文件名规则**:上述逐 skill 路径中的 `<skill>`,把 `:` 写成 `__`256(`caveman:caveman-help` → `caveman__caveman-help`)——冒号在 Windows 上是保留字符257(NTFS 会当成备用数据流),直接用插件名会静默写坏。JSON 里的 `skill` 键与258`maturity.json` 的键保留带冒号的真名,只有文件名做这层映射。259260存储设计决定:账本用 append-only JSONL 而非 sqlite——当前量级(日十条级)模型直读261zero 依赖;若将来到万行级或需要复杂联查,`data/*.jsonl` 可一键导入 sqlite(本机已有262sqlite3),现在不预建。