Commit 3da4e33
authored
feat(design): SPEC-V3R3-DESIGN-PIPELINE-001 — Hybrid Design Pipeline (6-wave) (#732)
* feat(design): Wave C.1 — Skill Body Updates (Phase 1)
SPEC-V3R3-DESIGN-PIPELINE-001 Phase 1 (T1-01 ~ T1-03) 구현.
수정 파일:
- .claude/skills/moai-workflow-design-import/SKILL.md: Path B1 (Figma extractor) + Path B2 (Pencil MCP) 섹션 추가, Path A 보존
- .claude/skills/moai-design-system/SKILL.md: DTCG 2025.10 참조 섹션 추가
- internal/template/templates/.claude/skills/moai-workflow-design-import/SKILL.md: 미러
- internal/template/templates/.claude/skills/moai-design-system/SKILL.md: 미러
검증:
- make build 성공
- diff -rq zero diff (양쪽 미러 byte-identical)
- go test ./internal/template/... 통과
- 양쪽 SKILL.md 본문 < 500 lines (coding-standards.md 준수)
Path A 텍스트 verbatim 보존, Phase 3 DTCG SPEC.md는 forward reference (Phase 3에서 생성 예정).
Refs: SPEC-V3R3-DESIGN-PIPELINE-001 (Wave C.1 of 6)
* feat(design): Wave C.2 — Workflow Routing + path-selection 지속성 (Phase 2)
SPEC-V3R3-DESIGN-PIPELINE-001 Phase 2 (T2-01 ~ T2-02) 구현.
수정 파일:
- .claude/skills/moai/workflows/design.md: AskUserQuestion 3-path 선택자 (A/B1/B2),
Phase 0 brand-context 로더 + conflict warning, Check 4 이전 선택 복원 (idempotency),
Phase 1 3-option 라우팅 (권장 첫번째), Phase B1(Figma)/B2(Pencil) 분기,
Phase B-Common 공통 code-based 단계, path-selection.json writer 참조
- internal/template/templates/.claude/skills/moai/workflows/design.md: 미러 (byte-identical)
신규 파일:
- internal/design/pipeline/path_selection.go: PathSelection 구조체 + JSON writer/reader
(struct 태그 순서 고정 → 안정적 필드 순서, MkdirAll + 멱등성 보장)
- internal/design/pipeline/path_selection_test.go: 라운드트립 + 결정론적 쓰기 +
malformed JSON + missing field + FileNotFound + MissingFieldError.Error() 테스트
검증:
- go test -race ./internal/design/pipeline/... 통과 (coverage 90.5% ≥ 85%)
- golangci-lint 0 issues
- go vet 0 issues
- diff -rq design.md mirror: IDENTICAL
- design.md 256줄 < 500줄 (coding-standards.md 준수)
- go test ./internal/template/...: 통과 (regression 없음)
- make build: 성공
[HARD] Path A verbatim 보존 (Phase A 기존 내용 유지), brand-context (constitution §3.1)
우선 (conflict warning + 브랜드 값 권위), JSON stable ordering (struct 태그 순서),
subagent boundary (T2-01 skill workflow가 AskUserQuestion 호출 지시, T2-02 Go 코드
직접 호출 안 함), AskUserQuestion max 4 options + 권장 첫번째 준수.
Refs: SPEC-V3R3-DESIGN-PIPELINE-001 (Wave C.2 of 6)
plan-auditor F3 (internal/design/pipeline/ scope drift) → /moai sync에서 spec.md §2.1 보강
* feat(design): Wave C.3 — DTCG 2025.10 Validator (Phase 3, P0 Critical)
SPEC-V3R3-DESIGN-PIPELINE-001 Phase 3 (T3-01 ~ T3-10) 구현.
신규 sub-package: internal/design/dtcg/
- dtcg.go + SPEC.md + errors.go (T3-01): 패키지 + DTCG 2025.10 스냅샷 + 에러/리포트 타입
- categories/color.go (T3-02): hex/rgb/hsl/named, 100% 커버리지 목표
- categories/dimension.go (T3-03): px/rem/em/% + 구조화/레거시 양식
- categories/{font,font_family,font_weight}.go (T3-04): 복합 + 수치/named 두께
- categories/typography.go + alias.go (T3-05): 복합 + cycle detection
- categories/{shadow,border}.go (T3-06): 복합 (color + dimension)
- categories/{duration,cubic_bezier,number,stroke_style,transition,gradient}.go (T3-07): 나머지 카테고리
- frozen_guard.go (T3-08): hardcoded constitution §2/§3.1-3.3/§5/§11/§12 + brand 보호
- validator.go (T3-09): 최상위 Validate API + dispatch + 성능 <100ms/500-token
- testdata/{positive,negative}/*.json (T3-10): 6+ 골든 파일 양방향
검증:
- go test -race ./internal/design/dtcg/... 통과
- golangci-lint 0 issues
- coverage 88.8% (dtcg 91.6%, categories 88.1%)
- BenchmarkValidate_500Tokens: 53μs (100ms 기준 0.05%)
[HARD] Frozen Guard 비우회 (config bypass 차단), Alias cycle 검출 (A→B→C→A,
self-ref), DTCG 2025.10 source URL + version pinned in SPEC.md.
Refs: SPEC-V3R3-DESIGN-PIPELINE-001 (Wave C.3 of 6, P0 Critical)
* feat(design): Wave C.4 — expert-frontend Integration + Validator Hookup (Phase 4)
SPEC-V3R3-DESIGN-PIPELINE-001 Phase 4 (T4-01 ~ T4-06) 구현.
수정 파일:
- .claude/agents/moai/expert-frontend.md: DTCG Validator Integration 섹션 추가
(코드 생성 전 dtcg.Validate 호출 강제, 실패 시 구조화된 오류 반환)
- internal/template/templates/.claude/agents/moai/expert-frontend.md: 미러
신규 파일:
- internal/design/pipeline/brand_conflict.go (T4-05): visual-identity.md vs tokens.json
비교 + ValidationWarning 발생 (subagent boundary 준수)
- internal/design/pipeline/brand_conflict_test.go: 일치/불일치 케이스 단위 테스트
- internal/design/pipeline/path_a_test.go (T4-02): integration build tag, Path A 핸드오프
bundle 통합 테스트 + validator 게이트
- internal/design/pipeline/path_b1_test.go (T4-03): integration tag, Figma extractor
stub + DTCG 검증
- internal/design/pipeline/path_b2_test.go (T4-04): integration tag, Pencil MCP stub
+ pencil-integration 부재 검증
- internal/design/pipeline/gan_variance_test.go (T4-06): integration tag, baseline vs
post-SPEC variance 벤치마크 (|delta| ≤ 0.05)
- internal/design/pipeline/testdata/path_a_handoff/: 샘플 핸드오프 bundle
검증:
- go test -race ./internal/design/pipeline/... 통과 (단위, 89.1% coverage)
- go test -tags=integration -race ./internal/design/pipeline/... 통과 (4 IT)
- golangci-lint 0 issues
- coverage 89.1% ≥ 85%
- diff -rq mirror byte-identical
[HARD] Subagent boundary 보존 (brand_conflict.go는 warning 데이터 반환만,
AskUserQuestion 호출 안 함). T4-04는 stub assertion (실제 pencil-integration
제거는 Phase 5 T5-03).
Refs: SPEC-V3R3-DESIGN-PIPELINE-001 (Wave C.4 of 6)
* feat(design): Wave C.5 — Constitution §4 Amendment + Pencil-Integration Cleanup (Phase 5)
SPEC-V3R3-DESIGN-PIPELINE-001 Phase 5 (T5-01 ~ T5-04) 구현.
수정 파일:
- .claude/rules/moai/design/constitution.md: §4 Phase Contracts에 Path B1/B2 row 2개
추가, HISTORY entry + version 3.3.1 → 3.4.0 (additive only, FROZEN section 미수정)
- internal/template/templates/.claude/rules/moai/design/constitution.md: 미러
- .claude/skills/moai/SKILL.md: design 섹션 Skills 목록에서 moai-workflow-pencil-integration
→ my-harness-pencil-mcp (Path B2) 교체
- internal/template/templates/.claude/skills/moai/SKILL.md: 미러
- .claude/skills/moai-workflow-design-import/SKILL.md: Path B2 설명에서 레거시 스킬명 제거,
my-harness-pencil-mcp 기반 동적 생성 방식으로 업데이트
- internal/template/templates/.claude/skills/moai-workflow-design-import/SKILL.md: 미러
검증:
- T5-01: design constitution 정확히 4 mutations (HISTORY + 2 §4 row + version + last-updated)
- T5-02: zone-registry CONST-V3R2-051..072 zero diff (FROZEN section unaffected)
- T5-03: grep -r "moai-workflow-pencil-integration" .claude/ --exclude-dir=worktrees zero match
- T5-04: 5개 mirror pairs byte-identical, make build 성공
- go test ./... 통과 (race detector 포함)
- go vet ./... 0 issues
[HARD] Constitution FROZEN section (§2, §3.1, §3.2, §3.3, §5, §11, §12) 미터치.
HARNESS-001 BC-V3R3-007이 legacy skill directory 자체를 archive — 본 commit은
references만 정리.
Refs: SPEC-V3R3-DESIGN-PIPELINE-001 (Wave C.5 of 6)
* docs(design): Wave C.6 — CHANGELOG + SPEC status + TRUST 5 sign-off (Phase 6)
SPEC-V3R3-DESIGN-PIPELINE-001 Phase 6 + Cross-cutting (T6-01, TX-01, TX-03) 구현.
수정 파일:
- CHANGELOG.md: [Unreleased] + v2.19.0 섹션 추가 (DESIGN-PIPELINE-001 + LEARNING-001 묶음 release)
- 3-path 라우팅 (A/B1/B2)
- DTCG 2025.10 validator (14 카테고리, ~50μs/500-token, 커버리지 88.8%/89.1%)
- design constitution §4 amendment (v3.3.1 → v3.4.0, additive only)
- moai-workflow-pencil-integration 제거 → Path B2 동적 생성 대체
- 한국어 + 영어 bilingual 기록
- .moai/specs/SPEC-V3R3-DESIGN-PIPELINE-001/spec.md:
- status: draft → completed
- updated_at: 2026-04-27
- HISTORY 1.0.0 엔트리 추가
- .moai/reports/trust-5/SPEC-V3R3-DESIGN-PIPELINE-001-2026-04-27.md: TRUST 5 자가 점검 보고서
- .moai/config/sections/language.yaml: code_comments en → ko (세션 중 발생한 미커밋 변경)
- .moai/config/sections/quality.yaml: ast_grep_gate 섹션 제거 (세션 중 발생한 미커밋 변경)
TRUST 5 self-check:
- Tested: dtcg 88.8% / pipeline 89.1% 커버리지, 통합 테스트 4건 GREEN, benchmark ~50μs
- Readable: API ≤10 exports, 카테고리 파일 ≤200 lines, 한국어 godoc
- Unified: gofmt + golangci-lint 0 issues across all 5 waves, go vet clean
- Secured: no net/http egress, FROZEN guard 하드코딩, no credential storage
- Trackable: 6 Wave Conventional Commits + SPEC ref + CHANGELOG + SPEC status
보류 항목 (spec.md HISTORY 기록, /moai sync에서 처리):
- T6-02 docs-site 4-locale → 별도 follow-up PR (§17.3 ko+en+ja+zh same-PR mandate)
- T6-03 plan-auditor sign-off → orchestrator 별도 위임
- target_release v2.17.0 → v2.19.0 reconciliation
- plan-auditor F1/F2/F3 findings (DESIGN-PIPELINE) 처리
Refs: SPEC-V3R3-DESIGN-PIPELINE-001 (Wave C.6 of 6, FINAL)
* docs(spec): plan-auditor 4 findings reconciliation (/moai sync)
SPEC-V3R3-DESIGN-PIPELINE-001 sync 단계 — plan-auditor 보고서 (.moai/reports/plan-audit/
SPEC-V3R3-DESIGN-PIPELINE-001-2026-04-27.md) 의 4개 deferred findings 처리.
수정 파일:
- spec.md frontmatter: target_release v2.17.0 → v2.19.0
(행님 release plan 일치, LEARNING-001 + DESIGN-PIPELINE-001 묶음 release)
- spec.md §2.1 In Scope: internal/design/pipeline/ 패키지 추가 (F3 scope drift)
PathSelection JSON 영속화 + brand-conflict warning + Path A/B1/B2 IT
- plan.md §3: Phase 6 — Documentation + Release Coordination 섹션 추가 (F2)
T6-01 CHANGELOG, T6-02 docs-site 4-locale (deferred), T6-03 sign-off, TX-03 status
- tasks.md preamble: 5-phase → 6-phase, T6-01/T6-02 REQ/AC 빈 항목 면제 명시 (F1)
- tasks.md T6-01: v2.17.0 → v2.19.0 entry, REQ/AC empty 면제 annotation
- tasks.md T6-02: REQ/AC empty 면제 annotation
처리된 plan-auditor findings (Wave C.6 보류 → 본 commit):
- F1: T6-01/T6-02 empty REQ/AC → tasks.md preamble + 항목별 annotation
- F2: plan.md missing Phase 6 → 정식 Phase 6 섹션 backport
- F3: scope drift (internal/design/pipeline/) → spec.md §2.1 추가
- target_release: v2.17.0 → v2.19.0 (frontmatter)
남은 deferred (post-merge):
- T6-02 docs-site 4-locale → 별도 follow-up PR (§17.3 ko+en+ja+zh same-PR mandate)
- T6-03 plan-auditor sign-off → 본 commit 직후 별도 위임
Refs: SPEC-V3R3-DESIGN-PIPELINE-001 plan-auditor F1/F2/F3 + target_release reconciliation1 parent 68f0232 commit 3da4e33
70 files changed
Lines changed: 6018 additions & 200 deletions
File tree
- .claude
- agents/moai
- rules/moai/design
- skills
- moai-design-system
- moai-workflow-design-import
- moai
- workflows
- .moai
- config/sections
- reports/trust-5
- specs/SPEC-V3R3-DESIGN-PIPELINE-001
- internal
- design
- dtcg
- categories
- testdata
- negative
- positive
- pipeline
- testdata/path_a_handoff
- assets
- template/templates/.claude
- agents/moai
- rules/moai/design
- skills
- moai-design-system
- moai-workflow-design-import
- moai
- workflows
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
118 | 118 | | |
119 | 119 | | |
120 | 120 | | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
121 | 183 | | |
122 | 184 | | |
123 | 185 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
| |||
114 | 115 | | |
115 | 116 | | |
116 | 117 | | |
| 118 | + | |
| 119 | + | |
117 | 120 | | |
118 | 121 | | |
119 | 122 | | |
| |||
399 | 402 | | |
400 | 403 | | |
401 | 404 | | |
402 | | - | |
| 405 | + | |
403 | 406 | | |
404 | 407 | | |
405 | 408 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
133 | 133 | | |
134 | 134 | | |
135 | 135 | | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
136 | 208 | | |
137 | 209 | | |
138 | 210 | | |
| |||
142 | 214 | | |
143 | 215 | | |
144 | 216 | | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
145 | 220 | | |
146 | 221 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
5 | | - | |
6 | | - | |
7 | | - | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
17 | | - | |
18 | | - | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
28 | | - | |
| 28 | + | |
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
35 | | - | |
| 35 | + | |
| 36 | + | |
36 | 37 | | |
37 | | - | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
38 | 44 | | |
39 | 45 | | |
40 | 46 | | |
41 | | - | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
42 | 66 | | |
43 | 67 | | |
44 | 68 | | |
| |||
231 | 255 | | |
232 | 256 | | |
233 | 257 | | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
234 | 327 | | |
235 | 328 | | |
236 | 329 | | |
237 | 330 | | |
238 | 331 | | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
239 | 335 | | |
240 | 336 | | |
241 | 337 | | |
242 | | - | |
243 | | - | |
| 338 | + | |
| 339 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
199 | 199 | | |
200 | 200 | | |
201 | 201 | | |
202 | | - | |
| 202 | + | |
203 | 203 | | |
204 | 204 | | |
205 | 205 | | |
| |||
0 commit comments