Skip to content

fix(tests): modal smoke intermittently loses its seeded draft - #1941

Merged
shanselman merged 1 commit into
openclaw:mainfrom
bkudiess:bkudiess-investigate-draft-retention-smoke
Oct 30, 2026
Merged

shanselman merged 1 commit into
openclaw:mainfrom
bkudiess:bkudiess-investigate-draft-retention-smoke

Conversation

@bkudiess

@bkudiess bkudiess commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Related: #1940 (feat: pin Gateway pages beside chat). This standalone fix contains no page-pin changes and does not modify that branch.

What Problem This Solves

Fixes: the shared-root dialog smoke test intermittently reports an empty retained draft when it navigates before the composer has accepted its synthetic input.

User Impact

User impact: no shipping behavior change. The existing five-case native UI test now establishes its draft precondition before exercising dialog navigation.

Why This Change Was Made

UIA ValuePattern.SetValue can change the native textbox before Reactor's deferred TextChanged callback updates the view model. The reproduced failure navigated away in that gap, and a controlled render overwrote the native text with the still-empty view-model draft.

The eight added lines wait for the visible exact draft text and enabled Send action before navigation. In this fresh fixture there are no attachments, and the Send action is derived from ChatComposerViewModel.CanSend. Native text alone is not the acknowledgement.

The test still checks the original composer runtime ID and immediate draft equality on return. There is no final-return retry, retyping, fixed sleep, new test hook, product change, or change to the five theory cases. END240 is explicitly outside this PR.

Evidence

All local observations below were collected on October 30, 2026. Counts were re-read from actual TRX result rows, not inferred from process exit codes.

Verified before/after screenshot evidence. Both GitHub-hosted images were downloaded again and matched their original SHA256 hashes byte-for-byte.

Before: original test, instrumented failure After: final test-only patch, unsigned Release
Empty draft and disabled Send after the original Chat and settings-origin case Exact retained draft and enabled Send after the patched Release case
Retained run Source Executed result
baseline-release Clean 8295c80c30fae01b29872161b5d448308a5b8a0f, original test 4 passed, 1 failed, 0 skipped
entry-ack-only-release Same base, entry acknowledgement and diagnostic observations, immediate return assertion unchanged 5 passed, 0 failed, 0 skipped
native-event-trace-release Same base, original test plus fixture-only composer tracing 5 passed, 0 failed, 0 skipped
native-event-trace-release-2 Identical instrumented source to preceding run 4 passed, 1 failed, 0 skipped; causal trace below
fix-debug ef1df54d plus exactly this eight-line patch, no product instrumentation 5 passed, 0 failed, 0 skipped
fix-release-unsigned Same final source, unsigned non-Dev Release 5 passed, 0 failed, 0 skipped

Both reproduced failures were SharedRootDialog_DefersNavigationAndRejectsNativeBinding(destination: Chat, settingsOrigin: True), at the original line 153: expected Keep this draft behind the shared-root dialog, actual "".

The failed instrumented replay, not the passing reruns, establishes the local ordering defect:

Local time Observation from the same native control and view model
14:57:12.469 Native TextChanging: 45 characters; view-model draft length 0, revision 0
14:57:12.521 Chat host hides while the view model is still empty
14:57:12.630 Render starts with native length 45 and view-model length 0
14:57:12.840-841 Native text becomes empty during reconciliation
14:57:12.873 Native TextChanged occurs without the bound callback
14:57:13.018-020 Later bound callback receives length 0; draft revision advances
14:57:15.442 Chat returns empty; identity survives but immediate draft equality fails

The first instrumented run captured the opposite ordering: the callback received all 45 characters before reconciliation. Instrumentation can perturb timing; it nevertheless reproduced and recorded the overwrite. The source of the pending render was not separately instrumented.

Exact source contract and prior CI comparison

