Commit graph

36 commits

Author SHA1 Message Date
18d6942366
decide(base): Modifier Override/Peek/isState 확정, Apply 사용 원칙 정리
- Modifier.Merge를 Override로 개명, 동작(필드별 baked 값 교체) 확정 —
  props.Modifier 단일 슬롯용 특수 상황으로 문서화 범위를 좁히고 Apply를
  기본 관용구로 유도
- :Peek<<T>>(key): T|State<T>|nil 필드 읽기 접근자, isState(x) 판별
  predicate(weak-key 레지스트리 기반) 신설
- Apply를 mutable로 바꾸는 방안과 "Apply 경계에서만 clone" 절충안 모두
  검토 후 기각 — immutable 전체 clone 유지
- Apply vs Override 판단 기준을 "계산 의존성 유무"로 명문화, FuncSource
  기각 사유를 기존 확정 원칙에서 연역해 문서화
- ROADMAP/question.md/pre-implementation-audit.md/documentation-content-map.md
  등 교차 참조 전부 갱신

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 15:45:07 +09:00
226490153e
docs: Blocker/Effect를 base/additional-primitives.md에서 별개 파일로 재분리
State 작업 시 Effect까지 같이 볼 필요는 없다는 지적(둘은 무관한 프리미티브)과
기존 프리미티브당 1파일 컨벤션(modifier-plan.md, slot-plan.md류)에 맞춰
base/blocker-plan.md, base/effect-plan.md로 재분리. Blocker는 store-semantics.md
교차 참조를 유지, Effect는 독립 파일로 완전히 분리. 전체 상호참조 경로 갱신.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 14:45:57 +09:00
5c9d10df66
docs: .claude/ 코퍼스 정리 — reference/ 신설, 승격/기각 분리, 역전 이력 트리밍
base 밖으로 늘 읽을 필요 없는 참고자료(quad-v1-architecture, comparison-fusion-vide)를
새 reference/ 폴더로 분리하고, ui-shorthand-plan을 base로 승격(RoundSize 드롭+
UICorner/UIPadding/UIScale 리네임), additional-primitives-plan을 Blocker/Effect(base
승격)·Batch/Context(archive 기각)·키 기반 컬렉션 재조정(research 잔류)으로 4분할했다.
component-composition-plan의 중복 역전 서사는 기존 archive 포인터로 압축하고, archive
제목 컨벤션을 [역전됨]/[기각됨]로 분화했다. tween-plan에는 retract/canExecute 구분
메모와 트윈 옵션 값 모양 논의를 추가했다. Effect가 Observer 변형인지는 임의로
결론내지 않고 question.md에 열린 질문으로 남겼다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 14:39:20 +09:00
e4d6181fcf
decide(base): Ref/PreRef 디스패치 타이밍 확정, phase 옵션은 archive로 역전
- CreatedRef의 {phase="created"|"mounted"} 옵션 폐기, 위치 기반 순서로 대체
- base 디스패치가 배열 파트(children/Ref)를 해시 파트(프로퍼티/이벤트)보다
  먼저 처리하도록 명시적으로 두 패스 계약화
- PreRef 신설: 프로퍼티/이벤트보다도 먼저 채워져야 하는 케이스(Roblox
  ChildAdded/DescendantAdded/Changed의 동기 발화 대응) 전용, Modifier/
  Store 타입 차단 + 위치 무관 호이스팅
