docs: 이번 세션 결정사항 코퍼스 전체 반영 감사 및 보강

세션 clear 전 정합성 점검 — 이미 커밋된 결정들이 다른 문서에 제대로
퍼져있는지 확인하고 빠진 곳을 보강:

- ROADMAP.md M3에 Observer(즉시실행 확정)/Effect(fn, state?) 체크박스
  추가(그동안 base 문서에만 있고 로드맵엔 전혀 없었음), M8 Ref 체크박스를
  :Set/:Callback/:Wait API + 파일 분리 + resume payload 정정 내용으로 갱신
- base/architecture.md 소스트리에 Modifier.luau/Blocker.luau/Effect.luau가
  통째로 누락돼 있던 것 추가(Ref.luau 코멘트도 최신 API로 갱신은 이미 완료)
- README.md의 effect-plan.md 요약이 "Observer와 관계 미해결"로 남아있던 것
  정정
- documentation-content-map.md의 "아직 문서화 보류" 목록에서 해소된
  Effect/Observer 항목 제거
- CLAUDE.md 다섯 번째 세션 절에 당시 기록 안 됐던 Override 서브타입
  미검증 이슈(modifier-plan.md 9-2번) addendum 추가

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
qwreey 2026-08-07 16:25:20 +09:00
parent 8fc6dd3b8c
commit b7ce11cf7f
Signed by: qwreey
GPG key ID: D28DB79297A214BD
5 changed files with 35 additions and 11 deletions

View file

@ -35,7 +35,7 @@
| `purity-and-effects-plan.md` | 컴포넌트 "순수성"이 아니라 "이식성" 문제로 재정의 — 문서 경고 수준으로 확정 |
| `component-composition-plan.md` | 컴포넌트=플레인 함수, State/Source 읽기·쓰기 경계, Source가 State를 구조적으로 만족 — modifier/Ref 컴포넌트 경계 통과까지 전부 확정, 남은 건 API 이름뿐. **[2026-08-07 정리]** 폐기된 `StoreSource` 프록시 설계로의 역전 이력은 본문에서 빼고 `archive/store-source-proxy-reversed.md` 포인터로 압축 |
| `blocker-plan.md` | **[2026-08-07 신설]** `Blocker` — 여러 Source를 한꺼번에 바꿔도 파생값 재계산이 한 번만 되게, State 마일스톤(M3)과 함께 개발. 메커니즘+이름 확정 |
| `effect-plan.md` | **[2026-08-07 신설]** `Effect` — leaf 죽음에 확정 정리, 재실행 개념 없음. Observer와의 관계가 아직 미해결(문서 내 "미해결" 절, `question.md` 0번) |
| `effect-plan.md` | **[2026-08-07 신설, 여섯 번째 세션에 확정]** `Effect(fn, state?)``state` 없으면 설치 1회+leaf 사망 시 확정 정리, 있으면 내부적으로 `state:Observer(...)`를 조합해 재실행+cleanup 체이닝(React `useEffect` 동형). Observer와의 관계 해소 완료 |
| `ui-shorthand-plan.md` | **[2026-08-07 `research/`에서 승격]** `UICorner`/`UIPadding`/`UIScale` 인라인 편의 키 — 이름(v1 `Corner`/`PaddingAll`/`Scale`에서 Modifier 필드명과 안 겹치게 `UI` 프리픽스로 확정)·메커니즘(Handler)·패키지 배치(quad-roblox 코어)·store-bind 가능성까지 전부 확정. 이미지 라운드 트릭(`RoundSize`)은 드롭 — `archive/ui-shorthand-roundsize-dropped.md` 참고 |
## `reference/` — 온디맨드 참고 자료 (2026-08-07 신설)

View file

@ -122,9 +122,12 @@ quad/
├── quad-base/
│ ├── wally.toml
│ └── src/
│ ├── Source.luau # 값의 근원, 단일 지점
│ ├── State.luau # 캐시만 하는 non-owning 핸들, state(state) 분기
│ ├── Source.luau # 값의 근원, 단일 지점. Source가 State를 구조적으로 만족(`__index` 델리게이션)
│ ├── State.luau # 캐시만 하는 non-owning 핸들, state(state) 분기, `:With`/`:Compute`/`:Observer`(등록 즉시 1회 실행) 전부 여기 소속
│ ├── Store.luau # source 집합체, dot-access로 Source 그대로 반환
│ ├── Blocker.luau # 값 기반 emit 지연/합치기(`base/blocker-plan.md`), State/Source와 밀접 연관돼 같은 위치
│ ├── Modifier.luau # flatten-before-dispatch, immutable 체이닝, 제네릭 `__index` 필드 setter 합성 + `:Apply`/`:Peek`/`Override`(`base/modifier-plan.md`)
│ ├── Effect.luau # `Effect(fn, state?)` — state 없으면 설치1회+leaf사망시 정리, 있으면 State.Observer를 조합해 재실행(`base/effect-plan.md`)
│ ├── Dispatch/
│ │ ├── init.luau # process/retract 엔진, isHandlable 우선순위 스캔
│ │ ├── Handler.luau # 핸들러 계약 타입(isHandlable/priority/process/retract)

View file

