lamarck-skill
v5.21.0
Published
agent skill 的生产环境自进化系统 | A production self-evolving system for agent skills: every installed skill keeps accumulating evidence from real usage and evolves when the gate opens - governed, user-authorized, reversible. Adapters for Claude Code, Codex, Cursor
Maintainers
Readme
lamarck
English | 简体中文
agent skill 的生产环境自进化系统。 不是给某一个手工圈选的 skill 做一次性 优化:装一次,你的全部已装 skill(几百个也一样)在真实使用中持续积累证据, 满足条件时进化——编辑经你批准落地,或对你显式升到 auto 的 skill 由 replay 把关、事后报告。lamarck 同时在运行中按同一套规则进化自己(自身永不 auto)。 使用中获得的性状写回 skill 文件;长期无用的部分废退(修剪)。每个不可逆动作 都经用户授权、落账、可回滚:治理是全量进化敢做的前提。harness 无关: Claude Code、Codex、Cursor、pi 四家适配器随包,共写同一条证据账本。
npx lamarck-skill赛道对照
| | SkillOpt | darwin-skill | lamarck | |---|---|---|---| | 隐喻 | 训练场 | 考场 | 生活 | | 信号 | 基准分数 | 合成测试 prompt + 评委团 | 生产遥测:真实调用、真实用户纠正 | | 触发 | 离线运行 | 手动运行 | hook 观察每次调用,按阈值批量评估 | | 尺子 | 固定 | 固定 9 维(SkillLens) | 逐 skill、动态、git 版本化——从证据结晶,随 skill 进化 | | 回归测试 | 基准 | 手工编写 prompt | 从真实痕迹重放(零人工编写) | | 方向 | 改进 | 改进 | 改进且修剪(用进废退) | | 覆盖面 | 每次针对一个基准目标 | 你逐个指定的 skill,各需配测试题 | 全部已装 skill,被动零配置——逐 skill 治理分级 |
保留了两家的精华:SkillOpt 的验证门、有界编辑与拒绝缓冲;darwin 的 git 回滚、 成对盲评(仅难判时升 3 评委多数票)与人在环检查点。
机制
- 记账(collector——参考适配器里是 PostToolUse hook):每次 skill 调用
→
data/pending.jsonl,附目标 skill 的内容哈希(ver),供按版本分窗做 退化检测。 - 轻循环(trigger + executor——参考适配器里是 Stop hook):回合末 hook 把
评估入队交给会话外的无头运行(默认),或把迷你协议注入本回合
(
isolation: inline)——每回合不重载 SKILL.md。四维 verdict 对照该 skill rubric 中场景匹配的条目判定后落data/ledger.jsonl;用户纠正 n=1 结晶为一条带出处的 rubric 条目;经验沉淀 进data/learnings/;回归用例进data/replays/——既收割失败,也收割语料 尚未覆盖其场景的 clean 调用。触发时机可配:每回合 / 仅手动 / 阈值批量 (默认 5)。 - 进化(门控):≥2 次独立同类 gap → 综合全部证据生成有界编辑提案 → 用户三选一(现在就改 / 只留提案 / 否决)。编辑后先 replay 重放,下次真实 调用做成对盲评,版本分窗健康度做统计兜底。任何退化 → 回滚提案。
- 信任阶梯:
config.json给每个 skill 定级 auto / evolve / suggest / observe(默认 observe;插件上限 suggest;新装 skill 继承默认)。auto是 挣来的自治:过门编辑不问直接落地——replay 重放升为放行条件(不过即时回滚), 每笔事后报告、落账、一步git revert可撤。lamarck 自身、Iron Rules 与 插件无论怎么配都必须显式批准。 - 收敛:不是每次迭代都有收益。清白连击(默认 10)后 skill 进入 stable
——评估降为抽查(每 5 条抽 1)加一行
stable-skip记录;任何用户纠正、 基因变化或新场景立即唤醒。长清白连击本身就是证据:report 把它呈现为 生产可靠性证书。
一切不可逆动作需用户明确确认。遥测永不出机(已 .gitignore);rubric 与
代码同库版本化。
架构:core + 适配器
core 是 harness 无关的——数据文件、优化门、评估协议
(protocol/light-loop.md,单源,逐字注入)没有
任何 Claude 特有内容。harness 通过适配器接入,三个角色——collector
(每次调用追加一行 pending)、trigger(决定何时评估)、executor(执行协议
的模型)——契约见
protocol/adapter-contract.md。全部适配器
共享同一遥测库:一个 skill 在多个 harness 被使用,证据汇进同一条账本——
且每条记录带 harness 标签。场景围栏把跨 harness 证据当跨场景证据:某一家
的证据只能给该家加条件分支,改不动别家依赖的共核。冲突检测归机器,裁决归你
(还是那道三选一)。
| Harness | 机制 | 角色 | 状态 |
|---|---|---|---|
| Claude Code | PostToolUse + Stop hooks(scripts/) | 三角色全 | 参考实现,生产中 |
| Codex >= 0.142 | hooks.json shim(adapters/codex)——stdin 字段与 Stop 契约兼容 Claude | 三角色全 | 机制级实测(selftest,按公开文档字段);欢迎真实会话反馈 |
| Cursor | hooks.json shim(adapters/cursor)——stop 经 followup_message 注入 | 三角色全 | 机制级实测;欢迎真实会话反馈 |
| pi | 单个 TypeScript extension(adapters/pi) | 三角色全 | 按公开 API 编写;尚未在真实 pi 中运行 |
Cursor 与 pi 原生发现 ~/.claude/skills/,Codex 可共享同一目录——lamarck
观察的基因在各 harness 里就是同一批文件。
你的 harness 不在列表里? 设计好的流程是"agent 来写,lamarck 来验"
——这是新 harness 的首次配置动作,一次做完长期生效:契约文档就是接口
说明,node scripts/verify-adapter.js <manifest> 就是确认实现的 testcase
套件(schema、off 开关、自排除、阈值行为、协议完整性全覆盖)。契约的
Self-service 段附了可直接粘给那个 agent 的 prompt,并规定三次尝试预算:
第三次验证仍红,就降级到随包的通用兜底适配器
——字段宽容提取,输出信封用 --emit= 参数选,不用写代码。含 generic 在内的
全部命令型适配器过的都是同一套验证器。
证据
诚实政策:不做自评分数(优化器用自家评委给自家产出打分证明不了任何事; darwin 自己引用的 SkillLens 论文说 LLM 自评准确率约 46%)。取而代之的分层:
- 机制自证 ——
node scripts/selftest.js,隔离临时沙箱,零接触真实 遥测。当前 232/232:hook 记账、基因戳、三档触发、配置回退、会话隔离、 防死循环、字节级可复现输出、gitignore 边界,以及轻循环所依赖的协议条款 活性(rubric 接线、replay 收割、积压提示)。CI 可用(exit code 门控)。 - 生产遥测(按设计自动积累):每次调用带目标 skill 基因哈希,每笔被
接受的编辑都有前后窗口。这个 loop 天然 LLM 密集(评估 → 诊断 → 变异 →
评委),所以窗口先用两条 LLM 扭不动的通道度量:代码从 transcript 数出来
的客观信号——工具调用数、工具报错、非零退出码、重试、用户轮次——以
JSON 注入、模型只许原样抄;以及用户纠正率,纠正判定必须附用户原句。
评委(成对盲评,难判升 3 评委多数)只在客观通道不反对时才有投票权:编辑
后客观信号劣化,一票否决 "better" 并出回滚提案。全部 verify 结论落账;
/lamarck report硬数字在前。 - mutation-bench(bench/ 在 GitHub, 协议先预注册再执行):已知真值的受控劣化 + 盲评 A/B。run-001:已知劣化 变体拦截 4/5,已知改善变体误拦 0/2(单评委、三案多数;漏网的那个有公开 分析,不藏)。原始 verdict 逐字入库。
- 自应用 —— lamarck 按自己的规则进化:对自身的每次改动都有触发证据、 有界 diff、用户批准与验证结果。CHANGELOG.md 就是可审计的 历史,含四个在其记录的 review 纪律下抓出并修复的缺陷。不打分,留痕。
- 真实案例 —— 从生产使用中积累,发布前公开,观察性局限(任务分布 漂移)如实声明。
安装
一条命令——拷贝 skill、初始化本地配置、把参考适配器(Claude Code)接进
~/.claude/settings.json(先备份、只增不删、幂等),装完自动跑 selftest
自证:
npx lamarck-skill(等价:npx github:newdee/lamarck-skill)。装完重启 Claude Code(或开一次
/hooks)让 hook 加载。升级用同一条命令,而且是合并不是覆盖:lamarck 会
进化自己,你装的 SKILL.md 与协议可以合法地和发布版不同。installer 在
.upstream/ 留一份上次装入的原样副本,升级时逐文件三方合并 base / 本地 / 新版。
合得干净直接落地;冲突块上游赢,你的版本存到 data/upgrade-conflicts/<版本>/,
inbox 留一行。只要你的基因进化过,机械合并就不是终点:installer 把上游自述的
变更(新增的 CHANGELOG 条目)作为一个后台 upgrade job 交给本地 lamarck,由它做
语义融合——审合并结果是否自洽、仍成立的本地意图经优化门重套、被上游覆盖的
丢掉——结果写 inbox。代码(scripts/、adapters/)永远跟上游。其他 harness 手动接线,步骤见各适配器 README:
Codex、Cursor、
pi。卸载(摘 hook、保留文件与遥测):
npx lamarck-skill uninstall。
手动安装步骤见英文版 README 折叠段。停用开关:在 skill
目录创建名为 off 的文件(静默两个 hook;手动 /lamarck 属显式意图,不受
影响)。
配置与使用
日常使用零操作:适配器静默观察,回合末自动评估,只有证据要求你决策 (三选一提示)或积压值得清算时才会打扰你。要配的只有两处。
config.json(在 skill 目录;本地文件永不入库,装机时从
config.example.json 生成):
| 键 | 默认 | 含义 |
|---|---|---|
| mode | threshold | 轻循环时机:every 每回合 / manual 仅手动 / threshold 攒够 N 条 |
| threshold | 5 | threshold 模式的批量 N |
| cadence | weekly | "更新"多久一批——升级出提案、后台施工、积压提醒合并进每个周期一个窗口(weekly / daily / continuous)。记账与静默评估照常连续;/lamarck 随时开窗 |
| isolation | background | 评估在哪跑:background Stop hook 只入队一个 job,你的会话什么都看不到,无头 CLI(claude -p / codex exec / pi -p)在会话外跑整个循环,只在需要你时通知(没有无头 CLI 自动退回 inline);subagent 在本会话派一个子代理,主上下文只收一行;inline 在本回合上下文里跑(不多一次模型调用,但协议会进上下文) |
| evolution.default | observe | 未列名 skill 的信任级:只攒证据,不动文件 |
| evolution.evolve / suggest / auto | ["lamarck"] / [] / [] | 分级名单——evolve 每笔编辑问你,suggest 只写提案,auto 是挣来的自治(replay 把关) |
| stability.streak / sample | 10 / 5 | 连续干净几次进 stable;stable 后抽查率 |
手动命令——在 Claude Code 里 /lamarck 加:
| 命令 | 作用 |
|---|---|
| (无参数) | 接线自检,然后清算全部 pending(本会话 + 积压) |
| stats | 调用频次、纠正率、gap 排行——数字来自 scripts/report.js --brief,模型只叙述 |
| report [skill] | 基于 scripts/report.js 的进化叙事:各版本客观信号均值与 delta(劣化自动标出)、纠正率、保留/回滚的编辑、replay 通过率 |
| audit <skill> | 单 skill 全证据审查,可能产出编辑提案(仍过门) |
| mode every\|manual\|threshold [N] | 切换评估时机 |
| cadence weekly\|daily\|continuous | 切换更新批处理节奏 |
| evolve list / add <skill> [级别] / remove <skill> | 管理信任阶梯 |
一切在后台——默认评估与施工都不碰你的会话。Stop hook 入队一个
evaluate job 立即返回;你批准一个提案(或 auto 级 skill 过门)同样只入队。
独立 worker 把每个 job 交给你 harness 的无头 CLI(claude -p / codex exec /
pi -p,模板在 config.json background.runners,最小权限:只开 lamarck 目录
与 skills 目录),无头 agent 跑协议或按门规则施工、replay、落 verify 账、往
data/inbox.md 写一行。只有需要你时(出了提案、结晶了纠正、失败)才发系统
通知;下次 /lamarck 呈现未读结果。PATH 上没有无头 CLI:worker 留下
data/.no-runner,一天内评估退回会话内;background.runner: none 则永久退回
并恢复会话内施工。代价:每次触发一次无头运行(每会话每 threshold 次调用
一次),只读每次激活附近的 transcript 切片;真实会话实测:1 条 145 秒,2 条
329 秒。无头 agent 只经 scripts/store.js 写文件(Claude Code 在无头模式下
拒绝自己的文件编辑工具碰 ~/.claude),目录围栏与 3 处 × 10 行的编辑上限由
代码执法。
上下文卫生——没有任何 API 能从活会话里删东西,所以防线全在"不让进":
后台隔离(默认,零注入)、阈值批量触发、协议 3.6k 字预算、QUIETLY 条款
(会话内评估可见叙述 ≤2 行)、stable skill 降为一眼扫描、isolation: subagent
作中间档、每次注入带 ephemeral 标记让 harness compaction 优先丢弃。
不开 agent 看进展——证据报告是纯脚本;模型从不算数字,只叙述:
node scripts/report.js --since 30d # markdown,逐 skill 逐版本
node scripts/report.js --since 90d --json # 存档作证据每个数字都能从账本逐行复核;唯一的时钟是账本自己的最新时间戳,同样的数据 永远产出同样的字节。
其他 harness 经各自适配器跑同一循环(接一次线即可,见上文架构表);
它们的评估落进同一本账,Claude Code 里的 /lamarck 全都读得到。
装完第一周会发生什么
一开始什么动静都没有——这是设计。hook 静默记录每次 skill 调用;一个会话攒够
5 条(默认阈值),回合末评估把 verdict 写进账本。几天过去,各 skill 的证据慢慢
攒;某个 skill 第一次出现两次同类 gap 时,你会收到三选一提示:采纳编辑、留作
提案、或否决。干净的 skill 会收敛降为抽查。冷启动是真实存在的:第一周没有任何
提案,通常说明你的 skill 都挺健康,不是 lamarck 没干活——看一眼
data/ledger.jsonl 就知道它在记。
常见问题
- 怎么确认 hook 活着? 随便用一个 skill,看
data/pending.jsonl是否多了 一行。意外错误会落在data/hook-errors.log(那里安静 = 健康)。 - 评估时机我能控制吗? 能:
/lamarck mode every/manual/threshold N三档随切,/lamarck随时手动跑。 - 哪些 skill 会被改? 只有白名单里的(
/lamarck evolve add <skill>)。 默认全是 observe:只攒证据,不动文件。插件永远不会被直接编辑。 - 能不能不每次都问我? 能——把久经考验的 skill 升到
auto(/lamarck evolve add <skill> auto):过门编辑不问直接落地,replay 把关, 事后报告,一步git revert可撤。lamarck 自己永远不跑 auto。 - 什么时候需要手动跑
/lamarck? 清算其他会话攒下的积压(积压到够清算时 轻循环会主动提醒)、audit <skill>做全量证据审查、stats看记分板、report看进化叙事。 - 怎么暂停? 在 skill 目录建一个名为
off的文件(hook 静默;手动调用 不受影响)。卸载:npx lamarck-skill uninstall。 - 为什么一直没有优化建议? 证据门:每个 skill 要攒出 ≥2 次独立同类 gap 才会出提案。健康的 skill 永远不会触发——这是特性。
环境要求
Node.js 18+ 与 git,任意平台(Windows / macOS / Linux),外加至少一个受支持 的 harness:Claude Code(installer 自动接线)、Codex >= 0.142、Cursor、pi (按各自适配器 README 接线)。
相邻工作
最近的邻居是 self-improving-skills ——它也用 PostToolUse hook、也会改 SKILL.md。逐行分界(附 task-observer 作参照):
| | lamarck | self-improving-skills | task-observer | |---|---|---|---| | 触发 | 被评估的结果:gap 分类、用户纠正作 ground truth | 活动量:距上次蒸馏 N 次工具调用/文件改动 | 手动会话复盘 | | 覆盖面 | 全部已装 skill,被动观察(插件上限 suggest);逐 skill auto/evolve/suggest/observe 分级 | 以它自己蒸馏出的 skill 为主 | 你手动复盘到哪算哪 | | 治理 | 证据门(≥2 次独立同类 gap)+ 每笔编辑用户批准,或逐 skill 挣得的 auto(replay 把关落地) | 后台自动改,写完才校验 | 只出建议,不动手 | | 验证 | 语义级:真实痕迹 replay 新旧对照、成对盲评、版本分窗健康度 | 语法级:SKILL.md 写坏才回滚 | 无 | | 修剪 | 引用型提案(条目 90 天零引用) | 时间型归档(30/90 天没用) | 无 | | 效果证明 | 预注册基准、跨平台 CI 自测、留痕的自应用 | — | — |
一句话:它问"用得多了,该总结了";lamarck 问"表现如何、证据够不够、改完 真的变好没有"。skill 收割类(self-learning-skills、autoskill)是从会话造 新 skill,不是进化既有 skill。
路线图
两条正交轴,都由适配器契约定形:
- 基因轴——抽象不限于 skill:任何驾驭 agent、且在生产中被反复使用的
文本工件,都能在同一套 遥测 → 账本 → 尺子 → 门控编辑 架构下进化。计划
目标依次:subagent 定义(
.claude/agents/)、CLAUDE.md / AGENTS.md 记忆文件、slash command、MCP 工具配置。 - harness 轴——Claude Code、Codex、Cursor、pi 四家适配器已随包 (见架构章);下一步是真实会话验证加固,再按契约扩新 harness。Agent Skills 规范的跨工具采纳意味着同一份 SKILL.md 基因会在多个 harness 反复 出现——共享账本跨 harness 度量同一个 skill。
Iron Rules 全线通用:证据门、用户在环、回滚、白名单。
状态
已发布:lamarck-skill 上架 npm
与 GitHub。设计日志见 CHANGELOG.md。生产真实案例(证据第 5
层)正随使用积累,完成后在此发布。