The installed Microsoft.UI.Reactor package was 0.1.0-preview.12, pinned to microsoft/microsoft-ui-reactor commit b2a71d4ba0d8923a64c6e9c580a0f3318544d72f:

These explain why a native value can disappear before its first accepted view-model update. Reactor and the product composer are not modified by this PR.

Historical hosted run Head reported by GitHub Result and limit
40966356655, attempt 2 621f90a309b0a8d87c5295a0bbbc7d722dd10b7e Matching empty-draft failure; no native/view-model trace
41085357896, attempt 1 7d7962f0ce57d3fd8b5c891424c59a3b515ce373 Passed with a wider test-only candidate; not a run of this patch
41109038423, job 124248150432 ec6baa75d89b32240f60d2717a29c2e210348bfd 48/49 UI cases passed; same original Chat/True assertion failed

The original Split 5 Release failure was local, not hosted. The matching hosted signature does not establish an identical cause without its own trace. The earlier 7d7962f0 candidate also waited after returning; that extra wait has not been shown necessary and is deliberately absent here.

Retained artifact hashes and runtime identity

These digests identify retained local evidence; they are not public download links or signed attestations. No raw settings, tokens, identities, unrelated desktop content, or full application logs are published.

Artifact SHA256
Final eight-line patch A69EAF912759AA2CEC8E844C3C03F3E7B8A69561703C761639FA7F1AE8673A4A
baseline-release/modal.trx 435FDE4C62A69A1924A666906C5D6B41115E71084A616BD5F60BD201246507CE
native-event-trace-release-2/modal.trx 2C88101491AE59821F38F5306A59847B0DBBABC9293ACFC951A278154843AB8A
Causal trace log, excerpt summarized above E94A177FE1552C5C217832A1A1AF5A8CE39D834DB18FD6B2FF25C3CE32D3B10F
Preserved diagnostic patch, not included in this PR 5C00FEE598C1A7270321B48931A17A6F49E62DF879E089ECF2C4FA875EA3B8C4
fix-debug/modal.trx 49E6B21F2B223AB2E96D051710F3B4F933AE8003E0B2D74F142EE8922CB5FDAD
fix-release-unsigned/modal.trx D2539886B823B1C7BC465A3F23C927FCE16B62689351F07A81EBD70887F3C93D
Final full build log 0BDA7C87057E776A5BC01C075D6EC7AB7E759D7C4DC77DA70A75A1B3684D7925
Final Shared.trx F640FB271C339EECDD0AB7D3F7ADF62B5C8CCEC2BBE4F2B854F5F28F42D34827
Final Tray.trx 3471594D9B6FFA07785D6360C0BAC69C34DE9812BDE89D8C6F8177617053B9C9
Before image, instrumented failure BD5FC78C6B263A0E386D03A9B52914F79CAC5BF8E130AA354ECB811D76B47E93
After image, final Release source BC3259956DC0494A4D21D98E6CF0F60579AA753642002DEF4A6D23F1A4599E34
Loaded binary SHA256
Final Debug app assembly 9E7EBB3307DC57F8162F00601FCD11BF94B47746980FC6712024A698A0C49DE9
Final Release app assembly E3A8045865546831E032A44F6DA87564C087005AD2A753C581F9722158CFEC9A
Final Debug/Release app host EXE C0C61CA95BEEB1E4F00603BD0EDC58524F4907395E7379FDEC6BAAE287595790

The final Debug and Release runner source.json records match the full current patch exactly. Each configuration's five run.json manifests match its recorded post-build app hashes. Tests used --no-build after identity capture.

Before capture: run 6140fd7b9a2c47319a4959e6e8bab33c, 18:57:15.896570 UTC, original test plus tracing on 8295c80c. After capture: run f1e8f35bc13a40a599fca9f36c8bbdfa, 19:06:28.440609 UTC, final Release source on ef1df54d plus this patch. Both are owned-window PrintWindow(PW_RENDERFULLCONTENT) captures of synthetic fixture content. The sidebar differs because the baseline is the page-pin branch; this is a draft-retention comparison, not visual layout proof. The final Debug screenshot has the same pixels/hash but its own run and timestamp.

