Repository navigation
fix(benchmark): retain safe experiment board rejection reasons - #8076
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max.
动机
使用实验看板 CLI 登记或修正实验结果的操作者和 Agent。 一份官方结果漏填已声明的 guardrail 指标时,原命令只说输入无效,操作者无法判断该补指标还是修复文件;现在指出缺失的检查类别,补齐后可沿原命令完成预览或写入。
精确 head 的两个完整相关模块共 99 项通过;同一公开测试在不可变主干上有三项诊断断言失败、四项隐私反例通过,确认改善错误解释且保留拒绝边界。 不改变实验分数、可计分资格、状态迁移、默认执行权限或存储格式;不宣称科学实验、长程表现或完整成本已有改善。 本次独立审阅完整 exact head 064e7616f8a7f90977b0b4d945aa1f7d333eeaa6。
改动思路
在既有 benchmark provider 的验证边界标记六处可公开的拒绝原因,CLI 按异常类型选择说明;不对原始错误文本做关键词分类。 本 PR 完成交互失败后的诊断修复,非法输入仍被拒绝,只有原有显式 execute 路径能够写入。
直接显示所有 ValueError 会把未知字段或路径带到公开错误中,字符串分类又会依赖措辞。因此只把既有规则中的固定说明标记为安全,其他异常仍走原来的泛化拒绝。实际校验与存储 owner 不变,没有新增 IO、手工状态、CLI 参数或另一个评分决策层;这个较小的类型边界足以完成当前问题。
具体改动
先读 accepted spec_ref: loopx/capabilities/benchmark_toolkit/README.md#experiment-board,spec_revision: 9c4826d1154d8838993850d845655443e89a09bd,再核对完整四文件差异(+78/-7)。适用 criterion_id:compact public-safe board 已实现,禁止任意输入出现在安全说明中;preview and execute separation 已实现,拒绝和预览不写入,显式 execute 才走锁和原子 ledger;benchmark validation authority 已实现,指标、可计分资格和合法状态仍由原 benchmark owner 判断。
关键代码讲解
- BenchmarkExperimentBoardValidationError:ValueError 子类标记仅可公开的固定诊断,既有 ValueError 消费者仍能捕获。
- normalize_benchmark_experiment_board_row:五个原规则的拒绝条件不变;只有固定的安全说明换用子类,未知字段和原始值仍不外显。
- _validate_benchmark_run_status_transition:完成态不可退回运行态;说明只插入已通过固定状态集合归一化的值。
- handle_benchmark_experiment_board_command:先捕获安全子类交给 parser.error,其余 IO、JSON、类型和值错误仍返回泛化说明;预览和写入共用该边界。
原 ValueError 捕获兼容性保留。状态迁移说明中的两个值先经过固定五状态集合归一化;读取旧 row、预览和实际 merge 都经过该 owner,因此损坏的 ledger 值不能绕过校验进入可公开说明。新的本地异常类型不扩展持久化 vocabulary,也没有把 benchmark 特有要求放进通用 Core。
对主干的风险
最强反例是把含私有路径或任意字段的错误误判为安全,或为了显示原因意外放行非法输入。本次核对了全部六处 raise、归一化顺序、实际 CLI stderr 和 ledger 副作用,未知输入仍泛化拒绝。预览、写入和纠正流程复用既有 caller,不增加安装、设置或人工批准步骤。
| 独立本地检查 | 结果与边界 |
|---|---|
| 完整 provider 与 identity-owner 两模块 | PASS:99 项,无跳过 |
| 同一当前七项 CLI fixture 对照主干 | 三项诊断断言失败,四项隐私反例通过;确认预期差异 |
| Ruff、公开扫描、diff、DCO | PASS;逐公开路径检查,无新增依赖或状态 |
| native quick premerge | FAIL:6 direct 无失败,3 selected 中 2 通过、1 失败;benchmark-sensitive manual hold 保留 |
| mypy 两指定路径及自动跟随的 imports | FAIL:base/head 各 4738 条诊断,其中指定路径各 32 条;只归一化行列号后完整诊断向量相同 |
CLI-output smoke 的失败已与冻结不可变 base 的相同命令和原始日志核对,smoke/probe/test 与依赖声明 blob 未变:两边均在内建 base 测量的 cli_output_probe_runner.py:178 缺少旧内联 interaction_contract, scheduler_hint, selected_todo,尚未进入 head 差分或本次 board 路径。mypy 也保留了所有导入文件的既有失败,没有仅比较总数或把 32 条说成全部。这些必需红色检查与合并 hold 保留,未放宽断言、字节预算或资格规则。 最早测试路径拼错、以及把 fixture 放在 tests 外遗漏 conftest 的两次设置失败已单独保留;纠正后的产品对照才用于结论。未查询、轮询或等待远端 CI。
我的整体评价
APPROVE 这个有界诊断修复,没有发现新的阻塞 finding。在既有 benchmark provider 的验证边界标记六处可公开的拒绝原因,CLI 按异常类型选择说明;不对原始错误文本做关键词分类。 本 PR 完成交互失败后的诊断修复,非法输入仍被拒绝,只有原有显式 execute 路径能够写入。 长程不变量判为 preserved,操作体验判为 improved;没有把更清楚的拒绝信息当作实验证据或完整费用收益。检查范围是现有 CLI 拒绝输出和 provider;完整差异没有渲染页面或新配置,视觉检查不适用。 未验证活动安装、远端看板、完整全局测试或实际科学实验;输入/输出字节预算差分尚未取得资格,mypy 与本地必需 smoke 的既有红色结果及合并 hold 保留。
较小的原 owner 内修复具有正向价值;同样输入的接受/拒绝和 ledger 效果保留,安全原因显示是明确的预期变化。源代码审查通过与本地红色质量门、maintainer 合并授权分开,当前没有合并动作。
English verdict: APPROVE — 064e761: the bounded safe-diagnostic fix preserves rejection, privacy and write boundaries in independent CLI/provider tests; pre-existing local validation failures remain merge holds.
实验看板缺少已声明的 guardrail 指标、或试图把已结束的 run 改回运行中时,CLI 原先只返回
invalid benchmark experiment board input,无法据此修正输入。此改动让现有 owner 显式标记可安全展示的计分资格与状态迁移诊断,CLI 保留这些原因;文件、JSON 和未验证字段的错误继续返回通用提示,避免回显路径或原始输入。校验条件、计分资格、状态迁移和成功响应均保持原样。改动仅涉及现有 benchmark-toolkit 的 Python owner/CLI 错误传递;没有新增能力、设置或前端操作。复用现有 ValueError 兼容边界,避免让调用方依赖错误字符串分类。
验证:99 项 experiment-board/identity 测试通过,包含真实 source CLI 的预览→拒绝→修正→写入、非法状态迁移无写入,以及文件/JSON/未知字段的隐私负例;改动文件 Ruff 通过。两份目标文件的 mypy 检查在 base 和 head 都失败,去除行号变化后同为 32 项既有诊断,未声称类型检查通过。
Validation: 99 tests passed; Ruff passed. Targeted mypy remains failing with the same 32 diagnostics on base and head.