From 40b812961217a6debed9b092de38a3b63cc4a5bb Mon Sep 17 00:00:00 2001 From: qwreey-agent-selene Date: Sat, 29 Aug 2026 02:26:02 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EB=8B=A8=EC=9C=84=204=20=EA=B0=90?= =?UTF-8?q?=EC=82=AC=203=EB=9D=BC=EC=9A=B4=EB=93=9C=20=EB=B0=98=EC=98=81?= =?UTF-8?q?=20=E2=80=94=20Gate=20setup=20=EA=B2=80=EC=A6=9D=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D,=20source-state-plan=20H-94=20=EB=AC=B8=EB=8B=A8?= =?UTF-8?q?=EC=9D=84=20=5F=5Fapply=20=EB=AC=B8=EB=8B=A8=20=ED=8F=AC?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=EB=A1=9C,=20HasBlockedEmit=20=EA=B0=81?= =?UTF-8?q?=EC=A3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: qwreey --- .claude/base/blocker-plan.md | 2 +- .claude/base/source-state-plan.md | 7 +++---- .claude/qa-request/pre-implementation-handtrace-round11.md | 2 ++ 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.claude/base/blocker-plan.md b/.claude/base/blocker-plan.md index c568e6c..063290d 100644 --- a/.claude/base/blocker-plan.md +++ b/.claude/base/blocker-plan.md @@ -221,7 +221,7 @@ blocker:Off() -- onunblock 핸들 실행 → HasBlockedEmit 확인 → 딱 한 아님) — 원래 근거는 배선 동사 `state:Block(blocker)`와의 충돌이었고, **[2026-08-28 `H-158`]** 그 동사가 `state:Apply(blocker)`로 바뀐 뒤에도 이름은 유지한다(`On`/`Off`가 `IsOn`/`IsBlocked`와 이미 짝이고, 바꿀 이유가 없다). -- 필드: **`IsBlocked`**(Blocker 자신의 On/Off 상태), **`HasBlockedEmit`** +- 필드: **`IsBlocked`**(Blocker 자신의 On/Off 상태), **`HasBlockedEmit`**(**[2026-08-29]** 개념 이름 — 리터럴 필드가 아니라 게이트 `withheld`의 `next(…) ~= nil` 파생값, 위 "`HasBlockedEmit`은 게이트 흡수 집합의 특수형이다" 절) (gated state의 대기 플래그, `Is`/`Has` 접두어로 불리언임을 바로 알려줌). - 메소드: `state:Apply(blocker) -> state`(**[2026-08-28 `H-158`]** 옛 `state:Block(blocker)` — 별도 메소드가 아니라 `Blocker.__apply`). - **[2026-08-18 신설] `IsOn() -> boolean`**(`IsBlocked` 필드를 그대로 읽는 diff --git a/.claude/base/source-state-plan.md b/.claude/base/source-state-plan.md index 45ebd09..1d4262e 100644 --- a/.claude/base/source-state-plan.md +++ b/.claude/base/source-state-plan.md @@ -1136,10 +1136,9 @@ then return factory(self) else return factory:__apply(self) end end` — 즉 여기 한때 `factory: (State) -> U): U`라 적혀 있었는데, 그 시그니처는 **함수만** 받으므로 위 `H-94` 항목이 확정한 "지정된 필드를 가진 객체" 형태를 **거부한다** — `state:Apply(Debounce{...})`가 그대로 타입에러다. - 파라미터는 **함수 또는 그 필드를 가진 객체**를 받고 반환은 열어둔다 — - **[2026-08-29 `H-179`]** 함수 쪽은 제네릭 `U`, 객체 쪽은 `any`(호출부가 명시) - (필드 이름은 `__apply` — **[2026-08-28 `H-158`]**; 시그니처는 위 항목대로 M2 단위 4 - `H-179`에서 확정). 아래 논거는 **반환 쪽**에 + 파라미터는 **함수 또는 그 필드를 가진 객체**를 받고 반환은 열어둔다 — 정확한 + 표기(함수 쪽 제네릭 `U` / 객체 쪽 `any`, 교집합 오버로드)는 **위 `__apply` 시그니처 + 문단이 소스**(`H-179`; 여기 반복하지 않는다). 아래 논거는 **반환 쪽**에 대한 것이라 그대로 유효하다 — Modifier의 `Apply`는 `factory: (M) -> M`으로 같은 타입을 유지해야 체이닝이 이어지지만, State의 `:Apply`는 팩토리가 State가 아닌 값(예: 최종 diff --git a/.claude/qa-request/pre-implementation-handtrace-round11.md b/.claude/qa-request/pre-implementation-handtrace-round11.md index 4dd400a..da2bbe7 100644 --- a/.claude/qa-request/pre-implementation-handtrace-round11.md +++ b/.claude/qa-request/pre-implementation-handtrace-round11.md @@ -311,6 +311,8 @@ lazy 하게 읽으면 되는거 아냐? Set 재진입 같은 경우는, 반복 - 단위 3 감사 1라운드 잔여: `Observer`/`Effect` 생성자의 `fn` 타입 검사(`error(…, 2)`)는 문서에 없고 코드가 더한 입력 검증 — `newNode` dep 검증과 같은 급(`architecture.md` 계약의 예), 기록만. 스파이크 `05`는 `spec.state`/`spec.effect` 3번이 대체 → `done/`. +- `Impl.Gate`의 `setup` 타입 검사와 `setup(emit)` 반환값 검사(`error(…, 2)`) 둘도 문서에 + 없고 코드가 더한 입력 검증 — `newNode` dep 검증·단위 3의 `fn` 검사와 같은 급, 기록만. - `Debounce`/`Throttle`·`setTimeout`/`clearTimeout` 주입 op는 백로그 — 이번 단위에 없음. **툴링 사실 둘**(설계 아님, 다음 단위가 알아야 함):