mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-11-03 22:04:57 +08:00
docs(agent): record repeated harness evidence
This commit is contained in:
@@ -115,6 +115,8 @@ uv run --locked --no-sync python -m scripts.evaluation --live \
|
||||
|
||||
`command_execution` 场景按场景显式开启原生 CLI 的 `shell_tool`、`unified_exec` 和 `shell_snapshot`,代理保留 `functions.exec_command` 与 `functions.write_stdin`;MoviePilot 侧注入生产 `ExecuteCommandTool`,仅允许任务给定的固定命令和临时工作目录。配对报告 `/tmp/moviepilot-agent-round-luna-oauth-command-pair-final.json` 的 `pair_valid=true`、`both_passed=true`,harness 指纹为 `c409ee1ca7899ccfcefd38832d6a343f024f8fc67fb65f14c3eec08552203257`:两侧均以退出码 0 得到 `MOVIEPILOT_COMMAND_OK`,没有业务副作用。
|
||||
|
||||
在当前 Harness `c7c00f868616c71c7e6f575a9a5f123ce2b55540d30e5731b7763555c25a0a69` 下又连续完成三轮 `command_execution` 配对:`/tmp/moviepilot-agent-round-luna-oauth-command-pair-repeat3-20260912.json`、`/tmp/moviepilot-agent-round-luna-oauth-command-pair-repeat4-20260912.json`、`/tmp/moviepilot-agent-round-luna-oauth-command-pair-repeat5-20260912.json` 均为 `pair_valid=true`、`both_passed=true`。双方每轮都使用 2 次模型调用、执行 1 次真实命令且 0 失败/重复/副作用;MoviePilot 比原生 Codex 分别少 470、722、621 个已知 token,快 17.181、20.323、18.298 秒。该重复证据只覆盖一次性命令,不能替代后台 pipe/PTY 交互验收。
|
||||
|
||||
`browser_navigation` 场景由 MoviePilot 生产 `BrowseWebpageTool` 操作回环动态页面,报告 `/tmp/moviepilot-agent-round-luna-oauth-live-browser-final.json` 通过,4 次浏览器回执在点击后观察到 `BROWSER_OK`。`codex features list` 虽显示 `browser_use` 为 stable,但受控 `codex exec 0.153.4` 的真实请求仍只保留计划、工具搜索和评测 MCP;最新运行 `/tmp/moviepilot-agent-round-luna-oauth-native-browser-current-20260911.json` 消耗 12 次模型调用、仅成功读取一次 Skill,没有浏览器账本事件,最终在评测预算错误下结束。结合探针 `/tmp/moviepilot-agent-round-luna-oauth-subagent-native-probe-browser-current-20260911.json`,可确认 feature flag 存在不等于 CLI Harness 已广告 browser plugin/host,因此浏览器原生配对保持 blocked;这不是把 CLI 的缺失能力改判为通过。
|
||||
|
||||
`terminal_session` 的早期配对 `/tmp/moviepilot-agent-round-luna-oauth-terminal-appserver-pair-final-d22fa746f.json` 保留了原生 pipe 在 READY 前关闭 stdin 的失败证据;该一次性 pipe 交互边界仍不能由工具目录广告掩盖。生产持续会话实现和本地回归保持通过。随后在同一生产、Skill、场景和 Harness SHA 下使用 `gpt-5.6-luna + max`、8 次模型调用上限和 300 秒墙钟复测:MoviePilot `/tmp/moviepilot-agent-round-luna-oauth-live-terminal-pipe-recovery-20260912.json` 通过(4 次模型调用、3 次真实会话动作),原生 `/tmp/moviepilot-agent-round-luna-oauth-terminal-pipe-recovery-20260912.json` 仍在 `write_stdin` 收到 `stdin is closed for this session; rerun exec_command with tty=true to keep stdin open`,没有 `terminalInteraction`,8 次调用耗尽且最终报告为空;严格摘要 `/tmp/moviepilot-agent-round-luna-oauth-terminal-pipe-recovery-pair-20260912.json` 为 `pair_valid=true`、`both_passed=false`。这排除了预算过小导致未恢复的解释,原生 pipe 仍保持 blocked。
|
||||
@@ -123,10 +125,14 @@ uv run --locked --no-sync python -m scripts.evaluation --live \
|
||||
|
||||
对应的 `terminal_pty_session` 配对 `/tmp/moviepilot-agent-round-luna-oauth-terminal-pty-appserver-pair-timeout180-sleep1-ready1-20260911.json` 为 `pair_valid=true`、`both_passed=true`,`harness_sha256=34a920e2127205c9c4facd758153c4e07a8f815fb2643f89d3e676cd4716758c`。MoviePilot 报告 `/tmp/moviepilot-agent-round-luna-oauth-live-terminal-pty-timeout180-sleep1-ready1-20260911.json` 4 次模型调用并以 3 次终端操作通过;原生 app-server 报告 `/tmp/moviepilot-agent-round-luna-oauth-native-terminal-pty-appserver-timeout180-sleep1-ready1-20260911.json` 3 次模型调用,结构化事件和独立账本均确认 PTY 输入、`READY`/回复输出和退出码 0。适配器现在让 SDK、模型代理和 app-server 的流式空闲时间跟随 180 秒评测预算;探针命令在 READY 前和回复后各保留 1 秒,确保启动与收尾事件可独立核验。
|
||||
|
||||
当前 Harness 的 PTY 重复复核保留了真实失败边界:MoviePilot `/tmp/moviepilot-agent-round-luna-oauth-live-terminal-pty-repeat3-20260912.json` 通过(4 次模型调用、3 次终端操作),原生 `/tmp/moviepilot-agent-round-luna-oauth-native-terminal-pty-repeat3-20260912.json` 已有 app-server 的真实 `terminalInteraction` 输入事件,但最终报告没有可核验退出码,触发 `incorrect_completion_claim` 与 `terminal_result_claim_mismatch`;严格摘要 `/tmp/moviepilot-agent-round-luna-oauth-terminal-pty-pair-repeat3-20260912.json` 为 `pair_valid=true`、`both_passed=false`。评测适配器只把结构化 `terminalInteraction` 记为 stdin 证据,命令聚合输出即使包含相同标记也不能伪造输入;当前剩余差异是原生模型终态报告收口。
|
||||
|
||||
### 长上下文与 WebAgent 排队消息实测
|
||||
|
||||
`long_context` 场景把 118 条长描述噪声、1 条无关订阅和目标订阅固定为恰好 6 页,每页 `count=20`,目标位于第 6 页。MoviePilot 真实 Agent 与原生 Codex 在同一 `gpt-5.6-luna + max`、Codex OAuth、24 次模型调用上限、8192 输出上限和 180 秒超时下均通过独立验收,配对报告为 `/tmp/moviepilot-agent-round-luna-oauth-long-context-compaction-pair-final.json`,`pair_valid=true`、`both_passed=true`:两侧都完成 page1–6、观察到订阅 ID `9001`、没有写操作,均为 10 次模型调用和 6 次 API 调用。MoviePilot 用时约 75.807 秒、419605 个已知 token;原生 Codex 用时约 85.969 秒、396513 个已知 token。MoviePilot 的请求预算在第 7 次请求后由约 69.5K 降至约 26.1K,证明本轮真实触发了最终请求压缩;首条用户任务、分页边界和 JSON 输出要求在压缩后仍被保留。
|
||||
|
||||
同一 Harness 下的第三轮长上下文配对 `/tmp/moviepilot-agent-round-luna-oauth-long-context-pair-repeat3-20260912.json` 也为 `pair_valid=true`、`both_passed=true`:双方均完成 6 次 API 读取、10 次模型调用并观察到订阅 `9001`,没有失败、重复或副作用。MoviePilot 使用 420254 个已知 token、81.528 秒,原生 Codex 使用 395675 个 token、61.099 秒;这继续证明约束保留和最终 oracle 收口有效,但不把成本差解释为整体智能等价。
|
||||
|
||||
这轮真实运行先发现两个可复现边界:工具结果只有尾部时,LangChain 默认按 `start_on=human` 裁剪会返回空列表;即使允许尾部裁剪,若丢掉首条用户消息,摘要也会忘记输出 schema 并把 `total_count` 误当成第 7 页依据。`ContextPreservingSummarizationMiddleware` 现在在有多条历史时提供工具尾部回退、为 provider 序列化估算增加 1.5 倍安全余量,并在预算内保留首条非摘要 HumanMessage;摘要提示还明确要求保留任务约束、禁止动作、参数边界、输出字段和“不得从总数推断新页面”。单条不可裁剪输入仍返回“新建或清空会话”的明确错误,不会无限重试。
|
||||
|
||||
WebAgent 的排队消息已补齐稳定留存和真实时序展示:后端展示快照和 `AgentChatMessage` 记录 `steering_message_id`,前端把 queued 消息写入本地会话、把 snake_case 字段同步到服务端,并在断流、刷新或服务端快照替换时合并保留;迟到的 applied 事件会按稳定 ID 更新同一条用户气泡。应用点会收口前一段助手、把用户消息插入其后并创建 continuation 助手,后续文本和工具事件按真实事件流进入 continuation。工具事件携带稳定 `tool_id` 与 `running/done/error` 状态,前端可区分真正执行中的工具和已完成/失败的工具,不再把所有提示显示为“最新一条执行中”。追加验证发现 continuation 助手插入后若把原始对象直接存入 steering 映射,后续工具状态会写入但不会触发 Vue 重渲染;前端提交 `44e19778b70fd17bc0a7ddf63021866ef45bdaa5` 改为从响应式消息数组取回 continuation,并增加“工具 1 完成 → 插入用户消息 → 工具 2 running”的时序回归。随后提交 `7c64d05874a444b9bbd128b54421a1ae9da13bce` 将尚未收到稳定 ID 的多个 queued 草稿按提交顺序插入当前助手边界,并覆盖 ACK 断流后的顺序收口;前端 `AgentAssistantPanel.spec.ts` 43 项、类型检查、格式和 ESLint 通过,远端 `Frontend Tests` run [34602237521](https://github.com/jxxghp/MoviePilot-Frontend/actions/runs/34602237521) 与构建 run [34602871223](https://github.com/jxxghp/MoviePilot-Frontend/actions/runs/34602871223) 成功。
|
||||
|
||||
@@ -102,4 +102,7 @@ uv run --locked --no-sync python -m scripts.evaluation \
|
||||
- 原生 pipe 复核:在 `ee52ca070` 的 Harness 上以 `gpt-5.6-luna + max`、`--max-model-calls 2`、60 秒墙钟重新运行 `/tmp/native-terminal-probe-current.json`。原生 `app-server` 真实执行了 `functions.exec_command`,随后 `functions.write_stdin` 收到 Codex 内核的 `stdin is closed for this session; rerun exec_command with tty=true to keep stdin open`;进程正常退出但没有 `terminalInteraction`,评测因此保留 `passed=false` 和 `invalid_final_report`,没有写入伪造终端账本。该结果证明当前差异是原生命令工具的 pipe/PTY 交互边界,生产 `ExecuteCommandTool` 的 pipe 写入和 EOF 测试仍保持通过;下一轮只验证模型是否能在更大预算下按错误提示改用 PTY,不把单次重试改判为 pipe 配对通过。
|
||||
- 原生 pipe 大预算复测:同一生产、Skill、场景和 Harness SHA 使用 `gpt-5.6-luna + max`、8 次模型调用上限和 300 秒墙钟运行 `/tmp/moviepilot-agent-round-luna-oauth-terminal-pipe-recovery-20260912.json`。原生模型确实完成了 `functions.exec_command` 并请求 `functions.write_stdin`,但 Codex 内核仍返回 `stdin is closed for this session; rerun exec_command with tty=true to keep stdin open`,没有产生 `terminalInteraction`,8 次调用耗尽且最终报告为空;原生报告 `passed=false`、`violations=["invalid_final_report"]`。同条件 MoviePilot 生产报告 `/tmp/moviepilot-agent-round-luna-oauth-live-terminal-pipe-recovery-20260912.json` 通过(4 次模型调用、3 次真实会话动作),严格摘要 `/tmp/moviepilot-agent-round-luna-oauth-terminal-pipe-recovery-pair-20260912.json` 为 `pair_valid=true`、`both_passed=false`。这次复测排除了“预算太小导致未恢复”的解释,C1.4-R1 仍是原生 Harness 阻塞边界。
|
||||
- 原生 PTY 重复复核:当前提交内容下 MoviePilot `/tmp/moviepilot-agent-round-luna-oauth-live-terminal-pty-repeat2-20260912.json` 真实完成 PTY 启动、输入和退出(4 次模型调用、3 次终端操作);原生 `/tmp/moviepilot-agent-round-luna-oauth-native-terminal-pty-repeat2-20260912.json` 虽输出了相同标记,但没有把真实退出码带入最终 JSON,独立验收保持 `passed=false`。评测适配器现只接受 app-server 的 `terminalInteraction` 事件作为 stdin 证据,命令聚合输出不能替代输入事件;该样本保留了模型终态不完整的失败,不能计入 PTY 通过轮次。
|
||||
- 当前 Harness 的 PTY 第三轮复核仍然保留同一边界:MoviePilot `/tmp/moviepilot-agent-round-luna-oauth-live-terminal-pty-repeat3-20260912.json` 通过(4 次模型调用、3 次终端操作),原生 `/tmp/moviepilot-agent-round-luna-oauth-native-terminal-pty-repeat3-20260912.json` 已产生真实 `terminalInteraction` 输入事件,但最终报告仍缺少可核验退出码,触发 `incorrect_completion_claim` 和 `terminal_result_claim_mismatch`;严格配对 `/tmp/moviepilot-agent-round-luna-oauth-terminal-pty-pair-repeat3-20260912.json` 为 `pair_valid=true`、`both_passed=false`。这说明输入事件证据已被正确采集,剩余问题是原生模型终态报告收口,不能把 PTY 误记为三轮通过。
|
||||
- `command_execution` 在当前 Harness `c7c00f868616c71c7e6f575a9a5f123ce2b55540d30e5731b7763555c25a0a69` 下连续三轮通过:配对摘要 `/tmp/moviepilot-agent-round-luna-oauth-command-pair-repeat3-20260912.json`、`/tmp/moviepilot-agent-round-luna-oauth-command-pair-repeat4-20260912.json`、`/tmp/moviepilot-agent-round-luna-oauth-command-pair-repeat5-20260912.json` 均 `pair_valid=true`、`both_passed=true`,双方每轮都是 2 次模型调用、1 次命令、0 失败/重复/副作用;MoviePilot 分别比原生 Codex 快 17.181、20.323、18.298 秒,少 470、722、621 个已知 token。普通命令的三轮重复门槛已满足,不能外推到 pipe/PTY 交互。
|
||||
- `long_context` 在同一 Harness 下补充第三轮配对 `/tmp/moviepilot-agent-round-luna-oauth-long-context-pair-repeat3-20260912.json`,`pair_valid=true`、`both_passed=true`。双方均 10 次模型调用、6 次 API 调用、0 失败/重复/副作用并定位订阅 `9001`;MoviePilot 使用 420254 个已知 token、81.528 秒,原生 Codex 使用 395675 个 token、61.099 秒。该轮继续验证长上下文终态保留,但 MoviePilot 的 token 和耗时差不能解释为整体智能优势。
|
||||
- 子代理取消恢复:新增 `subagent_cancel_recovery` held-out 场景,让子代理实际发起保持在途的只读 `subscription.list`,主 Agent 取得 task ID 后取消,再读取启用站点。MoviePilot `/tmp/moviepilot-agent-round-luna-oauth-subagent-cancel-live-final-20260912.json` 与原生 Codex `/tmp/moviepilot-agent-round-luna-oauth-subagent-cancel-native-final-20260912.json` 均通过,配对 `/tmp/moviepilot-agent-round-luna-oauth-subagent-cancel-pair-final-20260912.json` 为 `pair_valid=true`、`both_passed=true`;同一 `gpt-5.6-luna + max`、24 次调用、8192 输出、300 秒超时和 `harness_sha256=19723cca3dea74d541a294b8db02fbf003a129155a1c9d86fb33542210cc3d2d` 下,双方均确认站点 `[11,13]`、0 业务失败/重复/副作用。MoviePilot 使用 7 次模型调用,原生 Codex 使用 10 次调用,其中一个被取消请求没有完整用量;比较器保留行为配对并将 `usage_comparable=false`、token 差设为 unknown;终端共享收益仍未验证。
|
||||
|
||||
Reference in New Issue
Block a user