docs(sdd): evidence report 결정을 승인한다

Epic 3 구현이 고정된 fixture, rubric, scoring 적격성, evaluator 재시도 계약을 따르도록 사용자 승인 내용을 설계 게이트에 보존한다.
This commit is contained in:
toki 2026-08-11 06:20:33 +09:00
parent c6a9972dda
commit 69e986a9b3
4 changed files with 79 additions and 91 deletions

View file

@ -17,19 +17,19 @@ IOP를 경유하는 Claude Code, agy, Codex의 단독 모델·하이브리드
## 구현 잠금
- 상태: 잠금
- 상태: 해제
- SDD: 필요
- SDD 문서: [Agent 비교 벤치마크 파이프라인 준비 SDD](../../../sdd/knowledge-tool-optimization-extension/agent-comparison-benchmark-pipeline/SDD.md)
- SDD 사유: 외부 CLI의 IOP API 연결, credential/model preflight, 실제 provider 호출, 반복 실행·비용·secret-safe evidence와 실패 분기 계약을 함께 고정해야 한다.
- SDD 상태: 검토중
- SDD 잠금: 잠금
- SDD 사용자 리뷰: [USER_REVIEW.md](../../../sdd/knowledge-tool-optimization-extension/agent-comparison-benchmark-pipeline/USER_REVIEW.md)
- SDD 상태: 승인됨
- SDD 잠금: 해제
- SDD 사용자 리뷰: 없음
- 잠금 해제 조건: 아래 체크리스트
- [ ] SDD 잠금이 해제되어 있다.
- [ ] SDD 사용자 리뷰가 없거나 승인/해결되었다.
- [x] SDD 잠금이 해제되어 있다.
- [x] SDD 사용자 리뷰가 없거나 승인/해결되었다.
- [x] Acceptance Scenario가 Milestone 기능 Task와 연결되어 있다.
- [x] Evidence Map이 완료 시 `complete.log``milestone-task` id별 집계와 최종 검증 evidence로 검증 가능하게 연결되어 있다.
- 결정 필요: `evidence-report` Epic의 deterministic web fixture, 100점 rubric, score 적격성, Codex evaluator 실행 정책(D11-D14)
- 결정 필요: 없음
## 범위

View file