Change Type

  • Bug fix
  • Feature
  • Refactor
  • Docs or instructions
  • Tests or validation
  • Security hardening
  • Chore or infrastructure

Scope

  • Tray or WinUI UX
  • Windows node capability
  • Local MCP or winnode
  • Gateway, connection, or pairing
  • Setup or onboarding
  • Permissions, privacy, or security
  • Tests, CI, or docs

Required proof pools

  • none: only the existing hosted native UI test's input precondition changes. No shipping UI, Gateway, permission, installer, architecture, or custom hardware contract changes. The focused local fixture observations are supplementary and are not a completed windows-winui-interactive pool.

Validation

Source tested: ef1df54dfe95a8b0a2ae8033425561136d8a70ef plus the exact final uncommitted patch identified above. Publication commit: a2fb7ef9d0bc4e530ac12e790573740706b1ba78, tree 7b82f5acee2f5453df3aaff2b5f98a0544031117. These are retained pre-commit executions with source correspondence, not new executions after committing. There was no rebase or product-source change.

Command Observed result
.\build.ps1 Passed; all five build targets succeeded
dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore --nologo -v:minimal --results-directory $artifacts --logger 'trx;LogFileName=Shared.trx' 4,807 passed, 0 failed, 25 opt-in skips
dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore --nologo -v:minimal --results-directory $artifacts --logger 'trx;LogFileName=Tray.trx' 4,763 passed, 0 failed, 0 skipped
Focused command below, $Configuration = 'Debug' 5 passed, 0 failed, 0 skipped; 43.93 seconds TRX invocation
Focused command below, $Configuration = 'Release' 5 passed, 0 failed, 0 skipped; 44.61 seconds TRX invocation
git diff --check Passed
git apply --reverse --check <retained-final-patch> Passed; exact retained patch applies in reverse
.\scripts\Get-CiChangeClassification.ps1 -EventName pull_request -ChangedPaths 'tests\OpenClaw.Tray.UITests\GatewayFixtureSettingsModalUiTests.cs' -Human Read-only plan: targeted ui_tests; no CI dispatch
Independent shared autoreview, local mode, base ef1df54d, --max-priority P3 Blocked: Codex HTTP 401 authentication failure; exit 1, no completed review
Separate real-profile metadata guards Failed, as described below; wrapper exits are not successful overall proof

The required Shared/Tray projects were built before their --no-restore runs, preventing a first-run zero-test false pass. $artifacts is the invocation-specific evidence directory, not a shared or latest-results directory.

Exact focused command, cases, and harness corrections

The session-owned runner executed this command for each selected $Configuration; $artifacts identifies that run's output directory:

$env:OPENCLAW_REPO_ROOT = $repo
$env:OPENCLAW_RUN_GATEWAY_FIXTURE_UI = '1'
$env:OPENCLAW_GATEWAY_FIXTURE_APP = Join-Path $repo "src\OpenClaw.Tray.WinUI\bin\x64\$Configuration\net10.0-windows10.0.22621.0\win-x64\OpenClaw.Tray.WinUI.exe"
$env:OPENCLAW_GATEWAY_FIXTURE_ARTIFACTS = Join-Path $artifacts 'runtime'
$env:OPENCLAW_GATEWAY_FIXTURE_SCREENSHOTS = '1'
$env:RequireSignedCleanupHost = 'false'
$env:OPENCLAW_TRAY_DATA_DIR = Join-Path $artifacts 'test-profile'
$env:OPENCLAW_TRAY_APPDATA_DIR = Join-Path $artifacts 'test-roaming'
$env:OPENCLAW_TRAY_LOCALAPPDATA_DIR = Join-Path $artifacts 'test-local'
Remove-Item Env:\OPENCLAW_TRAY_LOCAL_DATA_DIR, Env:\OPENCLAW_STATE_DIR,
    Env:\OPENCLAW_RUN_INTEGRATION, Env:\OPENCLAW_RUN_E2E,
    Env:\OPENCLAW_RUN_MXC_E2E, Env:\OPENCLAW_RUN_GPU_PROOF -ErrorAction SilentlyContinue

