← 工作原理 · 原文件 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.json | PLAN 修改要求 / REVIEW.json |
| 能做什么 | 只记录和拦截,不改任何代码或 run 文件 | 改白名单文件(工作树)、写下一环配置、记 decisions.tsv;不启动 run,不碰黑名单 | 拒绝节点当父或进终选 |
| 时间尺度 | 整个 run,跨节点去重 | 整个 run(以及上一轮提案) | 一个节点 |
为什么 run 外还要一层:run 内的检查只看当时的节点,看不到"工具返回里出现过、后来被别的节点用上"的跨节点路径,也看不到程序库里最终交上去的全部代码;而且 run 内检查器本身就在被审计的系统里。G50 用独立的模型和规则,事后把整个 run 再扫一遍,作为提交前的最后一道门。
为什么 G44 不顺便做合规:两件事的判断标准和代价完全不同。审计宁可错杀(review 待人放行),分析要的是效率证据;合在一起会让"提案"和"拦截"互相牵制。G44 的改动文本反过来要过 G50 的同一套合规层(§3.3),保证自动应用的提示词 / 知识里不会带进保留阶段测量值。
2. G50 轨迹审计
2.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 喂给角色的提示词整体降一级。任务 禁窗 T1 E10.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 T3 Gata4、β-catenin(Ctnnb1)敲除,同基因其他等位基因,表型拷贝 - 判定层(
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的披露文本还没纳入披露核对。