quad/HUMAN_TODO.md
qwreey 93f548a2af
docs(type): 0-Y 해소 — 재귀 제네릭 반환은 Luau 상위 한계로 확정, typing-limits.md 신설
44개 스파이크로 question.md 0-Y를 재실측한 결과, 여섯 번째 세션의
"콜백이 raw 값을 받으면 완전 클린" 판정이 틀렸음이 드러남 — 그건 진단
0건만 확인한 것이었고, luau-analyze --annotate로 열어보니 반환 타입이
Unifiable<Error>로 조용히 새고 있었음(틀린 대입도 안 잡힘).

진짜 원인은 콜백 계약이 아니라 Compute가 State<U>(자기 이름을 다른 타입
인자로 감싼 타입)를 반환한다는 것 자체 — RFC relax-recursive-type-restriction이
Promise<T>.andThen으로 예시 든 바로 그 패턴. 사용자 확정: quad가 타입을
비틀 일이 아니라 상위 Luau의 현 한계이고, RFC/이슈 수혜를 받을 때 해결될
일이라 당장 할 수 있는 바 없음.

- base/typing-limits.md 신설 — 흩어져 있던 타입 한계 5건 통합, 대전제
  "Luau 한계를 우회하려 타입/API를 비틀지 않는다", 새 API 설계 체크리스트
- audit/type-recursion-issue/ 신설 — REPORT.md + spikes 44개(audit 폴더에
  스크립트를 같이 둔 첫 예외, 판정 재현에 개별 실행이 필요해서)
- 0-Y 해소 전파: question.md(최우선 2건→1건) / archive / base 5개 /
  research 2개 / 인덱스 4개 / luau-test(08을 done/으로, review-required 비움)
- audit/luau-test-first-run-2026-08-13.md: 판정이 뒤집힌 당사자라 배너뿐
  아니라 본문 표·문단·결론까지 전수 수정
- HUMAN_TODO 6번 신설: luau-lsp 기본이 옛 솔버라 CLI와 진단이 다름

교훈: luau-analyze 진단 0건은 타입 해소를 뜻하지 않음 — 타입 스파이크는
--annotate로 실제 추론 타입을 확인하고 음성 대조군을 같이 둘 것.

doc-check.py ERROR 0 유지(WARN 59건, 변경 전과 동일).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KckSawrsJSJmDBcSojJPxZ
2026-08-13 22:08:51 +09:00

8.1 KiB

HUMAN_TODO — 사용자(사람)만 할 수 있는 일

에이전트가 못 하거나(로컬 GUI 조작, 외부 계정/기기 필요) 사용자의 결정이 필요해서 멈춰둔 것만 여기 모음. 설계 질문은 대체로 .claude/question.md에 따로 있고 디폴트를 잡아둔 채 진행 중이라 급하지 않음 — 단 2026-08-13부터는 예외가 생겨 아래 4번에 올렸음(0-Z, M0 착수를 실제로 막고 있고 사용자가 직접 판단하겠다고 한 항목. 같이 올렸던 0-Y는 같은 날 열세 번째 세션에 해소됨).

1. Roblox Studio에 MCP로 연결 (테스트 자동화용)

Roblox가 2026-02부터 Studio에 MCP 서버를 내장했음 — 예전처럼 Rust로 직접 studio-rust-mcp-server를 빌드할 필요 없이 Studio 자체 베타 기능으로 켜면 됨.

설정 방법 (사용자가 로컬에서 직접):

  1. Roblox Studio → File → Studio Settings → Beta Features → MCP Server 활성화
  2. 기본적으로 localhost:3004에서 리슨 시작함
  3. Claude Code의 MCP 클라이언트 설정(.mcp.json 등)에 이 로컬 서버를 추가 — 이 설정 파일 자체는 내가 대신 만들어줄 수 있으니, Studio에서 베타 기능만 켜고 "여기 프로젝트에 연결해줘"라고 말해주면 이어서 진행함.
  4. 노출되는 툴: create_object, set_property, set_script_source, execute_luau 등 — Undo 히스토리를 존중해서 Ctrl+Z로 되돌릴 수 있음(안전망 있음).

주의(사용자가 이미 말한 것): Roblox Studio는 잘 죽는 편 — 죽었을 때 살리려고 위험한 명령을 반복 시도하지 않을 것이고, 그런 날엔 MCP 없이 할 수 있는 작업만 하거나 대기함. 이 안전 원칙은 CLAUDE.md에도 적어둠.

해야 할 일: 테스트용 place 파일(빈 place 하나, 또는 quad/test.project.json 기반 rojo 싱크 대상)을 열어서 베타 기능만 켜주면 됨. 이후 MCP 서버 설정 파일 작성/연결 확인은 내가 진행 가능.

SAFETY.md 제약: Studio는 메인 계정이 아닌 별도 계정으로만 사용하기로 되어 있음 — 계정 전환 여부를 알려주기 전까지는 MCP 연결을 진행하지 않고 대기함.

0. (SAFETY.md) Git 원격 저장소 계정 마련

SAFETY.md에 따라 이 레포는 GitHub 등 외부 호스팅에 올리지 않기로 되어 있음 — 모델(나)의 git 작업 공간은 사용자가 마련해줄 제한 계정 전용이어야 함(예: git.qwreey.moe에 제한된 계정 생성). 로컬 git 저장소는 이미 초기화 + 초기 커밋까지 해뒀음(원격 없음) — 원격을 추가하고 싶으면 그 계정 정보를 알려줄 것, 그 전까지는 로컬 커밋만 계속 쌓아둠.

