quad/.claude/session
qwreey 8c784288b0
audit(dispatch,slot): c33ae04 전체 감사 — 실제 버그 4건 수정, Slot 언마운트 전환, 재디스패치 모델 재설계안
c33ae04(인덱스 기반 Dispatch 재설계) 전체를 직접 정독. 방향은 옳으나 새로 쓴
의사코드가 손 트레이싱을 안 거친 채 커밋됐음이 드러나 실제 버그 4건 발견·수정:

1. Dispatch.process가 chains:SetStrong을 h.process 뒤에 둬서 최초 마운트에서
   하위 위임 retractor가 통째로 유실(재귀가 자기 테이블을 만들었다 바깥이
   덮어씀 — Slot이면 서브트리 중복 마운트로 직결). SetStrong hoist + 재귀 중
   hole 방지용 no-op 점유 마커 추가.
2. Attribute 그룹이 process에서 retractFrom을 선행 호출해 인덱스 1이 무조건
   비워지는 바람에 점유 체크(=소유권 충돌 감지)가 전혀 작동 안 함. 철거를
   반환 클로저로 이동.
3. SlotHandler가 claim 실패에도 파괴적 클로저를 반환 — nested는 엄격
   claimOwner, top-level은 claimOwnerAt(inst,k)로 분리. rawRemove의
   releaseOwner 누락, destroySlotTree의 GC 타이밍 의존 오류도 수정.
4. Ref retractor가 spurious 재발행에서도 relate를 지워 dedup 무력화.

사용자 설계 결정:
- State<Slot> 교체 = 파괴가 아니라 언마운트(state<Frame>와 동일). 포탈이
  별도 기능이 아니라 이 결정의 귀결이 됨. 해제는 setOffsetSource(None) →
  setLength(0) 순서 고정(반대면 죽는 중인 서브트리 Source에 헛된 Set이
  날아감). dispose(value) 신설 — 트리가 아직 요구하면 파괴 거부하고 error.
- 재디스패치를 "하강 diff"로 재설계 — 래핑 핸들러의 retractFrom 선행 호출을
  폐기하고 Dispatch.process가 핸들러를 먼저 비교. 힌트가 None/래퍼로 오염돼
  깜빡임 방지가 조용히 꺼지는 결함이 계기. 아직 research/에만 있고 base
  미반영(Attribute 이름 소유권 하나가 남음) — base 4개 문서에 경고 배너.

전파 누락 정리: ROADMAP.md가 2026-08-08 이전 모델로 남아있던 것, base 내
"3종 vs 4종 계약" 모순 6개 문서, luau-test/04가 없어진 가드를 검증하던 것
(04는 인덱스 모델 + 버그 1 재현 음성 대조군으로 전면 재작성).

재발 방지: bind-system-plan.md "Handler 작성 체크리스트"(7항목),
relate-plan.md "언제 Relate를 쓰고 언제 쓰면 안 되는가" 신설.

