$npx -y skills add kwakseongjae/oh-my-design --skill omd-lab-02-design-harnessOmD Lab #02 — 디자인 하네스 정교화 실험. 동일 task를 v1, v2, v3... 버전별 하네스 설정으로 돌려서 산출물 품질·토큰 비용·iteration 수·persona ABANDON 율을 비교. 트리거 — '/omd-lab-02', '하네스 lab 시작', '디자인 하네스 v2 돌려서 비교', 'lab #02 자동 비교'.
| 1 | <!-- omd:installed-skill — managed by `omd install-skills`. Do not edit; rerun the command to refresh. --> |
| 2 | |
| 3 | |
| 4 | # OmD Lab #02 — Design Harness Refinement |
| 5 | |
| 6 | `omd:harness`의 정교화 작업을 위한 실험실. 동일한 design task를 *서로 다른 하네스 설정* (v1, v2, v3, ...)으로 돌려서 품질·비용·실패모드를 비교한다. |
| 7 | |
| 8 | ## 왜 |
| 9 | |
| 10 | Lab #01이 "DESIGN.md 유무"의 영향을 봤다면, Lab #02는 **하네스 자체의 설정**(prompt 변형, persona pool, eval rubric, asset 정책 등)이 산출물에 미치는 영향을 본다. |
| 11 | |
| 12 | ## 디렉토리 구조 |
| 13 | |
| 14 | ``` |
| 15 | skills/omd-lab-02-design-harness/ |
| 16 | ├── SKILL.md (this file) |
| 17 | ├── playbooks/ |
| 18 | │ ├── v1.md (현재 baseline — first full implementation) |
| 19 | │ ├── v2.md (다음 실험 가설) |
| 20 | │ └── ... |
| 21 | ├── runs/ |
| 22 | │ ├── v1-run-<ts>-<slug>/ ← omd:harness가 v1 설정으로 돌린 산출물 전체 |
| 23 | │ ├── v2-run-<ts>-<slug>/ |
| 24 | │ └── ... |
| 25 | ├── compare/ |
| 26 | │ ├── README.md (어떤 task로 어떤 v를 비교했는가) |
| 27 | │ └── <task-id>/ |
| 28 | │ ├── index.html (v1 vs v2 vs v3 동시 비교 뷰) |
| 29 | │ └── metrics.json (집계 비교 지표) |
| 30 | └── postmortem-aggregate.md (전 v 누적 학습) |
| 31 | ``` |
| 32 | |
| 33 | ## Lab Run 프로토콜 |
| 34 | |
| 35 | ### 새 v 정의 (Lab 운영자 — 사용자 또는 Claude) |
| 36 | |
| 37 | 1. `playbooks/v<N>.md` 작성. 가설을 한 줄로: |
| 38 | ``` |
| 39 | ## Hypothesis |
| 40 | v2 raises persona ABANDON budget from 3s → 5s, expecting fewer false-abandon and more useful friction signal. |
| 41 | ``` |
| 42 | 2. v<N>이 v<N-1>과 *바꾸는 것 정확히 명시*. 1개 변수만 바꾸는 게 원칙. |
| 43 | 3. 변경 점이 sub-agent 프롬프트에 있으면 `playbooks/v<N>/agents-overrides/*.md`로 patch 보관. |
| 44 | |
| 45 | ### Lab Run 실행 |
| 46 | |
| 47 | ```bash |
| 48 | # 운영자가 수동 실행 |
| 49 | omd harness "<task>" --lab v2 |
| 50 | # 또는 사용자가 자연어: |
| 51 | # "이 task를 lab v2 설정으로도 돌려서 v1과 비교해줘" |
| 52 | ``` |
| 53 | |
| 54 | `--lab v<N>`이 들어오면: |
| 55 | - `runs/v<N>-run-<ts>-<slug>/` 디렉토리에 산출물 적재 |
| 56 | - v<N>의 agent overrides가 있으면 그걸 임시로 `.claude/agents/`에 덮어씌운 채 실행 (run 종료 시 원복) |
| 57 | - run.log에 `lab_version: v<N>` 기록 |
| 58 | |
| 59 | ### 비교 뷰 생성 |
| 60 | |
| 61 | 운영자가 동일 task에 대해 v1, v2, ..., vN의 run을 끝내면: |
| 62 | |
| 63 | ```bash |
| 64 | omd lab compare --task "<task-slug>" --versions v1,v2,v3 |
| 65 | ``` |
| 66 | |
| 67 | 이게 `compare/<task-slug>/index.html`을 만든다. 4-패널 (또는 N-패널) 비교: |
| 68 | - 각 v의 brief.md / 주요 wireframe / DESIGN.md.patch / persona ABANDON 요약 / 토큰 비용 |
| 69 | - 공통 metrics.json: per-v {iterations, total_tokens, persona_abandon_rate, deterministic_pass_rate, jury_score, time_to_handoff} |
| 70 | |
| 71 | ### 비교 metrics 정의 |
| 72 | |
| 73 | ```json |
| 74 | { |
| 75 | "task": "토스 스타일 가족 식단 앱 메인", |
| 76 | "versions": { |
| 77 | "v1": { |
| 78 | "iterations": 2, |
| 79 | "total_tokens_estimated": 320000, |
| 80 | "persona_abandon_rate": 0.5, |
| 81 | "deterministic_pass_rate": 1.0, |
| 82 | "jury_score_normalized": 0.72, |
| 83 | "time_to_handoff_min": 18, |
| 84 | "user_satisfied": "?" |
| 85 | }, |
| 86 | "v2": { ... } |
| 87 | }, |
| 88 | "delta_v1_v2": "v2 reduced persona_abandon_rate by 0.25 but raised total_tokens by 12% — net win on signal quality" |
| 89 | } |
| 90 | ``` |
| 91 | |
| 92 | ## 진행 트랙 (이 Lab의 로드맵) |
| 93 | |
| 94 | | v | hypothesis | status | |
| 95 | |---|---|---| |
| 96 | | v1 | First full implementation — 8 agents, 10 phases, 3 user checkpoints | active baseline | |
| 97 | | v2 | (TBD) | pending | |
| 98 | | v3 | (TBD) | pending | |
| 99 | |
| 100 | `playbooks/v1.md`가 baseline 정의. 운영자는 매 회 새 가설로 v<N>.md를 추가한다. |
| 101 | |
| 102 | ## postmortem-aggregate.md 정책 |
| 103 | |
| 104 | 매 lab run 종료 시, run의 `postmortem.md`에서 *cross-version-relevant* 신호만 발췌해 `postmortem-aggregate.md`에 누적: |
| 105 | - 자주 발생하는 deterministic gate 실패 |
| 106 | - persona ABANDON 트리거 빈도 분포 |
| 107 | - 사용자가 가장 자주 reject하는 phase 출력 |
| 108 | - 토큰이 가장 많이 새는 sub-agent |
| 109 | |
| 110 | 이게 다음 v의 가설을 만들어낸다. |
| 111 | |
| 112 | ## 사용 예 (한 줄 시연) |
| 113 | |
| 114 | ``` |
| 115 | 사용자: "토스 스타일 결제 화면 — Lab #02로 v1, v2 비교" |
| 116 | → Claude: omd harness "..." --lab v1 실행 → v1-run 적재 |
| 117 | → (사용자 체크포인트 진행, ship 결정) |
| 118 | → Claude: omd harness "..." --lab v2 실행 (동일 brief 재사용 가능) |
| 119 | → omd lab compare --task <slug> --versions v1,v2 |
| 120 | → compare/<slug>/index.html 결과 제시 |
| 121 | ``` |
| 122 | |
| 123 | ## 금지 |
| 124 | |
| 125 | - v 정의 없이 run 적재 X (반드시 playbooks/v<N>.md 선행) |
| 126 | - 동일 task의 동일 v 결과를 덮어쓰지 X (timestamp로 보존) |
| 127 | - runs/ 정리 X (영구 보존) |