@uzysjung/agent-harness 26.83.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/LICENSE +21 -0
  2. package/README.ko.md +279 -0
  3. package/README.md +306 -0
  4. package/dist/chunk-SDVAM5JZ.js +775 -0
  5. package/dist/chunk-SDVAM5JZ.js.map +1 -0
  6. package/dist/index.js +5412 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/trust-tier-drift.js +67 -0
  9. package/dist/trust-tier-drift.js.map +1 -0
  10. package/package.json +53 -0
  11. package/scripts/prune-ecc.sh +310 -0
  12. package/templates/CLAUDE.md +86 -0
  13. package/templates/agents/build-error-resolver.md +114 -0
  14. package/templates/agents/code-reviewer.md +237 -0
  15. package/templates/agents/data-analyst.md +69 -0
  16. package/templates/agents/plan-checker.md +118 -0
  17. package/templates/agents/reviewer.md +128 -0
  18. package/templates/agents/security-reviewer.md +108 -0
  19. package/templates/agents/silent-failure-hunter.md +50 -0
  20. package/templates/agents/strategist.md +86 -0
  21. package/templates/antigravity/AGENTS.md.template +58 -0
  22. package/templates/codex/AGENTS.md.template +94 -0
  23. package/templates/codex/README.md +69 -0
  24. package/templates/codex/config.toml.template +108 -0
  25. package/templates/codex/hooks/README.md +40 -0
  26. package/templates/codex/hooks/gate-check.sh +7 -0
  27. package/templates/codex/hooks/hito-counter.sh +7 -0
  28. package/templates/codex/hooks/session-start.sh +7 -0
  29. package/templates/codex/hooks/uncommitted-check.sh +7 -0
  30. package/templates/codex/skills/uzys-build/SKILL.md +24 -0
  31. package/templates/codex/skills/uzys-plan/SKILL.md +24 -0
  32. package/templates/codex/skills/uzys-review/SKILL.md +24 -0
  33. package/templates/codex/skills/uzys-ship/SKILL.md +24 -0
  34. package/templates/codex/skills/uzys-spec/SKILL.md +28 -0
  35. package/templates/codex/skills/uzys-test/SKILL.md +24 -0
  36. package/templates/commands/ecc/checkpoint.md +32 -0
  37. package/templates/commands/ecc/e2e.md +105 -0
  38. package/templates/commands/ecc/eval.md +88 -0
  39. package/templates/commands/ecc/evolve.md +7 -0
  40. package/templates/commands/ecc/harness-audit.md +73 -0
  41. package/templates/commands/ecc/instinct-status.md +8 -0
  42. package/templates/commands/ecc/promote.md +10 -0
  43. package/templates/commands/ecc/security-scan.md +10 -0
  44. package/templates/commands/uzys/auto.md +190 -0
  45. package/templates/commands/uzys/build.md +42 -0
  46. package/templates/commands/uzys/plan.md +55 -0
  47. package/templates/commands/uzys/review.md +44 -0
  48. package/templates/commands/uzys/ship.md +49 -0
  49. package/templates/commands/uzys/spec.md +93 -0
  50. package/templates/commands/uzys/test.md +58 -0
  51. package/templates/docs/PLAN.template.md +102 -0
  52. package/templates/hooks/agentshield-gate.sh +101 -0
  53. package/templates/hooks/checkpoint-snapshot.sh +115 -0
  54. package/templates/hooks/gate-check.sh +138 -0
  55. package/templates/hooks/hito-counter.sh +26 -0
  56. package/templates/hooks/karpathy-gate.sh +59 -0
  57. package/templates/hooks/mcp-pre-exec.sh +104 -0
  58. package/templates/hooks/protect-files.sh +41 -0
  59. package/templates/hooks/session-start.sh +40 -0
  60. package/templates/hooks/spec-drift-check.sh +86 -0
  61. package/templates/mcp-allowlist.example +24 -0
  62. package/templates/mcp.json +20 -0
  63. package/templates/opencode/.opencode/commands/uzys-build.md +22 -0
  64. package/templates/opencode/.opencode/commands/uzys-plan.md +22 -0
  65. package/templates/opencode/.opencode/commands/uzys-review.md +22 -0
  66. package/templates/opencode/.opencode/commands/uzys-ship.md +22 -0
  67. package/templates/opencode/.opencode/commands/uzys-spec.md +28 -0
  68. package/templates/opencode/.opencode/commands/uzys-test.md +22 -0
  69. package/templates/opencode/.opencode/plugins/uzys-harness.ts +146 -0
  70. package/templates/opencode/AGENTS.md.template +98 -0
  71. package/templates/opencode/README.md +34 -0
  72. package/templates/opencode/opencode.json.template +42 -0
  73. package/templates/project-claude/_base.md +23 -0
  74. package/templates/project-claude/fragments/csr-fastapi/active-rules.md +13 -0
  75. package/templates/project-claude/fragments/csr-fastapi/agents.md +5 -0
  76. package/templates/project-claude/fragments/csr-fastapi/boundaries.md +18 -0
  77. package/templates/project-claude/fragments/csr-fastapi/commands.md +6 -0
  78. package/templates/project-claude/fragments/csr-fastapi/plugins.md +2 -0
  79. package/templates/project-claude/fragments/csr-fastapi/skills.md +5 -0
  80. package/templates/project-claude/fragments/csr-fastapi/stack.md +6 -0
  81. package/templates/project-claude/fragments/csr-fastapi/tagline.md +1 -0
  82. package/templates/project-claude/fragments/csr-fastapi/workflow.md +8 -0
  83. package/templates/project-claude/fragments/csr-fastify/active-rules.md +13 -0
  84. package/templates/project-claude/fragments/csr-fastify/agents.md +5 -0
  85. package/templates/project-claude/fragments/csr-fastify/boundaries.md +18 -0
  86. package/templates/project-claude/fragments/csr-fastify/commands.md +6 -0
  87. package/templates/project-claude/fragments/csr-fastify/plugins.md +2 -0
  88. package/templates/project-claude/fragments/csr-fastify/skills.md +5 -0
  89. package/templates/project-claude/fragments/csr-fastify/stack.md +6 -0
  90. package/templates/project-claude/fragments/csr-fastify/tagline.md +1 -0
  91. package/templates/project-claude/fragments/csr-fastify/workflow.md +8 -0
  92. package/templates/project-claude/fragments/csr-supabase/active-rules.md +12 -0
  93. package/templates/project-claude/fragments/csr-supabase/agents.md +5 -0
  94. package/templates/project-claude/fragments/csr-supabase/boundaries.md +19 -0
  95. package/templates/project-claude/fragments/csr-supabase/commands.md +6 -0
  96. package/templates/project-claude/fragments/csr-supabase/plugins.md +4 -0
  97. package/templates/project-claude/fragments/csr-supabase/skills.md +7 -0
  98. package/templates/project-claude/fragments/csr-supabase/stack.md +6 -0
  99. package/templates/project-claude/fragments/csr-supabase/supabase-auth.md +21 -0
  100. package/templates/project-claude/fragments/csr-supabase/tagline.md +1 -0
  101. package/templates/project-claude/fragments/csr-supabase/workflow.md +8 -0
  102. package/templates/project-claude/fragments/data/active-rules.md +10 -0
  103. package/templates/project-claude/fragments/data/agents.md +6 -0
  104. package/templates/project-claude/fragments/data/boundaries.md +20 -0
  105. package/templates/project-claude/fragments/data/commands.md +6 -0
  106. package/templates/project-claude/fragments/data/plugins.md +2 -0
  107. package/templates/project-claude/fragments/data/skills.md +3 -0
  108. package/templates/project-claude/fragments/data/stack.md +7 -0
  109. package/templates/project-claude/fragments/data/tagline.md +1 -0
  110. package/templates/project-claude/fragments/data/workflow.md +9 -0
  111. package/templates/project-claude/fragments/executive/active-rules.md +6 -0
  112. package/templates/project-claude/fragments/executive/agents.md +6 -0
  113. package/templates/project-claude/fragments/executive/boundaries.md +17 -0
  114. package/templates/project-claude/fragments/executive/commands.md +11 -0
  115. package/templates/project-claude/fragments/executive/plugins.md +1 -0
  116. package/templates/project-claude/fragments/executive/skills.md +7 -0
  117. package/templates/project-claude/fragments/executive/stack.md +4 -0
  118. package/templates/project-claude/fragments/executive/tagline.md +1 -0
  119. package/templates/project-claude/fragments/executive/workflow.md +10 -0
  120. package/templates/project-claude/fragments/growth-marketing/active-rules.md +7 -0
  121. package/templates/project-claude/fragments/growth-marketing/agents.md +6 -0
  122. package/templates/project-claude/fragments/growth-marketing/boundaries.md +17 -0
  123. package/templates/project-claude/fragments/growth-marketing/commands.md +11 -0
  124. package/templates/project-claude/fragments/growth-marketing/plugins.md +9 -0
  125. package/templates/project-claude/fragments/growth-marketing/skills.md +8 -0
  126. package/templates/project-claude/fragments/growth-marketing/stack.md +7 -0
  127. package/templates/project-claude/fragments/growth-marketing/tagline.md +1 -0
  128. package/templates/project-claude/fragments/growth-marketing/workflow.md +11 -0
  129. package/templates/project-claude/fragments/project-management/active-rules.md +7 -0
  130. package/templates/project-claude/fragments/project-management/agents.md +6 -0
  131. package/templates/project-claude/fragments/project-management/boundaries.md +16 -0
  132. package/templates/project-claude/fragments/project-management/commands.md +10 -0
  133. package/templates/project-claude/fragments/project-management/plugins.md +6 -0
  134. package/templates/project-claude/fragments/project-management/skills.md +5 -0
  135. package/templates/project-claude/fragments/project-management/stack.md +4 -0
  136. package/templates/project-claude/fragments/project-management/tagline.md +1 -0
  137. package/templates/project-claude/fragments/project-management/workflow.md +12 -0
  138. package/templates/project-claude/fragments/ssr-htmx/active-rules.md +11 -0
  139. package/templates/project-claude/fragments/ssr-htmx/agents.md +5 -0
  140. package/templates/project-claude/fragments/ssr-htmx/boundaries.md +20 -0
  141. package/templates/project-claude/fragments/ssr-htmx/commands.md +6 -0
  142. package/templates/project-claude/fragments/ssr-htmx/plugins.md +2 -0
  143. package/templates/project-claude/fragments/ssr-htmx/skills.md +3 -0
  144. package/templates/project-claude/fragments/ssr-htmx/stack.md +6 -0
  145. package/templates/project-claude/fragments/ssr-htmx/tagline.md +1 -0
  146. package/templates/project-claude/fragments/ssr-htmx/workflow.md +8 -0
  147. package/templates/project-claude/fragments/ssr-nextjs/active-rules.md +12 -0
  148. package/templates/project-claude/fragments/ssr-nextjs/agents.md +5 -0
  149. package/templates/project-claude/fragments/ssr-nextjs/boundaries.md +20 -0
  150. package/templates/project-claude/fragments/ssr-nextjs/commands.md +6 -0
  151. package/templates/project-claude/fragments/ssr-nextjs/plugins.md +2 -0
  152. package/templates/project-claude/fragments/ssr-nextjs/skills.md +5 -0
  153. package/templates/project-claude/fragments/ssr-nextjs/stack.md +5 -0
  154. package/templates/project-claude/fragments/ssr-nextjs/tagline.md +1 -0
  155. package/templates/project-claude/fragments/ssr-nextjs/workflow.md +8 -0
  156. package/templates/project-claude/fragments/tooling/active-rules.md +11 -0
  157. package/templates/project-claude/fragments/tooling/agents.md +5 -0
  158. package/templates/project-claude/fragments/tooling/boundaries.md +17 -0
  159. package/templates/project-claude/fragments/tooling/commands.md +4 -0
  160. package/templates/project-claude/fragments/tooling/skills.md +4 -0
  161. package/templates/project-claude/fragments/tooling/stack.md +5 -0
  162. package/templates/project-claude/fragments/tooling/tagline.md +1 -0
  163. package/templates/project-claude/fragments/tooling/workflow.md +5 -0
  164. package/templates/rules/api-contract.md +33 -0
  165. package/templates/rules/change-management.md +80 -0
  166. package/templates/rules/cli-development.md +39 -0
  167. package/templates/rules/code-style.md +23 -0
  168. package/templates/rules/data-analysis.md +61 -0
  169. package/templates/rules/database.md +29 -0
  170. package/templates/rules/design-workflow.md +17 -0
  171. package/templates/rules/error-handling.md +23 -0
  172. package/templates/rules/gates-taxonomy.md +21 -0
  173. package/templates/rules/git-policy.md +102 -0
  174. package/templates/rules/htmx.md +42 -0
  175. package/templates/rules/nextjs.md +35 -0
  176. package/templates/rules/playwright-launch.md +66 -0
  177. package/templates/rules/pyside6.md +59 -0
  178. package/templates/rules/shadcn.md +33 -0
  179. package/templates/rules/ship-checklist.md +24 -0
  180. package/templates/rules/tauri.md +40 -0
  181. package/templates/rules/test-policy.md +62 -0
  182. package/templates/settings.json +71 -0
  183. package/templates/skills/agent-introspection-debugging/SKILL.md +153 -0
  184. package/templates/skills/continuous-learning-v2/SKILL.md +365 -0
  185. package/templates/skills/continuous-learning-v2/config.json +8 -0
  186. package/templates/skills/continuous-learning-v2/hooks/observe.sh +428 -0
  187. package/templates/skills/continuous-learning-v2/scripts/detect-project.sh +228 -0
  188. package/templates/skills/continuous-learning-v2/scripts/instinct-cli.py +1426 -0
  189. package/templates/skills/deep-research/SKILL.md +155 -0
  190. package/templates/skills/deep-research/agents/openai.yaml +7 -0
  191. package/templates/skills/e2e-testing/SKILL.md +326 -0
  192. package/templates/skills/e2e-testing/agents/openai.yaml +7 -0
  193. package/templates/skills/eval-harness/SKILL.md +279 -0
  194. package/templates/skills/eval-harness/agents/openai.yaml +7 -0
  195. package/templates/skills/gh-issue-workflow/ISSUE.template.md +58 -0
  196. package/templates/skills/gh-issue-workflow/SKILL.md +184 -0
  197. package/templates/skills/investor-materials/SKILL.md +96 -0
  198. package/templates/skills/investor-outreach/SKILL.md +91 -0
  199. package/templates/skills/market-research/SKILL.md +75 -0
  200. package/templates/skills/market-research/agents/openai.yaml +7 -0
  201. package/templates/skills/nextjs-turbopack/SKILL.md +44 -0
  202. package/templates/skills/north-star/NORTH_STAR.template.md +114 -0
  203. package/templates/skills/north-star/SKILL.md +103 -0
  204. package/templates/skills/python-patterns/SKILL.md +750 -0
  205. package/templates/skills/python-testing/SKILL.md +816 -0
  206. package/templates/skills/spec-scaling/SKILL.md +89 -0
  207. package/templates/skills/strategic-compact/SKILL.md +131 -0
  208. package/templates/skills/strategic-compact/suggest-compact.sh +54 -0
  209. package/templates/skills/ui-visual-review/SKILL.md +154 -0
  210. package/templates/skills/verification-loop/SKILL.md +126 -0
  211. package/templates/skills/verification-loop/agents/openai.yaml +7 -0
  212. package/templates/track-mcp-map.tsv +15 -0
