quad/.claude/archive/modifier-apply-mutable-rejected.md
qwreey 4f3badf414
docs(base): 코퍼스 전체 정합성 감사 반영, 기각된 대안 archive 이관
병렬 서브에이전트 4개로 base/reference/research/archive 전체를 재감사해
발견한 14건 수정 — canExecute(inst,value) 시그니처 통일, Dispatch.process가
Dispatch 체인/retractUnder와 모순되던 서술 정정, "프로바이더"→Handler 잔재
정리, Overridden 오타, :Peek 반환 타입에 None 누락, Peek/isState 미정
표기 해소 누락, slot CRUD 의미론 갭 미표기, Relate 개명 반영 누락,
pre-implementation-audit.md 자기모순(이미 해소된 1-2 재언급, 옛 UI
숏핸드 이름), documentation-content-map.md 신구 이름 자기모순 및
TagService/CollectionService 재발, README.md archive 색인 누락 행,
agent-mistake.md 카테고리 태그 누락.

modifier-plan.md 9-1번 절에 인라인으로 남아있던 기각된 Apply-mutable
대안 두 개의 전체 경위를 archive/modifier-apply-mutable-rejected.md로
이관하고 본문은 결론+포인터로 압축 — quadnomicon 개발로그 소재 확보,
컨텍스트 비대화 방지.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-08 11:38:29 +09:00

46 lines
3.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# [기각됨] Modifier `Apply`/setter를 mutable로 바꾸는 방안 (전체·절충안 둘 다)
**상태**: 후보였다가 채택 안 됨(확정한 적 없이 검토 후 기각) — `base/
modifier-plan.md` 9-1번 절에서 이 판단의 결론(판단 기준 자체는 "동질적/
이질적"이 아니라 "계산 의존성 유무")만 남기고 아래 전체 경위는 이 문서로
옮김. `batch-rejected.md`/`context-rejected.md`와 같은 카테고리 —
`quadnomicon` 소재 후보.
## 배경
2026-08-07 다섯 번째 세션 후속. `Apply` 체이닝이 호출마다 clone을 만들기
때문에, 항목 수천 개짜리 리스트 UI처럼 무거운 Modifier를 대량으로
재생성하는 상황에서 이 clone 비용이 누적되는 게 아닌지 사용자가 우려 —
대안으로 (a) `Apply`/setter를 아예 mutable로 바꾸는 방안, (b) `Overridden`
"여러 값을 합칠 특수 상황"이 아니라 "성능 최적화 수단"으로 승격하는 방안을
검토했음(이 문서는 (a)와 그 절충안만 다룸 — (b)는 기각되지 않고 "계산
의존성 유무" 판단 기준으로 정리되어 `modifier-plan.md` 본문에 그대로 남음).
## (a) `Apply`를 mutable로 바꾸는 방안 — 기각
3번 절에서 immutable+clone을 확정한 이유가 정확히 "같은 modifier
레퍼런스를 공유하는 형제 서브트리가 mutate로 오염되는 것"을 막기
위해서였음 — 이건 특정 세션 판단이 아니라 2026-08-04부터 계속 지켜온
하드 제약. `Apply`/setter가 mutable이면 여러 컴포넌트가 참조하는 공유
테마 상수 하나에 어느 한쪽이 체이닝만 해도 다른 쪽까지 같이 바뀌는
클래스의 버그가 그대로 돌아옴 — clone 비용 절감이 이 안전성보다
우선순위가 높다고 볼 근거가 없어 기각. (단, `table.clone`은 Luau native
shallow-copy라 Modifier 필드 수(한 자리~여남은 개) 기준 개별 clone 비용
자체는 이미 3번 절에서 무시 가능하다고 판단됨 — 이번에 새로 문제 삼는 건
"한 번 비용의 크기"가 아니라 "체인 길이 × 인스턴스 수로 누적되는 clone
*횟수*"라는 별개 축.)
## (a-1) 절충안 — "`Apply` 진입 시 한 번만 clone하고 그 안에서는 mutable로" — 검토했으나 기각
clone 횟수를 체인 길이만큼이 아니라 `Apply` 호출당 1번으로 줄이자는
아이디어(`Apply` 경계에서만 복사, 내부 setter들은 그 복사본을 그대로
mutate).
**기각 이유**: 이렇게 해도 버그 클래스 자체가 안 없어짐 — `Apply`
거치지 않고 setter를 직접 호출하는 흔한 경로(`mod:FontSize(...)`처럼
체이닝 자체가 아니라 단발 호출)는 여전히 mutable이라, 공유 레퍼런스에
대고 단발 setter 하나만 불러도(예: 서브트리 어딘가에서 폰트 두께만 살짝
바꾸는 경우) 그대로 오염됨 — "`Apply` 안에서는 안전, 밖에서는 안 안전"처럼
**어디서 터지느냐만 달라질 뿐 문제 자체는 그대로 남는 비일관적인
절충**이라 실익이 없음. 전부 clone하는 지금 방식이 버그 클래스를 균일하게
없애는 유일한 방법 — 확정 유지.