CVSM预发布

01 — 概述

CVSM

控制变量状态机协议

用编码 agent 跑控制变量实验的状态机协议。你写研究规格:各组之间改变哪些变量、固定哪些变量、哪些可以调整。agent 在 GitHub 的 issue 和 PR 上按状态机一步步实现和运行实验。每个 run 都记下实际生效的完整配置,由脚本对照规格核对,规格不允许的差异都会报出来。你只在四处做决定:发布、合并、预算、下结论。

人的关口agent 的工作按规格核对过doem97/cvsm

02 — 问题

规格和它以下的各层

agent 会改动对比需要固定的设置

编码 agent 写代码、启动运行、贴出结果的速度,已经快过人能读完的速度。

为了修一次崩溃改了学习率,为了塞进显存把有效 batch 减半。每一处单看都合理,合在一起,对比就成了猜测。而你通常只看到 agent 的总结。

研究规格是你能完整读懂的那一层,所以 CVSM 按每个 run 自己的记录,对照规格核对。

03 — 状态机

四个关口 · 每一步都在 GitHub 上

研究是GitHub 上的状态机

研究依次经过计划、实现、审查、合并、运行、分析,每一步都记在 GitHub 上。每条指令就是一个目标状态。agent 一直推进,到达目标状态、碰到关口或遇到卡点时才停;一切顺利也要在四个关口停下。

继续阅读
人在会话里做决定
Agent四个 skill;Claude Code 或 Codex
记录GitHub 和 MLflow,随做随记

01 计划

人
Agent
plan讨论、起草
记录

Issue

  • study #10
  • code #11
  • run #12
  • Decision:

02 实现

人
Agent
implement写代码到 PR
记录

PR

  • Closes #11
  • guard · test
  • Decision:

03 审查

人
Agent
review新会话审查
记录

审查

  • Verdict: pass
  • @ 3f9c2a1

04 合并

人
Agent
merge.py唯一的合并入口
记录

main

  • squash 合并
  • 就是那个 head
  • Decision:

05 运行

人
Agent
run启动、核对
记录

MLflow run

  • cvsm.* cfg.*
  • artifacts
  • Decision:

06 分析

人
Agent
report三行汇报
记录

结果

  • 单个 issue 的表
  • 规格核对
  • 研究总表
  • Decision:

01发布

什么时候
新增或改变已批准的工作:发布计划;改任务的 Goal、Scope、Acceptance 或 Merge,或研究的 Arms、Controlled、Adaptable;改受保护路径。
你说
“发布”,或批准这处改动
记下什么
按波次建好的父 issue 和子 issue,以及父 issue 上的一条 Decision: 评论。

卡点

什么时候
同一个失败连续 3 次;审查连续 3 次给出 changes;目标有歧义且会影响交付物;某个 Controlled 设置不改变对比就满足不了。
你说
最多 3 个选项里的一个,例如“选 2”
记下什么
你不在时:needs-decision 标签和一条四行评论(Blocked:、Evidence:、Options:、Recommend:);你答复后记一条 Decision:。

02合并

什么时候
PR 待合并:guard 和 test 全绿,当前 head 有 Verdict: pass。任务写了 Merge: agent 时,agent 自己用 merge.py 合并;碰了受保护路径或没审查过的 head,merge.py 会拒绝。
你说
“合并”,或“合并 #15”
记下什么
merge.py --human squash 合并那个 head;任务随之关闭,并记一条 Decision: 评论。

03预算

什么时候
下一步会超出预算:token、时间或 GPU 小时。
你说
“继续”,也可以给个新预算
记下什么
一条写明新预算的 Decision: 评论。

04下结论

什么时候
研究的子 issue 全部关闭,进入待分析。
你说
你的结论,例如“#10 下结论:……”
记下什么
研究带着你的结论关闭,结论记成一条 Decision: 评论。

把鼠标移到关口上,或用 Tab 聚焦

04 — 规格核对

研究规格与运行记录

每个 run 都对照研究规格核对

