ee49b7d25d
The turn-end file-mutation verifier only sees write_file/patch receipts. It asserted "N file(s) were NOT modified this turn" whenever a call had failed, which is wrong when the file was in fact changed afterwards through a path that leaves no receipt (terminal redirect, execute_code) or when the successful retry used another spelling of the same path (relative vs absolute, separator/case variants on Windows): the state dict was keyed on the model's raw `path` argument, so the pop never matched. - Header now says what the recorder knows: "N file edit(s) FAILED this turn", and asks the user to confirm what actually landed. - Failure entries carry the task-resolved, normcase'd on-disk identity plus a (mtime_ns, size) snapshot; a later success clears every entry with the same identity regardless of spelling. - At turn end `_file_mutations_still_failed` re-stats each target and drops entries whose file changed since the failed call, so a receipt-less mutation no longer produces a false footer. - `tool_executor` passes the effective task id so relative paths resolve the way the file tools resolved them. Kept the deliberate first-error-per-path semantics (the pinned test says why); did not add an "unverified" bucket for receipt-less non-error results, since the built-in tools always return a receipt on success and it would only add noise. Co-authored-by: KoNit. <124019182+KoNit-K@users.noreply.github.com>