Conversation
Signed-off-by: Sebastien Tardif <SebTardif@ncf.ca>
When setup uses the separate wizard identity, load that identity even if context still holds an older operator id. Signed-off-by: Sebastien Tardif <SebTardif@ncf.ca>
The end-to-end and node drains were still approving every pending request after the wizard selector. They now approve only the setup device request. Signed-off-by: Sebastien Tardif <SebTardif@ncf.ca>
Reuse the existing identity-bound selector when the node socket has no request ID. Keep exact socket requests unchanged and cover foreign, missing, short, ambiguous, and unsafe requests through the actual approval path. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 50e2dd32-b79f-4654-9231-5766c9e5316d
Use an explicit review-safe synthetic credential in the new fixture; no production behavior changes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 50e2dd32-b79f-4654-9231-5766c9e5316d
Use explicit placeholder credentials in the new pairing tests and keep the added node-drain credential flow review-safe without changing behavior. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Keep the existing node-drain credential setup in place, select only requests bound to setup's full identity, and isolate the new pairing fixtures with explicit placeholder credentials. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: c61d6e69-5b8b-4fac-bdf8-7d468a9b5908
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: c61d6e69-5b8b-4fac-bdf8-7d468a9b5908
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
|
Codex review: needs real behavior proof before merge. Reviewed September 25, 2026, 9:08 PM ET / September 26, 2026, 01:08 UTC (Revision 3). ClawSweeper reviewWhat this changesWindows setup snapshots pending Gateway requests before pairing and approves either the socket-provided ID or one new request matching the full setup identity; it also changes final cleanup, documentation, and tests. Merge readiness⛔ Blocked before merge - 7 items remain Keep this PR open. Current main still has the unsafe approval fallback, and this branch is a focused repair with regression coverage. No definite current-head code defect emerged from review, but the required real Gateway authority proof is incomplete. Priority: P0 Review scores
Verification
How this fits togetherWindows setup connects operator and node clients to a local Gateway. When pairing is required, setup obtains a request ID from the socket or the Gateway CLI, approves it, and continues toward a working tray connection. flowchart LR
A[Gateway pending requests] --> B[Baseline snapshot]
B --> C[Setup pairing socket]
C --> D{Socket provides an ID?}
D -->|Yes| E[Exact request ID]
D -->|No| F[New full identity match]
E --> G[Gateway approval]
F -->|One match| G
F -->|Unclear| H[Reject approval]
Decision needed
Why: The safe failure behavior is deliberate, but the supported-version and recovery impact has not been established by current-head upgrade proof; that compatibility contract needs owner intent. Before merge
Findings
Agent review detailsSecurityNeeds attention: The patch narrows pairing approval, but the inferred missing-ID authority path lacks current-head adversarial proof at the Gateway approval effect. Review metrics
Merge-risk optionsMaintainer options:
Technical reviewBest possible solution: Keep exact socket IDs authoritative and the missing-ID path fail closed, provide a visible setup retry or Fix action when listing fails, and establish allowed, foreign, and stale outcomes through the real Gateway before landing. Do we have a high-confidence way to reproduce the issue? Yes. Current main calls devices approve --latest when the socket supplies no ID, and the branch's focused fake-runner test models a newer foreign request; this read-only review did not execute the test. Is this the best way to solve the issue? Unclear pending final-effect proof. The source change is a narrow repair, but the real Gateway must confirm that the fallback rejects forbidden requests and that supported upgrades retain a usable setup path. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 5a59535216ee. LabelsLabel changes: No label changes. Label justifications:
EvidenceSecurity concerns:
What I checked:
Likely related people:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
History |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: c61d6e69-5b8b-4fac-bdf8-7d468a9b5908
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: c61d6e69-5b8b-4fac-bdf8-7d468a9b5908
|
@clawsweeper re-review The P1 JSON-baseline finding and the same bug class in both changed drain paths are fixed at 511b176. Current-head regression tests cover misleading valid metadata and nonzero list failures for baseline, device drain, and node drain. The PR body now contains final validation and the remaining live-proof blockers. |
|
🦞👀 Re-review progress:
|
|
Closeout at
|
What problem
The setup fallback approved a pending pairing request by queue position or identity alone when the socket omitted a request ID. A newer foreign request could be selected, and a stale request from an earlier setup attempt could share the same device identity.
This maintainer-owned replacement supersedes #1480 without rewriting
SebTardif/openclaw-windows-node. It is rebased onto currentorigin/mainat5a59535216eea603192f2df13d4eddf1e1a20267and preserves the contributor's narrow pairing fix.What changed
approve --latest.Original contributor head:
edb08328e5e051c30d4604ab5527e765a0ce16adMaintainer replacement head:
511b17680afb33de2544e9d985a7e4feb434fcf8Rebase conflicts: none.
Required proof pools
windows-wsl-gateway-e2e: the unchanged-head GitHub setup/connect E2E retry passed, but no current-head adversarial final-effect trace was captured for intended, foreign, and stale pairing requests. Partially verified / blocked for the security-boundary claim.windows-wsl-mxc: repository-required setup/connect MXC closeout. Not verified / blocked because this host reportsappcontainer-dacl, and Crabbox is not installed for remote no-skip validation.Validation
OPENCLAW_REPO_ROOTwas set to this isolated worktree. Tray tests used a unique temporaryOPENCLAW_TRAY_DATA_DIR. Fresh test projects received one restore run before the required--no-restorereruns..\build.ps1dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restoredotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restoredotnet test .\tests\OpenClaw.SetupEngine.Tests\OpenClaw.SetupEngine.Tests.csproj --no-restore.\scripts\validate-mxc-e2e.ps1Build and Testrun36205272379One Shared rerun hit the unrelated
McpHttpServerTests.Dispose_DuringInFlightHandler_DoesNotSurfaceObjectDisposedExceptiondisposal race. Its isolated rerun passed, then the complete required Shared and Tray sequence passed with the counts above.ClawSweeper found a valid P1 on
897ed058: rawNo pendingsubstring matching could erase a valid JSON baseline when metadata contained that text. The fix checks command status first, parses JSON before fallback, and covers both valid metadata and nonzero output. Rubber-duck review then found the same bug class in both changed drain paths. Those paths and device/node regressions were fixed on511b1768. Final rubber-duck review found no concrete source blockers.The current-head ClawSweeper re-review at
511b1768recognized the parser and drain fixes and reported no additional source correction. It remainsneeds-humanbecause current-head adversarial final-effect Gateway evidence and the no-skip MXC pool are unavailable. Its same-identity timing concern is not widened into a protocol change in this narrow PR: exact socket IDs remain authoritative, while the compatibility fallback fails closed unless one post-baseline request matches the full identity.Structured autoreview command:
python .agents\skills\autoreview\scripts\autoreview --mode branch --base origin/main --engine codex --model gpt-5.6-sol --thinking highThe final 65,187-character bundle passed fail-closed bundle construction, but the Codex engine could not run because the local CLI is not authenticated (
codex login status: not logged in). No structured result was produced. Not verified / blocked rather than reported clean.Real behavior proof
Current-head regression proof exercises the production selector and approval paths with stale same-identity, current same-identity, foreign, ambiguous, unsafe, missing-ID, exact socket-ID, plugin failure, misleading list metadata, nonzero list failures, and late device/node drains. The focused set passes all 50 cases and confirms stale and foreign request IDs are never sent to an approval command.
The unchanged-head GitHub setup/connect E2E retry passed the real WSL Gateway setup lane. It does not replace the requested adversarial final-effect trace. Not verified / blocked: no current-head live trace shows intended approval plus foreign/stale rejection at Gateway approval I/O, and no no-skip Gateway-to-node MXC proof was available. The live official-Gateway evidence on #1480 belongs to the old contributor head and is intentionally not reused as current-head proof.