diff --git a/.claude/qa-request/m3-implementation-round12.md b/.claude/qa-request/m3-implementation-round12.md index af1f45d..209be04 100644 --- a/.claude/qa-request/m3-implementation-round12.md +++ b/.claude/qa-request/m3-implementation-round12.md @@ -32,6 +32,7 @@ | `H-225` | โ‘  | 1 | ๐ŸŸข | (`/code-review high`) ์„ธ์…˜ ํŒŒ์ผ์ด ๊ฐ์‚ฌ ๋ฃจํ”„๋ฅผ 5๋ผ์šด๋“œ์—์„œ ๋ฉˆ์ถ˜ ๊ฒƒ์ฒ˜๋Ÿผ ์„œ์ˆ (6๋ผ์šด๋“œ ์ˆ˜๋ ดยท๋ฆฌ๋ทฐ ๋ฐ˜์˜ ๋ฏธ๊ธฐ์žฌ) | โœ… ๋ฐ˜์˜ โ€” ์„ธ์…˜ ํŒŒ์ผยทsummary์— 6๋ผ์šด๋“œ ์ˆ˜๋ ด๊ณผ ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ๊นŒ์ง€ ๊ธฐ๋ก | | `H-226` | ๊ธฐ๊ฐ | 1 | ๐ŸŸข | (`/code-review high`) `process` (A)/(B) ๊ผฌ๋ฆฌ ๋ณ‘ํ•ฉยท(B) ์ด์ค‘ ํ• ๋‹น ์ œ๊ฑฐยท`retractFrom` ์žฌ์กฐํšŒ ์ œ๊ฑฐ ๋ฆฌํŒฉํ„ฐ ์ œ์•ˆ | โŒ ๋ฐ˜์˜ ์•ˆ ํ•จ โ€” ํ™•์ • ์˜์‚ฌ์ฝ”๋“œ์™€์˜ 1:1 ์œ ์ง€๊ฐ€ ์šฐ์„ ์ด๊ณ  ์‹ค์ธก ๋ณ‘๋ชฉ ์•„๋‹˜("์‹ค์ œ๋กœ ๊ด€์ธก๋œ ๋ฌธ์ œ์—๋งŒ ๊ตฌ์กฐ"). ๋ฉ”์‹œ์ง€ drift ์šฐ๋ ค๋Š” `H-223`์˜ ๊ณต์šฉ `noRetractorMessage`๋กœ ์†Œ๋ฉธ | | `H-227` | โ‘  | 1 | ๐ŸŸก | (`/code-review high`) `local Dispatch = {} :: any`๊ฐ€ ์ƒ์‚ฐ์ž ํ‘œ๋ฉด์„ `quad-types` ์„ ์–ธ๊ณผ ๋Œ€์กฐ ๋ถˆ๋Šฅ์œผ๋กœ ๋งŒ๋“ฆ โ€” `H-25`๊ฐ€ ๋ง‰์œผ๋ ค๋˜ ๋“œ๋ฆฌํ”„ํŠธ๊ฐ€ ์ƒ์‚ฐ์ž ์ชฝ์—์„œ ๋ฌด๊ฒ€์‚ฌ | โœ… ๋ฐ˜์˜ โ€” ๋กœ์ปฌ ํ•จ์ˆ˜ ์ •์˜ ํ›„ `local Dispatch: Dispatch = { โ€ฆ }` ํƒ€์ž… ์ฃผ์„ ์กฐ๋ฆฝ(analyze๊ฐ€ ํ‘œ๋ฉด ๊ฒ€์‚ฌ) | +| `H-228` | โ‘  | 1 | ๐ŸŸข | (ํƒ์‚ฌ์ž) `describeHandler`๊ฐ€ `name` ๋ถ€์žฌ ์‹œ `"?"`๋ฅผ ์ด๋ฆ„ ์ž๋ฆฌ์— ์ฐ๋Š”๋‹ค โ€” `dispatch-core-plan.md` "ํ•ธ๋“ค๋Ÿฌ ๊ณ„์•ฝ" ์ ˆ์˜ `H-214` ๋ธ”๋ก์€ *"์—†์œผ๋ฉด priority๋งŒ ๋ณด์ธ๋‹ค"*. ์‹ค์ธก: `handler priority tie between "?" (priority 5) and "?" (priority 5)` | โœ… ๋ฐ˜์˜ โ€” ์ฝ”๋“œ๋ฅผ ๋ฌธ์„œ์— ๋งž์ถค: ์ด๋ฆ„ ๋ถ€์žฌ ์‹œ `(priority N)`๋งŒ | ### `H-212` โ€” base ์˜์‚ฌ์ฝ”๋“œ error๊ฐ€ error ๊ณ„์•ฝ ์ด์ „ ํ‘œ๊ธฐ๋กœ ๋‚จ์•„ ์žˆ์—ˆ๋‹ค (โ‘ ) @@ -76,6 +77,23 @@ quad-debug์— ์œ ๋ฆฌ" ํ•ญ๋ชฉ์— ์žˆ๋‹ค(์ฒ˜์Œ์—” `research/debug-tooling-plan.md ์–‘์ชฝ ์ด๋ฆ„, ๋งˆ์ปค ์ œ๊ฑฐ) / `dispatch-core-plan.md` "ํ•ธ๋“ค๋Ÿฌ ๊ณ„์•ฝ" ์ ˆ ์‹ ์„ค ํ•ญ๋ชฉ / `spec.dispatch` 11๋ฒˆ(์ด๋ฆ„ ์™•๋ณตยท๋ถ€์žฌ ์‹œ nil). ์ฝ”๋“œ ๋งˆ์ปค 0. +### `H-228` โ€” ์ง„๋‹จ ๋ผ๋ฒจ์˜ ์ด๋ฆ„ ๋ถ€์žฌ ํ‘œ๊ธฐ๊ฐ€ ๋ฌธ์„œ์™€ ๋‹ค๋ฅด๋‹ค (โ‘ , ํƒ์‚ฌ์ž) + +`Dispatch/init.luau`์˜ `describeHandler(h)`๋Š” `` `"{h.name or "?"}" (priority {h.priority})` `` +โ€” `name`์ด ์—†์œผ๋ฉด `"?"`๋ผ๋Š” ์ž๋ฆฌํ‘œ์‹œ์ž๋ฅผ ์ด๋ฆ„์ฒ˜๋Ÿผ ์ฐ๋Š”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ +`dispatch-core-plan.md` "ํ•ธ๋“ค๋Ÿฌ ๊ณ„์•ฝ" ์ ˆ์˜ `H-214` ํ™•์ • ๋ธ”๋ก์€ **"์—†์œผ๋ฉด +priority๋งŒ ๋ณด์ธ๋‹ค"** โ€” ๋ฌธ์„œ๊ฐ€ ์ด๋ฏธ ๋‹ต์„ ๊ฐ€์ง„ ์ž๋ฆฌ๋ผ โ‘ ์ด๋‹ค(๋™๋ฅ  ๊ฒฝ๊ณ ์™€ +`H-223`์˜ retractor ์ƒ๋žต ๋ฉ”์‹œ์ง€ ์–‘์ชฝ์ด ์ด ๋ผ๋ฒจ์„ ์“ด๋‹ค). ์‹ค์ธก(๋ฌด์ด๋ฆ„ ๋™๋ฅ  +๊ฒฝ๊ณ , ํƒ์‚ฌ์ž ํ”„๋กœ๋ธŒ): + +``` +quad.Dispatch: handler priority tie between "?" (priority 5) and "?" (priority 5) โ€” ties have no defined order; offset from a HANDLER_PRIORITY_* band +``` + +์ˆ˜์ •์€ ๋ฉ”์ธ ์„ธ์…˜ ๋ชซ(ํƒ์‚ฌ์ž๋Š” round12.md๋งŒ ํŽธ์ง‘) โ€” ์ฝ”๋“œ๊ฐ€ ๋ฌธ์„œ๋ฅผ ๋”ฐ๋ผ +์ด๋ฆ„ ๋ถ€๋ถ„์„ ์ƒ๋žตํ•˜๋“ (`(priority 5)`๋งŒ), ๋ฌธ์„œ์— ์ž๋ฆฌํ‘œ์‹œ์ž ํ‘œ๊ธฐ๋ฅผ ๋ช…์‹œํ•˜๋“  +์–ด๋А ์ชฝ์ด๋“  ํ•œ ์ค„์ด๋‹ค. ์ˆœ์ˆ˜ ์ง„๋‹จ ๋ฌธ์ž์—ด์ด๋ผ ๊ณ„์•ฝยท๋ถ€๊ธฐ ์˜ํ–ฅ ์—†์Œ. + ## ยง4 ๋ฐฐ์น˜ ๋ฌธํ•ญ์ง€ (์‚ฌ์šฉ์ž๊ฐ€ ์ฝ์„ ์œ ์ผํ•œ ์ž๋ฆฌ) **โญ [2026-08-31 ํšŒ์‹  1]** ์‚ฌ์šฉ์ž: *"๋ฐฐ์น˜ ๋ฌธํ•ญ์€ ์ค‘๊ฐ„ํ™•์ธ ์™„๋ฃŒํ–ˆ์–ด. ์ „๋ถ€ @@ -111,6 +129,39 @@ quad-debug์— ์œ ๋ฆฌ" ํ•ญ๋ชฉ์— ์žˆ๋‹ค(์ฒ˜์Œ์—” `research/debug-tooling-plan.md - **[2026-08-31]** `H-165`(quad-types์— `export type` ์ถ”๊ฐ€ ์‹œ pesde shim ์žฌ์ƒ์„ฑ ํ•„์š”)๋ฅผ ์˜ˆ๊ณ ๋Œ€๋กœ ๋ฐŸ์•˜๊ณ  `pesde install` ์žฌ์‹คํ–‰์œผ๋กœ ํ•ด์†Œ โ€” `Handler`/`Dispatch`๊ฐ€ shim์— ์˜ฌ๋ผ์˜ด. ์ƒˆ ๋ฐœ๊ฒฌ ์•„๋‹˜(๋ฌธ์„œ ๊ทธ๋Œ€๋กœ). +- **[2026-08-31, ๋‹จ์œ„ 1 ํƒ์‚ฌ์ž]** `./scripts/test.sh` ์ „์ฒด exit 0 + (`luau-analyze` ๋ฌด์ถœ๋ ฅ ํด๋ฆฐ ํฌํ•จ), `grep -rn "TODO(H-"` 0๊ฑด, ์ž‘์—… ํŠธ๋ฆฌ + ํด๋ฆฐ. `Dispatch/init.luau`๋ฅผ "Dispatch ์ฒด์ธ" ์ ˆ ์˜์‚ฌ์ฝ”๋“œ์™€ ์žฌ์ฐจ ํ•œ ์ค„ + ๋Œ€์กฐ โ€” (A)/(B) ๋ถ„๊ธฐยท`NOOP` ๊ต์ฒด/์ ์œ  ๋งˆ์ปคยท`SetStrong` ์„ ํ–‰ยทretractor ์ƒ๋žต + error ์–‘์ชฝยท`retractFrom` ๊ผฌ๋ฆฌ ์—ญ์ˆœ/ํ•ญ์ƒ ์†Œ๋น„/๊ตฌ๋ฉ error(level 1) ์ „๋ถ€ + ์ผ์น˜, ์ „์‚ฌ ์ฐจ์ด๋Š” `H-228`(์ง„๋‹จ ๋ผ๋ฒจ ํ‘œ๊ธฐ) ํ•˜๋‚˜๋ฟ. +- **[2026-08-31, ๋‹จ์œ„ 1 ํƒ์‚ฌ์ž] `getHandler`๊ฐ€ ๋งค์น˜ ์‹คํŒจ์— error๊ฐ€ ์•„๋‹ˆ๋ผ + `nil`์„ ๋Œ๋ ค์ฃผ๋Š” ๊ฑด ๋ฐœ๊ฒฌ์ด ์•„๋‹ˆ๋‹ค** โ€” brief ยง6 ํ–‰์€ error๋ฅผ `getHandler` + ๊ด„ํ˜ธ ์•ˆ์— ์ ์—ˆ์ง€๋งŒ, ์ •๋ณธ์ธ `dispatch-core-plan.md`์˜ "`Dispatch.process`/ + `Handler.process` ์ด๋ฆ„ ๊ฒน์นจ" ํ•ญ๋ชฉ์ด `getHandler(inst,k,v): Handler?` = + ์ˆœ์ˆ˜ ์Šค์บ”/๋ถ€์ž‘์šฉ ์—†์Œ, error๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ(`process`)์˜ ์ผ๋กœ ์ด๋ฏธ + ๊ฐˆ๋ผ๋’€๋‹ค. ์ฝ”๋“œยท`quad-types`ยทspec 1๋ฒˆ์ด ์ „๋ถ€ ์ •๋ณธ ์ชฝ์ด๋‹ค. +- **[2026-08-31, ๋‹จ์œ„ 1 ํƒ์‚ฌ์ž] `Handler` ํƒ€์ž…์˜ ์ •์˜ ์œ„์น˜(quad-types ์†Œ์œ , + `Dispatch/Handler.luau`๋Š” ์žฌ์ˆ˜์ถœ)๋Š” ยง6 ํ‘œ๊ธฐ("quad-types โ€ฆ `Handler` ํƒ€์ž… + ์žฌ์ˆ˜์ถœ")์™€ ๋ฐฉํ–ฅ์ด ๋ฐ˜๋Œ€๋กœ ์ฝํžˆ์ง€๋งŒ ๊ตฌํ˜„ ๋ฐฉํ–ฅ์ด ์œ ์ผํ•˜๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ชฝ์ด๋‹ค** โ€” quad-types๋Š” + quad-base๋ฅผ requireํ•  ์ˆ˜ ์—†๊ณ (์˜์กด์ด base โ†’ types ๋‹จ๋ฐฉํ–ฅ) `Dispatch` + ํƒ€์ž…์ด `Handler`๋ฅผ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ์ •์˜๋Š” types ์ชฝ์—๋งŒ ์‚ด ์ˆ˜ ์žˆ๋‹ค. ์žŽ ์œ ์ง€ + ๊ณ„์•ฝ("Dispatch๋ฅผ ๋˜์ฐธ์กฐํ•˜์ง€ ์•Š๋Š”๋‹ค")์€ ๊ทธ๋Œ€๋กœ ์„ฑ๋ฆฝ. +- **[2026-08-31, ๋‹จ์œ„ 1 ํƒ์‚ฌ์ž] spec์ด ์•ˆ ํƒœ์šฐ๋˜ ๊ฒฝ๋กœ ์…‹์„ ํ”„๋กœ๋ธŒ๋กœ ์‹ค์ธก, + ์ „๋ถ€ ๊ณ„์•ฝ๋Œ€๋กœ** (์Šคํฌ๋ฆฝํŠธ๋Š” ์Šคํฌ๋ž˜์น˜, ๋‚จ๊ธฐ์ง€ ์•Š์Œ): (1) `H-223` โ€” + retractor ์ƒ๋žต ๋ฉ”์‹œ์ง€๊ฐ€ nameยทpriorityยทkยทindex๋ฅผ ์‹ค์ œ๋กœ ์‹ฃ๋Š”๋‹ค + (`handler "MyLeaf" (priority 7) returned no retractor at key SomeKey, + index 1`). (2) `H-103` โ€” `h.process`๊ฐ€ ๋˜์ง€๋ฉด `NOOP` ๋งˆ์ปค๊ฐ€ ๋‚จ๊ณ , ์ดํ›„ + `retractFrom`์€ ์กฐ์šฉํžˆ ์†Œ๋น„(์—๋Ÿฌ ์—†์Œ, ์ •๋ฆฌ 0ํšŒ)ํ•˜๋ฉฐ ๊ทธ ๋’ค ์žฌ์„ค์น˜ยท์ฒ ๊ฑฐ๋Š” + ์ •์ƒ(๋ฌธ์„œ๊ฐ€ ๋งํ•œ "๋ถ€๊ธฐ ๋ฌด๊ฒฐ์„ฑ ๋น„๋ณด์žฅ + ํฌ๋ž˜์‹œ๋Š” ์•„๋‹˜" ๊ทธ๋Œ€๋กœ). (3) ๋งค์น˜ + ์‹คํŒจ ํ›„ ๊ฐ™์€ `(inst,k)`์— ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ์ •์ƒ ๋™์ž‘ โ€” ์‹คํŒจ ๊ฒฝ๋กœ๊ฐ€ + chains์— ๋นˆ ๋ฆฌ์ŠคํŠธ ํ•˜๋‚˜๋ฅผ ๋‚จ๊ธฐ์ง€๋งŒ ์˜์‚ฌ์ฝ”๋“œ๋„ ๊ฐ™์€ ์ˆœ์„œ(list ํ™•๋ณด๊ฐ€ + getHandler๋ณด๋‹ค ์•ž)๋ผ ์ „์‚ฌ ์ฐจ์ด ์•„๋‹˜. +- **[2026-08-31, ๋‹จ์œ„ 1 ํƒ์‚ฌ์ž]** `addHandler`์˜ `table.sort`๋Š” ๋ถˆ์•ˆ์ • + ์ •๋ ฌ์ด๋ผ **๋™๋ฅ ** ํ•ธ๋“ค๋Ÿฌ๋ผ๋ฆฌ์˜ ์Šค์บ” ์ˆœ์„œ๊ฐ€ ๋“ฑ๋ก์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ๋’ค์„ž์ผ + ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋ฌธ์„œ๊ฐ€ ์ด๋ฏธ ํ™•์ •ํ•œ "๋™๋ฅ  tiebreak ๊ทœ์น™์€ ๊ฐ•์ œํ•˜์ง€ + ์•Š๋Š”๋‹ค"(์šฐ์„ ์ˆœ์œ„ ๋™๋ฅ /๋งค์น˜ ์‹คํŒจ ์ฒ˜๋ฆฌ ์ ˆ) ๋ฒ”์œ„ ์•ˆ์ด๋‹ค โ€” ๊ฐ€๋“œยท์•ˆ์ •ํ™” + ์ œ์•ˆ ์•ˆ ํ•จ(๊ด€์ธก๋œ ๋ฌธ์ œ ์—†์Œ ์›์น™). ## ยง6 ๋‚จ์€ ์˜์‹ฌ (๋ฐœ๊ฒฌ์€ ์•„๋‹ˆ์ง€๋งŒ ๋‹ค์Œ ๋ผ์šด๋“œ๊ฐ€ ํŒŒ๋ณผ ์ž๋ฆฌ) diff --git a/quad-base/src/Dispatch/init.luau b/quad-base/src/Dispatch/init.luau index 7f001fe..c712d0d 100644 --- a/quad-base/src/Dispatch/init.luau +++ b/quad-base/src/Dispatch/init.luau @@ -80,9 +80,10 @@ local BRAND_PROBES = { } -- Diagnostics label for a handler in error/warning messages โ€” uses the --- optional `name` contract field (`H-214` (a)), falls back to priority. +-- optional `name` contract field (`H-214` (a)); when absent, only the +-- priority shows (`H-228` โ€” the confirmed wording is "์—†์œผ๋ฉด priority๋งŒ"). local function describeHandler(h: Handler): string - return `"{h.name or "?"}" (priority {h.priority})` + return if h.name ~= nil then `"{h.name}" (priority {h.priority})` else `(priority {h.priority})` end local function Init(module: any)