aps-agent/poc/pi-fallback/P4-P5-AUDIT.md

13 KiB
Raw Permalink Blame History

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 例缺口)

已落确定性/真实复证的具体覆盖

  1. tests/golden/test_fallback_lane.py(P1/P2 基础墙):
    • test_unregistered_intent_still_denied
    • test_forged_callid_rejected
    • test_fs_read_path_escape_blocked
    • test_write_guard_*(模板/只读/写面圈禁)
    • test_breaker_timeout_explicit_failure / test_breaker_max_steps
  2. 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
  3. tests/golden/test_fallback_highrisk.py(P3 H-1..H-21):白名单缺失/损坏/未知键/未知字段/未登记 intent 全拒、P3 意图默认拒绝、审批窗口改白名单拒绝、S4 写意图/越界拒绝、S6/S7 治理链。这类主要是治理/攻击回归,不是 prompt 注入 corpus。
  4. tests/golden/test_fallback_p3_attack.py(A-7/B-8 共 7 例):乱序双批信封完整性、伪造指纹、篡改冻结参数、重放、跨 run 重锚隔离、非兄弟漂移、伪造兄弟 runId。
  5. tests/golden/test_fallback_offline_booking.py(O-1..O-6):离线落账滥用/形态拒绝、PENDING_SYNC 呈现;属于离线滥用门禁,不是 prompt 注入。
  6. 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.json fallback 置为关,也没有专门的 UI 状态位;需要 Agent-A/主管定夺这是产品差异还是 F5 措辞可接受。
  • 无“GET /models 超时/HTTP 异常/空清单/LLM_MODEL 不在清单改取第一模型”的直接确定性测试,也未锁模型缓存 300s 行为。
  • max_output 熔断缺少确定性测试;执行段预算闸是否被独立测试覆盖也要一并补锁。

5. P5 发布现状

  • Pi runtime 仍在 poc 下:本机安装 0.73.0,runtime node_modules 被 ignore,git 只保存 package 元数据;产品默认路径硬编码回 poc。
  • 桌面打包不含 fallback:apps/desktop/package.json extraResources 只含 web/dist 与 PyInstaller sidecar;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

  1. Agent-A:P4/P5 文件级设计缺失——质量指标 schema、30+ 场景矩阵、注入 20 例分类、离线演练矩阵、P5 发布门禁和 runtime 分发形态都还没有可执行设计;当前 GOAL-P4 只有协调板。
  2. Agent-B:P4 质量设施缺失——无聚合指标/corpus/golden;需补成功率、误写率、确认轮次、耗时、token/成本统计,并定义“误写率 0、成功率 ≥85%”的可复算门禁。
  3. Agent-C:统一注入 golden 集不足——无 test_fallback_p4_injection.py 的 ≥20 例;且“用户文件进 inbox”尚未产品化,工单备注/CSV/文件名/历史会话类端到端注入无法作为真实验收。
  4. Agent-C:离线/无模型降级没锁死——resolve_model 失败/超时/选模型降级、max_output 熔断缺直接确定性测试;方案 F5 的“无模型 force-off + UI 明示”与当前行为不一致,需要先定语义再补测试。
  5. Agent-D:P5 发布路径未动——Pi runtime 仍只在 poc;桌面包/服务端无 runtime 分发、无可选组件、无 docs/development/pi-fallback-runbook.md;发布前至少要有可复跑 runbook + 打包清单 + 验收步骤。

MED

  1. Agent-A/B:执行与确认指标精度不足——execution.jsonl 无 per-step 时间戳;审批轮次只存在通用 approval history,未与 fallback run 建立指标 join;需补字段或建聚合层。
  2. Agent-B:token/成本预算缺失——没有从 Pi events 解析 usage,也没有日预算/告警;方案 F4 只实现了输出字节近似与三闸。
  3. 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

  1. Agent-A/E:历史 full-golden 数字口径陈旧——方案 P5 写“1071+ 基线”,P1/P2/P3 文档分别出现 1084、1090、1501 等不同统计和已知失败清单;P4/P5 需要先定义当前 target 版本与回归文件清单,不能继续引用旧数字。
  2. 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 干净基线直接封板。