octopus-rpa-app-runner 最终验收签署报告

原始文件:wecom_2a94dbd0_octopus-rpa-app-runner_最终验收签署报告.md

octopus-rpa-app-runner 最终验收签署报告

  • 签署日期:2026-08-07(Asia/Shanghai)
  • 签署角色:最终签署验收 Agent
  • 验收方式:当前代码静态审查、无 UI 单元/行为/契约测试、编译与 AST、公开 launcher 安全黑盒
  • 执行约束:只验证,未修改生产代码;未连接、启动、驱动或操作真实 Octopus RPA/UI
  • 验收基线:需求 v2、技术方案 v2、最终验收报告 v2、B-02 修复记录及当前工作区代码
  • 最终签署结论:通过(代码与无 UI 自动化验收范围)

1. 签署结论

原发布阻断项均已关闭:

  1. B-01 已关闭。 Python 与 PowerShell 的公开 list 路径均使用当前可见行快照,不调用滚动枚举;无法证明列表完整时按 v2 契约返回 partial/APP_LIST_INCOMPLETE,相关行为测试通过。
  2. B-02 已关闭。 PowerShell 公开入口保持 OctopusRpaAppRunner.ps1 -> OctopusRpaAppRunner.impl.ps1;impl 加载唯一生产 OctopusRpaAppRunner.Orchestration.ps1,direct、close、parameter 三个生产 wrapper 分别委托该文件中的共享 Orchestration 核心。行为 harness 经 impl 测试 dispatch 加载生产 wrapper 和同一核心,16/16 场景通过,不再测试与生产调用链脱离的平行状态机。
  3. 全量 unittest、PowerShell 生产调用链行为测试、tests_static.py、Python 编译、PowerShell AST、公开 launcher 安全黑盒均通过;测试前后未生成技能根目录或 scripts/ 下的 config.json
  4. 五轮修复记录、五轮质检报告、需求 v2、技术方案 v2、最终验收报告 v2、B-02 修复记录均存在且非空,闭环审计材料齐全。

据此,前序最终验收报告 v2 中 B-02 的阻断事实已被当前代码和复验证据消除。本次在“禁止真实 RPA/UI”的验收边界内签署通过,允许交付并进入受控现场 smoke;本签署不宣称真实 RPA 业务结果已经验证。

2. 验收基线与口径

已读取并交叉核对:

  • octopus-rpa-app-runner_技能升级需求_v2.md
  • octopus-rpa-app-runner_技能升级技术方案_v2.md
  • octopus-rpa-app-runner_最终验收报告_v2.md
  • octopus-rpa-app-runner_B02修复记录.md
  • skills/octopus-rpa-app-runner/SKILL.md
  • skills/octopus-rpa-app-runner/scripts/ 当前生产代码
  • skills/octopus-rpa-app-runner/tests/tests_static.py
  • 第 1~5 轮修复记录与第 1~5 轮质检报告

判定采用需求 AC-001~AC-022、需求 13.3 发布门槛、技术方案 14.4 PowerShell 行为测试口径,以及前序最终验收报告 v2 对 B-01/B-02 的阻断定义。由于本任务明确禁止真实 RPA/UI,需求 13.3 的受控现场 smoke 作为交付后的受控启用检查,不以虚构或未经授权的现场结果替代。

3. 阻断项关闭确认

3.1 B-01:list 严格只读、零滚动副作用

Python 生产路径:

  • visible_app_snapshot() 位于 skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.py:769,只读取当前可见应用及 grid 属性。
  • 允许滚动的 read_all_apps() 独立位于 skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.py:781,不属于 list dispatch。
  • list dispatch 在 skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.py:1670 调用 visible_app_snapshot()
  • test_final_blockers.py 验证 list partial、changed=falseverified=false,并断言 read_all_apps() 未被调用;同时验证 snapshot 不调用 scroll/invoke/click/focus。

PowerShell 生产路径:

  • Read-VisibleAppSnapshot 位于 skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.impl.ps1:1106,与滚动枚举分离。
  • Read-AllApps 位于 skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.impl.ps1:1122,仅供运行选择流程使用。
  • 公开 list dispatch 在 skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.impl.ps1:1587 调用 Read-VisibleAppSnapshot
  • SKILL.md 明确 list/current/process snapshot 不得导航、点击、聚焦、选择或滚动,列表完整性无法证明时必须 partial。

B-01 签署判定:关闭。 当前生产调用、契约、文档和无 UI 测试一致,未发现 list 路径主动滚动或其他生产副作用。

3.2 B-02:PowerShell launcher -> impl -> 共享 Orchestration 同源

公开生产调用链:

scripts/OctopusRpaAppRunner.ps1
  -> scripts/OctopusRpaAppRunner.impl.ps1
     -> dot-source scripts/OctopusRpaAppRunner.Orchestration.ps1
     -> Invoke-DirectParameterRun
        -> Invoke-OctopusDirectOrchestration
     -> Invoke-CloseRunWindowAction
        -> Invoke-OctopusCloseOrchestration
     -> Invoke-RunParameterDialogIfPresent
        -> Invoke-OctopusParameterOrchestration