@@ -0,0 +1,80 @@
1
+ # Change Management
2
+
3
+ ## Change Request (CR) Classification
4
+
5
+ 구현 중 SPEC/PRD 변경이 필요한 경우:
6
+
7
+ | 유형 | 기준 | 처리 |
8
+ |------|------|------|
9
+ | **Clarification** | 이미 합의된 내용의 구체화 | 에이전트가 즉시 반영 + Change Log 기록 |
10
+ | **Minor** | 현재 Phase 내부에 국한 | 에이전트가 제안 → **인간 승인** → Change Log |
11
+ | **Major** | AC/Phase/Non-Goals/DO NOT CHANGE 영향 | **인간 결정 필수** → Change Log + 영향 분석 |
12
+
13
+ ## Classification Rules
14
+
15
+ ```
16
+ IF AC의 Pass/Fail에 영향 → Major
17
+ IF 다른 Phase의 입력/산출물에 영향 → Major
18
+ IF DO NOT CHANGE 영역에 영향 → Major
19
+ IF Non-Goals 경계에 영향 → Major
20
+ IF 현재 Phase 내부에 국한 → Minor
21
+ IF 합의 내용의 구체화 → Clarification
22
+ ```
23
+
24
+ ## DO NOT CHANGE Protection
25
+
26
+ - SPEC/PRD의 DO NOT CHANGE 영역은 **절대 수정 금지**.
27
+ - 수정이 불가피한 경우: Major CR 작성 → 인간 결정 대기.
28
+ - 안정적으로 보이는 영역도 수정 전 확인: "이 부분도 수정 범위입니까?"
29
+
30
+ ## Decision Log (ADR)
31
+
32
+ 구현 중 SPEC에 명시되지 않은 의사결정은 `docs/decisions/` 에 ADR로 기록:
33
+
34
+ ```markdown
35
+ # ADR-NNN: [결정 제목]
36
+ - Status: Proposed | Accepted | Superseded | Deprecated
37
+ - Date: YYYY-MM-DD
38
+ - PR: #123 (제안/승인 PR 링크)
39
+ - Supersedes: ADR-MMM (있으면)
40
+ - Context: [왜 결정이 필요했는가]
41
+ - Decision: [무엇을 결정했는가]
42
+ - Alternatives: [검토 후 기각된 대안]
43
+ - Consequences: [이 결정의 영향]
44
+ ```
45
+
46
+ ### ADR Status 흐름
47
+
48
+ ```
49
+ Proposed → Accepted → (Superseded by ADR-N | Deprecated)
50
+
51
+ (Rejected — 별도 ADR 안 만듦, PR comment에 사유 기록)
52
+ ```
53
+
54
+ | Status | 의미 | 다음 가능 transition |
55
+ |--------|------|-------------------|
56
+ | **Proposed** | PR 작성 + 검토 중. 아직 적용 X | Accepted, (Rejected) |
57
+ | **Accepted** | 머지됨. 본 결정에 따라 코드/문서 작성 | Superseded, Deprecated |
58
+ | **Superseded** | 다른 ADR이 본 결정을 대체 | (terminal — `Supersedes:` 필드로 link) |
59
+ | **Deprecated** | 더 이상 유효하지 않으나 대체 ADR 없음 | (terminal — 사유 PR/section 기록) |
60
+
61
+ ### 채택 프로세스
62
+
63
+ 1. **Proposed**: 의사결정 필요 시 ADR 초안 PR 생성. Status: Proposed.
64
+ 2. **검토**: PR review에서 Alternatives + Consequences 검증.
65
+ 3. **Accepted**: 머지 직전 Status: Accepted, PR 번호 채움.
66
+ 4. **변경**: 새 ADR로 Supersedes/Deprecates 명시. 기존 ADR Status 갱신.
67
+
68
+ ### 어떤 결정이 ADR 대상인가
69
+
70
+ - **대상**: 아키텍처 변경, 외부 의존성 도입/제거, 데이터 모델 변경, 보안 정책, breaking API
71
+ - **비대상**: 한 함수의 구현 디테일, 임시 워크어라운드, 명백한 버그 fix
72
+
73
+ ## Savepoint Protocol
74
+
75
+ Major CR 적용 전, 또는 주요 변경점에서 savepoint 생성:
76
+
77
+ ```bash
78
+ git add -A && git commit -m "chore: savepoint before [변경 설명]"
79
+ ```
80
+
@@ -0,0 +1,39 @@
1
+ # CLI / Bash Development Rules
2
+
3
+ tooling Track 전용. 기본 bash 규약(shebang/quoting/local/backticks/stderr)은 shellcheck가 처리. 여기는 프로젝트 특화만.
4
+
5
+ ## Cross-Platform (BSD vs GNU)
6
+
7
+ macOS(BSD)와 Linux(GNU) 양쪽 지원이 필수인 경우:
8
+
9
+ | 명령 | BSD | GNU | 회피 |
10
+ |------|-----|-----|------|
11
+ | `sed -i` | `sed -i ''` | `sed -i` | `-i.bak` + `rm *.bak` 또는 분기 |
12
+ | `date` | `date -j` | `date -d` | `if command -v gdate` 폴백 |
13
+ | `readlink -f` | 미지원 | 지원 | `cd "$(dirname $f)" && pwd` |
14
+
15
+ 차이가 큰 명령은 `command -v` 폴백 필수.
16
+
17
+ ## set 플래그
18
+
19
+ - `set -e` + `|| true` 혼용 금지 (의도 불분명). 실패 허용 섹션은 명시적 try 블록으로
20
+ - plugin 설치 등 실패 허용 구간에서 `set -e` 비활성화 가능
21
+ - `set -o pipefail`은 파이프 실패 검출 필요 시
22
+
23
+ ## Hook Script 규약
24
+
25
+ PreToolUse hook 작성 시:
26
+ - stdin으로 JSON 받음 → `jq` 또는 `grep` 폴백 (jq 미설치 환경 대응)
27
+ - **차단**: `exit 2` + stderr에 사유
28
+ - **통과**: `exit 0` (출력 없음)
29
+ - async hook은 10초 이내 완료
30
+
31
+ ## 임시 파일
32
+
33
+ `/tmp/file.txt` 같은 **고정 경로 금지** — 세션 충돌. `mktemp`/`mktemp -d` 사용.
34
+
35
+ ## Testing
36
+
37
+ - **shellcheck**: 필수 정적 분석
38
+ - **bats**: 단위 테스트 (optional)
39
+ - **수동**: `echo '{"...": "..."}' | bash hook.sh` heredoc/pipe로 stdin mock
@@ -0,0 +1,23 @@
1
+ # Code Style
2
+
3
+ 포매터/린터 설정(ruff, prettier, eslint, tsconfig strict, naming)은 각 프로젝트 config 파일이 SSOT. 여기는 Rule로 강제할 비구조적 원칙만.
4
+
5
+ ## 불변성
6
+
7
+ 기존 객체 mutation 금지. 새 객체 생성(spread/immer). 외부 상태 공유 시 side effect 숨은 버그의 주 원인.
8
+
9
+ ## 크기/복잡도 상한
10
+
11
+ - 파일: 800줄 상한. 초과 시 분리.
12
+ - 함수: 50줄 상한.
13
+ - 중첩: 4레벨 상한. early return으로 평탄화.
14
+
15
+ 상한 초과는 곧 리팩터링 시그널. 예외가 있으면 주석으로 사유 명시.
16
+
17
+ ## 하드코딩/매직 넘버 금지
18
+
19
+ 상수 또는 환경 변수. 의미 있는 이름 필수.
20
+
21
+ ## 타입 강도
22
+
23
+ `any`/`type: ignore` 최소화. 불가피 시 한 줄 사유 주석. 이외 명명/포매팅은 linter가 판정.
@@ -0,0 +1,61 @@
1
+ # Data Analysis Rules
2
+
3
+ data Track에서 적용.
4
+
5
+ ## DuckDB Patterns
6
+
7
+ - 파일 직접 쿼리: `SELECT * FROM 'data.parquet'`, `read_csv_auto('data.csv')`
8
+ - CTE 적극 활용 — 서브쿼리 중첩 대신 CTE 체이닝
9
+ - Window functions는 별도 CTE로 분리
10
+ - `SELECT *` 금지 — 필요한 컬럼만
11
+
12
+ ```sql
13
+ WITH daily_metrics AS (
14
+ SELECT date, SUM(revenue) AS total_revenue
15
+ FROM read_parquet('sales/*.parquet')
16
+ GROUP BY date
17
+ ),
18
+ moving_avg AS (
19
+ SELECT *, AVG(total_revenue) OVER (ORDER BY date ROWS 6 PRECEDING) AS ma7
20
+ FROM daily_metrics
21
+ )
22
+ SELECT * FROM moving_avg WHERE date >= '2026-01-01';
23
+ ```
24
+
25
+ ## Trino Federation
26
+
27
+ - 카탈로그 명시: `catalog.schema.table`
28
+ - 크로스 소스 JOIN 시 작은 테이블을 드라이빙 테이블로
29
+ - `EXPLAIN ANALYZE`로 쿼리 플랜 확인
30
+
31
+ ## pandas / polars
32
+
33
+ - **polars 우선** (대용량, 성능)
34
+ - pandas 사용 시: `df.copy()` 후 변환. 원본 수정 금지.
35
+ - 체이닝: pipe 패턴 사용
36
+
37
+ ```python
38
+ result = (
39
+ df.lazy()
40
+ .filter(pl.col("status") == "active")
41
+ .group_by("category")
42
+ .agg(pl.col("revenue").sum())
43
+ .sort("revenue", descending=True)
44
+ .collect()
45
+ )
46
+ ```
47
+
48
+ ## ML Pipeline
49
+
50
+ 1. 데이터 분리: train/val/test (시계열은 시간 순서 유지)
51
+ 2. 전처리: `sklearn.pipeline.Pipeline` + `ColumnTransformer`
52
+ 3. 베이스라인: 가장 단순한 모델 먼저 (LogisticRegression, XGBoost)
53
+ 4. 평가: cross_val_score, 혼동 행렬, 비즈니스 메트릭
54
+ 5. 실험 추적: MLflow (run_name, params, metrics, artifacts)
55
+
56
+ ## Visualization
57
+
58
+ - EDA: matplotlib/seaborn (정적)
59
+ - 인터랙티브: plotly
60
+ - PySide6 임베딩: `matplotlib.backends.backend_qtagg`
61
+ - 차트에 제목, 축 레이블, 범례 필수
@@ -0,0 +1,29 @@
1
+ # Database Rules
2
+
3
+ csr-fastify, csr-fastapi Track에서 적용.
4
+
5
+ ## ORM & Migration
6
+
7
+ - **SQLModel** + asyncpg (Python). SQLAlchemy Core 접근 가능.
8
+ - **Alembic**으로만 마이그레이션. 수동 DDL 금지.
9
+ - 마이그레이션 생성: `alembic revision --autogenerate -m "description"`
10
+ - 마이그레이션 적용: `alembic upgrade head`
11
+
12
+ ## Model Conventions
13
+
14
+ - PK: `id = Field(default_factory=uuid4, primary_key=True)` (UUID v4)
15
+ - `created_at`, `updated_at` 필수 (서버 사이드 타임스탬프).
16
+ - 소프트 삭제 시: `deleted_at: datetime | None = None`
17
+
18
+ ## Query Patterns
19
+
20
+ - **N+1 방지**: eager loading (`selectinload`, `joinedload`)
21
+ - **페이징**: cursor 기반 (offset 기반 대규모에서 성능 저하)
22
+ - **인덱스**: WHERE/ORDER BY에 사용되는 컬럼에 인덱스 추가
23
+ - `SELECT *` 금지 — 필요한 컬럼만
24
+
25
+ ## Safety
26
+
27
+ - 파라미터화된 쿼리만 사용. 문자열 결합 금지.
28
+ - 스키마 변경은 Major Change Request 대상.
29
+ - 프로덕션 DB 직접 접근 금지. 마이그레이션 통해서만.
@@ -0,0 +1,17 @@
1
+ # Design Workflow
2
+
3
+ UI가 포함된 작업 시 적용 (csr-*, ssr-*).
4
+
5
+ ## Pre-Build 필수 확인
6
+
7
+ 1. `DESIGN.md` 존재 → 디자인 방향/톤 참조
8
+ 2. `.impeccable.md` 존재 → 브랜드/청중/톤 컨텍스트 참조
9
+ 3. 둘 다 없으면 `/teach`로 컨텍스트 설정 먼저
10
+
11
+ Impeccable 스킬 목록/상세는 스킬 카탈로그 참조. 여기서 나열하지 않는다.
12
+
13
+ ## 원칙
14
+
15
+ - Generic AI 미학 금지 — 대담한 방향 + 일관성.
16
+ - 컴포넌트 라이브러리(shadcn/ui 등) 스타일과 충돌하지 않도록.
17
+ - 접근성 WCAG 2.1 AA 이상.
@@ -0,0 +1,23 @@
1
+ # Error Handling
2
+
3
+ "에러 무시 금지", "빈 catch 금지"는 linter가 처리. 여기는 프로젝트 특화 규약만.
4
+
5
+ ## 에러 응답 포맷 (FastAPI 백엔드)
6
+
7
+ 구조화된 JSON. 스택트레이스/내부 경로/DB 쿼리 등 민감 정보 노출 금지.
8
+
9
+ ```json
10
+ { "success": false, "error": { "code": "...", "message": "..." } }
11
+ ```
12
+
13
+ 커스텀 예외 클래스 + 전역 exception handler로 일관성 유지. 에러 로깅 시 context 필수(request_id, user_id, endpoint).
14
+
15
+ ## 외부 API 호출
16
+
17
+ timeout + 1회 재시도(exponential backoff). 무한 재시도 금지.
18
+
19
+ ## 프론트엔드
20
+
21
+ - Route 레벨 `ErrorBoundary` 배치.
22
+ - 사용자 메시지는 친화적으로, 기술 세부사항은 콘솔만.
23
+ - Form 검증은 schema 기반(zod 등).
@@ -0,0 +1,21 @@
1
+ # Gates Taxonomy
2
+
3
+ 워크플로우 검증 체크포인트가 매핑되는 4가지 게이트 유형. CLAUDE.md P9(Circuit Breakers)와 함께 적용.
4
+
5
+ ## 유형
6
+
7
+ | 유형 | 언제 | 동작 | 복구 |
8
+ |------|------|------|------|
9
+ | **Pre-flight** | 작업 시작 전 | 전제조건 미충족 시 차단. 부분 작업 없음 | 전제조건 수정 후 재시도 |
10
+ | **Revision** | 산출물 품질 불만족 | 수정 루프. 반복 상한 필수 (비용 비례) | 피드백 반영 → 재평가. 이슈 감소 없으면 조기 escalation |
11
+ | **Escalation** | 자동 해결 불가 | 옵션 제시 + 사용자 입력 대기 | 사용자 선택 후 선택된 경로로 재개 |
12
+ | **Abort** | 지속 시 손상/낭비 | 즉시 중단, 상태 보존, 사유 보고 | 근본 원인 수정 후 체크포인트에서 재시작 |
13
+
14
+ ## 선택 휴리스틱
15
+
16
+ 1. **Pre-flight 먼저** — 파일 존재/설정 읽기로 확인 가능한 값싼 검증
17
+ 2. 산출물 **생산 후** 품질 체크 → Revision (상한 필수)
18
+ 3. Revision 루프 해결 불가 → Escalation
19
+ 4. 계속 진행이 **위험하면** → Abort
20
+
21
+ 값싼 pre-flight로 최대한 걸러내고, 비싼 혹은 사용자 의사결정이 필요한 경우에만 상위 유형으로 넘긴다.
@@ -0,0 +1,102 @@
1
+ # Git Policy
2
+
3
+ CLAUDE.md Git Policy의 프로젝트 레벨 확장. 중복 내용 제거.
4
+
5
+ ## Commit 메시지
6
+
7
+ Conventional Commits: `<type>: <description>`
8
+ Types: feat, fix, refactor, docs, test, chore, perf, ci
9
+
10
+ 커밋 메시지는 **why 중심**. what은 diff가 보여준다. Breaking change는 body에 `BREAKING CHANGE:` 표기.
11
+
12
+ ## Branch 명명
13
+
14
+ `feat/<name>`, `fix/<name>`, `refactor/<name>`.
15
+
16
+ ## PR
17
+
18
+ - Issue 링크: `Closes #N`
19
+ - 전체 커밋 이력 분석 (`git diff [base]...HEAD`)
20
+ - 요약에 변경 + 테스트 계획 포함
21
+ - 새 branch는 `-u` 플래그로 push
22
+
23
+ ## Safety
24
+
25
+ - `--force`, `reset --hard`, hook 검증 우회 플래그 (`--no` + `verify` 옵션 결합 형태) 사용 금지 (명시적 요청 제외)
26
+ - git config 수정 금지
27
+ - `.env`, credentials, lock 파일 커밋 금지
28
+
29
+ ## Session Cleanup (필수)
30
+
31
+ 세션 종료 / `/clear` / `/compact` **직전** 다음 절차 강제:
32
+
33
+ 1. `gh pr list --state open` 실행 — open PR 잔존 여부 확인
34
+ 2. 잔존 PR 발견 시:
35
+ - 자동 머지 금지 — **사용자 명시 합의 필수**
36
+ - 각 PR 상태 보고: `# / title / branch / CI status / mergeable`
37
+ - 다음 행동 옵션 제시: 머지 / 그대로 두기 / draft 전환 / 취소
38
+
39
+ ### "build/verify/review gate ✓" ≠ "main 반영"
40
+
41
+ ship 보고 시 두 상태를 **반드시 분리**해서 보여줄 것:
42
+
43
+ - **Local gate 상태**: build/verify/review checkbox completed (`.claude/gate-status.json`)
44
+ - **Remote 상태**: PR merged into main + tag pushed + release 게시
45
+
46
+ gate ✓ 만 보고 ship 완료라 단정하지 않는다. open PR 1건이라도 있으면 cycle 미완.
47
+
48
+ ### 보고 형식 예
49
+
50
+ ```
51
+ gate: build ✓ / verify ✓ / review ✓ / ship ✓ (local gate-status)
52
+ main: PR #123 merged ✓ / tag v26.39.3 pushed ✓ / release ✓
53
+ OR
54
+ PR #123 OPEN — CI pass / mergeable / 사용자 결정 대기
55
+ ```
56
+
57
+ ## Post-Merge Cleanup (필수)
58
+
59
+ PR 머지 직후 stale branch 누적 방지. Session Cleanup 의 "open PR 점검" 과 보완 관계.
60
+
61
+ 1. **머지 시 remote branch 자동 삭제** — `gh pr merge <num> --squash --delete-branch`
62
+ - GitHub repo settings 의 "Automatically delete head branches" 토글이 켜져 있으면 `--delete-branch` 생략 가능. 둘 중 1개는 항상 적용
63
+ 2. **local main 동기화** — `git checkout main && git pull --ff-only`
64
+ 3. **local feature branch 삭제** — `git branch -d <branch>`
65
+ - squash merge 후엔 git 가 "unmerged" 경고 → 같은 변경 내용 확인 후 `-D` 사용 가능
66
+ 4. **정기 stale 점검** (선택) — `git branch --merged main | grep -v '^\*\| main$'` 으로 잔존 확인
67
+
68
+ ### 보고 형식 보강
69
+
70
+ ship 보고에 branch cleanup 상태 한 줄 추가:
71
+
72
+ ```
73
+ gate: build ✓ / verify ✓ / review ✓ / ship ✓
74
+ main: PR #123 merged ✓ / tag v26.39.6 ✓ / release ✓
75
+ branch: fix/foo deleted (local + remote) ✓
76
+ OR
77
+ branch: fix/foo OPEN — 삭제 필요
78
+ ```
79
+
80
+ ## Versioning Convention (절대 위반 금지)
81
+
82
+ **형식**: `vMAJOR.MINOR.PATCH`
83
+
84
+ - **Major = `year - 2000`** (CalVer-like)
85
+ - 2025 = `v25.x.x`
86
+ - **2026 = `v26.x.x`**
87
+ - 2027 = `v27.x.x`
88
+ - **Minor**: feature bump (BREAKING change여도 같은 year 내에서는 Minor만 bump)
89
+ - **Patch**: bug fix only
90
+
91
+ **Year 변경 시점에만 Major bump**. SemVer-식 BREAKING → Major 적용 **금지**.
92
+
93
+ ### Pre-tag checklist (모든 ship 전)
94
+
95
+ 1. `git tag -l | sort -V | tail -5` 마지막 정상 태그 확인
96
+ 2. 당해년도 매핑 검증 — `date +%Y` % 100 = 다음 Major
97
+ 3. SPEC/ADR/문서 본문에 "v(year+1).x" 같은 미래 태그 텍스트 보이면 **즉시 컨벤션 검증** — 그대로 따르지 말 것
98
+ 4. 위반 의심 시 ship 중단 + 사용자 컨펌
99
+
100
+ ### Drift Period (사후 정리)
101
+
102
+ 2026-04-18 ~ 2026-04-30: v27.0.0 ~ v28.0.0 (21건) 컨벤션 위반 누적 → 2026-04-30 일괄 rename to v26.18.0 ~ v26.38.0. 상세 ADR-007 참조.
@@ -0,0 +1,42 @@
1
+ # htmx Rules
2
+
3
+ ssr-htmx Track에서 적용.
4
+
5
+ ## Core Patterns
6
+
7
+ - `hx-swap` 기본값: `innerHTML`. 명시적으로 지정.
8
+ - `hx-trigger` 항상 명시. 암묵적 트리거에 의존하지 않음.
9
+ - `hx-boost` 내비게이션 링크에만. 폼이나 API 호출에 사용 금지.
10
+ - `hx-indicator` 필수 — 네트워크 요청 시 사용자에게 로딩 표시.
11
+
12
+ ## Partial Responses
13
+
14
+ - htmx 요청에 대한 응답은 **부분 HTML**만 반환.
15
+ - Jinja2 `block`/`macro`로 부분 템플릿 정의.
16
+ - 전체 페이지 렌더링 금지 (htmx 요청인 경우).
17
+
18
+ ```python
19
+ @app.get("/items/{id}")
20
+ async def get_item(request: Request, id: int):
21
+ item = await fetch_item(id)
22
+ if request.headers.get("HX-Request"):
23
+ return templates.TemplateResponse("partials/item.html", {"item": item})
24
+ return templates.TemplateResponse("pages/item.html", {"item": item})
25
+ ```
26
+
27
+ ## htmx + Alpine.js Boundary
28
+
29
+ - **htmx**: 서버 상호작용 (데이터 로드, 폼 제출, 부분 업데이트)
30
+ - **Alpine.js**: 클라이언트 전용 상호작용 (토글, 드롭다운, 탭)
31
+ - 둘을 혼합하지 않음. 서버 상태는 htmx, 클라이언트 상태는 Alpine.
32
+
33
+ ## Chart.js Coexistence
34
+
35
+ - htmx로 차트 영역 업데이트 전 기존 Chart 인스턴스 반드시 `destroy()`.
36
+ - 병렬 `htmx.ajax()` 호출 금지 — 순차 실행.
37
+ - 차트 컨테이너에 고정 높이 부여 (CLS 방지).
38
+
39
+ ## Security
40
+
41
+ - 모든 mutation(POST/PUT/DELETE)에 CSRF 토큰 필수.
42
+ - `hx-vals`로 민감 데이터 전송 금지.
@@ -0,0 +1,35 @@
1
+ # Next.js Rules
2
+
3
+ ssr-nextjs Track에서 적용.
4
+
5
+ ## Routing
6
+
7
+ - **App Router only**. Pages Router 사용 금지.
8
+ - 동적 라우트: `[param]` / `[...catchAll]`
9
+ - Route Groups: `(group)` 으로 레이아웃 공유
10
+ - `generateStaticParams` 사용하여 정적 경로 사전 생성
11
+
12
+ ## Server vs Client Components
13
+
14
+ - **기본은 Server Component**. `'use client'`는 필요할 때만.
15
+ - `'use client'` 사용 시점: useState, useEffect, 이벤트 핸들러, 브라우저 API
16
+ - 서버/클라이언트 경계를 최대한 아래로 밀어내기. 가능한 한 작은 client component.
17
+
18
+ ## Data Fetching
19
+
20
+ - `fetch` 옵션 명시적으로 지정:
21
+ - `{ cache: 'force-cache' }` — 정적 데이터
22
+ - `{ cache: 'no-store' }` — 동적 데이터
23
+ - `{ next: { revalidate: 3600 } }` — ISR
24
+ - Server Actions: `'use server'` 지시어, 폼 mutation에 사용
25
+
26
+ ## Assets
27
+
28
+ - `next/image`: 모든 이미지에 사용. `<img>` 직접 사용 금지.
29
+ - `next/font`: 폰트 최적화. Google Fonts 등.
30
+ - 환경 변수: 클라이언트 노출 시 `NEXT_PUBLIC_` 접두사.
31
+
32
+ ## Middleware
33
+
34
+ - `middleware.ts`: 인증 리다이렉트, locale 감지에만 사용.
35
+ - 무거운 로직 금지 — middleware는 edge에서 실행.
@@ -0,0 +1,66 @@
1
+ # Playwright Launch
2
+
3
+ 브라우저를 띄워 **사용자가 직접 사용**하는 모든 상황 (E2E 수동 확인, UX 비교, fidelity audit, OAuth 1회 로그인 등) 에 적용. 핵심 원칙: **영속 profile + Chrome for Testing 별도 binary + 자동화 0 patten**. MCP 일회성 context = 휘발 → 입력 버벅임. 정리하고 영속 profile로 재기동.
4
+
5
+ ## 절대 금지
6
+
7
+ - `mcp__chrome-devtools__*` 로 **사용자 활성 Chrome** attach (입력 latency)
8
+ - Playwright MCP (`mcp__plugin_playwright__*`) **일회성** browser context — 영속 profile dir 없음 → IndexedDB / cookie / localStorage / SW 휘발 → 매 launch 마다 재로그인 + 버벅임
9
+ - `browser.newContext()` 일회성 패턴
10
+ - **사용자 OAuth 입력 시점에 자동화 process 동시 실행** (CDP latency)
11
+ - reference SaaS (Linear / Notion / Jira 등) 측 `page.goto(URL)` 또는 `page.reload()` — sidebar click only
12
+
13
+ ## 필수 패턴
14
+
15
+ 1. **영속 profile dir** — 프로젝트별 분리, 매 iter 재사용. cookie + IndexedDB + Service Worker 영구 보존.
16
+ - 예: `~/.<project>-dev-audit-profile`, `~/.<reference>-audit-profile`, `${PROJECT_PROFILE_DIR}` env var
17
+ 2. **Chrome for Testing 별도 binary** — `npx playwright install chromium` 으로 받은 `~/Library/Caches/ms-playwright/chromium-*/chrome-mac-arm64/Google Chrome for Testing.app`. 사용자 일반 Chrome 과 완전 분리.
18
+ 3. **사용자 키 입력 시 자동화 layer 0** — main session 은 chromium 창 띄우기만. **사용자가 키보드 직접 입력**. 자동화 capture/검증은 **별도 process** (`node scripts/<launch>.mjs`) 에서 입력 끝난 후.
19
+ 4. **자체 구현 측 = dev bypass auth** — Google OAuth 등 webdriver 차단 회피. 예: `POST /api/v1/_dev/test-login` 으로 JWT cookie 발급.
20
+
21
+ ## 표준 launch 스크립트 골격
22
+
23
+ ```js
24
+ import { chromium } from 'playwright';
25
+
26
+ const PROFILE_DIR = process.env.PROJECT_PROFILE_DIR || `${process.env.HOME}/.<project>-audit-profile`;
27
+ const TARGET = process.env.PROJECT_URL || 'http://localhost:<port>';
28
+ const TEST_KEY = process.env.E2E_TEST_KEY || 'e2e-dev-key';
29
+
30
+ const ctx = await chromium.launchPersistentContext(PROFILE_DIR, {
31
+ headless: false,
32
+ viewport: { width: 1440, height: 900 },
33
+ args: ['--disable-blink-features=AutomationControlled', '--no-first-run', '--no-default-browser-check'],
34
+ });
35
+ const page = ctx.pages()[0] ?? (await ctx.newPage());
36
+
37
+ // (선택) dev bypass auth — same-origin cookie 자동 저장
38
+ await page.goto(`${TARGET}/`, { waitUntil: 'domcontentloaded' });
39
+ await ctx.request.post(`${TARGET}/api/v1/_dev/test-login`, {
40
+ data: { key: TEST_KEY, email: 'e2e@example.local' },
41
+ });
42
+ await page.reload({ waitUntil: 'networkidle' });
43
+
44
+ // 창 떠 있게 두고 자동화 detach — 사용자가 직접 사용.
45
+ // ctx.close() 호출 금지.
46
+ ```
47
+
48
+ ## 사용 패턴
49
+
50
+ ### A. 사용자가 직접 보고 싶을 때 (most common)
51
+
52
+ 1. `pkill -f "playwright|Chrome for Testing"` 기존 launcher 정리 (선택)
53
+ 2. `node scripts/<project>-launch.mjs` 실행 (chromium 창 살아있어야 함, 백그라운드 X)
54
+ 3. 사용자에게 "URL: localhost:<port>, 로그인됨, 직접 사용하세요" 보고
55
+ 4. **MCP playwright 로 추가 navigation/evaluate 금지** — 사용자 입력과 충돌
56
+
57
+ ### B. fidelity 비교 / audit 자동 capture
58
+
59
+ 1. `node scripts/<audit>.mjs` — launchPersistentContext + 비교 시나리오 자동 click
60
+ 2. 산출물 = `docs/research/<ref>_audit_<sprint>/iter_<N>/`
61
+
62
+ ## 위반 시 즉시 조치
63
+
64
+ 1. 일회성 Playwright MCP context 사용 발견 → 닫고 영속 profile launcher 로 재기동
65
+ 2. `chrome-devtools` MCP attach 발견 → 즉시 detach + Playwright 영속 패턴 전환
66
+ 3. 사용자가 "버벅인다" / "느리다" 호소 → 본 rule 위반 확인 1순위
@@ -0,0 +1,59 @@
1
+ # PySide6 Rules
2
+
3
+ data Track에서 적용.
4
+
5
+ ## Architecture
6
+
7
+ - UI 정의는 코드로 작성. Qt Designer `.ui` 파일 사용 안 함.
8
+ - MVC 패턴: Model(데이터) / View(위젯) / Controller(시그널/슬롯 연결)
9
+ - 메인 윈도우는 `QMainWindow` 상속.
10
+
11
+ ## Signals & Slots
12
+
13
+ ```python
14
+ from PySide6.QtCore import Signal, Slot, QObject
15
+
16
+ class DataProcessor(QObject):
17
+ progress = Signal(int)
18
+ finished = Signal(object)
19
+
20
+ @Slot()
21
+ def process(self):
22
+ for i in range(100):
23
+ self.progress.emit(i)
24
+ self.finished.emit(result)
25
+ ```
26
+
27
+ ## Threading (Critical)
28
+
29
+ - **UI 스레드에서 장시간 작업 금지** (DB 쿼리, 모델 학습, API 호출).
30
+ - `QThread` + Signal로 백그라운드 처리:
31
+
32
+ ```python
33
+ class Worker(QThread):
34
+ result_ready = Signal(object)
35
+
36
+ def run(self):
37
+ result = heavy_computation()
38
+ self.result_ready.emit(result)
39
+ ```
40
+
41
+ - UI 업데이트는 반드시 메인 스레드에서 (Signal → Slot 연결로 보장).
42
+
43
+ ## Model/View
44
+
45
+ - 대용량 데이터: `QAbstractTableModel` 서브클래싱
46
+ - 커스텀 정렬/필터: `QSortFilterProxyModel`
47
+ - 셀 커스터마이징: `QStyledItemDelegate`
48
+
49
+ ## Layout
50
+
51
+ - `QVBoxLayout` / `QHBoxLayout` 중첩
52
+ - `QSplitter` — 리사이저블 패널
53
+ - `QStackedWidget` — 페이지 전환
54
+ - 위젯 이름은 역할 기반: `self.search_input`, `self.result_table`
55
+
56
+ ## Resources
57
+
58
+ - `importlib.resources` 또는 `QResource` 사용
59
+ - 아이콘: 벡터(SVG) 우선, 크기별 래스터 제공
@@ -0,0 +1,33 @@
1
+ # shadcn/ui Rules
2
+
3
+ CSR, ssr-nextjs Track에서 적용.
4
+
5
+ ## Component Management
6
+
7
+ - CLI로만 추가: `npx shadcn@latest add <component>`
8
+ - `components/ui/` 디렉토리는 **읽기 전용**. 직접 수정 금지.
9
+ - 커스터마이징은 래퍼 컴포넌트로. 원본 ui/ 파일 수정하지 않음.
10
+
11
+ ## Theming
12
+
13
+ - 60/30/10 컬러 규칙: primary 60%, secondary 30%, accent 10%.
14
+ - 4px 기본 간격 단위 (Tailwind의 spacing scale 사용).
15
+ - 다크 모드: `next-themes` (Next.js) 또는 CSS 변수 토글.
16
+
17
+ ## Forms
18
+
19
+ - `react-hook-form` + `zod` 조합 사용.
20
+ - shadcn의 Form 컴포넌트 연동.
21
+ - 서버 사이드 검증과 동일한 zod 스키마 공유.
22
+
23
+ ## Accessibility
24
+
25
+ - WCAG 2.1 AA 이상.
26
+ - 키보드 내비게이션 확인.
27
+ - 아이콘은 `lucide-react`만 사용.
28
+
29
+ ## Registry Safety
30
+
31
+ - 새 컴포넌트 추가 전 기존 설치 목록 확인.
32
+ - 중복 추가 방지.
33
+ - 버전 충돌 시 lockfile 기준으로 해결.
@@ -0,0 +1,24 @@
1
+ # Ship Checklist
2
+
3
+ `/uzys:ship` 실행 시 아래 모든 항목을 통과해야 배포 가능.
4
+
5
+ ## Pre-Ship Gates
6
+
7
+ - [ ] **E2E 테스트 통과**: 핵심 사용자 흐름 E2E 테스트 전부 PASS (인증/결제/DB — `/uzys:test` 단계에서 검증됨)
8
+ - [ ] **커버리지 기준 충족**: test-policy.md의 Track별 threshold 확인
9
+ - [ ] **Security Scan 통과**: `npx ecc-agentshield scan` 결과 CRITICAL/HIGH 없음
10
+ - [ ] **의존성 감사 통과**: `npm audit` (Node.js) 또는 `pip audit` (Python) 실행. critical/high 취약점 없음
11
+ - [ ] **SPEC/PRD 정합성**: `bash .claude/hooks/spec-drift-check.sh ship` (exit 2 시 차단)
12
+ - [ ] **Review 게이트 통과**: `/uzys:review`에서 CRITICAL 이슈 없음 확인
13
+
14
+ ## Post-Ship Actions
15
+
16
+ - SPEC/PRD와 불일치 발견 시: SPEC/PRD 업데이트 → 커밋
17
+ - ADR 기록 필요 시: `docs/decisions/` 에 아키텍처 결정 기록
18
+ - Change Log 최종 확정
19
+
20
+ ## Deployment
21
+
22
+ - Railway 배포 가능 상태 확인 (Railway MCP/플러그인 사용)
23
+ - Health check 엔드포인트 응답 확인
24
+ - 배포 후 smoke test 실행