docs(audit): 7차 감사 3라운드 — HUMAN_TODO가 0-Y/0-Z를 안 짚던 것, "열린 질문 없음" 자기모순 2건

가장 중요한 발견은 HUMAN_TODO.md — 6라운드 감사가 한 번도 안 건드린 파일:

- 헤더가 "설계 질문은 question.md에 따로 있음, 그건 안 봐도 진행에 지장
  없고"라고 단언하고 3번 항목도 "막고 있는 항목은 없음"으로 끝남. 그런데
  0-Y/0-Z는 M0 착수를 실제로 막고 있고, 둘 다 **사용자가 직접 판단하겠다고
  명시 이관한** 항목 — 즉 정확히 이 문서가 담아야 할 성격인데 빠져 있었음.
  사람이 "지금 내가 뭘 해야 하나"를 이 문서로 판단하면 아무것도 안 해도
  되는 것처럼 읽힘. 4번 항목으로 신설(선택지/파급 범위 포함).
- 5번 신설 — Studio 전용 스파이크 `10`의 남은 A-1/A-2/B/C도 사람만 할 수
  있는 일인데 이 문서에 없었음(첫 실측으로 나머지가 다 닫히면서 이것만
  남은 건데 반영이 안 됨).

"열린 질문 없음" 계열 자기모순 2건(tag-plan.md는 이미 캐비엇을 달았는데
같은 처리가 안 된 곳):
- tween-plan.md "열린 질문 — 전부 해소됨" — `Animate`가 lazy 핸들 계약
  위에 서 있어 0-Y의 직접 영향 대상인데, 0-Y 포인터가 코드 주석 한 곳에만
  있고 정작 사람이 확인하러 오는 이 절엔 없었음
- bind-system-plan.md "남은 열린 질문 ... 남은 건 순수 API 표면 이름뿐" —
  이 문서 자신의 계약 둘(0-Y 콜백 계약, 0-Z 재디스패치)이 열려 있는데
  "이름만 남았다"로 읽힘

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y6hzeUi5QdLPEk69B6cXFa
This commit is contained in:
qwreey 2026-08-13 17:50:34 +09:00
parent 09b22d0e80
commit 316ed6adf9
Signed by: qwreey
GPG key ID: D28DB79297A214BD
3 changed files with 61 additions and 9 deletions

View file

@ -2940,10 +2940,18 @@ State<any> ... 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` 모듈은

View file

@ -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 북키핑 — 정리 안 해도 됨 (확정)

View file

@ -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)