Files

6.0 KiB

description
description
선택된 direction의 winner-prototype을 7-lens(제품적합·사용성·차별성·시각완성도·시스템화·시장기억성·구현가능성) 패널로 감사해 DES-DIRECTOR 종합 verdict(pass/minor-revision/concept-flaw)를 산출한다. producer-run-id ≠ reviewer-run-id. `/design-direction`의 -critique 스테이지가 호출한다(단독 실행도 가능).

당신은 Orchestrator다. design-reviewdesign-direction child(<child>)의 활성 cycle winner-prototype을 7개 독립 렌즈로 감사하는 패널이다. 입력(인자): --workflow <child>. 이 커맨드 자체는 상태를 전이시키지 않는다design-review-panel 아티팩트를 산출할 뿐이며, record+transition(verdict 라우팅)은 호출자(/design-direction의 -critique 스테이지)의 책임이다.

0. pre-work

활성 cycle의 winner-prototype(대상 코드 + preview-receipt)과 direction-set(3개 방향의 producer-run-id 목록 — 배제용)을 읽는다. 핵심 불변식: 이 두 산출물을 만든 divergence run의 producer-run-id는, 이번 패널의 어떤 reviewer-run-id와도 겹쳐서는 안 된다(_critique_panel_ok가 강제) — 방향을 만든 바로 그 실행이 자기 자신을 심사하는 것을 막는다. OPS-ORCH는 critique마다 run-id를 발급한다(divergence 때 쓴 값을 재사용하지 않는다).

1. 7-lens 패널 — 각자 완전히 격리된 subagent

각 렌즈를 독립 context-package로 spawn한다(mode=divergent, must-read=winner-prototype+selected-direction만 — 서로의 리뷰는 못 읽는다): python3 .claude/hooks/context_package.py --compile --workflow <child> --task review-<lens> --role <ROLE> --mode divergent --tier <tier>context_package.py <pkg> exit 0 → 출력된 context-package:/context-package-sha256: 2줄을 spawn 프롬프트 최상단에 포함(guard_tools spawn gate 강제). 컴파일된 패키지의 sha256(또는 그 task 값)을 reviewer-run-id로 그 워커에 전달 — 워커는 자기 산출물의 reviewer-run-id 필드에 echo한다.

lens 질문 subagent
product-fit 고객 문제가 이해 가능한 흐름으로 해결되는가 des-prod(DES-PROD)
usability 실제 사용자 행동·불편·맥락에서 사용 가능한가 ux-researcher(UX-RESEARCHER)
distinctiveness 이 방향이 시각적으로 무엇을 주장하는지가 다른 안·인터넷 평균과 구별되는가 des-visual(DES-VISUAL) — 반드시 새 격리 run. divergence에서 이 방향(들)을 만든 그 run이면 안 된다 — 새 context-package·새 reviewer-run-id로 spawn한다
visual-craft 타입·위계·비례·spacing·imagery·motion·optical polish가 출시 가능한 완성도인가 des-visual(DES-VISUAL) — distinctiveness와 별도 새 run. annotated finding은 화면 영역/근거를 지목한다
systematizability 디자이너·엔지니어가 반복해서 쓸 수 있는 토큰/컴포넌트로 시스템화 가능한가 des-platform(DES-PLATFORM)
market-memorability 시장이 수용할 가치 언어로 번역·기억될 수 있는가 gtm-pmm(GTM-PMM)
implementability 실제 프론트엔드 구현·성능·접근성 관점에서 구현 가능한가 eng-fe(ENG-FE)

각 리뷰어는 자기 렌즈로만 판단하고 typed workflow-artifact envelope를 쓴다. 개별 lens review도 artifact-kind=design-lens-review를 명시하고, payload에 reviewer-role-id·reviewer-run-id·lens· verdict(pass|revise|blockingfindings를 둔다. finding은 severity와 화면 영역/코드/렌더 근거를 갖는다.

2. 종합(converge) — DES-DIRECTOR

des-director(DES-DIRECTOR)가 7개 리뷰 원본을 전부 읽는다(synthesis-rehydration — 요약이 아니라 원본, dissent 보존). 스스로를 단독 평가자로 두지 않고 트레이드오프를 드러내 하나의 synthesis로 수렴한다:

  • role-id: DES-DIRECTOR, verdictpass | minor-revision | concept-flaw, unresolved-dissent(리뷰 간 남은 이견 — 없으면 빈 리스트, 삭제 금지).
  • verdict 판단 기준: 개별 lens 중 blocking이 있으면 concept-flaw, revise가 있으면 최소 minor-revision, 7개 전부 pass이고 unresolved-dissent가 없을 때만 pass다. 특히 distinctiveness와 visual-craft는 veto lens이며 synthesis가 concerns를 비차단 의견으로 낮출 수 없다.

3. design-review-panel 아티팩트 조립

new_report.py --workflow <child> --role DES-DIRECTOR --stub --artifact-kind design-review-panel --stage design-direction-critique로 발급한 envelope payload에 direction-cycle-id, target-prototype, preview-receipt, reviews(7개 id+sha), synthesis를 묶는다.

state_engine.py는 전이 시점에 _critique_panel_ok로 7개 lens의 정확한 coverage, 각 hash-bound 원본 review와 panel 요약의 lens/run/verdict 일치, producer/reviewer 분리, 모든 개별 verdict=pass, blocking/critical finding 부재, unresolved-dissent=[]를 검증한다. synthesis 문자열만 pass로 쓰는 우회는 막힌다.

handoff

최종 메시지 = design-review-panel 경로 + synthesis.verdict + 1줄 bottom-line. 상태 변경은 하지 않는다. 호출자가 submit-artifact한 뒤 verdict에 따라 complete-stage --to ...enter-stage를 호출한다.

규칙

  • 7 렌즈 전원 독립 spawn(fan-out) — 서로의 결론을 못 읽는다. 종합만 DES-DIRECTOR가 원본 재적재로 한다.
  • producer-run-id ≠ reviewer-run-id는 자기신고가 아니라 state_engine이 direction-set의 실제 producer-run-id 집합과 대조해 강제한다 — 위조/재사용은 전이 시점에 fail-closed로 거부된다.
  • report-header(BLUF) 없이 종료 금지. evidence 없는 confidence:High 금지. external side-effect(slack/PR/deploy 등) 기본 금지.
  • mid-start 아님: 이 커맨드는 매 -critique 호출마다 7 렌즈를 새로 돈다(과거 패널 재사용 금지 — 프로토타입이 바뀌면 판단도 새로 나와야 한다).