- Ref 콜백/대기자 실행 구현 디테일(coroutine vs function 분기) 추가
- 역전된 원 서술은 archive/ref-phase-option-reversed.md로 보존
- architecture.md/question.md/documentation-content-map.md/ROADMAP.md 동기화

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 13:38:06 +09:00
7901ea96c4
decide(base): Modifier :Apply(factory) 팩토리 체이닝 추가
Compose 확장 함수 패턴을 콤비네이터로 흉내낸 얇은 sugar로 확정 —
modifier-plan.md 8번 절, ROADMAP.md M7 체크박스, CLAUDE.md 세션 요약 반영.
2026-08-07 11:52:39 +09:00
ec7469f74f
decide(base): With도 새 State 노드로 확정, 가변인자로 체인 남발 방지
clone 기반 빌더 대안은 디버그 그래프 1:1 매핑을 깨고, Compute 노드 위에
clone하면 캐시 슬롯이 복사되어 계산이 중복 실행됨(State 체인 플래튼
기각과 같은 실패 모드). With(...)를 가변인자로 만들어 노드 남발 걱정을
해소.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 11:34:22 +09:00
9609c7cd57
Merge branch 'worktree-frolicking-churning-zephyr'
# Conflicts:
#	.claude/README.md
2026-08-07 01:08:39 +09:00
5e837105c9
decide(base): Ref 생성자 제네릭은 단일 파라미터 Ref<T>(T)로 확정
React useRef<T,U=T>(U):T|U류 2파라미터 분리 설계 검토했으나, 명시 타입
파라미터 하나 + 인자 추론 타입 파라미터 하나가 만드는 합집합이 Luau
솔버에서 깔끔히 안 풀리고 미해소 제네릭 변수가 남는 것으로 확인(사용자
직접 확인) — Source satisfies State, State<Modifier> 차단 검증에서 이미
반복된 "Luau 제네릭 솔버는 복잡한 조합에서 잘 안 풀린다" 패턴과 같은 결.
단일 파라미터로 단순화, 초기값만으로 좁게 추론되는 문제(Ref(nil)->Ref<nil>)는
명시적 제네릭 적용(Ref<<Obj?>>(nil))으로 해결 — React useRef도 명시 타입
인자 없이는 같은 문제를 겪으므로 이미 받아들여진 UX.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 00:43:44 +09:00
99ffea2f07
decide(base): .value를 Ref 전용으로 확정, State/Source는 Get()만
State/Source의 값 읽기 접근자에서 .value(관용 표기)를 제거하고 :Get() 하나로
통일 — "관측해야 실체화된다" 원칙이 가장 날카롭게 느껴져야 할 지점에서
프로퍼티 문법이 그 느낌을 무디게 한다는 판단. .value 표기 자체는 폐기가
아니라 Ref 전용으로 좁혀짐(Ref는 lazy가 아니라 읽어도 계산이 안 트리거되므로
프로퍼티 문법이 정직함) — 이름 충돌 자체가 사라짐.

bind-system-plan.md/store-semantics.md/architecture.md/debug-tooling-plan.md
전체의 .value 언급을 :Get()으로 갱신, question.md의 관련 열린 질문은
완전히 해소되어 제거.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 00:40:57 +09:00
53d43dc90b
docs(base): Get() 확정, Store eager 생성은 table.clone+in-place 교체로 명시
- 읽기 접근자 함수명은 Get()으로 확정(Pull 대비 우위 없음 + 기존 문서와
  일치) — question.md에 반영, .value 존치 여부만 열린 질문으로 남김.
- Store의 eager Source 생성 구현 스케치 추가: table.clone(defaults) 후
  순회하며 각 슬롯을 Source(v)로 교체 — 빈 테이블에 키를 하나씩 넣는 것보다
  해시 슬롯 재사용이 Luau VM에서 더 쌈. Source()(무인자)는 Source(nil)과
  동치라는 점도 명시(lazy 생성 경로가 이 형태를 씀).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 00:31:19 +09:00
c5e0b7f452
fix(base): Store의 Source 생성이 eager뿐 아니라 lazy도 필요함을 정정
여러 base 문서(store-semantics.md, bind-system-plan.md, architecture.md)에
"store.key는 Store 생성 시 이미 만들어둔 Source를 그대로 반환할 뿐"이라는
eager-only 서술이 반복돼 있었는데 부정확했음 — Luau 타입은 런타임에
강제되지 않고 defaults도 선택이라, Store<<T>>() 처럼 defaults 없이 만든
뒤 .Key:Set(v)를 부르면 eager 생성만으론 .Key가 nil이라 크래시남.

