github / github/CopilotForXcode

`replace_string_in_file` reports success but doesn't persist changes

Aperta
#628 11 commenti 0 reazioni 0 assegnatari Vedi su GitHub
reviewed
Lingua principale
Swift
Stelle
6.3k
Fork
2k
Merge medio
2m
PR unite (30g)
2

Descrizione

## Summary

The `replace_string_in_file` editing tool consistently reports successful edits but fails to write changes to disk, requiring escalation to `insert_edit_into_file`. This silent failure wastes significant time and breaks trust in the tool.

## Core Problem

**What happens:**
1. Tool reports: "✅ The following files were successfully edited"
2. File on disk remains unchanged (verified via `grep`, `sed`)
3. Compilation errors persist for missing code
4. No error message or warning given

**Scale:** 15-20 failed operations across multiple files in a single session

## Reproduction Steps

### Attempt 1: Basic Replace
```swift
// Trying to add property to struct
OLD: public var existingProperty: Type
NEW: public var existingProperty: Type
public var newProperty: NewType // ← Should be added
```
**Result:** Tool reports success, property not added

### Attempt 2: More Context
Added 5+ lines of surrounding context for uniqueness
**Result:** Same false success, no file modification

### Attempt 3: Smaller Edits
Broke into multiple atomic `replace_string_in_file` calls
**Result:** All reported success, none persisted

### Attempt 4: Different Tool (Workaround)
Switched to `insert_edit_into_file` with full code block
**Result:** ✅ **SUCCESS** - File actually modified

## Examples of Silent Failures

### Example 1: Adding Property
```swift
// Attempting to add to line 21:
public var radius: Double
public var newConfig: Config // ← Not added despite success report
public var model: ModelType
```
Verified via: `grep "newConfig" File.swift` (no results)

### Example 2: Renaming Class
```swift
OLD: public class OldName {
NEW: public class NewName {
```
Verified via: `grep "class NewName"` (empty - still OldName)

### Example 3: Updating Parameters
Changed type in 4 method signatures
All 4 reported success, none actually changed
Verified via: `grep "OldType"` (still 4 occurrences)

## File Context

**Common factors:**
- Xcode workspace (`.xcworkspace`)
- Swift files (`.swift`)
- Some had extended attributes (`@` flag)
- Files actively loaded in Xcode
- 100-30,000 lines
- Complex Swift (generics, protocols, async/await)

## Impact

- **Time lost:** 60-80 minutes debugging
- **Trust:** Tool reliability undermined
- **Workflow:** Required terminal verification for every edit
- **Escalation:** Eventually abandoned `replace_string_in_file` entirely

## Expected vs Actual Behavior

| Expected | Actual |
|----------|--------|
| File modified on disk | File unchanged |
| Compilation reflects changes | Compilation errors persist |
| Subsequent reads show new content | Old content remains |
| OR: Error reported if write fails | False success reported |

## Successful Workaround

```bash
# 1. Detect failure with terminal:
grep "expected_symbol" file.swift # (no output)
sed -n 'line,linep' file.swift # Shows old code

# 2. Use insert_edit_into_file instead:
# - Provide complete code block
# - Use // ...existing code... comments
# - Tool writes successfully

# 3. Verify after edit:
grep "expected_symbol" file.swift # Now found
```

## Potential Causes

1. **File caching** - Editor cache not flushed
2. **Xcode locks** - Files locked by IDE
3. **Extended attributes** - `@` flag preventing writes
4. **Path resolution** - Writing to wrong location
5. **Silent match failure** - Can't find string, reports success anyway

## Recommended Fixes

1. **Verify writes** - Read file back after write to confirm
2. **Report actual errors** - Show permission/lock failures
3. **Flush buffers** - Explicitly sync to disk before success
4. **Detect locks** - Check if Xcode has file locked
5. **Auto-fallback** - Suggest `insert_edit_into_file` on failure

## Evidence

```bash
# Tool says success:
✅ The following files were successfully edited: /path/to/File.swift

# Reality check:
$ grep "newProperty" File.swift
# (no output - property was NOT added)

$ sed -n '19,23p' File.swift
public var oldProperty: Type
public var anotherOld: Type
# (missing newProperty that should be between them)
```

## Reproducibility

- **Frequency:** 100% for affected files
- **Pattern:** Consistent across multiple file types/sizes
- **Workaround:** `insert_edit_into_file` always worked

## Key Observation

**The fact that `insert_edit_into_file` works reliably suggests this is a `replace_string_in_file`-specific issue**, not a general file writing problem.

---

**Priority:** High - Core functionality broken
**Request:** Investigate silent failures in Xcode workspace context with Swift files

Guida per i contributori

Apri la guida per i contributori

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.