quad/.claude/session/2026-08-28-01-handtrace-round10-resolution.md

73 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 2026-08-28 — 10라운드 결정·반영 (대화형) + `Claim` 방향
**무엇을 했나**: 어제 밤 탐사자가 만든 10라운드 문항지(`-round10.md` §4, 7건)를
사용자가 *"하나하나 같이 보자"*라 해 대화형으로 처리하고 `base/`·`ROADMAP.md`에
반영했다. 결정의 소스는 `qa-request/pre-implementation-handtrace-round10-followup.md`
(사용자 발언 원문 전부 거기). 여기는 흐름과 문서에 안 들어간 것.
## 흐름
1. `H-147`부터. 사용자의 첫 제안("`canExecute`를 cleanup 아래에")에 생성자 함정을
짚었더니 *"rerun 이 're'-run 인데 초기 실행까지 담당"*이라는 더 정확한 지적 →
`rawRerun(force)` 분리. 그 다음 턴에 *"not force 로 확인하면 안 될 부분"*과
함께 **뿌리를 뒤집었다**: `fn`이 자기를 sub/unsub할 수 있다는 것 자체가 leaf
(unbind/bind 불가)와 비대칭이고, 어제 `H-143`부터 오늘까지의 결함 넷이 전부 그
허용의 파생물. (A) 금지 확정. 어제 사용자가 *"지원 안 할 이유가 딱히
없다"*고 한 것을 스스로 *"엄청난 모순이네"*로 뒤집은 자리.
2. `H-148`에서 사용자가 더 큰 공백을 짚음 — 루트가 Slot일 수 없다(`PlayerGui`
아래 `Slot { Shop{} }` 불가). 2026-08-14 기각(재바인드)과 다른 방향(claim-once·
own-all)임을 archive와 대조해 확인하고 `research/existing-mount-plan.md` 신설.
`H-146`의 "루트는 밖에서 `.Parent =`" 예외는 하루 만에 폐기.
3. `H-149`~`H-154`는 권고대로. `H-151`에서 사용자가 *"우린 애초에 Refresh 를 할
필요가 없는거야"* — 어제 `H-144`에서 세운 "`Refresh` 먼저" 하위 결정이 소멸.
`H-150`은 사용자가 "Observer 설치 발화는 일어나는 게 맞지 않나"를 확인한 뒤
(Effect 핸들의 `canExecute`라는 것을 갈라 답함) 확정.
4. 그 대화에서 `:Block` 슈가 잔존(`H-158`)이 드러남 — 미결로 남김.
## 시행착오 / 다음 세션이 알아야 할 것
- **어제 결정 셋이 하루 만에 뒤집혔다**(`H-143` 지원, `H-144` `Refresh` 먼저,
`H-146` 루트 예외). 셋 다 "권고 (a)를 사용자가 승인"한 것이었고, 문제는 갈래
자체가 **더 위의 질문**(소유권 / 캐치업이 필요한가 / 루트를 누가 소유하나)을
안 묻고 증상 층위에서 만들어졌다는 것. 다음 라운드 문항지는 "이 갈래들이
공유하는 전제가 뭔가"를 한 줄 적는 습관이 필요하다.
- 사용자가 결정 직전에 전제를 묻는 패턴(*"그게 진짜 날 수 있어?"*, *"canExecute 가
막는다가 말이 맞아?"*)이 두 번 다 유효한 정정으로 이어졌다 — 그때 "맞다"로
넘기지 말고 층을 갈라 답할 것.
## 후속 (같은 세션) — `/code-review` 3건과 `H-158`~`H-162`
반영 뒤 감사 6라운드 수렴 → `/code-review high` 10건 중 셋이 판단 필요라 커밋
`ae34cfa` 뒤 사용자와 이어서 처리:
- **`H-158`** `:Block` 폐기 확정(*"내가 이미 그렇게 정했었는데, 전파가 안 된
부분"*) + `__apply` 필드명(코퍼스는 "구현 시"로 열어뒀었다).
- **`H-160`** (a) + *"한번 죽는게 나오면 Effect 가 전부 죽는다"* 계약 상향.
- **`H-161`** `Claim` M5 스코프.
- **`H-159`** — 리뷰 권고((a) `Refresh` 복원)를 사용자가 **다른 모양**으로 뒤집음:
`_rerunRequired` 홀드. 대화 네 턴: (1) 홀드 제안 → 메인이 `fire` 분기 모양 제시
→ (2) 사용자: cleanup 중 변경도 홀드해야(포탈), `fire`는 그냥 `Rerun`, `force`
`_rerunRequired` → (3) 메인: `_installed``_rerunRequired`로 통합 제안 → (4)
사용자: `from == nil` 가드 의문(→ 출처 `Epoch`와 값 `nil`의 혼동을 갈라 답함),
*"force 는 딱 하나의 역할"*. 결정의 소스는 followup `H-159` 절.
- **`H-162`** `Void` export(사용자 발의).
교훈: **리뷰 권고 (a)가 "옛 메커니즘 복원"일 때는 사용자가 더 단순한 새 모양을
갖고 있을 가능성이 높다** — `Refresh`(두 번째 갱신 경로) 대신 홀드 플래그(갱신
경로는 하나, 실행만 미룸). 이번 세션에서 `_installed`가 사라진 것처럼 통합 기회도
같이 온다.
## 후속 2 (같은 세션) — `H-163`/`H-164` → `EmitReceive`·`_catchUp`
`H-158`~`H-162` 반영 뒤 `/code-review`가 낸 둘을 처리(커밋 `5e96cd6`, `ab952ee`):
- `H-163`: (a)로 답하면서 사용자가 **`_emitDown`의 계층 혼입**을 짚음 → `EmitReceive`
인터페이스(`sub:_receive(from)` 한 줄, 판정·홀드는 `Observer:_receive`). 감사가 (a)의
전제("재마운트 캐치업은 `activateList`가 한다")가 거짓임을 잡아 **(a)**(트리 확정 뒤
꼬리에서 묶고 홀드 시 reconcile 1회)로, 다시 감사가 첫 마운트 이중 bind를 잡아
`remountingList` 로컬로 재마운트만 — 그 뒤 `_catchUp` 도입으로 꼬리는 `bindLifetime`
한 줄로 줄었다.
- `H-164`: 메인 세션이 세운 문항 자체가 틀렸다("`from` 보관") — 사용자 지적으로 `nil` =
출처 없음(설치 또는 캐치업) 계약으로.
- 사용자 확인 하나: Observer `_rerunRequired`는 설치 발화가 내린다(*"설치 발화 이후엔
rerunRequired = false 되긴 해"*).
교훈: **같은 날 세 번 수정된 자리(`H-163`)**는 전부 "내가 코드 한 줄을 확인 안 하고
주석에 단정한 것"에서 왔다(재마운트 분기가 reconcile을 돈다 / 꼬리가 첫 마운트와
안 겹친다). 의사코드에 "X가 이미 한다"를 적을 땐 X의 본문을 열어볼 것.