13 KiB
13 KiB
Pi Agent 兜底 P4/P5 独立审计报告(Agent-F)
审计员:Agent-F(独立审计)· 日期:2026-09-04 范围:当前仓库 P4/P5 现状核对,不改产品代码。 验证方式:只读源码/文档核对 +
.venv\Scripts\python.exe -m pytest定向 6 文件, 未跑全量 golden。审计只新增本文件,未 commit/push。
1. Git/工作区基线(已核实)
| 项 | 核实结果 |
|---|---|
| HEAD | 35131cde8855812368199530d857b8e81d34dded(main@35131cd,与 origin/main 同步,未另建 fallback 分支) |
| 已提交前序 | P1 3543208;P2 967ae37 + 验证设施 801725b(git log 已核实) |
| P3 提交态 | 未提交。工作区含 P3 产品/验证改动:fallback_lane.py、fallback_verify.py、fallback_highrisk.py、harness.py、mes.py、workflow.py、pi_bridge.py、对应 golden 测试、P3 文档、冒烟/回归设施均 dirty/untracked |
| features.json | server/data/features.json 无 fallback 键;feature_flags.py _DEFAULT_OFF_KEYS={"fallback"};文件缺失/损坏/非 bool 均回退 fallback=False;/api/features 暴露 defaultOff |
| Pi runtime | poc/pi-fallback/runtime/node_modules/@mariozechner/pi-coding-agent/package.json 为 0.73.0;CLI 实存于 .../dist/cli.js;node_modules/ 被 .gitignore 忽略,git 只跟踪 runtime 的 package.json/package-lock.json |
| 产品默认路径 | FallbackConfig.from_env() 仍硬编码仓库根 poc/pi-fallback/runtime/node_modules/@mariozechner/pi-coding-agent/dist/cli.js |
| 定向验证 | 6 个兜底专项文件定向跑测 78 passed(fallback_lane 16 / execute 22 / highrisk 21 / p3_attack 7 / offline_booking 6 / feature_flags 6),1 个既有 Starlette 弃用 warning |
2. P4 质量指标现状
现有可拿到的单次运行证据(不能算指标系统)
- 每次 propose 有
events.jsonl、orchestrator.log、result.json、outbox/report.md、calls.jsonl; 执行路径另有execution.jsonl/execution.events.jsonl、checkpoint 成对快照与 verify 报告。 FallbackOutcome已记录总步数、输出字节、总耗时、stopReason、error_message、runDir。- 完成审计 rationale 已带
runId、queryDigest、stopReason、steps、elapsedSec、citation 计数、reportPath。 - 步骤/TOOL 审计 actor 明确为
pi-fallback:<runId>;完成审计 actor 为发起 actor;GATE/审批链均有 requester/decidedBy/approvalStep。 - 失败原因粒度已足够:
unavailable:*、breaker:*、forged_citation、error:empty_report、plan_invalid、reconcile_not_ready等。
P4 方案要求但缺失的
- 无
tests/golden/test_fallback_p4_quality.py、无 P4 质量 corpus(“30+ 场景”)与成功/失败基线。 - 无成功率、误写率、确认轮次、token 成本四指标的聚合/导出入口;目前只有逐 run 审计与原始日志。
- 无 per-step 耗时:
execution.jsonl的step_executed/sandbox_step_executed只有 seq/intent/auditTarget,没有起止时间戳;只有 run 总耗时。 - 确认轮次没有与 fallback run 关联的统计器:审批仓 history 有
dwellMs、waitingMs、approvals 可溯源,但没有 fallback 维度 join/聚合,也没有“驳回后重新出卡轮次”指标。 - Pi 事件流中的 usage/token/cost 未被解析;目前只有
output_bytes近似,代码注释与 fallback.md 也自认 token 预算未做。 - 无兜底触发率周报(方案 F9)和成本告警(方案 F4 的日预算/audit_alerts)。
3. 注入防护现状(P1/P2/P3 已覆盖 vs ≥20 例缺口)
已落确定性/真实复证的具体覆盖
tests/golden/test_fallback_lane.py(P1/P2 基础墙):test_unregistered_intent_still_deniedtest_forged_callid_rejectedtest_fs_read_path_escape_blockedtest_write_guard_*(模板/只读/写面圈禁)test_breaker_timeout_explicit_failure/test_breaker_max_steps
tests/golden/test_fallback_execute.py(P2 E 系列与计划锁攻击):- E-1:
test_plan_with_p3_intent_refused、test_plan_with_unregistered_intent_refused - E-2/E-3/E-4:
test_assisted_out_of_plan_tool_trips_breaker_and_rolls_back、test_assisted_params_out_of_bounds_trips_breaker、test_assisted_extra_step_trips_breaker - E-5:
test_injection_pi_claims_user_confirmed - E-6:
test_world_drift_between_stage_and_approve_refused、test_forged_plan_fingerprint_refused - E-7:
test_injection_brief_wraps_untrusted_data - 相邻:
test_plan_artifact_digest_mismatch_refused、test_confirm_card_expired、test_readonly_mode_tool_map_unchanged
- E-1:
tests/golden/test_fallback_highrisk.py(P3 H-1..H-21):白名单缺失/损坏/未知键/未知字段/未登记 intent 全拒、P3 意图默认拒绝、审批窗口改白名单拒绝、S4 写意图/越界拒绝、S6/S7 治理链。这类主要是治理/攻击回归,不是 prompt 注入 corpus。tests/golden/test_fallback_p3_attack.py(A-7/B-8 共 7 例):乱序双批信封完整性、伪造指纹、篡改冻结参数、重放、跨 run 重锚隔离、非兄弟漂移、伪造兄弟 runId。tests/golden/test_fallback_offline_booking.py(O-1..O-6):离线落账滥用/形态拒绝、PENDING_SYNC 呈现;属于离线滥用门禁,不是 prompt 注入。- PoC 真实子进程剧本(非 golden):
poc/pi-fallback/tests/attack_path_escape.py、attack_bash_whitelist.py、attack_runaway.py、attack_forged_callid.py、attack_p2_writegate.py;P2-VALIDATION 报告 21/21,P3 smoke 亦复证。
距离“≥20 例统一注入集”的缺口
- 不存在
tests/golden/test_fallback_p4_injection.py,也不存在方案 P4 要求的 20 例可复算清单。 - 若把恶意模型/计划偏离/篡改/围栏类测试函数全部合算,数量接近 20+,但这是多个用途的混合集,不是统一的“用户可控输入藏指令/prompt 注入”黄金集;纯 named prompt-injection 用例目前只有 E-5/E-7 及 P3 七例攻击类,无法宣称满足方案口径。
- 用户文件进 run inbox 尚未产品化:S3/S6 冒烟与攻击 c 都是 watcher/脚本把 CSV 投进新建 run 的
inbox/;P2-VALIDATION §6 已明确这是“验证设施,不是产品能力声明”。因此“工单备注藏指令/CSV 藏指令/文件名/附件元数据”的端到端注入面只能模拟,不能作为产品验收。 - 尚无统一的场景矩阵覆盖:CSV/工单备注、文件名与路径、历史会话注入、伪造“用户已确认”、伪造审批/动作文件、跨 run/跨租户重放、引用伪造成果、输出契约 partial/failed/blocked 绕过、中英文注入变体、brief 边界逃逸等。
4. 离线/无模型降级现状
| 场景 | 现有代码路径 | 测试覆盖 |
|---|---|---|
| fallback 默认关 | fallback_feature_enabled() 消费 features;异常/缺键/非 bool → False |
test_fallback_default_off_when_config_missing、test_fallback_explicit_true_enables、test_fallback_non_bool_stays_off、test_flag_off_preserves_original_behavior、test_feature_flags.py 5 态 |
| runner/pi CLI 不可用 | propose_reply 在真实 runner 构建异常时归并为 FallbackOutcome(stop_reason="unavailable:...") → 原话术+显式失败审计 |
test_runtime_unavailable_falls_back_to_canned_reply、test_runner_exception_fails_explicit |
| 模型协商 | resolve_model():显式 APS_FALLBACK_MODEL > LLM_BASE_URL/KEY > GET /models(5s、300s 缓存);失败时 build_pi_runner 抛 FallbackUnavailable |
无 resolve_model/协商失败/降级选第一模型的直接 golden;既有测试清空 LLM env 后走 fake runner,只覆盖到 runner unavailable 边界 |
| 熔断 | timeout、max_steps、max_output 三闸 + 执行段独立预算 | timeout/max_steps 有直测;max_output 代码存在但未发现直接 golden |
| MES 断连/补录 | S6 出卡/执行双端 _probe_mes_connectivity;显式 offlineBooking=True + 断连事实双成立才本地落账并打 PENDING_SYNC;恢复后对账呈现 |
H 系列 + test_fallback_offline_booking.py O-1..O-6;S6 真实 smoke 文档记录 24/24(未在本轮重跑真实冒烟) |
缺口/冲突点
- 详细方案 F5 写着“无模型时 fallback 开关强制关闭且 UI 明示原因”,但当前实现是逐次显式失败回话术,没有在无模型/模型协商失败时自动把
features.jsonfallback 置为关,也没有专门的 UI 状态位;需要 Agent-A/主管定夺这是产品差异还是 F5 措辞可接受。 - 无“GET /models 超时/HTTP 异常/空清单/LLM_MODEL 不在清单改取第一模型”的直接确定性测试,也未锁模型缓存 300s 行为。
- max_output 熔断缺少确定性测试;执行段预算闸是否被独立测试覆盖也要一并补锁。
5. P5 发布现状
- Pi runtime 仍在 poc 下:本机安装
0.73.0,runtimenode_modules被 ignore,git 只保存 package 元数据;产品默认路径硬编码回 poc。 - 桌面打包不含 fallback:
apps/desktop/package.jsonextraResources只含web/dist与 PyInstallersidecar;packaging/aps-sidecar.spec只收 Python/submodules/ortools/scipy,未含 Node/pi 运行时;未发现可选组件下载、升级清单、Docker/K8s 的 pi-runtime 打包。 - Web/服务端部署也未含 Pi runtime 解析/分发:除源码默认 poc 路径外,未见
APS_FALLBACK_PI_CLI的安装/部署清单或 sidecar 环境注入。 - 无 runbook:
docs/development/下未发现pi-fallback-runbook.md;现有 runbook 为康尼数据、离线安装等,不覆盖 Pi runtime 安装、模型网关配置、断网/无模型处置、S4/S6/S7 现场操作与升级。 - P4/P5 目标输出目前除本审计外均不存在:未见
P4-P5-DESIGN.md、test_fallback_p4_quality.py、test_fallback_p4_injection.py、test_fallback_p4_offline.py、P5-RELEASE-NOTES.md。 - 文档同步只到 P3/FB-03;fallback.md/CHANGELOG 顶部无 P4/P5 章节。
6. 给 A/B/C/D 的明确缺口清单
HIGH
- Agent-A:P4/P5 文件级设计缺失——质量指标 schema、30+ 场景矩阵、注入 20 例分类、离线演练矩阵、P5 发布门禁和 runtime 分发形态都还没有可执行设计;当前 GOAL-P4 只有协调板。
- Agent-B:P4 质量设施缺失——无聚合指标/corpus/golden;需补成功率、误写率、确认轮次、耗时、token/成本统计,并定义“误写率 0、成功率 ≥85%”的可复算门禁。
- Agent-C:统一注入 golden 集不足——无
test_fallback_p4_injection.py的 ≥20 例;且“用户文件进 inbox”尚未产品化,工单备注/CSV/文件名/历史会话类端到端注入无法作为真实验收。 - Agent-C:离线/无模型降级没锁死——resolve_model 失败/超时/选模型降级、max_output 熔断缺直接确定性测试;方案 F5 的“无模型 force-off + UI 明示”与当前行为不一致,需要先定语义再补测试。
- Agent-D:P5 发布路径未动——Pi runtime 仍只在 poc;桌面包/服务端无 runtime 分发、无可选组件、无
docs/development/pi-fallback-runbook.md;发布前至少要有可复跑 runbook + 打包清单 + 验收步骤。
MED
- Agent-A/B:执行与确认指标精度不足——
execution.jsonl无 per-step 时间戳;审批轮次只存在通用 approval history,未与 fallback run 建立指标 join;需补字段或建聚合层。 - Agent-B:token/成本预算缺失——没有从 Pi events 解析 usage,也没有日预算/告警;方案 F4 只实现了输出字节近似与三闸。
- Agent-E/主管:P3 状态文件互相矛盾——
P3-VALIDATION.md头部写“GO / §7 复证”,但文件本身没有 §7,§5 仍保留“P3 条件 NO-GO”总结论;GOAL-P3.md留言板也停在 Agent-N NO-GO,没有 Agent-O 记录。需要同轮收口,否则 P4/P5 基线口径不可信。
LOW
- Agent-A/E:历史 full-golden 数字口径陈旧——方案 P5 写“1071+ 基线”,P1/P2/P3 文档分别出现 1084、1090、1501 等不同统计和已知失败清单;P4/P5 需要先定义当前 target 版本与回归文件清单,不能继续引用旧数字。
- Agent-C/D:文档与边界声明——fallback.md/P1-DESIGN 已知边界(token 预算、SSE、Docker 可选、自动补推)要随 P4/P5 决定正式闭合或继续显式标记,避免发布时被当作已完成能力。
7. 结论
P1–P3 的产品/测试治理基础扎实,78 个兜底专项 golden 定向复跑全绿;但 P4/P5 尚未开工:无质量指标设施、无统一 ≥20 注入黄金集、无模型协商/离线 force-off 直接测试、无 runtime 分发与 runbook。当前 P3 产品代码未提交,P3-VALIDATION 内部还存在 GO/NO-GO 冲突,不能作为 P4/P5 干净基线直接封板。