quad/.claude/session/2026-08-09-12-luau-test-spikes.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

4.7 KiB

2026-08-09 열두 번째 세션 — .claude/luau-test/ 신설: M0 사전 검증

스파이크 작성, 결과는 아직 미확인

M0가 공식적으로 짜야 할 스파이크(위 "지금 할 일" 1번, ROADMAP.md M0 체크박스)와 지금까지 세션 로그 곳곳에 흩어져 있던 "실제 Luau로 부딪혀본 적 없는 것"/"M0/M2 스파이크 검증 목록에 추가됨" 표시들을 한 곳에 모아, 사용자가 직접 luau/luau-analyze/luau-lsp/Roblox Studio로 돌려볼 수 있는 독립 실행 스크립트 14개 + README.md 색인으로 만듦. 세 라운드에 걸쳐 진행됨:

  1. 1차 작성 — 레포 루트 luau-ignoreme/(당시엔 git 자동 제외 폴더로 시작)에 M0 체크리스트 5개 항목(Store/State 다이아몬드 전파, Source가 State를 구조적으로 만족하는 제네릭 타입, process/retract 재귀 디스패치, 배열/해시 두 패스 순회, props.Modifier or None nil-hole 관용구) + Dispatch 체인/retractUnder 다단 검증, Relate의 weak-table GC 실측, Modifier.Overridden 서브타입 타입체크, Roblox 전용 bindLifetime/canExecute/Attribute Instance 참조/CollectionService 태그 확인까지 10개 파일 작성(01~10).
  2. 2차 — 커밋 f198fd9("중간검토에서 발견된 설계 결함 다수 수정") 반영. 그 사이 사용자가 직접 .claude/base/ 전체를 훑으며 여러 결함을 정정(위 절 참고) — 그 중 02(Ref 콜백/대기자 배열의 소진 센티널이 Nonenil로 되돌아간 것, 실제로 None을 쓰면 배열이 무한정 자라는 버그였음이 드러남)이 luau-test 내용과 정면으로 어긋나 전면 재작성(순서가 중요한 배열은 계속 None, 순서 무관+슬롯 재사용 필요한 배열은 nil이라는 최종 구분 + 무한 성장 버그의 정량적 재현까지 포함). Modifier UB→error 전환(11 신규)도 이 라운드에 같이 반영. 나머지 파일은 대조 결과 영향 없음을 서브에이전트+직접 문서 대조로 확인.
  3. 3차 — 사용자 요청으로 "타입 관련 실측 필요, 특히 luau-lsp로 확인해야 할 것" 3개 추가(12~14). base 문서 자신이 "실측 필요"라고 명시적으로 못박아둔 지점(attribute-plan.md[Attribute<<T>> "name"] = value 제네릭 DI 키가 실제로 값 타입을 좁혀주는지, 12번)과 f198fd9에서 뒤집힌 결정(isRef/isPreRef가 이제 Source/State와 같은 포함 관계 — PreRefRef의 하위 개념이 됨, PreRef<T>Ref<T>를 구조적으로 만족하는지 타입체크까지 포함, 13번), 그리고 같은 세션에 새로 명시된 캐비엇(Source(default)/Ref(default)default 생략은 T가 nilable일 때만 안전하다는 것을 함수 오버로드로 타입 레벨에서 실제로 막을 수 있는지, 14번)을 찾아 작성.
  4. 폴더 이동 — luau-ignoreme/.claude/luau-test/. 사용자가 "커밋해서 레포에 남기자"고 판단 — *-ignoreme* gitignore 패턴을 벗어나 일반 추적 대상으로 전환, .claude/README.md에 새 폴더 행 추가. 내용/역할은 안 바뀜, 경로 참조 문구만 동기화.

아직 아무것도 실행 안 됨 — 에이전트도 로컬에 luau/luau-analyze가 없어서 직접 못 돌려봤고, 사용자가 다음에 luau/luau-analyze/ luau-lsp/Roblox Studio로 직접 돌려보고 결과를 알려주기로 함. 결과에 따라 할 일:

  • 전부 통과 → M0 실제 착수 시 이 스크립트들의 로직을 그대로 재사용하며 진행.
  • 하나라도 걸림(특히 12/14의 타입 narrowing 실패, 07의 GC 신호 이상, 10의 warn 발생, 13의 런타임 assert 실패) → 해당 base/ 문서를 그 자리에서 정정.
  • .claude/luau-test/README.md의 "결과 확인 후 할 일" 절에 파일별로 뭘 우선 확인해야 하는지 이미 적어둠 — 다음 세션은 그 응답을 대조하는 것부터 시작하면 됨.

다음 세션이 할 일: 사용자가 luau-test 실행 결과를 갖고 오면 그것부터 반영. 아직 없으면 ROADMAP.md M0 착수 우선순위는 그대로(위 "지금 할 일" 1번 참고) — 단, 이 폴더 결과를 먼저 확인하고 진행하는 게 순서.