你在关口 01 批准研究规格:各组(arm)之间的不同、固定不变的设置(各带理由)、可以调整的设置。每个 run 都记下解析后的配置,结果命令拿这些记录对照规格核对:启动后马上核一次,每条结果评论里再核一次。

继续阅读
研究 #10 · 规格你读得懂 · 关口 01
  1. ### Arms各组之间仅有的不同
  2. full: model.adapter=none
  3. lora: model.adapter=lora model.lora.rank=8
  4. ### Controlled固定不变,各带理由
  5. optim.lr=3e-4# 论文 X 表 2
  6. train.effective_batch=256# 论文 X 表 2
  7. seed in 1,2,3# 同论文 X,用 3 个 seed
  8. ### Adaptable可以不同,守住各自的规则
  9. train.per_device_batch# 按显存调整,有效 batch 固定为 256
  10. train.accum# 跟随 per_device_batch
规格核对来自记录 · 6 个 run

规格核对:

  • ≠train.effective_batch=256 不成立:1 个 run,0330bc8a…(128)
  • ≠未声明的差异 train.precision:bf16(5 个 run)、fp16(1 个 run)
  • ·Adaptable train.per_device_batch:full 取 64(3 个 run);lora 取 64(2 个 run)、32(1 个 run)
  • ·Adaptable train.accum:full 取 4(3 个 run);lora 取 4(3 个 run)

scripts/results.py 的输出

它按事实列出

  1. 规格本身的问题:读不懂的行、没写理由的 Controlled 行、缺少的节、出现在多节的键
  2. 不满足某条 Controlled 的 run,或配置里没记录这个键的 run(未记录)
  3. 不属于任何 arm、或属于多个 arm 的 run
  4. 缺了某条 in 中某些取值的 arm
  5. 不在任何一节、取值却不同的键(未声明的差异)
  6. 没有 run 的 arm
  7. 每个 Adaptable 键在各 arm 取过的值

CVSM 只报告记录里有什么。这些 run 还能不能比,由你判断。

05 — 决定

Claude Code 或 Codex

你在会话里做四个决定

你只在 agent 会话里做决定。建 issue、开 PR、审查、合并、关闭都由 agent 按你的指示执行,你的每个决定都记在相应的 issue 上。

继续阅读
  1. 你

    我们计划一个研究:LoRA 能不能追上全量微调?

  2. Agent

    和你讨论规格,然后起草研究 #10,以及代码任务 #11 和运行任务 #12。

  3. 你

    发布

    关口 01
  4. Agent

    Done:已发布 #10 及 #11、#12;Decision 记在 #10

    Waiting for you:无

    Next:#11 已就绪

  5. 你

    做 #11

  6. Agent

    Done:PR #13 待合并,Verdict: pass @ 3f9c2a1

    Waiting for you:合并 PR #13

    Next:运行 #12

  7. 你

    合并

    关口 02
  8. Agent

    Done:用 merge.py --human 合并了 PR #13;#11 已关闭;Decision 记在 #11

    Waiting for you:无

    Next:运行 #12

  9. 你

    把 #10 推到待分析

  10. Agent

    Done:#12 已关闭,附结果和规格核对;研究总表贴在 #10

    Waiting for you:#10 下结论(关口 04)

    Next:等你决定

每次停下,都汇报三行Done:Waiting for you:Next:

06 — 组成

六个数字

协议由什么组成

  • 0个要安装的服务
  • 80行规则,有测试卡住上限
  • 4个 skill,每个最多 120 行
  • 4个人的关口,是仅有的计划内停点
  • 1个 agent 的合并入口:merge.py
  • 2种 agent 命令行工具(Claude Code 和 Codex)共用一套 skill

07 — 接入

预发布

把协议复制进你的仓库

只复制被跟踪的文件,再填好 AGENTS.md 的 Project 一节。每一步都可以交给会话里的 agent 去做;你只需要拍板,并在需要时提供管理员账号。

git -C <cvsm clone> archive HEAD AGENTS.md .agents .claude .codex .github scripts tests ':!.github/workflows/pages.yml' | tar -x -C <your repo>