정정된 모델: Store 생성 시점의 eager 생성(각 defaults 키마다 미리 Source
생성, 여전히 필요) + store.key 접근 시점의 lazy __index 생성(아직 없는
키를 그 자리에서 만들어 저장, 재접근시 재생성 없음) 둘 다 필요.

bind-system-plan.md에 남아있던 관련 stale 서술도 같이 정정:
- "__newindex/__index 프록시로 감싸면 됨"은 이후 :Set() 전환으로 무효화됨
- "defaults 테이블 직접 mutate는 UB"는 최신 모델과 안 맞음(defaults는
  라이브 백킹이 아니라 아직 안 만들어진 Source의 초기값 템플릿일 뿐이라
  나중에 바꿔도 문제없음, UB 아님)

question.md에 .value vs :Get()/:Pull() 읽기 접근자 이름 재검토 항목도
추가(아직 미결정 — Finalize는 기존 cleanup 계열 어휘와 충돌해 기각,
Pull과 Get/Set 대칭 사이에서 검토 중).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 00:26:16 +09:00
ccde1cb31c
research: Blocker 프리미티브 채택 확정 — Batch(lexical) 대안, 문서 마무리
세션 마무리 라운드. Batch를 부활시킨 게 아니라 완전히 별개인 새 primitive
Blocker를 채택한 것으로 명확히 분리:
- Batch(함수/코루틴 스코프 lexical block)는 그대로 기각 유지, 반면교사 기록.
- Blocker: 콜스택/코루틴이 아니라 값(On/Off)으로 지연 구간을 표현해 코루틴
  yield 위험을 구조적으로 우회. state:Block(blocker)->state가 호출 즉시
  onunblock 핸들을 등록(지연 등록 아님, 사용자 정정 반영). 이름 확정
  (Blocker/On/Off/IsBlocked/HasBlockedEmit). 재진입(네스팅)은 의도적으로
  미지원 — Rust poisoned-mutex류 위험 회피, 문서화 강조 필수로 기록. 사용
  가이드: 파이프라인 최종 연산 지점에 배치.

documentation-content-map.md에 새 심화/quadnomicon 콘텐츠 후보 반영:
State 파생 체인 동작 원리, :Compute의 조건부 의존값 사용 팁, Blocker 사용
가이드(네스팅 금지 최우선 강조), "왜 Batch 대신 Blocker인가" 비교 에세이,
push-invalidate/pull-recompute의 laziness 설계 철학 심층 에세이.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-07 00:05:18 +09:00
4358fa71d7
research: 키 재조정 자유함수+Extract로 정정, Effect 단순화, Batch/Context 최종 기각
사용자 라이브 피드백 반영:
- 키 기반 컬렉션 재조정: State 메소드 프레이밍 철회(Source 안 쓰는 컴포넌트가
  못 씀), 자유 함수 + plain-or-State 폴리모픽 시그니처로 정정. Slot에 파괴
  없이 빼내는 Extract 연산 필요(리오더용, 기존 "portal 없음" 결정과는 다른
  층위라 안 부딪힘). 이름 후보(Render/Draw/List) 추가, Keyed는 탈락.
- Effect: Observer에 cleanup 반환 계약 추가하는 안 기각(클로저 업밸류로 이미
  충분 — pre-implementation-audit.md 3-1과 같은 논리). 대신 leaf 죽음에
  확정 정리하는 별도 단순 primitive로 수렴, 시그니처만 남음.
- Batch: 코루틴 yield 시나리오 분석 결과 lexical transaction 모델 자체가
  구조적으로 위험 — 프리미티브로 안 만들기로 결정, 심화 최적화 팁 +
  quadnomicon 에세이로 대체.
- Context: 기각 확정. 대안이던 레이어드 Store도 사용자 반박으로 철회(이미
  있는 타입 강제 명시적 Store 전달 + 오버라이드 지점 명시적 병합으로 충분).