@ -7,12 +7,12 @@
## 상태
[검토중]
[승인됨]
## SDD 잠금
- 상태: 잠금
- 사용자 리뷰: [USER_REVIEW.md](USER_REVIEW.md)
- 상태: 해제
- 사용자 리뷰: 없음
- 잠금 항목:
- [x] [D01] benchmark 준비는 `[route-02]`와 병렬로 진행하며 direct route live connectivity와 generic preset runner fixture까지만 완료 조건으로 둔다. 실제 Gemini/GPT hybrid preset live readiness와 scored 비교는 `[route-02]` 정식 smoke 뒤의 별도 `[bench-02]`가 소유한다.
- [x] [D02] 모든 scored model 호출은 IOP를 경유하며 Claude Code, agy, Codex 차이는 runner adapter가 흡수한다.
@ -24,10 +24,10 @@
- [x] [D08] 실제 CLI/IOP entrypoint를 직접 호출하며 Agent-Ops task dispatcher를 제품 runtime이나 benchmark harness로 사용하지 않는다.
- [x] [D09] provider가 보고하지 않은 token은 `unavailable`로 기록하고 추정값을 exact source와 섞지 않는다.
- [x] [D10] 각 cell은 fresh caller session과 clean workspace를 사용하고 공통 setup/cache 정책을 기록하며, timing은 관측 clock/source를 보존하고 중첩 구간을 임의 합산하지 않는다.
- [ ] [D11] 익명 비교의 입력이 되는 deterministic web fixture의 과업·필수 산출물·제공 asset 범위를 확정한다.
- [ ] [D12] 자동 gate와 중복되지 않는 100점 품질 rubric의 항목·가중치를 확정한다.
- [ ] [D13] 자동 검증 실패·blocked attempt의 수동 점수 적격성과 동점 처리 정책을 확정한다.
- [ ] [D14] Codex evaluator의 IOP route/model/effort 고정 위치와 scoring retry/failure 정책을 확정한다.
- [x] [D11] 공통 과업은 중립적인 제품 소개 landing page로 고정한다. 필수 산출물은 `index.html`, `styles.css`, `script.js`이고 저장소가 제공하는 로컬 이미지 2장을 입력으로 사용한다. 외부 network asset, framework, build 도구는 금지하며 정확한 prompt·copy·asset checksum은 versioned fixture가 소유한다.
- [x] [D12] Codex 수동 품질 rubric은 task fidelity 25, visual hierarchy 25, responsive composition 20, typography/readability 15, polish/consistency 15의 100점으로 고정한다. asset·console·접근성 같은 pass/fail 자동 gate는 수동 점수에 다시 합산하지 않는다.
- [x] [D13] 실행 성공과 모든 필수 web gate를 통과한 attempt만 수동 채점한다. 나머지는 정확한 실패 사유와 함께 `unscored`로 보고하고 0점으로 바꾸지 않으며, 총점 동점은 임의 tie-break 없이 그대로 유지한다.
- [x] [D14] manifest에 별도 evaluator IOP route/model/effort binding과 rubric revision을 명시하고 fresh evaluator session 1회만 허용한다. invalid worksheet나 evaluator 실패는 대체 model 또는 합성 점수 없이 `scoring_failed`로 보존하며, 재시도는 새 scoring attempt id로만 명시적으로 수행한다.
## 문제 / 비목표
@ -49,7 +49,10 @@
| Dev Testbed | `../iop-s2` | IOP dev runtime; scored 결과 workspace의 source가 아님 |
| API Contract | [Anthropic-Compatible Messages API](../../../../agent-contract/outer/anthropic-compatible-api.md), [OpenAI-Compatible API](../../../../agent-contract/outer/openai-compatible-api.md) | Claude Code/agy/Codex의 IOP ingress와 terminal/usage 기준 |
| Config Contract | [Edge Config And Runtime Refresh](../../../../agent-contract/inner/edge-config-runtime-refresh.md) | model route, execution preset, protocol profile, credential 경계 |
| User Decision | D01-D14 | D01-D10은 2026-08-06 확정, D11-D14는 [USER_REVIEW.md](USER_REVIEW.md)에서 결정 필요 |
| Fixture | versioned landing-page prompt, copy와 local image asset checksum | 모든 비교군의 동일 입력과 필수 `index.html`·`styles.css`·`script.js` 산출물 기준 |
| Rubric | manifest `rubric_version`이 가리키는 100점 worksheet contract | D12 항목·가중치와 자동 gate 분리 기준 |
| Evaluator | manifest evaluator binding과 scoring attempt record | D14 IOP route/model/effort, fresh session, 실패·재시도 provenance |
| User Decision | D01-D14 | D01-D10은 2026-08-06, D11-D14는 2026-08-11 확정 |
## State Machine
@ -60,7 +63,8 @@
| `ready` | 모든 선택 cell의 preflight와 isolated workspace 준비 완료 | `running`, `cancelled` | immutable run manifest와 workspace locator |
| `running` | caller에 사용자 작업을 한 번 제출 | `validating`, `failed`, `timed_out`, `cancelled` | normalized event timeline, process exit와 idle marker |
| `validating` | finish/complete 후 idle 또는 terminal failure 확정 | `scoring`, `reported`, `failed` | workspace checksum, build/render/test evidence |
| `scoring` | 익명화된 결과와 screenshot 준비 | `reported`, `failed` | rubric version과 evaluator record |
| `scoring` | 필수 web gate를 통과한 익명화 결과와 screenshot 준비 | `reported`, `scoring_failed` | rubric version, fresh evaluator binding과 scoring attempt record |
| `scoring_failed` | evaluator 실패 또는 invalid worksheet | `scoring`, `reported` | 실패가 보존된 scoring attempt와 명시적으로 생성한 새 retry attempt 또는 unscored 보고 |
| `reported` | raw evidence와 Markdown summary 원자적 생성 | 종료 | report path, manifest/evidence digest |
| `blocked` | credential/model 누락 또는 client↔IOP 호환 gap | `preflighting`, 종료 | redacted blocker classification과 후속 Plan 후보 |
| `rejected` | manifest, fixture, path, repetitions 또는 secret policy 위반 | 종료 | validation error |
@ -74,6 +78,8 @@ State invariant:
- preflight는 scored attempt가 아니며 setup time/usage를 별도 evidence로 둔다.
- scored attempt가 시작된 뒤의 실패는 삭제하거나 같은 attempt id로 재실행하지 않는다.
- finish/complete event만으로 성공 판정하지 않고 caller adapter가 idle과 process/output quiescence를 함께 확정한다.
- 실행 성공과 모든 필수 web gate를 통과한 attempt만 scoring 대상이다. 나머지는 0점이 아닌 `unscored`와 정확한 실패 사유로 보존한다.
- evaluator 실패나 invalid worksheet는 같은 scoring attempt 안에서 자동 보정·재시도·대체하지 않는다. 재시도는 새 scoring attempt id를 가진다.
- raw credential과 private endpoint는 manifest, event, log, metric, screenshot, report에 기록하지 않는다.
## Interface Contract
@ -81,20 +87,25 @@ State invariant:
- 계약 원문: [Anthropic-Compatible Messages API](../../../../agent-contract/outer/anthropic-compatible-api.md), [OpenAI-Compatible API](../../../../agent-contract/outer/openai-compatible-api.md), [Edge Config And Runtime Refresh](../../../../agent-contract/inner/edge-config-runtime-refresh.md)
- manifest 입력:
- `pipeline_version`, `environment=dev`, `testbed=../iop-s2`: 실행 contract와 테스트베드 선택이다.
- `fixture`: prompt, asset와 initial workspace checksum/version이다.
- `fixture`: 중립적인 제품 소개 landing page prompt·copy, 저장소가 제공하는 로컬 이미지 2장과 initial workspace checksum/version이다. 필수 산출물은 `index.html`, `styles.css`, `script.js`이며 외부 network asset, framework, build 도구를 허용하지 않는다.
- `matrix[]`: stable cell id, caller(`claude|agy|codex`), IOP route/preset, expected model/stage binding과 effort다.
- `repetitions`: 1 이상의 실행 횟수이며 초기 비교 manifest는 1이다.
- `session_policy=fresh`, `setup_cache_policy`, `timeout`, `viewports`, `rubric_version`, `output_root`: 격리, 공통 setup/cache와 bounded 실행·검증·보고 옵션이다.
- `evaluator`: Codex evaluator의 IOP route/model/effort binding과 rubric revision이다. 각 scoring attempt는 fresh session 1회와 이 immutable binding을 가진다.
- runner adapter 출력:
- 공통 timeline은 `submitted`, `first_output`, `first_file_write`, model call start/end, tool start/end, finish/complete, idle와 terminal outcome을 monotonic timestamp와 observation source로 표현한다. 구간이 겹치거나 source가 없으면 별도 `overlap|unavailable`로 남기고 `total-model-tool`을 authoritative overhead로 단정하지 않는다.
- usage는 model/stage, input/output/reasoning/cached/total, source(`provider_reported|client_reported|iop_ledger|estimated|unavailable`)와 호출 횟수를 보존한다.
- caller 고유 event는 raw evidence에 bounded/redacted 형태로 남기되 공통 field를 추정해 성공으로 만들지 않는다.
- pipeline 출력:
- attempt manifest, normalized timeline/usage, verification JSON, screenshot, score worksheet와 Markdown report를 run id 아래 연결한다.
- 수동 100점 worksheet는 task fidelity 25, visual hierarchy 25, responsive composition 20, typography/readability 15, polish/consistency 15를 사용한다. asset·console·접근성 pass/fail은 자동 gate에만 두고 수동 점수에 중복 합산하지 않는다.
- 실행 또는 필수 web gate 실패는 `unscored`로, evaluator/worksheet 실패는 `scoring_failed`로 기록한다. 동점은 유지하고 실패를 0점으로 변환하거나 임의 tie-break를 적용하지 않는다.
- 명시적 scoring 재시도는 이전 실패를 보존한 새 scoring attempt id를 생성한다.
- 금지:
- caller가 IOP를 우회한 provider 호출을 scored IOP cell로 인정한다.
- unsupported model alias나 effort를 다른 값으로 조용히 대체한다.
- preflight 성공을 실제 scored 결과로 재사용한다.
- evaluator 실패를 다른 model이나 합성 점수로 대체하거나 invalid worksheet를 임의 보정한다.
- raw secret이나 prompt/tool 원문을 tracked artifact에 포함한다.
## Acceptance Scenarios
@ -112,9 +123,9 @@ State invariant:
| S09 | `effort-route` | Sonnet 최고/Gemini high/GPT xhigh 요청 | 각 route preflight | requested/effective model·effort가 확인되며 unsupported 값은 fail-closed다. |
| S10 | `connection-gap` | credential/model 또는 endpoint/auth/protocol/stream 실패 | blocker 분류 | 안전한 등록 요청 또는 별도 구현 Plan 후보가 만들어지고 우회 PASS가 없다. |
| S11 | `timing-usage` | caller/model별 event와 provider usage 편차 | evidence normalize | 첫 output·첫 write·model/tool/queue/total 시간의 clock/source와 overlap, 호출 횟수와 token source/미제공이 보존된다. |
| S12 | `web-validation` | 생성된 vanilla web page | build/serve/render 검증 | 두 이미지, desktop/mobile, asset/console, 반응형·접근성 evidence와 screenshot이 생성된다. |
| S13 | `blind-score` | identity가 제거된 결과물과 screenshot | Codex 평가 | 동일 rubric version의 항목별 점수와 근거가 자동 gate와 분리되어 기록된다. |
| S14 | `report-output` | 성공·실패·blocked attempt evidence | 보고 생성 | 조건·버전·시간·token·품질·한계와 raw evidence 포인터가 있는 Markdown이 생성된다. |
| S12 | `web-validation` | versioned landing-page fixture와 필수 HTML/CSS/JS·로컬 이미지 2장 | build/serve/render 검증 | 외부 network asset·framework·build 도구 없이 desktop/mobile screenshot, asset/console, 반응형·접근성 자동 gate evidence가 생성된다. |
| S13 | `blind-score` | 모든 필수 web gate를 통과하고 identity가 제거된 결과물과 screenshot | manifest가 고정한 fresh Codex evaluator 1회 실행 | D12의 동일 100점 rubric 항목별 점수와 근거가 자동 gate와 분리되어 기록되며 실패·invalid worksheet는 `scoring_failed`, 부적격 결과는 `unscored`로 남는다. |
| S14 | `report-output` | 성공·실패·blocked·unscored·scoring_failed attempt evidence | 보고 생성 | 조건·버전·시간·token·품질·동점·한계, evaluator/scoring attempt provenance와 raw evidence 포인터가 있는 Markdown이 생성된다. |
## Evidence Map
@ -131,9 +142,9 @@ State invariant:
| S09 | requested/effective route/model/effort matrix | `agent-task/m-agent-comparison-benchmark-pipeline/effort-route/` | `effort-route` no-substitution evidence |
| S10 | blocker classifier와 follow-up routing test | `agent-task/m-agent-comparison-benchmark-pipeline/connection-gap/` | `connection-gap` registration/Plan routing evidence |
| S11 | normalized timeline/usage fixtures와 unavailable handling | `agent-task/m-agent-comparison-benchmark-pipeline/timing-usage/` | `timing-usage` source-aware metric evidence |
| S12 | deterministic web fixture, viewport screenshots와 gate result | `agent-task/m-agent-comparison-benchmark-pipeline/web-validation/` | `web-validation` render/console/accessibility evidence |
| S13 | anonymization mapping 분리와 rubric worksheet | `agent-task/m-agent-comparison-benchmark-pipeline/blind-score/` | `blind-score` unbiased score evidence |
| S14 | success/failure/blocked report golden test | `agent-task/m-agent-comparison-benchmark-pipeline/report-output/` | `report-output` Markdown/raw-link evidence |
| S12 | versioned landing-page fixture checksum, 필수 산출물·로컬 이미지 2장, viewport screenshot과 automatic gate result | `agent-task/m-agent-comparison-benchmark-pipeline/web-validation/` | `web-validation` deterministic render/console/accessibility evidence |
| S13 | anonymization mapping 분리, manifest evaluator binding, D12 worksheet schema, fresh-session·unscored·scoring_failed·새 retry id test | `agent-task/m-agent-comparison-benchmark-pipeline/blind-score/` | `blind-score` unbiased score와 evaluator provenance evidence |
| S14 | success/failure/blocked/unscored/scoring_failed와 동점 report golden test | `agent-task/m-agent-comparison-benchmark-pipeline/report-output/` | `report-output` Markdown/raw-link와 scoring provenance evidence |
공통 완료 검증은 pipeline unit/integration test에서 실제 provider를 호출하지 않는 fake runner guard, manifest/schema validation, workspace containment·cleanup, secret redaction, report golden test와 `git diff --check`를 포함한다. 실제 외부 CLI 호출은 S06-S10의 명시적인 redacted dev preflight로만 분리한다.
@ -146,11 +157,12 @@ State invariant:
- [x] Milestone 기능 Task와 Acceptance Scenario가 일치한다.
- [x] Evidence Map이 code-review/complete.log에서 검증 가능하다.
- [x] agent-contract를 쓰는 경우 SDD에 계약 원문을 복제하지 않았다.
- [ ] 사용자 리뷰가 필요한 D11-D14를 [USER_REVIEW.md](USER_REVIEW.md)에 분리했다.
- [x] 사용자 리뷰가 필요한 D11-D14를 해결하고 승인 내용을 SDD에 반영했다.
## 사용자 리뷰 이력
- 2026-08-06: 사용자가 모든 비교군의 IOP 경유, Claude Code와 agy/Codex caller 조합, finish/idle 기준 원샷, 초기 1회·가변 반복 pipeline, dev `../iop-s2` 테스트베드와 post-smoke 실제 비교를 확정했다.
- 2026-08-11: 사용자가 D11-D14 추천안을 모두 승인했다. landing page fixture·로컬 이미지 2장·HTML/CSS/JS 산출물, D12 100점 rubric, gate 통과 attempt만 scoring·동점 유지, manifest-bound fresh Codex evaluator와 새 attempt retry 정책을 확정했다.
## 작업 컨텍스트

