# P4 质量 corpus notes(Agent-B) > Agent-B · 2026-09-04 · 范围仅 `tests/golden/test_fallback_p4_quality.py` > 与本文档。未改产品代码、未改其它测试、未 commit/push、未跑全量 golden。 > 全部场景 fake runner 注入,零真实 LLM/网络。 ## 1. 真实运行结果 ```text .venv\Scripts\python.exe -m pytest tests\golden\test_fallback_p4_quality.py -q 44 passed in 6.47s ``` 另做 `python -m py_compile`,语法通过。44 个 pytest 用例对应 Q-01..Q-40 共 40 个确定性质量场景(参数化拆分为 44 个节点),其中 S1/S2/S3/S4/S6/S7、 开关 fail-closed、运行时不可用均由本文件直接断言;既有专项等价覆盖见 §4。 ## 2. 指标口径(只使用当前产品字段) | 指标 | 本文件口径 | 结果/门禁 | |---|---|---| | 成功率 | 期望成功 run 中 `result.json.ok=true`、确认卡数/审批轮次与场景期望一致的比例 | 聚合断言 1.0;报告层同时表达方案门禁 >=85% | | 误写率 | 失败/拒绝出现成功 WORLD_WRITE、执行失败未回滚/未验证、verify MISMATCH 的 run 数 / 总 run 数 | 聚合断言 0.0(门禁 0) | | 确认轮次 | reply blocks 中 confirm-card 数;审批仓 history 按本场景 confirmId 计 APPROVED/REJECTED/SOD_DENIED/EXPIRED/GRANT_EXPIRED | 逐场景比对通过 | | 耗时近似 | `result.json.elapsed_sec` 汇总为 avg_latency_sec | 只做确定性上界与报告表达 | | 成本近似 | events/10 + calls + steps + output_bytes/4096 | 报告层输出 avg_cost_points;不代表真实 token | ## 3. Q-01..Q-40 场景映射 | ID | 期望要点 | 测试节点 | |---|---|---| | Q-01 | S1 只读成功,0 卡 0 写 | `test_q01_q02_readonly_success[Q-01-...]` | | Q-02 | S1 无工具直接回答 | `test_q01_q02_readonly_success[Q-02-...]` | | Q-03 | 伪 callId -> forged_citation | `test_q03_to_q08_failure_matrix[Q-03-...]` | | Q-04 | 空报告 -> error:empty_report | `test_q03_to_q08_failure_matrix[Q-04-...]` | | Q-05 | runner 异常 -> harness_error | `test_q03_to_q08_failure_matrix[Q-05-...]` | | Q-06 | timeout 熔断 | `test_q03_to_q08_failure_matrix[Q-06-...]` | | Q-07 | max_steps 熔断 | `test_q03_to_q08_failure_matrix[Q-07-...]` | | Q-08 | max_output 熔断 | `test_q03_to_q08_failure_matrix[Q-08-...]` | | Q-09 | 快照导出失败降级纯推理 | `test_q09_snapshot_export_failure_degrades_to_pure_reasoning` | | Q-10 | 开关缺失/损坏/非 bool | `test_q10_feature_switch_fail_closed[missing/corrupt/nonbool]` | | Q-11 | S3 合法 import 出 1 卡 | `test_q11_s3_legal_import_plan_stages_card` | | Q-12 | FROZEN 执行 + verify PASS | `test_q12_frozen_execute_success_and_verify` | | Q-13 | ASSISTED 执行成功 | `test_q13_assisted_success` | | Q-14 | 计划含未登记 intent | `test_q14_plan_with_unregistered_intent_refused` | | Q-15 | ASSISTED 参数越界回滚 | `test_q15_assisted_params_out_of_bounds_rollback` | | Q-16 | 步骤乱序/多步回滚 | `test_q16_assisted_extra_step_rollback` | | Q-17 | artifact digest 不符 | `test_q17_artifact_digest_mismatch_refused` | | Q-18 | 出卡后世界漂移 | `test_q18_world_drift_between_stage_and_approve_denied` | | Q-19 | 卡过期/重放/篡改 | `test_q19_expired_card_denied_zero_write`;重放/篡改见 §4 既有等价 | | Q-20 | 执行异常回滚+指纹验证 | `test_q20_execution_exception_rolls_back` | | Q-21 | 审批拒绝零执行 | `test_q21_approval_rejected_zero_execution` | | Q-22 | P2 不受白名单缺失影响 | `test_q22_p2_unaffected_by_missing_whitelist` | | Q-23 | S4 沙盒成功零主干写 | `test_q23_s4_sandbox_success_no_main_write` | | Q-24 | S4 混入写意图拒绝 | `test_q24_s4_mixed_write_intent_refused` | | Q-25 | S4 expected 主干变化拒绝 | `test_q25_s4_expected_world_change_fields_refused` | | Q-26 | S6 单笔合法补录 | `test_q26_s6_single_legal_backlog` | | Q-27 | S6 两笔兄弟卡 | `test_q27_s6_two_sibling_cards` | | Q-28 | S6 超上限截断 | `test_q28_s6_over_max_truncated` | | Q-29 | S6 非法 backlog 拒绝 | `test_q29_s6_invalid_backlog_refused` | | Q-30 | S6 对账 MATCH/DRIFT/MISSING | `test_q30_s6_reconcile_match_drift_missing` | | Q-31 | 对账时仍断连 | `test_q31_s6_reconcile_still_down_explicit` | | Q-32 | offlineBooking + MES 断连本地落账 | `test_q32_s6_offline_booking_success` | | Q-33 | 在线声明 offlineBooking 拒绝 | `test_q33_s6_offline_declared_while_online_stage_denied` | | Q-34 | 审批窗口内 MES 恢复 | `test_q34_s6_mes_recovers_inside_approval_window` | | Q-35 | S7 ops 诊断四文件+脱敏 | `test_q35_s7_ops_diagnostics_redacted` | | Q-36 | S7 非 ops 物理不可见 | `test_q36_s7_non_ops_physically_invisible` | | Q-37 | S7 policy.update 原子写+备份 | `test_q37_s7_policy_update_via_card` | | Q-38 | S7 config.apply 双人链 | `test_q38_s7_config_apply_dual_approval` | | Q-39 | 白名单缺失/损坏 fail-closed | `test_q39_whitelist_missing_corrupt_fail_closed` | | Q-40 | 无模型/无 node unavailable | `test_q40_runtime_unavailable_fails_explicit` | ## 4. 既有专项等价与边界 - `test_fallback_lane.py`:P1 基础墙、runtime unavailable、breaker、forged citation。 - `test_fallback_execute.py`:P2 E 系列、计划锁、执行回滚、artifact/世界漂移。 - `test_fallback_highrisk.py`:S4/S6/S7、白名单缺失/损坏、policy/config 双人链。 - `test_fallback_p3_attack.py`:Q-19 重放/篡改等价。 - `test_fallback_offline_booking.py`:MES 断连/恢复等价。 本文件 `_Q_REFERENCE_MAP` 只保留“既有等价不重复复制”的备注,Q-01..Q-40 的 直接断言均在本文件内可复算。 ## 5. 已知缺口(不改产品,回主管) - 无 per-step 时间戳、真实 token/cost 字段:本轮只做事件行数/输出字节近似, Agent-A 审计已列后续产品任务。 - 审批仓 history 无 fallback run 维度 join:本文件按 confirmId 过滤计轮次; 如产品层需要“驳回后重新出卡”聚合,需另立产品字段/视图。 - 方案 F5 的“无模型 force-off + UI 状态位”与现状逐次显式失败不一致; Q-40 只锁当前语义,未断言自动关开关。 - P3-VALIDATION/GOAL-P3 的 GO/NO-GO 文档矛盾不在 Agent-B 写范围。 ## 6. Agent-E 复跑 在仓库根目录执行: ```text .venv\Scripts\python.exe -m pytest tests\golden\test_fallback_p4_quality.py -q ``` 最容易失败点:Q-03 伪 callId 必须是 `call-`(当前产品 regex 只认该形态); Q-09 需 runner 文本自身带“纯推理:快照不可用”;聚合测试依赖每 store 的 propose 审计 runDir 与按 confirmId 统计审批 history,不能用全局累计 history。