当前代码证据:

  • launcher 在 skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.ps1:30 调用 impl,并透传 $LASTEXITCODE
  • impl 在 skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.impl.ps1:46 dot-source 唯一生产 Orchestration 文件。
  • direct wrapper 在 skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.impl.ps1:378 委托 Invoke-OctopusDirectOrchestration
  • parameter wrapper 在 skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.impl.ps1:499 委托 Invoke-OctopusParameterOrchestration
  • close wrapper 在 skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.impl.ps1:689 委托 Invoke-OctopusCloseOrchestration
  • 三个共享核心只定义于 skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.Orchestration.ps1,未发现 impl 中保留旧内联平行状态机。

同源身份与行为复验:

  1. 通过公开 launcher 启用无 UI 测试入口,实际得到:impl 命令文件为 OctopusRpaAppRunner.impl.ps1,Orchestration 命令文件为 OctopusRpaAppRunner.Orchestration.ps1,direct/close/parameter 三个生产 wrapper 委托检查均为 true,launcher 退出码为 0。
  2. tests/powershell_orchestration_tests.ps1 不再单独加载一个测试编排副本;它通过 OCTOPUS_RUNNER_TEST_MODE/OCTOPUS_RUNNER_TEST_ENTRY 进入 impl 测试 dispatch,检查生产 wrapper 委托关系和生产 Orchestration 命令身份。
  3. direct 场景实际调用生产 Invoke-DirectParameterRun wrapper;close/parameter 行为断言调用的核心,与生产 wrapper 在运行时解析到的是同一函数对象和同一生产脚本文件,而不是复制实现。
  4. harness 输出路径证据 launcher-impl-production-wrappers-shared-orchestration,16/16 通过。

16 个场景覆盖:生产模块身份、三个 wrapper 委托、direct 未授权零副作用、direct TOCTOU 零点击、direct 复核后单击一次、close 未授权零副作用、stop effect unknown 不 close、旧 handle 消失不 close、替换窗口不 close、stop→close 严格有序且 active 不 verified、parameter leave 零副作用、integrated direct 不 write、auto 回读失败不 submit、auto TOCTOU 不 submit。

B-02 签署判定:关闭。 前序 v2 报告指出的“两套平行编排状态机”事实已不存在;行为测试覆盖的是生产 wrapper 实际委托的同一 Orchestration 函数体。测试模式仅替换 UI 原语和抑制正常 CLI dispatch,不复制或替换生产编排核心。

4. 自动验证结果

验证项执行结果签署证据
全量 Python unittest通过73/73,Ran 73 tests ... OK
PowerShell 生产调用链行为测试通过16/16,路径为 launcher-impl-production-wrappers-shared-orchestration
tests_static.py通过STATIC_TESTS_PASSED
Python 编译通过排除 .venv,13/13 个 .py 文件编译成功
PowerShell AST通过launcher、impl、Orchestration、harness 共 4/4
公开 launcher 安全黑盒通过4/4,均为单一 v2 JSON、预期 exit 3、changed=false
launcher -> impl 测试入口身份检查通过impl/Orchestration 文件身份正确,三个委托均为 true,exit 0
config 不落盘通过验证前后技能根目录及 scripts/ 均无 config.json
真实 RPA/UI未执行符合本任务禁止真实 RPA/UI 的约束

4.1 launcher 黑盒明细

场景exitERROR_CODE单一 JSONchanged
未知参数3ARG_CONFLICTfalse
-RunExactName3ARG_REQUIREDfalse
-ListOnly + -CheckRunList3ARG_CONFLICTfalse
-ProcessSnapshot3UNSUPPORTED_IN_FALLBACKfalse

4.2 config 不落盘

  • 自动验证前检查:skills/octopus-rpa-app-runner/config.json 不存在,skills/octopus-rpa-app-runner/scripts/config.json 不存在。
  • 全量 unittest、PS harness、静态测试、编译、AST、launcher 黑盒完成后复查:两处文件仍均不存在。
  • 黑盒场景在 UI 初始化和配置写入前失败;未观察到由本次验收产生的生产配置持久化。

5. 文档与五轮闭环检查

以下材料均存在且非空:

  • 五轮修复记录:octopus-rpa-app-runner_修复记录_第1轮.mdoctopus-rpa-app-runner_修复记录_第5轮.md
  • 五轮质检报告:octopus-rpa-app-runner_质检报告_第1轮.mdoctopus-rpa-app-runner_质检报告_第5轮.md
  • 需求文档:octopus-rpa-app-runner_技能升级需求_v2.md
  • 技术文档:octopus-rpa-app-runner_技能升级技术方案_v2.md
  • 前序验收:octopus-rpa-app-runner_最终验收报告_v2.md
  • 阻断修复:octopus-rpa-app-runner_B02修复记录.md
  • 使用与安全契约:skills/octopus-rpa-app-runner/SKILL.md

