Virtual Embryo Challenge更新于 10-03 20:13(北京时间) / 每 5 分钟更新

← 工作原理 · 原文件 notes/architecture/17_meta_and_audit_agents.md(Markdown 源文件已渲染;链接到其他文档的会跳转,指向源码的只显示路径)

17. run 外的审计 agent(G50)与分析 agent(G44)

2026-10-03 起:G44 提案的分级与自动应用权限以 19 号文 §5.2 为准(外层循环的 A/B/C/D 分级,D 优先);本文 §3.3 的白名单 / 黑名单描述仍有效,但不再单独决定「能否自动应用」。agent/meta/policy.py 与 19 号文冲突时以 19 号文为准,并须同步修改 policy.py。

一句话:一个 run 结束、打包之后,两个 agent 在 run 外各读一遍它的全部轨迹。G50 找泄漏,结论是提交门(fail 不能交);G44 找效率,结论是改动提案(白名单自动应用并备好下一环,黑名单等人批)。两者共用同一套只读读取方式和同一套合规正则,但分开输出、分开拍板。

1. 职责边界

G50 轨迹审计(agent/audit/)G44 轨迹分析(agent/meta/)run 内 Compliance / Reviewer
问的问题这个 run 有没有用到保留阶段 / 保留基因型的实测数据或测量值、读没读不该读的文件、硬编码了什么槽位时间花在哪、选父 / draft / tune / 证否处理哪里浪费、下一环改什么这个节点(PLAN、检索文本、前 10% 源码)现在能不能用
什么时候每个 run 打包后自动跑一次(后台);prepare_submission.py 前再核一次(过期就重跑)run 结束后(G45 调度器在每环之间调用)run 内,每节点 / 前 10%
看什么全部轨迹:nodes/<id>/ 下各角色流、PLAN / ANALYSIS / REVIEW、METHOD、tune/、native/;programs.git 里每个节点的 solution;archive 里的计划与方法行;final/SELECTION.md 与披露;lit-search 与 vec-data 日志事实包(archive、选父事件、scoring_log、programs.git、tune、终选、台账)+ 现行白名单文件 + 上一轮提案单个节点的材料
产出AUDIT.json / AUDIT.md:pass / review / fail,每条发现带文件、位置、引文、判定理由;index.json 给看板META.json / META.md:findings(带数字和节点 id)、proposals(目标文件、改动、预期收益、验证、风险、白 / 黑名单)、rejected_ideas;应用结果 _apply.jsonPLAN 修改要求 / REVIEW.json
能做什么只记录和拦截,不改任何代码或 run 文件改白名单文件(工作树)、写下一环配置、记 decisions.tsv;不启动 run,不碰黑名单拒绝节点当父或进终选
时间尺度整个 run,跨节点去重整个 run(以及上一轮提案)一个节点

为什么 run 外还要一层:run 内的检查只看当时的节点,看不到"工具返回里出现过、后来被别的节点用上"的跨节点路径,也看不到程序库里最终交上去的全部代码;而且 run 内检查器本身就在被审计的系统里。G50 用独立的模型和规则,事后把整个 run 再扫一遍,作为提交前的最后一道门。

为什么 G44 不顺便做合规:两件事的判断标准和代价完全不同。审计宁可错杀(review 待人放行),分析要的是效率证据;合在一起会让"提案"和"拦截"互相牵制。G44 的改动文本反过来要过 G50 的同一套合规层(§3.3),保证自动应用的提示词 / 知识里不会带进保留阶段测量值。

2. G50 轨迹审计

2.1 两层判定

  1. 正则层(agent/audit/patterns.py,纯函数)按任务计算禁窗(官网规则 §10): 识别的写法:E10.5 / E 10.5 / e10_5 / E10p5,跨窗范围(E8.5–E14.5),embryonic day 10.5、10.5 dpc,体节数与 Theiler 分期(按 Theiler 表换算),敲除词与表型拷贝,读取 data/raw、真值 / 留出文件、评分器目录、外部测试集、禁窗阶段文件名的路径,下载命令,代码里的大段数字表(≥ 24 个数)、名字→数字映射、长编码串。 严重度:禁窗阶段旁边有测量词(%、比例、细胞数、表达量……)是 high;没有测量词、出现在代码或命令里是 medium;只是提到(通常就是任务名"预测 E10.5")是 low。harness 喂给角色的提示词整体降一级。
    任务禁窗
    T1E10.5、E12.5,以及 9.5 < E ≤ 13.5
    T2 心脏E8.5、E10.5、E12.5;8.25 < E < 8.75;9.5 < E ≤ 13.5
    T2 全胚E7.5、E7.75;7.25 < E < 8.0
    T3Gata4、β-catenin(Ctnnb1)敲除,同基因其他等位基因,表型拷贝
  2. 判定层(judge.py,judge_spec.md):命中按"规则 + 引文"去重(记出现次数和最多 5 个其他位置),high / medium 全部、low 抽 30 条,分批(每批 40 条)交给 LLM,单轮、无工具,逐条给 leak / suspect / ok、类别和理由。

