quad/.claude/session/2026-08-10-02-dynamic-children-ub.md
qwreey 1f56c75978
chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries
CLAUDE.md had grown to 3196 lines of accumulated session logs, causing
context bloat. Full session narratives (including trial-and-error and
later-corrected reasoning — quadnomicon devlog raw material) now live
as 39 individual files under .claude/session/. CLAUDE.md keeps only a
short "지금 할 일" (re-synced against question.md/pre-implementation-audit.md,
stale detail dropped) and a compact per-session summary+link table.
No design decisions changed; base/research/question.md were already
in sync with every session (verified against README.md/question.md
before archiving), so no unreflected content needed migrating first.
2026-08-11 14:40:43 +09:00

2.2 KiB

2026-08-10 세션 — 동적 자식 추가/제거는 Slot/state<Frame>만 정당,

그 외는 UB로 명문화(문서 갭 보강)

사용자 질문에서 시작: Slot이 마운트한 객체 수를 Length/Offset 누적합으로 세는 방식(2026-08-09 여섯 번째 세션 확정)이 되면서, 이 카운팅을 안 거치고 quad가 관리하는 부모 Instance에 외부에서 직접 .Parent = inst로 자식을 끼워 넣는 게 UB로 문서화돼 있는지 확인 요청 — 검토 결과 문서 어디에도 명시돼 있지 않은 진짜 갭이었음(기존 UB 목록엔 Handler 순환/ 이중 바인딩/Dispatch.process 우회 직접 호출/setLength·setOffsetSource 생략 등은 있었지만 이 케이스는 빠져있었음, 인접했던 "수동 Visible 토글은 Length가 못 잡는 게 맞다"는 캐비엇은 이미 마운트된 element를 나중에 숨기는 별개 시나리오라 이것과 다름).

확정: 동적 자식 추가/제거의 유일한 정당 경로는 Slot 또는 state<Frame>류 store-bind 뿐 — 둘 다 그 위치의 Handler가 Dispatch.setLength/Dispatch.setOffsetSource를 정확히 호출하는 것으로 이미 보장돼 있음. 이 두 경로를 거치지 않고 quad가 마운트해둔 부모 Instance에 직접 .Parent = 대입으로 자식을 넣거나 빼면 lengthList/ sourceList가 그 변화를 전혀 몰라 Length 카운트와 형제 순서(offset) 계산이 조용히 어긋남 — 새 방어 로직 없이 UB로 문서화만 함(다른 UB 케이스들과 같은 톤). base/bind-system-plan.md("Length/Offset" 절 말미)/base/slot-plan.md("Slot.Length" 절 말미)에 반영 완료.

다음 세션이 할 일: 안 바뀜(ROADMAP.md M0부터, luau-test 결과 확인 우선) — 이번 세션은 순수 문서 갭 보강이라 우선순위엔 영향 없음.