dotnet build .\tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj `
    -c $Configuration -r win-x64 -p:Platform=x64 -p:DevBuild=false -m:1 `
    --nologo -v:minimal
dotnet test .\tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj `
    -c $Configuration -r win-x64 -p:Platform=x64 -p:DevBuild=false -m:1 `
    --no-build --no-restore `
    --filter 'FullyQualifiedName~SharedRootDialog_DefersNavigationAndRejectsNativeBinding' `
    --results-directory $artifacts --logger 'trx;LogFileName=modal.trx' `
    --nologo -v:minimal
Theory parameters Final Debug Final unsigned Release
null, false Passed Passed
Channels, false Passed Passed
Skills, false Passed Passed
Chat, false Passed Passed
Chat, true Passed Passed

Earlier failed attempts were retained rather than counted as passes. The first non-Dev Release build required a signed cleanup helper; the documented intentional-local-test override RequireSignedCleanupHost=false was then used. The first required closeout had two executable-resolution failures because the runner's bounded PATH omitted Windows PowerShell. Adding C:\Windows\System32\WindowsPowerShell\v1.0 made the two targeted tests pass (2/2), and the entire required build/Shared/Tray sequence was rerun with the results above. No repository code was changed to address either harness issue.

Real Behavior Proof

  • Environment tested: local Windows x64, mounted WinUI controls, UI Automation and local MCP navigation against the synthetic Gateway fixture, separate test-owned profile directories. Not a real provider or Gateway pairing test.
  • PR head or commit tested: ef1df54dfe95a8b0a2ae8033425561136d8a70ef plus exactly this eight-line patch. Publication commit a2fb7ef9d0bc4e530ac12e790573740706b1ba78 has corresponding source, but was not the embedded binary commit during these runs.
  • Exact steps or command run: focused command above. Select the research conversation for Chat cases, set the draft through UIA, wait for visible exact text and enabled Send, navigate through the shared-root dialog/native-binding rejection, and assert unchanged composer identity and exact draft immediately on return.
  • Evidence after fix: all five cases passed in both configurations. The complete Release window visibly shows the full retained draft and enabled Send after navigation; its owned capture receipt and binary hashes were checked.
  • Observed result: the original return assertions pass without waiting for draft restoration. The local failing trace establishes an input-acceptance ordering gap, not loss of a draft already accepted by the view model.
  • Screenshot or artifact links verified? (Yes/No/N/A): Yes. The exact evidence comment and both image URLs were read back; downloaded image hashes match the originals.
  • Not verified or blocked: clean-host isolation, independent shared-autoreview source review, and new-head CI remain unverified. An independent rubber-duck assessment found no blocking code or proof-claim issues. Hosted CI is still running, with the UI, functional, and accessibility job in progress. The real local log changed during focused runs; during full closeout last-chat-state.json also retained its 999-byte size but changed timestamp, within the Shared test window. An unowned app was running; attribution is unknown, and it was not stopped or modified. No clean-isolation, signed-release, normal keyboard-input, real Gateway, ARM64, whole-suite UI, or overall merge-readiness claim is made. Historical hosted runs lack causal traces. END240 was not investigated.

Security Impact

  • New permissions or capabilities? (Yes/No): No.
  • Secrets or tokens handling changed? (Yes/No): No.
  • New or changed network calls? (Yes/No): No.
  • Command or tool execution surface changed? (Yes/No): No.
  • Data access scope changed? (Yes/No): No.
  • If any answer is Yes, explain the risk and mitigation: N/A. Only synthetic-input readiness in an existing test changes.

Compatibility and Migration

  • Backward compatible? (Yes/No): Yes.
  • Config or environment changes? (Yes/No): No product configuration changes. The existing unsigned local Release test override is documented above.
  • Migration needed? (Yes/No): No.
  • If yes, list the exact upgrade steps: N/A.

Review Conversations

  • I replied to or resolved every bot review conversation addressed by this PR.
  • I left unresolved only conversations that still need maintainer judgment.

No review conversations have been resolved. The independent rubber-duck assessment found no blocking issue and judged the change ready for human review. The separate scoped shared-autoreview source review attempted Codex through the installed helper and stopped on HTTP 401, so no clean P0-P3 helper report exists. This review result is disclosed, not treated as a successful helper run. Author-side simplification retained only the eight-line entry acknowledgement and all original retention/identity assertions.

Wait for the visible exact draft and enabled Send action before modal navigation. Keep the existing composer identity and immediate return-value assertions unchanged.

Co-authored-by: Copilot App <223556219+users.noreply.github.com>
@clawsweeper

clawsweeper Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@bkudiess

Copy link
Copy Markdown
Collaborator Author

Native draft-retention proof

These are complete owned-window captures of synthetic fixture content, not a production conversation. The local runs' separate real-profile metadata guards failed, so these captures do not establish clean-host isolation.

Before: reproduced failure

Original modal test on 8295c80c30fae01b29872161b5d448308a5b8a0f, with fixture-only composer tracing. The same Chat/True run failed its immediate return assertion: the draft is empty and Send is disabled. The trace shows native length 45 overwritten from the still-empty view model before its callback accepts input.

Before: the original Chat and settings-origin case returns to an empty composer with Send disabled

Run 6140fd7b9a2c47319a4959e6e8bab33c; captured 2026-10-30 18:57:15.896570 UTC.
SHA256: BD5FC78C6B263A0E386D03A9B52914F79CAC5BF8E130AA354ECB811D76B47E93.

After: exact seeded draft retained

Final eight-line test-only patch on ef1df54dfe95a8b0a2ae8033425561136d8a70ef, unsigned non-Dev Release, without product instrumentation. The original identity and immediate return-value assertions passed; the later destination capture shows the complete expected draft and enabled Send. All five focused cases passed.

After: the final Release test retains Keep this draft behind the shared-root dialog and enables Send

Run f1e8f35bc13a40a599fca9f36c8bbdfa; captured 2026-10-30 19:06:28.440609 UTC.
SHA256: BC3259956DC0494A4D21D98E6CF0F60579AA753642002DEF4A6D23F1A4599E34.

The after source corresponds to commit a2fb7ef9d0bc4e530ac12e790573740706b1ba78, but this is retained pre-commit execution, not a post-commit binary run. The before image is from the page-pin branch, so the sidebar differs. This comparison proves the observed draft states, not a layout change or that ordinary keyboard input is unaffected. Full commands, counts, source/binary digests, causal observations and limitations are in the PR description.

@bkudiess
bkudiess marked this pull request as ready for review October 30, 2026 19:59
@clawsweeper clawsweeper Bot added P2 Normal priority bug or improvement with limited blast radius. proof: sufficient Contributor real behavior proof is sufficient. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Oct 30, 2026
@clawsweeper

clawsweeper Bot commented Oct 30, 2026

Copy link
Copy Markdown

Codex review: needs maintainer review before merge.

What this changes

The modal UI smoke test waits for its exact seeded draft and enabled Send action before navigating.

Example: The Chat destination case opens a Settings-origin dialog after seeding "Keep this draft behind the shared-root dialog".

  • Before: Navigation can precede the composer callback, leaving an empty draft on return and failing the test.
  • After: Navigation waits for accepted input, and the unchanged immediate-return assertion checks the complete draft.

Review scores

Measure Result What it means
Overall readiness 🦞 diamond lobster (5/6) A minimal test repair supported by inspected native before/after evidence and a causal trace, with strict original assertions preserved.
Proof confidence 🦞 diamond lobster (5/6) ✨ media proof bonus Sufficient (screenshot): Inspected native screenshots show the failing empty composer and the corrected exact draft with enabled Send; the body supplies causal native-event observations and five passing cases in Debug and unsigned Release through the real Companion executable, UIA, and local MCP against the synthetic Gateway fixture. Execution used the exact patch before commit, with explicit source correspondence; clean-host isolation and ordinary keyboard-input behavior are not established or claimed.
Patch quality 🦞 diamond lobster (5/6) No actionable review findings were identified.

Product

Kind: Test only · Worth it: Yes · Fix scope: Complete
User problem: Developers receive intermittent empty-draft failures when the modal smoke navigates before its synthetic input reaches the composer model.
Reason: This collaborator-authored, test-only repair addresses recorded ordering evidence while retaining the feature's existing draft-preservation contract.

Merge readiness

✅ Ready for maintainer review

Keep open: this collaborator-authored PR provides a focused repair for a demonstrated test-input race while preserving the original retention assertions; no introduced defect was found.

Priority: P2
Reviewed head: a2fb7ef9d0bc4e530ac12e790573740706b1ba78

Before merge

None.

Findings

None.

Agent review details

How this fits together

The native UI fixture drives the real Companion executable through UI Automation and local MCP; the composer binds native textbox changes to its view model, whose state controls Send availability.

flowchart LR
  A[Native UI fixture] --> B[UI Automation draft input]
  B --> C[Reactor textbox callback]
  C --> D[Composer view model]
  D --> E[Enabled Send action]
  E --> F[Modal navigation]
  F --> G[Immediate retention assertions]
Loading

Technical review

Best possible solution:

Keep the acknowledgement in the existing modal test before navigation and preserve all immediate retention and identity assertions.

Do we have a high-confidence way to reproduce the issue?

The original test navigates immediately after UIA SetValue, and the supplied failed native trace records reconciliation overwriting text before the bound callback accepts it; this review did not execute a reproduction.

Is this the best way to solve the issue?

The eight-line check is the smallest complete test repair: it establishes accepted input through existing observable state without retrying retention, retyping, adding hooks, or changing production behavior.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against ef1df54dfe95.

Provenance checked

  • Shared-root modal draft precondition keeps the original intent (4e31031: The merged shared-window feature tests retained chat and drafts through deferred modal navigation and rejected native setup binding.)

Testing

Proof path: shipped entry point.

Security

None.

Evidence

What I checked:

Review metrics

Metric Value Why it matters
Change size Production +0/-0; tests +8/-0 One readiness check reuses the existing wait helper and preserves all five theory cases without adding infrastructure.

Labels

Label changes:

  • add P2: A demonstrated intermittent native smoke failure affects validation reliability, with no shipping behavior change.
  • add proof: sufficient: Contributor real behavior proof is sufficient.
  • add proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence.
  • add rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.

Label justifications:

  • P2: A demonstrated intermittent native smoke failure affects validation reliability, with no shipping behavior change.
  • rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.
  • proof: sufficient: Contributor real behavior proof is sufficient.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only. Repair and merge execution lanes are retired.

Reviewed October 30, 2026, 4:15 PM ET / 20:15 UTC.

@shanselman
shanselman merged commit 0907a87 into openclaw:main Oct 30, 2026
39 checks passed
@bkudiess bkudiess mentioned this pull request Oct 31, 2026
5 of 16 tasks
bkudiess added a commit to bkudiess/openclaw-windows-node that referenced this pull request Nov 2, 2026
Resolve GatewayFixtureSettingsModalUiTests.cs with main's equivalent draft-readiness wait from openclaw#1941.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P2 Normal priority bug or improvement with limited blast radius. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient Contributor real behavior proof is sufficient. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants