Skip to content

fix(tools): treat no-op writes and edits as terminal tool-loop failures (fixes #96983)#97044

Merged
vincentkoc merged 15 commits into
openclaw:mainfrom
zw-xysk:fix/issue-96983-noop-tools-v2
Jun 26, 2026
Merged

fix(tools): treat no-op writes and edits as terminal tool-loop failures (fixes #96983)#97044
vincentkoc merged 15 commits into
openclaw:mainfrom
zw-xysk:fix/issue-96983-noop-tools-v2

Conversation

@zw-xysk

@zw-xysk zw-xysk commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

Fixes #96983.

When the write tool is called with content identical to the existing file, or the edit tool produces unchanged content, the agent loop treats these as progress and retries the same no-op mutation indefinitely.

Why This Change Was Made

  • write tool: readOriginalWriteState already detects identical content. Now returns a terminal no-op result with terminate: true instead of proceeding with the write.
  • edit tool: Filters out entries where oldText === newText before execution. If all entries are no-op, returns a terminal result. If only some are no-op, the valid sibling replacements still execute normally.
  • Also catches the No changes made error from edit-diff.ts and converts it to a terminal result.
  • Both tools use terminate: true to explicitly signal the tool-loop to stop retrying.

Changes Made

  • src/agents/sessions/tools/write.ts: Return {...textResult(...), terminate: true} when precheck detects identical content.
  • src/agents/sessions/tools/edit.ts: Filter out no-op entries (oldText === newText) before execution, preserving valid sibling edits. Catch No changes made error from edit-diff and return terminal result.
  • src/agents/sessions/tools/write.test.ts: Added 2 regression tests.
  • src/agents/sessions/tools/edit.test.ts: Added 3 regression tests (all no-op, mixed batch, real changes).

Evidence

  • Unit tests: node scripts/run-vitest.mjs run src/agents/sessions/tools/write.test.ts src/agents/sessions/tools/edit.test.ts — 14/14 passed

Real behavior proof

Environment: Linux, OpenClaw 2026.6.10, Node 24.13.1

WRITE IDENTICAL: No changes made to demo.txt. The file already has identical content. | terminate: true
WRITE DIFFERENT: Successfully wrote 12 bytes to demo.txt
EDIT NO-OP: No changes made to ... The replacement text is identical to the original. | terminate: true
EDIT MIXED BATCH: Successfully replaced 1 block(s) in ... (valid sibling preserved)
EDIT REAL CHANGE: Successfully replaced 1 block(s) in ...
  • ✅ Write to existing file with identical content → no-op, terminate: true, file unchanged
  • ✅ Write with different content → normal success
  • ✅ Edit with all no-op entries → terminate: true, file unchanged
  • ✅ Edit with mixed batch (no-op + real) → valid replacements still execute
  • ✅ Edit with real changes → normal replace success

What was not tested: E2E agent loop with LLM calling write/edit (requires real model inference).

  • AI-assisted

@openclaw-barnacle openclaw-barnacle Bot added agents Agent runtime and tooling size: S labels Jun 26, 2026
@zw-xysk

zw-xysk commented Jun 26, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper

clawsweeper Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed June 26, 2026, 6:36 PM ET / 22:36 UTC.

Summary
The branch changes built-in write, edit, edit-diff, apply_patch, and focused tests so no-op file mutations can return terminal tool results instead of normal progress or retryable errors.

PR surface: Source +169, Tests +460. Total +629 across 7 files.

Reproducibility: yes. source-level reproduction is high confidence: current main allows the reported no-op write/edit/apply_patch behavior, and PR head would skip an exact trailing-whitespace edit because the fuzzy-normalized old/new strings compare equal.

Review metrics: 1 noteworthy metric.

  • Fuzzy normalization classes: 4 classes compared as no-op. Trailing whitespace, smart quotes, dashes, and Unicode spaces are normalized before the PR decides an edit is no-op, which can swallow real formatting edits.

Stored data model
Persistent data-model change detected: serialized state: src/agents/apply-patch.test.ts, serialized state: src/agents/apply-patch.ts, serialized state: src/agents/sessions/tools/edit-diff.ts, serialized state: src/agents/sessions/tools/edit.test.ts, serialized state: src/agents/sessions/tools/edit.ts, serialized state: src/agents/sessions/tools/write.test.ts, and 5 more. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #96983
Summary: This PR is an active candidate fix for the canonical no-op file-mutation issue; another open PR overlaps but is narrower, earlier attempts are closed, and the broad circuit-breaker issue only partially overlaps.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🦪 silver shellfish
Patch quality: 🧂 unranked krab
Result: blocked until stronger real behavior proof is added.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P1] Fix fuzzy-equivalent no-op classification so exact formatting edits still apply.
  • [P1] Add redacted latest-head real behavior proof for apply_patch and the fuzzy edit edge case.
  • [P1] State or implement the intended structured no-op result contract for maintainers.

Proof guidance:

  • [P1] Needs stronger real behavior proof before merge: The PR body includes copied live output for write/edit, but latest-head apply_patch and fuzzy no-op behavior still need redacted terminal output, logs, a terminal screenshot, or another linked artifact; private details should be redacted before posting. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Risk before merge

  • [P1] The fuzzy no-op split can skip real exact edits that intentionally remove trailing whitespace or normalize Unicode punctuation/spacing, leaving the file unchanged while returning a terminal result.
  • [P1] Changing same-content write, no-change edit, and no-op apply_patch from success or ordinary errors into terminal results can alter upgraded session continuation behavior.
  • [P1] The PR body only shows copied write/edit output; latest-head apply_patch and fuzzy no-op behavior still need redacted real behavior proof.
  • [P1] The PR uses text plus terminate:true without stable structured no-op reason details, which may or may not be the contract maintainers want for UI, telemetry, or retry policy.

Maintainer options:

  1. Fix fuzzy no-op handling before merge (recommended)
    Keep exact formatting conversions as real edits, add a regression test for trailing-whitespace or Unicode normalization edits, and refresh latest-head proof for write/edit/apply_patch.
  2. Require stable no-op details
    Maintainers can require blocked/no-op reason details for write, edit, and apply_patch if downstream UI, telemetry, or retry policy needs a machine-readable contract.
  3. Pause for the canonical issue path
    If maintainers prefer a smaller or differently structured fix, pause this branch and keep the canonical issue as the landing target.

Next step before merge

  • [P1] Human review is needed because the PR has a blocking code regression plus contributor-owned proof and terminal-semantics gaps; no repair marker should be requested while real behavior proof is insufficient.

Security
Cleared: No concrete security or supply-chain concern was found; the diff changes built-in file-tool behavior and tests without dependency, workflow, credential, download, or package-execution changes.

Review findings

  • [P1] Preserve exact formatting edits before fuzzy no-op filtering — src/agents/sessions/tools/edit-diff.ts:466-467
Review details

Best possible solution:

Fix fuzzy no-op classification so exact formatting edits still apply, add latest-head proof for write/edit/apply_patch and the fuzzy edge case, then merge only after maintainers accept the terminal result semantics.

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

Yes, source-level reproduction is high confidence: current main allows the reported no-op write/edit/apply_patch behavior, and PR head would skip an exact trailing-whitespace edit because the fuzzy-normalized old/new strings compare equal.

Is this the best way to solve the issue?

No, not as currently written. The file-tool boundary is the right layer, but fuzzy-equivalent edits should only be terminalized after proving the actual applied content is unchanged or that oldText did not match exactly.

Full review comments:

  • [P1] Preserve exact formatting edits before fuzzy no-op filtering — src/agents/sessions/tools/edit-diff.ts:466-467
    normalizeForFuzzyMatch strips trailing whitespace and normalizes quotes, dashes, and special spaces, so this branch puts exact edits like oldText: "foo " to newText: "foo" into noOpEdits. When no other real edit remains, edit.ts returns terminate:true without changing the file, even though current applyEditsToNormalizedContent would apply that exact replacement. Only classify fuzzy-equivalent pairs as no-op after confirming the exact old text was not present or that applying the edit leaves content unchanged.
    Confidence: 0.92

Overall correctness: patch is incorrect
Overall confidence: 0.9

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against eba1ca683f6c.

Label changes

Label changes:

  • add rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🦪 silver shellfish and patch quality is 🧂 unranked krab.
  • remove rating: 🦪 silver shellfish: Current PR rating is rating: 🧂 unranked krab, so this older rating label is no longer current.

Label justifications:

  • P2: The PR addresses a normal-priority agent file-tool loop bug, but the current patch has bounded correctness and proof blockers before merge.
  • merge-risk: 🚨 compatibility: The PR changes existing file-tool outcomes from success or ordinary errors to terminal results and can skip formatting edits that current behavior applies.
  • merge-risk: 🚨 session-state: The patch changes whether file-tool calls stop the current tool batch, which affects agent session continuation and false-progress handling.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🦪 silver shellfish and patch quality is 🧂 unranked krab.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: The PR body includes copied live output for write/edit, but latest-head apply_patch and fuzzy no-op behavior still need redacted terminal output, logs, a terminal screenshot, or another linked artifact; private details should be redacted before posting. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed

PR surface:

Source +169, Tests +460. Total +629 across 7 files.

View PR surface stats
Area Files Added Removed Net
Source 4 202 33 +169
Tests 3 465 5 +460
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 7 667 38 +629

What I checked:

  • Repository policy applied: Root AGENTS.md and scoped src/agents/AGENTS.md were read; the review-depth, session-state, compatibility, and proof guidance applies because this PR changes agent file-tool loop behavior. (AGENTS.md:11, eba1ca683f6c)
  • Current main write gap: Current main can detect same-content writes with readOriginalWriteState, but still calls writeFile and reports successful progress. (src/agents/sessions/tools/write.ts:395, eba1ca683f6c)
  • Current main edit behavior: Current main's edit path applies exact replacements and throws a no-change error only after baseContent equals newContent, so exact oldText/newText differences such as trailing-whitespace removal are real edits before this PR's fuzzy prefilter. (src/agents/sessions/tools/edit-diff.ts:199, eba1ca683f6c)
  • Terminal result contract: AgentToolResult.terminate is a batch-stop hint, and the loop stops only when every finalized tool result has terminate:true, so changing file tools to terminal results is session-behavior-sensitive. (packages/agent-core/src/types.ts:449, eba1ca683f6c)
  • PR head fuzzy no-op regression: PR head classifies edits as no-op when normalizeForFuzzyMatch(oldText) equals normalizeForFuzzyMatch(newText), which includes trailing whitespace, smart quotes, dashes, and special spaces rather than only exact no-ops. (src/agents/sessions/tools/edit-diff.ts:466, be67a514a2a6)
  • PR head terminalizes filtered edits: After splitNoOpEdits, edit.ts returns terminate:true when realEdits is empty, so an exact edit like removing trailing spaces can be reported as no changes and skipped. (src/agents/sessions/tools/edit.ts:430, be67a514a2a6)

Likely related people:

  • kevinslin: The current write/edit/apply_patch files in this checkout trace through commit a6a4652 and merged PR fix(codex): expose plugin apps after delayed inventory load #96872, authored by kevinslin. (role: introduced current tool implementation; confidence: high; commits: a6a4652c708a; files: src/agents/sessions/tools/edit-diff.ts, src/agents/sessions/tools/edit.ts, src/agents/sessions/tools/write.ts)
  • vincentkoc: Vincent force-pushed the latest head and authored the later commits that added apply_patch and fuzzy edit no-op handling on this branch. (role: recent follow-up owner; confidence: high; commits: 6c20b616d471, 63000f6aaf4d, be67a514a2a6; files: src/agents/apply-patch.ts, src/agents/sessions/tools/edit-diff.ts, src/agents/sessions/tools/edit.ts)
  • steipete: Live PR timeline shows this PR was assigned to steipete during the maintainer review window; this is routing context rather than blame for the code. (role: assigned reviewer; confidence: medium; files: src/agents/sessions/tools/edit-diff.ts, src/agents/apply-patch.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. labels Jun 26, 2026
@zw-xysk

zw-xysk commented Jun 26, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@zw-xysk

zw-xysk commented Jun 26, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 26, 2026
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 26, 2026
@clawsweeper clawsweeper Bot removed the rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. label Jun 26, 2026
@vincentkoc
vincentkoc force-pushed the fix/issue-96983-noop-tools-v2 branch from c2b4903 to 63000f6 Compare June 26, 2026 22:24
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jun 26, 2026
@vincentkoc
vincentkoc merged commit ab966c2 into openclaw:main Jun 26, 2026
105 of 107 checks passed
@vincentkoc

Copy link
Copy Markdown
Member

Merged via squash.

wangmiao0668000666 pushed a commit to wangmiao0668000666/openclaw that referenced this pull request Jun 27, 2026
…es (fixes openclaw#96983) (openclaw#97044)

* fix(tools): treat no-op writes and edits as terminal tool-loop failures

Fixes openclaw#96983

* fix(tools): treat no-op writes and edits as terminal tool-loop failures

Fixes openclaw#96983

* fix(tools): preserve valid sibling edits in mixed no-op batches

Fixes openclaw#96983

* fix(tools): terminate apply_patch no-ops safely

* fix(tools): validate no-op edits independently

* fix(tools): preserve no-op edit overlap checks

* fix(tools): preserve no-op patch file formatting

* fix(tools): preserve move no-op formatting

* fix(tools): narrow same-path move no-op typing

* fix(tools): distinguish edit no-op errors

* fix(tools): keep edit previews aligned with execution

* fix(tools): align no-op validation and formatting

* fix(tools): preserve empty patch and preview no-ops

* fix(tools): preview fuzzy edit no-ops cleanly

* fix(tools): isolate fuzzy-equivalent edit no-ops

---------

Co-authored-by: Vincent Koc <[email protected]>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 27, 2026
…es (fixes openclaw#96983) (openclaw#97044)

* fix(tools): treat no-op writes and edits as terminal tool-loop failures

Fixes openclaw#96983

* fix(tools): treat no-op writes and edits as terminal tool-loop failures

Fixes openclaw#96983

* fix(tools): preserve valid sibling edits in mixed no-op batches

Fixes openclaw#96983

* fix(tools): terminate apply_patch no-ops safely

* fix(tools): validate no-op edits independently

* fix(tools): preserve no-op edit overlap checks

* fix(tools): preserve no-op patch file formatting

* fix(tools): preserve move no-op formatting

* fix(tools): narrow same-path move no-op typing

* fix(tools): distinguish edit no-op errors

* fix(tools): keep edit previews aligned with execution

* fix(tools): align no-op validation and formatting

* fix(tools): preserve empty patch and preview no-ops

* fix(tools): preview fuzzy edit no-ops cleanly

* fix(tools): isolate fuzzy-equivalent edit no-ops

---------

Co-authored-by: Vincent Koc <[email protected]>
xydigit-zt pushed a commit to xydigit-zt/xydigit-zt-openclaw that referenced this pull request Jun 28, 2026
…es (fixes openclaw#96983) (openclaw#97044)

* fix(tools): treat no-op writes and edits as terminal tool-loop failures

Fixes openclaw#96983

* fix(tools): treat no-op writes and edits as terminal tool-loop failures

Fixes openclaw#96983

* fix(tools): preserve valid sibling edits in mixed no-op batches

Fixes openclaw#96983

* fix(tools): terminate apply_patch no-ops safely

* fix(tools): validate no-op edits independently

* fix(tools): preserve no-op edit overlap checks

* fix(tools): preserve no-op patch file formatting

* fix(tools): preserve move no-op formatting

* fix(tools): narrow same-path move no-op typing

* fix(tools): distinguish edit no-op errors

* fix(tools): keep edit previews aligned with execution

* fix(tools): align no-op validation and formatting

* fix(tools): preserve empty patch and preview no-ops

* fix(tools): preview fuzzy edit no-ops cleanly

* fix(tools): isolate fuzzy-equivalent edit no-ops

---------

Co-authored-by: Vincent Koc <[email protected]>
QiuYuang pushed a commit to QiuYuang/openclaw that referenced this pull request Jul 1, 2026
…es (fixes openclaw#96983) (openclaw#97044)

* fix(tools): treat no-op writes and edits as terminal tool-loop failures

Fixes openclaw#96983

* fix(tools): treat no-op writes and edits as terminal tool-loop failures

Fixes openclaw#96983

* fix(tools): preserve valid sibling edits in mixed no-op batches

Fixes openclaw#96983

* fix(tools): terminate apply_patch no-ops safely

* fix(tools): validate no-op edits independently

* fix(tools): preserve no-op edit overlap checks

* fix(tools): preserve no-op patch file formatting

* fix(tools): preserve move no-op formatting

* fix(tools): narrow same-path move no-op typing

* fix(tools): distinguish edit no-op errors

* fix(tools): keep edit previews aligned with execution

* fix(tools): align no-op validation and formatting

* fix(tools): preserve empty patch and preview no-ops

* fix(tools): preview fuzzy edit no-ops cleanly

* fix(tools): isolate fuzzy-equivalent edit no-ops

---------

Co-authored-by: Vincent Koc <[email protected]>
wheakerd pushed a commit to wheakerd/clawdbot that referenced this pull request Jul 15, 2026
…es (fixes openclaw#96983) (openclaw#97044)

* fix(tools): treat no-op writes and edits as terminal tool-loop failures

Fixes openclaw#96983

* fix(tools): treat no-op writes and edits as terminal tool-loop failures

Fixes openclaw#96983

* fix(tools): preserve valid sibling edits in mixed no-op batches

Fixes openclaw#96983

* fix(tools): terminate apply_patch no-ops safely

* fix(tools): validate no-op edits independently

* fix(tools): preserve no-op edit overlap checks

* fix(tools): preserve no-op patch file formatting

* fix(tools): preserve move no-op formatting

* fix(tools): narrow same-path move no-op typing

* fix(tools): distinguish edit no-op errors

* fix(tools): keep edit previews aligned with execution

* fix(tools): align no-op validation and formatting

* fix(tools): preserve empty patch and preview no-ops

* fix(tools): preview fuzzy edit no-ops cleanly

* fix(tools): isolate fuzzy-equivalent edit no-ops

---------

Co-authored-by: Vincent Koc <[email protected]>
(cherry picked from commit ab966c2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P2 Normal backlog priority with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: L status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(tools): treat no-op edits and identical writes as terminal tool-loop failures

3 participants