diff --git a/.claude/base/bind-system-plan.md b/.claude/base/bind-system-plan.md index 162fcd6..58b628e 100644 --- a/.claude/base/bind-system-plan.md +++ b/.claude/base/bind-system-plan.md @@ -2940,10 +2940,18 @@ State ... end`처럼 런타임 검증 뒤 명시적 캐스팅을 붙이는 ## 남은 열린 질문 (`.claude/question.md`에도 취합) +> **⚠️ [2026-08-13 7차 감사 캐비엇] 아래 "전부 확정됨"은 2026-08-13 +> **이전** 기준.** 지금 이 문서의 계약 중 **둘이 실제로 열려 있음** — +> (1) `question.md` **0-Y**: `:Compute`/`Effect`/`Observer`의 콜백이 +> lazy `State` 핸들을 받는다는 커링 계약이 Luau 추론과 충돌(첫 실측에서 +> 발견), (2) `question.md` **0-Z**: 이 문서 최상단 ⚠️ 배너가 예고하는 +> `hintValue`/`retractFrom` 재-dispatch 모델 교체. 둘 다 "API 표면 이름"이 +> 아니라 **핵심 계약**이므로, 아래 목록만 보고 "이름만 남았다"고 읽지 말 것. + 이 문서의 핵심 설계 질문은 2026-08-04 세 라운드(전파 모델/`:Compute`/State 쓰기 금지/Slot 생존 확인 → dot-access 타입 추론/인스턴스·이벤트 네이밍/ -`RobloxFactory` 재호출 가드)를 거치며 전부 확정됨. 남은 건 순수 API 표면 -이름뿐: +`RobloxFactory` 재호출 가드)를 거치며 전부 확정됨. 그 라운드들 기준으로 +남았던 건 순수 API 표면 이름뿐이었음: - **`state()`/`Source()`/`Get()`/`DI`(또는 다른 이름) 등 정확한 함수·생성자· 모듈 이름** — 방향은 전부 확정, 이름만 구현 단계에서 남음(`On` 모듈은 diff --git a/.claude/base/tween-plan.md b/.claude/base/tween-plan.md index 43af00d..95b4f4f 100644 --- a/.claude/base/tween-plan.md +++ b/.claude/base/tween-plan.md @@ -456,11 +456,19 @@ Tween(opts: { 받으므로(다른 모든 핸들러와 동일) 이 문제 자체가 성립하지 않음. 절 자체는 과거 기록으로만 남김, 실행할 내용 없음. -## 열린 질문 — 전부 해소됨 +## 열린 질문 — Tween 자체 설계는 전부 해소됨 (단 0-Y는 예외) **2026-08-12 세션에서 옵션 값 모양/override 정책 이름/릴레이션 슬롯 저장 모양/`Animate` 콤비네이터 시그니처까지 전부 확정됨**, 마지막 남았던 아래 -질문도 같은 날 다섯 번째 후속 논의로 확정됨 — 이제 열린 설계 질문 없음. +질문도 같은 날 다섯 번째 후속 논의로 확정됨. + +> **⚠️ [2026-08-13 7차 감사 캐비엇] "열린 질문 없음"은 *Tween 고유의* +> 설계에 한정.** `Animate`는 `:Apply(factory)`로 꽂히는 콤비네이터이고 +> 그 `factory(self)`가 **lazy `State` 핸들을 받는다**는 계약 위에 서 +> 있는데, 그 계약 자체가 `question.md` **0-Y**로 열려 있음(위 `Animate` +> 절 코드 주석 참고). 0-Y가 "raw 값 전환"으로 결론나면 `Animate`의 +> 시그니처와 옵션 resolve 방식이 같이 바뀜 — Tween 값 모양/override +> 정책/북키핑은 그와 무관하게 그대로 유효. ### 자연 완료(Completed) 시 per-instance 북키핑 — 정리 안 해도 됨 (확정) diff --git a/HUMAN_TODO.md b/HUMAN_TODO.md index aa4e051..e9c43d7 100644 --- a/HUMAN_TODO.md +++ b/HUMAN_TODO.md @@ -1,9 +1,9 @@ # HUMAN_TODO — 사용자(사람)만 할 수 있는 일 에이전트가 못 하거나(로컬 GUI 조작, 외부 계정/기기 필요) 사용자의 결정이 필요해서 -멈춰둔 것만 여기 모음. 설계 질문(디폴트 이미 잡아두고 진행 중, 급하지 않음)은 -`.claude/question.md`에 따로 있음 — 그건 안 봐도 진행에 지장 없고, 이 문서는 실제로 -사람이 뭔가 눌러/타이핑해야 풀리는 것만 담음. +멈춰둔 것만 여기 모음. 설계 질문은 대체로 `.claude/question.md`에 따로 있고 디폴트를 +잡아둔 채 진행 중이라 급하지 않음 — **단 2026-08-13부터는 예외 둘이 생겨 아래 4번에 +올렸음**(0-Y/0-Z, M0 착수를 실제로 막고 있고 사용자가 직접 판단하겠다고 한 항목). ## 1. Roblox Studio에 MCP로 연결 (테스트 자동화용) @@ -55,11 +55,47 @@ git.qwreey.moe에 제한된 계정 생성). 로컬 git 저장소는 이미 초 내용은 항상 `.claude/`에 자기 문서화(완료 표시, 다음 TODO 갱신)해서 다음 세션이나 사람이 바로 이어받을 수 있게 할 것. -## 3. `.claude/question.md` 검토 (급하지 않음) +## 4. ⭐ **[2026-08-13 신설, 막고 있음] `question.md` 0-Y / 0-Z 두 결정** + +**이 둘은 위 3번과 성격이 다름 — 실제로 M0 구현 착수를 막고 있고, 사용자가 +"직접 스케치하며 판단하겠다"고 명시 이관한 항목**이라 에이전트가 기본값으로 +밀고 갈 수 없음. + +- **0-Y — `:Compute(fn)`의 lazy 핸들 계약을 유지할 것인가.** 첫 실측 + (`luau-analyze`)에서 가장 흔한 관용구 + `state:Compute(function(s) return s:Get() * 2 end)`가 **Luau 양방향 추론과 + 충돌해 타입 에러**를 내는 게 확인됨. 표기 조정으론 안 풀리고, 콜백이 raw + 값을 받으면 완전히 클린 — 즉 **계약 자체가 원인**. `Effect`/`Observer`/ + `Animate`/`Operator`가 전부 같은 계약 위에 있어서 파급이 큼. 사용자가 낸 + 방향은 "`State` 타입을 구울 때 인라이닝"(생성기가 `T`별 평탄 타입을 뽑는, + `Modifier` flat 타입과 같은 결) — 사람이 직접 확인할 부분이라 보류 중. +- **0-Z — Attribute 이름 소유권을 무엇으로 판정할 것인가.** 재디스패치 + 모델을 "하강 diff"로 재설계하면서 유일하게 안 풀린 항목. 사용자 코멘트: + "이전 결정(이름별 claimant `Relate`)을 다시 가져오는 게 맞아 보이나, 나중에 + 제가 물리적으로 스케치해보며 심층 분석해보겠습니다." + +**막고 있는 범위**: 0-Z가 정해져야 `bind-system-plan.md`/`tag-plan.md`/ +`slot-plan.md`/`attribute-plan.md`/`architecture.md`/`ROADMAP.md` 6개를 새 +모델로 한 번에 옮길 수 있음 — 그 전에 M2/M4/M6/M10을 구현하면 곧 갈아엎어야 +하는 코드를 짜게 됨. 상세/선택지는 `.claude/question.md` 최상단. + +## 5. Studio 전용 스파이크 `10` 마저 돌리기 (사람만 가능) + +`.claude/luau-test/`는 2026-08-13에 첫 실측이 돌아 **런타임 12개 전원 +통과**했으나, `10-roblox-studio-checks.server.luau`만 **Studio 전용이라 +`luau` CLI로 못 돌림**. A 섹션 앞부분(ClassName 신호 미발화, Destroy 시 +`Connected` 즉시 전환)은 사용자가 자작 스크립트로 이미 확인 +(`.claude/audit/gcconn-trick-verification.md`) — **남은 건 A-1/A-2(`canBound` +게이트)/B(Attribute의 Instance 참조 타입)/C(CollectionService 태그 왕복)**. +GC 강제 트리거가 필요하면 같은 폴더의 `gc-trigger-helper.server.luau` 참고. +위 1번(MCP 연결)이 되면 에이전트가 대신 돌릴 수도 있음. + +## 3. `.claude/question.md`의 **나머지** 항목 검토 (급하지 않음) 디자인 결정 중 Lua/Roblox 엔진에 대한 깊은 경험이 필요한 것들은 합리적 기본값으로 진행하면서 `.claude/question.md`에 모아두는 중. 깨어있을 때 훑어보고 기본값이 -마음에 안 드는 것만 답해주면 됨 — 막고 있는 항목은 없음. +마음에 안 드는 것만 답해주면 됨 — **위 4번(0-Y/0-Z)을 제외하면** 막고 있는 +항목은 없음(0-B `dispose` 시그니처는 M6 구현 세부만 막고 M0 착수는 안 막음). --- Sources (MCP 리서치): [Roblox/studio-rust-mcp-server](https://github.com/Roblox/studio-rust-mcp-server), [How to Connect Claude Code to Roblox Studio — Clauder Navi](https://www.clauder-navi.com/en/claude-roblox-studio)