No description
Find a file
qwreey a39ad034b4
qa: 손 트레이싱 7라운드 2차 패스 — 실측 6건 추가 (H-71~H-76, 회신 대기)
별도 라운드로 쪼개지 않고 7라운드 문서에 **2차 패스**로 이어붙였다
(6라운드가 패스를 이어 붙인 것과 같은 방식, 발견 번호도 패스를 가로질러
이어서 매김). 여전히 아무것도 반영하지 않았고 README 색인도 안 넣음
(결정 후 followup과 함께). doc-check ERROR 0.

## 이번 패스의 각도

1차는 문서 대 문서 손 트레이싱이었고, 2차는 **문서가 "확인했다"고 적어둔
런타임/타입 주장을 실제로 `luau`/`luau-analyze`에 걸어봤다** — 6건 중
5건이 추측이 아니라 실행 결과이고 재현 코드를 항목마다 넣었다. 부수로
드러난 패턴: **"검증 완료"로 인용되는 스파이크들이 정작 위험한 모양을
안 테스트했다**(`07`은 되참조 없는 payload만, `16`은 대입을 아예 안 함).

## 발견

- `H-71` 🔴 **단일 `Relate` 안의 자기참조(값→키)는 GC 안전하지 않다.**
  `relate-plan.md`의 "위험한 패턴" 절이 안전하다고 단언한 바로 그 모양이
  커밋된 `Relate.luau`로 50/50 누수(SetWeak은 0). 그 절은 "Luau엔
  ephemeron이 없다"를 근거로 두-`Relate` 순환을 금지하면서 단일 `Relate`
  자기참조엔 ephemeron 의미론을 가정한다. `RefLeafHandler`가 정확히 그
  모양이고(`SetStrong(inst,k,ref)` + `ref.Value = inst`), 정상 `Destroy`
  경로엔 그 기록을 지우는 코드가 없다.
- `H-72` 🟡 `GateNode`가 `state-epoch-plan.md` §4 규칙 1~3을 돌려면
  `emitEpochMap`을 갱신 없이 비교해야 하는데 `EpochMap` 표면
  (`Update`/`Refresh`/`Sync`/`TrackFrom`)에 그 연산이 없다.
- `H-73` 🟡 `store:GetDynamic<<T>>(name): Source<T>`는 콜론이든 탑레벨이든
  `T`를 바인딩할 수 없다 — Luau엔 호출부 명시 타입 인자가 없고 기대 타입
  추론도 안 돼 `T`가 `unknown`으로 떨어진다. 콜론 쪽은 합성 타입에 키
  자체가 없어 `Key 'GetDynamic' not found`. `question.md` 최우선 항목의
  실측 근거.
- `H-74` 🟡 eager `defaults` 경로가 `__index`를 통째로 우회해 예약 키
  방어가 성립 안 함 — `Store({GetDynamic = 3}):GetDynamic("x")`가
  `attempt to call a table value`. Modifier와 "정확히 같은 구조"가 아니다.
- `H-75` 🔴 `WrapStore`가 스파이크 `16`의 평평한 모양이면
  `store.key:Compute(무주석 콜백)`이 깨진다 — `typing-limits.md` ②쪼개기를
  `type function` 안에서도 해야 한다(그 모양이면 통과함까지 확인).
- `H-76` 🔴 `type function`은 바깥 타입 별칭을 참조 못 하므로 `Source<T>`
  전 표면을 손으로 중복 유지해야 하고, 메소드 self 파라미터가 불변이라
  `Revision` 하나만 빠뜨려도 `store.key`가 `State<T>` 파라미터 자리에 안
  들어간다. 스파이크 `16`은 그 대입을 한 번도 안 해봤다. 충실한 재현 +
  정합성 단언 한 줄이면 닫힌다(실측 확인).

## 부록 — 열려 있던 실측 항목 하나는 성립

스파이크 `15`의 (B)(이형 다중 deps를 제네릭 팩으로 좁혀 받기)를 같이
재봤고 **된다** — 확정된 `previous?`-앞-팩 순서 그대로, 음성 대조군도
정확히 잡힌다.

Co-authored-by: qwreey <me@qwreey.moe>
Claude-Session: https://claude.ai/code/session_012oLwATeQdq9TCFdENPutFG
2026-08-25 10:01:36 +09:00
.claude qa: 손 트레이싱 7라운드 2차 패스 — 실측 6건 추가 (H-71~H-76, 회신 대기) 2026-08-25 10:01:36 +09:00
.vscode tooling: 에디터 Luau 솔버 설정 확정 — luau-lsp 설치해 새 솔버 필요성 실측 2026-08-19 14:37:17 +09:00
quad-base design: type-version-check 패키지 추출 — CheckedQuad<T, Pattern> 글롭/캐럿 확장 2026-08-19 17:39:57 +09:00
quad-roblox design: type-version-check 패키지 추출 — CheckedQuad<T, Pattern> 글롭/캐럿 확장 2026-08-19 17:39:57 +09:00
quad-types design: type-version-check 패키지 추출 — CheckedQuad<T, Pattern> 글롭/캐럿 확장 2026-08-19 17:39:57 +09:00
type-version-check design: type-version-check 패키지 추출 — CheckedQuad<T, Pattern> 글롭/캐럿 확장 2026-08-19 17:39:57 +09:00
.gitignore tooling: Rojo 설치·검증 — pesde workspace symlink는 Studio 배포와 무관함 확인 2026-08-19 14:27:43 +09:00
.luaurc tooling: 프로젝트 셋업 문서화 + wally→pesde 전환, M1 스캐폴딩 골격 2026-08-19 14:01:07 +09:00
CLAUDE.md design: M2/M3 마일스톤 순서 교체 — 반응형 코어를 먼저, 디스패치를 그 위에 2026-08-25 00:29:15 +09:00
default.project.json tooling: 프로젝트 셋업 문서화 + wally→pesde 전환, M1 스캐폴딩 골격 2026-08-19 14:01:07 +09:00
HUMAN_TODO.md design: M2/M3 마일스톤 순서 교체 — 반응형 코어를 먼저, 디스패치를 그 위에 2026-08-25 00:29:15 +09:00
mise.toml tooling: rokit → mise 전환 + selene 린터 도입 (roblox-project-example 벤치마킹) 2026-08-19 15:09:35 +09:00
pesde.lock design: type-version-check 패키지 추출 — CheckedQuad<T, Pattern> 글롭/캐럿 확장 2026-08-19 17:39:57 +09:00
pesde.toml design: type-version-check 패키지 추출 — CheckedQuad<T, Pattern> 글롭/캐럿 확장 2026-08-19 17:39:57 +09:00
ROADMAP.md design: M2/M3 마일스톤 순서 교체 — 반응형 코어를 먼저, 디스패치를 그 위에 2026-08-25 00:29:15 +09:00
SAFETY.md docs: SAFETY.md에 git 원격별 push 정책 + code-docker/dind 안전성 점검 결과 반영 2026-08-18 10:46:51 +09:00