Skip to content

undo 가 add/copy 덮어쓴 값을 유실하는 문제 수정 (#200)#201

Merged
developer-1px merged 1 commit into
mainfrom
fix/200-undo-overwrite-add-inverse
Jul 3, 2026
Merged

undo 가 add/copy 덮어쓴 값을 유실하는 문제 수정 (#200)#201
developer-1px merged 1 commit into
mainfrom
fix/200-undo-overwrite-add-inverse

Conversation

@developer-1px

Copy link
Copy Markdown
Owner

Closes #200

문제 (S0)

기존 object 멤버를 덮어쓰는 add/copy 의 inverse 가 replace(old value) 가 아니라 remove 로 계산되어, undo 시 이전 값이 조용히 유실됐다. { history: N } 로 undo 를 켠 정상 사용 경로에서 발생한다.

{ a:50, d:84 } → add /a=64 → { a:64, d:84 } → undo → { d:84 }   ❌ a:50 유실

수정

inverseOp 의 add/copy 케이스:

  • 대상 부모가 object 이고 최종 key 가 이미 존재 → replace(old value)
  • 배열 index 삽입(shift) 및 신규 key → 종전대로 remove
  • root path ""replace("", before)

computeRootObjectAddInverses 가 이미 쓰던 objectHasOwn 판정과 동일한 논리를 generic inverseOp 로 일반화했다.

검증

  • 회귀 테스트 tests/regression/issue-200-undo-overwrite-add-inverse.test.ts 5 케이스 (덮어쓰기 add/copy, 신규 key add, 배열 삽입, nested)
  • typecheck / layers:check / 전체 스위트(387 pass) 통과

🤖 Generated with Claude Code

기존 object 멤버를 덮어쓰는 add/copy 의 inverse 가 항상 remove 로
계산되어 undo 시 이전 값이 유실됐다. inverseOp 에서 대상 부모가
object 이고 최종 key 가 이미 존재하면 replace(old value), 배열 삽입과
신규 key 는 종전대로 remove 로 계산한다. root path 도 replace 로 복원.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@developer-1px developer-1px merged commit e90d816 into main Jul 3, 2026
3 checks passed
@developer-1px developer-1px deleted the fix/200-undo-overwrite-add-inverse branch July 3, 2026 07:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

undo가 기존 키를 덮어쓴 add/copy의 값을 복원하지 않고 삭제 (데이터 유실)

1 participant