documentation-content-map.md에 quadnomicon 에세이 후보 2개(왜 Batch가/
Context가 없는가) + 심화 최적화 팁 1개 추가.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 23:36:36 +09:00
67438a172e
research: Context 난이도 판정 완료 — 기각 권고, 레이어드 Store 대안 확정
서브에이전트 조사: 동기 콜스택 한정 버전은 구현 난이도 낮지만(Fusion
Contextual 이식 가능), quad가 정상 패턴으로 확정한 Slot 비동기 추가에서
조용히 defaultValue로 폴백하는 함정 있음 + quad-debug의 "모든 연결은
선언된 그래프" 철학과 충돌. Roblox Luau는 thread-local이 없어 완전 자동
버전은 플랫폼 한계로 사실상 불가(Node AsyncLocalStorage/Python contextvars와
동일 문제). 대안 비교 결과 레이어드 Store(__index 델리게이션, Modifier/
Source가 이미 쓰는 패턴과 동일 계열)가 서브트리 오버라이드 가치를 명시적
전달 철학·비동기 안전성 유지하며 대부분 재현 — 최종 권고안으로 채택.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 22:04:54 +09:00
ec5fb8184b
research: 키 기반 컬렉션 재조정 설계 스케치, Context 난이도 판정 진행중 기록
사용자와 라이브 논의 반영 — state:Keyed(keyFn, renderFn) -> Slot 스케치(독립
프리미티브 vs 파생 데이터 원칙 적용해 메소드 프레이밍 채택), Context는
서브에이전트에게 구현 난이도 평가 위임 중.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 21:59:23 +09:00
6c99de744d
merge: main의 최신 리서치/감사 반영 (문서사이트 구조, Source/State 서브타입 재구성, M0 크리티컬 감사)
# Conflicts:
#	.claude/README.md
2026-08-06 21:54:46 +09:00
c5ae5de35f
M0 착수 직전 크리티컬 감사 — research/pre-implementation-audit.md 신설
4개 서브에이전트로 base/ 전체 + 근접 research/를 모호성/지연결정리스크/
단순화후보 세 렌즈로 재감사. 가장 구조적인 발견은 Tween.luau가 문서
전체에서 "범용 store-bind 캐치올 핸들러"의 유일한 예시로 서술되는 문제
(일반 반응형 프로퍼티 바인딩이 실제로 Tween 파일을 거쳐가는지 불명확).
그 외 props.Modifier/Ref forwarding의 nil-hole 함정, canExecute 실제
구현 미확정, LifetimeHandle 로드맵 순서 역전 등 우선순위1급 11개 +
우선순위2급 11개 + 단순화후보 2개.

부수적으로 architecture.md 소스트리의 stale 주석(Store.luau/Ref.luau)
정정, question.md/README.md에 이 감사 반영, CLAUDE.md에 세션 요약 추가.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 21:38:48 +09:00
4b839b09e1
문서 사이트 구조/quadnomicon 신설, 프레임워크 정직 비교, Source가 State를 만족하는 서브타입 재구성
세 갈래 작업:

1. 문서 사이트 구조 확정(초심자/api/심화 3축 + quadnomicon 4번째 축) —
   research/documentation-plan.md 0번 항목, research/documentation-content-map.md
   신설(초심자 core loop 목차 초안, 파일별 분류, 심화 에세이 후보 15개).

2. quad vs Fusion/Vide/react-lua 정직 비교 — research/framework-comparison-findings.md
   신설. 3개 에이전트가 실제 소스(Fusion/Vide 로컬 클론)+웹 리서치(react-lua)로
   검증. quad 강점(Slot 단일 마운트 가드, 열린 우선순위 축, 명시적 의존성,
   다이아몬드 dedup)과 고칠 만한 약점 식별.

