[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DNAA53K13C0REE8FDT3QHR":3,"skill-same:01M6DNAA53K13C0REE8FDT3QHR":96},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":43,"repositoryHtmlUrl":44,"repositoryHomepageUrl":6,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":46,"install":47,"resources":59},"01M6DNAA53K13C0REE8FDT3QHR","design-review",null,"설계 문서 최종 리뷰","Nharu\u002Fcc-cmds","Nharu","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F14357133?v=4","01M6DKV0D72FEBQABDAGSZ021P","nano","01M6DKV0TVG5GV22WQZBNRZ3ZT",3,"MIT","https:\u002F\u002Fgithub.com\u002FNharu\u002Fcc-cmds\u002Fblob\u002Fmaster\u002Ftests\u002Ffixtures\u002Freadme-gen\u002Fpre-yq-skills\u002Fdesign-review\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[29,30,31,32],"design","review","design review","true","2026-11-10 10:12:30",false,"---\nname: design-review\ndescription: 설계 문서 최종 리뷰\nwhen_to_use: 작성된 설계 문서를 다중 반복 에이전트 리뷰(외부\u002F내부 사이클)로 최종 검증·수렴시키고자 할 때\ndisable-model-invocation: true\n---\n\nPerform a final review of the design document using a two-tier cycle (outer + inner).\n\nAll analysis work and inter-agent communication should be in English to optimize token usage.\nUser-facing communication (summaries, questions, status updates) should be in Korean.\n\n## Overview\n\nThis command wraps `design-review`'s inner loop in an outer cycle. Each outer iteration spawns a **completely fresh** inner loop against the current document state with a cleared `INNER_TEMP_DIR`, preserving only the user-persistent `ack_items.md` and the design document itself. This prevents the \"context poisoning\" where long inner loops drift from re-confirmation toward rebuttal, while still letting ack items ratchet across iterations.\n\nThe outer cycle exits when an inner iteration reaches `clean-convergence` (§3.11 severity + saturation rule) AND no escalation was actually applied during that iteration (`COUNT_APPLIED == 0`, §3.3 step 17 \u002F §8.8 formula).\n\n## Review Criteria\n\nRequirement consistency, internal coherence, feasibility, implementation order, missing items, and any other perspective important in the context of this specific design.\n\n---\n\n## Control-Flow Invariants\n\nThese formulas govern termination and classification. They MUST remain inline (not in `references\u002F`) because SKILL.md has post-compaction re-attachment priority (first ~5K tokens) while `references\u002F` reads may be summarized away. A summarized invariant yields silent mis-termination.\n\n### Inner convergence predicate (§3.11)\n\n```\ninner_converged_cleanly() =\n    (consecutive_no_major >= 2)\n    AND (pending_applies.md is empty — no ### PEND- headers between --- and EOF)\n    AND (no [IN PROGRESS] dialogues)\n```\n\nSeverity aggregation for `consecutive_no_major`:\n\n```\n# Count proposals emitted this round, using their FINAL severity\n# (= initial agent severity + any [SEVERITY-UPGRADED] in this round).\n# Disposition is IRRELEVANT: [APPROVED], [MODIFIED], [USER-DIRECTED],\n# [AUTO-DECIDED], [AUTO-APPROVED], [REJECTED], [AUTO-REJECTED] all count\n# if the proposal's severity is critical\u002Fmajor.\nfinal_critical_or_major = |{p : p.severity (post-upgrade) ∈ {critical, major}}|\n\nif final_critical_or_major == 0:\n  consecutive_no_major += 1\nelse:\n  consecutive_no_major = 0   # even a single approved major resets\n```\n\n**Critical rule**: severity is a property of the **proposal itself**, not its outcome. A `[APPROVED]` major proposal still counts toward `final_critical_or_major`. `consecutive_no_major` increments only when the round produces **zero** critical\u002Fmajor proposals — regardless of how many were resolved. Background\u002Frationale → see `references\u002F03-severity-exit-policy.md`.\n\n### Outer termination judgment (§3.3 Step 22)\n\n```\nif INNER_EXIT_REASON == \"safety-limit-outer-terminate\":\n    break outer loop → Phase 3                      # user explicitly aborted\nelif INNER_EXIT_REASON == \"safety-limit-fresh-outer\":\n    outer_done = false                              # bypass convergence judgment\nelif INNER_EXIT_REASON == \"clean-convergence\" and COUNT_APPLIED == 0:\n    outer_done = true                               # fixpoint reached\nelse:\n    outer_done = false                              # COUNT_APPLIED > 0 → another iter\n```\n\n**MIN_OUTER = 1**: even the first iteration may terminate if the fixpoint rule fires.\n\n### `COUNT_APPLIED` aggregation (§3.3 Step 17 \u002F §8.8 dedup)\n\n```\n(a) Collect all lines in $INNER_TEMP_DIR\u002Freview_log.md tagged\n    [APPROVED], [MODIFIED], [USER-DIRECTED], [AUTO-DECIDED].\n(b) Group by PROP-ID (e.g., PROP-R2-3).\n(c) For each group:\n    - If both [AUTO-DECIDED] and [USER-DIRECTED] appear (revert scenario, §8.11),\n      count only [USER-DIRECTED] (the [AUTO-DECIDED] is collapsed out).\n    - If partial_apply=true markers exist for the proposal at multiple locations,\n      count 1 per group (not per location).\n    - Otherwise, 1 per group.\n(d) COUNT_APPLIED = sum of group counts.\n```\n\n### `escalate_applied` formula (§8.8)\n\n```\nraw_count = count([APPROVED]) + count([MODIFIED]) + count([USER-DIRECTED]) + count([AUTO-DECIDED])\n\nescalate_applied = raw_count\n                 − |{PROP-ID groups where [AUTO-DECIDED] AND [USER-DIRECTED] co-exist}|\n                 − |partial_apply duplicates within group|\n```\n\n`[AUTO-DECIDED]` is counted — otherwise silent termination risk (F5). Uncounted tags: `[AUTO-APPROVED]`, `[AUTO-REJECTED]`, `[REJECTED]`.\n\n### Disposition tag set (§3.5 + §8.8)\n\n| Tag | 문서 변경 | escalate_applied | Ack set |\n|---|---|---|---|\n| `[AUTO-APPROVED]` | ✓ | ✗ | ✗ |\n| `[AUTO-REJECTED]` | ✗ | ✗ | ✓ |\n| `[AUTO-DECIDED]` | ✓ | **✓** | ✗ |\n| `[APPROVED]` | ✓ | ✓ | ✗ |\n| `[REJECTED]` | ✗ | ✗ | ✓ |\n| `[MODIFIED]` | ✓ | ✓ | ✗ |\n| `[USER-DIRECTED]` | ✓ | ✓ | ✗ |\n\n**Informational markers** (not disposition tags; never counted; may appear alongside a disposition tag): `[SEVERITY-UPGRADED]` (§3.11), `[REVERTED-BY-USER]` (§8.11; supports `cascade=true` and `cascade-from=PROP-Rx-y`), `[REVERT-FAILED]` (§8.11).\n\n### Decision-type classifier (§8 top-level gate)\n\nOnly `decision`-type proposals are candidates for auto-decide. For each decision-type proposal after self-triage returns `escalate`, call `re_evaluate_decision` (details in `references\u002F01-auto-decide-protocol.md`):\n\n```\nauto-decide fires iff ALL of the following hold:\n  PRE-CHECK 0: blackout guard passes\n  AND PRE-CHECK A: single-option guard passes\n  AND (T1-A OR T1-B OR T1-C OR T2-AB)                         # dominance tier\n  AND signal #3: order-invariance\n  AND signal #4: dimension totality (embedded inside T1-C)\n  AND signal #5: no prior [AUTO-DECIDED] premises\n  AND signal #7: counterfactual self-test (T2 uses stricter bar)\n```\n\n**Rule of thumb**: \"When in doubt, escalate.\"\n\n### Processing Protocol trigger regex (§8.11, §8.12)\n\nOn every user response to a proposal prompt, match these patterns BEFORE normal disposition handling:\n\n- **§8.12 Opt-out trigger**: `(자동결정|자동 선택|auto.decide)` + `(중단|끄|해제|그만|비활성|수동|직접)`\n- **§8.11 Reversion trigger**: `(PROP-Rx-y|AUTO-NNN|방금|전부)` + `(취소|되돌리|번복|롤백|revert|undo)` — AUTO-NNN precedes PROP-ID on ID conflict.\n\nOn match, Read `references\u002F02-processing-protocol-detail.md` and execute the full action sequence. Otherwise fall through to the \"Disposition handling (normal path)\" below.\n\n---\n\n## Strategy\n\n### Phase 1: Outer Session Setup\n\n1. Read the full design document to verify existence and parseability.\n2. Parse `$ARGUMENTS` to detect and strip `--base`, `--auto-decide-dominant`, and `--no-auto-decide-dominant`. Auto-decide-dominant defaults ON; `--no-auto-decide-dominant` opts out. Create the outer-session directory and initialize files:\n\n```bash\n# --- Outer Session Isolation ---\n# 1. Command name\nCOMMAND_NAME=\"design-review-outer\"\n\n# 2. Strip flags from arguments\nARGS_CLEAN=$(echo \"$ARGUMENTS\" | awk '{\n  for(i=1;i\u003C=NF;i++) if($i!=\"--base\" && $i!=\"--auto-decide-dominant\" && $i!=\"--no-auto-decide-dominant\") printf \"%s%s\", $i, (i\u003CNF?\" \":\"\")\n}')\n\n# 3. Detect flags\n# Auto-decide-dominant is ON BY DEFAULT. Pass --no-auto-decide-dominant to disable.\n# --auto-decide-dominant remains accepted as an explicit opt-in (no-op when default is true)\n# for backward-compatible invocations and documentation clarity.\nBASE_MODE=false\nAUTO_DECIDE_INITIAL=true\nfor arg in $ARGUMENTS; do\n  [ \"$arg\" = \"--base\" ] && BASE_MODE=true\n  [ \"$arg\" = \"--auto-decide-dominant\" ] && AUTO_DECIDE_INITIAL=true\n  [ \"$arg\" = \"--no-auto-decide-dominant\" ] && AUTO_DECIDE_INITIAL=false\ndone\n\n# 4. REPO_NAME extraction (document stem → repo basename → cwd basename)\nREPO_NAME=$(echo \"$ARGS_CLEAN\" | awk '{print $1}' | xargs basename 2>\u002Fdev\u002Fnull)\nREPO_NAME=\"${REPO_NAME%.md}\"\n[ -z \"$REPO_NAME\" ] && REPO_NAME=$(git rev-parse --show-toplevel 2>\u002Fdev\u002Fnull | xargs basename)\n[ -z \"$REPO_NAME\" ] && REPO_NAME=$(basename \"$(pwd)\")\n[ -z \"$REPO_NAME\" ] && REPO_NAME=\"unknown\"\nREPO_NAME=$(echo \"$REPO_NAME\" | tr -cs 'a-zA-Z0-9_-' '_' | sed 's\u002F^_\u002F\u002F;s\u002F_$\u002F\u002F' | cut -c1-30)\nREPO_NAME=\"${REPO_NAME%_}\"\n\n# 5. Outer session ID & directory\nOUTER_TS=$(date +%Y%m%d_%H%M%S)\nOUTER_SESSION_ID=\"${COMMAND_NAME}_${REPO_NAME}_${OUTER_TS}\"\nOUTER_DIR=\"docs\u002F_temp\u002F${OUTER_SESSION_ID}\"\nmkdir -p \"$OUTER_DIR\"\n```\n\n3. **Before initializing the three outer-persistent files, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F04-file-schemas.md`** for the canonical schemas of `outer_log.md`, `ack_items.md`, and `convergence_table.md`. Then initialize:\n\n```bash\n# outer_log.md header\ncat > \"$OUTER_DIR\u002Fouter_log.md\" \u003C\u003CEOF\n# Outer Cycle Audit Log\n\n\u003C!--\nSession: ${OUTER_SESSION_ID}\nDocument: $(echo \"$ARGS_CLEAN\" | awk '{print $1}')\nStarted: $(date -u +%Y-%m-%dT%H:%M:%SZ)\nAUTO_DECIDE_INITIAL: ${AUTO_DECIDE_INITIAL}\nBASE_MODE: ${BASE_MODE}\n-->\nEOF\n\n# ack_items.md header\ncat > \"$OUTER_DIR\u002Fack_items.md\" \u003C\u003C'EOF'\n# Acknowledged Items\n\n_Items decided to keep as-is during this design-review session. Do NOT re-propose._\n\n---\nEOF\n\n# convergence_table.md headers (two tables — see references\u002F04-file-schemas.md)\ncat > \"$OUTER_DIR\u002Fconvergence_table.md\" \u003C\u003C'EOF'\n# Convergence Tables\n\n## 처리 결과 현황표\n\n| 이터 | 라운드 | 자동승인 | 자동거부 | 자동결정 | 에스적용 | 에스거부 |\n| :--: | :----: | :------: | :------: | :------: | :------: | :------: |\n\n## 수렴 진단표\n\n| 이터 | 적용실패 | 부분종료 | ack수 |  종료사유  |\n| :--: | :------: | :------: | :---: | :--------: |\nEOF\n```\n\n4. **First-time auto-decide warning** (§8.9): Auto-decide-dominant is **ON by default**. If `AUTO_DECIDE_INITIAL=true` (i.e., the user did not pass `--no-auto-decide-dominant`), **eager-load `${CLAUDE_SKILL_DIR}\u002Freferences\u002F01-auto-decide-protocol.md`** (this is the §8 algorithm). Then emit this Korean warning to the user exactly once at session start:\n\n```\nℹ️ 자동결정 모드가 활성화되어 있습니다 (기본값).\n\n일부 결정형 제안이 사용자 확인 없이 자동 선택될 수 있습니다.\n자동결정이 발생한 이터레이션은 외부 사이클이 한 번 더 진행되어 fresh agent 그룹이 ripple 효과를 독립 검증합니다.\n\n자동 선택 내역은 매 이터레이션 요약의 '자동 선택 내역' 섹션에서 확인할 수 있습니다.\n되돌리려면 다음 에스컬레이션 프롬프트에 \"PROP-Rx-y 자동결정 취소해줘\" 또는\n\"AUTO-NNN 롤백\"을 입력하세요 (대화 프롬프트 시점에만 입력 가능).\n자동 결정을 즉시 중단하려면 \"자동 선택 중단\"이라고 입력하세요.\n이번 세션 전체에서 비활성화하려면 다음 호출 시 \"--no-auto-decide-dominant\" 플래그를 추가하세요.\n```\n\n5. Initialize outer loop state: `outer_iter = 0`, `outer_done = false`. Proceed to Phase 2.\n\n### Phase 2: Outer Iteration Loop\n\nLoop while `outer_done == false`:\n\n**Step 6 — Advance outer iteration**: `outer_iter += 1`\n\n**Step 6.5 — Restore `AUTO_DECIDE_ENABLED` from file** (§8.12 persistence):\n\nClaude Code bash variables are volatile across turns, so the runtime flag must be restored from `outer_log.md` at the start of every outer iteration:\n\n```bash\n# If ### Auto-Decide Opt-Out section exists in outer_log.md, opt-out is active\nif grep -q '^### Auto-Decide Opt-Out$' \"$OUTER_DIR\u002Fouter_log.md\" 2>\u002Fdev\u002Fnull; then\n  AUTO_DECIDE_ENABLED=false\nelse\n  AUTO_DECIDE_ENABLED=${AUTO_DECIDE_INITIAL}\nfi\n```\n\n**Step 7 — INNER_TEMP_DIR**:\n\n```bash\nINNER_TEMP_DIR=\"${OUTER_DIR}\u002Fiter-$(printf '%03d' $outer_iter)\"\nmkdir -p \"$INNER_TEMP_DIR\"\n```\n\n**Step 8–9 — Empty inner files** (schemas in `references\u002F04-file-schemas.md`):\n\n```bash\necho \"\" > \"$INNER_TEMP_DIR\u002Freview_proposals.md\"\ncat > \"$INNER_TEMP_DIR\u002Fpending_applies.md\" \u003C\u003C'EOF'\n# Pending Applies\n\n_Edit operations deferred from their originating round. Must be empty for inner convergence._\n\n---\nEOF\n```\n\n**Step 10 — Initialize `review_log.md` with ack seed**:\n\n```bash\n{\n  echo \"# Design Review Log\"\n  echo \"\"\n  echo \"\u003C!-- Outer session: ${OUTER_SESSION_ID}, outer iter: ${outer_iter} -->\"\n  echo \"\"\n  echo \"## Acknowledged Items\"\n  echo \"\"\n  # Copy the body of ack_items.md (after the \"---\" separator) into this section\n  awk '\u002F^---$\u002F{found=1; next} found' \"$OUTER_DIR\u002Fack_items.md\"\n  echo \"\"\n} > \"$INNER_TEMP_DIR\u002Freview_log.md\"\n```\n\nThe review agent prompt instructs it to read the `## Acknowledged Items` section and skip duplicates — no agent-prompt change is required for ack injection.\n\n**Step 11 — Reset inner state**: `inner_round = 0`, `consecutive_no_major = 0`, `INNER_EXIT_REASON = null`.\n\n---\n\n#### INNER PHASE 2 LOOP\n\nPerform agent-based iterative review until severity saturation (§3.11). Each round spawns a **fresh** review agent that independently reviews the document from scratch.\n\n**Step 12** — `inner_round += 1`. Spawn a review agent.\n\n**Before spawning the review agent, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F06-review-agent-prompt.md`** and substitute `{TEMP_DIR}` (= actual `INNER_TEMP_DIR`) and `{BASE_MODE_CONSTRAINT}` (the `--base` block when `BASE_MODE=true`, else empty) per the file's substitution contract, then prepend the path context block before calling `Agent()`.\n\nAfter the agent returns:\n\n  a. The agent wrote proposals to `$INNER_TEMP_DIR\u002Freview_proposals.md` (overwriting at round start), appended a round summary to `$INNER_TEMP_DIR\u002Freview_log.md`, and returned a structured summary including proposal count.\n  b. Read `$INNER_TEMP_DIR\u002Freview_proposals.md` to get the current round's proposals.\n  c. **For each proposal**, analyze its concept:\n     - **Proposal type**: Use the Reference text as a hint to identify all affected locations. Concretize the fix (what exactly will change, where).\n     - **Decision type**: Analyze the impact of each option so the user can make an informed choice.\n  d. **Self-Triage** (main session): Classify each proposal into `auto-approve`, `auto-reject`, or `escalate` per the Self-Triage Protocol below.\n  e. Apply auto-approved proposals directly via Edit. Log auto-rejected proposals to `## Acknowledged Items` (inline copy — the real outer-persistent extraction happens at Step 18). Both are recorded in `review_log.md` with `[AUTO-APPROVED]` \u002F `[AUTO-REJECTED]` tags and a one-line rationale.\n  f. **Auto-decide integration** (§8, conditional on `AUTO_DECIDE_ENABLED=true`): for each `decision`-type proposal, after self-triage decides \"escalate\", **Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F01-auto-decide-protocol.md` unconditionally** (recovery gate — post-compaction may have summarized away the eager-load), then call `re_evaluate_decision` (§8.4). If the verdict is `auto-pick`, record `[AUTO-DECIDED]` to `review_log.md`, apply the chosen option via Edit, and append an `AUTO-NNN` entry to the in-memory audit buffer for Step 20. If the verdict is `escalate`, fall through to the ask-user step. If `AUTO_DECIDE_ENABLED=false`, skip this hook entirely.\n  g. **If escalated proposals remain**: Present only those to the user via AskUserQuestion (in Korean). See \"Approval UX\" below.\n  h. Process user choices according to the \"Processing Protocol\" below. **Dialogue loop per Ground Rule #6**: if the user's response is a follow-up question or discussion rather than an explicit decision, continue the dialogue via AskUserQuestion until an explicit decision is given.\n  i. Update the round entry in `$INNER_TEMP_DIR\u002Freview_log.md` with disposition tags.\n  j. Briefly summarize this round's auto-handled items to the user in Korean (count + one-line per item) so they have visibility into self-triage decisions.\n\n**Step 13 — Edit failure handling**: If an Edit fails (e.g., `old_string` not unique, target text changed):\n  - Immediately notify the user: \"제안 #N 적용 중 일부 위치에서 실패: [원인]\"\n  - Re-analyze the failed location and propose an alternative.\n  - **Option A (apply after user confirmation)**: re-attempt with disambiguated context. On success, log disposition tag to `review_log.md`.\n  - **Option B (defer to next round)**: append a `PEND-NNN` block to `$INNER_TEMP_DIR\u002Fpending_applies.md` per the schema in `references\u002F04-file-schemas.md`.\n  - **Partial success**: log the proposal with a `partial_apply=true` marker and record the failed locations in `pending_applies.md`.\n  - Any `PEND-NNN` must later be resolved (success → remove block + log disposition; or user abandon → `[REJECTED]` + ack + remove block) before inner convergence is allowed.\n\n**Step 14 — Severity aggregation** (post-upgrade final values — disposition irrelevant): See Control-Flow Invariants above for the `consecutive_no_major` formula. **Before evaluating, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F03-severity-exit-policy.md`** for the tier taxonomy + main-session severity rules + the severity-vs-disposition orthogonality example.\n\n**Step 15 — Inner convergence guard**: See Control-Flow Invariants (`inner_converged_cleanly()`). If true, set `INNER_EXIT_REASON = \"clean-convergence\"` and break out of the inner loop.\n\n**Step 16 — Inner safety limit (20 rounds)**:\n\nIf `inner_round >= 20`, **Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F05-korean-ux-templates.md`** for the §3.9.4.b \u002F §3.9.4.c prompt templates, then present 3 options via AskUserQuestion. Dynamic recommendation:\n\n- `pending_dialogue > 0` → recommend **A: 10회 추가 진행** (finish open dialogues)\n- `pending_dialogue == 0` → recommend **B: 이번 이터레이션 종료 후 새 이터레이션 시작** (escape stuck inner, preserve outer progress)\n\nOption mapping to `INNER_EXIT_REASON`:\n\n| Option | Action | INNER_EXIT_REASON |\n|---|---|---|\n| A: 10 라운드 추가 진행 | extend inner loop by 10 rounds (repeatable) | (not set, continue) |\n| B: 이번 이터레이션 종료 후 새 이터레이션 시작 | break inner loop; next outer iter re-reviews from doc state | `safety-limit-fresh-outer` |\n| C: 외부 이터레이션 전체 종료 | break inner loop; skip directly to Phase 3 cleanup | `safety-limit-outer-terminate` |\n\n**Option B invariant**: A stuck inner loop must never block outer progress. Ack + document state are preserved, so the next fresh agent can re-review. Outer exit check (Step 22) bypasses convergence judgment when `INNER_EXIT_REASON == \"safety-limit-fresh-outer\"` — always continue.\n\nIf exit condition not met and not at safety limit → return to Step 12 with a new agent.\n\n---\n\n#### INNER LOOP COMPLETE — Per-iteration summary work (Step 17–21)\n\n**Step 17 — Compute `COUNT_APPLIED`**: Use the formula in Control-Flow Invariants. Feeds Step 22.\n\n**Step 18 — Extract new ack items**:\n\n**Before writing, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F04-file-schemas.md`** for the `ack_items.md` schema (8-field record, dedup rule).\n\nParse `$INNER_TEMP_DIR\u002Freview_log.md` for `[REJECTED]` and `[AUTO-REJECTED]` lines. For each, compose an `ACK-NNN` record with the 8 fields (Source, Disposition, Category, Location, Issue, Reference text, User\u002FAuto-reject rationale, Recorded).\n\n**Dedup rule** (§3.7): an ack is a duplicate of an existing entry in `$OUTER_DIR\u002Fack_items.md` iff ALL three conditions hold:\n\n1. `Category` matches exactly (controlled vocabulary: one of the 6 review categories)\n2. `Location` refers to the same section (case-insensitive, \"Section 4.3\" ≈ \"4.3 Auth Flow\")\n3. `Issue` describes the same root cause (main session semantic judgment)\n\nAppend only non-duplicate records to `$OUTER_DIR\u002Fack_items.md` under a new `### From Iteration N` heading. **If zero new items are extracted for this iteration, do not append the `### From Iteration N` block at all.** Use monotonic zero-padded IDs (`ACK-001`, `ACK-002`, …).\n\n**Step 19 — Append convergence table rows**:\n\n**Before writing, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F04-file-schemas.md`** for the `convergence_table.md` row format, then append one row to each of the two tables in `$OUTER_DIR\u002Fconvergence_table.md` (§8.13.4):\n\n```markdown\n| {iter} | {rounds} | {auto_approved} | {auto_rejected} | {auto_decided} | {escalate_applied} | {escalate_rejected} |\n| {iter} | {max_pending_applies} | {아니오|예} | {ack_size_after} | {exit_reason_ko} |\n```\n\nWhere:\n- Mark the iter column with ` ⚠️` suffix if `INNER_EXIT_REASON != \"clean-convergence\"` (partial iteration). Mark `escalate_applied` with `**0** ✓` bold-tick if the final value is 0 on a clean iteration.\n- `max_pending_applies` is the maximum size `pending_applies.md` reached during the iteration (not the final value).\n- `partial_flag` = `예` if `INNER_EXIT_REASON != \"clean-convergence\"`, else `아니오`\n- `exit_reason_ko` ∈ {`정상수렴`, `내부한계`, `사용자중단`}\n- **Invariant**: `exit_reason_ko == \"정상수렴\"` ⇒ `partial_flag == \"아니오\"`.\n\n**Step 20 — Append outer_log.md iteration entry**:\n\n**Before writing, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F04-file-schemas.md`** for the `outer_log.md` Auto-Decides canonical schema. Append to `$OUTER_DIR\u002Fouter_log.md`:\n\n```markdown\n## Outer Iteration {outer_iter}\n\n- Started: {ISO8601}\n- Ended: {ISO8601}\n- Inner TEMP_DIR: {INNER_TEMP_DIR}\n- Inner rounds run: {n}\n- Inner exit reason: {clean-convergence | safety-limit-fresh-outer | safety-limit-outer-terminate | user-abort}\n- Partial iteration: {true|false}\n\n### Escalate Counter Breakdown\n\n- [APPROVED]: {count} \"proposal IDs: ...\"\n- [MODIFIED]: {count} \"proposal IDs: ...\"\n- [USER-DIRECTED]: {count} \"proposal IDs: ...\"\n- [AUTO-DECIDED]: {count} \"proposal IDs: ...\"\n- escalate_applied: {COUNT_APPLIED}  ← termination input (raw_count − dedup correction per §8.8)\n- [REJECTED]: {count} ← NOT counted; added to ack set\n- [AUTO-APPROVED]: {count} ← NOT counted\n- [AUTO-REJECTED]: {count} ← NOT counted; added to ack set\n- pending_applies_at_end: {\"(none)\" | PEND-NNN list}\n- auto_decide_opt_out: {false | \"true (triggered at round r, phrase: '...')\"}\n\n### Auto-Decides\n\n(Emit this subsection only if at least one [AUTO-DECIDED] occurred this iteration — canonical schema in references\u002F04-file-schemas.md)\n\n### Ack Set Delta\n\n- Before: {size_before}\n- Added: {list of new ACK-NNN IDs}\n- After: {size_after}\n\n### Document Mutations Summary\n\n- Files touched: {list}\n- Total Edit ops: {n} (success: {s}, failed initially: {f}, eventually resolved: {r})\n\n### Termination Decision\n\n- outer_should_terminate: {true|false}\n- Rule fired: {fixpoint | outer-limit-reached | safety-limit-outer-terminate | continue}\n- Next action: {continue to iter i+1 | ask user to extend | Phase 3}\n```\n\n**AUTO-NNN** is a session-monotone audit ID — allocate the next free number across all `### Auto-Decides` subsections in `outer_log.md` (start from `AUTO-001`). Claude Code bash variables are volatile; source the next free number by grepping existing entries: `grep -c '^- AUTO-' \"$OUTER_DIR\u002Fouter_log.md\" 2>\u002Fdev\u002Fnull || echo 0`.\n\n**Step 21 — Delete `INNER_TEMP_DIR`** (path guarded):\n\n```bash\n[[ \"$INNER_TEMP_DIR\" == \"${OUTER_DIR}\"\u002F* ]] && rm -rf \"$INNER_TEMP_DIR\"\n```\n\nThis deliberate wipe prevents \"context poisoning\" — the next iteration's fresh agent starts with only the ack seed and the document itself.\n\n---\n\n#### Outer Exit Check (Step 22–25)\n\n**Step 22 — Outer termination judgment**: See Control-Flow Invariants for the decision tree.\n\n**Step 23 — Ack soft-limit check** (§3.7, only if `outer_done == false`):\n\nCount entries in `$OUTER_DIR\u002Fack_items.md` (lines starting with `#### ACK-`):\n\n- **50 items**: advisory — append a one-line warning to the next iteration-transition summary: `⚠️ 인지됨 항목 {n}건 (50건 권고치 초과)`\n- **100 items**: hard — ask the user via AskUserQuestion with three options:\n\n| Label | Action |\n|---|---|\n| A: 요약 | Compress old ack entries into one-line-per-category summaries |\n| B: 보관 | Move entries from previous iterations to `$OUTER_DIR\u002Fack_archive.md`, keep only current iter active |\n| C: 현재 유지 | Accept the prompt-length cost and do nothing |\n\nOnly run this check when `outer_done == false` — when `outer_done == true`, cleanup is imminent so ack size no longer matters.\n\n**Step 24 — Outer safety limit (default 5 iterations)**:\n\nIf `outer_iter >= 5 AND outer_done == false`, **Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F05-korean-ux-templates.md`** for the §3.9.4.a prompt template, then present the extension\u002Fterminate prompt:\n\nAskUserQuestion options: \"5회 추가 진행\" \u002F \"현재 상태로 종료\". If the user chooses to terminate, break outer loop → Phase 3. If extended, raise the outer cap by 5 and continue.\n\n**Step 25 — Iteration transition summary + auto-advance** (only if `outer_done == false`):\n\n**Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F05-korean-ux-templates.md`** for the iteration-transition summary block (§3.9.2 \u002F §8.13.3) and the split convergence table (§3.9.3 \u002F §8.13.4). Emit them in Korean. No countdown or confirmation — auto-advance immediately to the next outer iteration.\n\nUser intervention only occurs at (1) outer safety limit prompt, (2) inner safety limit prompt, (3) escalated AskUserQuestion for individual proposals.\n\n### Phase 3: Outer Cleanup\n\n1. **Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F05-korean-ux-templates.md`** for the §3.9.4.e final completion summary template, then emit it in Korean (includes the `자동 결정` sub-line per §8.8\u002F§8.13.3 supersession).\n2. Delete the outer directory (path guarded):\n\n```bash\n[[ \"$OUTER_DIR\" == docs\u002F_temp\u002F* ]] && rm -rf \"$OUTER_DIR\"\n```\n\n## Self-Triage Protocol\n\nThe main session must self-judge each proposal before bothering the user. Default toward escalation only when judgment is genuinely needed; reduce user fatigue by handling unambiguous items directly.\n\n**auto-approve** — apply without asking. Use when ALL of the following hold:\n- Type is `proposal` (never auto-approve `decision` type).\n- The fix is mechanical or clearly correct: typo, naming consistency, missing field obviously required by an already-agreed contract, internal-coherence sync, trivially missing standard error handling, dependency-order swap that doesn't change scope.\n- Affected locations are fully concretized and the change is local (no cascading rewrites of unrelated sections).\n- No business logic, no API surface decision, no security\u002Fcompliance trade-off, no UX choice, no tech-stack swap.\n- A reasonable senior engineer would not pause on this.\n\n**auto-reject** — log as Acknowledged without asking. Use when ANY of the following hold:\n- The proposal is a false positive: the concern is already addressed elsewhere in the document (cite the section).\n- Out of scope for the current document's stated purpose.\n- Contradicts an explicit decision already recorded in the document.\n- Duplicate of an item already in `## Acknowledged Items`.\n\n**escalate** — forward to user via AskUserQuestion. Use when:\n- Type is `decision` (subject to the §8 auto-decide refinement — may be intercepted by `re_evaluate_decision` if `AUTO_DECIDE_ENABLED=true`).\n- Type is `proposal` but the fix involves business judgment, API\u002Fdata contract change, security\u002Fcompliance trade-off, UX choice, or non-trivial scope.\n- You are uncertain — when in doubt, escalate. Self-triage should err on the side of escalation, never on the side of silently dropping a real concern.\n\n**Severity upgrade authority** (§3.11): during self-triage, if the main session discovers hidden risk, it MAY upgrade severity **unidirectionally** (trivial → minor → major → critical). Downgrades are forbidden — agent's conservative assignment is preserved. When upgrading, append an informational marker to `review_log.md`:\n\n```\n- PROP-R{round}-{N} [SEVERITY-UPGRADED] minor → major: {reason}\n```\n\n**Logging requirement**: For every auto-handled item, write a one-line rationale in `review_log.md`:\n\n```\n- PROP-R{round}-{N} [AUTO-APPROVED|AUTO-REJECTED]: {one-line rationale}\n```\n\n## Approval UX\n\nPresent escalated proposals item-by-item via AskUserQuestion, batched up to 4 at a time. No \"approve all\" option — every escalated proposal requires individual review.\n\n### Batch announcement (Korean, required when >4 items)\n\nWhen more than 4 escalated proposals exist in a single round, split across multiple AskUserQuestion calls. **Before the first call**, emit a Korean batch announcement to the user. **Do NOT mention internal tool constraints** (e.g., \"AskUserQuestion 4개 한계\", \"tool limit\", \"call 분할\"); frame it as UX pacing.\n\nTemplate:\n\n```\n에스컬레이션 항목 {N}건을 {K}차에 걸쳐 나누어 질문드립니다 (1차 {n1}건, 2차 {n2}건, ...).\n순서대로 답변해 주세요. 중간에 \"그만\" 또는 \"잠깐\" 입력하면 남은 항목은 보류됩니다.\n```\n\nBefore each subsequent call:\n\n```\n{k}차 질문 ({nk}건) — 남은 {remaining}건:\n```\n\nDo not mention \"batch\" \u002F \"call\" \u002F \"분할\" \u002F \"AskUserQuestion\" \u002F \"4개 한계\" in user-visible text.\n\n### For Proposal type\n\n- Present the agent's concept together with the main session's concretized scope (affected locations and specific changes).\n- Options: \"승인\" (with description of what will be applied) and \"거부 (현재 유지)\" (with note that the item won't be re-reported).\n\n### For Decision type\n\n- Dynamically construct AskUserQuestion options from the agent's Options field (up to 4 options per question).\n- Include agent recommendation if present (append \"(에이전트 추천)\" to the label).\n- If the proposal has more than 4 options, present the first 4 in the primary question and mention additional alternatives in the question text from the Agent note field — do NOT split one proposal's options across two questions.\n\n### Other input\n\nThe user may type free-form text instead of selecting an option. This is handled by the Processing Protocol below — including reversion intent (§8.11) and auto-decide opt-out (§8.12).\n\n## Processing Protocol\n\nFor each user response to a proposal prompt, the main session must first pre-check for **opt-out trigger** (§8.12) and **reversion trigger** (§8.11) using the regex patterns in Control-Flow Invariants above.\n\n**If either pre-check matches, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F02-processing-protocol-detail.md`** and execute the full action sequence. Otherwise, proceed with normal disposition handling below.\n\n### Disposition handling (normal path)\n\n- **\"승인\" selected** (or a Decision option selected): Apply the change to the design document using the concretized scope. Log as `[APPROVED]` in `review_log.md`.\n- **\"거부 (현재 유지)\" selected**: Record the item under `## Acknowledged Items` in `review_log.md`. Log as `[REJECTED]`. Future agents will skip this item.\n- **Other input** (not matching any pre-check above): Main session interprets the input in context:\n  - **Modification request** (e.g., \"statusCode 말고 status_code로\", \"섹션 5.2는 빼줘\"): Re-scope with the user's modification, apply the change. Log as `[MODIFIED]`.\n  - **Question or discussion** (e.g., \"기존 클라이언트 호환성은?\"): Answer the question via AskUserQuestion, then re-ask the same proposal. Continue this dialogue loop until the user gives an explicit decision (Ground Rule #6).\n  - **New direction** (e.g., \"인증을 아예 refresh token 방식으로 바꾸자\"): Apply the new direction with appropriate scope analysis. Log as `[USER-DIRECTED]`.\n\n## Application Mechanism\n\nThe main session applies approved changes (auto-approved, auto-decided, and user-approved) directly using the Edit tool. The agent never modifies the design document. Since concepts may affect multiple locations, the main session identifies all affected locations during scope analysis and applies changes in batch.\n\nIf an Edit fails, follow the Step 13 Edit-failure handling procedure (retry within round or defer to `pending_applies.md`).\n\n## Ground Rules\n\n1. **Propose first, then triage.** All issues are generated as concept proposals. The agent never modifies the design document directly. The main session self-triages each proposal: unambiguous fixes are auto-approved and applied, false positives are auto-rejected, and only items requiring judgment are escalated to the user.\n2. **Agent Loop required.** Phase 2 iterative inner review must use the agent-based loop. Exit requires either severity saturation (`consecutive_no_major >= 2` + empty pending + no in-progress dialogues) or the user's explicit 3-option choice at inner safety limit.\n3. **Agent independence.** Each review agent reviews the document from scratch. Previous round results are only accessed via `$INNER_TEMP_DIR\u002Freview_log.md`, which is seeded with the outer-persistent ack set at the start of each outer iteration.\n4. **Review log required.** Every round's results must be recorded in `$INNER_TEMP_DIR\u002Freview_log.md` with disposition tags: `[AUTO-APPROVED]`, `[AUTO-REJECTED]`, `[AUTO-DECIDED]`, `[APPROVED]`, `[REJECTED]`, `[MODIFIED]`, `[USER-DIRECTED]`. Informational markers (`[SEVERITY-UPGRADED]`, `[REVERTED-BY-USER]`, `[REVERT-FAILED]`) are appended as needed but never count toward any metric.\n5. **Respect acknowledged items.** Items decided to keep as-is (rejected and auto-rejected proposals) must not be re-reported in subsequent rounds or iterations. The outer-persistent `ack_items.md` enforces this across the whole outer session.\n6. **Triage bias toward escalation.** When the main session is uncertain whether a proposal is unambiguous, it MUST escalate. Self-triage exists to reduce trivial questions, never to silently override user authority on judgment calls.\n7. **Never decide for the user.** When the user responds to a pending decision with a follow-up question, a request for more context, or a discussion point, this is NOT a decision. Continue the conversation via AskUserQuestion until the user states an explicit decision. A decision is only confirmed when the user clearly says what to do (e.g., \"A로 가자\", \"현재 유지\", \"변경해줘\"). Questions like \"그러면 ~는 어떻게 되나요?\" or \"~에 대해 좀 더 설명해줘\" are continuation signals, not decisions. This rule applies equally to Other input handling in the Processing Protocol.\n\n   **GR#7 Amendment (§8.10)** — When invoked with `--auto-decide-dominant`, the main session MAY bypass user presentation for `decision`-type proposals that satisfy the Dominance Threshold (§8). This exception is narrowly scoped: it applies only to items that have never entered the dialogue loop. Any item the user has seen, is currently seeing, or has asked a follow-up about remains fully governed by the paragraph above. Auto-decided items MUST be logged per the Auto-Decide Audit Schema (see `references\u002F04-file-schemas.md` + `references\u002F01-auto-decide-protocol.md`) and are subject to user revert per §8.11.\n\n## Options\n\n### --base\n\nBase design review mode. When `$ARGUMENTS` contains `--base`, add the following constraint block to the review agent prompt in place of `{BASE_MODE_CONSTRAINT}`:\n\n```\nBASE MODE CONSTRAINT:\nVerify consistency and completeness of the existing design content. Do NOT propose adding new implementation details.\n- DO propose: inconsistencies, contradictions, or missing interface definitions between existing sections.\n- DO propose: essential supplements to existing content that are clearly needed for consistency (will be confirmed with user).\n- DON'T propose: adding new implementation details that don't currently exist (these belong to task-level design).\n- DON'T propose: removing or reducing existing detailed design content.\n```\n\nWhen `--base` is not present, remove the `{BASE_MODE_CONSTRAINT}` placeholder line from the agent prompt.\n\n### --auto-decide-dominant \u002F --no-auto-decide-dominant\n\nDecision Auto-Select Protocol (§8) is **ON BY DEFAULT**. When the main session's independent re-evaluation identifies a dominant option for a `decision`-type proposal, it is auto-picked and recorded as `[AUTO-DECIDED]`. This minimizes user fatigue while preserving safety via the §8 guards.\n\n**Flag semantics**:\n\n- **(default, no flag)**: auto-decide enabled. Equivalent to passing `--auto-decide-dominant` explicitly.\n- **`--auto-decide-dominant`**: explicit opt-in (no-op when default is enabled — kept for backward-compatible documentation and explicit invocations).\n- **`--no-auto-decide-dominant`**: opt-out. Disables auto-decide for the entire session. All `decision`-type proposals escalate to the user as in pre-refinement behavior.\n\nWhen auto-decide is active:\n\n- `re_evaluate_decision` is called for each `decision`-type proposal after self-triage and before user escalation (Phase 2 Step 12.f).\n- Blackout categories (B1–B10 with B7\u002FB8\u002FB9 conditional checklists — see `references\u002F01-auto-decide-protocol.md`) are always escalated regardless of dominance analysis.\n- `AUTO_DECIDE_ENABLED` flag is restored from `outer_log.md` at the start of every outer iter (§8.12 persistence) — Claude Code bash vars are volatile across turns.\n- First-time Korean notice is emitted once at session start (§8.9, in Phase 1 step 4).\n- Mid-session opt-out is accepted at any dialogue-loop prompt via the phrase patterns in the Control-Flow Invariants regex (details in `references\u002F02-processing-protocol-detail.md`). Once opted out, re-activation is forbidden for the remainder of the session.\n- User may revert any auto-decision via PROP-Rx-y or AUTO-NNN reference at any dialogue-loop prompt (§8.11; details in `references\u002F02-processing-protocol-detail.md`).\n- **Outer cycle continuation guarantee**: any iteration that produces ≥1 `[AUTO-DECIDED]` item naturally satisfies `COUNT_APPLIED > 0` (since `[AUTO-DECIDED]` is included in the COUNT_APPLIED formula — see Control-Flow Invariants), forcing the outer loop to run another iteration and re-verify the auto-decision's ripple effects with a fresh agent group. No special-case logic needed — this falls out of the existing termination predicate.\n\nFlag parsing is done together with `--base` in Phase 1 step 2 (all three flags are stripped from `ARGS_CLEAN`; presence is detected into `BASE_MODE` and `AUTO_DECIDE_INITIAL` booleans). `AUTO_DECIDE_INITIAL` defaults to `true`; `--no-auto-decide-dominant` flips it to `false`.\n\n**The flag is NOT propagated to review agents** — auto-decide is a main-session-only mechanism.\n\n## Begin\n\n$ARGUMENTS\n","Perform a final review of the design document using a two-tier cycle (outer + inner).\n\nAll analysis work and inter-agent communication should be in English to optimize token usage.\nUser-facing communication (summaries, questions, status updates) should be in Korean.\n\n## Overview\n\nThis command wraps `design-review`'s inner loop in an outer cycle. Each outer iteration spawns a **completely fresh** inner loop against the current document state with a cleared `INNER_TEMP_DIR`, preserving only the user-persistent `ack_items.md` and the design document itself. This prevents the \"context poisoning\" where long inner loops drift from re-confirmation toward rebuttal, while still letting ack items ratchet across iterations.\n\nThe outer cycle exits when an inner iteration reaches `clean-convergence` (§3.11 severity + saturation rule) AND no escalation was actually applied during that iteration (`COUNT_APPLIED == 0`, §3.3 step 17 \u002F §8.8 formula).\n\n## Review Criteria\n\nRequirement consistency, internal coherence, feasibility, implementation order, missing items, and any other perspective important in the context of this specific design.\n\n---\n\n## Control-Flow Invariants\n\nThese formulas govern termination and classification. They MUST remain inline (not in `references\u002F`) because SKILL.md has post-compaction re-attachment priority (first ~5K tokens) while `references\u002F` reads may be summarized away. A summarized invariant yields silent mis-termination.\n\n### Inner convergence predicate (§3.11)\n\n```\ninner_converged_cleanly() =\n    (consecutive_no_major >= 2)\n    AND (pending_applies.md is empty — no ### PEND- headers between --- and EOF)\n    AND (no [IN PROGRESS] dialogues)\n```\n\nSeverity aggregation for `consecutive_no_major`:\n\n```\n# Count proposals emitted this round, using their FINAL severity\n# (= initial agent severity + any [SEVERITY-UPGRADED] in this round).\n# Disposition is IRRELEVANT: [APPROVED], [MODIFIED], [USER-DIRECTED],\n# [AUTO-DECIDED], [AUTO-APPROVED], [REJECTED], [AUTO-REJECTED] all count\n# if the proposal's severity is critical\u002Fmajor.\nfinal_critical_or_major = |{p : p.severity (post-upgrade) ∈ {critical, major}}|\n\nif final_critical_or_major == 0:\n  consecutive_no_major += 1\nelse:\n  consecutive_no_major = 0   # even a single approved major resets\n```\n\n**Critical rule**: severity is a property of the **proposal itself**, not its outcome. A `[APPROVED]` major proposal still counts toward `final_critical_or_major`. `consecutive_no_major` increments only when the round produces **zero** critical\u002Fmajor proposals — regardless of how many were resolved. Background\u002Frationale → see `references\u002F03-severity-exit-policy.md`.\n\n### Outer termination judgment (§3.3 Step 22)\n\n```\nif INNER_EXIT_REASON == \"safety-limit-outer-terminate\":\n    break outer loop → Phase 3                      # user explicitly aborted\nelif INNER_EXIT_REASON == \"safety-limit-fresh-outer\":\n    outer_done = false                              # bypass convergence judgment\nelif INNER_EXIT_REASON == \"clean-convergence\" and COUNT_APPLIED == 0:\n    outer_done = true                               # fixpoint reached\nelse:\n    outer_done = false                              # COUNT_APPLIED > 0 → another iter\n```\n\n**MIN_OUTER = 1**: even the first iteration may terminate if the fixpoint rule fires.\n\n### `COUNT_APPLIED` aggregation (§3.3 Step 17 \u002F §8.8 dedup)\n\n```\n(a) Collect all lines in $INNER_TEMP_DIR\u002Freview_log.md tagged\n    [APPROVED], [MODIFIED], [USER-DIRECTED], [AUTO-DECIDED].\n(b) Group by PROP-ID (e.g., PROP-R2-3).\n(c) For each group:\n    - If both [AUTO-DECIDED] and [USER-DIRECTED] appear (revert scenario, §8.11),\n      count only [USER-DIRECTED] (the [AUTO-DECIDED] is collapsed out).\n    - If partial_apply=true markers exist for the proposal at multiple locations,\n      count 1 per group (not per location).\n    - Otherwise, 1 per group.\n(d) COUNT_APPLIED = sum of group counts.\n```\n\n### `escalate_applied` formula (§8.8)\n\n```\nraw_count = count([APPROVED]) + count([MODIFIED]) + count([USER-DIRECTED]) + count([AUTO-DECIDED])\n\nescalate_applied = raw_count\n                 − |{PROP-ID groups where [AUTO-DECIDED] AND [USER-DIRECTED] co-exist}|\n                 − |partial_apply duplicates within group|\n```\n\n`[AUTO-DECIDED]` is counted — otherwise silent termination risk (F5). Uncounted tags: `[AUTO-APPROVED]`, `[AUTO-REJECTED]`, `[REJECTED]`.\n\n### Disposition tag set (§3.5 + §8.8)\n\n| Tag | 문서 변경 | escalate_applied | Ack set |\n|---|---|---|---|\n| `[AUTO-APPROVED]` | ✓ | ✗ | ✗ |\n| `[AUTO-REJECTED]` | ✗ | ✗ | ✓ |\n| `[AUTO-DECIDED]` | ✓ | **✓** | ✗ |\n| `[APPROVED]` | ✓ | ✓ | ✗ |\n| `[REJECTED]` | ✗ | ✗ | ✓ |\n| `[MODIFIED]` | ✓ | ✓ | ✗ |\n| `[USER-DIRECTED]` | ✓ | ✓ | ✗ |\n\n**Informational markers** (not disposition tags; never counted; may appear alongside a disposition tag): `[SEVERITY-UPGRADED]` (§3.11), `[REVERTED-BY-USER]` (§8.11; supports `cascade=true` and `cascade-from=PROP-Rx-y`), `[REVERT-FAILED]` (§8.11).\n\n### Decision-type classifier (§8 top-level gate)\n\nOnly `decision`-type proposals are candidates for auto-decide. For each decision-type proposal after self-triage returns `escalate`, call `re_evaluate_decision` (details in `references\u002F01-auto-decide-protocol.md`):\n\n```\nauto-decide fires iff ALL of the following hold:\n  PRE-CHECK 0: blackout guard passes\n  AND PRE-CHECK A: single-option guard passes\n  AND (T1-A OR T1-B OR T1-C OR T2-AB)                         # dominance tier\n  AND signal #3: order-invariance\n  AND signal #4: dimension totality (embedded inside T1-C)\n  AND signal #5: no prior [AUTO-DECIDED] premises\n  AND signal #7: counterfactual self-test (T2 uses stricter bar)\n```\n\n**Rule of thumb**: \"When in doubt, escalate.\"\n\n### Processing Protocol trigger regex (§8.11, §8.12)\n\nOn every user response to a proposal prompt, match these patterns BEFORE normal disposition handling:\n\n- **§8.12 Opt-out trigger**: `(자동결정|자동 선택|auto.decide)` + `(중단|끄|해제|그만|비활성|수동|직접)`\n- **§8.11 Reversion trigger**: `(PROP-Rx-y|AUTO-NNN|방금|전부)` + `(취소|되돌리|번복|롤백|revert|undo)` — AUTO-NNN precedes PROP-ID on ID conflict.\n\nOn match, Read `references\u002F02-processing-protocol-detail.md` and execute the full action sequence. Otherwise fall through to the \"Disposition handling (normal path)\" below.\n\n---\n\n## Strategy\n\n### Phase 1: Outer Session Setup\n\n1. Read the full design document to verify existence and parseability.\n2. Parse `$ARGUMENTS` to detect and strip `--base`, `--auto-decide-dominant`, and `--no-auto-decide-dominant`. Auto-decide-dominant defaults ON; `--no-auto-decide-dominant` opts out. Create the outer-session directory and initialize files:\n\n```bash\n# --- Outer Session Isolation ---\n# 1. Command name\nCOMMAND_NAME=\"design-review-outer\"\n\n# 2. Strip flags from arguments\nARGS_CLEAN=$(echo \"$ARGUMENTS\" | awk '{\n  for(i=1;i\u003C=NF;i++) if($i!=\"--base\" && $i!=\"--auto-decide-dominant\" && $i!=\"--no-auto-decide-dominant\") printf \"%s%s\", $i, (i\u003CNF?\" \":\"\")\n}')\n\n# 3. Detect flags\n# Auto-decide-dominant is ON BY DEFAULT. Pass --no-auto-decide-dominant to disable.\n# --auto-decide-dominant remains accepted as an explicit opt-in (no-op when default is true)\n# for backward-compatible invocations and documentation clarity.\nBASE_MODE=false\nAUTO_DECIDE_INITIAL=true\nfor arg in $ARGUMENTS; do\n  [ \"$arg\" = \"--base\" ] && BASE_MODE=true\n  [ \"$arg\" = \"--auto-decide-dominant\" ] && AUTO_DECIDE_INITIAL=true\n  [ \"$arg\" = \"--no-auto-decide-dominant\" ] && AUTO_DECIDE_INITIAL=false\ndone\n\n# 4. REPO_NAME extraction (document stem → repo basename → cwd basename)\nREPO_NAME=$(echo \"$ARGS_CLEAN\" | awk '{print $1}' | xargs basename 2>\u002Fdev\u002Fnull)\nREPO_NAME=\"${REPO_NAME%.md}\"\n[ -z \"$REPO_NAME\" ] && REPO_NAME=$(git rev-parse --show-toplevel 2>\u002Fdev\u002Fnull | xargs basename)\n[ -z \"$REPO_NAME\" ] && REPO_NAME=$(basename \"$(pwd)\")\n[ -z \"$REPO_NAME\" ] && REPO_NAME=\"unknown\"\nREPO_NAME=$(echo \"$REPO_NAME\" | tr -cs 'a-zA-Z0-9_-' '_' | sed 's\u002F^_\u002F\u002F;s\u002F_$\u002F\u002F' | cut -c1-30)\nREPO_NAME=\"${REPO_NAME%_}\"\n\n# 5. Outer session ID & directory\nOUTER_TS=$(date +%Y%m%d_%H%M%S)\nOUTER_SESSION_ID=\"${COMMAND_NAME}_${REPO_NAME}_${OUTER_TS}\"\nOUTER_DIR=\"docs\u002F_temp\u002F${OUTER_SESSION_ID}\"\nmkdir -p \"$OUTER_DIR\"\n```\n\n3. **Before initializing the three outer-persistent files, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F04-file-schemas.md`** for the canonical schemas of `outer_log.md`, `ack_items.md`, and `convergence_table.md`. Then initialize:\n\n```bash\n# outer_log.md header\ncat > \"$OUTER_DIR\u002Fouter_log.md\" \u003C\u003CEOF\n# Outer Cycle Audit Log\n\n\u003C!--\nSession: ${OUTER_SESSION_ID}\nDocument: $(echo \"$ARGS_CLEAN\" | awk '{print $1}')\nStarted: $(date -u +%Y-%m-%dT%H:%M:%SZ)\nAUTO_DECIDE_INITIAL: ${AUTO_DECIDE_INITIAL}\nBASE_MODE: ${BASE_MODE}\n-->\nEOF\n\n# ack_items.md header\ncat > \"$OUTER_DIR\u002Fack_items.md\" \u003C\u003C'EOF'\n# Acknowledged Items\n\n_Items decided to keep as-is during this design-review session. Do NOT re-propose._\n\n---\nEOF\n\n# convergence_table.md headers (two tables — see references\u002F04-file-schemas.md)\ncat > \"$OUTER_DIR\u002Fconvergence_table.md\" \u003C\u003C'EOF'\n# Convergence Tables\n\n## 처리 결과 현황표\n\n| 이터 | 라운드 | 자동승인 | 자동거부 | 자동결정 | 에스적용 | 에스거부 |\n| :--: | :----: | :------: | :------: | :------: | :------: | :------: |\n\n## 수렴 진단표\n\n| 이터 | 적용실패 | 부분종료 | ack수 |  종료사유  |\n| :--: | :------: | :------: | :---: | :--------: |\nEOF\n```\n\n4. **First-time auto-decide warning** (§8.9): Auto-decide-dominant is **ON by default**. If `AUTO_DECIDE_INITIAL=true` (i.e., the user did not pass `--no-auto-decide-dominant`), **eager-load `${CLAUDE_SKILL_DIR}\u002Freferences\u002F01-auto-decide-protocol.md`** (this is the §8 algorithm). Then emit this Korean warning to the user exactly once at session start:\n\n```\nℹ️ 자동결정 모드가 활성화되어 있습니다 (기본값).\n\n일부 결정형 제안이 사용자 확인 없이 자동 선택될 수 있습니다.\n자동결정이 발생한 이터레이션은 외부 사이클이 한 번 더 진행되어 fresh agent 그룹이 ripple 효과를 독립 검증합니다.\n\n자동 선택 내역은 매 이터레이션 요약의 '자동 선택 내역' 섹션에서 확인할 수 있습니다.\n되돌리려면 다음 에스컬레이션 프롬프트에 \"PROP-Rx-y 자동결정 취소해줘\" 또는\n\"AUTO-NNN 롤백\"을 입력하세요 (대화 프롬프트 시점에만 입력 가능).\n자동 결정을 즉시 중단하려면 \"자동 선택 중단\"이라고 입력하세요.\n이번 세션 전체에서 비활성화하려면 다음 호출 시 \"--no-auto-decide-dominant\" 플래그를 추가하세요.\n```\n\n5. Initialize outer loop state: `outer_iter = 0`, `outer_done = false`. Proceed to Phase 2.\n\n### Phase 2: Outer Iteration Loop\n\nLoop while `outer_done == false`:\n\n**Step 6 — Advance outer iteration**: `outer_iter += 1`\n\n**Step 6.5 — Restore `AUTO_DECIDE_ENABLED` from file** (§8.12 persistence):\n\nClaude Code bash variables are volatile across turns, so the runtime flag must be restored from `outer_log.md` at the start of every outer iteration:\n\n```bash\n# If ### Auto-Decide Opt-Out section exists in outer_log.md, opt-out is active\nif grep -q '^### Auto-Decide Opt-Out$' \"$OUTER_DIR\u002Fouter_log.md\" 2>\u002Fdev\u002Fnull; then\n  AUTO_DECIDE_ENABLED=false\nelse\n  AUTO_DECIDE_ENABLED=${AUTO_DECIDE_INITIAL}\nfi\n```\n\n**Step 7 — INNER_TEMP_DIR**:\n\n```bash\nINNER_TEMP_DIR=\"${OUTER_DIR}\u002Fiter-$(printf '%03d' $outer_iter)\"\nmkdir -p \"$INNER_TEMP_DIR\"\n```\n\n**Step 8–9 — Empty inner files** (schemas in `references\u002F04-file-schemas.md`):\n\n```bash\necho \"\" > \"$INNER_TEMP_DIR\u002Freview_proposals.md\"\ncat > \"$INNER_TEMP_DIR\u002Fpending_applies.md\" \u003C\u003C'EOF'\n# Pending Applies\n\n_Edit operations deferred from their originating round. Must be empty for inner convergence._\n\n---\nEOF\n```\n\n**Step 10 — Initialize `review_log.md` with ack seed**:\n\n```bash\n{\n  echo \"# Design Review Log\"\n  echo \"\"\n  echo \"\u003C!-- Outer session: ${OUTER_SESSION_ID}, outer iter: ${outer_iter} -->\"\n  echo \"\"\n  echo \"## Acknowledged Items\"\n  echo \"\"\n  # Copy the body of ack_items.md (after the \"---\" separator) into this section\n  awk '\u002F^---$\u002F{found=1; next} found' \"$OUTER_DIR\u002Fack_items.md\"\n  echo \"\"\n} > \"$INNER_TEMP_DIR\u002Freview_log.md\"\n```\n\nThe review agent prompt instructs it to read the `## Acknowledged Items` section and skip duplicates — no agent-prompt change is required for ack injection.\n\n**Step 11 — Reset inner state**: `inner_round = 0`, `consecutive_no_major = 0`, `INNER_EXIT_REASON = null`.\n\n---\n\n#### INNER PHASE 2 LOOP\n\nPerform agent-based iterative review until severity saturation (§3.11). Each round spawns a **fresh** review agent that independently reviews the document from scratch.\n\n**Step 12** — `inner_round += 1`. Spawn a review agent.\n\n**Before spawning the review agent, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F06-review-agent-prompt.md`** and substitute `{TEMP_DIR}` (= actual `INNER_TEMP_DIR`) and `{BASE_MODE_CONSTRAINT}` (the `--base` block when `BASE_MODE=true`, else empty) per the file's substitution contract, then prepend the path context block before calling `Agent()`.\n\nAfter the agent returns:\n\n  a. The agent wrote proposals to `$INNER_TEMP_DIR\u002Freview_proposals.md` (overwriting at round start), appended a round summary to `$INNER_TEMP_DIR\u002Freview_log.md`, and returned a structured summary including proposal count.\n  b. Read `$INNER_TEMP_DIR\u002Freview_proposals.md` to get the current round's proposals.\n  c. **For each proposal**, analyze its concept:\n     - **Proposal type**: Use the Reference text as a hint to identify all affected locations. Concretize the fix (what exactly will change, where).\n     - **Decision type**: Analyze the impact of each option so the user can make an informed choice.\n  d. **Self-Triage** (main session): Classify each proposal into `auto-approve`, `auto-reject`, or `escalate` per the Self-Triage Protocol below.\n  e. Apply auto-approved proposals directly via Edit. Log auto-rejected proposals to `## Acknowledged Items` (inline copy — the real outer-persistent extraction happens at Step 18). Both are recorded in `review_log.md` with `[AUTO-APPROVED]` \u002F `[AUTO-REJECTED]` tags and a one-line rationale.\n  f. **Auto-decide integration** (§8, conditional on `AUTO_DECIDE_ENABLED=true`): for each `decision`-type proposal, after self-triage decides \"escalate\", **Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F01-auto-decide-protocol.md` unconditionally** (recovery gate — post-compaction may have summarized away the eager-load), then call `re_evaluate_decision` (§8.4). If the verdict is `auto-pick`, record `[AUTO-DECIDED]` to `review_log.md`, apply the chosen option via Edit, and append an `AUTO-NNN` entry to the in-memory audit buffer for Step 20. If the verdict is `escalate`, fall through to the ask-user step. If `AUTO_DECIDE_ENABLED=false`, skip this hook entirely.\n  g. **If escalated proposals remain**: Present only those to the user via AskUserQuestion (in Korean). See \"Approval UX\" below.\n  h. Process user choices according to the \"Processing Protocol\" below. **Dialogue loop per Ground Rule #6**: if the user's response is a follow-up question or discussion rather than an explicit decision, continue the dialogue via AskUserQuestion until an explicit decision is given.\n  i. Update the round entry in `$INNER_TEMP_DIR\u002Freview_log.md` with disposition tags.\n  j. Briefly summarize this round's auto-handled items to the user in Korean (count + one-line per item) so they have visibility into self-triage decisions.\n\n**Step 13 — Edit failure handling**: If an Edit fails (e.g., `old_string` not unique, target text changed):\n  - Immediately notify the user: \"제안 #N 적용 중 일부 위치에서 실패: [원인]\"\n  - Re-analyze the failed location and propose an alternative.\n  - **Option A (apply after user confirmation)**: re-attempt with disambiguated context. On success, log disposition tag to `review_log.md`.\n  - **Option B (defer to next round)**: append a `PEND-NNN` block to `$INNER_TEMP_DIR\u002Fpending_applies.md` per the schema in `references\u002F04-file-schemas.md`.\n  - **Partial success**: log the proposal with a `partial_apply=true` marker and record the failed locations in `pending_applies.md`.\n  - Any `PEND-NNN` must later be resolved (success → remove block + log disposition; or user abandon → `[REJECTED]` + ack + remove block) before inner convergence is allowed.\n\n**Step 14 — Severity aggregation** (post-upgrade final values — disposition irrelevant): See Control-Flow Invariants above for the `consecutive_no_major` formula. **Before evaluating, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F03-severity-exit-policy.md`** for the tier taxonomy + main-session severity rules + the severity-vs-disposition orthogonality example.\n\n**Step 15 — Inner convergence guard**: See Control-Flow Invariants (`inner_converged_cleanly()`). If true, set `INNER_EXIT_REASON = \"clean-convergence\"` and break out of the inner loop.\n\n**Step 16 — Inner safety limit (20 rounds)**:\n\nIf `inner_round >= 20`, **Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F05-korean-ux-templates.md`** for the §3.9.4.b \u002F §3.9.4.c prompt templates, then present 3 options via AskUserQuestion. Dynamic recommendation:\n\n- `pending_dialogue > 0` → recommend **A: 10회 추가 진행** (finish open dialogues)\n- `pending_dialogue == 0` → recommend **B: 이번 이터레이션 종료 후 새 이터레이션 시작** (escape stuck inner, preserve outer progress)\n\nOption mapping to `INNER_EXIT_REASON`:\n\n| Option | Action | INNER_EXIT_REASON |\n|---|---|---|\n| A: 10 라운드 추가 진행 | extend inner loop by 10 rounds (repeatable) | (not set, continue) |\n| B: 이번 이터레이션 종료 후 새 이터레이션 시작 | break inner loop; next outer iter re-reviews from doc state | `safety-limit-fresh-outer` |\n| C: 외부 이터레이션 전체 종료 | break inner loop; skip directly to Phase 3 cleanup | `safety-limit-outer-terminate` |\n\n**Option B invariant**: A stuck inner loop must never block outer progress. Ack + document state are preserved, so the next fresh agent can re-review. Outer exit check (Step 22) bypasses convergence judgment when `INNER_EXIT_REASON == \"safety-limit-fresh-outer\"` — always continue.\n\nIf exit condition not met and not at safety limit → return to Step 12 with a new agent.\n\n---\n\n#### INNER LOOP COMPLETE — Per-iteration summary work (Step 17–21)\n\n**Step 17 — Compute `COUNT_APPLIED`**: Use the formula in Control-Flow Invariants. Feeds Step 22.\n\n**Step 18 — Extract new ack items**:\n\n**Before writing, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F04-file-schemas.md`** for the `ack_items.md` schema (8-field record, dedup rule).\n\nParse `$INNER_TEMP_DIR\u002Freview_log.md` for `[REJECTED]` and `[AUTO-REJECTED]` lines. For each, compose an `ACK-NNN` record with the 8 fields (Source, Disposition, Category, Location, Issue, Reference text, User\u002FAuto-reject rationale, Recorded).\n\n**Dedup rule** (§3.7): an ack is a duplicate of an existing entry in `$OUTER_DIR\u002Fack_items.md` iff ALL three conditions hold:\n\n1. `Category` matches exactly (controlled vocabulary: one of the 6 review categories)\n2. `Location` refers to the same section (case-insensitive, \"Section 4.3\" ≈ \"4.3 Auth Flow\")\n3. `Issue` describes the same root cause (main session semantic judgment)\n\nAppend only non-duplicate records to `$OUTER_DIR\u002Fack_items.md` under a new `### From Iteration N` heading. **If zero new items are extracted for this iteration, do not append the `### From Iteration N` block at all.** Use monotonic zero-padded IDs (`ACK-001`, `ACK-002`, …).\n\n**Step 19 — Append convergence table rows**:\n\n**Before writing, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F04-file-schemas.md`** for the `convergence_table.md` row format, then append one row to each of the two tables in `$OUTER_DIR\u002Fconvergence_table.md` (§8.13.4):\n\n```markdown\n| {iter} | {rounds} | {auto_approved} | {auto_rejected} | {auto_decided} | {escalate_applied} | {escalate_rejected} |\n| {iter} | {max_pending_applies} | {아니오|예} | {ack_size_after} | {exit_reason_ko} |\n```\n\nWhere:\n- Mark the iter column with ` ⚠️` suffix if `INNER_EXIT_REASON != \"clean-convergence\"` (partial iteration). Mark `escalate_applied` with `**0** ✓` bold-tick if the final value is 0 on a clean iteration.\n- `max_pending_applies` is the maximum size `pending_applies.md` reached during the iteration (not the final value).\n- `partial_flag` = `예` if `INNER_EXIT_REASON != \"clean-convergence\"`, else `아니오`\n- `exit_reason_ko` ∈ {`정상수렴`, `내부한계`, `사용자중단`}\n- **Invariant**: `exit_reason_ko == \"정상수렴\"` ⇒ `partial_flag == \"아니오\"`.\n\n**Step 20 — Append outer_log.md iteration entry**:\n\n**Before writing, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F04-file-schemas.md`** for the `outer_log.md` Auto-Decides canonical schema. Append to `$OUTER_DIR\u002Fouter_log.md`:\n\n```markdown\n## Outer Iteration {outer_iter}\n\n- Started: {ISO8601}\n- Ended: {ISO8601}\n- Inner TEMP_DIR: {INNER_TEMP_DIR}\n- Inner rounds run: {n}\n- Inner exit reason: {clean-convergence | safety-limit-fresh-outer | safety-limit-outer-terminate | user-abort}\n- Partial iteration: {true|false}\n\n### Escalate Counter Breakdown\n\n- [APPROVED]: {count} \"proposal IDs: ...\"\n- [MODIFIED]: {count} \"proposal IDs: ...\"\n- [USER-DIRECTED]: {count} \"proposal IDs: ...\"\n- [AUTO-DECIDED]: {count} \"proposal IDs: ...\"\n- escalate_applied: {COUNT_APPLIED}  ← termination input (raw_count − dedup correction per §8.8)\n- [REJECTED]: {count} ← NOT counted; added to ack set\n- [AUTO-APPROVED]: {count} ← NOT counted\n- [AUTO-REJECTED]: {count} ← NOT counted; added to ack set\n- pending_applies_at_end: {\"(none)\" | PEND-NNN list}\n- auto_decide_opt_out: {false | \"true (triggered at round r, phrase: '...')\"}\n\n### Auto-Decides\n\n(Emit this subsection only if at least one [AUTO-DECIDED] occurred this iteration — canonical schema in references\u002F04-file-schemas.md)\n\n### Ack Set Delta\n\n- Before: {size_before}\n- Added: {list of new ACK-NNN IDs}\n- After: {size_after}\n\n### Document Mutations Summary\n\n- Files touched: {list}\n- Total Edit ops: {n} (success: {s}, failed initially: {f}, eventually resolved: {r})\n\n### Termination Decision\n\n- outer_should_terminate: {true|false}\n- Rule fired: {fixpoint | outer-limit-reached | safety-limit-outer-terminate | continue}\n- Next action: {continue to iter i+1 | ask user to extend | Phase 3}\n```\n\n**AUTO-NNN** is a session-monotone audit ID — allocate the next free number across all `### Auto-Decides` subsections in `outer_log.md` (start from `AUTO-001`). Claude Code bash variables are volatile; source the next free number by grepping existing entries: `grep -c '^- AUTO-' \"$OUTER_DIR\u002Fouter_log.md\" 2>\u002Fdev\u002Fnull || echo 0`.\n\n**Step 21 — Delete `INNER_TEMP_DIR`** (path guarded):\n\n```bash\n[[ \"$INNER_TEMP_DIR\" == \"${OUTER_DIR}\"\u002F* ]] && rm -rf \"$INNER_TEMP_DIR\"\n```\n\nThis deliberate wipe prevents \"context poisoning\" — the next iteration's fresh agent starts with only the ack seed and the document itself.\n\n---\n\n#### Outer Exit Check (Step 22–25)\n\n**Step 22 — Outer termination judgment**: See Control-Flow Invariants for the decision tree.\n\n**Step 23 — Ack soft-limit check** (§3.7, only if `outer_done == false`):\n\nCount entries in `$OUTER_DIR\u002Fack_items.md` (lines starting with `#### ACK-`):\n\n- **50 items**: advisory — append a one-line warning to the next iteration-transition summary: `⚠️ 인지됨 항목 {n}건 (50건 권고치 초과)`\n- **100 items**: hard — ask the user via AskUserQuestion with three options:\n\n| Label | Action |\n|---|---|\n| A: 요약 | Compress old ack entries into one-line-per-category summaries |\n| B: 보관 | Move entries from previous iterations to `$OUTER_DIR\u002Fack_archive.md`, keep only current iter active |\n| C: 현재 유지 | Accept the prompt-length cost and do nothing |\n\nOnly run this check when `outer_done == false` — when `outer_done == true`, cleanup is imminent so ack size no longer matters.\n\n**Step 24 — Outer safety limit (default 5 iterations)**:\n\nIf `outer_iter >= 5 AND outer_done == false`, **Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F05-korean-ux-templates.md`** for the §3.9.4.a prompt template, then present the extension\u002Fterminate prompt:\n\nAskUserQuestion options: \"5회 추가 진행\" \u002F \"현재 상태로 종료\". If the user chooses to terminate, break outer loop → Phase 3. If extended, raise the outer cap by 5 and continue.\n\n**Step 25 — Iteration transition summary + auto-advance** (only if `outer_done == false`):\n\n**Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F05-korean-ux-templates.md`** for the iteration-transition summary block (§3.9.2 \u002F §8.13.3) and the split convergence table (§3.9.3 \u002F §8.13.4). Emit them in Korean. No countdown or confirmation — auto-advance immediately to the next outer iteration.\n\nUser intervention only occurs at (1) outer safety limit prompt, (2) inner safety limit prompt, (3) escalated AskUserQuestion for individual proposals.\n\n### Phase 3: Outer Cleanup\n\n1. **Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F05-korean-ux-templates.md`** for the §3.9.4.e final completion summary template, then emit it in Korean (includes the `자동 결정` sub-line per §8.8\u002F§8.13.3 supersession).\n2. Delete the outer directory (path guarded):\n\n```bash\n[[ \"$OUTER_DIR\" == docs\u002F_temp\u002F* ]] && rm -rf \"$OUTER_DIR\"\n```\n\n## Self-Triage Protocol\n\nThe main session must self-judge each proposal before bothering the user. Default toward escalation only when judgment is genuinely needed; reduce user fatigue by handling unambiguous items directly.\n\n**auto-approve** — apply without asking. Use when ALL of the following hold:\n- Type is `proposal` (never auto-approve `decision` type).\n- The fix is mechanical or clearly correct: typo, naming consistency, missing field obviously required by an already-agreed contract, internal-coherence sync, trivially missing standard error handling, dependency-order swap that doesn't change scope.\n- Affected locations are fully concretized and the change is local (no cascading rewrites of unrelated sections).\n- No business logic, no API surface decision, no security\u002Fcompliance trade-off, no UX choice, no tech-stack swap.\n- A reasonable senior engineer would not pause on this.\n\n**auto-reject** — log as Acknowledged without asking. Use when ANY of the following hold:\n- The proposal is a false positive: the concern is already addressed elsewhere in the document (cite the section).\n- Out of scope for the current document's stated purpose.\n- Contradicts an explicit decision already recorded in the document.\n- Duplicate of an item already in `## Acknowledged Items`.\n\n**escalate** — forward to user via AskUserQuestion. Use when:\n- Type is `decision` (subject to the §8 auto-decide refinement — may be intercepted by `re_evaluate_decision` if `AUTO_DECIDE_ENABLED=true`).\n- Type is `proposal` but the fix involves business judgment, API\u002Fdata contract change, security\u002Fcompliance trade-off, UX choice, or non-trivial scope.\n- You are uncertain — when in doubt, escalate. Self-triage should err on the side of escalation, never on the side of silently dropping a real concern.\n\n**Severity upgrade authority** (§3.11): during self-triage, if the main session discovers hidden risk, it MAY upgrade severity **unidirectionally** (trivial → minor → major → critical). Downgrades are forbidden — agent's conservative assignment is preserved. When upgrading, append an informational marker to `review_log.md`:\n\n```\n- PROP-R{round}-{N} [SEVERITY-UPGRADED] minor → major: {reason}\n```\n\n**Logging requirement**: For every auto-handled item, write a one-line rationale in `review_log.md`:\n\n```\n- PROP-R{round}-{N} [AUTO-APPROVED|AUTO-REJECTED]: {one-line rationale}\n```\n\n## Approval UX\n\nPresent escalated proposals item-by-item via AskUserQuestion, batched up to 4 at a time. No \"approve all\" option — every escalated proposal requires individual review.\n\n### Batch announcement (Korean, required when >4 items)\n\nWhen more than 4 escalated proposals exist in a single round, split across multiple AskUserQuestion calls. **Before the first call**, emit a Korean batch announcement to the user. **Do NOT mention internal tool constraints** (e.g., \"AskUserQuestion 4개 한계\", \"tool limit\", \"call 분할\"); frame it as UX pacing.\n\nTemplate:\n\n```\n에스컬레이션 항목 {N}건을 {K}차에 걸쳐 나누어 질문드립니다 (1차 {n1}건, 2차 {n2}건, ...).\n순서대로 답변해 주세요. 중간에 \"그만\" 또는 \"잠깐\" 입력하면 남은 항목은 보류됩니다.\n```\n\nBefore each subsequent call:\n\n```\n{k}차 질문 ({nk}건) — 남은 {remaining}건:\n```\n\nDo not mention \"batch\" \u002F \"call\" \u002F \"분할\" \u002F \"AskUserQuestion\" \u002F \"4개 한계\" in user-visible text.\n\n### For Proposal type\n\n- Present the agent's concept together with the main session's concretized scope (affected locations and specific changes).\n- Options: \"승인\" (with description of what will be applied) and \"거부 (현재 유지)\" (with note that the item won't be re-reported).\n\n### For Decision type\n\n- Dynamically construct AskUserQuestion options from the agent's Options field (up to 4 options per question).\n- Include agent recommendation if present (append \"(에이전트 추천)\" to the label).\n- If the proposal has more than 4 options, present the first 4 in the primary question and mention additional alternatives in the question text from the Agent note field — do NOT split one proposal's options across two questions.\n\n### Other input\n\nThe user may type free-form text instead of selecting an option. This is handled by the Processing Protocol below — including reversion intent (§8.11) and auto-decide opt-out (§8.12).\n\n## Processing Protocol\n\nFor each user response to a proposal prompt, the main session must first pre-check for **opt-out trigger** (§8.12) and **reversion trigger** (§8.11) using the regex patterns in Control-Flow Invariants above.\n\n**If either pre-check matches, Read `${CLAUDE_SKILL_DIR}\u002Freferences\u002F02-processing-protocol-detail.md`** and execute the full action sequence. Otherwise, proceed with normal disposition handling below.\n\n### Disposition handling (normal path)\n\n- **\"승인\" selected** (or a Decision option selected): Apply the change to the design document using the concretized scope. Log as `[APPROVED]` in `review_log.md`.\n- **\"거부 (현재 유지)\" selected**: Record the item under `## Acknowledged Items` in `review_log.md`. Log as `[REJECTED]`. Future agents will skip this item.\n- **Other input** (not matching any pre-check above): Main session interprets the input in context:\n  - **Modification request** (e.g., \"statusCode 말고 status_code로\", \"섹션 5.2는 빼줘\"): Re-scope with the user's modification, apply the change. Log as `[MODIFIED]`.\n  - **Question or discussion** (e.g., \"기존 클라이언트 호환성은?\"): Answer the question via AskUserQuestion, then re-ask the same proposal. Continue this dialogue loop until the user gives an explicit decision (Ground Rule #6).\n  - **New direction** (e.g., \"인증을 아예 refresh token 방식으로 바꾸자\"): Apply the new direction with appropriate scope analysis. Log as `[USER-DIRECTED]`.\n\n## Application Mechanism\n\nThe main session applies approved changes (auto-approved, auto-decided, and user-approved) directly using the Edit tool. The agent never modifies the design document. Since concepts may affect multiple locations, the main session identifies all affected locations during scope analysis and applies changes in batch.\n\nIf an Edit fails, follow the Step 13 Edit-failure handling procedure (retry within round or defer to `pending_applies.md`).\n\n## Ground Rules\n\n1. **Propose first, then triage.** All issues are generated as concept proposals. The agent never modifies the design document directly. The main session self-triages each proposal: unambiguous fixes are auto-approved and applied, false positives are auto-rejected, and only items requiring judgment are escalated to the user.\n2. **Agent Loop required.** Phase 2 iterative inner review must use the agent-based loop. Exit requires either severity saturation (`consecutive_no_major >= 2` + empty pending + no in-progress dialogues) or the user's explicit 3-option choice at inner safety limit.\n3. **Agent independence.** Each review agent reviews the document from scratch. Previous round results are only accessed via `$INNER_TEMP_DIR\u002Freview_log.md`, which is seeded with the outer-persistent ack set at the start of each outer iteration.\n4. **Review log required.** Every round's results must be recorded in `$INNER_TEMP_DIR\u002Freview_log.md` with disposition tags: `[AUTO-APPROVED]`, `[AUTO-REJECTED]`, `[AUTO-DECIDED]`, `[APPROVED]`, `[REJECTED]`, `[MODIFIED]`, `[USER-DIRECTED]`. Informational markers (`[SEVERITY-UPGRADED]`, `[REVERTED-BY-USER]`, `[REVERT-FAILED]`) are appended as needed but never count toward any metric.\n5. **Respect acknowledged items.** Items decided to keep as-is (rejected and auto-rejected proposals) must not be re-reported in subsequent rounds or iterations. The outer-persistent `ack_items.md` enforces this across the whole outer session.\n6. **Triage bias toward escalation.** When the main session is uncertain whether a proposal is unambiguous, it MUST escalate. Self-triage exists to reduce trivial questions, never to silently override user authority on judgment calls.\n7. **Never decide for the user.** When the user responds to a pending decision with a follow-up question, a request for more context, or a discussion point, this is NOT a decision. Continue the conversation via AskUserQuestion until the user states an explicit decision. A decision is only confirmed when the user clearly says what to do (e.g., \"A로 가자\", \"현재 유지\", \"변경해줘\"). Questions like \"그러면 ~는 어떻게 되나요?\" or \"~에 대해 좀 더 설명해줘\" are continuation signals, not decisions. This rule applies equally to Other input handling in the Processing Protocol.\n\n   **GR#7 Amendment (§8.10)** — When invoked with `--auto-decide-dominant`, the main session MAY bypass user presentation for `decision`-type proposals that satisfy the Dominance Threshold (§8). This exception is narrowly scoped: it applies only to items that have never entered the dialogue loop. Any item the user has seen, is currently seeing, or has asked a follow-up about remains fully governed by the paragraph above. Auto-decided items MUST be logged per the Auto-Decide Audit Schema (see `references\u002F04-file-schemas.md` + `references\u002F01-auto-decide-protocol.md`) and are subject to user revert per §8.11.\n\n## Options\n\n### --base\n\nBase design review mode. When `$ARGUMENTS` contains `--base`, add the following constraint block to the review agent prompt in place of `{BASE_MODE_CONSTRAINT}`:\n\n```\nBASE MODE CONSTRAINT:\nVerify consistency and completeness of the existing design content. Do NOT propose adding new implementation details.\n- DO propose: inconsistencies, contradictions, or missing interface definitions between existing sections.\n- DO propose: essential supplements to existing content that are clearly needed for consistency (will be confirmed with user).\n- DON'T propose: adding new implementation details that don't currently exist (these belong to task-level design).\n- DON'T propose: removing or reducing existing detailed design content.\n```\n\nWhen `--base` is not present, remove the `{BASE_MODE_CONSTRAINT}` placeholder line from the agent prompt.\n\n### --auto-decide-dominant \u002F --no-auto-decide-dominant\n\nDecision Auto-Select Protocol (§8) is **ON BY DEFAULT**. When the main session's independent re-evaluation identifies a dominant option for a `decision`-type proposal, it is auto-picked and recorded as `[AUTO-DECIDED]`. This minimizes user fatigue while preserving safety via the §8 guards.\n\n**Flag semantics**:\n\n- **(default, no flag)**: auto-decide enabled. Equivalent to passing `--auto-decide-dominant` explicitly.\n- **`--auto-decide-dominant`**: explicit opt-in (no-op when default is enabled — kept for backward-compatible documentation and explicit invocations).\n- **`--no-auto-decide-dominant`**: opt-out. Disables auto-decide for the entire session. All `decision`-type proposals escalate to the user as in pre-refinement behavior.\n\nWhen auto-decide is active:\n\n- `re_evaluate_decision` is called for each `decision`-type proposal after self-triage and before user escalation (Phase 2 Step 12.f).\n- Blackout categories (B1–B10 with B7\u002FB8\u002FB9 conditional checklists — see `references\u002F01-auto-decide-protocol.md`) are always escalated regardless of dominance analysis.\n- `AUTO_DECIDE_ENABLED` flag is restored from `outer_log.md` at the start of every outer iter (§8.12 persistence) — Claude Code bash vars are volatile across turns.\n- First-time Korean notice is emitted once at session start (§8.9, in Phase 1 step 4).\n- Mid-session opt-out is accepted at any dialogue-loop prompt via the phrase patterns in the Control-Flow Invariants regex (details in `references\u002F02-processing-protocol-detail.md`). Once opted out, re-activation is forbidden for the remainder of the session.\n- User may revert any auto-decision via PROP-Rx-y or AUTO-NNN reference at any dialogue-loop prompt (§8.11; details in `references\u002F02-processing-protocol-detail.md`).\n- **Outer cycle continuation guarantee**: any iteration that produces ≥1 `[AUTO-DECIDED]` item naturally satisfies `COUNT_APPLIED > 0` (since `[AUTO-DECIDED]` is included in the COUNT_APPLIED formula — see Control-Flow Invariants), forcing the outer loop to run another iteration and re-verify the auto-decision's ripple effects with a fresh agent group. No special-case logic needed — this falls out of the existing termination predicate.\n\nFlag parsing is done together with `--base` in Phase 1 step 2 (all three flags are stripped from `ARGS_CLEAN`; presence is detected into `BASE_MODE` and `AUTO_DECIDE_INITIAL` booleans). `AUTO_DECIDE_INITIAL` defaults to `true`; `--no-auto-decide-dominant` flips it to `false`.\n\n**The flag is NOT propagated to review agents** — auto-decide is a main-session-only mechanism.\n\n## Begin\n\n$ARGUMENTS\n",{"name":5,"description":7,"when_to_use":38,"disable-model-invocation":39},"작성된 설계 문서를 다중 반복 에이전트 리뷰(외부\u002F내부 사이클)로 최종 검증·수렴시키고자 할 때",true,"master","f5e7f5e77d5e8603b1ec0e9247198315c7910461","tests\u002Ffixtures\u002Freadme-gen\u002Fpre-yq-skills\u002Fdesign-review",1,"https:\u002F\u002Fgithub.com\u002FNharu\u002Fcc-cmds","https:\u002F\u002Fgithub.com\u002FNharu","2026-11-13 01:36:53",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":39},[49,52,55],{"tool":50,"command":51},"npx","npx skills add Nharu\u002Fcc-cmds --skill design-review",{"tool":53,"command":54},"bunx","bunx skills add Nharu\u002Fcc-cmds --skill design-review",{"tool":56,"command":57},"pnpm","pnpm dlx skills add Nharu\u002Fcc-cmds --skill design-review","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FNharu\u002Fcc-cmds\u002Fblob\u002Fmaster\u002Ftests\u002Ffixtures\u002Freadme-gen\u002Fpre-yq-skills\u002Fdesign-review\u002FSKILL.md",[60,66,70,76,80,84,88,92],{"path":61,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":64,"sourceHtmlUrl":65},"agents\u002Fartifact-analyzer.md","REFERENCE","参考文档",2646,"https:\u002F\u002Fgithub.com\u002Fdelorenj\u002FyTm\u002Fblob\u002Fmain\u002F.augment\u002Fskills\u002Fbmad-prfaq\u002Fagents\u002Fartifact-analyzer.md",{"path":67,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":68,"sourceHtmlUrl":69},"agents\u002Fweb-researcher.md",1756,"https:\u002F\u002Fgithub.com\u002Fdelorenj\u002FyTm\u002Fblob\u002Fmain\u002F.augment\u002Fskills\u002Fbmad-prfaq\u002Fagents\u002Fweb-researcher.md",{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"assets\u002Fprfaq-template.md","ASSET","资产文件",1434,"https:\u002F\u002Fgithub.com\u002Fdelorenj\u002FyTm\u002Fblob\u002Fmain\u002F.augment\u002Fskills\u002Fbmad-prfaq\u002Fassets\u002Fprfaq-template.md",{"path":77,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":78,"sourceHtmlUrl":79},"bmad-manifest.json",458,"https:\u002F\u002Fgithub.com\u002Fdelorenj\u002FyTm\u002Fblob\u002Fmain\u002F.augment\u002Fskills\u002Fbmad-prfaq\u002Fbmad-manifest.json",{"path":81,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":82,"sourceHtmlUrl":83},"references\u002Fcustomer-faq.md",3697,"https:\u002F\u002Fgithub.com\u002Fdelorenj\u002FyTm\u002Fblob\u002Fmain\u002F.augment\u002Fskills\u002Fbmad-prfaq\u002Freferences\u002Fcustomer-faq.md",{"path":85,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Finternal-faq.md",3928,"https:\u002F\u002Fgithub.com\u002Fdelorenj\u002FyTm\u002Fblob\u002Fmain\u002F.augment\u002Fskills\u002Fbmad-prfaq\u002Freferences\u002Finternal-faq.md",{"path":89,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Fpress-release.md",4308,"https:\u002F\u002Fgithub.com\u002Fdelorenj\u002FyTm\u002Fblob\u002Fmain\u002F.augment\u002Fskills\u002Fbmad-prfaq\u002Freferences\u002Fpress-release.md",{"path":93,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fverdict.md",4262,"https:\u002F\u002Fgithub.com\u002Fdelorenj\u002FyTm\u002Fblob\u002Fmain\u002F.augment\u002Fskills\u002Fbmad-prfaq\u002Freferences\u002Fverdict.md",[97,109,120,127,135,147],{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":33},"01M6DNB8T41Y37D3M9JKHFT7HV","zeroargs","zero-argument command","https:\u002F\u002Fgithub.com\u002FNharu\u002Fcc-cmds\u002Fblob\u002Fmaster\u002Ftests\u002Ffixtures\u002Freadme-gen\u002Fsimple\u002Fzeroargs\u002FSKILL.md",[],[99,104,105,106,107,108],"ZeRO","when","command","cc","argument",{"skillNo":110,"name":30,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":117,"publishedAt":33},"01M6DNB5TG3T9QMEF3HPKJPER0","에이전트 팀을 활용한 다관점 코드 리뷰","https:\u002F\u002Fgithub.com\u002FNharu\u002Fcc-cmds\u002Fblob\u002Fmaster\u002Ftests\u002Ffixtures\u002Freadme-gen\u002Fpre-yq-skills\u002Freview\u002FSKILL.md",[114],{"categoryNo":115,"categoryName":116,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[30,32,118,119],"diff","pr",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":126,"publishedAt":33},"01M6DNAYNZFJR1TATEM9PVHGH2","implement","설계 문서 기반 구현","https:\u002F\u002Fgithub.com\u002FNharu\u002Fcc-cmds\u002Fblob\u002Fmaster\u002Ftests\u002Ffixtures\u002Freadme-gen\u002Fpre-yq-skills\u002Fimplement\u002FSKILL.md",[],[122,32],{"skillNo":128,"name":29,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":134,"publishedAt":33},"01M6DNAVQF4KERY94V79NVWAZA","에이전트 팀을 활용한 기능 설계 토론 진행","https:\u002F\u002Fgithub.com\u002FNharu\u002Fcc-cmds\u002Fblob\u002Fmaster\u002Ftests\u002Ffixtures\u002Freadme-gen\u002Fpre-yq-skills\u002Fdesign\u002FSKILL.md",[132,133],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[29,32],{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":143,"publishedAt":33},"01M6DNASB3J3JQMZD57YBDHZ1A","design-upgrade","팀원 모델 업그레이드 분석","https:\u002F\u002Fgithub.com\u002FNharu\u002Fcc-cmds\u002Fblob\u002Fmaster\u002Ftests\u002Ffixtures\u002Freadme-gen\u002Fpre-yq-skills\u002Fdesign-upgrade\u002FSKILL.md",[141,142],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[144,145,29,32,146],"design upgrade","upgrade","haiku",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":156,"publishedAt":33},"01M6DNA4Y762ZAY6D2Q7X411HB","gamma-helper","model-invocable helper skill (test fixture)","https:\u002F\u002Fgithub.com\u002FNharu\u002Fcc-cmds\u002Fblob\u002Fmaster\u002Ftests\u002Ffixtures\u002Freadme-gen\u002Fcomplex\u002Fgamma-helper\u002FSKILL.md",[153],{"categoryNo":154,"categoryName":155,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[157,158,159,160,161,105,162,163,164,165,166,167,106,168],"helper","gamma helper","gamma","test","helper skill","for","filter","false","fixture","auto","coverage","model"]