From 871c582771ca106420d735ccde5670cbbfd845f8 Mon Sep 17 00:00:00 2001 From: qwreey-agent-selene Date: Wed, 19 Aug 2026 20:47:31 +0900 Subject: [PATCH] =?UTF-8?q?tooling:=20=ED=95=B8=EB=93=9C=EC=98=A4=EB=B2=84?= =?UTF-8?q?=20=EC=A4=80=EB=B9=84=20=E2=80=94=20session-summary.md=20?= =?UTF-8?q?=EC=83=89=EC=9D=B8=20=EA=B3=B5=EB=B0=B1=20+=20ROADMAP/CLAUDE.md?= =?UTF-8?q?=20stale=20=EC=A0=95=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit session-summary.md에 오늘 세션 04~08 색인 항목이 통째로 빠져 있던 걸 발견해 신설. 더 크게는 CLAUDE.md/project-context.md/ROADMAP.md가 "구현 아직 시작 전"이라는 낡은 전제를 깔고 있었는데, 실측해보니 M0 스파이크 4개와 M1 스캐폴딩 대부분이 이미 완료돼 있어 전부 정정(ROADMAP 체크박스 갱신 포함, wally.toml→pesde.toml 표기도 같이 정정). quad-roblox-types 백로그는 todos.md/ROADMAP.md M5에 짧은 포인터 보강. Co-authored-by: qwreey --- .claude/README.md | 2 +- .claude/project-context.md | 16 ++-- .claude/session-summary.md | 74 +++++++++++++++++ ...19-09-handover-prep-roadmap-status-sync.md | 78 ++++++++++++++++++ .claude/todos.md | 4 + CLAUDE.md | 7 +- ROADMAP.md | 82 +++++++++++++------ 7 files changed, 229 insertions(+), 34 deletions(-) create mode 100644 .claude/session/2026-08-19-09-handover-prep-roadmap-status-sync.md diff --git a/.claude/README.md b/.claude/README.md index c3b24ef..b2eec46 100644 --- a/.claude/README.md +++ b/.claude/README.md @@ -26,7 +26,7 @@ | `research/` | 아직 착수 전, 사용자와 스코프/설계를 더 상의해야 함 | | `qa-request/` | 원래 용도는 "구현 완료(코드/에이전트 검증까지 끝남) + 사용자 본인의 실기기(Roblox Studio) QA만 남음". **[2026-08-18 확장]** 구현 전에도 **사용자 심사 라운드의 산출물**을 여기 둠 — `pre-implementation-qa-round1.md`(1라운드: `base/` 확정 문서 전체를 문항으로 재확인받아 **"아니오"가 나온 항목만** 모은 결함 목록 + 신규 요구사항(`N-n`) + 부수 오탈자. **같은 날 전부 `base/`에 반영 완료**라 지금은 "무엇이 왜 틀렸었나"의 근거 기록이고, 지금 유효한 설계는 항상 `base/`가 소스. 아직 안 닫힌 것은 `question.md` 3번과 `.claude/todos.md` 00번이 소스), `pre-implementation-qa-round2.md`(2라운드: 확정 의사코드를 실제로 손으로 실행해보는 트레이싱 — **완료**, 발견된 크래시 `RC-1`(`recompute` 트리거 모델)도 같은 날 후속 세션에서 Blocker 게이팅 설계로 해결·반영까지 끝남, `archive/question-resolved.md`에 논의 요지 정리), `pre-implementation-qa-round3.md`(3라운드: `RC-1` 해법(Blocker 게이팅)이 실제로 `attachSlot`/`recompute`에 반영된 걸 손으로 트레이싱 — **완료**, `RC-3`/`RC-4`(`activateList`가 자기 Slot의 Blocker보다 먼저 실행되는 순서 문제)와 `bk.N` 수명주기 미정을 발견했다가 같은 세션에 사용자가 최초 분석 오류를 직접 정정하며 전부 해결·`base/` 반영까지 끝남, `archive/question-resolved.md`에 논의 요지 정리. `ROADMAP.md` M2가 M3의 `Blocker.luau`에 의존하게 된 마일스톤 순서 불일치는 각주로 반영, 마일스톤 재편 여부는 열려 있음). 다음 라운드가 필요해지면 라운드마다 파일을 새로 만들고 이름에 라운드 번호를 넣을 것 | | `archive/` | 완료 + 사용자가 실사용/실기기로 직접 검증까지 마침 (구현 대상). **[2026-08-06 확장]** 완전히 뒤집힌 설계 결정을 원문+역전 이유+diff와 함께 보존하는 용도로도 사용(제목 `[역전됨]` — 한 번 확정했다가 뒤집힌 것) — 더 이상 능동적으로 참고 안 해도 되지만(토큰 낭비 방지 위해 `base/`/`research/`에서 뺌) `quadnomicon` 소재로는 나중에 쓸 수 있음. **[2026-08-07 확장]** 후보였다가 채택 안 된 것(확정한 적 없이 검토 후 기각)도 같은 방식으로 보존, 제목은 구분을 위해 `[기각됨]` — `[역전됨]`과 의미가 다르므로 혼동하지 말 것. **[2026-08-07 세 번째 확장]** 설계 반전/기각과 별개로, 에이전트가 문서 작성 중 스스로 낸 개념 혼동을 정정한 이력은 `[에이전트 실수]` 태그로 `agent-mistake.md` 하나에 모음(`.claude/session-summary.md`/`session/` 로그와의 중복 방지) | -| `feedback/` | 실사용 피드백을 정리한 긴 로그 — **[2026-08-16 기준] 폴더 자체가 아직 없음**(구현 시작 전, 첫 피드백이 생길 때 만들면 됨). `qa-request/`는 **[2026-08-18] 더 이상 비어 있지 않음**(구현 전 QA 1라운드 산출물이 들어감) — 여긴 아직 폴더도 없음 | +| `feedback/` | 실사용 피드백을 정리한 긴 로그 — **[2026-08-19 기준] 폴더 자체가 아직 없음**(M0/M1 스캐폴딩만으론 안 생기고 실제로 렌더링해보고 쓰는 단계부터, 첫 피드백이 생길 때 만들면 됨). `qa-request/`는 **[2026-08-18] 더 이상 비어 있지 않음**(구현 전 QA 1라운드 산출물이 들어감) — 여긴 아직 폴더도 없음 | | `luau-test/` | **[2026-08-09 신설]** `base/` 확정 사항 중 "추론만으로 확정하고 실제 Luau로 부딪혀본 적 없는 것"(M0 스파이크 대상)을 `luau`/`luau-analyze`/`luau-lsp`/Roblox Studio로 사용자가 직접 돌려볼 독립 실행 스크립트 모음. **[2026-08-13 여섯 번째 세션, 첫 실측]** `luau`/`luau-analyze` 바이너리가 생겨 처음으로 실제 실행 — **런타임 12개 전원 통과**, 타입 쪽에서 `:Compute(fn)` lazy 핸들 계약이 Luau 추론과 충돌하는 게 드러남(당시 `question.md` 0-Y). **[2026-08-13 열세 번째 세션]** 그 0-Y가 해소되며 `review-required/`가 **비었음** — 계약은 유지 확정, 남은 건 Luau 자체 한계라 `base/typing-limits.md`가 담당. **`STATUS.md`가 상태의 소스**(pass / 사람 결정 필요 / 스파이크 깨짐 / 미실행 분류 — 사람이 먼저 볼 것만 위에), `luau-test/README.md`는 각 파일의 검증 의도·배경, 실행 결과 상세는 `audit/luau-test-first-run-2026-08-13.md` | | `audit/` | **[2026-08-13 신설]** `luau-test/` 등 스파이크를 실제로 돌려본 뒤 "무엇이 확인됐고 무엇이 아직 안 됐는지"를 기록하는 곳 — 스크립트/계획 자체가 아니라 **실측 결과**만 다룸. base/luau-test와 달리 부분 확인(일부만 통과)도 있는 그대로 기록, 완전히 해소되면 관련 `base/`/`luau-test/README.md` 캐비엇을 지우고 이 문서는 근거로 남김. **개수는 폴더가 소스**(여기서 세지 않음): `luau-test-first-run-2026-08-13.md`(첫 실측 라운드 전체 — 런타임 12개 통과, 구 `question.md` 0-Y의 1차 근거. **단 이 문서의 "콜백이 raw 값을 받으면 완전 클린" 판정은 아래 `type-recursion-issue/`가 뒤집었음**), `gcconn-trick-verification.md`(사용자가 Studio에서 직접 돌린 gcconn 트릭 부분 확인 — `10`의 A 섹션 앞부분만. **[2026-08-14 다섯 번째 세션, 열한 번째 세션에 `canBound` 재도입 반영해 재갱신]** 실측된 사실 자체는 그대로 유효하고 `value` 단독 1-인자 재정정으로 오히려 더 중요해졌음 — 이중 바인딩 게이트(`canBound`)/emit 게이팅(`canExecute`)/재바인딩 허용/`value` 쪽 복사 gcconn 판정/Instance userdata 동일성/B/C가 미확인), **`type-recursion-issue/`**(**[2026-08-13 열세 번째 세션 신설]** 0-Y 재실측 전체 — `REPORT.md` + `spikes/`(개수는 폴더가 소스). 다른 audit 기록과 달리 **스크립트를 같이 둠**: 이 건의 근거가 "여러 formulation을 서로 대조한 것"이라 개별 파일을 직접 돌려야 판정이 재현되기 때문. 결론은 `base/typing-limits.md`로 승격됨), `fallback-xpcall-verification.md`(**[2026-08-14 신설]** `base/fallback-plan.md`의 `Traceback` 메커니즘 전부 확인 — 클로저 업밸류 배선/중첩 스택 캡처/`err: any`/`error(msg)` 위치 접두 10개 검증 전부 통과. 스크립트 1개뿐이라 재현용으로 같이 둠: `fallback-xpcall-spike.luau`), **`type-recursive-issue-with-typeof/`**(**[2026-08-15 신설]** 사용자가 발견한 `typeof(named fn)` 간접참조가 0-Y(재귀 제네릭 반환 leak)를 실제로 우회하는지 실측 — `REPORT.md` + `spikes/`. 결론: 인라인 대신 이름 붙은 함수 + `typeof`로 선언하면 LHS 명시 없이도 다운스트림이 안전해짐(체이닝 50단·타입 변경·중첩 self 호출까지 확인), `typing-limits.md` §1 ③으로 승격. 부수적으로 `setmetatable` 확장 시도에서 quad와 무관한 Luau 0.733 솔버 버그(모순 진단 두 개 동시 발생) 발견, 채택 안 함. `luau-test/16`(type function으로 `Store` 레코드 필드 합성) 복구도 이 조사 중 완료 — API 버전 드리프트였을 뿐 설계 문제 아니었음, `typing-limits.md` §5 승격), **`type-recursive-issue-try-callback/`**(**[2026-08-15 신설]** 콜백 파라미터 무주석 추론을 뚫을 방법이 정말 없는지 type function/메타테이블/오버로드/제네릭 디폴트 등 전방위로 재시도 — `REPORT.md` + `spikes/`(개수는 폴더가 소스 — 최초 라운드 + `/code-review high`가 이중 꺾쇠 명시적 제네릭 인스턴스화를 안 시도했음을 지적해 추가된 후속 조사 라운드로 구성). 결론: quad의 `state:Compute(fn)` 단일 호출 모양을 유지한 채로는 여전히 안 됨. 발견 셋 — (1) 근본 원인이 재귀 자기참조가 아니라 "제네릭 콜백 인자 전반에 컨텍스트 타입 전파가 안 됨"이라는 게 더 정확함(재귀 없는 최소 사례로도 재현), (2) `T`를 명시 중간 변수로 먼저 고정하거나 재사용 가능한 monomorphize 헬퍼를 거치면 실제로 추론이 살아나지만 둘 다 단일 콜론 호출을 2단계 체인으로 바꿔야만 해서 §0 대전제로 채택 안 함, (3) 이중 꺾쇠 명시 인스턴스화(`Compute<>(fn)`)는 leaf 호출에선 sound하게 성립하지만(spurious 진단 원인도 규명 — read-only/read-write 가변성 불일치) 매 호출 T/U 전부 명시 필요 + 중첩 self 호출 여전히 실패라 순손해로 채택 안 함) | | `tools/` | **[2026-08-13 신설, `session/2026-08-13-09-structure-and-guardrails.md`]** 코퍼스 기계 점검 — `doc-check.py`가 깨진 파일/절 참조, README 색인 누락, 날짜 없는 시한부 주장("아직 안 돌려봄" 등), 미반영 ⚠️ 배너를 한 번에 훑음. **[2026-08-16]** 절 참조는 WARN이 아니라 **ERROR** — 판정 규칙은 `conventions.md`의 "절 인용 규약"이 소스. **중대 변경 후 커밋 전에 돌릴 것**(`python3 .claude/tools/doc-check.py`) — 수동 감사에서 나온 발견의 대부분이 이 종류였고, 실제로 문서를 쪼개다 잘못 옮긴 참조를 이게 잡아냄. ERROR는 고치고 WARN은 판단 대상 | diff --git a/.claude/project-context.md b/.claude/project-context.md index 43fe517..7bb08e8 100644 --- a/.claude/project-context.md +++ b/.claude/project-context.md @@ -10,10 +10,13 @@ Roblox 엔진에서 동작하는 DOMless UI 렌더러 **quad**를 처음부터 지속 가능성 — 빠른 이터레이션보다 정확성/설계 정합성이 우선. 작업 기간은 길게 잡음. -**[2026-08-16 기준] 지금은 설계/계획 단계이고 구현은 아직 시작 전**(M0에 -착수하면 루트 `CLAUDE.md` 머리말도 같이 고칠 것 — 같은 상태를 두 곳이 -서술하고 있음) — 저장소 루트에 실제 소스 -코드(`src/` 등)가 없음. 핵심 아키텍처(Store 책임 분리, `process`/`retract` +**[2026-08-19 기준] M0(스파이크 검증)/M1(스캐폴딩) 완료, M2(디스패치 +엔진)부터 착수 예정**(마일스톤이 넘어갈 때 루트 `CLAUDE.md` 머리말도 +같이 고칠 것 — 같은 상태를 두 곳이 서술하고 있음) — 저장소 루트에 +`quad-base/src/`(`New()`/`RunInit`/`AddPlugin`/`Relate`/`Debug`)/ +`quad-types/src/`/`type-version-check/src/`가 실제로 존재(`quad-roblox/src`는 +아직 빈 폴더 — M5에서 채워짐), 자세한 진행 상황은 루트 `ROADMAP.md`가 +소스. 핵심 아키텍처(Store 책임 분리, `process`/`retract` 디스패치 모델, Store/State/Source 온톨로지, 소스 트리 구조, Modifier 메커니즘, 컴포넌트=플레인 함수, 컴포넌트 경계 modifier/Ref 전달)는 전부 `.claude/base/`에 문서로 확정돼 있음 — 먼저 `.claude/base/architecture.md`를 읽을 것. 사용자가 @@ -73,8 +76,9 @@ modifier/Ref의 컴포넌트 경계 통과 방식) 논의도 2026-08-04 세션 담는 폴더였으나, **[2026-08-18]** 구현 전 사용자 심사 라운드의 산출물도 여기 둠(`pre-implementation-qa-round1.md`/`pre-implementation-qa-round2.md`/ `pre-implementation-qa-round3.md` 전부 **완료** — 라운드마다 새 - 파일, 상태의 소스는 각 파일 자신). `.claude/feedback/` — 구현 시작되면 쓰기 시작함, - **[2026-08-18 기준] 폴더 자체가 아직 없음**. + 파일, 상태의 소스는 각 파일 자신). `.claude/feedback/` — **실사용** + 피드백용(M0/M1 스캐폴딩이 아니라 실제로 렌더링해보고 쓰는 단계부터), + **[2026-08-19 기준] 폴더 자체가 아직 없음** — 첫 피드백이 생길 때 만들면 됨. `.claude/archive/`는 원래 같은 취급이었으나 2026-08-06 세 번째 세션부터 **완전히 뒤집힌 설계 결정을 원문+역전 이유+diff와 함께 보존하는 용도로도 사용 시작**(구현 완료 대상만이 diff --git a/.claude/session-summary.md b/.claude/session-summary.md index a7db24e..19b7b05 100644 --- a/.claude/session-summary.md +++ b/.claude/session-summary.md @@ -1535,3 +1535,77 @@ ERROR 0. 드러나 **순수 슈가로 재평가**(옛 "실제 기능 갭이라 우선순위 위" 서술 철회). `ROADMAP.md`/`question.md`/`todos.md`/`README.md`/ `source-state-plan.md`/`blocker-plan.md` 전량 반영. + +## 2026-08-19 — M0/M1 스캐폴딩 첫 시도, wally→pesde 전환, `@self` require 함정 + +원문: `session/2026-08-19-04-pesde-migration-and-project-setup.md` + +`ROADMAP.md` M0(스파이크 3종)/M1(스캐폴딩)을 revert 가능한 상태로 실제로 +짜보는 시도 — `quad-base/`/`quad-roblox/` 폴더, `Relate.luau` 전량 구현, +`Debug/init.luau` + 최상위 `init.luau`, mock+스모크 테스트까지 작성. 그 +과정에서 크로스파일 require가 전부 깨지는 진짜 버그를 찾았으나 원인 +진단은 처음에 틀렸음(CWD 기준설로 오판) — 사용자가 Luau RFC를 근거로 +`init.luau`는 `@self/X`가 필요한 특수 케이스라고 직접 정정. 이어서 사용자 +결정으로 패키지 매니저를 wally에서 pesde로 전환, tbox 참고 후 실제 설치해 +워크스페이스 전체를 검증. 산출물은 `base/project-setup-plan.md`(신설)와 +`architecture.md`의 "패키징 방식" 절 정정. + +**커밋 후 후속(같은 세션, §5)**: 사용자가 "전부 차근차근"이라고 답해 이어서 +4가지 진행 — Rojo를 직접 설치해 `rojo sourcemap`/`rojo build`가 워크스페이스 +symlink를 투명하게 따라감을 확인(Luau standalone CLI 전용 문제였음을 +재확인, Studio 실물 검증만 계정 분리 대기로 남음), 스파이크 `13`을 +타입 전용/런타임(`22` 신규) 두 파일로 분리해 `PreRef`/`PostRef` 배타성까지 +검증, `luau-lsp`를 직접 설치해 새 Luau 솔버 필요성을 재귀 제네릭 스파이크로 +재확인하고 `.vscode/settings.json`에 반영, 스파이크 `05`/`21` STATUS.md +텍스트 갱신. + +## 2026-08-19 — rokit→mise 전환, selene 린터 도입, darklua 검토 후 기각 + +원문: `session/2026-08-19-05-mise-migration-and-selene-linter.md` + +사용자가 참고 GitHub 레포 `Word30210/roblox-project-example`의 +`mise.toml`을 제시("요즘은 rokit보단 mise로 까는듯") → 클론해 구조 전체를 +훑고 mise 전환/selene 린터/darklua/Justfile 네 후보를 멀티셀렉트로 제시, +사용자는 mise 전환과 selene만 채택. darklua는 사용자가 직접 반박해 보류 +— "Roblox 엔진 자체가 이미 `@self`/`@game` string require를 지원하므로 +변환 계층이 불필요"라는 논거. mise 전환은 GitHub artifact attestation + +SLSA provenance 검증까지 거쳐 실제 설치·검증 완료. + +## 2026-08-19 — `RunInit` 재설계, darklua 경계 정밀화, 한국어 진행 합의 + +원문: `session/2026-08-19-06-runinit-redesign-and-darklua-precision.md` + +사용자 요청 두 가지: (1) darklua 기각 근거를 실측으로 정밀화 — 직접 +설치해 돌려보니 `@self`/`@game`은 안 건드리고 커스텀 `.luaurc` alias만 +변환한다는 정확한 경계 확인(지금은 불필요하지만 나중에 축약 alias를 쓰면 +필요해질 수 있음을 `project-setup-plan.md`에 반영). (2) `New()`의 멱등 +Init 가드를 파일마다 `Relate`+센티널을 두는 대신 **함수 자체를 릴레이션 +키로 쓰는 공유 `module:RunInit(initFn)`**로 재설계 — 실제 구현+3개 +시나리오 스모크 테스트까지 완료. 이후 대화를 한국어로 진행하기로 합의. + +## 2026-08-19 — `quad-types` 패키지 신설, `AddPlugin`/`CheckedQuad` 실측 설계 + +원문: `session/2026-08-19-07-quad-types-package-addplugin-checkversion.md` + +`RunInit` vs backend 유일 슬롯 가드를 `_initializedBy`로 분리 확정한 뒤, +사용자가 "quad-roblox가 quad-base를 런타임 주입으로만 받으면 +dev-dependency로도 타입이 못 산다"는 문제를 제기 — 실측으로 확인하고 +`quad-types`(구현 없는 타입 계약 전용 워크스페이스 패키지)를 신설, +`AddPlugin` 플러그인 체이닝과 `CheckedQuad` 컴파일 타임 +버전 체크를 설계·구현·검증까지 전부 마침. 과정에서 "값이 한 번이라도 +`type function`을 거치면 이후 제네릭 self 체이닝이 조용히 깨진다"는 새 +Luau 함정을 발견해 `typing-limits.md` §6으로 승격. + +## 2026-08-19 — `type-version-check` 패키지 추출, `CheckedQuad` 확장 + +원문: `session/2026-08-19-08-type-version-check-package-extraction.md` + +직전 세션의 `CheckedQuad`(정확 버전 일치만)가 `quad-spring`/ +`quad-spring-roblox`류 독립 게시 플러그인엔 너무 빡빡하다는 사용자 지적 +→ 글롭(`"*"`)/캐럿(`"N^"`) 패턴을 지원하는 `CheckedQuad`으로 +확장. 버전 매칭 로직 자체는 quad에 종속되지 않은 범용 워크스페이스 멤버 +`type-version-check`로 분리(사용자 지시: 지금은 모노레포 안에 두고 독립 +저장소 분리는 나중에 직접 — `HUMAN_TODO.md` 9번). 새 Luau 함정 2건 발견 +(`type function`은 outer local 참조 불가, cross-package엔 `export type +function` + 이중 꺾쇠 제네릭 인스턴스화 필요). 핸드오버 감사 2라운드로 +구 시그니처 잔존/개수 하드코딩 8건 발견·수정 후 커밋. diff --git a/.claude/session/2026-08-19-09-handover-prep-roadmap-status-sync.md b/.claude/session/2026-08-19-09-handover-prep-roadmap-status-sync.md new file mode 100644 index 0000000..ab9b2b1 --- /dev/null +++ b/.claude/session/2026-08-19-09-handover-prep-roadmap-status-sync.md @@ -0,0 +1,78 @@ +# 2026-08-19, 아홉 번째 세션 — 핸드오버 준비, `session-summary.md`/`ROADMAP.md` stale 대청소 + +**요약**: 사용자가 "quad-roblox-types도 base 문서에 짧게 언급해둘까, +핸드오버 준비해줘, 빠진 게 있으면 적절히 적어달라"고 요청. 확인해보니 +`quad-roblox-types`는 직전 세션에 이미 `quad-types-plan.md`에 반영돼 +있었으나, 감사 과정에서 훨씬 큰 두 가지 실제 공백을 발견 — (1) +`session-summary.md`에 오늘 세션 5개(04~08)의 색인 항목이 통째로 빠져 +있었고, (2) `CLAUDE.md`/`project-context.md`/`ROADMAP.md`가 "구현 아직 +시작 전"이라는 낡은 전제를 그대로 깔고 있었는데 실제로는 오늘 M0(스파이크 +4개)/M1(스캐폴딩) 전부가 이미 완료·커밋된 상태였음. 둘 다 발견 즉시 +반영, 감사 라운드로 재검증까지 마침. + +## 1. `quad-roblox-types` 확인 + +`base/quad-types-plan.md`의 "남은 것" 절에 이미 백로그로 적혀 있음을 +확인(직전 세션 산출물). 추가로 두 곳에 짧은 포인터만 보강 — +`todos.md` 4번 백로그(다른 미래 패키지 아이디어들과 나란히), `ROADMAP.md` +M5 섹션 상단(구현 관례 각주: quad-roblox 공개 타입은 지금부터 단일 파일에 +몰아둘 것). 개수/설명 자체는 `quad-types-plan.md`가 계속 유일한 소스. + +## 2. `session-summary.md` 색인 공백 발견·수정 + +`.claude/session/` 폴더엔 오늘 파일이 01~08까지 있는데 +`session-summary.md`엔 01~03만 있었음(04~08 다섯 개 누락). 각 세션 파일 +상단 "요약" 단락을 압축해 5개 항목 신설. 그 과정에서 session-04 항목이 +그 세션 §5(커밋 후 후속 — Rojo/symlink 검증, 스파이크 13→13/22 분리, +에디터 새 솔버 설정 확정)를 놓치고 있는 것도 감사가 잡아내 보강. + +## 3. `ROADMAP.md`/`CLAUDE.md`/`project-context.md` 대규모 stale 발견 + +감사 라운드가 지적: `CLAUDE.md`/`project-context.md`가 "[2026-08-16 +기준] 지금은 설계/계획 단계이고 구현은 아직 시작 전"이라고 서술 중인데, +오늘 커밋 로그(`205af32`~`5dfc9b9`, 총 10개)를 보면 M0 스파이크 4개 +전부와 M1 스캐폴딩 대부분이 이미 끝나 있었음 — `quad-base/src/init.luau`에 +동작하는 `New()`/`RunInit`/`AddPlugin`이 실존, smoke 테스트도 전부 PASS. + +`Explore` 서브에이전트로 각 M0/M1 체크박스를 하나하나 실측 대조(과대평가 +방지): +- **M0 4개 전부 통과** — `luau-test/done/05`(다이아몬드 전파, 현행 + 모델로 재작성됨)/`08`(Source⊇State 제네릭)/`03`(재귀 재-process + 디스패치)/`01`+`02`+`13`+`22`(props 두 패스+PreRef/PostRef)/`06` + (컴포넌트 경계 `or None` 관용구). +- **M1 5개 중 4개 확실히 완료, 1개는 항상 충족돼 있던 조건으로 판명** — + 폴더+`pesde.toml`(단 체크박스 텍스트가 `wally.toml`로 stale — pesde + 전환 반영해 정정), `default.project.json`/`.luaurc`, mock 테스트 + 하네스, `New()`/`RunInit`. `qa-request/`/`archive/` "실사용 시작" + 항목은 실제로 M1 이전부터 이미 계속 쓰이고 있어 조건이 항상 참이었음 + (모호했던 문구를 명시적으로 정리). + +**반영**: `ROADMAP.md` 상단 배너 갱신(M0/M1 완료, M2 착수 예정), M0/M1 +체크박스 전부 `[x]` + 근거 스파이크 파일명 추가, "통과 기준"의 하드코딩된 +개수("세 개 다") 제거(개수는 `luau-test/STATUS.md`가 소스), M5 섹션에 +`quad-roblox-types` 관례 각주. `CLAUDE.md`/`project-context.md` 머리말을 +"M0/M1 완료, M2 착수 예정"으로 갱신. `README.md`/`project-context.md`의 +`feedback/` 폴더 부재 설명도 "구현 시작 전이라서"에서 "M0/M1 스캐폴딩만 +으론 안 생기고 실사용 단계부터"로 정정(폴더가 없다는 결론 자체는 그대로, +근거만 정확하게). + +## 4. 감사 루프 + +핸드오버 체크리스트대로 라운드를 나눠 진행(전부 `quad-doc-auditor` 단독 +호출, 병렬 없음): +1. `type-version-check`/`CheckedQuad` 관련 변경 감사 3라운드 + (직전 턴에서 이미 완료 — 1라운드 5건, 2라운드 3건 발견·수정, 3라운드 + 무발견으로 수렴). +2. `session-summary.md`/`todos.md` 신규 변경 감사 1라운드 — 위 3번 항목의 + 대규모 stale(CLAUDE.md/project-context.md/ROADMAP.md)을 여기서 발견. +3. ROADMAP/CLAUDE.md/project-context.md 수정분 재감사 1라운드 — 무발견, + 여기서 종료. + +`python3 .claude/tools/doc-check.py`는 전 과정에서 ERROR 0 유지(기존 +WARN 8건은 이 세션과 무관한 사전 부채). + +## 다음에 확인할 것 + +없음 — M2(디스패치 엔진) 착수가 다음 마일스톤. M2 진입 전 필독 문서는 +`ROADMAP.md` 상단 배너와 `todos.md` 0번이 이미 안내하고 있음(`typing-limits.md`/ +`dispatch-core-plan.md`). diff --git a/.claude/todos.md b/.claude/todos.md index cdaf1a9..0b5084b 100644 --- a/.claude/todos.md +++ b/.claude/todos.md @@ -200,6 +200,10 @@ 참고 구현 `qwreey/spring.lua` 사용 가능성 확인 필요) — 둘 다 설계 논의 전 아이디어 단계이고 사용자가 직접 "아주 나중"으로 후순위 지정, M0/설계 게이트와 무관. + **[2026-08-19 추가]** `quad-roblox-types`(가칭, `quad-types`와 같은 + 패턴으로 `quad-roblox` 전체 대신 그 타입만 필요한 모듈을 위한 패키지)도 + 같은 성격의 백로그로 신설 — 사용자가 지금 만들 필요는 없다고 명시적으로 + 후순위 지정, 상세는 `base/quad-types-plan.md`의 "남은 것" 절. 5. 자율 작업 루프/스케줄 설정 여부는 사용자 결정 대기 중 (`HUMAN_TODO.md` 2번 항목). 6. **[신규 백로그, 2026-08-14 열네 번째 세션]** 문서 stale 감소용 include diff --git a/CLAUDE.md b/CLAUDE.md index 4778dbe..09dde0e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,9 +1,10 @@ # CLAUDE.md Roblox 엔진용 DOMless UI 렌더러 **quad**를 처음부터 다시 짜는 프로젝트. -**[2026-08-16 기준] 지금은 설계/계획 단계이고 구현은 아직 시작 전** — 같은 -상태를 `.claude/project-context.md`도 서술하니 M0에 착수하면 두 곳을 같이 -고칠 것. +**[2026-08-19 기준] M0(스파이크 검증)/M1(스캐폴딩)까지 완료, M2(디스패치 +엔진)부터 착수 예정** — 같은 상태를 `.claude/project-context.md`도 +서술하니 마일스톤이 넘어갈 때 두 곳을 같이 고칠 것. 진행 상황의 소스는 +항상 루트 `ROADMAP.md`.