Imported from rblood79/composition (
.claude/skills/review-adr/SKILL.md). Install upstream withnpx skills add rblood79/composition --skill review-adr. Copyright stays with the author.
Review ADR: ์ํคํ ์ฒ ๊ฒฐ์ ๋ฌธ์ ๊ฒ์ฆ
ADR ๋ฌธ์์ ๊ตฌ์กฐ์ ์๊ฒฐ์ฑ, ์ฝ๋ ์ ํฉ์ฑ, ์ํ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฒ์ฆํฉ๋๋ค. ์ด์๋ฅผ "out of scope"๋ก ์คํตํ์ง ์์ต๋๋ค. ๋ฐ๊ฒฌ๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
๐ก๏ธ Anti-Hallucination 5๋ ๊ท์น (CRITICAL)
2026-04-20 ์ถ๊ฐ โ ๊ณผ๊ฑฐ ๋ฆฌ๋ทฐ ์ธ์ ์์ ADR ๋ณธ๋ฌธ๊ณผ ๋ถ์ผ์นํ๋ ํ์ ์ด ๋ฐ๋ณต๋๋ค. ์์ธ์ (a) subagent SendMessage ์ด์ด๋ฐ๊ธฐ ์ ์๋ฌธ ์ปจํ ์คํธ ์์ค, (b) Phase 4 ํ ํ๋ฆฟ slot-fill ์์ฑ ํธํฅ, (c) reviewer ์ ์ผ๋ฐ prior ๋ฅผ ํน์ ADR ์ ํฌ์. ์๋ 5๋ ๊ท์น์ ์ด๋ฅผ ์ฐจ๋จํ๋ค.
- ์ฆ๊ฑฐ ์์ผ๋ฉด ํ์ ์์ โ ๋ชจ๋ ๊ตฌ์กฐ/์ฝ๋/์ํ ํ์ ์
file:line๋๋ ์ ํํ ์น์ ์ธ์ฉ 1๊ฐ ์ด์ ํ์. ์ฆ๊ฑฐ ๋ฏธ์ ์ ํ์ ์ ์๋UNVERIFIED๋ถ๋ฅ. - "์ด์ 0๊ฑด" ์ ๋น โ Phase 4 ์ HIGH/MEDIUM/LOW ์ด์๊ฐ ์์ผ๋ฉด
์ด์ ์์ โ ์น์ธ ๊ฐ๋ฅ์ผ๋ก ๋ณด๊ณ . ๊ฒฐํจ์ ๋ง๋ค์ด๋ด๋ ค ํ์ง ์๋๋ค. "reviewer ๊ฐ ๊ฒฐํจ์ ์ฐพ์ง ๋ชปํ๋ฉด ๋ถ์คํ๋ค" ๋ ํธํฅ ๊ธ์ง. - ํ
ํ๋ฆฟ slot ๊ฐ์ ๊ธ์ง โ Phase 4 ํ
์ด๋ธ์ ๋ชจ๋ ํ์ ์ฑ์ธ ํ์ ์์. ํด๋นํ์ง ์๋ slot ์ ์๋ต ๊ฐ๋ฅ (
N/A - ํด๋น ์น์ ์์๋ช ์). - ์๋ฌธ ๋จ 1ํ ์ฌํ์ธ ์๋ฌด โ Phase 4 ๋ณด๊ณ ์ง์ , ๊ฐ ํ์ ์ ์ธ์ฉ ๋ผ์ธ ๋ฒํธ๋ฅผ ์๋ฌธ์์ ์ฌํ์ธ. ๊ธฐ์ต์ด๋ summary ์์ ์ธ์ฉ ๊ธ์ง.
- Subagent 1-shot ์์น โ review-adr ์ subagent ์ ์์ ์, ์ค๊ฐ ์ค๋จ ํ SendMessage ์ด์ด๋ฐ๊ธฐ ๊ธ์ง. agent context ๊ฐ autocompact ๋๋ฉด ์๋ฌธ ์์ค โ hallucination ํ์ฐ. ์ค๋จ๋์๋ค๋ฉด main ์ด ์ง์ ์ฌ์ํ ๋๋ ์ agent 1-shot.
์ฌ์ ์ค๋น (Setup)
Read docs/adr/README.md โ ์ ์ฒด ADR ํํฉ ํ์
Read {๋์ ADR ๋ณธ๋ฌธ} โ 100% ์ ์ฒด ์ฝ๊ธฐ (์ ์ญ ๊ธ์ง)
Read {๋์ ADR breakdown} (์์ผ๋ฉด) โ ๊ตฌํ ์์ธ ํ์ธ
Read .claude/rules/adr-writing.md โ ํ
ํ๋ฆฟ ์ฒดํฌ๋ฆฌ์คํธ (๋์ seed ํฌํจ)
Read .claude/rules/measurement-validity.md โ Gate ์์น์ leakage 8-ํจํด + ์ฐฉ์ ์ 5-์ง๋ฌธ (Phase 3-H ํ์ ๊ธฐ์ค)
์ฆ๊ฑฐ ์บ์ ์์: ์ด ์์ ๋ถํฐ file:line ๋๋ ADR:line_range ํํ๋ก ์ธ์ฉํ ๊ฒ๋ง์ ํ์ ๊ทผ๊ฑฐ๋ก ์ฌ์ฉ. ๊ธฐ์ต/์ถ์ธก์ ๊ทผ๊ฑฐ ์๋.
Phase 1: ๊ตฌ์กฐ ๊ฒ์ฆ (Risk-First ํ ํ๋ฆฟ ๋์กฐ)
ํ์ ์น์ ์ฒดํฌ๋ฆฌ์คํธ (adr-writing.md ์ 7๊ฐ + ๋์ seed)
| ์น์ | ํ์ธ ๊ธฐ์ค | ์ฆ๊ฑฐ ํ์ |
|---|---|---|
| Context | ์ธก์ ๊ฐ๋ฅํ hard constraint 1๊ฐ ์ด์ | ADR:line N |
| Alternatives Considered | ์ต์ 2๊ฐ ๋์ + ๊ฐ ๋์์ 4์ถ ์ํ ํ๊ฐ | ADR:line N-M |
| Risk Threshold Check | ํ ์ด๋ธ + HIGH+ ๋ฃจํ ํ์ | ADR:line N |
| Decision | Alternatives ๋ค, ์ํ ์์ฉ ๊ทผ๊ฑฐ + ๊ธฐ๊ฐ ์ฌ์ | ADR:line N |
| ๊ตฌํ ์์ธ ๋ถ๋ฆฌ | ๊ตฌํ ์์ธ๊ฐ design ํ์ผ์ ์๋๊ฐ (ํฌ์ธํฐ๋ง ๋ณธ๋ฌธ์) | ADR:line N ๋งํฌ |
| Risks | Decision ๋ค / Gates ์, ID/์ํ/์ฌ๊ฐ๋/๋์ ํ (๋๋ "์์กด HIGH ์ํ ์์") | ADR:line N |
| Gates | Gate ํ ์ด๋ธ ๋๋ "์์กด HIGH ์ํ ์์" ๋ช ์ | ADR:line N |
adr-writing.md ๋์ seed ํ์ธ โ ํด๋น seed ๊ฐ ํ์ฑํ๋์ด ์์ผ๋ฉด (์: 2026-04-20 ๋ฐ๋ณต ํจํด ์ ์ฐจ๋จ โ ํํ seed ํญ๋ชฉ, ๊ฐ์ ๋ฏธ๊ณ ์ , adr-writing.md ์ฐธ์กฐ) ์ถ๊ฐ ๊ฒ์ฆ. ๋นํ์ฑํ๋์์ผ๋ฉด ์คํต.
4์ถ ์ํ ํ๊ฐ
๊ฐ ๋์์ ๊ธฐ์ /์ฑ๋ฅ/์ ์ง๋ณด์/๋ง์ด๊ทธ๋ ์ด์
4์ถ์ด ๋ชจ๋ ํ๊ฐ๋๋์ง ํ์ธ. ๋๋ฝ ์ถ์ missing axis: <์ถ> ์ผ๋ก ๊ธฐ๋ก.
๊ตฌ์กฐ ๊ฒ์ฆ ํ์ ๊ท์น
- ์น์
์กด์ฌํ๊ณ ๋ด์ฉ์ด adr-writing.md ์๊ตฌ ์ถฉ์กฑ โ
PASS + ํ์ง(HIGH/MED/LOW) - ์น์
์กด์ฌํ์ง๋ง ๋ด์ฉ ๋ถ์ค โ
PARTIAL+ ๋ถ์ค ๋ถ๋ถ ์ธ์ฉ - ์น์
์์ โ
FAIL+ ADR ์ ์ด๋ line ๋ฒ์์ ์์ด์ผ ํ๋์ง ๋ช ์
reviewer prior ํฌ์ ๊ธ์ง: "์ผ๋ฐ์ ์ผ๋ก Gate ๊ฐ ์ฝํ๋ค" ๋ ์ ์ ๋ก PASS ๋ฅผ FAIL ๋ก ๋ด๋ฆฌ์ง ์๋๋ค. ์ค์ ๋ณธ๋ฌธ line ํ์ธ ํ ํ์ .
Phase 2: ์ฝ๋ ๊ฒ์ฆ (์ฃผ์ฅ vs ์ค์ )
ADR์์ ์ธ๊ธ๋ ํ์ผ, ์ธํฐํ์ด์ค, ํจ์, ์์, ๋ผ์ธ ๋ฒํธ๋ฅผ ์ค์ ์ฝ๋์์ ํ์ธํฉ๋๋ค. ์ฃผ์ฅ๋ง ์ฝ๊ณ PASS ์ฒ๋ฆฌํ์ง ์์ต๋๋ค. ์ฆ๊ฑฐ ์๋ VERIFIED ํ์ ๊ธ์ง.
๊ฒ์ฆ ์ ์ฐจ
# 1. ADR์์ ์ธ๊ธ๋ ํ์ผ ๊ฒฝ๋ก ์ถ์ถ โ Glob ์ผ๋ก ์กด์ฌ ํ์ธ
Glob {์ธ๊ธ๋ ํ์ผ ํจํด}
# 2. ์ธ๊ธ๋ ํจ์/์ธํฐํ์ด์ค/์์ โ Grep ์ผ๋ก line ๋ฒํธ ํ์ธ
Grep "{ํจ์๋ช
|์ธํฐํ์ด์ค๋ช
}" --type=ts -n
# 3. "ํ์ฌ ~๋ฅผ ์ฌ์ฉ ์ค" ์ฃผ์ฅ โ ์ค์ ์ฌ์ฉ ํจํด Grep
Grep "{์ฃผ์ฅ๋ ํจํด}" <๊ฒฝ๋ก>
# 4. ๋ผ์ธ ๋ฒํธ ์ธ์ฉ๋ ๊ฒฝ์ฐ โ ํด๋น line ยฑ5 Read ๋ก ๋งฅ๋ฝ ํ์ฆ
Read {ํ์ผ} offset:N-5 limit:10
๊ฒ์ฆ ๊ฒฐ๊ณผ ๋ถ๋ฅ (3ํ ์ค ํ๋)
| ๋ถ๋ฅ | ์๋ฏธ | ํ์ ์ธ์ฉ |
|---|---|---|
| VERIFIED | ์ฝ๋/๋ผ์ธ์์ ํ์ธ๋จ, ์ฃผ์ฅ๊ณผ ์ผ์น | file:line |
| UNVERIFIED | ์ฝ๋์์ ๋ฐ๊ฒฌ๋์ง ์์ OR ํ์ธ ์๋ ์คํจ OR ์ธ์ฉ ๋ผ์ธ๊ณผ ๋ถ์ผ์น | ์๋ํ ๊ฒฝ๋ก |
| PARTIAL | ์ผ๋ถ๋ง ํ์ธ, ๋๋ฝ ๋ฒ์ ๊ตฌ์ฒด ๋ช ์ | ํ์ธ๋ ๋ถ๋ถ |
"์ฃผ์ฅ ์ โ ํ์ ์" โ ๋ชจ๋ ์ฃผ์ฅ์ ๊ฒ์ฆํ ํ์ ์์. ํต์ฌ ์ฃผ์ฅ (decision ๊ทผ๊ฑฐ, gate ์กฐ๊ฑด, hard constraint) ์ฐ์ . ์ฃผ๋ณ ์์ ์ skip ๊ฐ๋ฅ.
Phase 3: ์ํ ์คํธ๋ ์ค ํ ์คํธ
๋์ด๋ ์ํ ๊ฒ์ฆ
ADR์ ๊ฐ Risk ํญ๋ชฉ์ ๋ํด codebase์์ ๊ตฌ์ฒด์ ์ฆ๊ฑฐ๋ฅผ grepํฉ๋๋ค.
# ์ํ์ด ์ค์ ๋ก ์กด์ฌํ๋๊ฐ? ๊ด๋ จ ์ฝ๋ ํจํด ๊ฒ์
Grep "{์ํ ๊ด๋ จ ํค์๋}" --type=ts -n -C 3
๋๋ฝ ์ํ ํ์ (composition ํ๋ก์ ํธ ํนํ)
ADR์ ๋ช ์๋์ง ์์ ์ ์ฌ ์ํ์ ๋ฅ๋์ ์ผ๋ก ์กฐ์ฌ:
| ์ํ ์์ญ | ํ์ ๋ฐฉ๋ฒ |
|---|---|
| ๋ ๋๋ง ํ๋ฆฌํฐ | CSSโSkia ๊ฒฝ๋ก ์์ชฝ์์ ๋ณ๊ฒฝ ์ํฅ grep |
| ์ฑ๋ฅ ์ ๋ฒฝ | O(n) ์ํ, WASM ๋ฐ๋ณต ํธ์ถ, ๋ถํ์ํ ๋ฆฌ๋ ๋ ํจํด |
| ๋ง์ด๊ทธ๋ ์ด์ ๊นจ์ง | ์ํฅ๋ฐ๋ ํ์ผ ์ grep, import ์ฒด์ธ ์ถ์ |
| ๋ ์ด์์ ๋ถ์์ฉ | layoutVersion 5-์ฌ๋ณผ 2๊ณ์ธต ์ฒด์ธ ์ ๊ฒ โ A(ํธ๋ฆฌ๊ฑฐ): LAYOUT_AFFECTING_PROP_KEYS (layoutInvalidation.ts, props) / NON_LAYOUT_PROPS_UPDATE (elementUpdate.ts, style blacklist) / INHERITED_LAYOUT_PROPS_UPDATE ยท B(์บ์ ์๊ทธ๋์ฒ, layoutCache.ts): LAYOUT_STYLE_KEYS (style) / LAYOUT_PROP_KEYS (props). AยทB ๋ AND, ์ถ๋ณ ๋ฐฐ์ด ์์ด |
| ์ํ ๋๊ธฐํ | Zustand โ Preview postMessage ๋๋ฝ ๊ฐ๋ฅ์ฑ |
| SSOT ์ฒด์ธ | @sync ์ฃผ์, consumer-to-consumer ์ฐธ์กฐ ๊ธ์ง |
๋์ ์ํ ๋ ๋ฒจ ๊ฒํ
- ๋ชจ๋ ๋์์ด HIGH โ ๋์ ์ถ๊ฐ ํ์ ํ๋๊ทธ
- LOW/MEDIUM ๋์์ด ์๋๋ฐ ์ ํํ์ง ์์๋ค๋ฉด โ Decision ๊ทผ๊ฑฐ ์ฌ๊ฒํ
"๋๋ฝ ์ํ ์์" ์ ๋น ์ฌ์
์ ์์ญ์์ ์ค์ ์ฆ๊ฑฐ๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด "๋๋ฝ ์ํ 0๊ฑด" ์ผ๋ก ๋ณด๊ณ . ์ต์ง๋ก ์ํ์ ๋ง๋ค์ด๋ด์ง ์๋๋ค.
Phase 3-H: ๊ทผ๋ณธ ๋ฐ๋ก (hate) โ root 1๊ฐ + first nail (2026-08-28, ๋ณํฉ ์์ โฃ)
Phase 3 ์ด "๋์ด๋ ์ํ์ด ์ค์ฌํ๋๊ฐ" ๋ฅผ ๋ณด๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, 3-H ๋ ๊ณํ ์ ์ฒด๋ฅผ ๋ฌด๋๋จ๋ฆฌ๊ณ ์ถ์ ์ฌ๋์ด ๋จผ์ ๊ณต๊ฒฉํ ์๋ฆฌ ๋ฅผ ์ฐพ๋๋ค. ์ฒดํฌ๋ฆฌ์คํธ๊ฐ ์๋๋ผ root ํ๋ + first nail ํ๋ ๋ฅผ ๋๋ ค์ค๋ค (paperthin hate ์ composition ์ฌ๊ตฌํ).
- load-bearing ๊ฐ์ ์ ์ ๋๋ค โ Decision ์ด ์ ์์ผ๋ ค๋ฉด ๋ฐ๋์ ์ฐธ์ด์ด์ผ ํ๋ ๊ฒ (๋ณดํต 1~3๊ฐ). ADR ์ด ๋ช ์ํ์ง ์์ ์๋ฌต ๊ฐ์ ์ ์ฐ์ ํ๋ค.
- ๊ณต๊ฒฉ ์ถ (ํด๋นํ๋ ๊ฒ๋ง):
- load-bearing ์ฌ์ค์ด ๊ฑฐ์ง โ Context ์ "ํ์ฌ X ๋ค" ์์ ์ด ์ฝ๋์ ๋ค๋ฆ (Phase 2 UNVERIFIED ์ ์ฐ๊ฒฐ)
- confabulation โ ์ฌํ ์ค๋ช ์ ๊ทผ๊ฑฐ๋ก ์ทจ๊ธ (๋ฆฌ๋ทฐ round 1 ์ ๊ฒฐ๋ก ์ ๊ทธ๋๋ก ์น๊ณํ ๋ฌธ์ฅ ํฌํจ)
- analogy โ isomorphism โ ์ธ๋ถ ์ฐธ์กฐ (OpenPencil / RSP / Figma ๊ด๋ก) ์ ๊ตฌ์กฐ๊ฐ composition ์๋ ์ฑ๋ฆฝํ๋ค๊ณ ๊ฐ์ โ ์ฐธ์กฐ ์ชฝ์ ์๊ณ ์ด์ชฝ์ ์๋ ์ ์ (๋ ๋ฒ์งธ host, ๋ค๋ฅธ SSOT) ๋ฅผ ์ฐพ๋๋ค
- ์ธก์ leakage โ Gate ํต๊ณผ ์์น์ oracle ์ด
measurement-validity.mdยง2 8-ํจํด์ ํด๋น โ ๊ทธ Gate ๋ ํต๊ณผ ๋ถ๊ฐ๋ฅํ๊ฑฐ๋ vacuous - ์๋น ๊ฒฝ๋ก ๋ถ์ฌ โ "๊ธฐ๊ตฌํ ์ธํ๋ผ ํ์ฑํ" ๋ฅผ ๊ทผ๊ฑฐ๋ก ์ฐ๋๋ฐ 3-grep (import/caller ยท flag ์ค๋ฐฐ์ ยท factory ๊ฒฝ์ ) ๋ฏธํต๊ณผ
- ์กฐ๊ฑด๋ถ ํธ์ต โ ํธ์ต์ด ADR ์ค์ค๋ก ์ ํ์ ์ด๋ผ ์ ์ธํ ํ์ (๋ณ๋ ADR / ์กฐ๊ฑด๋ถ Gate) ์๋ง ์คํ๋๋๋ฐ ๋น์ฉ์ ์ง๊ธ ์ ๋ถ ์ง๋ถ
- ๋ฐ๊ฒฌ์ root ํ๋ ๋ก ์ ๋๋ค โ ๊ทธ๊ฒ์ด ๋ฌด๋์ง๋ฉด ๋๋จธ์ง ๋ฐ๋ก ์ด ๋ฌด์๋ฏธํด์ง๋ ๊ฒ. ๋ชฉ๋ก ๋ฐํ ๊ธ์ง.
- first nail โ root ๊ฐ์ ์ ๊ฐ์ฅ ์ธ๊ฒ ๋ฐ์ฆํ ๊ฒ์ฌ (์๊ฐ/๋น์ฉ/ํ๋ณธ). ๋ฐ๋์ ๊ทธ ๊ฐ์ ์์ ์ธ์์ง ํ๋ก๊ทธ๋จ๋ณด๋ค ์ธ์ผ ํ๋ค. ์ด๋ฏธ Gate ์ ๊ฐ์ ๊ฒ์ฌ๊ฐ ์์ผ๋ฉด "G{n} ์ด ์ปค๋ฒ" ๋ก ์ข ๊ฒฐ.
- ํ์ ๋งคํ: first nail ์ด ์ด๋ Gate ์๋ ์๊ณ root ๊ฐ Decision ์ ๋ฌด๋๋จ๋ฆฌ๋ ์ฑ์ง์ด๋ฉด ์ด์ (์ฌ๊ฐ๋ = root ๊ฐ ์ฃฝ์ด๋ ๊ฒ์ ํฌ๊ธฐ; ์นดํ
๊ณ ๋ฆฌ
evidence-missing/alternative-strawman/other). Gate ๊ฐ ์ด๋ฏธ ์ปค๋ฒํ๋ฉด ์ด์ ์๋ โ ๋ณด๊ณ ์ "hate: G{n} ์ปค๋ฒ" 1์ค.
๊ท์น: ๊ณต๊ฒฉ๋ง ํ๋ค โ ๊ฐ์ ์์ ๋ค๋ฅธ reflex. root ๋ ์ง์ง load-bearing ์ด์ด์ผ ํ๋ค (๊ทธ๊ฒ ์์ด๋ ๊ณํ์ด ์๋ฉด root ๊ฐ ์๋๋ค). first nail ์ด ํ๋ก๊ทธ๋จ๋ณด๋ค ๋น์ธ๋ฉด nail ์ด ์๋๋ค. ์ ์ ํ์ ์ข
๊ฒฐ ๊ณ์ฝ (CLAUDE.md ยง์ ์ ยท๊ด์ ) ๊ณผ์ ๊ด๊ณ: ์ด๋ฏธ ์น์ธ๋ round ๊ฐ ์๋ ADR ์์ 3-H ๊ฐ ์ ์ ์์ค root ๋ฅผ ์ฐพ์ผ๋ฉด ๊ธฐ๋กํ๋ ์ฌ์ง๋ฌธํ์ง ์๋๋ค โ ์ด์๋ ๋ค์ ์ฐฉ์ ์กฐ๊ฑด (Phase 0 / ๊ธฐ์ค์ ๊ฐฑ์ ) ์ผ๋ก deferred ํ๊ณ , ์ฌ๊ฐ๋ ์ฌ์ฉ์ ์ฌ์ ๊ธฐยทscope ๋ณ๊ฒฝยท์์กด ๋ฐ์ ์ฆ๊ฑฐ 3๊ฒฝ๋ก๋ฟ.
Phase 3-P: ๋ ์ฆ ๋์กฐ (prism) โ ์กฐ๊ฑด๋ถ (2026-08-28)
์คํ ์กฐ๊ฑด: HIGH ์ํ โฅ 1 ๋๋ breakdown phase โฅ 3 ์ธ ADR ๋ง (๋ณต์ ๋ ์ฆ๋ opt-in ๋น์ฉ โ ์๋ ด์ด ์๋ ์ฆ๋ช ์ผ๋ก ๋๊ฐํ๋ฉด ์ ๋๋ค). ์กฐ๊ฑด ๋ฏธ๋ฌ์ด๋ฉด "prism: ํด๋น ์์" 1์ค.
- ADR ์ ๋๊น์ง ์ฝ์ ๋ค ์๋ก ๋ค๋ฅธ failure mode ํ๋๋น ๋ ์ฆ ํ๋ ๋ฅผ ์ด ADR ์ ๋ง์ถฐ ์๋ก ๊ณ ๋ฅธ๋ค (2~5๊ฐ) โ ์: ์ ํฉ์ฑ/SSOT ยท ๋น์ฉ/์ฑ๋ฅ ยท ์ธก์ ๋ฌด๊ฒฐ์ฑ ยท ๋๋๋ฆผ/rollout ยท ์ฌ์ฉ์ ์ ๋ ์๋๋ฆฌ์ค. ๊ฐ์ failure mode ๋ฅผ ๊ณต์ ํ๋ ๋ ๋ ์ฆ๋ ํ๋๋ค ("๋ณด์ ๋ฆฌ๋ทฐ์ด" ์ "์๋์ด ๋ณด์ ๋ฆฌ๋ทฐ์ด" ๋ ๋ ์ฆ ํ๋).
- ๋ ์ฆ๋ง๋ค ํ ์ค ํ์ (pass / fail / unclear) + load-bearing ์ด์ ํ๋. ๋ชฉ๋ก์ ๋ด๋ ๋ ์ฆ๋ hedging ์ด๋ค.
- ํ์ ์ ๋ฌถ๋๋ค: ์ ์ ์ผ์น / ๋ค๋ฅธ ์ด์ ๋ก ์ผ์น / ๋ถ์ผ์น.
- ๋ถ์ผ์น๊ฐ ์์ผ๋ฉด ๊ทธ๊ฒ์ ์ผ์น ๋๋ owner ๊ฐ ์๋ ๊น๋ํ ๋ถ๊ธฐ๋ก ๋ฐ๊ฟ ์ง๋ฌธ ํ๋ ๋ฅผ ๋ธ๋ค โ ์ด ์ง๋ฌธ์ด ์ฐ์ถ๋ฌผ์ด๋ค. ํ๊ท ๋ด์ง ์๋๋ค.
- ์ ์ ์ผ์น๋ฉด ๊ณต์ ํ์ + 2๊ฐ ์ด์ ๋ ์ฆ์์ load-bearing ์ด์๋ ์ด์ ๋ง ๋ณด๊ณ . ๋ถ์ผ์น๋ฅผ ๋ง๋ค์ด๋ด์ง ์๋๋ค โ ์์ผ๋ฉด ์๋ค๊ณ ์ฐ๊ณ ๋.
Phase 3.5: Pre-Report Evidence Freeze (CRITICAL)
Phase 4 ๋ณด๊ณ ์ง์ ํ์ ๋จ๊ณ. ์ง๊ธ๊น์ง ์์งํ ํ์ ์ค file:line ์ธ์ฉ์ด ์๋ ๊ฒ๋ง ์ต์ข
๋ณด๊ณ ์ ํฌํจ์ํจ๋ค. ์ธ์ฉ ์๋ ํ์ ์ Phase 4 ์์ ์ ์ธํ๊ฑฐ๋ UNVERIFIED ๋ก ๋ค์ด๊ทธ๋ ์ด๋.
# ์ฒดํฌํฌ์ธํธ (mental check):
1. ๊ฐ VERIFIED ํ์ ์ file:line ์๋๊ฐ?
2. ๊ฐ FAIL ํ์ ์ ADR ์ line ์ธ์ฉ ์๋๊ฐ?
3. ๋ชจ๋ "๋๋ฝ ์ํ ๋ฐ๊ฒฌ" ํญ๋ชฉ์ grep ๊ฒฐ๊ณผ ์๋๊ฐ?
4. Phase 2 ์์ UNVERIFIED ๋ถ๋ฅ๋ ํญ๋ชฉ์ Phase 4 ์์ FAIL ๋ก ์น๊ฒฉํ์ง ์์๋๊ฐ?
์ฆ๊ฑฐ ๋ถ์กฑ ์ ๋์: ํด๋น ํ์ ์ ์ญ์ ํ๊ฑฐ๋ UNVERIFIED - evidence missing ์ผ๋ก ํ๊ธฐ. ๋ฌด์ฆ๊ฑฐ ๋จ์ ๊ธ์ง. Phase 3-H ์ root / 3-P ์ ๋ ์ฆ ์ด์ ๋ ๊ฐ์ ๊ท์น โ ADR:line ๋๋ file:line ์ธ์ฉ ์๋ root ๋ ๋ณด๊ณ ์์ ์ ์ธ.
Phase 4: ๊ฒฐ๊ณผ ๋ณด๊ณ
ํ์ (slot ์ ๋ถ ์ฑ์ธ ํ์ ์์)
## ADR ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ: ADR-NNN {์ ๋ชฉ}
### ๊ตฌ์กฐ ๊ฒ์ฆ
| ์น์
| ํ์ | ํ์ง | ์ธ์ฉ |
| ----------------------------------- | ----------------- | ------------ | ------------ |
| Context | PASS/PARTIAL/FAIL | HIGH/MED/LOW | `ADR:line N` |
| Alternatives (2๊ฐ+) | PASS/PARTIAL/FAIL | HIGH/MED/LOW | `ADR:line N` |
| 4์ถ ์ํ ํ๊ฐ | PASS/PARTIAL/FAIL | HIGH/MED/LOW | `ADR:line N` |
| Risk Threshold Check | PASS/PARTIAL/FAIL | HIGH/MED/LOW | `ADR:line N` |
| Decision ์ํ ์์ฉ ๊ทผ๊ฑฐ | PASS/PARTIAL/FAIL | HIGH/MED/LOW | `ADR:line N` |
| Risks (Decision ๋ค/Gates ์, ID ํ) | PASS/PARTIAL/FAIL | HIGH/MED/LOW | `ADR:line N` |
| Gates | PASS/PARTIAL/FAIL | HIGH/MED/LOW | `ADR:line N` |
### ์ฝ๋ ๊ฒ์ฆ (ํต์ฌ ์ฃผ์ฅ๋ง)
| ์ฃผ์ฅ | ํ์ | ๊ทผ๊ฑฐ |
| -------- | --------------------------- | --------------------- |
| "{์ฃผ์ฅ}" | VERIFIED/UNVERIFIED/PARTIAL | `file:line` ๋๋ ์๋ |
### ์ํ ํ๊ฐ
| ์ํ | ์ฆ๊ฑฐ | ์ฌ๊ฐ๋ | ์ํ |
| ---------------- | ----------- | ------------ | -------- |
| {ADR ๋์ด ์ํ} | `file:line` | HIGH/MED/LOW | ๊ธฐ์ฌ๋จ |
| {ํ์ ๋ฐ๊ฒฌ ์ํ} | `grep ๊ฒฐ๊ณผ` | HIGH/MED/LOW | **๋๋ฝ** |
**๋๋** `๋๋ฝ ์ํ ์์` โ ํ์ ๊ฒฐ๊ณผ ์ถ๊ฐ ์ํ ๋ฏธ๋ฐ๊ฒฌ.
### ๊ทผ๋ณธ ๋ฐ๋ก (hate)
- **load-bearing ๊ฐ์ **: {Decision ์ด ์๊ธฐ ์ํด ์ฐธ์ด์ด์ผ ํ๋ ๊ฒ} (`ADR:line`)
- **root**: {๊ทธ๊ฒ์ด ๋ฌด๋์ง๋ฉด ๋๋จธ์ง๊ฐ ๋ฌด์๋ฏธํด์ง๋ ๋ฐ๋ก 1๊ฐ} โ ๊ณต๊ฒฉ ์ถ: {์ฌ์ค ๊ฑฐ์ง / confabulation / analogyโ isomorphism / ์ธก์ leakage #n / ์๋น ๊ฒฝ๋ก / ์กฐ๊ฑด๋ถ ํธ์ต}
- **first nail**: {๊ฐ์ฅ ์ผ ๋ฐ์ฆ ๊ฒ์ฌ} โ ๋น์ฉ {์๊ฐ/ํ๋ณธ} vs ํ๋ก๊ทธ๋จ {Phase ์/Gate ์}
- **ํ์ **: G{n} ์ปค๋ฒ / ์ด์ #{id} ({severity}, deferred โ {์ฐฉ์ ์กฐ๊ฑด})
### ๋ ์ฆ ๋์กฐ (prism) โ ์กฐ๊ฑด๋ถ
| ๋ ์ฆ (failure mode) | ํ์ | load-bearing ์ด์ |
| ------------------- | ----------------- | ----------------- |
| {์ ํฉ์ฑ/SSOT} | pass/fail/unclear | {์ด์ 1๊ฐ} |
| {๋น์ฉ/์ฑ๋ฅ} | pass/fail/unclear | {์ด์ 1๊ฐ} |
- **์๋ ด**: {์ ์ ์ผ์น / ๋ค๋ฅธ ์ด์ ๋ก ์ผ์น / ๋ถ์ผ์น โ ์ด๋ ๋ ์ฆ๋ผ๋ฆฌ}
- **ํด๊ฒฐ ์ง๋ฌธ 1**: {๋ถ์ผ์น๋ฅผ ๊ฐ๋ฅด๋ ์ง๋ฌธ} ๋๋ `๋ถ์ผ์น ์์`
### ์ข
ํฉ ํ์
- **๊ตฌ์กฐ**: PASS/PARTIAL/FAIL ({FAIL ์น์
์์ผ๋ฉด ๋ชฉ๋ก})
- **์ฝ๋ ์ ํฉ**: N/M VERIFIED (๊ฒ์ฆ ์๋ ์)
- **๋๋ฝ ์ํ**: N๊ฑด (HIGH X / MED Y / LOW Z) ๋๋ `0๊ฑด`
- **๊ถ๊ณ **:
- **HIGH**: {ํ์ ์์ ์ด์} ๋๋ `์์`
- **MEDIUM**: {๊ถ์ฅ ์์ } ๋๋ `์์`
- **LOW**: {์ ํ์ ๊ฐ์ } ๋๋ `์์`
- **๊ฒฐ๋ก **: ์น์ธ ๊ฐ๋ฅ / ์์ ํ ์ฌ๋ฆฌ๋ทฐ / ์ฌ์ค๊ณ ํ์
"์ด์ 0๊ฑด ๊ถ๊ณ " ์์
ADR ์ด ๊ฑด์ ํ๋ฉด ์๋์ ๊ฐ์ด ๋ณด๊ณ :
### ์ข
ํฉ ํ์
- ๊ตฌ์กฐ: PASS (7/7 ์น์
HIGH ํ์ง)
- ์ฝ๋ ์ ํฉ: 8/8 VERIFIED
- ๋๋ฝ ์ํ: 0๊ฑด
- ๊ถ๊ณ :
- HIGH: ์์
- MEDIUM: ์์
- LOW: ์์
- ๊ฒฐ๋ก : **์น์ธ ๊ฐ๋ฅ**
Phase 4.5: Layer 0 ์์ํ (์๋ ์ ์ฅ)
Phase 4 ์ ๋งํฌ๋ค์ด ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ํ, ์๋ JSON payload ๋ฅผ stdin ์ผ๋ก writer ์ ์ ๋ฌํ์ฌ docs/adr/reviews/NNN.md ์ ์ ์ฅํฉ๋๋ค. Fail-soft โ writer ์คํจํด๋ Phase 4 ์ฌ์ฉ์ ์ถ๋ ฅ์ ์ํฅ ๋ฐ์ง ์์ต๋๋ค.
ํธ์ถ ๋ฐฉ๋ฒ
cat <<'EOF' | node .claude/scripts/adr-review/writer.mjs
{
"adr": <ADR๋ฒํธ>,
"title": "<ADR ์ ๋ชฉ>",
"reviewer": "claude",
"source": "live",
"issues": [
{
"severity": "CRITICAL | HIGH | MEDIUM | LOW",
"category": "<.claude/scripts/adr-review/ 9-taxonomy>",
"summary": "<ํ ์ค ์์ฝ>",
"evidence": "<ํ์ผ:line>",
"root_cause": "<...>",
"outcome": "<๊ธฐ๋ก ์์ ์ค์ ์ํ: pending | fixed | deferred | rejected>"
}
],
"bodyMd": "<Phase 4 ๋งํฌ๋ค์ด ๋ณธ๋ฌธ>",
"hate": { "assumption": "<load-bearing ๊ฐ์ >", "root": "<๋ฐ๋ก 1๊ฐ>", "axis": "<๊ณต๊ฒฉ ์ถ>", "first_nail": "<๊ฐ์ฅ ์ผ ๋ฐ์ฆ>", "verdict": "<G{n} ์ปค๋ฒ | issue:{id}>" },
"prism": { "lenses": [ { "lens": "<failure mode>", "verdict": "pass|fail|unclear", "reason": "<์ด์ 1๊ฐ>" } ], "convergence": "<์ผ์น|๋ค๋ฅธ ์ด์ ๋ก ์ผ์น|๋ถ์ผ์น>", "question": "<ํด๊ฒฐ ์ง๋ฌธ 1 | ์์>" }
}
EOF
issues ๊ฐ ๋น ๋ฐฐ์ด([])์ด์ด๋ ์ ์ โ Layer 0 ์ "์ด์ ์์ ์น์ธ" ๊ธฐ๋ก์ผ๋ก ์ ์ฅ. hate / prism ์ ์ ํ ํ๋ (3-P ๋ฏธ์คํ์ด๋ฉด prism ์๋ต) โ writer ๊ฐ round frontmatter ์ ๊ทธ๋๋ก ๋ณด์กดํ๋ค.
Outcome ์ข ๊ฒฐ ์๋ฌด (2026-07-11 โ ์ข ๊ฒฐ ๊ณ์ฝ ์ฐ๊ณ, CRITICAL)
outcome์ ๊ธฐ๋ก ์์ ์ ์ค์ ์ํ๋ฅผ ๋ฐ์ํ๋ค โ ๊ธฐ๋ณธ๊ฐpending์ ๊ธฐ๊ณ์ ์ผ๋ก ๋ฃ์ง ์๋๋ค. ๋ฆฌ๋ทฐ ์ค ์ด๋ฏธ ํด์๋ฅผ ํ์ธํ ์ด์๋fixed+addressed_in(commit/round ์ฐธ์กฐ) ๋ก ๊ธฐ๋ก.- ์ข
ํฉ ํ์ ์ด "์น์ธ ๊ฐ๋ฅ" ์ธ round ๋
pending์์กด ๊ธ์ง โ ๊ฐ ์ด์๋ฅผfixed/deferred/rejected์ค ํ๋๋ก ์ข ๊ฒฐํ๋ค. ์ด์ round ์pending์ด์๋ ํด์ ์ฌ๋ถ๋ฅผ ํ์ธํด ํด๋น round frontmatter ์outcome์ ์ง์ ๊ฐฑ์ ํ๋ค (round ๋ณธ๋ฌธ์ append-only ๋ณด์กด, frontmatter outcome ํ๋๋ง ์ํ ๊ฐฑ์ ๋์). - Why: execute-adr auto ๋ชจ๋์ ์ ์ ํ์ ์ข
๊ฒฐ ๊ณ์ฝ (CLAUDE.md ยง์ ์ ยท๊ด์ ์๋ฌธ ์ฒ๋ฆฌ) ์ด ์ต์ round ์ outcome ์ ๊ธฐ๊ณ ํ๋
ํ๋ค.
pending์์กด = ์ค์ง ์น์ธ ADR ์ด ๋ฏธํ์ ์ผ๋ก ํ์ ๋์ด ์ฐฉ์ ์์ ์ฌ์ง๋ฌธ ๋ฃจํ ์ฌ๋ฐ (2026-07-11 ์ง๋จ: 912=7 / 913=10 pending ์์กด ์ค์ธก โ ๋ณธ๋ฌธ ํ๋ก์ฆ๋ "์น์ธ ๊ฐ๋ฅ" ์ธ๋ฐ frontmatter ๋ ๋ฏธ์ข ๊ฒฐ).
์ถ๋ ฅ ์ฒ๋ฆฌ
- ์ฑ๊ณต:
โ saved to docs/adr/reviews/NNN.md (round N)ํ ์ค์ Phase 4 ๊ฒฐ๊ณผ ๋์ ์ถ๊ฐ. exit 0. - Malformed ๋ณต๊ตฌ:
โ saved (malformed recovery) to NNN.{ts}.mdํ ์ค ์ถ๊ฐ. exit 1 ๋ฌด์ (data preserved). - Fatal (required ํ๋ ๋๋ฝ, IO ์คํจ):
writer: <error>warning ๋ง ์ถ๋ ฅ. Phase 1~4 ์ ์ ์๋ฃ.
์คํค๋ง / taxonomy
- Schema SSOT: docs/adr/reviews/README.md
- Design rationale: docs/reference/schemas/ADR_REVIEW_LAYER0.md
- Validator:
node .claude/scripts/adr-review/validate.mjs
์ด์ ์ฒ๋ฆฌ ์์น
- HIGH/MEDIUM ์ด์๋ "๋ฒ์ ์ธ" ๋ก ์คํตํ์ง ์๋๋ค โ ๋จ, ์ฆ๊ฑฐ ์๋ ์ด์๋ง ํด๋น
- ์ฝ๋ ๊ฒ์ฆ ์์ด ADR ์ฃผ์ฅ์ ์ฌ์ค๋ก ์์ฉํ์ง ์๋๋ค โ ๋์์ ๊ทผ๊ฑฐ ์์ด ๋ถ์ ํ์ง๋ ์๋๋ค
- UNVERIFIED ํญ๋ชฉ์ ๋ฐ๋์ ๋ณด๊ณ ํ๊ณ , ADR ์์ ๋๋ ์ฝ๋ ๊ตฌํ ํ์ ์ฌ๋ถ๋ฅผ ๋ช ์ํ๋ค
- ์ํ์ด ๋ฐ๊ฒฌ๋์ง๋ง ADR ์ ์์ผ๋ฉด "๋๋ฝ ์ํ" ์ผ๋ก ๋ถ๋ฅํ๊ณ grep ์ฆ๊ฑฐ๋ฅผ ์ฒจ๋ถ
- "์ด์ ์์" ์ ์ ๋นํ ๊ฒฐ๋ก โ ๊ฑด์ ํ ADR ์ "๊ฒฐํจ ์๋ ๊ฒ์ฒ๋ผ" ๋ณด๊ณ ํ์ง ์๋๋ค
Subagent ์ด์ ๊ฐ์ด๋ (์ฌ๋ฐ ๋ฐฉ์ง)
๋ณธ skill ์ subagent ์ ์์ํ ๋์ ์์ ์์น:
1-shot ์๊ฒฐ ์์น
subagent ๋ฅผ dispatch ํ๋ค๋ฉด ์ฒ์๋ถํฐ Phase 4.5 ๊น์ง ํ ๋ฒ์ ์ํ. ์ค๊ฐ์ "์ผ๋จ ์ฌ๊ธฐ๊น์ง ๋ณด๊ณ " ์ง์ ๊ธ์ง.
์ค๋จ ๋ฐ์ ์
subagent ๊ฐ Phase 2/3 ์ค๊ฐ์ ์๋ต์ ๋ฉ์ถ๊ณ ์ turn ์ ์๊ตฌํ๋ฉด:
| ์ํฉ | ๊ถ์ฅ ์กฐ์น |
|---|---|
| Main ์ด ๋์ผ ๋ฆฌ๋ทฐ ๊ฐ๋ฅ | main ์ด ์ง์ ์ฌ์ํ (๊ฐ์ฅ ๋น ๋ฅด๊ณ ์ ๋ขฐ ๋์) |
| Main ์ปจํ ์คํธ ํฌํ | ์ agent 1-shot dispatch (SendMessage ์ด์ด๋ฐ๊ธฐ X) |
| ๊ฒฐ๊ณผ ์ผ๋ถ ์ด๋ฏธ ์ ํจ | ์ฆ๊ฑฐ ์ธ์ฉ ์๋ ํ์ ๋ง ์ฑํ, ๋๋จธ์ง๋ main ์ด ๋ณด์ถฉ |
SendMessage ๊ธ์ง ์ฌ์
Subagent ์ context ๋ autocompact ๋๋ฉด ์๋ฌธ ์ธ๋ถ๊ฐ ์์ถ๋๋ค. SendMessage ๋ก "์ต์ข ๋ณด๊ณ ๋ง ์ ์ถ" ์์ฒญ ์ ์์ถ๋ ๊ธฐ์ต์ ์์กด โ Phase 4 ํ ํ๋ฆฟ slot fill ์๋ฐ๊ณผ ๊ฒฐํฉํ์ฌ hallucination ๊ฐ๋ฅ์ฑ HIGH.
ํ์ฆ ์ญํ ๋ถ๋ฆฌ
Subagent ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ๋ ๊ฐ์ค (hint) ๋ก ์ทจ๊ธ. Main ์ ํ์ฆ์ (verifier) ๋ก file:line ์ธ์ฉ์ ์๋ฌธ์์ cross-check. ์ด ์ญํ ๋ถ๋ฆฌ๊ฐ reviewer ๊ฐ๋ณ ์ ๋ขฐ๋๋ณด๋ค ์์ .
Evals
Positive (์ด ์คํฌ์ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ)
- "์ด ADR ๋ฆฌ๋ทฐํด์ค" โ โ
- "์ค๊ณ ๋ฌธ์ ๊ฒํ ๋ถํ" โ โ
- "ADR-051 ์ํ ํ๊ฐ๊ฐ ๋ง๋์ง ํ์ธํด๋ด" โ โ
- "์ํคํ ์ฒ ๊ฒฐ์ ๋ฌธ์ ๋ฆฌ๋ทฐ" โ โ
- "review ADR" โ โ
Negative (์ด ์คํฌ์ ์คํํ๋ฉด ์ ๋๋ ๊ฒฝ์ฐ)
- "์ฝ๋ ๋ฆฌ๋ทฐํด์ค" โ โ (์ฝ๋ ๋ฆฌ๋ทฐ โ reviewer ์์ด์ ํธ)
- "README ์์ ํด์ค" โ โ (๋ฌธ์ ํธ์ง)
- "ADR ์๋ก ์์ฑํด์ค" โ โ (์์ฑ โ create-adr ์คํฌ (
/create-adr)) - "PR ๋ฆฌ๋ทฐํด์ค" โ โ (PR โ reviewer ์์ด์ ํธ)