B-02 修复记录所述 launcher -> impl -> 共享 Orchestration 关系与当前代码、harness 和本次复验结果一致。最终验收报告 v2 的“不通过”结论是修复前基线,保留用于审计;本签署报告以当前代码复验结果覆盖其发布判定,不覆盖其历史事实。

6. 非阻断残余风险

  1. 未执行真实桌面兼容性验证。 本次不能证明目标 Windows 桌面会话、具体 OctopusRPA.Studio 版本、中文控件名称、UIAutomation pattern 和窗口恢复行为在现场均可用。
  2. 未验证真实业务成功。 自动测试只能证明确认边界、调用顺序、TOCTOU、防重试和结构化结果;按钮点击、窗口关闭或运行列表变化均不等于 RPA 内部业务完成。
  3. 测试入口属于受控注入。 B-02 harness 经公开 launcher/impl 测试门加载生产函数,并以 adapter 替换 UI 原语;它证明编排同源,但不能替代真实 UI adapter 与桌面控件的集成 smoke。
  4. PowerShell fallback 能力有声明内限制。 process snapshot 和通用 parameter map 仍明确返回 UNSUPPORTED_IN_FALLBACK;这是文档化兼容边界,不属于本次阻断缺陷。
  5. 现场状态可能不可恢复。 direct/close 属于真实副作用动作;即使代码 fail-closed,外部应用或桌面会话异常仍可能导致 partialeffect_unknown 或需人工恢复。

上述风险不阻断本次代码与无 UI 自动化验收,但必须在首次现场启用时受控管理。

7. 受控现场验证建议

仅由业务负责人在可恢复桌面会话中指定白名单测试应用并逐动作授权,建议按以下顺序执行:

  1. 只读 smoke: 分别运行 Python 的 list/current/process snapshot 与 PowerShell 支持的 list/current;审计无 start/stop/close/scroll/config write,unknown 不得解释为空闲。
  2. direct 边界: 先在合法参数弹窗上不提供专用授权,确认零写入、零点击;再提供 --yes-direct-run/-YesDirectRun,确认指纹复核后只点击一次,并只报告 clicked/start evidence,不宣称业务完成。
  3. 集成 parameter 策略: 用白名单弹窗验证 leave/direct/auto;确认 leave 零处理、direct 不写输入、auto 写后回读且 TOCTOU 时不提交。敏感参数不得写日志或配置。
  4. close 边界: 分别验证有/无 Stop 按钮;确认 stop 先于 close、旧 handle 消失后不再 close、替换窗口不 close,active/unknown 均不得标记 stop verified。
  5. 异常恢复: 人工准备 Studio 恢复方案和停止测试应用的方法;任何 effect_unknown、窗口身份变化或 UI 版本不匹配立即停止,不自动重试、不切换 fallback 重做。
  6. 留证: 保存 operation_id、最终 JSON、退出码、Octopus 版本、Windows 版本和授权人;不得保存参数原值或其他敏感数据。

8. 交付清单

8.1 生产与契约

  • skills/octopus-rpa-app-runner/SKILL.md
  • skills/octopus-rpa-app-runner/scripts/run_pywinauto.cmd
  • skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.py
  • skills/octopus-rpa-app-runner/scripts/runner_contract.py
  • skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.ps1
  • skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.impl.ps1
  • skills/octopus-rpa-app-runner/scripts/OctopusRpaAppRunner.Orchestration.ps1
  • skills/octopus-rpa-app-runner/scripts/click_run_app_direct.py
  • skills/octopus-rpa-app-runner/scripts/close_run_window_direct.py

8.2 测试

  • skills/octopus-rpa-app-runner/tests_static.py
  • skills/octopus-rpa-app-runner/tests/ 全部测试与 fake/fixture
  • skills/octopus-rpa-app-runner/tests/powershell_orchestration_tests.ps1

8.3 需求、方案与审计材料

  • octopus-rpa-app-runner_技能升级需求_v2.md
  • octopus-rpa-app-runner_技能升级技术方案_v2.md
  • octopus-rpa-app-runner_修复记录_第1轮.mdoctopus-rpa-app-runner_修复记录_第5轮.md
  • octopus-rpa-app-runner_质检报告_第1轮.mdoctopus-rpa-app-runner_质检报告_第5轮.md
  • octopus-rpa-app-runner_最终验收报告_v2.md
  • octopus-rpa-app-runner_B02修复记录.md
  • octopus-rpa-app-runner_最终验收签署报告.md

9. 最终签署

签署结果:通过。

  • B-01:关闭。
  • B-02:关闭。
  • 自动化与静态发布门禁:全部通过。
  • 生产代码修改:无。
  • 真实 RPA/UI:未执行,按约束保留为受控现场验证。
  • 发布建议:交付通过;首次启用 direct/close/集成 parameter 等真实副作用能力前,按第 7 节完成白名单、逐动作授权的受控现场 smoke。