3. Source가 State를 구조적으로 만족하는 서브타입으로 재구성(핵심 변경) —
   store.key 타입 문제(레코드 타입 읽기/쓰기 비대칭)를 풀다가 StoreSource
   프록시 설계(2026-08-04 확정분)를 완전히 대체:
   - Source<T>가 State<T>를 구조적으로 만족(단방향 호환), Store는
     "이름 붙은 Source 모음"으로 단순화 — 별도 wrapper 생성/캐싱 불필요
   - store.key = value(__newindex) 폐기 → store.key:Set(value)
   - Store:Emit(key) → source:Emit()
   - base/store-semantics.md에 새 절로 반영, bind-system-plan.md/
     component-composition-plan.md/architecture.md 정정
   - ROADMAP.md M0에 Luau 솔버 검증 항목 추가(재귀 타입 조합)
   - 폐기된 StoreSource 원문은 archive/store-source-proxy-reversed.md에
     역전 이유·신구 비교와 함께 보존(quadnomicon 소재 후보)

전체 코퍼스 stale 참조 재점검: architecture.md 요약절, README.md 승격 누락,
Modifier UB 규칙 확장 등 발견해서 수정.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 21:29:56 +09:00
3af792e33a
research: 추가 프리미티브 필요성 조사 (키 기반 컬렉션 재조정 등)
웹 프레임워크(React/Vue/Solid/Svelte/MobX) + Fusion/Vide/quad v1 소스 근거로
현재 확정된 프리미티브(Source/State/Store/Ref/Observer/Modifier/Slot/DI)만으로
충분한지 조사. 가장 명확한 빈 자리는 키 기반 동적 컬렉션 재조정(Fusion
ForPairs/Vide indexes()류) — Slot은 CRUD 껍데기일 뿐 diff 엔진이 아님.
Effect/cleanup 공개 API, Batch, Context는 부차적 후보로 확인.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 21:26:58 +09:00
3d9e48f5f1
v1-compat-plan.md: quad-roblox-v1-compat 기술 계획 — 두 임베딩 방향 + Slot 미결 항목
사용자 확정 사항 반영: 브리지는 v2→v1 단방향만, 패키지명 quad-roblox-v1-compat.
v1 mount.lua/class.lua(Update 재렌더 시 __child 재부모, Clone 트리거 조건,
cascading destroy 의존)와 v2 slot-plan.md(단일 마운트 소유권, retract=폐기,
foreign Instance 처리 미명시)를 대조 조사해 두 임베딩 방향(v2 트리에 v1 리프
박기 / v1 트리 요소를 v2로 점진 교체)에 대한 구체적 안전 규칙을 도출.
Slot이 quad 밖에서 만들어진 Instance를 어떻게 다루는지만 Slot 코어 구현
시점까지 결정 불가로 남겨 question.md에 교차 참조 추가.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 20:39:32 +09:00
24c82a299e
v1-compat-plan.md: 병행 사용 + 경계 리졸브 브리지로 방향 수렴
사용자가 "v1 런타임을 v2 위에 재구현" 대신 "v1을 그대로 병행 실행하고
경계에서만 값을 리졸브해 넘기는 브리지"를 제안 — 검토 결과 기존에 설계된
state:Observer()(무인자="계속 관측" 유틸)와 v1의 공개 프로퍼티 재대입
API만으로 조립 가능함을 확인, DOMless/엔진값 원칙 덕에 구조적 합성도
이미 공짜라 3-2("얇게 안 됨") 문제를 재구현이 아니라 회피로 해결하는
유력 방향으로 수렴. 조사 중 target()/Linker를 "양방향 바인딩"으로
서술한 이전 오류도 정정(실제로는 named child 등록 + 시그널 중계).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 20:19:19 +09:00
34a0e1dcce
v1 하위호환(compat) 레이어 타당성 검토 리서치 문서 추가
사용자 질문(v2가 v1에 얇은 compat 래퍼를 제공할 수 있는가)에 답하기 위한
조사. quad2-try의 quad-compat 서브패키지는 빈 폴더로 실제 시도된 적 없었음을
확인 — 반복 조사 금지 대상이 아니라 새로 검토 가능한 주제. 결론: 이벤트 self
관습 등 표면 문법은 opt-in 패키지로 얇게 재현 가능하지만, Class.Extend()의
자동-store+자동재렌더 같은 핵심 런타임은 v1/v2가 컴포넌트 정체성 모델 자체를
다르게 정의해서 얇게 안 됨. 방향 결정(부분 compat vs 마이그레이션 가이드)은
question.md에 열린 질문으로 반영.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 20:10:15 +09:00
e58ff06012
clear 전 최종 점검 — question.md에 빠졌던 두 항목 추가
채팅에서만 언급되고 question.md엔 안 적혀있던 것 발견해 추가:
- DI 리네임이 FrameModifier류 Modifier 타입 프리픽스에 주는 파급 효과
- Ref 정의가 넓어지며 생긴 이름 재검토 필요성

