# SGClaw ZeroClaw Planner-First Realignment Implementation Plan > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. **Goal:** Realign the browser submit path so `sgclaw` uses `zeroclaw` as the primary planner/executor, with `sgclaw` acting only as the secure SuperRPA host plus custom tool bridge. **Architecture:** Stop treating `zeroclaw` as a thin LLM wrapper. The browser message path should enter a `zeroclaw`-native orchestration entry point first, let `zeroclaw` perform planning/tool-loop control, and expose SuperRPA-specific browser/office/screen capabilities as regular tools inside that runtime. Any deterministic fast paths for Zhihu/Office must be implemented as `zeroclaw`-aligned execution components, not as frontend-owned control flow. The frontend may display the generated plan and current stage for UX, but it must not own planning or execution decisions. **Tech Stack:** Rust, `sgclaw` compat bridge, `third_party/zeroclaw` agent loop, SuperRPA browser pipe, local skill library, OpenXML office export, HTML screen export, cargo tests, Python live acceptance. ### Task 1: Freeze The Current Architecture Gap With Characterization Tests **Files:** - Modify: `/home/zyl/projects/sgClaw/claw/tests/compat_runtime_test.rs` - Reference only: `/home/zyl/projects/sgClaw/claw/src/agent/mod.rs` - Reference only: `/home/zyl/projects/sgClaw/claw/src/compat/runtime.rs` - Reference only: `/home/zyl/projects/sgClaw/claw/third_party/zeroclaw/src/agent/loop_.rs` **Step 1: Write the failing test** Add a test that submits `读取知乎热榜前10,并导出 excel 文件` through `handle_browser_message_with_context(...)` and asserts the browser submit path does **not** terminate inside the current thin `Agent::turn_streamed(...)` compat bridge. The test should check for one of these observable signals: - a new orchestration mode log such as `zeroclaw_process_message_primary` - absence of the old `compat_llm_primary` mode log - absence of selector-thrashing logs like repeated `getText .HotList-item`, `[data-hot-item]`, `ol li` **Step 2: Run test to verify it fails** Run: ```bash cargo test --test compat_runtime_test browser_submit_path_prefers_zeroclaw_process_message_orchestrator -- --nocapture ``` Expected: FAIL because the current implementation still enters `src/compat/runtime.rs` and drives `agent.turn_streamed(...)` directly. **Step 3: Write the smallest additional characterization test** Add a second failing test that proves SuperRPA-specific tools remain available after the orchestration switch: - browser host tool - `openxml_office` - `screen_html_export` This test should not require real network calls. **Step 4: Run both failing tests** Run: ```bash cargo test --test compat_runtime_test -- --nocapture ``` Expected: at least the new characterization tests fail for the expected reason. **Step 5: Commit** ```bash git add tests/compat_runtime_test.rs git commit -m "test: characterize browser path bypass of zeroclaw orchestrator" ``` ### Task 2: Introduce A ZeroClaw-Native Browser Orchestration Entry Point **Files:** - Create: `/home/zyl/projects/sgClaw/claw/src/compat/orchestration.rs` - Modify: `/home/zyl/projects/sgClaw/claw/src/compat/mod.rs` - Modify: `/home/zyl/projects/sgClaw/claw/src/agent/mod.rs` - Modify: `/home/zyl/projects/sgClaw/claw/src/compat/runtime.rs` - Reference only: `/home/zyl/projects/sgClaw/claw/third_party/zeroclaw/src/agent/loop_.rs:4752` **Step 1: Write the failing unit test for the new entry point** Add a test for a new helper in `src/compat/orchestration.rs` that: - receives browser task context - builds a `zeroclaw` config - returns a browser-safe orchestration handle or result The test should prove the new helper is chosen by `handle_browser_message_with_context(...)`. **Step 2: Run the new test to verify it fails** Run: ```bash cargo test --test compat_runtime_test browser_submit_path_prefers_zeroclaw_process_message_orchestrator -- --nocapture ``` Expected: FAIL because the helper does not exist yet. **Step 3: Implement the minimal entry point** Create `src/compat/orchestration.rs` with one responsibility: - bridge browser submit tasks into a `zeroclaw`-native orchestration path Do not implement Zhihu-specific logic here. This layer must only: - map config - map task context/history - inject SuperRPA tools - call the chosen `zeroclaw` orchestration function **Step 4: Switch `handle_browser_message_with_context(...)` to the new entry point** Modify: - `/home/zyl/projects/sgClaw/claw/src/agent/mod.rs` Replace the direct `compat::runtime::execute_task_with_sgclaw_settings(...)` primary path with the new orchestration bridge. **Step 5: Run the test to verify it passes** Run: ```bash cargo test --test compat_runtime_test browser_submit_path_prefers_zeroclaw_process_message_orchestrator -- --nocapture ``` Expected: PASS. **Step 6: Commit** ```bash git add src/compat/orchestration.rs src/compat/mod.rs src/agent/mod.rs src/compat/runtime.rs tests/compat_runtime_test.rs git commit -m "refactor: route browser submit flow through zeroclaw orchestration bridge" ``` ### Task 3: Register SuperRPA Browser/Office/Screen Capabilities As Native ZeroClaw Tools **Files:** - Modify: `/home/zyl/projects/sgClaw/claw/src/compat/browser_tool_adapter.rs` - Modify: `/home/zyl/projects/sgClaw/claw/src/compat/openxml_office_tool.rs` - Modify: `/home/zyl/projects/sgClaw/claw/src/compat/screen_html_export_tool.rs` - Modify: `/home/zyl/projects/sgClaw/claw/src/runtime/engine.rs` - Modify: `/home/zyl/projects/sgClaw/claw/src/compat/orchestration.rs` - Test: `/home/zyl/projects/sgClaw/claw/tests/compat_runtime_test.rs` - Test: `/home/zyl/projects/sgClaw/claw/tests/compat_openxml_office_tool_test.rs` - Test: `/home/zyl/projects/sgClaw/claw/tests/compat_screen_html_export_tool_test.rs` **Step 1: Write the failing tool-registration test** Add a test that asserts the `zeroclaw` orchestration path exposes: - the preferred SuperRPA browser tool - `openxml_office` when Excel export is requested - `screen_html_export` when screen export is requested The test must verify this through the new orchestration path, not the old compat path. **Step 2: Run the test to verify it fails** Run: ```bash cargo test --test compat_runtime_test browser_orchestration_registers_superrpa_tools_natively -- --nocapture ``` Expected: FAIL until tool wiring is complete. **Step 3: Implement minimal native tool registration** Ensure the new orchestration bridge injects `sgclaw` tools into the `zeroclaw` runtime without changing frontend code. Keep tool naming stable: - `superrpa_browser` - `openxml_office` - `screen_html_export` **Step 4: Verify tool-level tests still pass** Run: ```bash cargo test --test compat_openxml_office_tool_test -- --nocapture cargo test --test compat_screen_html_export_tool_test -- --nocapture ``` Expected: PASS. **Step 5: Run the new orchestration registration test** Run: ```bash cargo test --test compat_runtime_test browser_orchestration_registers_superrpa_tools_natively -- --nocapture ``` Expected: PASS. **Step 6: Commit** ```bash git add src/compat/browser_tool_adapter.rs src/compat/openxml_office_tool.rs src/compat/screen_html_export_tool.rs src/runtime/engine.rs src/compat/orchestration.rs tests/compat_runtime_test.rs tests/compat_openxml_office_tool_test.rs tests/compat_screen_html_export_tool_test.rs git commit -m "feat: expose superrpa browser and export tools through zeroclaw orchestration" ``` ### Task 4: Remove Frontend-Owned Or Custom Compat Mainline Control Flow **Files:** - Modify: `/home/zyl/projects/sgClaw/claw/src/compat/runtime.rs` - Modify: `/home/zyl/projects/sgClaw/claw/src/agent/mod.rs` - Modify: `/home/zyl/projects/sgClaw/claw/src/compat/skill_runner.rs` - Test: `/home/zyl/projects/sgClaw/claw/tests/compat_runtime_test.rs` - Reference only: `/home/zyl/projects/sgClaw/claw/docs/plans/2026-03-29-sgclaw-zeroclaw-planner-first-execution-plan.md` **Step 1: Write the failing regression test** Add a test that proves Zhihu hotlist export no longer depends on a frontend-owned mainline such as: - `compat_skill_runner_primary` - direct `sgclaw`-local branching before `zeroclaw` The expected primary mode should be a `zeroclaw`-owned orchestration mode. **Step 2: Run the regression test to verify it fails** Run: ```bash cargo test --test compat_runtime_test zhihu_export_does_not_use_frontend_owned_mainline -- --nocapture ``` Expected: FAIL while `src/compat/skill_runner.rs` still owns primary control flow. **Step 3: Remove or demote the custom mainline** Change the code so: - `src/compat/skill_runner.rs` becomes either a helper invoked inside the `zeroclaw` tool/runtime ecosystem, or is removed if redundant - `src/agent/mod.rs` no longer branches to a custom primary executor before `zeroclaw` Do not leave two competing primary modes. **Step 4: Run the regression test** Run: ```bash cargo test --test compat_runtime_test zhihu_export_does_not_use_frontend_owned_mainline -- --nocapture ``` Expected: PASS. **Step 5: Run the broader compat suite** Run: ```bash cargo test --test compat_runtime_test -- --nocapture ``` Expected: PASS. **Step 6: Commit** ```bash git add src/compat/runtime.rs src/agent/mod.rs src/compat/skill_runner.rs tests/compat_runtime_test.rs git commit -m "refactor: remove frontend-owned primary control flow from browser submit path" ``` ### Task 5: Align Skills With ZeroClaw Execution Semantics Instead Of Prompt-Only Semantics **Files:** - Modify: `/home/zyl/projects/sgClaw/claw/src/runtime/engine.rs` - Modify: `/home/zyl/projects/sgClaw/claw/src/compat/runtime.rs` - Modify: `/home/zyl/projects/sgClaw/claw/third_party/zeroclaw/src/tools/read_skill.rs` - Modify: `/home/zyl/projects/sgClaw/claw/tests/compat_runtime_test.rs` - Modify: `/home/zyl/projects/sgClaw/claw/tests/read_skill_tool_test.rs` - Reference only: `/home/zyl/projects/sgClaw/skill_lib/skills/zhihu-hotlist/SKILL.md` - Reference only: `/home/zyl/projects/sgClaw/skill_lib/skills/office-export-xlsx/SKILL.md` - Reference only: `/home/zyl/projects/sgClaw/skill_lib/skills/zhihu-hotlist-screen/SKILL.md` **Step 1: Write the failing skill-execution regression test** Add a test that proves skill usage in the browser submit path is not just: - prompt injection - `read_skill` text stuffing - model-led selector wandering Instead, the test should verify the task produces: - a plan-driven collection/execution flow - a real `.xlsx` or `.html` artifact path - no selector-thrashing loop **Step 2: Run the test to verify it fails** Run: ```bash cargo test --test compat_runtime_test browser_skill_usage_is_execution_not_prompt_only -- --nocapture ``` Expected: FAIL until skill semantics are aligned with execution. **Step 3: Implement the minimal alignment** Change the orchestration so `read_skill` is a fallback for missing context, not the primary means of making high-frequency browser workflows executable. Keep: - skill discovery - skill references - artifact contract wording Reduce: - over-reliance on prompt stuffing - over-reliance on model-led selector discovery for known workflows **Step 4: Re-run the skill regression tests** Run: ```bash cargo test --test compat_runtime_test browser_skill_usage_is_execution_not_prompt_only -- --nocapture cargo test --test read_skill_tool_test -- --nocapture ``` Expected: PASS. **Step 5: Commit** ```bash git add src/runtime/engine.rs src/compat/runtime.rs third_party/zeroclaw/src/tools/read_skill.rs tests/compat_runtime_test.rs tests/read_skill_tool_test.rs git commit -m "refactor: align browser skill execution with zeroclaw-native workflow semantics" ``` ### Task 6: Verify The Planner-First Path End-To-End **Files:** - Modify: `/home/zyl/projects/sgClaw/claw/docs/acceptance/2026-03-29-zhihu-hotlist-excel.md` - Test: `/home/zyl/projects/sgClaw/claw/tests/runtime_profile_test.rs` - Test: `/home/zyl/projects/sgClaw/claw/tests/compat_config_test.rs` - Test: `/home/zyl/projects/sgClaw/claw/tests/compat_runtime_test.rs` - Test: `/home/zyl/projects/sgClaw/claw/tests/live_acceptance_score_test.py` - Reference only: `/home/zyl/projects/superRpa/src/out/KylinRelease/sgclaw` **Step 1: Run the Rust regression suites** Run: ```bash cargo test --test runtime_profile_test -- --nocapture cargo test --test compat_config_test -- --nocapture cargo test --test compat_runtime_test -- --nocapture cargo test --test read_skill_tool_test -- --nocapture ``` Expected: PASS. **Step 2: Run the Python scoring test** Run: ```bash python3 -m unittest tests/live_acceptance_score_test.py ``` Expected: PASS. **Step 3: Run the live Zhihu hotlist Excel acceptance** Run: ```bash python3 tools/live_acceptance/run_zhihu_hotlist_excel_acceptance.py ``` Expected: - total score returns to `100` - logs show planner-first `zeroclaw` orchestration instead of selector-thrashing - no `shell`, `web_fetch`, `web_search_tool` - final summary includes a real `.xlsx` path **Step 4: Update the acceptance note** Record: - new orchestration mode - tool sequence - timing notes - any remaining selector or latency risk **Step 5: Rebuild and sync the runtime binary used by SuperRPA** Run: ```bash cargo build cp /home/zyl/projects/sgClaw/claw/target/debug/sgclaw /home/zyl/projects/superRpa/src/out/KylinRelease/sgclaw sha256sum /home/zyl/projects/sgClaw/claw/target/debug/sgclaw /home/zyl/projects/superRpa/src/out/KylinRelease/sgclaw ``` Expected: the two hashes match exactly. **Step 6: Commit** ```bash git add docs/acceptance/2026-03-29-zhihu-hotlist-excel.md tests/runtime_profile_test.rs tests/compat_config_test.rs tests/compat_runtime_test.rs tests/live_acceptance_score_test.py git commit -m "test: verify planner-first zeroclaw browser orchestration end to end" ``` ### Task 7: Surface The Generated Plan In The Chat UI Without Giving Frontend Control **Files:** - Modify: `/home/zyl/projects/sgClaw/claw/src/compat/event_bridge.rs` - Modify: `/home/zyl/projects/sgClaw/claw/src/pipe/protocol.rs` - Modify: `/home/zyl/projects/superRpa/src/chrome/browser/ui/webui/superrpa/sgclaw_session_service.cc` - Modify: `/home/zyl/projects/superRpa/src/chrome/browser/resources/superrpa/` (the active sgClaw chat UI files that render task progress) - Test: `/home/zyl/projects/sgClaw/claw/tests/pipe_protocol_test.rs` - Test: `/home/zyl/projects/sgClaw/claw/tests/compat_runtime_test.rs` **Step 1: Write the failing protocol/UI test** Add a test that proves the backend can emit a structured planning event before tool execution starts. The event must carry: - a short plan title - a flat ordered step list - current phase such as `planning`, `executing`, `completed` The frontend test or fixture should verify the chat can render the plan summary without waiting for final completion. **Step 2: Run test to verify it fails** Run: ```bash cargo test --test pipe_protocol_test -- --nocapture cargo test --test compat_runtime_test plan_events_are_emitted_before_browser_execution -- --nocapture ``` Expected: FAIL because the protocol does not yet expose a dedicated plan-progress event. **Step 3: Add the minimal backend event shape** Extend the `sgclaw` pipe/event bridge so the orchestration layer can emit: - planner summary - execution stage transitions Keep the event read-only from the frontend’s perspective. The UI may display it, but cannot edit or branch execution. **Step 4: Render the plan in the active chat UI** Update the SuperRPA sgClaw chat UI so it: - prints the generated plan immediately after planning completes - keeps the plan compact and collapsible - highlights the current phase while waiting Do not add frontend-owned retry logic, decision logic, or browser action generation. **Step 5: Run verification** Run: ```bash cargo test --test pipe_protocol_test -- --nocapture cargo test --test compat_runtime_test -- --nocapture ``` Expected: PASS. **Step 6: Manual browser validation** Submit: ```text 读取知乎热榜前10,并导出 excel 文件 ``` Expected: - the chat first shows a short generated plan - the user sees stage transitions instead of a blank wait - execution still follows the backend-owned `zeroclaw` path **Step 7: Commit** ```bash git add src/compat/event_bridge.rs src/pipe/protocol.rs tests/pipe_protocol_test.rs tests/compat_runtime_test.rs git commit -m "feat: surface backend-generated execution plans in sgclaw chat ui" ```