d1b84a1a9f
Both defects come from live session fced377e, where scaffold_frontend burned 89 turns without converging. #419 — the stage output manifest never tracked deletions. A deletion is a FileWrittenEvent with a null postImageHash, and stageWrittenPaths filtered that per-event instead of per-path, so a written-then-deleted file stayed in the manifest forever. The contract gate stamps file_exists on every entry, which made deleting — and therefore renaming, which is delete plus write — a permanent contract violation. That deadlocked against the build gate: it ordered "rename it to use the '.cjs' file extension", the agent complied, and the contract gate then failed file_exists on the .js it had just been told to remove. Keep the last mutation per path instead. Fixed in the shared function, so the build-gate toolchain probe, the review gate, and verification all stop seeing deleted files too. Moved to its own file to keep the gates file under the detekt function cap. #417 — file_edit failed 4 of 6 live calls, all "Target not found" with a correct "did you mean" suggestion attached. flexibleMatch already tolerated indentation drift but walked target lines against file lines positionally, so one blank line the model dropped shifted every later index and missed the whole block. Compare only non-blank lines and map the hit back to real file lines. Ambiguity still fails rather than picking a match, and reindent keeps handling the writeback. Guard tests both ways, each mutation-verified against the old logic. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>