quad/.claude/qa-request
qwreey 471f64f9ee
qa: 손 트레이싱 6라운드 — 최근 확정분 전수 추적, 발견 10건 (회신 대기)
사용자 요청으로 최근 확정된 5개 영역을 실제 값으로 손 트레이싱했다 —
`Effect(fn, ...deps)` / `Gate`·`Blocker` / State 전파(`rawInvalid`·emit 지연) /
Slot의 `native*`·offset·length·mount / `Brand`·`Epoch`·`EpochMap`.
4·5라운드가 "예/아니오 문항지"였던 것과 달리 2·3라운드와 같은 성격이라
파일명도 `handtrace`로 갈랐고, 발견 번호는 `H-n`.

**`base/`는 한 줄도 안 고쳤다** — 전부 발견 보고이고 사용자 회신 대기.

## 🔴 셋 (크래시하거나 조용히 어긋남)

- `H-1` `:List`의 `keyIndex`가 사이클 **도중**엔 stale인데 `rawMove`/
  `rawReplace`/`releaseElement`/`rawDetach`의 live `_elements` 인덱스로
  쓰인다. 앞에 하나 끼우면 순서가 조용히 뒤집히고, 리스트 비우기는 소멸
  루프의 해시 순회 순서에 따라 `_elements[i] == nil`로 터진다. 5라운드가
  "raw\*를 전부 index 기준으로 통일"한 근거였던 *"그 값은 이미 `keyIndex`가
  들고 있다"*가 여기서 깨지므로 **그 결정의 전제를 다시 봐야 한다** — 세
  갈래(라이브 인덱스 맵 / `indexOfRaw` 기본 경로화 / reconcile 2패스)를
  적어뒀고 이게 유일한 사용자 판단 항목
- `H-2` `pos`가 리프 개수와 `_elements` 배열 인덱스를 겸한다. `updateFn`이
  중첩 Slot(멀티루트 결과)을 반환하면 첫 사이클에 바로
  `table.insert` position out of bounds
- `H-3` `getOffsetAt`의 접두합 캐시를 **아무도 무효화하지 않는다**.
  `invalidAfter = min(...)` 규칙이 표로만 존재하고 `setLength`/
  `gatedRecompute`/`_baseObserver`/`spliceArrays*` 어느 의사코드에도 없다.
  형제 길이가 변해도 뒤 형제 offset이 고정되고(`Length`만 맞고 offset은
  틀리는 형태), 포탈 재마운트는 옛 베이스가 든 캐시를 그대로 물려받는다

## 🟡🟢 일곱

`bk.invalidAfter`/`offsetCache`가 부기 스펙에 없고 초기값 `nil`이면 비교에서
터짐 / `spliceArraysUp`이 `bk.N`을 먼저 올려 스스로 금지한 창을 열고 그 안에
`nativeInsert`가 들어 있음 / `unmountSlotTree`가 미정의 `physicalTarget` 참조
(+ 순차 extract의 offset 스큐) / `Effect`의 `Ref` 의존성은 해제 API도
`canExecute` 게이팅도 없어 죽은 leaf에서 계속 발화 + 누수 /
`EffectHandle._observer`가 아직 단수라 N-deps에서 2번째 이후 재실행이 죽음 /
게이트 `withheld`가 flush 스왑에서 weak를 잃음 / `recompute`의 `sum` 시작값
주석이 stale.

## 이상 없다고 확인한 것

Epoch/EpochMap 판정 규칙(§1 다이아몬드 실제 추적), 게이트 flush 스냅샷과
`:Sync(batch)` 예외, `Effect`의 EpochMap dedup + `_installing` 순서,
`materializeSlotTree`/`mountSlotTree` 분해(depth 2 부기·물리 양쪽),
단건과 배치의 순서가 반대인 것, `Brand` 다중 태깅 — 그 문서 마지막 절이
소스이고, 다시 트레이싱할 필요 없다.

인덱스 레이어는 `.claude/README.md`(qa-request 행)와 `.claude/todos.md`
00번 갱신. `doc-check.py` ERROR 0.

Claude-Session: https://claude.ai/code/session_01TiW21rnti9SbLgF6twtn6D

Co-authored-by: qwreey <me@qwreey.moe>
2026-08-22 04:08:11 +09:00
..
.gitkeep chore: add empty folders 2026-08-10 01:22:53 +09:00
pre-implementation-handtrace-round6.md qa: 손 트레이싱 6라운드 — 최근 확정분 전수 추적, 발견 10건 (회신 대기) 2026-08-22 04:08:11 +09:00
pre-implementation-qa-round1.md qa: New()/Quad() 다중 인스턴스화 이름 정정 — 이전 커밋의 오역 정정 2026-08-18 22:23:32 +09:00
pre-implementation-qa-round2.md qa: 구현 전 QA 2라운드 — recompute 손 트레이싱으로 RC-1 발견·해결 2026-08-18 22:11:59 +09:00
pre-implementation-qa-round3.md qa: 구현 전 QA 3라운드 — attachSlot/bk.N 트레이싱으로 RC-3/RC-4 발견·해결 2026-08-19 00:07:30 +09:00
pre-implementation-qa-round4-followup.md design: Epoch/EpochMap/Brand 전면 승격 + 해소 기록 flatten 2026-08-22 01:27:18 +09:00
pre-implementation-qa-round4-response.md qa: 구현 전 QA 4라운드 문항지 — base/ 전 문서 확정 주장 전수 문항화 2026-08-20 00:33:49 +09:00
pre-implementation-qa-round4.md qa: 반영 후 감사 6라운드 — 실제 크래시 3건 포함 18건 수정 2026-08-21 13:20:42 +09:00
pre-implementation-qa-round5-followup.md design: Epoch/EpochMap/Brand 전면 승격 + 해소 기록 flatten 2026-08-22 01:27:18 +09:00
pre-implementation-qa-round5-response.md qa: 구현 전 QA 5라운드 — 문항지·회신·전량 반영 + 감사 2라운드 2026-08-21 18:19:58 +09:00
pre-implementation-qa-round5.md design: Epoch/EpochMap/Brand 전면 승격 + 해소 기록 flatten 2026-08-22 01:27:18 +09:00