docs: round11 파일 개명 — m2-implementation-round11* + 명명 규약 확정, M2 종결

- pre-implementation-handtrace-round11(.md/-brief.md) → m2-implementation-round11*
  (사용자: 구현 중 문서라 pre-implementation이 안 맞음), 인용처 22곳 일괄 치환
- 명명 규약(사용자 확정, README qa-request/ 행): mN-implementation-roundNN —
  라운드 번호는 마일스톤을 가로질러 단순 증가("m3 진행 중 m2 하자로 돌아가는
  경우도 있을 것"), 마일스톤 접두가 소속을 담음. round1~10 옛 이름은 실제로
  구현 전 라운드라 유지
- CLAUDE.md/project-context.md 머리말: M0~M2 완료, 다음은 M3(디스패치 엔진);
  todos 00 종결 표기 — 다음 액션은 M3 착수 규약 문항(사용자와 정할 것)

Co-authored-by: qwreey <me@qwreey.moe>
Claude-Session: https://claude.ai/code/session_01LF78pXeFGD1ZSVD3ifteYG
This commit is contained in:
qwreey-agent-selene 2026-08-31 13:40:27 +09:00
parent e0cb530b6b
commit 89e078b387
No known key found for this signature in database
17 changed files with 56 additions and 38 deletions

File diff suppressed because one or more lines are too long

View file

@ -173,7 +173,7 @@ export type State<T> = StateData<T> & {
유니온 하나(`((State<T>) -> U) | { __apply: … -> U }`)로 두면 `Blocker`처럼 필드가
더 있는 객체가 제네릭 `U` 자리에서 너비 서브타이핑을 못 받아 `state:Apply(blocker)`
strict에서 막힌다(인덱서 `[string]: any`로 열어도 같다 — `luau-test/done/26-*`).
객체 쪽 반환이 `any`라 결과는 명시 주석(①과 같은 관례). `qa-request/pre-implementation-handtrace-round11.md` `H-179`.
객체 쪽 반환이 `any`라 결과는 명시 주석(①과 같은 관례). `qa-request/m2-implementation-round11.md` `H-179`.
- **캐비엇**: 콜백이 받는 `s``StateData<T>``Compute`/`With`가
없습니다. 콜백 안에서 다시 `s:Compute(...)`를 부르는 자리
(`:Apply`의 factory가 대표적)는 이 방식으로 못 풀고

View file

@ -379,7 +379,7 @@ haiku, 일반 작업은 sonnet. 특히 소스코드를 많이 읽어야 하는
GitHub 기여 그래프에 반영되게 하기 위함 — 관련 리모트 정책은 메모리
`git-remote-push-policy` 및 위 `SAFETY.md` 항목 참고.
- **⭐ [2026-08-28 신설] M2 자율 구현 규약 — 본문은
`qa-request/pre-implementation-handtrace-round11-brief.md`가 소스, 여기선
`qa-request/m2-implementation-round11-brief.md`가 소스, 여기선
가리키기만.** 사용자 결정(2026-08-28, *"수정하고 너가 진행하자"*)으로 M2는
자율 구간으로 돈다. 요지 셋: (1) 발견은 **세 갈래** — 문서가 이미 답을 가진
`H-nnn`으로 기록하고 `base/`+코드를 같은 커밋에서 자율로 고침 / 새

View file

@ -96,7 +96,7 @@ ROADMAP 항목 근거인지, 어떻게 실행하는지, 실행 후 뭘 확인해
| `21-type-store-undeclared-key-rejected.luau` (타입체크 전용) | **[2026-08-19 신규]** `Store<{field: T}>`로 선언 안 된 이름에 dot-access하면 `type function`이 합성한 결과 타입(`ProcessStoreType`, `16`과 동일)에 그 프로퍼티가 없어 타입 시간에 거부되는지 — `store-plan.md`가 "아마 그럴 것"으로만 적어뒀던 걸 M0에서 실측. 통과: 미선언 키 접근 2건이 정확히 `TypeError`로 걸림 | `store-plan.md` "Store = Source들의 이름 붙은 모음" 절의 "[확인 요구, 2026-08-18 구현 전 QA]" 항목, `todos.md` 00번 **⚠️ [2026-08-25 이동, `rewrite-required/`]** `16``ProcessStoreType`을 재사용하므로 같이 낡았다. **검증 대상(미선언 키는 타입 에러)은 그대로 유효**하고 새 모양에서도 성립함이 확인됐다(`store.nope` 거부) — 새 `Store<T>` 선언으로 바꿔 쓰기만 하면 된다 |
| `22-runtime-ref-preref-postref-brand.luau` | **[2026-08-19 신규]** 구 `13`의 런타임(B) 절반을 분리한 것 — `isPreRef`/`isPostRef`가 같은 층위의 배타적 형제(둘 다 `isRef``true`, 서로에겐 `false`)인지, Leaf 핸들러 흉내(`isRef(v) and not isPreRef(v) and not isPostRef(v)`)가 Ref/PreRef/PostRef 셋을 정확히 갈라내는지. **[2026-08-21] `rewrite-required/`로 이동** — 파일이 직접 구현해 쓰는 `Brand.set`/`Brand.get`이 인스턴스 브랜드 재작성으로 역전된 옛 API가 됐다(검증 대상 자체는 그대로 유효, 상태와 재작성 지침은 `STATUS.md`가 소스) | `ref-plan.md`의 "`PostRef`" 절, `brand-plan.md`의 "⭐ 구현 — 인스턴스 브랜드" 절 |
| `23-type-quadtypes-checkversion-addplugin.luau` (타입체크 전용) | **[2026-08-19 신규, 같은 날 후속으로 재작성]** 실제 `quad-types`/`quad-base`/`type-version-check`를 `require`해서 `CheckedQuad<T, Pattern>`(글롭/캐럿 버전 패턴 체크, `type-version-check` 위에 얹힘)이 `AddPlugin<Self,P>` 체이닝과 맞물려 동작하는지 — 양성(버전 일치 + 2단 체이닝 + 이전 확장 필드 보존), 음성(버전 불일치 → 강제 참조 시점에 정확히 `TypeError`). `type function`을 거친 값은 패스스루라도 이후 제네릭 self 체이닝이 깨진다는 걸 이 스파이크가 재작성 과정에서 직접 발견. 재작성 과정에서 `export type function`(cross-package 필수)과 2개 이상 명시 제네릭 인스턴스화의 이중 꺾쇠(`Foo<<A,B>>`) 요구도 추가로 실측 확인 | `quad-types-plan.md`, `typing-limits.md` §6 |
| `26-type-apply-object-factory-overload.luau` (타입체크 전용) | `state:Apply(factory)`의 파라미터 타입 — 함수 팩토리와 `__apply` 객체 팩토리를 한 시그니처로 받을 때 유니온/오버로드/인덱서 중 어느 표기가 strict에서 `state:Apply(blocker)`(필드가 더 있는 객체)를 통과시키는지 | `qa-request/pre-implementation-handtrace-round11.md` `H-179`(M2 단위 4 실측) |
| `26-type-apply-object-factory-overload.luau` (타입체크 전용) | `state:Apply(factory)`의 파라미터 타입 — 함수 팩토리와 `__apply` 객체 팩토리를 한 시그니처로 받을 때 유니온/오버로드/인덱서 중 어느 표기가 strict에서 `state:Apply(blocker)`(필드가 더 있는 객체)를 통과시키는지 | `qa-request/m2-implementation-round11.md` `H-179`(M2 단위 4 실측) |
## 공통 유틸리티

View file

@ -181,9 +181,9 @@
| 파일 | 확인된 것 |
|---|---|
| `26-type-apply-object-factory-overload.luau` (타입체크 전용) | ✅ **[2026-08-29 M2 단위 4]** `state:Apply(factory)`의 파라미터 타입은 **교집합 오버로드**(함수 팩토리 제네릭 `U` / `__apply` 객체 `any` 반환) — 유니온 하나는 필드가 더 있는 객체(`Blocker`)를 못 받는다. 기대 진단 2건(음성 대조군)만 — 근거: `qa-request/pre-implementation-handtrace-round11.md` `H-179`, `quad-types/src/init.luau` `State<T>.Apply` |
| `26-type-apply-object-factory-overload.luau` (타입체크 전용) | ✅ **[2026-08-29 M2 단위 4]** `state:Apply(factory)`의 파라미터 타입은 **교집합 오버로드**(함수 팩토리 제네릭 `U` / `__apply` 객체 `any` 반환) — 유니온 하나는 필드가 더 있는 객체(`Blocker`)를 못 받는다. 기대 진단 2건(음성 대조군)만 — 근거: `qa-request/m2-implementation-round11.md` `H-179`, `quad-types/src/init.luau` `State<T>.Apply` |
| `05-store-state-diamond-propagation.luau` | **[2026-08-29 폐기 → `done/`로 이동, 재작성 안 함]** M2 단위 2·3의 `quad-base/test/spec.state.luau` 3번(다이아몬드에서 두 번째 도착이 규칙 3으로 접힘, 조인 1회 계산)·`spec.effect.luau` 3번(Effect도 1회)이 실제 구현에서 같은 것을 고정한다 — 이 스파이크가 물으려던 "변경당 1회"의 답. 아래는 폐기 전 상태: 2026-08-19 재작성분은 그 시점 모델 기준 ✅ 통과였음 — 근거: **[2026-08-21] 모델이 또 바뀌었다** — 소스 에포크 비교 채택(`base/state-epoch-plan.md`)으로 다이아몬드에서 **두 번째 통지가 접힌다**. 그래서 이 스파이크의 핵심 assert("`:Get()`을 안 부르는 Observer가 변경당 경로 수(2)만큼 운다")가 **정반대**가 됐다 — 이제 **변경당 1회**여야 한다. **살릴 것**: `invalid` 기반 dedup이면 두 번째 변경부터 침묵하는 것을 잡는 음성 대조군(그 금지는 지금도 유효). **새로 넣을 것**: DFS 도중 `Get()`이 섞인 값을 캐시하던 glitch가 에포크로 사라지는지(그 문서 §1의 시나리오) |
| `15-type-compute-trailing-deps-typepack.luau` | **[2026-08-28 폐기 → `done/`로 이동, 재작성 안 함]** M2 단위 2가 실제 `quad-types` 선언에서 타입팩 형태를 실측해 기각했다(`qa-request/pre-implementation-handtrace-round11.md` `H-176`: strict에서 콜백 dep 추론이 깨져 정상 호출까지 막힘 → deps 자리 `...any`). 이 스파이크가 물으려던 (B)의 답이 나왔으므로 파일은 역사로만 `done/`에 남긴다. 아래는 폐기 전 상태: **파싱 실패**(SyntaxError) — 근거: 음성 대조군의 타입 표기가 `TypeError`가 아니라 `SyntaxError`로 걸려 **파일 전체가 아무것도 검증 못 함** — 대조군을 별도 파일/블록으로 격리 |
| `15-type-compute-trailing-deps-typepack.luau` | **[2026-08-28 폐기 → `done/`로 이동, 재작성 안 함]** M2 단위 2가 실제 `quad-types` 선언에서 타입팩 형태를 실측해 기각했다(`qa-request/m2-implementation-round11.md` `H-176`: strict에서 콜백 dep 추론이 깨져 정상 호출까지 막힘 → deps 자리 `...any`). 이 스파이크가 물으려던 (B)의 답이 나왔으므로 파일은 역사로만 `done/`에 남긴다. 아래는 폐기 전 상태: **파싱 실패**(SyntaxError) — 근거: 음성 대조군의 타입 표기가 `TypeError`가 아니라 `SyntaxError`로 걸려 **파일 전체가 아무것도 검증 못 함** — 대조군을 별도 파일/블록으로 격리 |
| `02-none-sentinel-vs-nil-holes` | `nil` 소진 시 `#t` 50→49로 무너짐 / `None`은 항상 50. 반대로 **당시의** Ref 콜백 배열은 `None` 쓰면 죽은 슬롯 1000개 잔존 — **두 배열의 규칙이 서로 반대여야 함**이 정량 확인. **[2026-08-24]** 그 대비의 한쪽(Ref 콜백)은 6라운드 `H-7`**해시맵 셋**이 되어 사라졌지만, 이 스파이크가 실제로 확인한 것(**일반 Lua 테이블에서 `nil` 구멍과 `None` 채움의 거동 차이**)은 그대로 유효하다 — `sourceList`/`flattened`처럼 순서가 중요한 배열이 여전히 그 결론 위에 선다 |
| `03-recursive-store-bind-dispatch` | StoreBind 재귀 재-dispatch, `None`→`nil` 흐름, 무한재귀 없이 종료 |
| `06-component-boundary-nil-hole-props` | `or None` 없으면 앞쪽 nil-hole로 슬롯 소실, 관용구 쓰면 항상 보존 |

View file

@ -2,7 +2,7 @@
-- [2026-08-29 M2 단위 4] `state:Apply(factory)`의 파라미터 타입 표기 실측 — 결론: 교집합 오버로드(N/O).
-- 유니온 하나(`((State<T>) -> U) | { __apply: ... -> U }`)는 `Blocker`처럼 필드가 더 있는 객체를 제네릭 U 자리에서
-- 받지 못한다(너비 서브타이핑 실패, 인덱서 `[string]: any`로도 안 됨). 원문 스파이크 4개 중 통과한 마지막 것.
-- 소스: `qa-request/pre-implementation-handtrace-round11.md` `H-179`. 기대: 진단 2건(마지막 두 줄 음성 대조군)만.
-- 소스: `qa-request/m2-implementation-round11.md` `H-179`. 기대: 진단 2건(마지막 두 줄 음성 대조군)만.
export type StateData<T> = { Get: (self: StateData<T>) -> T }
-- N: 교집합 오버로드 — 함수 팩토리는 제네릭 U, 객체 팩토리는 비제네릭 any 반환
export type StateN<T> = StateData<T> & {

View file

@ -10,13 +10,12 @@ Roblox 엔진에서 동작하는 DOMless UI 렌더러 **quad**를 처음부터
지속 가능성 — 빠른 이터레이션보다 정확성/설계 정합성이 우선. 작업 기간은
길게 잡음.
**[2026-08-24 기준] M0(스파이크 검증)/M1(스캐폴딩) 완료, 다음은 M2(반응형
코어 — Source/State/Store)** — **⭐ [2026-08-28] M2 착수, 자율 구현 구간 진행
중**(규약 `qa-request/pre-implementation-handtrace-round11-brief.md`, 발견
`-round11.md`; **[2026-08-29]** 단위 넷 전부 구현 완료·단위 3·4 끝 절차 완료,
**[2026-08-31]** 단위 2 `/code-review`·§4 배치 회신 **전량 종결**(열린 문항 0·
코드 마커 0) — 남은 마무리는 `.claude/todos.md` 00번이 소스)(마일스톤이
넘어갈 때 루트 `CLAUDE.md` 머리말도
**⭐ [2026-08-31 기준] M0(스파이크 검증)/M1(스캐폴딩)/M2(반응형 코어 —
Source/State/Store) 완료, 다음은 M3(디스패치 엔진)** — M2는 자율 구현
구간(규약 `qa-request/m2-implementation-round11-brief.md`, 발견 `-round11.md`)
으로 2026-08-28 착수~08-31 종결(단위 넷 구현·감사·리뷰·탐사 완료, §4 문항·
코드 마커 0). **M3 착수 전 새 자율 규약 문항은 사용자와 정할 것**
`.claude/todos.md` 00번이 소스(마일스톤이 넘어갈 때 루트 `CLAUDE.md` 머리말도
같이 고칠 것 — 같은 상태를 두 곳이 서술하고 있음). **⚠️ [2026-08-24] M2와
M3의 번호·순서가 맞바뀌었다** — 열려 있던 마일스톤 순서 문제가 (a) 순서
교체로 닫힌 결과다(경위는 `archive/question-resolved.md`의 "마일스톤 경계"

View file

@ -2,7 +2,7 @@
> **이 파일이 무엇인가**: **[2026-08-28 신설]** M2(반응형 코어) 구현을 자율 구간으로
> 돌리기 위한 규약이자, 단위가 끝날 때마다 띄우는 **11라운드 탐사자**에게 그대로
> 주는 지시서다. 산출물은 `pre-implementation-handtrace-round11.md`(발견 원문 +
> 주는 지시서다. 산출물은 `m2-implementation-round11.md`(발견 원문 +
> §4 배치 문항지). 9·10라운드 지시서(`-round9-brief.md`/`-round10-brief.md`)와
> 같은 관례이되, **이번 라운드는 종이가 아니라 실제 코드가 감사 도구다**
> 10라운드 지시서가 *"이후로는 M2 구현 자체가 더 나은 감사 도구"*라고 예고한
@ -52,7 +52,7 @@
1. **자율로 고치고 넘어가는 것**: `base/` 의사코드를 옮기다 드러나는 오류(순서,
빠진 `end`, 이름 불일치, 문서 간 stale), 테스트 실패 중 **"문서가 이미 답을 갖고
있는 것"**.
`H-nnn` 번호를 매겨 `pre-implementation-handtrace-round11.md`에 기록하고
`H-nnn` 번호를 매겨 `m2-implementation-round11.md`에 기록하고
**`base/`와 코드를 같은 커밋에서** 고친다. 묻지 않는다. 번호는 **`H-165`부터**
(10라운드 후속이 `H-164`까지 썼다).
2. **모아서 올리는 것**: 새 필드·인자·이름·표면·메커니즘이 필요해지는 것, 확정을
@ -106,7 +106,7 @@
1. 먼저 읽을 것: `CLAUDE.md``.claude/conventions.md`(특히 *"새 필드·인자·이름·
메커니즘은 발견이지 결정이 아니다"*와 *"하나의 무언가가 두 일을 하고 있지
않은지"*) → 이 파일 §1~§3 → `pre-implementation-handtrace-round11.md`(지금까지의
않은지"*) → 이 파일 §1~§3 → `m2-implementation-round11.md`(지금까지의
발견, 당신의 번호는 마지막 번호 다음부터).
2. 대상: 이번 단위의 커밋 범위(`git log`로 확인)에 들어온 `quad-base/src/`·
`quad-base/test/`와, 그 코드가 옮겨 적은 `base/` 절.

View file

@ -2017,7 +2017,7 @@ Q4(`EffectHandle` 네 진입점 의사코드 — Observer 것 재사용, `Unsubs
`FrameParam<E>` 원소 타입 파라미터.
- **`session/2026-08-28-03-m2-unit1-common-base.md`** — **M2 착수.** 다른 에이전트가
초안한 자율 구현 규약을 검토해 순서 오류 하나(`EpochMap`이 `Effect` 뒤 → State 본체
앞)와 소스 단일화를 고쳐 채택(`qa-request/pre-implementation-handtrace-round11-brief.md`,
앞)와 소스 단일화를 고쳐 채택(`qa-request/m2-implementation-round11-brief.md`,
세 갈래 분류 / 단위 넷 / 두 층 커밋 게이트, `HUMAN_TODO.md` 2번 닫힘). 첫 단위(공통
기반)를 사용자 확인(*"진행하면 될것 같아"*) 뒤 구현 — `Void`/`Brand`(인스턴스 15 +
`is*` 11 한 잎 파일)/`LifetimeHandle`(`InitLifetimeHandle` 에러 스텁)/`Ref` 최소형/
@ -2056,5 +2056,8 @@ Q4(`EffectHandle` 네 진입점 의사코드 — Observer 것 재사용, `Unsubs
그 §4 회신 2 블록), 보류 하나(`H-205`). **같은 날 회신 3으로 §4 전량 종결**
`H-186` UB 문서화 / `H-198` 사용자 안(스탬프를 fn 직전 + `Get` 재시작 루프 — 계약
강화: 모든 `Get`이 최신 수렴값 반환, 무한 케이스 UB) / `H-205` level 3 / 코드 검토
`H-208`(`table.clone` 스냅샷)·`H-209`(generalized iteration 전환). 열린 문항 0·마커 0,
남은 마무리는 round11 파일명 변경과 M2 종료 보고.
`H-208`(`table.clone` 스냅샷)·`H-209`(generalized iteration 전환). 열린 문항 0·마커 0.
**같은 날 파일 개명·M2 종결**`m2-implementation-round11*`로(명명 규약
`mN-implementation-roundNN`, 라운드 번호는 마일스톤 가로질러 단순 증가 —
`README.md` `qa-request/` 행이 소스), 툴링 픽스 둘(`H-210` rojo 트리 /
`H-211` Relate 타입)도 이 세션. 다음 액션은 M3 착수 규약 문항.

View file

@ -24,7 +24,7 @@
- `scripts/test.sh`: `spec.*` 수집 + `luau-analyze quad-base/src + spec + mock`.
- spec 5개(brand/relate/lifetime/ref/void).
## 발견 (`qa-request/pre-implementation-handtrace-round11.md`)
## 발견 (`qa-request/m2-implementation-round11.md`)
- `H-165` ① pesde shim은 생성 시점 export 타입만 안다 → `pesde install` 재실행,
`project-setup-plan.md`에 둘째 함정으로 기록.

View file

@ -7,7 +7,7 @@
지시했다. §4 문항 여섯(`H-182`~`H-187`)의 회신은 이 세션 시작 시점에 아직 없음.
부수 결정 하나 — 사용자: *"이건 pre-implementation 은 아닌듯 하네, 이름은 나중에
바꾸자"*. `pre-implementation-handtrace-round11*.md`는 구현 **중** 발견 문서라 이름이
바꾸자"*. `m2-implementation-round11*.md`는 구현 **중** 발견 문서라 이름이
안 맞는다는 것. **이름 변경은 §4 회신 처리 뒤로 미룸**(문항지·brief와 인용처를 한꺼번에
옮겨야 해서) — 아직 안 했고, 잊지 말 것.
@ -24,7 +24,7 @@ notification 시점에 파인더 4개가 미완인 채 멈춤. 이번엔 opus
정확성 8건 전부 실제 코드에 재현 스크립트로 확인. 효율 배치는 리뷰 스스로 "관측된
병목에만 구조" 원칙 위반으로 기각, 약한 정리 항목들은 심각도 미달 기각. 발견 상세와
처리의 소스는 `qa-request/pre-implementation-handtrace-round11.md`(요약 표
처리의 소스는 `qa-request/m2-implementation-round11.md`(요약 표
`H-198`~`H-207`, 상세 절 "단위 2 — `/code-review high`") — 여기선 갈래만:
- **① 여섯**(같은 커밋에서 반영): `H-199`(nil dep 조용한 탈락 — `collectDeps` + error),
@ -115,3 +115,14 @@ notification 시점에 파인더 4개가 미완인 채 멈춤. 이번엔 opus
- 회신 3 감사 1라운드(확실 1·의심 1) 반영: `state-epoch-plan.md` H-85 절의 옛 계약
문장("다음 Get이 반드시 재계산")을 H-198 재시작 루프로 정정, `todos.md` 00의 H-번호
나열을 소스 포인터로 축소(머리말 규칙).
## 같은 날 후속 4 — round11 파일 개명과 명명 규약, M2 종결
사용자 선택 (2): `pre-implementation-handtrace-round11*`**`m2-implementation-round11*`**.
**명명 규약 확정**: `mN-implementation-roundNN` — 라운드 번호는 마일스톤을 가로질러
**단순 증가**, 마일스톤 접두가 소속을 담는다. 사용자 근거: *"m3 을 진행하다 m2 에
하자가 있음을 확인하면 다시 m2 로 올라가 round 가 진행되다 돌아오는 경우도 있을것 …
접두가 둘 다 있는게 정보를 온전히 담아줘"* — 규약 본문은 `README.md` `qa-request/` 행.
`git mv` + 전 코퍼스 치환 22곳(잔존 0), round1~10의 `pre-implementation-*` 옛 이름은
실제로 구현 전 라운드라 그대로. CLAUDE.md/project-context.md 머리말을 "M0~M2 완료,
다음은 M3"로, todos 00을 종결로. **M2 종결** — 다음 액션은 M3 착수 규약 문항.

View file

@ -5,8 +5,8 @@
(`.claude/question.md`, `luau-test/STATUS.md` 등).
00. **⭐⭐⭐ [2026-08-28] M2 착수 — 자율 구현 구간 진행 중.** 규약은
`qa-request/pre-implementation-handtrace-round11-brief.md`(세 갈래 분류 /
00. **⭐⭐⭐ [2026-08-28 착수 → 2026-08-31 종결] M2 자율 구현 구간 — 완료.** 규약은
`qa-request/m2-implementation-round11-brief.md`(세 갈래 분류 /
단위 넷 / 관여 시점), 발견과 배치 문항은 `-round11.md`(§4 표가 사용자가
읽을 유일한 자리). **진행 상태의 소스는 `ROADMAP.md` M2 체크박스**, 여기서
세지 않는다. **[2026-08-29 새벽 기준]** 단위 1·2 완료(단위 2 감사 6라운드 수렴),
@ -18,9 +18,14 @@
회신 블록들이 소스 — 여기서 세지 않는다), **§4 열린 문항 0·코드 마커 0** —
진행 원문은
`session/2026-08-28-03-m2-unit1-common-base.md` 마지막 절과
`session/2026-08-31-01-unit2-code-review.md`. 남은 할 일:
`pre-implementation-handtrace-round11*` 파일명 변경(사용자 2026-08-31 — 구현 중
문서라 pre-implementation이 안 맞음; 새 이름은 사용자와 정할 것)과 M2 종료 보고.
`session/2026-08-31-01-unit2-code-review.md`. **[2026-08-31] 파일명 변경까지
완료** — 옛 `pre-implementation-handtrace-round11*``m2-implementation-round11*`
개명(구현 중 문서라 옛 이름이 안 맞았음; 명명 규약 `mN-implementation-roundNN`
`.claude/README.md` `qa-request/` 행이 소스 — 라운드 번호는 마일스톤을 가로질러
단순 증가). M2 종료 보고도 전달 — **M2 종결.**
**다음 액션: M3(디스패치 엔진) 착수 — 자율 구현 규약을 M2처럼 쓸지, 단위를
어떻게 자를지 등 새 규약 문항을 만들어 사용자와 정할 것**(2026-08-29
체크포인트의 "M3은 새 규약 문항" 그대로).
아래는 착수 전(2026-08-26) 서술:
**[2026-08-26] 8라운드까지 전부 처리 완료 — M2 착수 게이트가 0이다.**

View file

@ -1,13 +1,13 @@
# CLAUDE.md
Roblox 엔진용 DOMless UI 렌더러 **quad**를 처음부터 다시 짜는 프로젝트.
**[2026-08-24 기준] M0(스파이크 검증)/M1(스캐폴딩)까지 완료, 다음은
M2(반응형 코어 — Source/State/Store)** — **⭐ [2026-08-28] M2 착수, 자율 구현
구간 진행 중**(규약은 `.claude/qa-request/pre-implementation-handtrace-round11-brief.md`,
발견·배치 문항은 `-round11.md`; **[2026-08-29]** 단위 넷 전부 구현 완료 — `ROADMAP.md` M2
체크박스 전부 `[x]`, 단위 3·4 끝 절차 완료; **[2026-08-31]** 단위 2 `/code-review`
§4 배치 회신 **전량 종결**(열린 문항 0·코드 마커 0) — 남은 마무리(파일명 변경,
M2 종료 보고)는 `.claude/todos.md` 00번이 소스). **⚠️ [2026-08-24] M2와 M3의
**⭐ [2026-08-31 기준] M0(스파이크 검증)/M1(스캐폴딩)/M2(반응형 코어 —
Source/State/Store)까지 완료, 다음은 M3(디스패치 엔진)** — M2는 자율 구현
구간(규약 `.claude/qa-request/m2-implementation-round11-brief.md`, 발견·배치
문항 `-round11.md`)으로 돌아 2026-08-28 착수~08-31 종결: 단위 넷 구현·감사·
리뷰·탐사 완료, `ROADMAP.md` M2 체크박스 전부 `[x]`, §4 문항·코드 마커 0.
**M3 착수 전에 새 자율 규약 문항을 사용자와 정할 것**(`.claude/todos.md`
00번이 소스). **⚠️ [2026-08-24] M2와 M3의
번호·순서가 맞바뀌었다** — 예전엔 M2=디스패치, M3=반응형이었는데 의존이
한 방향(디스패치 → 반응형)이라 반응형을 먼저 짓기로 확정했다. 그래서
**2026-08-24 이전에 쓰인 `session/`·`archive/`·`qa-request/` 문서의

View file

@ -57,7 +57,7 @@ git.qwreey.moe에 제한된 계정 생성). 로컬 git 저장소는 이미 초
## 2. ~~자율 작업 루프/스케줄 설정~~ **[해소됨, 2026-08-28]**
**사용자가 M2를 세션 안 자율 구현 구간으로 확정**했다 — 규약은
`.claude/qa-request/pre-implementation-handtrace-round11-brief.md`, 요지는
`.claude/qa-request/m2-implementation-round11-brief.md`, 요지는
`.claude/conventions.md`의 "M2 자율 구현 규약" 항목. cron/`/schedule`은 안 쓴다
(사용자 개입 지점은 단위가 끝날 때 `-round11.md` §4 표를 배치로 회신하는 것뿐).
아래는 해소 전 원문.

View file

@ -262,7 +262,7 @@ Luau 코드로 부딪혀본 적 없는 세 가지**를 던지는 코드로 검
> 지켜집니다.
>
> **⭐ [2026-08-28 착수] M2는 자율 구현 구간으로 돕니다** — 규약(세 갈래 분류,
> 단위 넷, 관여 시점)은 `.claude/qa-request/pre-implementation-handtrace-round11-brief.md`가
> 단위 넷, 관여 시점)은 `.claude/qa-request/m2-implementation-round11-brief.md`가
> 소스, 발견은 `-round11.md`. 단위 순서는 이 문서의 체크박스 순서 그대로이되
> **`H-97`의 mock 생명주기 4종은 첫 단위(공통 기반)로 당겨** 짠다 — 그게 없으면
> 두 번째 단위부터 전파 루프 테스트가 안 돈다.

View file

@ -10,7 +10,7 @@
`archive/brand-shared-registry-reversed.md`).
Every brand instance lives in this leaf file (M2 first-unit plan,
`qa-request/pre-implementation-handtrace-round11-brief.md` §6): `EpochBrand`
`qa-request/m2-implementation-round11-brief.md` §6): `EpochBrand`
is shared by `Source`/`Ref`/`GateNode`, so keeping the instances per type
module would force a circular require. Each *type* still registers only
into its own brand at its own construction sites; subtype relations are