그 외 전체 코퍼스 stale 참조(ObserverHolder, getter, Subscribled 오타 등)
재점검 완료 — 발견된 문제 없음. 이 세션에서 다룬 내용은 전부 question.md/
base 문서/CLAUDE.md 핸드오버에 반영 완료.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 19:46:35 +09:00
c9a0a3b461
Observer Subscribe/Unsubscribe 세부 확정 — self 리턴, nil 처리, 무참조 생존
- :Unsubscribe()가 강참조 레지스트리에서 반드시 nil 처리까지 해야 함을 명시
- 참조를 아무 데도 안 담고 state:Observer(fn):Subscribe()만 해도
  정상적으로 계속 도는 게 의도임을 명시
- :Subscribe()/:Unsubscribe() 둘 다 self 리턴하는 것으로 확정(대칭) —
  체이닝/리스트 저장 편의

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 19:44:56 +09:00
2467c68ebb
Observer :Subscribe()/:Unsubscribe() 추가 — 전역/독립 사용 케이스 지원
children 배열에 안 붙는 Observer(디버깅용 Store 직접 print 패턴 등)를
위한 명시적 라이프사이클 경로. PA님 코드 교차검증 때 예고해둔 확장
지점("GC만으로 부족하면 명시적 dispose 경로 추가 가능")을 실제로 채움.
liveness는 self.Subscribed 필드 우선 + self.Connection.Connected 폴백,
내부 강참조 레지스트리로 GC 방지(weak table과 역할 분리). 둘 다
idempotent, Unsubscribe는 자동(리프) 케이스 조기 해제에도 재사용.
CLAUDE.md 핸드오버 6번 항목 갱신(이벤트 store-bind 부차적 옵션 재조정
포함).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 19:40:15 +09:00
20fad2508f
이벤트 store-bind를 부차적 옵션으로 명시 — 기본 패턴은 핸들러+내부 분기
재고 결과: 저빈도 UI 이벤트의 조건부 처리는 Connect/Disconnect 없이
"핸들러 하나 계속 연결 + 내부 분기"로 이미 공짜로 되고 더 쌈 — 이걸
기본 권장 패턴으로 명시. store-bind(false 센티널)는 고빈도 신호/로직
자체가 바뀌는 드문 케이스를 위한 부차적 옵션으로 격하, 자주 재계산되는
State에 물리면 숨은 churn 비용이 생긴다는 캐비엇 추가. 메커니즘 자체는
일관성을 위해 그대로 유지(예외로 빼서 막을 근거는 약함). 향후
documentation-plan.md 3번 문서에 두 패턴 대조 예정으로 기록.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 19:33:07 +09:00
f1ca156789
Modifier 마무리(Getter 제거, __index 런타임 통찰) + 이벤트 store-bind 확정
- Modifier Getter 아예 안 만들기로 확정 — :FontSize(function(old)->new)가
  유일한 use case를 이미 인라인으로 커버
