Files

126 lines
8.5 KiB
YAML

# design-direction-spec — design-direction child plan 의 9 아티팩트 계약(정본).
# 정본 = 이 YAML + lint_design_direction.py(hand-coded). 별도 JSON Schema 파일 없음.
# spec: docs/superpowers/specs/2026-07-13-p2-design-direction-design.md (rev2: 7 아티팩트·finalize·exact 바인딩)
design-direction-spec:
version: 3
purpose: "제품 cascade 종속 child plan 의 아티팩트 계약. brief 를 발산 이전/승인 이후로 분리(S1)."
artifacts:
# ① 발산 이전 입력 — 부모 /design 이 완성·불변화, child init 에서 hash 바인딩. child 는 수정 금지.
direction-input-brief:
required: [product-goal, core-users, core-tasks, information-density,
required-accessibility, brand-constraints, avoid-cliches,
representative-screen-requirement, tech-platform-constraints]
prohibited: [reference-cluster, color-palette, typography, layout-grammar, tokens, visual-metaphor]
note: "prohibited 항목은 승인 이후 design-system-brief 가 approved-direction 으로부터 확정."
conditional-required:
when: "parent workload가 public-website 또는 new-product|major-redesign"
fields: [competitive-experience-benchmark-ref, competitive-experience-benchmark-sha256,
experience-blueprint-ref, experience-blueprint-sha256,
wireframe-set-ref, wireframe-set-sha256]
enforcement: "state_engine.init_ledger가 부모 experience-foundation approval exact refs와 대조"
# ② discovery 산출 — 불변 brief 를 분석(수정 아님).
direction-discovery:
required: [direction-input-brief-sha256, findings, constraints-restated, opportunity-notes]
# ③ 발산 전 계약 — 완성 direction-set 과 분리한다. 각 워커가 답할 질문과
# 조형 영역을 먼저 직교 분할하여 "같은 카드 셸의 색상 변주"를 차단한다.
divergence-charter:
required: [direction-cycle-id, representative-screen, directions, pairwise-separation]
direction-required: [id, design-question, layout-topology, navigation-model,
typography-voice, imagery-strategy, motion-model,
dominant-primitives, exclusive-primitives, forbidden-primitives]
rules:
- "정확히 3개 방향, id 중복 금지"
- "모든 방향 쌍은 layout/navigation/type/imagery/motion/primitives 중 최소 4축이 다르다"
- "exclusive-primitives 는 방향 간 겹치지 않는다"
- "한 방향이 centered-card/progress-rail/pill-cta 조합을 쓰면 다른 방향은 이를 금지한다"
# ④ divergence 산출 — 3안 독립 생산 + 실제 비교 렌더.
direction-set:
required: [direction-cycle-id, divergence-charter-ref, divergence-charter-sha256,
representative-screen, directions, comparison-preview]
representative-screen: {required: [id, kind, description], kind-enum: [first-entry, core-task, signature-moment]}
comparison-preview:
required: [receipt-ref, receipt-sha256, gallery-path, representative-screen-id]
experience-foundation-binding:
when: "parent workload가 foundation을 요구"
required: [experience-blueprint-ref, experience-blueprint-sha256,
wireframe-set-ref, wireframe-set-sha256]
per-direction-required: [content-contract-sha256]
rule: "세 방향의 content-contract-sha256은 동일한 accepted wireframe-set SHA여야 한다."
direction-required: [id, producer-role-id, producer-run-id, context-package-id,
concept-artifact, reference-cluster, visual-thesis, layout-grammar,
interaction-grammar, typography-token-direction, primitive-inventory,
reference-board-ref, reference-board-sha256,
full-size-preview-ref, full-size-preview-sha256,
coded-slice, coded-slice-sha256]
reference-cluster-rules:
- "3~6개로 집중한다(20개 산만보다 6개 집중)"
- "각 항목은 name, signal, why-relevant 를 가진다"
- "형용사(modern/clean/minimal/sleek)만으로 설명하지 않는다"
- "방향 쌍 사이 reference name 중복은 최대 1개"
# ⑤ 선택 전 비교 감사 — 이 렌즈만 sibling isolation 을 적용하지 않는다.
comparative-divergence-audit:
required: [direction-cycle-id, divergence-charter-ref, divergence-charter-sha256,
direction-set-ref, direction-set-sha256, reviewer-role-id, reviewer-run-id,
verdict, pairwise-comparisons, full-size-previews, blocking-findings]
verdict-enum: [pass, revise, re-diverge]
benchmark-relative-required-when-foundation:
fields: [competitive-experience-benchmark-ref,
competitive-experience-benchmark-sha256, benchmark-relative-findings]
min-findings: 3
rules:
- "pass 는 모든 방향 쌍 비교와 full-size preview hash 검증이 완료된 경우만 가능"
- "각 방향 쌍은 최소 4개 조형 축에서 달라야 한다"
- "primitive collision 또는 blocking finding 이 하나라도 있으면 pass 금지"
- "색을 제거해도 layout/type/imagery/interaction 구조로 식별 가능해야 한다"
# ⑥ decision 산출 — 1안 선택(승인 아님). 평균금지(S5). direction-set 에 바인딩.
selected-direction:
required: [direction-cycle-id, direction-set-ref, direction-set-sha256, selection-decision,
rejected-directions, parent-workflow-id, product-decision-id,
direction-input-brief-sha256, selection-acceptance-receipt]
optional: [flexible-elements, adopted-elements]
rules:
- "selection-decision은 selected 또는 none-of-the-above. selected이면 selected-direction-id 정확히 1개이고 direction-set에 실존"
- "selected이면 locked-invariants >= 3"
- "none-of-the-above이면 세 안을 모두 사유와 함께 reject하고 locked/adopted 요소 없이 discovery로 되돌린다"
- "rejected-directions 가 모든 비선택 방향을 정확히 덮는다(유령/누락 금지), 각 reason 필수"
- "locked-invariants >= 3"
- "secondary-influence-id 필드 금지(평균의 뒷문)"
- "adopted-elements <= 1, from-direction-id 실존, element-id+rationale 필수, 포괄표현 금지, locked-invariant 침범 금지"
# ⑦ prototype 산출 — 승자 핵심흐름 + 실제 preview receipt. revision 추적.
winner-prototype:
required: [direction-cycle-id, selected-direction-ref, selected-direction-sha256,
prototype-path, prototype-sha256, preview-receipt-ref, preview-receipt-sha256, revision]
# ⑧ critique 산출 — 다관점 패널(S3). producer != reviewer.
design-review-panel:
required: [direction-cycle-id, target-prototype, preview-receipt, reviews, synthesis]
review-required: [reviewer-role-id, reviewer-run-id, lens, verdict, report-ref, report-sha256]
required-lenses: [product-fit, usability, distinctiveness, visual-craft,
systematizability, market-memorability, implementability]
synthesis: {required: [role-id, verdict, unresolved-dissent], verdict-enum: [pass, minor-revision, concept-flaw]}
veto-rules:
- "모든 개별 lens verdict 가 pass 여야 synthesis pass 가능"
- "distinctiveness 또는 visual-craft 비통과는 synthesis 가 덮을 수 없다"
- "blocking/critical finding 또는 unresolved-dissent 가 있으면 pass 금지"
# ⑨ terminal 불변 report — 전부를 hash 로 묶음(S2). completion-records 경로.
approved-direction:
required: [child-workflow-id, direction-cycle-id, selected-direction-ref, selected-direction-sha256,
winner-prototype-ref, winner-prototype-sha256, critique-report-refs, critique-pass-receipt,
preview-receipt-ref, locked-invariants, approved-at,
parent-workflow-id, product-decision-id, direction-input-brief-sha256]
path: "<ws>/completion-records/<child-workflow-id>/approved-direction-<ts>.report.yaml"
parent-ledger-ref: {key: design-direction-approval, fields: [report-ref, report-sha256, child-workflow-id]}
cross-references:
- "design-brief-spec.yaml (design-system-brief = brief-phase: system-ready)"
- "state-transition-rules.yaml / execution-plans.yaml (design-direction plan)"
- "collaboration-map.yaml (direction-gate)"