@ -204,8 +204,6 @@ additional-primitives-plan.md`의 "문서화 백로그" 절이 원자료)**:
- 키 기반 동적 컬렉션 재조정 최종 이름/시그니처(`Render`/`Draw`/`List` 등
후보만 있음, `Slot:Extract` 세부 시맨틱도 미정) — `research/
additional-primitives-plan.md`(2026-08-06 신설, 설계 진행 중)
- Effect가 `state:Effect()`로 Observer를 확장하는 형태인지, 완전히 독립된
free function인지 (`base/effect-plan.md`의 "미해결" 절)
이 항목들은 `.claude/question.md`에도 이미 열린 질문으로 잡혀있음 — 여기선
"확정 전엔 문서화 대상 아님"이라는 표시만 겸함.

View file

@ -832,6 +832,17 @@ setter를 단발로 직접 호출하는 흔한 경로는 여전히 mutable이라
기각. 전부 clone하는 현재 방식 유지 확정. `base/modifier-plan.md`
9-1번 (a-1) 절.
**같은 세션 네 번째 후속(당시 CLAUDE.md에 미기록 — 2026-08-07 여섯 번째
세션에서 뒤늦게 발견/보강) — `Override`가 서브타입 관계인 Modifier끼리
섞일 때의 타입 시그니처는 미검증으로 열어둠.** `FrameModifier`
`GuiObjectModifier`의 서브타입이어야 자연스러운데, 필드 setter 메소드의
리턴 타입이 각자 자기 자신이라(`self`) 단순 구조적 서브타이핑만으로
`Modifier.Override(guiObjectMod, frameMod)`류가 통과하는지 추론만으로는
결론 못 냄 — 후보안(메소드 필드는 `any`로 뭉개고 데이터 필드만 구조적
체크)을 실 Luau로 검증 필요, 안 되면 `Override(...: any): any`
느슨하게 열고 이 항목으로 되돌아오는 걸 fallback으로 남김.
`base/modifier-plan.md` 9-2번, `ROADMAP.md` M7에 체크박스 반영 완료.
**다음 세션이 할 일**: 안 바뀜(위 2026-08-06 네 번째 세션 절 참고,
`ROADMAP.md` M0부터) — 이번 세션도 순수 설계 확정이라 M0 착수 우선순위
자체는 그대로.

View file

@ -67,6 +67,13 @@ Luau 코드로 부딪혀본 적 없는 세 가지**를 던지는 코드로 검
- [ ] `Blocker.luau`(`base/blocker-plan.md` 참고 — 여러 Source를
한꺼번에 바꿔도 파생값 재계산/재대입이 한 번만 되게 하는 primitive,
State와 밀접히 연관돼 있어 같은 마일스톤에서 개발)
- [ ] `state:Observer(fn)` — children 배열 leaf 참가자, **등록 즉시 1회
실행 확정**(`base/bind-system-plan.md`의 Observer 절), `isObserver`
판별자, canExecute 게이팅, `:Subscribe()`/`:Unsubscribe()`
- [ ] `Effect(fn, state?)`(`base/effect-plan.md`) — `state` 생략 시 설치
1회+leaf 사망 시 확정 정리, `state` 지정 시 내부적으로
`state:Observer(...)`를 조합해 재실행+cleanup 체이닝(React
`useEffect` 동형). Observer 구현 이후에 착수(의존 관계)
- [ ] mock 대상 테스트
## M4 — 첫 end-to-end 반응형 업데이트
@ -111,12 +118,17 @@ Luau 코드로 부딪혀본 적 없는 세 가지**를 던지는 코드로 검
## M8 — Ref
- [ ] `CreatedRef` 메커니즘(숫자 슬롯 참가자) + `PreRef`(children 배열
전용, Modifier/Store 타입 차단, 위치 무관 호이스팅 pre-pass —
`base/bind-system-plan.md` "`phase` 옵션 폐기 → 위치로 표현,
`PreRef` 신설" 절)
- [ ] Ref 콜백/대기자 실행 루프(`type(v)=="thread"`면 resume+소진,
함수면 호출+유지 — 같은 배열 하나로 통합)
- [ ] `Ref.luau`(`.Value` 읽기 전용 필드 + `:Set(value)`/`:Callback(fn)`/
`:Wait(thread?)`, 전부 self 반환) + `PreRef.luau`(별도 파일, Ref
런타임 재사용 + children 배열 전용, Modifier/Store 타입 차단,
위치 무관 호이스팅 pre-pass — `base/bind-system-plan.md` "`phase`
옵션 폐기 → 위치로 표현, `PreRef` 신설" 절 + "API 모양" 절)
- [ ] `CreatedRef` 메커니즘(숫자 슬롯 참가자)
- [ ] Ref 콜백/대기자 실행 루프(`type(v)=="thread"`면
`coroutine.resume(v, self)`+소진, 함수면 `v(value)` 호출+유지 —
같은 배열 하나로 통합). `:Wait(thread?)``thread``nil`이면
`coroutine.running()` 캡처+yield, 있으면 등록만 하고 즉시 `self`
반환(남의 thread를 여기서 대신 정지시킬 수 없어서)
- [ ] `LifetimeHandle` quad-roblox 실제 구현(Instance 생존 확인, 인터페이스
자체는 M2로 이동됨)
- [ ] `PerInstanceState` quad-roblox 실제 구현(weak-keyed table, 인터페이스