- old는 항상 "현재 저장된 그대로"(plain/State 구분 없이) 넘긴다는 원칙 명문화
- func(state)->state 세 번째 셋터 모양은 불필요하다고 검토 후 기각
- Modifier는 핸들러 계층(Ref/Slot)을 몰라도 되는 순수 데이터 merge 레이어로 확정
- Modifier 런타임은 base에 제네릭 __index 하나로 충분 — 클래스별 타입
  생성기는 정적 타입 체크 전용, 런타임과 무관하다는 점 명시
- 이벤트도 store-bind 가능하도록 확정 (기존 재실행 래핑 재사용,
  false를 disconnect 센티널로) — quad-roblox 로컬
- CLAUDE.md 핸드오버 5번 항목 갱신

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 18:45:28 +09:00
2dcdebdee1
독립 프리미티브 vs 원천 종속 파생 데이터 원칙 신설
Observer가 State처럼 원천(Source/State) 없이는 존재할 수 없다는 사용자
관찰을 일반 원칙으로 승격 — Source/Ref/Store/Modifier(독립 프리미티브,
Type(args) 자유 함수 생성자) vs State/Observer(파생 데이터, 원천에 대한
메소드로만 얻어짐)로 분류. state:Observer(fn)가 메소드고 자유 함수
Observer(state, fn)가 없는 더 근본적인 이유로 연결.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 18:08:46 +09:00
83cd022011
Ref/Store 생성자 스타일, Observer 이름 확정 반영
- Ref(default)/Source(default)/Store({defaults}) — Compose식 팩토리
  함수 생성자로 통일, Ref만 예외였던 이유 없었음(단순 명세 공백)
- state:Observer(fn) 메소드 형태로 확정(자유 함수 아님) — 근거 명시
- PA님 코드의 기존 Observer 클래스와 이름 충돌 지점에 구분 각주 추가

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 18:04:17 +09:00
936e0766b7
이벤트 self 관습/Store Emit/Ref 일반화/Observer 논의(2026-08-06 후속 세션) 결과 반영
- 이벤트 핸들러 self(Instance) 관습 비채택 확정 (Ref로 충분, Modifier 정적
  flatten과의 충돌, quad-debug 추적성, 클로저 비용)
- rbvm GC 패턴이 실물 검증됐다는 근거 보강 (lifecycle-pattern.md)
- .claude 코퍼스 전체 stale 참조/모순 감사 및 정리
- Store:Emit(key) 확정 (Source 원천 한정, clone 불가 userdata 우선 근거)
- :Compute(fn, previous) 확정 (무거운 파생 객체 재사용, full diff 필수)
- state:Observer(fn) 확정 (children 배열에 직접 놓는 leaf 값, canExecute 게이팅)
- Ref 일반화 확정 (범용 값 박스, 반복 재설정 가능, State와 달리 non-lazy)
- CLAUDE.md 핸드오버 갱신

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 17:54:13 +09:00
bc0a8b9f5f
quad-debug/UI 숏핸드/Attribute 타입 논의(2026-08-06) 결과 반영
- research/debug-tooling-plan.md 신설: 런타임 디버깅 플러그인 quad-debug
  설계 — BindableEvent/Function이 Studio 플러그인↔Play 중 게임 경계를
  넘는지 실측 검증 완료, 채널 위치/페이로드 제약/UUID 기반 on-demand
  compute/Element Inspector/Explorer-플러그인 트리 동기화까지 정리
- research/ui-shorthand-plan.md 신설: v1 Corner/PaddingAll/Scale 인라인
  숏핸드 조사, quad-v2 포팅 확정(RoundSize만 네이티브 UICorner로 대체돼
  불필요), quad-roblox 코어 직접 포함 원칙 확정
- research/documentation-plan.md 신설: UI 네이밍 컨벤션 + Store 부작용을
  게임 시스템에서 쓰는 패턴 문서화 뼈대