View file

@ -1,67 +0,0 @@
# SDD User Review
## 상태
요청됨
## 검토 대상
- SDD: [SDD.md](SDD.md)
- Milestone: [Agent 비교 벤치마크 파이프라인 준비](../../../phase/knowledge-tool-optimization-extension/milestones/agent-comparison-benchmark-pipeline.md)
## 사용자 결정 항목
### [D11] Deterministic web fixture 범위
- 결정 필요: 익명 비교의 공통 입력이 될 웹 과업, 필수 산출물과 제공 asset 범위를 어디까지 고정할지 결정해야 한다.
- 추천안: 하나의 중립적인 제품 소개 landing page 과업을 고정하고 `index.html`, `styles.css`, `script.js`와 저장소가 제공하는 로컬 이미지 2장을 필수 산출물/입력으로 둔다. 외부 network asset, framework, build 도구는 금지하고 정확한 prompt·copy·asset checksum은 versioned fixture가 소유한다.
- 대안: dashboard형 과업으로 고정하거나, HTML 단일 파일만 허용하거나, 외부 asset을 허용한다.
- 영향: 모델별 과업 난이도, web-validation의 build/serve 규칙, screenshot 비교 가능성, benchmark 재현성과 범위에 영향을 준다.
- 적용 위치:
- SDD: `Interface Contract`, `Acceptance Scenarios` S12-S14, `Evidence Map`
- Milestone: `web-validation`, `blind-score`, `report-output`
### [D12] 100점 품질 rubric
- 결정 필요: 자동 gate와 분리해 Codex가 평가할 품질 항목과 100점 가중치를 결정해야 한다.
- 추천안: task fidelity 25, visual hierarchy 25, responsive composition 20, typography/readability 15, polish/consistency 15로 고정한다. asset/console/accessibility 같은 pass/fail 자동 gate는 수동 점수에 다시 합산하지 않는다.
- 대안: 접근성과 구현 품질을 수동 항목에도 포함하거나, 시각 품질 중심으로 가중치를 재배분한다.
- 영향: 비교 결과의 의미, 순위 민감도, rubric version 호환성, golden report의 score 표에 영향을 준다.
- 적용 위치:
- SDD: `Interface Contract`, `Acceptance Scenarios` S13-S14
- Milestone: `blind-score`, `report-output`
### [D13] Score 적격성과 동점 정책
- 결정 필요: 자동 검증 실패·실행 실패·blocked attempt를 수동 채점할지와 동점을 어떻게 처리할지 결정해야 한다.
- 추천안: 실행 성공과 모든 필수 web gate를 통과한 attempt만 수동 채점하고 나머지는 `unscored`와 정확한 실패 사유로 보고한다. 총점 동점은 그대로 유지하며 임의 tie-break나 실패 점수 `0` 변환을 하지 않는다.
- 대안: render 가능한 실패 attempt도 참고 점수로 채점하거나, 실패를 0점으로 정규화하거나, 사전에 고정한 tie-break를 적용한다.
- 영향: 실패가 비교표에 반영되는 방식, 평균/순위 해석, report의 한계 표시와 scored failure 의미에 영향을 준다.
- 적용 위치:
- SDD: `State Machine`, `Interface Contract`, `Acceptance Scenarios` S13-S14
- Milestone: `blind-score`, `report-output`
### [D14] Codex evaluator 실행 정책
- 결정 필요: Codex evaluator의 IOP route/model/effort와 rubric prompt revision을 어디에 고정하고, invalid worksheet나 evaluator 실패를 재시도할지 결정해야 한다.
- 추천안: manifest에 별도 evaluator binding과 rubric revision을 명시하고 IOP를 경유한 fresh evaluator session 1회만 허용한다. invalid/failure는 점수를 만들거나 다른 model로 대체하지 않고 `scoring_failed`로 보존하며, 재시도는 새 scoring attempt id로 명시적으로 수행한다.
- 대안: project config에 evaluator를 고정하거나, 같은 scoring attempt에서 bounded automatic retry를 허용하거나, evaluator를 Codex 외 별도 서비스로 둔다.
- 영향: IOP 우회 금지 경계, 비용, 재현성, model 교체, retry 시 evidence 보존과 manifest schema에 영향을 준다.
- 적용 위치:
- SDD: `Source of Truth`, `State Machine`, `Interface Contract`, `Acceptance Scenarios` S13-S14
- Milestone: `blind-score`, `report-output`, `구현 잠금`
## 승인 항목
- [ ] 위 결정 항목을 승인했다.
- [ ] SDD 잠금 해제를 승인했다.
## 답변 기록
- 없음
## 해결 조건
- 모든 사용자 결정 항목의 답변이 SDD에 반영되어 있다.
- [USER_REVIEW.md](USER_REVIEW.md)가 `user_review_N.log`로 이동되어 있다.
- 남은 잠금 항목이 없으면 SDD 상태가 `[승인됨]`이고 SDD 잠금 상태가 `해제`다.