다음 세션 최우선: question.md 0-Z(Attribute 이름 소유권) — 사용자가 직접
스케치하며 심층 분석 예정.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 16:01:49 +09:00
..
2026-08-04-01-roadmap-handoff.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-06-01-quad-debug-design.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-06-02-event-self-rbvm-corpus.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-06-03-docsite-source-state.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-06-04-pre-implementation-audit.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-07-01-with-new-node.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-07-02-modifier-apply.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-07-03-preref.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-07-04-corpus-reorg.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-07-05-override-peek-isstate.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-07-06-ref-preref-api.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-07-07-state-apply-effect-subscribe.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-07-08-none-sentinel-dispatch-brand.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-07-09-corpus-audit-createdref.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-07-10-none-vs-nil-order.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-08-01-relate-bindlifetime.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-08-02-dispatch-singleton-naming.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-08-03-tag-redesign-dispatch-chain.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-08-04-overridden-naming.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-08-05-terminology-round.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-09-01-canbound-modifier-error.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-09-02-corpus-audit-archive-move.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-09-03-slot-crud-list.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-09-06-length-offset-unbindlifetime.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-09-07-list-observer-lazy.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-09-08-midreview-defects.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-09-12-luau-test-spikes.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-10-01-slot-add-return-index.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-10-02-dynamic-children-ub.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-10-03-tween-redesign.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-10-04-onchange-key.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-11-01-compute-trailing-args.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-11-02-trailing-deps-positional.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-11-03-previous-before-pack.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-11-04-slot-list-layoutorder-index.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-11-05-slot-doc-framing.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-11-06-slot-single-nesting.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-11-07-reactive-raw-elements.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-11-08-claude-md-restructure.md chore(docs): split CLAUDE.md session log into .claude/session/, keep 2-4 line summaries 2026-08-11 14:40:43 +09:00
2026-08-11-09-attribute-group-primitive.md decide(attribute): group Attribute(...) primitive, AttributeKey rename, weak-cache identity 2026-08-11 18:22:54 +09:00
2026-08-12-01-tween-shape-finalized.md decide(tween): finalize option shape, override policy, relation-slot value 2026-08-12 11:02:13 +09:00
2026-08-12-02-animate-confirmed-and-or-audit.md decide(tween): finalize Animate combinator, fix and/or falsy-value bug 2026-08-12 11:14:08 +09:00
2026-08-12-03-cananimate-luau-syntax-note.md decide(tween): add Animate CanAnimate field, document Luau syntax facts 2026-08-12 11:17:49 +09:00
2026-08-12-04-compute-self-get-audit.md fix(docs): missing :Get() on :Compute callback args across base docs 2026-08-12 11:22:26 +09:00
2026-08-12-05-operator-sugar-plan.md decide(operator): add Operator sugar plan, unify combinators on :Apply 2026-08-12 11:54:09 +09:00
2026-08-12-06-tween-completed-bookkeeping-promoted.md decide(tween): confirm natural-completion bookkeeping is left as-is, promote to base/ 2026-08-12 12:19:49 +09:00
2026-08-12-07-preref-single-use-no-cancel.md decide(bind-system): PreRef is single-use, no cancel concept, reuse errors 2026-08-12 13:26:46 +09:00
2026-08-12-08-ref-retract-tagged-pattern.md decide(bind-system): Ref retract mirrors TagHandler, non-nilable T stays valid 2026-08-12 13:44:31 +09:00
2026-08-12-09-slot-retract-same-pattern.md decide(slot): store-bound Slot rebind uses Relate identity check, not retract 2026-08-12 13:49:58 +09:00
2026-08-12-10-attribute-name-ownership.md decide(attribute): per-name ownership via private rawNew keys, not a new registry 2026-08-12 15:23:24 +09:00
2026-08-12-11-retract-always-fires-correction.md decide(bind-system): retract fires on every re-dispatch, not just type changes 2026-08-12 16:13:25 +09:00
2026-08-12-12-slot-owner-relate-retractunder-args.md decide(slot): track slot->inst ownership directly instead of position diffing 2026-08-12 16:20:29 +09:00
2026-08-12-13-slot-gc-cycle-fix.md decide(slot): break the kSlotMap/slotOwner mutual strong-reference cycle 2026-08-12 16:37:40 +09:00
2026-08-12-14-luau-no-ephemeron-confirmed.md decide(relate): confirm and document that Luau has no ephemeron tables 2026-08-12 16:42:56 +09:00
2026-08-12-15-slot-in-slot-relate-scope-tag-splice-additions.md fix(slot): Splice가 vararg인 진짜 이유는 T가 opaque 제네릭이라서 2026-08-12 17:14:15 +09:00
2026-08-12-16-corpus-audit-attribute-retract-slot-owner.md fix(attribute,slot): retract 전면 재설계, 소유권 레지스트리 통합, 코퍼스 감사 2026-08-12 18:39:45 +09:00
2026-08-12-17-priority1-audit-resolved.md decide(dispatch,modifier,store): pre-implementation-audit 우선순위1 마지막 넷 해소, 누락 스파이크 보강 2026-08-12 20:24:04 +09:00
2026-08-12-18-framework-comparison-fixables-closed.md decide(state,operator,ref): use-after-destroy/동적With 의도적 비지원 확정, Operator 카탈로그 외부 리서치 반영, State 이름 최종 확정 2026-08-12 21:14:15 +09:00
2026-08-12-19-operator-sugar-external-research.md decide(state,operator,ref): use-after-destroy/동적With 의도적 비지원 확정, Operator 카탈로그 외부 리서치 반영, State 이름 최종 확정 2026-08-12 21:14:15 +09:00
2026-08-12-20-state-name-final-usedaftedestroy-scoped-out.md decide(state,operator,ref): use-after-destroy/동적With 의도적 비지원 확정, Operator 카탈로그 외부 리서치 반영, State 이름 최종 확정 2026-08-12 21:14:15 +09:00
2026-08-12-21-naming-clarity-pipe-compute-with-clone-contrast.md decide(state,operator,ref): use-after-destroy/동적With 의도적 비지원 확정, Operator 카탈로그 외부 리서치 반영, State 이름 최종 확정 2026-08-12 21:14:15 +09:00
2026-08-13-01-gcconn-audit-relate-cycle-spike-readme-sync.md audit(lifecycle): partial gcconn trick verification, close Relate cycle spike gap 2026-08-13 10:09:47 +09:00
2026-08-13-02-haskell-comparison-dispatch-reentrant-bug.md fix(dispatch): State<State<T>> 재진입 디스패치 체인 파손 버그 발견·수정, Operator Alternative 후보 신설 2026-08-13 10:49:34 +09:00
2026-08-13-03-v1-newindex-typo-scoped-out.md decide(v1-compat): objectListClass.__newIndex 오타 기능, v2 무관으로 스코프 아웃 2026-08-13 10:55:27 +09:00
2026-08-13-04-blind-spot-audit-checkpoint-handlers.md design(dispatch): 사각지대 손 트레이싱 라운드 + Dispatch 인덱스 기반 전면 재설계 2026-08-13 14:24:48 +09:00
2026-08-13-05-dispatch-index-based-redesign.md design(dispatch): 사각지대 손 트레이싱 라운드 + Dispatch 인덱스 기반 전면 재설계 2026-08-13 14:24:48 +09:00
2026-08-13-06-commit-audit-dispatch-redesign-bugs.md audit(dispatch,slot): c33ae04 전체 감사 — 실제 버그 4건 수정, Slot 언마운트 전환, 재디스패치 모델 재설계안 2026-08-13 16:01:49 +09:00