- base/bind-system-plan.md: Attribute 특수 키 타입 파라미터화 신규 논의 추가
- base/modifier-plan.md, README.md, question.md, ROADMAP.md, CLAUDE.md:
  위 신규 문서 색인/요약 반영

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 15:23:18 +09:00
470f188d0f
로드맵 인수인계 라운드(2026-08-04) 결과 반영 — ROADMAP.md 신설, 설계 단계 종료
component-composition-plan을 research/에서 base/로 승격하고, 구현 착수 전
리스크 감사에서 나온 M0 스파이크 항목(Store/State propagation, dispatch,
컴포넌트 경계 named-parameter 전달)을 문서에 반영. quad-base 테스트 mock
방향(Vide 선례 채택) 확정.
2026-08-04 17:11:23 +09:00
c19e82f661
6차 라운드 + 컴포넌트화/Modifier 논의, 문서 코퍼스 전체 정리 결과 반영
- 6차 라운드: 태그 네임스페이싱(Ref로 충분), Store가 Store를 담지 않음 확정
- Modifier 메커니즘 전체 확정(정적 merge, immutable+clone 체이닝, State
  필드 지원, "관측해야 실체화된다" 전역 원칙) — base/modifier-plan.md 신설
- 컴포넌트화 논의 시작(research/component-composition-plan.md) — 컴포넌트=
  플레인 함수, State/Source 읽기·쓰기 경계, StoreSource 프록시까지 수렴,
  modifier/Ref의 컴포넌트 경계 통과 방식은 열린 채로 남김
- .claude/ 코퍼스 전체(약 15개 문서)를 서브에이전트로 감사해 여러 라운드에
  걸쳐 쌓인 모순/중복/stale 마커/끊긴 참조 다수 수정
- purity-and-effects-plan.md를 research/에서 base/로 승격
- CLAUDE.md: 라운드별 인수인계 메모 3개를 하나로 통합, 오래된 "더 이상 열린
  질문 없음" 모순 제거
- question.md: 시간순도 우선순위순도 아니던 구조를 "지금 열려있는 것" 중심
  으로 재정리, 용어 정리 제안(State/DI/PerInstanceState 등 우선순위) 추가

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 15:49:28 +09:00
c00e2e67d6
소스 구조 확정 라운드(2026-08-04, 5차) 결과 반영
bind-system-plan/module-lifecycle-plan/slot-plan을 research/에서 base/로
승격, quad-base(인터페이스)/quad-roblox(구현) 패키지 경계와 모노레포 소스
트리를 architecture.md에 확정. Slot의 base/roblox 분리, InstanceChild
핸들러 필요성도 함께 반영.
2026-08-04 13:57:01 +09:00
0dbbc3d0b1
설계 검증 라운드(2026-08-04) 결과 반영
2026-08-03 확정 사항 전체를 AskUserQuestion으로 하나씩 재검증. 대부분
그대로 확인됐으나 State 프리미티브 존재 여부(있어야 함으로 정정), Pipe
copy-on-write 후보(폐기, state(state) 조합으로 대체), Slot retract 시
동작(폐기로 확정) 등 실제 정정이 발생 — Store/State/Source 온톨로지가
다음 세션 최우선 열린 설계 스레드로 새로 부상.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 12:06:26 +09:00
0c9b8584ee
quad-v2 재작성 계획 초기 스캐폴드
quad(Roblox DOMless UI 렌더러) v2 재작성을 위한 .claude/ 계획 구조를 세우고
핵심 아키텍처 결정을 정리함:

- quad v1 / rbvm / tbox / Fusion / Vide / 폐기된 quad2-try 프로토타입 리서치
- Store 책임 분리(base vs provider), process/retract 핸들러 디스패치 모델,
  Ref 역할, Slot/Tween 설계 방향 등 핵심 결정 확정
- .claude/{base,research,qa-request,archive,feedback}, question.md, README.md
  구조 마련 (code-docker/webmanager 패턴 참고)
- 루트 CLAUDE.md/HUMAN_TODO.md 작성

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 00:07:40 +09:00