View file

@ -0,0 +1,43 @@
# SDD User Review
## 상태
해결됨
## 검토 대상
- SDD: [SDD.md](SDD.md)
- Milestone: [Agent 비교 벤치마크 파이프라인 준비](../../../phase/knowledge-tool-optimization-extension/milestones/agent-comparison-benchmark-pipeline.md)
## 사용자 결정 항목
### [D11] Deterministic web fixture 범위
- 승인 결과: 하나의 중립적인 제품 소개 landing page 과업을 고정하고 `index.html`, `styles.css`, `script.js`와 저장소가 제공하는 로컬 이미지 2장을 필수 산출물/입력으로 둔다. 외부 network asset, framework, build 도구는 금지하고 정확한 prompt·copy·asset checksum은 versioned fixture가 소유한다.
### [D12] 100점 품질 rubric
- 승인 결과: task fidelity 25, visual hierarchy 25, responsive composition 20, typography/readability 15, polish/consistency 15로 고정한다. asset/console/accessibility 같은 pass/fail 자동 gate는 수동 점수에 다시 합산하지 않는다.
### [D13] Score 적격성과 동점 정책
- 승인 결과: 실행 성공과 모든 필수 web gate를 통과한 attempt만 수동 채점하고 나머지는 `unscored`와 정확한 실패 사유로 보고한다. 총점 동점은 그대로 유지하며 임의 tie-break나 실패 점수 `0` 변환을 하지 않는다.
### [D14] Codex evaluator 실행 정책
- 승인 결과: manifest에 별도 evaluator binding과 rubric revision을 명시하고 IOP를 경유한 fresh evaluator session 1회만 허용한다. invalid/failure는 점수를 만들거나 다른 model로 대체하지 않고 `scoring_failed`로 보존하며, 재시도는 새 scoring attempt id로 명시적으로 수행한다.
## 승인 항목
- [x] 위 결정 항목을 승인했다.
- [x] SDD 잠금 해제를 승인했다.
## 답변 기록
- 2026-08-11: 사용자가 D11-D14 추천안을 모두 승인하고 계속 진행하도록 요청했다.
## 해결 조건
- [x] 모든 사용자 결정 항목의 답변이 SDD에 반영되어 있다.
- [x] `USER_REVIEW.md`를 `user_review_0.log`로 이동했다.
- [x] SDD 상태가 `[승인됨]`이고 SDD 잠금 상태가 `해제`다.