@uzysjung/agent-harness 26.140.0 → 26.141.1

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 (79) hide show
  1. package/README.ko.md +20 -18
  2. package/README.md +2 -2
  3. package/dist/{chunk-4XPSQ7XF.js → chunk-5RWSZT2J.js} +313 -344
  4. package/dist/chunk-5RWSZT2J.js.map +1 -0
  5. package/dist/index.js +178 -271
  6. package/dist/index.js.map +1 -1
  7. package/dist/trust-tier-drift.js +1 -1
  8. package/package.json +1 -1
  9. package/templates/CLAUDE.md +2 -2
  10. package/templates/agents/plan-checker.md +1 -2
  11. package/templates/antigravity/AGENTS.md.template +2 -2
  12. package/templates/codex/AGENTS.md.template +4 -6
  13. package/templates/codex/config.toml.template +1 -1
  14. package/templates/hooks/mcp-pre-exec.sh +18 -0
  15. package/templates/hooks/protect-files.sh +23 -0
  16. package/templates/hooks/session-start.sh +6 -21
  17. package/templates/hooks/task-brief-nudge.sh +57 -0
  18. package/templates/opencode/AGENTS.md.template +4 -6
  19. package/templates/rules/benchmark-parity.md +13 -74
  20. package/templates/rules/change-management.md +7 -26
  21. package/templates/rules/cli-development.md +11 -38
  22. package/templates/rules/doc-governance.md +22 -59
  23. package/templates/rules/git-policy.md +14 -48
  24. package/templates/rules/playwright-launch.md +5 -13
  25. package/templates/rules/ship-checklist.md +5 -14
  26. package/templates/rules/test-policy.md +15 -59
  27. package/templates/scripts/protect-branch.sh +108 -0
  28. package/templates/settings.json +10 -1
  29. package/templates/skills/audit-service-gaps/SKILL.md +247 -0
  30. package/templates/skills/audit-service-gaps/references/modes-and-evidence.md +61 -0
  31. package/templates/skills/audit-service-gaps/references/worked-example.md +40 -0
  32. package/templates/skills/clear-korean-communication/SKILL.md +256 -0
  33. package/templates/skills/clear-korean-communication/references/pre-send-checklist.md +37 -0
  34. package/templates/skills/clear-korean-communication/references/why-it-works.md +24 -0
  35. package/templates/skills/clear-korean-communication/references/worked-examples.md +89 -0
  36. package/templates/skills/external-model-consult/SKILL.md +291 -0
  37. package/templates/skills/external-model-consult/references/direct-calls.md +90 -0
  38. package/templates/skills/external-model-consult/references/prompt-templates.md +87 -0
  39. package/templates/skills/{codex-consult → external-model-consult}/scripts/codex-ask.sh +0 -0
  40. package/templates/skills/{gemini-consult → external-model-consult}/scripts/gemini-ask.sh +0 -0
  41. package/templates/skills/gh-issue-workflow/SKILL.md +50 -5
  42. package/templates/skills/model-orchestration/SKILL.md +52 -55
  43. package/templates/skills/multi-persona-review/SKILL.md +52 -61
  44. package/templates/skills/multi-persona-review/references/reviewer-design.md +55 -0
  45. package/templates/skills/multi-persona-review/references/worked-example.md +42 -0
  46. package/templates/skills/north-star/NORTH_STAR.template.md +10 -26
  47. package/templates/skills/north-star/SKILL.md +96 -25
  48. package/templates/skills/north-star/references/roadmap-method.md +86 -0
  49. package/templates/skills/recurrence-prevention/SKILL.md +54 -16
  50. package/templates/skills/recurrence-prevention/references/failure-analysis.md +64 -0
  51. package/templates/skills/task-brief/SKILL.md +218 -0
  52. package/templates/skills/verification-loop/SKILL.md +72 -3
  53. package/templates/skills/verification-loop/references/tracks.md +49 -0
  54. package/dist/chunk-4XPSQ7XF.js.map +0 -1
  55. package/templates/hooks/checkpoint-snapshot.sh +0 -94
  56. package/templates/hooks/karpathy-gate.sh +0 -59
  57. package/templates/hooks/spec-drift-check.sh +0 -126
  58. package/templates/rules/api-contract.md +0 -33
  59. package/templates/rules/code-style.md +0 -23
  60. package/templates/rules/data-analysis.md +0 -61
  61. package/templates/rules/database.md +0 -29
  62. package/templates/rules/design-workflow.md +0 -17
  63. package/templates/rules/error-handling.md +0 -23
  64. package/templates/rules/gates-taxonomy.md +0 -21
  65. package/templates/rules/htmx.md +0 -42
  66. package/templates/rules/nextjs.md +0 -35
  67. package/templates/rules/no-false-ship.md +0 -67
  68. package/templates/rules/pyside6.md +0 -59
  69. package/templates/rules/shadcn.md +0 -33
  70. package/templates/rules/tauri.md +0 -40
  71. package/templates/skills/asis-tobe-decision/SKILL.md +0 -161
  72. package/templates/skills/codex-consult/SKILL.md +0 -249
  73. package/templates/skills/explain-plainly/SKILL.md +0 -156
  74. package/templates/skills/gap-analysis-e2e/SKILL.md +0 -241
  75. package/templates/skills/gemini-consult/SKILL.md +0 -338
  76. package/templates/skills/harness-health-audit/SKILL.md +0 -509
  77. package/templates/skills/harness-health-audit/scripts/observation-digest.mjs +0 -212
  78. package/templates/skills/northstar-roadmap/SKILL.md +0 -177
  79. package/templates/skills/ultracode-service-audit/SKILL.md +0 -224
@@ -68,8 +68,7 @@ function resolveScope(scope) {
68
68
  }
69
69
  var DEFAULT_OPTIONS = {
70
70
  withPrune: false,
71
- withCodexTrust: false,
72
- withKarpathyHook: false
71
+ withCodexTrust: false
73
72
  };
74
73
 
75
74
  // src/external-assets.ts
@@ -102,60 +101,8 @@ var CSR_SSR_NEXTJS_FULL = [
102
101
  "ssr-nextjs",
103
102
  "full"
104
103
  ];
