github / github/CopilotForXcode

`replace_string_in_file` reports success but doesn't persist changes

Đang mở
#628 11 bình luận 0 reaction 0 người được giao Xem trên GitHub
reviewed
Ngôn ngữ chính
Swift
Star
6.3k
Fork
2k
Merge trung bình
2 phút
Pull request đã merge (30 ngày)
2

Mô tả

## 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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.