2. 자율 작업 루프/스케줄 설정

사용자가 잠들어 있는 동안에도 계획된 TODO를 이어서 진행하길 원한다는 요청이 있었음 (req.md 참고). 이건 세션을 넘어 지속되는 자동 실행이라 다음 중 하나를 사용자가 직접 트리거해야 함(에이전트가 임의로 크론/무인 실행을 켜는 건 파급力이 커서 먼저 확인받는 게 맞다고 판단해 보류함):

  • /loop — 지금 세션 안에서 일정 주기로 스스로 다음 작업을 이어가게 함(사용자 대화 종료 전까지). 간단한 자율 반복엔 이걸로 충분.
  • /schedule — 진짜 cron 스케줄로 별도 클라우드 에이전트를 반복 실행(예: 매일 새벽에 큐에 있는 다음 plan 문서 하나씩 처리). 무인 상태로 더 오래/여러 날에 걸쳐 진행하고 싶다면 이쪽.

원하는 주기/범위를 알려주면 그에 맞춰 설정해줄 수 있음. 어떤 걸 골라도, 진행한 내용은 항상 .claude/에 자기 문서화(완료 표시, 다음 TODO 갱신)해서 다음 세션이나 사람이 바로 이어받을 수 있게 할 것.

4. [2026-08-13 신설, 막고 있음] question.md 0-Z 결정

이건 위 3번과 성격이 다름 — 실제로 M0 구현 착수를 막고 있고, 사용자가 "직접 스케치하며 판단하겠다"고 명시 이관한 항목이라 에이전트가 기본값으로 밀고 갈 수 없음.

  • 0-Z — Attribute 이름 소유권을 무엇으로 판정할 것인가. 재디스패치 모델을 "하강 diff"로 재설계하면서 유일하게 안 풀린 항목. 사용자 코멘트: "이전 결정(이름별 claimant Relate)을 다시 가져오는 게 맞아 보이나, 나중에 제가 물리적으로 스케치해보며 심층 분석해보겠습니다."

[2026-08-13 열세 번째 세션] 여기 같이 있던 0-Y는 해소됨 — 사람이 결정할 게 더 없음. 44개 스파이크 재실측으로 원인이 콜백 계약이 아니라 Luau 자체의 한계(재귀 제네릭이 다른 타입 인자로 자기를 반환하면 타입 안전성이 조용히 사라짐)임이 확정됐고, 사용자가 "quad가 타입을 비틀 일이 아니라 상위 Luau 한계이니 당장 할 수 있는 바 없다"로 정리. 계약은 그대로 유지, 대응은 "파생 State를 만드는 자리마다 결과 타입 명시 주석 바인딩" 관례 하나. 규약은 .claude/base/typing-limits.md, 근거는 .claude/audit/type-recursion-issue/.

다만 거기서 파생된 작은 확인거리 하나가 아래 6번으로 넘어감(에디터의 Luau 솔버 설정) — M0 착수 때 확인하면 되고 지금 막고 있진 않음.

막고 있는 범위: 0-Z가 정해져야 bind-system-plan.md/tag-plan.md/ slot-plan.md/attribute-plan.md/ref-plan.md/architecture.md/ ROADMAP.md 7개를 새 모델로 한 번에 옮길 수 있음 — 그 전에 M2/M4/M6/M10을 구현하면 곧 갈아엎어야 하는 코드를 짜게 됨. 상세/선택지는 .claude/question.md 최상단.

5. Studio 전용 스파이크 10 마저 돌리기 (사람만 가능)

.claude/luau-test/는 2026-08-13에 첫 실측이 돌아 런타임 12개 전원 통과했으나, 10-roblox-studio-checks.server.luauStudio 전용이라 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 연결)이 되면 에이전트가 대신 돌릴 수도 있음.

6. [2026-08-13 신설, 안 막음] 에디터의 Luau 솔버 설정 확인

luau-analyze CLI는 새 솔버가 기본값이지만 에디터가 쓰는 luau-lsp옛 솔버가 기본값(LuauSolverV2=false)이라 같은 코드에 다른 진단이 나옵니다 — 이번 세션에 실제로 겪은 혼선의 원인이었음 (CLI는 클린인데 에디터엔 빨간 줄).

옛 솔버는 quad의 Compute 시그니처 패턴 자체를 선언 시점에 거부하므로 사실상 새 솔버 외에 선택지가 없어 보이지만, 실제 사용하시는 에디터 환경에서 확인이 필요합니다. VSCode의 "Luau Language Server" 확장이라면 워크스페이스 .vscode/settings.json에:

{ "luau-lsp.fflags.enableNewSolver": true }

M0 착수 시점에 확인하면 되고 지금 막고 있진 않음. 배경은 .claude/base/typing-limits.md 8번, 실측은 .claude/audit/type-recursion-issue/REPORT.md 5절.

3. .claude/question.md나머지 항목 검토 (급하지 않음)

디자인 결정 중 Lua/Roblox 엔진에 대한 깊은 경험이 필요한 것들은 합리적 기본값으로 진행하면서 .claude/question.md에 모아두는 중. 깨어있을 때 훑어보고 기본값이 마음에 안 드는 것만 답해주면 됨 — 위 4번(0-Z)을 제외하면 막고 있는 항목은 없음(0-B dispose 시그니처는 M6 구현 세부만 막고 M0 착수는 안 막음).


Sources (MCP 리서치): Roblox/studio-rust-mcp-server, How to Connect Claude Code to Roblox Studio — Clauder Navi