105
- var RAILWAY_TRACKS = ["csr-fastify", "csr-fastapi", "ssr-htmx", "ssr-nextjs", "full"];
106
104
  var EXTERNAL_ASSETS = [
107
105
  // === data Track ===
108
- {
109
- id: "polars-K-Dense",
110
- tier: "vetted",
111
- // K-Dense-AI 26k
112
- description: "Polars \u2014 fast Rust-based DataFrame (pandas alternative, data track)",
113
- category: "data",
114
- source: "K-Dense-AI",
115
- condition: { kind: "any-track", tracks: ["data", "full"] },
116
- method: { kind: "skill", source: "K-Dense-AI/scientific-agent-skills", skill: "polars" }
117
- // v26.56.0 — description 보강: 트랙 hint + 한 줄 의미
118
- },
119
- {
120
- id: "dask-K-Dense",
121
- tier: "vetted",
122
- // K-Dense-AI 26k
123
- description: "Dask \u2014 distributed processing (large DataFrames \xB7 cluster, data track)",
124
- category: "data",
125
- source: "K-Dense-AI",
126
- condition: { kind: "any-track", tracks: ["data", "full"] },
127
- method: { kind: "skill", source: "K-Dense-AI/scientific-agent-skills", skill: "dask" }
128
- },
129
- {
130
- // v26.106.0 (ADR-035, 사용자 승인 A): 일반 Python 패턴 = 순수 pattern-guide → opt-in 강등 (T2 가설 전제).
131
- id: "python-resource-management",
132
- tier: "vetted",
133
- // wshobson/agents 36k
134
- description: "Python memory \xB7 CPU management patterns (wshobson, data track)",
135
- category: "data",
136
- source: "wshobson",
137
- condition: { kind: "opt-in" },
138
- method: {
139
- kind: "skill",
140
- source: "https://github.com/wshobson/agents",
141
- skill: "python-resource-management"
142
- }
143
- },
144
- {
145
- // v26.106.0 (ADR-035, 사용자 승인 A): 동일 — 순수 pattern-guide → opt-in 강등.
146
- id: "python-performance-optimization",
147
- tier: "vetted",
148
- // wshobson/agents 36k
149
- description: "Python performance optimization (profiling \xB7 vectorize, wshobson, data track)",
150
- category: "data",
151
- source: "wshobson",
152
- condition: { kind: "opt-in" },
153
- method: {
154
- kind: "skill",
155
- source: "https://github.com/wshobson/agents",
156
- skill: "python-performance-optimization"
157
- }
158
- },
159
106
  {
160
107
  id: "anthropic-data-plugin",
161
108
  tier: "official",
@@ -196,168 +143,135 @@ var EXTERNAL_ASSETS = [
196
143
  condition: { kind: "opt-in" },
197
144
  method: { kind: "internal", key: "ci-scaffold" }
198
145
  },
199
- // === Dev-method skills (uzys 1st-party, v26.87.0) ===
200
- // 본 하네스의 작업 방법론 skill 8종 (repo-bundled templates). tier official, core on dev tracks
201
- // (has-dev-track → 기본 설치; wizard uncheck / --without <id> 로 제외 가능 — isAssetSelected 게이팅).
202
- {
203
- id: "multi-persona-review",
204
- tier: "official",
205
- // uzys 본 하네스 자체 템플릿
206
- description: "Multi-persona review \u2014 critique one artifact via 3-5 parallel user personas, then synthesize P0/P1/P2 fixes",
207
- category: "dev-tools",
208
- source: "uzys",
209
- condition: { kind: "has-dev-track" },
210
- method: { kind: "internal", key: "multi-persona-review" }
211
- },
146
+ // === Repo-bundled internal skills (uzys 1st-party, v26.87.0) ===
147
+ // 2026-08-02 복원 (ADR-062) — 이관(ADR-060) 후 감사에서 본문 열화 104건(dropped 76 ·
148
+ // damaged 28)이 확인돼 9종을 이 리포 번들로 되돌렸다. 아래 10종 전부 `kind: "internal"`.
212
149
  {
213
- id: "gap-analysis-e2e",
214
- tier: "official",
215
- // uzys 본 하네스 자체 템플릿
216
- description: "Gap analysis E2E \u2014 detect north-star / correctness / UX gaps, then benchmark how reference services solved each",
217
- category: "dev-tools",
218
- source: "uzys",
219
- condition: { kind: "has-dev-track" },
220
- method: { kind: "internal", key: "gap-analysis-e2e" }
221
- },
222
- {
223
- id: "ultracode-service-audit",
150
+ id: "compaction-handoff",
224
151
  tier: "official",
225
152
  // uzys 본 하네스 자체 템플릿
226
- description: "Ultracode service audit \u2014 multi-agent, adversarially-verified full-service audit across 7 dimensions \u2192 milestone roadmap",
227
- category: "dev-tools",
153
+ description: "Compaction handoff \u2014 persist durable state + git snapshot + resume anchor before a context /compact so nothing is lost",
154
+ category: "workflow",
228
155
  source: "uzys",
229
156
  condition: { kind: "has-dev-track" },
230
- method: { kind: "internal", key: "ultracode-service-audit" }
157
+ method: { kind: "internal", key: "compaction-handoff" }
231
158
  },
159
+ // === uzys 방법론 스킬 — 이 리포 번들 (2026-08-02 복원, ADR-062) ===
160
+ // ASIS(ADR-060): `kind: "skill"` — uzysjung/uzys-agent-skills 에서 `npx skills add`.
161
+ // TOBE: templates/skills/<id>/ 번들 → 설치 시 dir copy (`kind: "internal"`).
162
+ // 이관본이 판정 기준·수치·워크드 예시를 잃어(감사 실측 104건) 스킬이 무엇을 하라는지가
163
+ // 남고 무엇으로 판정하는지가 사라졌다. 배포 경로를 하나로 모으는 이득보다 본문 보존이
164
+ // 앞선다 — 본문 게이트(테스트)가 이 리포에만 있기 때문이다. tier official = 자사
165
+ // (star 무관 — trust-tier-drift 가 official 을 건너뛴다). condition 은 이관 전 도달 범위 유지.
232
166
  {
233
- id: "asis-tobe-decision",
167
+ id: "clear-korean-communication",
234
168
  tier: "official",
235
- // uzys 본 하네스 자체 템플릿
236
- description: "ASIS\u2192TOBE decision \u2014 present an A-or-B / approval moment as context \u2192 recommendation \u2192 option table \u2192 AS-IS/TO-BE contrast",
169
+ // uzys 자사 스킬 리포
170
+ description: "Clear Korean communication \u2014 restate technical facts from the reader's position (impact and cause first, then evidence) instead of translation-ese; covers decisions, approval requests, and AS-IS/TO-BE contrasts",
237
171
  category: "workflow",
238
172
  source: "uzys",
239
173
  condition: { kind: "has-dev-track" },
240
- method: { kind: "internal", key: "asis-tobe-decision" }
174
+ method: { kind: "internal", key: "clear-korean-communication" }
241
175
  },
242
176
  {
243
- id: "explain-plainly",
177
+ id: "north-star",
244
178
  tier: "official",
245
- // uzys 본 하네스 자체 템플릿
246
- description: "Explain plainly (opt-in \u2014 recommended) \u2014 fix the referent first, lead with who is affected and what changes, then show evidence; run it when the reader says they don't follow",
179
+ // uzys 자사 스킬 리포
180
+ description: "North Star \u2014 create or safely update the project direction baseline and its revision-linked roadmap, then analyze the impact on audits, verification criteria, issues, and work in progress",
247
181
  category: "workflow",
248
182
  source: "uzys",
249
- condition: { kind: "opt-in" },
250
- method: { kind: "internal", key: "explain-plainly" }
183
+ // 전 트랙 상주 보존 — 이관 전에는 manifest COMMON_SKILL_DIRS(조건 없는 전 트랙 설치)였다.
184
+ // 이 카탈로그에 "always" kind 가 없어 전 트랙 나열로 같은 도달 범위를 표현한다.
185
+ condition: { kind: "any-track", tracks: [...TRACKS] },
186
+ method: { kind: "internal", key: "north-star" }
251
187
  },
252
188
  {
253
- id: "compaction-handoff",
189
+ id: "audit-service-gaps",
254
190
  tier: "official",
255
- // uzys 본 하네스 자체 템플릿
256
- description: "Compaction handoff \u2014 persist durable state + git snapshot + resume anchor before a context /compact so nothing is lost",
257
- category: "workflow",
191
+ // uzys 자사 스킬 리포
192
+ description: "Audit service gaps \u2014 audit observable gaps between the service's current state and an explicit North Star baseline (reverse \xB7 defect \xB7 experience \xB7 benchmark \xB7 verify \xB7 change-impact \xB7 drift modes)",
193
+ category: "dev-tools",
258
194
  source: "uzys",
259
195
  condition: { kind: "has-dev-track" },
260
- method: { kind: "internal", key: "compaction-handoff" }
196
+ method: { kind: "internal", key: "audit-service-gaps" }
261
197
  },
262
198
  {
263
- id: "northstar-roadmap",
199
+ id: "verification-loop",
264
200
  tier: "official",
265
- // uzys 본 하네스 자체 템플릿
266
- description: "North-star roadmap \u2014 measure current state vs the vision doc, then propose a ranked feature backlog persisted to docs/plans + memory",
267
- category: "workflow",
201
+ // uzys 자사 스킬 리포
202
+ description: "Verification loop \u2014 run proportional verification tracks (UI \xB7 API \xB7 CLI \xB7 library \xB7 docs \xB7 real user flow) and end with evidence plus a fixed verdict; a green build is not proof of user-visible completion",
203
+ category: "dev-tools",
268
204
  source: "uzys",
269
205
  condition: { kind: "has-dev-track" },
270
- method: { kind: "internal", key: "northstar-roadmap" }
206
+ method: { kind: "internal", key: "verification-loop" }
271
207
  },
272
- // v26.98.0 — 하네스 건강 감사 (ADR-027). 어제(2026-07-14) 3개 프로젝트 교차 하네스 교정
273
- // 작업에서 추출한 방법론 + 리서치 근거(context rot·lost-in-the-middle·skill undertriggering·
274
- // Ratchet). 기존 5분류(드리프트=정확성만)에서 3질문(A truth / B efficacy / C economy)으로
275
- // 재설계 — "맞는 말인데 아무것도 안 일어나는" 하네스와 "다 맞는데 너무 길어 안 지켜지는"
276
- // 하네스를 잡는다. 결정적 경계: 결정론적 린터(AgentLint/cclint)가 할 수 있는 form 검사는
277
- // 위임하고, 린터가 구조적으로 못 하는 판단(이 단언이 이 repo 의 진짜 스택인가 / 이 훅이
278
- // 실제로 fire 하는가 / 이 스킬이 트리거되는가)만 모델이 한다 (판단만 모델 몫).
279
- // v26.101.0 — 안전(SAFE) 4번째 축 신설 (ADR-030): ADR-027 (z) 알려진 갭 해소. D1 위험 활성
280
- // 지시 · D2 폭발 반경 · D3 비신뢰 입력 취급. D 는 flag 기본(보안 태세 결정은 사용자 몫),
281
- // 완전성 단언은 계속 금지, "clean D ≠ security clearance" 명시.
282
208
  {
283
- id: "harness-health-audit",
209
+ id: "multi-persona-review",
284
210
  tier: "official",
285
- // uzys 본 하네스 자체 템플릿
286
- description: "Harness health audit \u2014 audit the CLAUDE.md/rules/skills/hooks steering layer on 4 questions a linter can't answer: TRUE (matches real code) \xB7 USED (skills trigger, loop verifies) \xB7 AFFORDABLE (inside the budget where rules are still followed) \xB7 SAFE (a live, accurate instruction can still be a bad idea)",
211
+ // uzys 자사 스킬 리포
212
+ description: "Multi-persona review \u2014 review one artifact through independent stakeholder and failure lenses, then synthesize evidence-backed, severity-ranked findings without discarding minority views",
287
213
  category: "dev-tools",
288
214
  source: "uzys",
289
215
  condition: { kind: "has-dev-track" },
290
- method: { kind: "internal", key: "harness-health-audit" }
216
+ method: { kind: "internal", key: "multi-persona-review" }
291
217
  },
292
- // v26.104.0 — 재발방지 (ADR-033, 사용자 지시 2026-07-17). 동일 이슈 재발 시: 재발을 증거로
293
- // 검증(메모리·룰 사례표·git 이력 — "느낌상 재발" 금지) → 단순 실수 vs 복잡 하네스 문제 분류 →
294
- // 단순 실수는 에스컬레이션 사다리(1회 기록 → 2회 룰 강제 등록 → 3회+ 구조적 게이트: 테스트/훅/
295
- // derive), 복잡 문제는 다면 페르소나로 대책 후보 설계. 본 repo 실무 관행(no-false-ship 3회
296
- // 재발→rule 신설, CHANGELOG 7릴리즈 drift→테스트 게이트, "주석 경고 ≠ 차단 수단")의 스킬화.
297
- // 대책이 실제 fire 하는지 검증(RED→GREEN/훅 exit 2) 없이 "보호됨" 보고 금지.
298
218
  {
299
219
  id: "recurrence-prevention",
300
220
  tier: "official",
301
- // uzys 본 하네스 자체 템플릿
302
- description: "Recurrence prevention \u2014 when the same defect happens again, verify the count with evidence, classify simple slip vs complex harness problem, then escalate the countermeasure: record \u2192 forced rule \u2192 structural gate (or multi-persona designed fix)",
221
+ // uzys 자사 스킬 리포
222
+ description: "Recurrence prevention \u2014 reconstruct a repeated defect's failure signature and timeline, then pick the least costly countermeasure (code \xB7 regression test \xB7 rule \xB7 hook \xB7 derivation \xB7 gate)",
303
223
  category: "workflow",
304
224
  source: "uzys",
305
225
  condition: { kind: "has-dev-track" },
306
226
  method: { kind: "internal", key: "recurrence-prevention" }
307
227
  },
308
- // === Opt-in internal bundled skills — 수단(권장) 계층 (v26.105.0, ADR-034) ===
309
- // 사용자 확정(2026-07-18): 방법론(목표·스코프/ADR/결함보고/재발방지 등) = 필수 코어(위 dev-method
310
- // 8종, 기본 설치) / model-orchestration·gemini-consult·codex-consult = **수단** — 필수 아님,
311
- // 단 **권장**(description 에 recommended 표기). 사용자: "agy, codex, model-policy는 수단인 것
312
- // 같아. 하지만 난 권장."
313
- // v26.93.0 — 사용자 확정(2026-07-04) Orchestration & Model Policy 스킬화. v26.94.0 개정
314
- // (2026-07-07): 역할분담 재편 — orchestrator 직접: 방향성·스펙리뷰(multi-persona-review)·
315
- // 기능개선·성능/보안 문제발굴 / opus@xhigh+: 문서작성·핵심구현·V&V(fresh instance) /
316
- // sonnet@high+: 반복구현·E2E. effort floor 강제 3경로 + quota 핸드오프는 유지.
317
- // v26.105.0 (ADR-034) — has-dev-track 기본 → opt-in 권장으로 이동 (수단 계층).
228
+ {
229
+ id: "gh-issue-workflow",
230
+ tier: "official",
231
+ // uzys 자사 스킬 리포
232
+ description: "GitHub issue workflow \u2014 investigate, draft, create, implement, verify, and close issue-backed work while keeping read-only, draft, external-write, and status stages distinct",
233
+ category: "workflow",
234
+ source: "uzys",
235
+ // 전 트랙 상주 보존 — north-star 와 같은 이유 (이관 전 COMMON_SKILL_DIRS).
236
+ condition: { kind: "any-track", tracks: [...TRACKS] },
237
+ method: { kind: "internal", key: "gh-issue-workflow" }
238
+ },
318
239
  {
319
240
  id: "model-orchestration",
320
241
  tier: "official",
321
- // uzys 본 하네스 자체 템플릿
322
- description: "Model orchestration policy \u2014 role split (orchestrator directs/reviews \xB7 opus@xhigh+ authors docs/core impl/V&V \xB7 sonnet@high+ repetitive impl/E2E) + effort floors + delegation spec + quota handoff (opt-in \u2014 recommended)",
242
+ // uzys 자사 스킬 리포
243
+ description: "Model orchestration \u2014 decompose work by capability and route independent, bounded tasks to available agents while preserving ownership, permissions, and verification (opt-in \u2014 recommended)",
323
244
  category: "workflow",
324
245
  source: "uzys",
325
246
  condition: { kind: "opt-in" },
326
247
  method: { kind: "internal", key: "model-orchestration" }
327
248
  },
328
- // gemini-consult: uzys 1st-party skill wrapping Antigravity's `agy` CLI for natural Korean
329
- // phrasing + multi-persona second-opinion review. Bundled like dev-method skills
330
- // (templates/skills/gemini-consult/) so it renders across all 4 CLIs, but opt-in (condition
331
- // opt-in) — installed only on wizard check / `--with gemini-consult`. Ships a bash wrapper
332
- // (scripts/gemini-ask.sh) to Claude scope via the dir copy; non-Claude CLIs get the SKILL.md
333
- // which degrades to a direct `agy` call (graceful — no broken wrapper reference). tier
334
- // official (repo template); runtime dep on the external `agy` binary is a prereq, not a source.
335
249
  {
336
- id: "gemini-consult",
250
+ // 전신 = gemini-consult + codex-consult. provider 중립 한 스킬로 통합됐다(통합은 유지 —
251
+ // 되돌린 것은 배포 경로이지 통합이 아니다).
252
+ id: "external-model-consult",
337
253
  tier: "official",
338
- // uzys 본 하네스 자체 템플릿 (런타임 의존 agy 는 사용자 prereq)
339
- description: "gemini-consult \u2014 consult Gemini (via Antigravity agy CLI) for natural Korean phrasing + multi-persona second-opinion review + Gemini image generation (opt-in; requires agy)",
254
+ // uzys 자사 스킬 리포
255
+ description: "External model consult \u2014 ask an available external model/provider for an independent draft, critique, or provider-only output such as image generation (opt-in \u2014 recommended; requires that provider's CLI)",
340
256
  category: "dev-tools",
341
257
  source: "uzys",
342
258
  condition: { kind: "opt-in" },
343
- method: { kind: "internal", key: "gemini-consult" }
259
+ method: { kind: "internal", key: "external-model-consult" }
344
260
  },
345
- // codex-consult (v26.100.0): uzys 1st-party sibling of gemini-consult, wrapping the OpenAI
346
- // `codex` CLI (`codex exec`) for concise rewriting / document structuring + image generation
347
- // (codex `image_generation` tool → real PNG on disk). Same bundling shape: dir copy ships
348
- // scripts/codex-ask.sh to Claude scope; non-Claude CLIs get SKILL.md with a direct-call
349
- // fallback. Division of labor is encoded in both skills' descriptions (Korean nuance/persona
350
- // → gemini, concision/structure/default images → codex). Runtime dep on `codex` binary is a
351
- // user prereq, not a source.
352
261
  {
353
- id: "codex-consult",
262
+ // 복원 9종이 아니라 신설이다 — 이관 이력이 없다.
263
+ // 전 트랙인 이유: 위임과 요청 정규화는 개발 트랙의 행위가 아니라 **전 트랙의 행위**다.
264
+ // executive 트랙도 서브에이전트에 일을 넘기고, 그때 브리프가 없으면 완료 판정 기준 없이
265
+ // 넘긴다. 짝인 `task-brief-nudge.sh` 훅이 `ALWAYS_HOOKS`(전 설치본)라 스킬만 좁게 깔면
266
+ // 넛지가 없는 스킬을 가리킨다 — 훅과 스킬의 도달 범위는 같아야 한다.
267
+ id: "task-brief",
354
268
  tier: "official",
355
- // uzys 본 하네스 자체 템플릿 (런타임 의존 codex 는 사용자 prereq)
356
- description: "codex-consult \u2014 consult OpenAI Codex (codex exec) for concise/structured rewriting + image generation (opt-in; requires codex CLI)",
357
- category: "dev-tools",
269
+ // uzys 자사 스킬
270
+ description: "Task brief \u2014 normalize an incoming request into the canonical brief (objective \xB7 inputs \xB7 invariants \xB7 success criteria \xB7 boundaries \xB7 autonomy \xB7 verification) and write every delegation prompt in that same shape",
271
+ category: "workflow",
358
272
  source: "uzys",
359
- condition: { kind: "opt-in" },
360
- method: { kind: "internal", key: "codex-consult" }
273
+ condition: { kind: "any-track", tracks: [...TRACKS] },
274
+ method: { kind: "internal", key: "task-brief" }
361
275
  },
362
276
  // === Option-gated (v26.42.0 — opt-in, BREAKING vs prior has-dev-track auto-install) ===
363
277
  {
@@ -471,7 +385,8 @@ var EXTERNAL_ASSETS = [
471
385
  description: "Railway agent-skills (deploy + project/service/env management)",
472
386
  category: "backend",
473
387
  source: "railwayapp",
474
- condition: { kind: "any-track", tracks: RAILWAY_TRACKS },
388
+ // 2026-08-02 사용자 결정: 트랙 기본 → opt-in (ADR-063)
389
+ condition: { kind: "opt-in" },
475
390
  method: {
476
391
  kind: "plugin",
477
392
  marketplace: "railwayapp/railway-skills",
@@ -486,7 +401,8 @@ var EXTERNAL_ASSETS = [
486
401
  description: "Vercel CLI (npm)",
487
402
  category: "backend",
488
403
  source: "vercel",
489
- condition: { kind: "any-track", tracks: ["csr-supabase", "full"] },
404
+ // 2026-08-02 사용자 결정: 트랙 기본 → opt-in (ADR-063)
405
+ condition: { kind: "opt-in" },
490
406
  method: { kind: "npm", pkg: "vercel", version: "54.17.3" }
491
407
  },
492
408
  {
@@ -508,27 +424,14 @@ var EXTERNAL_ASSETS = [
508
424
  description: "Supabase CLI (npm) \u2014 first 'supabase login' requires OAuth",
509
425
  category: "backend",
510
426
  source: "supabase",
511
- condition: { kind: "any-track", tracks: ["csr-supabase", "full"] },
427
+ // 2026-08-02 사용자 결정: 트랙 기본 → opt-in (ADR-063)
428
+ condition: { kind: "opt-in" },
512
429
  method: { kind: "npm", pkg: "supabase", version: "2.108.0" }
513
430
  },
514
431
  // === UI tracks (csr-*|ssr-*|full) ===
515
- {
516
- // v26.106.0 (ADR-035, 사용자 결정 2026-07-18): frontend-design(official)이 기본인 이상 taste
517
- // 가이드류는 opt-in 으로 충분 — v26.92.0 의 "생성↔리뷰 보완재" 논리는 권고이지 결합이 아님.
518
- id: "impeccable",
519
- tier: "vetted",
520
- // pbakaus 31k
521
- description: "Impeccable \u2014 UI design guide + visual consistency review (pbakaus, single-skill repo)",
522
- category: "frontend",
523
- source: "pbakaus",
524
- condition: { kind: "opt-in" },
525
- // v26.54.1 — skills cli 1.5.7 부터 `--skill <name>` 명시 필수 (single-skill repo 도)
526
- method: { kind: "skill", source: "pbakaus/impeccable", skill: "impeccable" }
527
- },
528
432
  // v26.92.0 — frontend-design (Anthropic official, claude-plugins-official 984.5K installs).
529
- // impeccable(생성↔리뷰 짝)의 official 보완재 — frontend-design=distinctive UI 코드 생성,
530
- // impeccable=일관성 리뷰. 사용자 결정: has-dev-track 기본추천 (impeccable=UI 트랙보다
531
- // 넓게 — 모든 개발 트랙, executive 제외). category=frontend (UI 자산, wizard 그룹).
433
+ // 사용자 결정: has-dev-track 기본추천 (모든 개발 트랙, executive 제외).
434
+ // category=frontend (UI 자산, wizard 그룹).
532
435
  // repoForAsset=marketplace(anthropics/claude-plugins-official); official tier=drift 제외.
533
436
  {
534
437
  id: "frontend-design",
@@ -544,6 +447,44 @@ var EXTERNAL_ASSETS = [
544
447
  pluginId: "frontend-design@claude-plugins-official"
545
448
  }
546
449
  },
450
+ // 2026-08-02 정비 — 프론트엔드 품질 3종 (사용자 지시). 전부 opt-in: frontend-design 이 기본
451
+ // 생성기이고 이 셋은 그 위의 취향·디테일 층이라 상시 비용을 물릴 근거가 없다 (ADR-032/035
452
+ // 와 같은 축). star 는 각 tier 라인 주석 = 2026-08-02 `gh api` 실측.
453
+ {
454
+ id: "jakubkrehel-skills",
455
+ tier: "vetted",
456
+ // jakubkrehel/skills 2,602 (2026-08-02)
457
+ description: "Better-* interface suite \u2014 7 skills reviewing/improving UI detail, typography, OKLCH color, accessibility, layout, and UX writing, one concern per skill",
458
+ category: "frontend",
459
+ source: "jakubkrehel",
460
+ condition: { kind: "opt-in" },
461
+ // `--skill` 미지정 = 리포의 7 스킬 전부 설치. 다른 multi-skill 출처(K-Dense·softaworks)는
462
+ // 한 자산 = 한 스킬이라 `--skill` 을 썼지만, 여기 광고 문구가 "7 skills" 세트다 —
463
+ // 한 개만 깔면 description 이 곧 거짓이 된다. 실호출 형태는 Docker 실설치(AC8)로 확인한다.
464
+ method: { kind: "skill", source: "jakubkrehel/skills" }
465
+ },
466
+ {
467
+ id: "taste-skill",
468
+ tier: "vetted",
469
+ // Leonxlnx/taste-skill 70,078 (2026-08-02)
470
+ description: "Anti-slop frontend design \u2014 removes the boilerplate look of AI-generated UI; infers a design language and tunes VARIANCE/MOTION/DENSITY, with minimalist/brutalist/high-end style variants",
471
+ category: "frontend",
472
+ source: "Leonxlnx",
473
+ condition: { kind: "opt-in" },
474
+ // 리포에 스킬 14종(brandkit·brutalist·minimalist 등)이 있고 본체가 `taste-skill` —
475
+ // 스타일 변형은 그 안에서 고른다. 다른 단일 대표 자산(remotion)과 같은 형태.
476
+ method: { kind: "skill", source: "Leonxlnx/taste-skill", skill: "taste-skill" }
477
+ },
478
+ {
479
+ id: "scroll-world",
480
+ tier: "vetted",
481
+ // oso95/scroll-world 6,863 (2026-08-02)
482
+ description: "Scroll-driven 3D world landing pages \u2014 interviews for brand/scene direction, generates AI assets, then builds a continuous camera-flight scroll engine",
483
+ category: "frontend",
484
+ source: "oso95",
485
+ condition: { kind: "opt-in" },
486
+ method: { kind: "skill", source: "oso95/scroll-world", skill: "scroll-world" }
487
+ },
547
488
  // === dev tools (has_dev_track) ===
548
489
  // v26.110.0 (ADR-039) — code-review: /code-review 커맨드 1개 (다중 에이전트 confidence
549
490
  // 스코어링 PR 리뷰). 기본 리뷰 스택(reviewer·code-reviewer·security-reviewer)과 표면 중복
@@ -579,21 +520,6 @@ var EXTERNAL_ASSETS = [
579
520
  pluginId: "security-guidance@claude-plugins-official"
580
521
  }
581
522
  },
582
- {
583
- id: "playwright-skill",
584
- tier: "experimental",
585
- // testdino-hq/playwright-skill 264
586
- description: "Playwright \u2014 browser automation E2E test authoring guide (testdino-hq)",
587
- category: "dev-tools",
588
- source: "testdino-hq",
589
- condition: { kind: "has-dev-track" },
590
- // v26.54.1 — skills cli 1.5.7 부터 `--skill <name>` 명시 필수
591
- method: {
592
- kind: "skill",
593
- source: "testdino-hq/playwright-skill",
594
- skill: "playwright-skill"
595
- }
596
- },
597
523
  {
598
524
  id: "find-skills",
599
525
  tier: "vetted",
@@ -861,35 +787,6 @@ var EXTERNAL_ASSETS = [
861
787
  // alirezarezvani/claude-skills marketplace (v2.3.0) — 2026-04-25 통합 갱신.
862
788
  // 기존 alirezarezvani/c-level-skills + alirezarezvani/finance-skills 별도 marketplace
863
789
  // → 통합된 alirezarezvani/claude-skills marketplace (claude-code-skills 이름)로 이동.
864
- {
865
- id: "c-level-skills",
866
- tier: "vetted",
867
- // alirezarezvani 16k
868
- description: "c-level-skills (claude-code-skills, 28 advisory)",
869
- category: "business",
870
- source: "alirezarezvani",
871
- condition: { kind: "any-track", tracks: ["executive", "full"] },
872
- method: {
873
- kind: "plugin",
874
- marketplace: "alirezarezvani/claude-skills",
875
- pluginId: "c-level-skills@claude-code-skills"
876
- }
877
- },
878
- {
879
- id: "business-growth-skills",
880
- tier: "vetted",
881
- // alirezarezvani 16k
882
- description: "business-growth-skills (4 \u2014 customer success, sales eng, revops, contract)",
883
- category: "business",
884
- source: "alirezarezvani",
885
- // v0.5.0 — growth-marketing Track에서도 재사용. 합집합 조건.
886
- condition: { kind: "any-track", tracks: ["executive", "full", "growth-marketing"] },
887
- method: {
888
- kind: "plugin",
889
- marketplace: "alirezarezvani/claude-skills",
890
- pluginId: "business-growth-skills@claude-code-skills"
891
- }
892
- },
893
790
  {
894
791
  id: "finance-skills",
895
792
  tier: "vetted",
@@ -897,7 +794,8 @@ var EXTERNAL_ASSETS = [
897
794
  description: "finance-skills (3 \u2014 financial analyst, SaaS metrics, investment advisor)",
898
795
  category: "business",
899
796
  source: "alirezarezvani",
900
- condition: { kind: "any-track", tracks: ["executive", "full"] },
797
+ // 2026-08-02 사용자 결정: 트랙 기본 → opt-in (ADR-063)
798
+ condition: { kind: "opt-in" },
901
799
  method: {
902
800
  kind: "plugin",
903
801
  marketplace: "alirezarezvani/claude-skills",
@@ -905,21 +803,6 @@ var EXTERNAL_ASSETS = [
905
803
  }
906
804
  },
907
805
  // === Project Management Track (v0.5.0) ===
908
- // SPEC docs/specs/new-tracks-pm-growth.md §3.5 — pm-skills 4/4.
909
- {
910
- id: "pm-skills",
911
- tier: "vetted",
912
- // alirezarezvani 16k
913
- description: "pm-skills (6 \u2014 senior PM, scrum master, Jira/Confluence/Atlassian admin, template creator)",
914
- category: "business",
915
- source: "alirezarezvani",
916
- condition: { kind: "any-track", tracks: ["project-management"] },
917
- method: {
918
- kind: "plugin",
919
- marketplace: "alirezarezvani/claude-skills",
920
- pluginId: "pm-skills@claude-code-skills"
921
- }
922
- },
923
806
  // SPEC §3.5 — product-skills: has-dev-track + project-management 합집합 (executive/growth-marketing 제외).
924
807
  {
925
808
  id: "product-skills",
@@ -930,7 +813,8 @@ var EXTERNAL_ASSETS = [
930
813
  source: "alirezarezvani",
931
814
  // v26.106.0 (ADR-035, 사용자 승인 C): dev 8트랙 기본에서 제외 — PM 스킬 15종은 PM 트랙 목적
932
815
  // 자산. dev 트랙은 wizard 체크 / --with 로 opt-in.
933
- condition: { kind: "any-track", tracks: ["project-management"] },
816
+ // 2026-08-02 사용자 결정: 트랙 기본 → opt-in (ADR-063)
817
+ condition: { kind: "opt-in" },
934
818
  method: {
935
819
  kind: "plugin",
936
820
  marketplace: "alirezarezvani/claude-skills",
@@ -938,23 +822,10 @@ var EXTERNAL_ASSETS = [
938
822
  }
939
823
  },
940
824
  // === Growth Marketing Track (v0.5.0) ===
941
- // SPEC docs/specs/new-tracks-pm-growth.md §3.5 — 4 entries 모두 4/4.
942
- {
943
- id: "marketing-skills",
944
- tier: "vetted",
945
- // alirezarezvani 16k
946
- description: "marketing-skills (44 \u2014 content/SEO/CRO/channels/growth/intelligence/sales/twitter)",
947
- category: "business",
948
- source: "alirezarezvani",
949
- condition: { kind: "any-track", tracks: ["growth-marketing"] },
950
- method: {
951
- kind: "plugin",
952
- marketplace: "alirezarezvani/claude-skills",
953
- pluginId: "marketing-skills@claude-code-skills"
954
- }
955
- },
956
- // v26.91.0 — coreyhaines31/marketingskills (35k★, MIT, plugin v2.5.1). 위 alirezarezvani
957
- // marketing-skills(16k) 와 병존 — id 구분(marketingskills ≠ marketing-skills). opt-in =
825
+ // 2026-08-02 정비 — alirezarezvani 번들 4종(c-level·business-growth·pm·marketing) +
826
+ // research-summarizer 제거. 남는 마케팅 번들은 아래 coreyhaines31/marketingskills 하나로,
827
+ // 동명이물(marketing-skills ≠ marketingskills) 병존도 이로써 해소된다.
828
+ // v26.91.0 — coreyhaines31/marketingskills (35k★, MIT, plugin v2.5.1). opt-in =
958
829
  // growth-marketing 외 전 트랙에서도 wizard 토글 + `--with marketingskills` 로 설치 가능
959
830
  // ("SEO 는 일반 개발에도 활용" 충족: dev 트랙에서 본 번들 토글). 45 스킬 중 SEO 7종
960
831
  // (seo-audit/schema/ai-seo/site-architecture/programmatic-seo/content/aso)은 상호참조
@@ -976,38 +847,10 @@ var EXTERNAL_ASSETS = [
976
847
  },
977
848
  // v26.76.0 — content-creator / demand-gen 제거: alirezarezvani/claude-skills marketplace.json 에
978
849
  // 해당 plugin 부재(Docker 실설치 검출, exit 1). 거짓 광고 0건 원칙(Promise=Implementation).
979
- // growth-marketing 트랙은 business-growth-skills + marketing-skills + research-summarizer 유지.
980
- {
981
- id: "research-summarizer",
982
- tier: "vetted",
983
- // alirezarezvani 16k
984
- description: "research-summarizer (market research summarization)",
985
- category: "business",
986
- source: "alirezarezvani",
987
- condition: { kind: "any-track", tracks: ["growth-marketing"] },
988
- method: {
989
- kind: "plugin",
990
- marketplace: "alirezarezvani/claude-skills",
991
- pluginId: "research-summarizer@claude-code-skills"
992
- }
993
- },
994
- // === Code-quality enforcement (has-dev-track, v0.5.0) ===
995
- // SPEC §3.5 — karpathy-coder 4/4. CLAUDE.md P1-P4 선언적 원칙의 검출 도구 layer.
996
- // 4 Python tools (stdlib only) + reviewer agent + /karpathy-check + pre-commit hook.
997
- {
998
- id: "karpathy-coder",
999
- tier: "vetted",
1000
- // alirezarezvani 16k
1001
- description: "karpathy-coder (4 Python tool + reviewer agent + /karpathy-check + pre-commit hook)",
1002
- category: "dev-tools",
1003
- source: "alirezarezvani",
1004
- condition: { kind: "has-dev-track" },
1005
- method: {
1006
- kind: "plugin",
1007
- marketplace: "alirezarezvani/claude-skills",
1008
- pluginId: "karpathy-coder@claude-code-skills"
1009
- }
1010
- },
850
+ // 2026-08-02 정비 — karpathy-coder 제거. Write|Edit 마다 Python complexity 검사를 돌리는
851
+ // 상시 훅이었고, 그 검사는 현행 모델이 이미 하는 일이다 (Opus 5 가이드의 "legacy harness
852
+ // scaffolding"에 정확히 해당). 딸린 배선(`--with-karpathy-hook` 플래그 · templates/hooks/
853
+ // karpathy-gate.sh · settings.json PreToolUse auto-wire)도 함께 삭제 — BREAKING, ADR-060.
1011
854
  // === Option-gated ===
1012
855
  {
1013
856
  // v26.39.2 fix — marketplace name = "trailofbits" (NOT "trailofbits-skills") +
@@ -1060,30 +903,20 @@ var EXTERNAL_ASSETS = [
1060
903
  }
1061
904
  ];
1062
905
  var DEV_METHOD_SKILL_IDS = [
1063
- "multi-persona-review",
1064
- "gap-analysis-e2e",
1065
- "ultracode-service-audit",
1066
- "asis-tobe-decision",
1067
906
  "compaction-handoff",
1068
- "northstar-roadmap",
1069
- // v26.98.0 — 하네스 건강 감사 (ADR-027).
1070
- "harness-health-audit",
1071
- // v26.104.0 — 재발방지 (ADR-033).
1072
- "recurrence-prevention"
1073
- // v26.105.0 (ADR-034) — model-orchestration 은 '수단(권장)' 계층으로 이동 (opt-in internal).
907
+ "clear-korean-communication",
908
+ "audit-service-gaps",
909
+ "multi-persona-review",
910
+ "recurrence-prevention",
911
+ "verification-loop"
1074
912
  ];
1075
913
  var INTERNAL_BUNDLED_SKILL_IDS = [
1076
914
  ...DEV_METHOD_SKILL_IDS,
1077
- // opt-in internal skills (NOT dev-method): bundled + 4-CLI rendered, installed only on opt-in.
1078
- // v26.105.0 (ADR-034) — '수단(권장)' 계층: model-orchestration + advisors.
915
+ "north-star",
916
+ "gh-issue-workflow",
917
+ "task-brief",
1079
918
  "model-orchestration",
1080
- "gemini-consult",
1081
- // v26.100.0 — Codex advisor (concision/structure + image gen). ADR-029.
1082
- "codex-consult",
1083
- // v26.130.0 — 설명 진단(지시대상 → 한 문장 → 근거). asis-tobe-decision 의 형제지만
1084
- // **opt-in** 이다: 기본 설치 descriptor 예산(ADR-032 ratchet)을 33 토큰 넘겼고, 아직
1085
- // 이 리포 밖에서 가치가 입증되지 않은 자산에 그 상향을 요구하지 않는다.
1086
- "explain-plainly"
919
+ "external-model-consult"
1087
920
  ];
1088
921
  var TRUST_TIER = Object.fromEntries(
1089
922
  EXTERNAL_ASSETS.map((a) => [a.id, a.tier])
@@ -1174,38 +1007,160 @@ var CATEGORY_TITLES = {
1174
1007
 
1175
1008
  // src/manifest.ts
1176
1009
  init_esm_shims();
1010
+
1011
+ // src/project-claude-merge.ts
1012
+ init_esm_shims();
1013
+ var HARNESS_ANCHOR_FILE = "CLAUDE-uzys-harness.md";
1014
+ var HARNESS_IMPORT_LINE = `@${HARNESS_ANCHOR_FILE}`;
1015
+ var IMPORT_MARKER_START = "<!-- uzys-harness:import:start -->";
1016
+ var IMPORT_MARKER_END = "<!-- uzys-harness:import:end -->";
1017
+ var IMPORT_BLOCK = `${IMPORT_MARKER_START}
1018
+ ${HARNESS_IMPORT_LINE}
1019
+ ${IMPORT_MARKER_END}`;
1020
+ var TRACK_DISPLAY_NAMES = {
1021
+ tooling: "Tooling",
1022
+ "csr-supabase": "CSR Supabase",
1023
+ "csr-fastify": "CSR Fastify",
1024
+ "csr-fastapi": "CSR FastAPI",
1025
+ "ssr-htmx": "SSR HTMX",
1026
+ "ssr-nextjs": "SSR Next.js",
1027
+ data: "Data",
1028
+ executive: "Executive",
1029
+ full: "Full",
1030
+ "project-management": "Project Management",
1031
+ "growth-marketing": "Growth Marketing"
1032
+ };
1033
+ var FULL_EXPANSION = TRACKS.filter((t) => t !== "full");
1034
+ var FILL_SECTIONS = [
1035
+ "identity",
1036
+ "stack",
1037
+ "architecture",
1038
+ "installed-assets",
1039
+ "boundaries",
1040
+ "verify"
1041
+ ];
1042
+ var FILL_SPECS = {
1043
+ identity: {
1044
+ title: "Identity & Purpose",
1045
+ prompt: `Replace the H1 title above with this project's real name, then state in 1-2 plain sentences what it does, who uses it, and why it exists. Sources: README.md, the package.json / pyproject.toml "description", docs/. Do NOT describe the harness itself. Delete this comment when done.`,
1046
+ placeholder: "what this project is, who it is for, and why it exists"
1047
+ },
1048
+ stack: {
1049
+ title: "Stack & Commands",
1050
+ prompt: "Replace the list below with this project's REAL stack. Inspect package.json / pyproject.toml / go.mod / Cargo.toml / Gemfile + lockfiles and any Makefile/justfile/package scripts. List the language(s)+versions, framework(s), package manager, and the exact install/build/test/run commands. Verify each command exists before writing it \u2014 never guess. Delete lines that do not apply, then delete this comment.",
1051
+ placeholder: "languages, runtimes, package manager, and the install/build/test/run commands"
1052
+ },
1053
+ architecture: {
1054
+ title: "Architecture & Layout",
1055
+ prompt: "Map this repository. List each top-level source directory and what it holds, the entry point(s), the 3-5 files a newcomer reads first, and how data/requests flow between the main layers. View the real tree (e.g. `git ls-files | sed 's#/.*##' | sort -u`) \u2014 do not assume a framework's conventional layout. Flag any generated/vendored directories that must never be hand-edited. If this is a single small module, say so in one line. Delete this comment when done.",
1056
+ placeholder: "where things live, the entry points, and how data flows between layers"
1057
+ },
1058
+ "installed-assets": {
1059
+ title: "Installed Harness Assets",
1060
+ prompt: "List the harness assets installed in this project (rules / skills / agents / commands) and add one line each on when to reach for it here. Verify against .claude/rules/*.md, .claude/skills/, .claude/agents/, .claude/commands/ (or this CLI's equivalent) and list ONLY assets whose file exists on disk \u2014 do not invent any. Do NOT restate the harness's working principles (they live in this project's harness anchor and rules layer) \u2014 cross-reference them instead. Delete this comment when done.",
1061
+ placeholder: "the installed rules/skills/agents/commands and when to use each"
1062
+ },
1063
+ boundaries: {
1064
+ title: "Boundaries \u2014 Always / Ask First / Never",
1065
+ prompt: `Fill the Always / Ask First / Never lists with this repo's real red lines. Read the CI config, CODEOWNERS, .gitignore, and release/deploy scripts. Never must include secrets, generated files, force-push, and direct commits to the default branch, plus any repo-specific "do not touch" directories. Every entry must be specific and enforceable here. Delete this comment when done.`,
1066
+ placeholder: "what to always do, ask before doing, and never do in this repo"
1067
+ },
1068
+ verify: {
1069
+ title: "Verification Gate",
1070
+ prompt: 'State the single command (or short sequence) that PROVES a change is safe here \u2014 the test/lint/typecheck/build gate you run before committing \u2014 plus the coverage/CI threshold and what "done" means. Sources: package scripts, CI workflow files, CONTRIBUTING. An agent must be able to self-verify without guessing. Delete this comment when done.',
1071
+ placeholder: "the single command that proves a change is safe, and the done bar"
1072
+ }
1073
+ };
1074
+ var SCAFFOLD_BANNER = [
1075
+ "> \u2699\uFE0F **SCAFFOLD \u2014 not filled in yet.** The sections below are a fill-in template for THIS project, not verified facts.",
1076
+ "> To fill: open this file and paste each `<!-- FILL: \u2026 -->` comment's instruction into your coding agent (e.g. Claude Code) \u2014 it will inspect the real repo and write the section. You can also fill them by hand; the comments are the instructions.",
1077
+ `> The working principles live in this project's harness anchor \u2014 \`${HARNESS_ANCHOR_FILE}\` (Claude Code, imported from this file), \`AGENTS.md\` (Codex/OpenCode), or \`.agents/rules/uzys-harness.md\` (Antigravity). This file is **project-specific context only**.`
1078
+ ].join("\n");
1079
+ function renderFillScaffold() {
1080
+ const blocks = FILL_SECTIONS.map((id) => {
1081
+ const spec = FILL_SPECS[id];
1082
+ return `## ${spec.title}
1083
+
1084
+ <!-- FILL:${id} \u2014 ${spec.prompt} -->
1085
+
1086
+ _(not filled yet \u2014 ${spec.placeholder})_`;
1087
+ });
1088
+ return `${SCAFFOLD_BANNER}
1089
+
1090
+ ${blocks.join("\n\n")}`;
1091
+ }
1092
+ function mergeProjectClaude(opts) {
1093
+ const expanded = expandTracks(opts.tracks);
1094
+ const trackList = expanded.map((t) => TRACK_DISPLAY_NAMES[t]).join(", ");
1095
+ const header = `# ${opts.projectName}
1096
+
1097
+ > Active track(s): ${trackList}`;
1098
+ return `${header}
1099
+
1100
+ ${renderFillScaffold()}
1101
+ `;
1102
+ }
1103
+ function upsertHarnessImport(existing, opts) {
1104
+ if (existing === null) {
1105
+ return `${mergeProjectClaude(opts)}
1106
+ ${IMPORT_BLOCK}
1107
+ `;
1108
+ }
1109
+ if (hasHarnessImport(existing)) {
1110
+ return existing;
1111
+ }
1112
+ const body = existing.endsWith("\n") ? existing : `${existing}
1113
+ `;
1114
+ return `${body}
1115
+ ${IMPORT_BLOCK}
1116
+ `;
1117
+ }
1118
+ function stripHarnessImport(text) {
1119
+ const start = text.indexOf(IMPORT_MARKER_START);
1120
+ if (start === -1) return null;
1121
+ const endAt = text.indexOf(IMPORT_MARKER_END, start);
1122
+ if (endAt === -1) return null;
1123
+ const before = text.slice(0, start).replace(/\n+$/, "\n");
1124
+ const after = text.slice(endAt + IMPORT_MARKER_END.length).replace(/^\n+/, "");
1125
+ return `${before}${after}`;
1126
+ }
1127
+ function hasHarnessImport(text) {
1128
+ if (text.includes(IMPORT_MARKER_START)) return true;
1129
+ let inFence = false;
1130
+ for (const line of text.split("\n")) {
1131
+ if (/^\s*(?:```|~~~)/.test(line)) {
1132
+ inFence = !inFence;
1133
+ continue;
1134
+ }
1135
+ if (!inFence && line.trim() === HARNESS_IMPORT_LINE) return true;
1136
+ }
1137
+ return false;
1138
+ }
1139
+ function expandTracks(tracks) {
1140
+ if (tracks.includes("full")) {
1141
+ return FULL_EXPANSION;
1142
+ }
1143
+ return tracks;
1144
+ }
1145
+
1146
+ // src/manifest.ts
1177
1147
  var all = () => true;
1178
1148
  var dev = (s) => hasDevTrack(s.tracks);
1179
1149
  var ui = (s) => hasUiTrack(s.tracks);
1180
1150
  var onTracks = (pattern) => (s) => anyTrack(s.tracks, pattern);
1181
- var COMMON_RULES = [
1182
- "git-policy",
1183
- "change-management",
1184
- "gates-taxonomy",
1185
- "doc-governance",
1186
- "no-false-ship"
1187
- ];
1188
- var DEV_RULES = ["test-policy", "ship-checklist", "code-style", "error-handling"];
1189
- var UI_RULES = ["design-workflow", "playwright-launch", "benchmark-parity"];
1151
+ var COMMON_RULES = ["git-policy", "change-management", "doc-governance"];
1152
+ var DEV_RULES = ["test-policy", "ship-checklist"];
1153
+ var UI_RULES = ["playwright-launch", "benchmark-parity"];
1190
1154
  var TRACK_RULES = {
1191
- "csr-supabase": ["shadcn", "api-contract"],
1192
- "csr-fastify": ["shadcn", "api-contract", "database"],
1193
- "csr-fastapi": ["shadcn", "api-contract", "database"],
1194
- "ssr-htmx": ["htmx"],
1195
- "ssr-nextjs": ["nextjs", "shadcn"],
1196
- data: ["pyside6", "data-analysis"],
1155
+ "csr-supabase": [],
1156
+ "csr-fastify": [],
1157
+ "csr-fastapi": [],
1158
+ "ssr-htmx": [],
1159
+ "ssr-nextjs": [],
1160
+ data: [],
1197
1161
  executive: [],
1198
1162
  tooling: ["cli-development"],
1199
- full: [
1200
- "shadcn",
1201
- "api-contract",
1202
- "database",
1203
- "htmx",
1204
- "nextjs",
1205
- "pyside6",
1206
- "data-analysis",
1207
- "cli-development"
1208
- ],
1163
+ full: ["cli-development"],
1209
1164
  // v0.5.0 — executive-style baselines (no dev rules; common rules only).
1210
1165
  "project-management": [],
1211
1166
  "growth-marketing": []
@@ -1217,9 +1172,6 @@ function resolveRules(spec) {
1217
1172
  set.add(r);
1218
1173
  }
1219
1174
  }
1220
- if (spec.withTauri && anyTrack(spec.tracks, "csr-*|full")) {
1221
- set.add("tauri");
1222
- }
1223
1175
  if (hasUiTrack(spec.tracks)) {
1224
1176
  for (const r of UI_RULES) {
1225
1177
  set.add(r);
@@ -1240,15 +1192,17 @@ var ALWAYS_HOOKS = [
1240
1192
  "session-start.sh",
1241
1193
  "protect-files.sh",
1242
1194
  "mcp-pre-exec.sh",
1243
- "spec-drift-check.sh",
1244
- "checkpoint-snapshot.sh"
1195
+ // UserPromptSubmit 넛지. 차단하지 않는 유일한 훅 — 판정은 결정적 두 조건뿐이고(길이 ·
1196
+ // `<objective>` 표식 부재) 변환 자체는 `task-brief` 스킬 몫이다. `templates/settings.json`
1197
+ // 배선과 한 벌 (hook-wiring-parity 가 한쪽만 있는 상태를 문다).
1198
+ "task-brief-nudge.sh"
1245
1199
  ];
1246
- var COMMON_SKILL_DIRS = ["north-star", "gh-issue-workflow"];
1200
+ var COMMON_SKILL_DIRS = [];
1247
1201
  var COMMON_SKILL_DIRS_ECC = ["strategic-compact", "continuous-learning-v2"];
1248
1202
  var MODIFIED_COMMON_SKILL_DIRS = ["deep-research"];
1249
1203
  var DEV_SKILL_DIRS = [];
1250
1204
  var DEV_SKILL_DIRS_ECC = ["agent-introspection-debugging"];
1251
- var MODIFIED_DEV_SKILL_DIRS = ["verification-loop", "eval-harness"];
1205
+ var MODIFIED_DEV_SKILL_DIRS = ["eval-harness"];
1252
1206
  var MODIFIED_ECC_SKILL_DIRS = [...MODIFIED_COMMON_SKILL_DIRS, ...MODIFIED_DEV_SKILL_DIRS];
1253
1207
  var UI_SKILL_DIRS = ["ui-visual-review"];
1254
1208
  var UI_SKILL_DIRS_ECC = ["e2e-testing"];
@@ -1271,7 +1225,13 @@ function buildManifest(spec) {
1271
1225
  });
1272
1226
  m.push({
1273
1227
  source: "CLAUDE.md",
1274
- target: ".claude/CLAUDE.md",
1228
+ target: HARNESS_ANCHOR_FILE,
1229
+ type: "file",
1230
+ applies: all
1231
+ });
1232
+ m.push({
1233
+ source: "scripts/protect-branch.sh",
1234
+ target: ".uzys-agent-harness/protect-branch.sh",
1275
1235
  type: "file",
1276
1236
  applies: all
1277
1237
  });
@@ -1501,8 +1461,10 @@ function residentCost(entries, root = resolveBundleRoot()) {
1501
1461
  skillItems += 1;
1502
1462
  }
1503
1463
  }
1504
- const projectClaudeMd = fileTokens(join(root, "templates", "CLAUDE.md"));
1505
- const claudeMdItems = projectClaudeMd > 0 ? 1 : 0;
1464
+ const harnessAnchor = fileTokens(join(root, "templates", "CLAUDE.md"));
1465
+ const projectScaffold = estimateTokens(renderFillScaffold().trim().length);
1466
+ const projectClaudeMd = harnessAnchor + projectScaffold;
1467
+ const claudeMdItems = (harnessAnchor > 0 ? 1 : 0) + (projectScaffold > 0 ? 1 : 0);
1506
1468
  return {
1507
1469
  rules,
1508
1470
  projectClaudeMd,
@@ -1546,8 +1508,10 @@ function formatResidentCostLine(r, unmeasuredCount) {
1546
1508
  var RESIDENT_ROWS = [
1547
1509
  { label: "rules", gap: 14, count: (r) => r.items.rules, tokens: (r) => r.rules },
1548
1510
  {
1549
- label: "CLAUDE.md \uC2A4\uCE90\uD3F4\uB4DC",
1550
- gap: 2,
1511
+ // 한 행에 두 파일(앵커 + 스캐폴드). 개수 열이 2 를 뱉어 그 사실을 드러낸다 — 라벨로
1512
+ // 하나만 이름 붙이면 v26.140.0 이전과 같은 거짓 라벨이 된다.
1513
+ label: "CLAUDE.md",
1514
+ gap: 11,
1551
1515
  count: (r) => r.items.claudeMd,
1552
1516
  tokens: (r) => r.projectClaudeMd
1553
1517
  },
@@ -1599,6 +1563,11 @@ export {
1599
1563
  assetCliSupport,
1600
1564
  assetReachesCli,
1601
1565
  filterApplicableAssets,
1566
+ HARNESS_ANCHOR_FILE,
1567
+ HARNESS_IMPORT_LINE,
1568
+ renderFillScaffold,
1569
+ upsertHarnessImport,
1570
+ stripHarnessImport,
1602
1571
  CATEGORIES,
1603
1572
  CATEGORY_TITLES,
1604
1573
  buildManifest,
@@ -1610,4 +1579,4 @@ export {
1610
1579
  formatResidentCostLine,
1611
1580
  formatResidentCostBlock
1612
1581
  };
1613
- //# sourceMappingURL=chunk-4XPSQ7XF.js.map
1582
+ //# sourceMappingURL=chunk-5RWSZT2J.js.map