2.2 结论

  • fail:有任何一条 leak。
  • review:有 suspect;或有 high / medium 命中没被判定(模型不可达、超出上限);或外部数据挂进了视图却没在 SELECTION.md 披露。
  • pass:其余。没被判定的 low 命中只计数和抽样,不影响结论。

2.3 提交门

scripts/prepare_submission.py 默认打开 --audit:读 notes/reports/audit/<run>/AUDIT.json,指纹(锁、SELECTION.md、final/ 文件、programs.git 引用、节点数、日志、规则集与判定说明的哈希)与 run 当前状态不符就当场重审。pass 放行;review 需要人用 python -m agent.audit release <run> --by <名字> --reason <理由> 放行(放行绑定指纹,run 或规则一变就失效);fail 拒绝,只能显式 --skip-audit(写进清单与 operator_log)。审计跑不起来时门关着。

2.4 打包后自动跑

harness.py package 结束时,若 run 在 Spark 的 ~/vec/runs/formal/ 下(或 VEC_AUDIT_AFTER_PACKAGE=1),后台起 python -m agent.audit run <run>,日志在 notes/reports/audit/<run>/auto_audit.log。VEC_AUDIT_AFTER_PACKAGE=0 关闭。fake 后端或 submittable: false 的 run 不跑。

2.5 看板接口

notes/reports/audit/index.json:每个被审计的 run 一行(verdict、是否已放行、原因、各判定计数、判定模型、指纹、AUDIT.json / AUDIT.md 相对路径),每次审计或放行后重建。面板接入由 G51 做。

3. G44 轨迹分析

3.1 第一步:事实包(trajectory_facts.py,无 LLM)

固化 scripts/abcd_traj_extract.py + abcd_traj_report.py:槽位时间去向(improve 有变化 / 无变化 / 失败,draft 已打分 / 失败,tune,搁置)、父节点在选父时刻的排名分布、各族 draft 的状态与深化次数(子树大小、最好分)、PLAN 被证否的比例与备选机制使用率(变了输出 = 用了备选,没变 = 原样回退)、Engineer 会话查分曲线(第几次超过父节点、谷底长度)、无变化 / 重复节点、终选前 k 的去重数(按分数、预测哈希、程序树)、tune 统计(接受、最大增益、同父重复第一轮)、数据纪元(视图文件 + 外部数据的摘要)、与官网台账的校准表、最好分随时间的曲线、胜者祖先链、各角色耗时与 token。每节独立容错(某节出错记在 errors,不丢其他节)。

3.2 第二步:一次 LLM 调用(analyze.py,meta_spec.md)

输入事实包、本 run 配置、白名单文件的现行开头(提示词、方法卡、方向库;知识表只给标题)、同榜上一轮的提案清单、改动政策。输出固定 JSON:findings、proposals(target_file、change、patch、expected_gain、how_to_verify、risk、class)、rejected_ideas。程序后处理:class 由 policy.classify 重判(LLM 的分类只作参考,不在白名单里的路径或配置键一律黑名单);findings 里每个数字按报告写手的数字核对(agent/report/numcheck)查出处。

3.3 第三步:应用(apply_proposals.py)

