사용자 제기 — doc-check.py가 정규식으로 결정론적 판정을 하는데 표기가 흔들리면 문제가 커지니, 정규식을 늘리기보다 "예상 가능 범위"를 컨벤션으로 좁히는 게 싸지 않냐. 실측해보니 날짜 표기는 이미 100% 균일해서 고칠 게 없었고(강제 장치 없이), 드리프트는 절 인용 쪽이었다 — WARN 86건 중 78건(91%)이 절 참조 불일치. 핵심은 그 78건이 코퍼스가 지저분한 게 아니라 **검사기가 못 읽는 것**이었다는 점이다. 이 코퍼스는 `**볼드**` 줄을 하위 절로 쓰는데 headings()가 `#`만 봤다. ## 동작 변화 (문서 정정으로만 보이지만 게이트가 바뀐다) - 절 참조 불일치가 **WARN → ERROR**. 이제 절 인용 오류가 커밋을 막는다. - 절 인식이 `#` 헤딩 + `**볼드**` 절로 확장. 단 볼드는 **빈 줄 다음이나 리스트 항목 머리**만 인정 — 문단이 줄바꿈되며 우연히 줄머리에 걸린 강조를 절로 오인하던 걸 커밋 전 감사가 잡아 조였다. - 인용 길이 상한 60→160자. 60자를 넘으면 매칭 자체가 안 걸려 검사에서 **조용히** 빠져나갔음(위양성보다 나쁜 구멍). - 비교를 공백 무시로(줄바꿈 인용 대응), 선두 장식·상태/날짜 태그 정규화, `initreq/` 대상 인용은 절 검사 면제(읽기 전용 외부 원본). ## 규약 `conventions.md`에 "문서 표기 규약" 절 신설 — 절 인용 규약(의역 금지, 헤딩은 부분문자열/볼드는 앞부분일치, 태그로 닫히는 볼드 캐비엇, blockquote 함정), 세션은 산문 서수 말고 파일 ID로 지칭. 날짜 마커 라벨 어휘 닫기는 사용자 판단 으로 기각(기계 검사 대상이 아니라 읽는 쪽 판단 재료). ## 결과 절 참조 불일치 78 → 0. 36건은 검사기 수정으로 사라졌고(애초에 위양성), 42건은 인용을 실제 절 제목으로 손으로 고쳤다. 마지막 15건은 서브에이전트 3개에 병렬 위임해 추적 — **설계 서술이 유실된 건은 0건**, 대부분 코드 주석·본문 산문· 주제명처럼 애초에 절이 아닌 걸 절로 인용해온 것이었다. 부수로 드러나 같이 고친 것: onchange-plan이 9차 분할 때 일부러 안 옮긴 절을 잘못된 파일로 가리키던 것, brand-plan이 이미 이행된 정정을 "정정 대상"이라 부르던 것, ROADMAP의 blockquote가 인용 줄바꿈 때문에 깨져 있던 것, pre-implementation-audit의 해소된 항목이 "아직 안 고침" 절에 남아 있던 것 (사용자 결정으로 "이미 고침"으로 이동). 커밋 전 감사 4라운드(에이전트 8개)를 돌렸고, 발견 추이는 2→2→1→0이다. 매 라운드 발견이 "직전 라운드 수정이 만든 새 결함"이었던 게 특징 — 규약을 세우는 커밋이 그 규약의 첫 위반자가 된다는 걸 실측으로 확인했다. 상세는 .claude/session/2026-08-16-03-doc-check-section-convention.md. 부수: __pycache__를 .gitignore에 추가하고 추적 해제(32e9db0에 실수로 딸려 들어가 있었음). quad-doc-auditor에 작업 트리를 바꾸는 git 명령 금지 규약 추가 — 감사자가 git stash를 걸어 메인 세션 스테이지가 반복적으로 풀렸다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011zk7XHkSfiBfdPLZUQHdZf
11 KiB
HUMAN_TODO — 사용자(사람)만 할 수 있는 일
에이전트가 못 하거나(로컬 GUI 조작, 외부 계정/기기 필요) 사용자의 결정이 필요해서
멈춰둔 것만 여기 모음. 설계 질문은 대체로 .claude/question.md에 따로 있고 디폴트를
잡아둔 채 진행 중이라 급하지 않음 — 단 2026-08-13부터는 예외가 생겨 아래 4번에
올렸었음(0-Z) — [2026-08-13 열네 번째 세션] 그 0-Z도 해소되어 지금은
사람이 결정해야 M0가 열리는 항목이 없음(0-Y는 열세 번째 세션에 해소).
1. Roblox Studio에 MCP로 연결 (테스트 자동화용)
Roblox가 2026-02부터 Studio에 MCP 서버를 내장했음 — 예전처럼 Rust로 직접
studio-rust-mcp-server를 빌드할 필요 없이 Studio 자체 베타 기능으로 켜면 됨.
설정 방법 (사용자가 로컬에서 직접):
- Roblox Studio → File → Studio Settings → Beta Features → MCP Server 활성화
- 기본적으로
localhost:3004에서 리슨 시작함 - Claude Code의 MCP 클라이언트 설정(
.mcp.json등)에 이 로컬 서버를 추가 — 이 설정 파일 자체는 내가 대신 만들어줄 수 있으니, Studio에서 베타 기능만 켜고 "여기 프로젝트에 연결해줘"라고 말해주면 이어서 진행함. - 노출되는 툴:
create_object,set_property,set_script_source,execute_luau등 — Undo 히스토리를 존중해서 Ctrl+Z로 되돌릴 수 있음(안전망 있음).
주의(사용자가 이미 말한 것): Roblox Studio는 잘 죽는 편 — 죽었을 때 살리려고
위험한 명령을 반복 시도하지 않을 것이고, 그런 날엔 MCP 없이 할 수 있는 작업만
하거나 대기함. 이 안전 원칙은 .claude/conventions.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. question.md 0-Z 결정 [해소됨, 2026-08-13 열네 번째 세션]
question.md 0-Z 결정더 이상 사람이 막고 있는 결정이 아님. 사용자가 같은 세션에 직접
Attribute:GetKey(name) 방향을 제시했고, 트레이싱으로 검증한 뒤
그룹 전용 키(비공개 GetKey) + AttributeKeyHandler의 이름 claim으로
확정 → base/attribute-plan.md "이름 소유권" 절에 반영. 같이 묶여 있던
재디스패치 모델(0-A)도 같은 패스에서 base/dispatch-core-plan.md(신설)로
전면 반영됐고, ⚠️ 배너를 달고 있던 7개 문서 전부 갱신 완료.
같은 세션에 사용자가 추가로 결정한 것 — Tag/Attribute의 알고리즘을
통째로 quad-base로 옮기고 백엔드는 addTag/removeTag/setAttribute 세
op만 주입(웹의 className/data-* 대응 때문). 상세는
base/dispatch-core-plan.md "base가 소유하는 핸들러와 주입되는 엔진 op" 절.
[2026-08-13 열세 번째 세션] 여기 같이 있던
0-Y도 해소됨 — 44개 스파이크 재실측으로 원인이 콜백 계약이 아니라 Luau 자체의 한계임이 확정됐고, 대응은 "파생 State를 만드는 자리마다 결과 타입 명시 주석 바인딩" 관례 하나. 규약은.claude/base/typing-limits.md, 근거는.claude/audit/type-recursion-issue/. 거기서 파생된 작은 확인거리 하나(에디터의 Luau 솔버 설정)만 아래 6번에 남아 있음 — M0 착수 때 확인하면 되고 지금 막고 있진 않음.
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).
[2026-08-14 다섯 번째 세션] 지금 바로 돌릴 수 있는 상태가 아님 — 먼저
에이전트가 A 섹션을 재작성해야 함. bindLifetime/canExecute/
unbindLifetime 재정정으로 A가 폐기된 모델(canBound, bindLifetime의
.Subscribed 세팅, 2-인자 canExecute)을 검증 중이라 파일이
.claude/luau-test/rewrite-required/로 옮겨졌음. [2026-08-14 열한
번째 세션 재정정] 이중 바인딩 게이트는 canExecute 하나가 아니라
**canBound**로 별도 진입점 재도입됨(canExecute는 emit 게이팅 전용,
판정 로직은 비공개 헬퍼 하나를 공유 — base/lifecycle-pattern.md의
"canBound vs canExecute" 절). 남은 확인거리는 이중 바인딩
게이트(canBound)와 unbind/Destroy 후 재바인딩 허용, value 쪽에
복사된 gcconn만으로의 생존 판정, Instance userdata 동일성, 그리고
B(Attribute의 Instance 참조 타입)/C(CollectionService 태그 왕복) —
목록은 .claude/audit/gcconn-trick-verification.md의 "아직 확인 안
된 것"이 소스. GC 강제 트리거가 필요하면
.claude/luau-test/not-run/gc-trigger-helper.server.luau 참고. 위
1번(MCP 연결)이 되면 에이전트가 대신 돌릴 수도 있음.
8. [2026-08-16 신설, 안 막음] const 바인딩 — 툴링이 언제 지원하는지 사용자만 알 수 있음
base/architecture.md의 "코드 스타일" 절이 const 바인딩을 [2026-08-12
기준] 채택 안 함으로 두고 있음. 사유가 "주변 툴링 미성숙"인데, 이건
에이전트가 확인할 수 없는 정보라 사용자가 알려주는 게 맞다고 사용자
본인이 정리함(2026-08-16).
사용자가 설명한 구체적 사정: 예를 들어 pesde의 타입 추출 —
d.ts처럼 types를 emit하는 류의 툴링이 있는데, 아직 미성숙해서 const를
제공하지 못하는 상황. 언제 다시 사용 가능해지는지가 명확하지 않음.
사람이 할 일 — 둘 중 하나:
const를 쓸 수 있게 되는 시점을 파악해 알려주거나,- 사용 가능해지는 순간 에이전트에 알려줄 것.
둘 중 어느 쪽이든 에이전트는 스스로 판단하지 않고 대기한다 — 알려주기
전까지는 architecture.md의 "const 바인딩도 Luau 공식 문법" 절이 정한
"새로 짜는 코드는 일단 local로" 원칙을 그대로 따름. 알려주면 그때
architecture.md의 해당 절을 갱신하고 기존 코드의
const 전환 범위를 같이 상의할 것.
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절.
7. 워크트리 debounce-throttle-plan 정리 [2026-08-14 완료 — 할 일 없음]
debounce-throttle-plan 정리Debounce/Throttle 작업에 쓴 워크트리는 사용자 확인 후 정리 완료입니다
(git worktree remove + git branch -D worktree-debounce-throttle-plan,
당시 HEAD 5518055). 지금 git worktree list엔 메인 하나만 남아 있고
.claude/worktrees/도 비었습니다.
잃은 정보 없음 — 필요한 변경은 전부 main에 이식돼 있습니다
(623c931 백로그 신설 + emit 전파 정정, 6dbce6c 핸드오버 노트).
지우기 전에 (1) 두 커밋이 main 조상인지, (2) 워크트리에 미커밋 변경이
없는지, (3) git worktree list에 다른 에이전트 워크트리가 없는지를
확인했습니다. 이 항목은 기록용으로만 남겨둡니다.
3. .claude/question.md의 나머지 항목 검토 (급하지 않음)
디자인 결정 중 Lua/Roblox 엔진에 대한 깊은 경험이 필요한 것들은 합리적 기본값으로
진행하면서 .claude/question.md에 모아두는 중. 깨어있을 때 훑어보고 기본값이
마음에 안 드는 것만 답해주면 됨 — [2026-08-14 열한 번째 세션 기준]
question.md엔 이제 "결정 대기" 절 자체가 없음(비어서 헤딩째로 삭제 —
마지막 남았던 0-W
Ref 이중 배치도 이 세션에 해소 — base/ref-plan.md "이중 배치 방지"
절, archive/question-resolved.md로 이전됨).
Sources (MCP 리서치): Roblox/studio-rust-mcp-server, How to Connect Claude Code to Roblox Studio — Clauder Navi