Co-authored-by: qwreey <me@qwreey.moe> Claude-Session: https://claude.ai/code/session_01546hjsYNLSMZdHdPyTZaGb
73 lines
5.5 KiB
Markdown
73 lines
5.5 KiB
Markdown
# 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의 본문을 열어볼 것.
|