No description
2차 패스와 같은 방식으로 7라운드 문서에 **3차 패스**로 이어붙였다(발견 번호도 계속 이어서 매김). 여전히 아무것도 반영하지 않았고 README 색인도 안 넣음(결정 후 followup과 함께). doc-check ERROR 0. ## 이번 패스의 각도 2차는 문서가 주장하는 Luau 동작을 **새로 짠 최소 재현**으로 걸었다. 3차는 각도를 둘로 바꿨다 — (1) **저장소에 이미 있는 것을 그대로 돌린다** (`quad-base/test/smoke.*`, `luau-test/done/` 전량, `doc-check.py`, 커밋된 `quad-base/src/*.luau`의 `luau-analyze`). 즉 "설계가 맞나"가 아니라 "지금 이 저장소가 문서가 말하는 상태인가"를 본다. (2) 1차가 범위에서 명시적으로 뺐던 **M2 *소비자* 문서**(`modifier`/`attribute`/`tween`/ `onchange`/`quad-types`/`architecture`/`project-setup`/`module-lifecycle`) — M2를 만드는 문서가 아니라 M2가 만든 걸 쓰는 문서라, "소비자가 요구하는데 M2 설계엔 없는 것"이 여기서만 보인다. 검증 중 `pesde` 심볼릭 링크를 실제 디렉토리로 치환한 구간이 있으나 전부 원상복구했다(링크 20개, 전부 `.gitignore` 대상이라 저장소 파일 무변경). ## 발견 - `H-77` 🔴 **`Relate`의 *내부 키*가 `inst`를 되참조하면 `SetStrong`/ `SetWeak` 둘 다 샌다.** `H-71`은 *값*의 되참조였고 결론이 "`SetWeak`은 안전"이었는데, `WeakMap`이 `__mode = "v"`라 **키는 언제나 강함**이다 — 즉 `H-71`의 해법 (b)가 여기선 전혀 안 듣는다. `relate-plan.md`의 규칙은 위험을 전부 "값" 기준으로만 서술해 이 슬롯이 아예 없다. 커밋된 `Relate.luau`로 50/50, 그리고 **커밋된 `init.luau`의 `RunInit`이 실제로 물린다** — `initFn`이 module을 캡처하면 30/30이 안 죽고, 그 파일 주석 ("module이 GC되면 이 기록도 같이 사라짐")이 지금 거짓이다. - `H-78` 🔴 **커밋된 M1 스모크 2개와 `done/`의 타입 스파이크 `23`이 지금 저장소 상태에서 안 돈다.** 원인은 pesde 워크스페이스 심볼릭 링크(이 `luau` CLI가 require 경로의 심볼릭 링크를 디렉토리든 파일이든 해소 안 함 — 격리 확인). 더 나쁜 쪽은 타입으로, `luau-analyze`가 `Quad`/ `CheckVersion`을 아예 못 봐 스파이크 `23`의 음성 대조군이 한 건도 안 뜬다 = "진단 0건"으로 오독된다. 워크어라운드를 적용하면 전부 정상이라 설계가 아니라 **절차가 없는 것**이고, 그 치환은 `project-setup-plan.md`가 스스로 "정식화 안 함"이라 밝힌 상태다. `ROADMAP.md` M1의 "전부 PASS"는 날짜도 전제조건도 없다. - `H-79` 🟡 **`Store`에 열거 표면이 없는데** 그룹 `Attribute(...)`/ `:NameMap()`이 그걸 요구한다 — lazy `__index` 때문에 키 집합이 접근 이력에 좌우되고(실측 0개/1개/2개), `defaults` 없이 만든 Store에선 빈 맵이 된다. `:NameMap()`이 스냅샷이냐 라이브냐도 미정. - `H-80` 🟡 M2가 `quad-types`의 `Quad`에 추가할 목록이 `Source`/`State`/ `Store`뿐 — **`State`는 런타임 값이 아예 없고**(타입 재수출만 가능), M2가 실제로 얹는 나머지 탑레벨 값(`Effect`·`is*` 전량·`bindLifetime` 4종·`Relate`·`Blocker`)이 전부 빠져 `H-25`가 만든 그 벽에 똑같이 부딪힌다. 부수로 옛 표기 `state(state)`가 두 문서에 남아 있다. - `H-81` 🟡 `isModifier` 런타임 가드의 적용 지점이 **전부 M2 코드** (`Source:Set`/Store 생성/`:Compute` 캐싱)인데 체크박스는 M7에만 있고 M2 체크리스트엔 한 줄도 없다(그 사이 M4가 가드 없이 돈다). 게다가 적용 지점 목록이 두 문서에서 갈린다 — `source-state-plan.md`는 독립 `Source(someModifier)` 생성자도 포함하는데 `modifier-plan.md` 7번엔 그 자리가 없다. - `H-82` 🟢 `:With`를 실노드로 확정한 **근거 2번이 pass-through 노드엔 성립하지 않는다** — 계산 함수가 없으니 공유될 계산도 없다. 2026-08-14 재작성이 "근거가 더 강해졌다"면서 실제론 정확한 서술(순회 비용)에서 부정확한 서술(중복 계산)로 내려갔다. 결론은 안 바뀜(근거 1·3 유효). - `H-83` 🟢 확정된 Store 구현 스케치를 그대로 쓰면 무인자 `Store()`가 `table.clone(nil)`로 크래시한다 — 같은 절이 `defaults`는 선택이라고 확정해뒀다. - `H-84` 🟢 `:With(...)`/`state:Block(b)`/`Source:Emit()`이 M2 체크리스트에 개별 항목으로 없다 — `H-55`/`H-68`/"중간 State GC"의 결론이 각각 어디로 가야 하는지가 로드맵에 자리가 없다는 뜻. ## 부록 — 돌려봤는데 문제가 없던 것 다음 라운드가 같은 곳을 다시 파지 않도록 남겼다 — `bit32.bnot(-rev)` 실측 표 정확, `doc-check.py` ERROR 0, `done/` 런타임 스파이크 8개 전원 재통과, `STATUS.md` 개수 표가 실제 폴더와 일치, 워크어라운드 적용 시 커밋된 `quad-base/src/*.luau` 진단 0건, `Relate.luau` 구현이 `relate-plan.md`의 "실제 구조" 절과 일치(문제는 코드가 아니라 규칙 공백). Co-authored-by: qwreey <me@qwreey.moe> Claude-Session: https://claude.ai/code/session_012oLwATeQdq9TCFdENPutFG |
||
|---|---|---|
| .claude | ||
| .vscode | ||
| quad-base | ||
| quad-roblox | ||
| quad-types | ||
| type-version-check | ||
| .gitignore | ||
| .luaurc | ||
| CLAUDE.md | ||
| default.project.json | ||
| HUMAN_TODO.md | ||
| mise.toml | ||
| pesde.lock | ||
| pesde.toml | ||
| ROADMAP.md | ||
| SAFETY.md | ||