类内容处理
白名单提示词(researcher / search / analyst / initial spec)、方法卡、知识表条目、方向库(含 draft 顺序)、种子取舍(seeds、seed_states.*)、搜索参数(draft.*、tune.*、c_puct、p_debug、promotion.top_k、search_seed)、research.knowledge_exclude、模型回退列表的顺序patch 校验(replace 的原文恰好出现一次;新建只限知识条目 / 方向库;种子必须存在;回退列表元素集合不变)→ 改动文本过 G50 同一套正则 + 判定(任何未判定为 ok 的命中都拦下)→ 文件改动写进工作树,配置改动写进下一环配置 → decisions.tsv 追加一行(决定者 "G44 auto")
黑名单评分器与尺子(scoring.*、评分规则简报、modeling/)、视图与禁窗(view_check、data/、k007 等知识条目)、合规检查器(Reviewer / Compliance 任务书、agent/audit/)、锁与账本(harness、notes/changelogs/)、提交流程(scripts/、终选)、预算上限(budget.*、*_minutes、并发、资源)、ERA 核心(agent/search/、search.strategy.kind)、官网规则文本(notes/competition/、notes/official/)写进 notes/reports/meta/<date>_<run>_proposals.md 等人批;合规拦下或格式不合格的白名单提案也在这里

下一环配置:agent/configs/chain/<board>/<date>_<run>_next.yaml,以该 run 的 config_source.yaml 为底,叠加白名单配置改动,重写 purpose / hypothesis / changed_factor,ablation_of: chain-<首环 run>。输出的启动命令:

<venv>/bin/python agent/harness.py launch --config agent/configs/chain/... --continue-from <run_id>

不自动启动。_apply.json 里给出 argv、要先提交的文件(pre_launch:工作树不干净的 run 不可提交);提交与启动由 G45 的 run 链调度器做。同一个 META.json 不能应用两次。

4. 只读约定(与 agent/records、agent/report 相同)

  • archive.sqlite(含 -wal)先复制到临时目录,反复复制直到稳定,再从副本读;programs.git 只用 git --git-dir … ls-tree / cat-file / show / diff / rev-parse;其他文件只读。测试逐字节核对 run 目录在审计 / 事实提取前后不变。
  • 输出全部在 run 目录之外:notes/reports/audit/、notes/reports/meta/、agent/configs/chain/、白名单文件、decisions.tsv。

5. 模型

agent/audit/llm.yaml,--profile 或 $VEC_OUTER_LLM_PROFILE 选择:

profile怎么调状态
opus(默认)agent.report.write.llm_call 的沙箱单轮调用,opencode anthropic/claude-opus-5-5,只放行 api.anthropic.com,需要运行机器的 opencode auth.json 里有 anthropic 条目占位:VM / Spark 现在都没有该凭据,调用失败时审计降级为 review(高 / 中命中未判定),G44 本轮不出提案
relay直接 POST G49 中继的订阅路由 http://127.0.0.1:18790/claude-cli/v1/messages(16 号文 §6.8),令牌 $VEC_RELAY_TOKEN 或 gopass中继部署后把 default 改成 relay
qwen同一沙箱调用,Token Plan qwen3.8-max回退

--writer fake 不调用模型:审计按规则判定(命令或代码读取受保护路径 → leak,其余 high → suspect,其余 ok),分析按事实包生成固定提案。用于测试和离线演练。

6. 命令

python -m agent.audit run <run> [--writer llm|fake] [--profile opus|relay|qwen] [--out-root DIR]
python -m agent.audit gate <run> [--no-rerun]          # prepare_submission 看到的结果;退出码 0 放行 / 1 拒绝
python -m agent.audit release <run> --by <名字> --reason <理由>
python -m agent.audit index                           # 重建并打印 index.json
python -m agent.audit scan <file> --board T1:val      # 只跑正则层(调试)

python -m agent.meta facts <run> [--out f.json]
python -m agent.meta analyze <run> [--writer fake] [--profile ...]
python -m agent.meta apply <run> [--dry-run] [--meta <META.json>]
python -m agent.meta all <run>

python scripts/prepare_submission.py --run <run> [--skip-audit] [--audit-writer fake] [--audit-profile qwen]

7. 未完成 / 接线点

  • G49 中继部署后把 llm.yaml 的 default 切到 relay;在真实 run(scr-A/B/D、两个 r2-D)上跑 G44,对照 ABCD 轨迹报告 §0 验收(§7.1 第 5 条)。
  • G45 调度器:读 _apply.json,提交 pre_launch 列出的文件,执行 launch.argv。
  • G51 看板:读 notes/reports/audit/index.json 与 notes/reports/meta/*_apply.json。
  • G52 vec-data:已按 15 号文接上 data_log.jsonl、data_epoch.json、data_service.log、data.yaml 与 views/*/external/dynamic/<id>/(存在就读,不存在记在 sources.missing_optional);catalog_auto.yaml 的披露文本还没纳入披露核对。