@uzysjung/agent-harness 26.149.0 → 26.151.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 (65) hide show
  1. package/README.ko.md +1 -1
  2. package/README.md +1 -1
  3. package/dist/{chunk-YSW3OLH4.js → chunk-3QBHZUVB.js} +164 -66
  4. package/dist/chunk-3QBHZUVB.js.map +1 -0
  5. package/dist/index.js +397 -293
  6. package/dist/index.js.map +1 -1
  7. package/dist/trust-tier-drift.js +5 -1
  8. package/dist/trust-tier-drift.js.map +1 -1
  9. package/package.json +1 -1
  10. package/templates/CLAUDE.md +145 -164
  11. package/templates/agents/build-error-resolver.md +1 -1
  12. package/templates/agents/plan-checker.md +1 -1
  13. package/templates/agents/reviewer.md +4 -5
  14. package/templates/antigravity/AGENTS.md.template +3 -23
  15. package/templates/codex/AGENTS.md.template +5 -56
  16. package/templates/hooks/protect-files.sh +4 -0
  17. package/templates/hooks/session-start.sh +57 -3
  18. package/templates/opencode/AGENTS.md.template +4 -52
  19. package/templates/opencode/opencode.json.template +0 -8
  20. package/templates/rules/change-management.md +0 -1
  21. package/templates/rules/cli-development.md +1 -1
  22. package/templates/rules/doc-governance.md +2 -0
  23. package/templates/rules/git-policy.md +1 -1
  24. package/templates/rules/ship-checklist.md +3 -3
  25. package/templates/rules/test-policy.md +3 -8
  26. package/templates/settings.json +1 -16
  27. package/templates/skills/agent-introspection-debugging/SKILL.md +1 -1
  28. package/templates/skills/audit-harness-fit/README.md +113 -0
  29. package/templates/skills/audit-harness-fit/SKILL.md +64 -433
  30. package/templates/skills/audit-harness-fit/evals/scenarios.yaml +222 -0
  31. package/templates/skills/audit-harness-fit/references/apply.md +66 -0
  32. package/templates/skills/audit-harness-fit/references/audit.md +160 -0
  33. package/templates/skills/audit-harness-fit/references/populate.md +74 -0
  34. package/templates/skills/audit-harness-fit/references/verification.md +123 -0
  35. package/templates/skills/audit-service-gaps/SKILL.md +6 -7
  36. package/templates/skills/clear-korean-communication/SKILL.md +8 -13
  37. package/templates/skills/compaction-handoff/SKILL.md +29 -12
  38. package/templates/skills/external-model-consult/SKILL.md +13 -24
  39. package/templates/skills/model-orchestration/SKILL.md +18 -15
  40. package/templates/skills/natural-korean/SKILL.md +45 -0
  41. package/templates/skills/north-star/SKILL.md +4 -6
  42. package/templates/skills/north-star/references/roadmap-method.md +2 -2
  43. package/templates/skills/{task-brief → objective-brief}/SKILL.md +17 -18
  44. package/templates/skills/recurrence-prevention/SKILL.md +16 -16
  45. package/dist/chunk-YSW3OLH4.js.map +0 -1
  46. package/templates/agents/code-reviewer.md +0 -237
  47. package/templates/agents/security-reviewer.md +0 -108
  48. package/templates/hooks/task-brief-nudge.sh +0 -57
  49. package/templates/skills/audit-harness-fit/references/official-criteria.md +0 -367
  50. package/templates/skills/continuous-learning-v2/SKILL.md +0 -361
  51. package/templates/skills/continuous-learning-v2/agents/observer-loop.sh +0 -362
  52. package/templates/skills/continuous-learning-v2/agents/observer.md +0 -189
  53. package/templates/skills/continuous-learning-v2/agents/session-guardian.sh +0 -150
  54. package/templates/skills/continuous-learning-v2/agents/start-observer.sh +0 -252
  55. package/templates/skills/continuous-learning-v2/config.json +0 -8
  56. package/templates/skills/continuous-learning-v2/hooks/observe.sh +0 -585
  57. package/templates/skills/continuous-learning-v2/scripts/detect-project.sh +0 -322
  58. package/templates/skills/continuous-learning-v2/scripts/instinct-cli.py +0 -1956
  59. package/templates/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +0 -31
  60. package/templates/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +0 -68
  61. package/templates/skills/continuous-learning-v2/scripts/test_parse_instinct.py +0 -1420
  62. package/templates/skills/humanize-korean/SKILL.md +0 -228
  63. package/templates/skills/spec-scaling/SKILL.md +0 -89
  64. package/templates/skills/strategic-compact/SKILL.md +0 -145
  65. package/templates/skills/strategic-compact/suggest-compact.sh +0 -54
package/README.ko.md CHANGED
@@ -63,7 +63,7 @@ npx -y @uzysjung/agent-harness uninstall # 무엇을 뺄지 고른다
63
63
 
64
64
  ## 무엇을 얻는가
65
65
 
66
- - **스택 기반 큐레이션.** 검증된 옵션 중에서 이 프로젝트에 실제로 필요한 자산만 골라 설치한다. `csr-supabase` 를 고르면 세 묶음이 미리 체크된다 — 모든 track 이 받는 4종(`north-star`·`task-brief`·`gh-issue-workflow`·`audit-harness-fit`), 개발 track 이 받는 것들(`find-skills`·`agent-browser`·`frontend-design` + 방법론 스킬 6종), 그리고 이 스택이 필요로 하는 React·shadcn·Supabase·Postgres. 카탈로그의 나머지는 처음부터 끼어들지 않는다.
66
+ - **스택 기반 큐레이션.** 검증된 옵션 중에서 이 프로젝트에 실제로 필요한 자산만 골라 설치한다. `csr-supabase` 를 고르면 세 묶음이 미리 체크된다 — 모든 track 이 받는 4종(`north-star`·`objective-brief`·`gh-issue-workflow`·`audit-harness-fit`), 개발 track 이 받는 것들(`find-skills`·`agent-browser`·`frontend-design` + 방법론 스킬 6종), 그리고 이 스택이 필요로 하는 React·shadcn·Supabase·Postgres. 카탈로그의 나머지는 처음부터 끼어들지 않는다.
67
67
 
68
68
  - **규율 레이어.** 실제 프로덕션 프로젝트를 에이전트로 운영하며 추출한 룰·훅·방법론 스킬·CI 스캐폴드로 구성된다. 문서 거버넌스와 검증 게이트, 작업 브리프 정규화, 재발 방지 체계를 아우르며, 특히 스킬 14종은 마켓플레이스에 의존하지 않고 이 저장소에서 직접 쓰고 관리한다. 그중 12종은 id 로 지정할 수 있고(`--with`/`--without`), 그 12종 가운데 6종은 3단계 화면에서 한 줄로 묶여 함께 켜지고 꺼진다. 이 레이어 덕분에 단순한 skill 모음을 넘어선 하네스로 작동한다.
69
69
 
package/README.md CHANGED
@@ -59,7 +59,7 @@ This tool starts from the stack instead. You pick a track, and it pre-checks the
59
59
 
60
60
  ## What you get
61
61
 
62
- - **Curation by tech stack.** Of the vetted options, you install only what this project calls for. Pick `csr-supabase` and step 3 pre-checks three groups: the four that every track gets (`north-star`, `task-brief`, `gh-issue-workflow`, `audit-harness-fit`), the dev-track set (`find-skills`, `agent-browser`, `frontend-design`, and the six method skills), and the ones this stack calls for — React, shadcn, Supabase, Postgres. Not the rest of the catalog.
62
+ - **Curation by tech stack.** Of the vetted options, you install only what this project calls for. Pick `csr-supabase` and step 3 pre-checks three groups: the four that every track gets (`north-star`, `objective-brief`, `gh-issue-workflow`, `audit-harness-fit`), the dev-track set (`find-skills`, `agent-browser`, `frontend-design`, and the six method skills), and the ones this stack calls for — React, shadcn, Supabase, Postgres. Not the rest of the catalog.
63
63
 
64
64
  - **A discipline layer.** Rules, hooks, method skills, and CI scaffolds distilled from running real production projects with agents: doc governance, verification gates, normalized task briefs, recurrence prevention. Fourteen of those skills are written and maintained in this repo rather than pulled from a marketplace — twelve of them selectable by id with `--with` / `--without`, six of which collapse into one row at step 3 — so the harness ships the method, not just a pointer to one. This layer is what makes it a harness rather than a skill pack.
65
65
 
@@ -240,7 +240,7 @@ var EXTERNAL_ASSETS = [
240
240
  id: "model-orchestration",
241
241
  tier: "official",
242
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)",
243
+ description: "Model orchestration \u2014 decompose work by capability and route independent, bounded tasks to available agents while preserving ownership, permissions, and verification. Model names are Claude Code vocabulary; on other CLIs the same split maps onto that vendor's tiers (opt-in \u2014 recommended)",
244
244
  category: "workflow",
245
245
  source: "uzys",
246
246
  condition: { kind: "opt-in" },
@@ -261,27 +261,31 @@ var EXTERNAL_ASSETS = [
261
261
  {
262
262
  // 복원 9종이 아니라 신설이다 — 이관 이력이 없다.
263
263
  // 전 트랙인 이유: 위임과 요청 정규화는 개발 트랙의 행위가 아니라 **전 트랙의 행위**다.
264
- // executive 트랙도 서브에이전트에 일을 넘기고, 그때 브리프가 없으면 완료 판정 기준 없이
265
- // 넘긴다. 짝인 `task-brief-nudge.sh` 훅이 `ALWAYS_HOOKS`(전 설치본)라 스킬만 좁게 깔면
266
- // 넛지가 없는 스킬을 가리킨다 훅과 스킬의 도달 범위는 같아야 한다.
267
- id: "task-brief",
264
+ // executive 트랙도 서브에이전트에 일을 넘기고, 그때 브리프가 없으면 완료 판정 기준 없이 넘긴다.
265
+ // ADR-088 (#426 F-04) — 전신 `task-brief` 개명. 문턱이 **위임 · 설계 · 다단계(피처/프로젝트
266
+ // 규모 이상)** 좁혀졌고, 요청마다 브리프를 권하던 프롬프트 넛지 훅과 상시 스킬
267
+ // 안내(`CONTINUOUS_SKILLS`)가 함께 빠졌다. 이름이 그 문턱을 들고 있다.
268
+ id: "objective-brief",
268
269
  tier: "official",
269
270
  // 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
+ description: "Objective brief \u2014 normalize a delegation, a design task, or multi-step work at feature scale 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
272
  category: "workflow",
272
273
  source: "uzys",
273
274
  condition: { kind: "any-track", tracks: [...TRACKS] },
274
- method: { kind: "internal", key: "task-brief" }
275
+ method: { kind: "internal", key: "objective-brief" }
275
276
  },
276
277
  {
277
- // task-brief 와 같은 신설이다 — 이관 이력이 없다.
278
+ // objective-brief 와 같은 신설이다 — 이관 이력이 없다.
278
279
  // 전 트랙인 이유: 이 하네스는 **모든 트랙에** 앵커·룰·훅을 깐다. 그 상주층이 밥값을 하는지
279
280
  // 되묻는 루프만 개발 트랙에 두면, 상주 비용은 전원이 무는데 감사는 일부만 갖는 비대칭이
280
281
  // 된다. 감사 대상이 개발 산출물이 아니라 **설치본 자신**이라 트랙 술어와 무관하다.
282
+ // ADR-084 (#425) — 2판. 판정 근거가 공식 체크리스트 인용에서 **확정된 의도 + 리포 실증**으로
283
+ // 바뀌었고, 모드 4개(audit · verification · apply · populate)를 SKILL.md 가 references 로
284
+ // 라우팅한다. 비-Claude CLI 도 디렉터리째 받는 것이 전제다(#431).
281
285
  id: "audit-harness-fit",
282
286
  tier: "official",
283
287
  // uzys 자사 스킬
284
- description: "Audit harness fit \u2014 audit whether the resident steering layer (anchor \xB7 rules \xB7 hooks \xB7 permissions \xB7 skill descriptors) still earns its context, judged by published criteria, block logs, and measurement; relocate procedures to skills, guarantees to hooks/permissions, derivable facts to code",
288
+ description: "Audit harness fit \u2014 audit or clean up agent instructions and skills: remove needless questions and rechecks, reconcile conflicting or changed guidance, retire low-value rules and skills, move decision history out of resident text, right-size user-journey verification; also fill or refresh AGENTS.md / CLAUDE.md project context from repository evidence",
285
289
  category: "workflow",
286
290
  source: "uzys",
287
291
  condition: { kind: "any-track", tracks: [...TRACKS] },
@@ -307,15 +311,18 @@ var EXTERNAL_ASSETS = [
307
311
  // 트랙과 무관한 글쓰기 규율이라 어느 트랙에서도 고를 수 있고, 어느 트랙에도 자동으로는
308
312
  // 안 깔린다(opt-in). 한국어로 쓰지 않는 사용자에게 기본 설치되면 그대로 낭비다.
309
313
  // clear-korean-communication 과의 경계: 저쪽은 **무엇을 어떤 형식으로 말할지**(설명·승인
310
- // 요청의 구조)이고, 이쪽은 **이미 글의 문체**를 진단해 최소 수정한다.
311
- id: "humanize-korean",
314
+ // 요청의 구조)이고, 이쪽은 **한국어로 쓰는 행위 자체**(답변·글쓰기·번역·퇴고)의 표현이다.
315
+ // #428 — 전신 `humanize-korean`(#355, 진단-우선 퇴고)을 개명·교체했다. 범위가 퇴고에서
316
+ // 쓰기·번역까지로 넓어져 이름이 뜻과 어긋났다. 옛 id 로 깐 설치본은 `update` 가 손대지
317
+ // 않고(설치된 디렉터리만 갱신) 그대로 남는다 — 새 판은 `--with natural-korean` 으로 받는다.
318
+ id: "natural-korean",
312
319
  tier: "official",
313
320
  // uzys 자사 스킬
314
- description: "Humanize Korean \u2014 diagnose what actually reads as translationese, AI clich\xE9, or mechanical structure in Korean prose, then fix only what the diagnosis justifies, preserving facts, numbers, terminology and register (opt-in). References epoko77-ai/im-not-ai",
321
+ description: "Natural Korean \u2014 write, answer, translate, and revise in Korean that reads as Korean: keep meaning and register, cut translationese, needless English, stock phrases, and mechanical repetition; fix only what is actually awkward (opt-in)",
315
322
  category: "workflow",
316
323
  source: "uzys",
317
324
  condition: { kind: "opt-in" },
318
- method: { kind: "internal", key: "humanize-korean" }
325
+ method: { kind: "internal", key: "natural-korean" }
319
326
  },
320
327
  // === Option-gated (v26.42.0 — opt-in, BREAKING vs prior has-dev-track auto-install) ===
321
328
  {
@@ -351,8 +358,8 @@ var EXTERNAL_ASSETS = [
351
358
  }
352
359
  },
353
360
  // v26.110.0 (ADR-039, 오피셜 플러그인 큐레이션) — feature-dev: 탐색→설계→구현 워크플로우 +
354
- // 전용 에이전트 3종(code-architect/code-explorer/code-reviewer). 방법론류 — ADR-032
355
- // "워크플로우 강제 구조는 기본 불필요" + 자체 code-reviewer 기본 리뷰 에이전트와 중복
361
+ // 전용 에이전트 3종(탐색·설계·리뷰). 방법론류 — ADR-032 "워크플로우 강제 구조는 기본
362
+ // 불필요" + 리뷰 에이전트가 Claude Code 기본 `/code-review` 중복(ADR-089)
356
363
  // → superpowers 와 동급 opt-in.
357
364
  {
358
365
  id: "feature-dev",
@@ -554,8 +561,8 @@ var EXTERNAL_ASSETS = [
554
561
  },
555
562
  // === dev tools (has_dev_track) ===
556
563
  // v26.110.0 (ADR-039) — code-review: /code-review 커맨드 1개 (다중 에이전트 confidence
557
- // 스코어링 PR 리뷰). 기본 리뷰 스택(reviewer·code-reviewer·security-reviewer)과 표면 중복
558
- // + 최신 Claude Code 네이티브 /code-review 와 충돌 소지 → opt-in.
564
+ // 스코어링 PR 리뷰). 기본 리뷰 레인(`reviewer`)과 표면 중복 + Claude Code 네이티브
565
+ // /code-review 와 충돌 소지 → opt-in. (ADR-089 로 우리 리뷰 에이전트 2종은 은퇴했다.)
559
566
  {
560
567
  id: "code-review",
561
568
  tier: "official",
@@ -572,7 +579,7 @@ var EXTERNAL_ASSETS = [
572
579
  },
573
580
  // v26.110.0 (ADR-039) — security-guidance: 매 편집 패턴 경고 + LLM diff 리뷰 (훅 12파일,
574
581
  // Python + Agent SDK 의존). 상시 훅 = 매 편집 비용 + 폭발 반경 — 실측 전 기본설치 금지
575
- // (Context Cost NSM) → opt-in. security-reviewer 에이전트·agentshield ship 게이트와 보완.
582
+ // (Context Cost NSM) → opt-in. Claude Code `/security-review`·agentshield ship 게이트와 보완.
576
583
  {
577
584
  id: "security-guidance",
578
585
  tier: "official",
@@ -1026,12 +1033,31 @@ var INTERNAL_BUNDLED_SKILL_IDS = [
1026
1033
  ...DEV_METHOD_SKILL_IDS,
1027
1034
  "north-star",
1028
1035
  "gh-issue-workflow",
1029
- "task-brief",
1036
+ "objective-brief",
1030
1037
  "audit-harness-fit",
1031
1038
  "model-orchestration",
1032
1039
  "external-model-consult",
1033
1040
  "self-hosted-github-runner",
1034
- "humanize-korean"
1041
+ "natural-korean"
1042
+ ];
1043
+ var CONTINUOUS_SKILLS = [
1044
+ {
1045
+ id: "clear-korean-communication",
1046
+ whenToApply: "applies to every answer, report, and approval request \u2014 a decision is presented as AS-IS \u2192 TO-BE from the position of whoever lives with the result; not only at the moment approval is asked for"
1047
+ },
1048
+ {
1049
+ id: "model-orchestration",
1050
+ whenToApply: "when work is delegated, it decides which lane takes the work and how that lane is run"
1051
+ }
1052
+ ];
1053
+ var RENAMED_SKILL_IDS = {
1054
+ "task-brief": "objective-brief",
1055
+ "humanize-korean": "natural-korean"
1056
+ };
1057
+ var RETIRED_SKILL_IDS = [
1058
+ "strategic-compact",
1059
+ "continuous-learning-v2",
1060
+ "spec-scaling"
1035
1061
  ];
1036
1062
  var TRUST_TIER = Object.fromEntries(
1037
1063
  EXTERNAL_ASSETS.map((a) => [a.id, a.tier])
@@ -1415,9 +1441,34 @@ var HARNESS_ANCHOR_FILE = "CLAUDE-uzys-harness.md";
1415
1441
  var HARNESS_IMPORT_LINE = `@${HARNESS_ANCHOR_FILE}`;
1416
1442
  var IMPORT_MARKER_START = "<!-- uzys-harness:import:start -->";
1417
1443
  var IMPORT_MARKER_END = "<!-- uzys-harness:import:end -->";
1418
- var IMPORT_BLOCK = `${IMPORT_MARKER_START}
1419
- ${HARNESS_IMPORT_LINE}
1444
+ function renderContinuousSkillsNote(selectedInternalSkills) {
1445
+ const lines = CONTINUOUS_SKILLS.filter((s) => selectedInternalSkills.includes(s.id)).map(
1446
+ (s) => `- \`${s.id}\` \u2014 ${s.whenToApply}.`
1447
+ );
1448
+ if (lines.length === 0) return "";
1449
+ return [
1450
+ "## Skills that apply continuously",
1451
+ "",
1452
+ "These installed skills apply to every response or delegation; no prompt ever looks like their job, so open them from this list:",
1453
+ "",
1454
+ ...lines
1455
+ ].join("\n");
1456
+ }
1457
+ function withContinuousSkillsNote(scaffold, selectedInternalSkills) {
1458
+ const note = renderContinuousSkillsNote(selectedInternalSkills);
1459
+ return note ? `${scaffold}
1460
+
1461
+ ${note}` : scaffold;
1462
+ }
1463
+ function importBlock(continuousSkills) {
1464
+ const note = renderContinuousSkillsNote(continuousSkills);
1465
+ const body = note ? `${HARNESS_IMPORT_LINE}
1466
+
1467
+ ${note}` : HARNESS_IMPORT_LINE;
1468
+ return `${IMPORT_MARKER_START}
1469
+ ${body}
1420
1470
  ${IMPORT_MARKER_END}`;
1471
+ }
1421
1472
  var TRACK_DISPLAY_NAMES = {
1422
1473
  tooling: "Tooling",
1423
1474
  "csr-supabase": "CSR Supabase",
@@ -1511,18 +1562,27 @@ ${renderFillScaffold()}
1511
1562
  `;
1512
1563
  }
1513
1564
  function upsertHarnessImport(existing, opts) {
1565
+ const block = importBlock(opts.continuousSkills ?? []);
1514
1566
  if (existing === null) {
1515
1567
  return `${mergeProjectClaude(opts)}
1516
- ${IMPORT_BLOCK}
1568
+ ${block}
1517
1569
  `;
1518
1570
  }
1571
+ const start = existing.indexOf(IMPORT_MARKER_START);
1572
+ if (start !== -1) {
1573
+ const endAt = existing.indexOf(IMPORT_MARKER_END, start);
1574
+ if (endAt === -1) return existing;
1575
+ const current = existing.slice(start, endAt + IMPORT_MARKER_END.length);
1576
+ if (current === block) return existing;
1577
+ return `${existing.slice(0, start)}${block}${existing.slice(endAt + IMPORT_MARKER_END.length)}`;
1578
+ }
1519
1579
  if (hasHarnessImport(existing)) {
1520
1580
  return existing;
1521
1581
  }
1522
1582
  const body = existing.endsWith("\n") ? existing : `${existing}
1523
1583
  `;
1524
1584
  return `${body}
1525
- ${IMPORT_BLOCK}
1585
+ ${block}
1526
1586
  `;
1527
1587
  }
1528
1588
  function stripHarnessImport(text) {
@@ -1554,6 +1614,17 @@ function expandTracks(tracks) {
1554
1614
  }
1555
1615
 
1556
1616
  // src/manifest.ts
1617
+ function buildAssetSpec(ctx) {
1618
+ return {
1619
+ tracks: ctx.tracks,
1620
+ withTauri: isAssetSelected("tauri-desktop", ctx),
1621
+ // v26.55.0 — withEcc gating (ADR-016). withPrune 은 ecc-plugin 사용을 전제한다.
1622
+ withEcc: isAssetSelected("ecc-plugin", ctx) || ctx.options.withPrune === true,
1623
+ // v26.87.0 — internal bundled skills (dev-method + opt-in advisors, v26.95.0). id 별 condition
1624
+ // (has-dev-track vs opt-in)은 isAssetSelected 가 적용한다.
1625
+ selectedInternalSkills: INTERNAL_BUNDLED_SKILL_IDS.filter((id) => isAssetSelected(id, ctx))
1626
+ };
1627
+ }
1557
1628
  var all = () => true;
1558
1629
  var dev = (s) => hasDevTrack(s.tracks);
1559
1630
  var ui = (s) => hasUiTrack(s.tracks);
@@ -1596,19 +1667,12 @@ function resolveRules(spec) {
1596
1667
  }
1597
1668
  var ALL_RULES = resolveRules({ tracks: [...TRACKS] });
1598
1669
  var CORE_AGENTS = ["reviewer", "data-analyst", "strategist"];
1599
- var CORE_AGENTS_ECC = ["code-reviewer", "security-reviewer"];
1600
1670
  var DEV_AGENTS = ["plan-checker", "implementer"];
1601
1671
  var DEV_AGENTS_ECC = ["silent-failure-hunter", "build-error-resolver"];
1602
- var ALWAYS_HOOKS = [
1603
- "session-start.sh",
1604
- "protect-files.sh",
1605
- // UserPromptSubmit 넛지. 차단하지 않는 유일한 훅 — 판정은 결정적 두 조건뿐이고(길이 ·
1606
- // `<objective>` 표식 부재) 변환 자체는 `task-brief` 스킬 몫이다. `templates/settings.json`
1607
- // 배선과 한 벌 (hook-wiring-parity 가 한쪽만 있는 상태를 문다).
1608
- "task-brief-nudge.sh"
1609
- ];
1672
+ var RETIRED_AGENT_IDS = ["code-reviewer", "security-reviewer"];
1673
+ var ALWAYS_HOOKS = ["session-start.sh", "protect-files.sh"];
1610
1674
  var COMMON_SKILL_DIRS = [];
1611
- var COMMON_SKILL_DIRS_ECC = ["strategic-compact", "continuous-learning-v2"];
1675
+ var COMMON_SKILL_DIRS_ECC = [];
1612
1676
  var MODIFIED_COMMON_SKILL_DIRS = ["deep-research"];
1613
1677
  var DEV_SKILL_DIRS = [];
1614
1678
  var DEV_SKILL_DIRS_ECC = ["agent-introspection-debugging"];
@@ -1670,14 +1734,6 @@ function buildManifest(spec) {
1670
1734
  applies: dev
1671
1735
  });
1672
1736
  }
1673
- for (const a of CORE_AGENTS_ECC) {
1674
- m.push({
1675
- source: `agents/${a}.md`,
1676
- target: `.claude/agents/${a}.md`,
1677
- type: "file",
1678
- applies: (s) => !s.withEcc
1679
- });
1680
- }
1681
1737
  for (const a of DEV_AGENTS_ECC) {
1682
1738
  m.push({
1683
1739
  source: `agents/${a}.md`,
@@ -1710,12 +1766,6 @@ function buildManifest(spec) {
1710
1766
  applies: all
1711
1767
  });
1712
1768
  }
1713
- m.push({
1714
- source: "skills/spec-scaling/SKILL.md",
1715
- target: ".claude/skills/spec-scaling/SKILL.md",
1716
- type: "file",
1717
- applies: all
1718
- });
1719
1769
  for (const sd of ["market-research", "investor-materials", "investor-outreach"]) {
1720
1770
  m.push({
1721
1771
  source: `skills/${sd}`,
@@ -1873,6 +1923,21 @@ function assetCostRows(assetIds, root = resolveBundleRoot()) {
1873
1923
  bodyTokens: assetBodyTokens(id, root)
1874
1924
  })).sort((a, b) => (b.bodyTokens ?? -1) - (a.bodyTokens ?? -1));
1875
1925
  }
1926
+ function makeResidentCost(base) {
1927
+ return {
1928
+ ...base,
1929
+ perSkillDescriptor: base.perSkillDescriptor ?? {},
1930
+ total: base.rules + base.projectClaudeMd + base.skillDescriptors + base.agentDescriptors,
1931
+ directive: {
1932
+ items: base.items.rules + base.items.claudeMd,
1933
+ tokens: base.rules + base.projectClaudeMd
1934
+ },
1935
+ firing: {
1936
+ items: base.items.skills + base.items.agents,
1937
+ tokens: base.skillDescriptors + base.agentDescriptors
1938
+ }
1939
+ };
1940
+ }
1876
1941
  function fileTokens(path2) {
1877
1942
  return existsSync3(path2) ? estimateTokens(readFileSync3(path2, "utf8").trim().length) : 0;
1878
1943
  }
@@ -1883,6 +1948,7 @@ function descriptorTokens(path2) {
1883
1948
  }
1884
1949
  function residentCost(entries, root = resolveBundleRoot()) {
1885
1950
  const tpl = (source) => join3(root, "templates", source);
1951
+ const perSkill = {};
1886
1952
  let rules = 0;
1887
1953
  let skillDescriptors = 0;
1888
1954
  let agentDescriptors = 0;
@@ -1897,20 +1963,28 @@ function residentCost(entries, root = resolveBundleRoot()) {
1897
1963
  agentDescriptors += descriptorTokens(tpl(e.source));
1898
1964
  agentItems += 1;
1899
1965
  } else if (e.target.startsWith(".claude/skills/")) {
1900
- skillDescriptors += descriptorTokens(join3(tpl(e.source), "SKILL.md"));
1966
+ const t = descriptorTokens(join3(tpl(e.source), "SKILL.md"));
1967
+ skillDescriptors += t;
1901
1968
  skillItems += 1;
1969
+ const id = /\.claude\/skills\/([^/]+)/.exec(e.target)?.[1];
1970
+ if (id !== void 0) perSkill[id] = (perSkill[id] ?? 0) + t;
1902
1971
  }
1903
1972
  }
1904
1973
  const harnessAnchor = fileTokens(join3(root, "templates", "CLAUDE.md"));
1905
- const projectScaffold = estimateTokens(renderFillScaffold().trim().length);
1974
+ const projectScaffold = estimateTokens(
1975
+ withContinuousSkillsNote(
1976
+ renderFillScaffold(),
1977
+ CONTINUOUS_SKILLS.map((s) => s.id)
1978
+ ).trim().length
1979
+ );
1906
1980
  const projectClaudeMd = harnessAnchor + projectScaffold;
1907
1981
  const claudeMdItems = (harnessAnchor > 0 ? 1 : 0) + (projectScaffold > 0 ? 1 : 0);
1908
- return {
1982
+ return makeResidentCost({
1909
1983
  rules,
1910
1984
  projectClaudeMd,
1911
1985
  skillDescriptors,
1912
1986
  agentDescriptors,
1913
- total: rules + projectClaudeMd + skillDescriptors + agentDescriptors,
1987
+ perSkillDescriptor: perSkill,
1914
1988
  items: {
1915
1989
  rules: ruleItems,
1916
1990
  skills: skillItems,
@@ -1918,7 +1992,7 @@ function residentCost(entries, root = resolveBundleRoot()) {
1918
1992
  claudeMd: claudeMdItems,
1919
1993
  total: ruleItems + skillItems + agentItems + claudeMdItems
1920
1994
  }
1921
- };
1995
+ });
1922
1996
  }
1923
1997
  function summarizeContextCost(assetIds, root = resolveBundleRoot()) {
1924
1998
  let measuredTokens = 0;
@@ -1937,33 +2011,47 @@ function summarizeContextCost(assetIds, root = resolveBundleRoot()) {
1937
2011
  function formatResidentCostLine(r, unmeasuredCount) {
1938
2012
  if (r.total === 0) return null;
1939
2013
  const parts = [
1940
- `rules ${r.items.rules} ~${r.rules}`,
1941
- `CLAUDE.md ${r.items.claudeMd} ~${r.projectClaudeMd}`,
1942
- `skills ${r.items.skills} ~${r.skillDescriptors}`,
1943
- `agents ${r.items.agents} ~${r.agentDescriptors}`
2014
+ `directives ${r.directive.items} ~${r.directive.tokens}`,
2015
+ `[rules ${r.items.rules} ~${r.rules} \xB7 CLAUDE.md ${r.items.claudeMd} ~${r.projectClaudeMd}]`,
2016
+ `triggers ${r.firing.items} ~${r.firing.tokens}`,
2017
+ `[skills ${r.items.skills} ~${r.skillDescriptors} \xB7 agents ${r.items.agents} ~${r.agentDescriptors}]`
1944
2018
  ].join(" \xB7 ");
1945
2019
  const external = unmeasuredCount > 0 ? ` \xB7 ${unmeasuredCount} external asset${unmeasuredCount === 1 ? "" : "s"} unmeasured` : "";
1946
2020
  return `session-start context cost: ${r.items.total} items resident \xB7 ~${r.total} tokens/session (${parts}${external})`;
1947
2021
  }
1948
2022
  var RESIDENT_ROWS = [
1949
- { label: "rules", gap: 14, count: (r) => r.items.rules, tokens: (r) => r.rules },
2023
+ {
2024
+ // ADR-083 — 축 소계를 **행으로** 낸다. 소계가 없으면 읽는 사람이 네 줄을 머리로 더해야
2025
+ // 하고, 그러면 "무엇을 줄여야 하나"가 표에서 안 보인다.
2026
+ label: "\uC9C0\uC2DC\uBB38",
2027
+ gap: 13,
2028
+ count: (r) => r.directive.items,
2029
+ tokens: (r) => r.directive.tokens
2030
+ },
2031
+ { label: " rules", gap: 12, count: (r) => r.items.rules, tokens: (r) => r.rules },
1950
2032
  {
1951
2033
  // 한 행에 두 파일(앵커 + 스캐폴드). 개수 열이 2 를 뱉어 그 사실을 드러낸다 — 라벨로
1952
2034
  // 하나만 이름 붙이면 v26.140.0 이전과 같은 거짓 라벨이 된다.
1953
- label: "CLAUDE.md",
1954
- gap: 11,
2035
+ label: " CLAUDE.md",
2036
+ gap: 8,
1955
2037
  count: (r) => r.items.claudeMd,
1956
2038
  tokens: (r) => r.projectClaudeMd
1957
2039
  },
1958
2040
  {
1959
- label: "skill descriptors",
1960
- gap: 2,
2041
+ label: "\uBC1C\uD654 \uD45C\uBA74",
2042
+ gap: 10,
2043
+ count: (r) => r.firing.items,
2044
+ tokens: (r) => r.firing.tokens
2045
+ },
2046
+ {
2047
+ label: " skill descriptors",
2048
+ gap: 0,
1961
2049
  count: (r) => r.items.skills,
1962
2050
  tokens: (r) => r.skillDescriptors
1963
2051
  },
1964
2052
  {
1965
- label: "agent descriptors",
1966
- gap: 2,
2053
+ label: " agent descriptors",
2054
+ gap: 0,
1967
2055
  count: (r) => r.items.agents,
1968
2056
  tokens: (r) => r.agentDescriptors
1969
2057
  }
@@ -1976,7 +2064,11 @@ function formatResidentCostBlock(r) {
1976
2064
  (row) => ` ${row.label}${" ".repeat(row.gap)}${n(row.count(r))}\uAC1C ~${row.tokens(r)}`
1977
2065
  ),
1978
2066
  " \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
1979
- ` \uC0C1\uC8FC \uD569\uACC4 ${n(r.items.total)}\uAC1C \uC0C1\uC8FC \xB7 ~${r.total} tokens/\uC138\uC158`
2067
+ ` \uC0C1\uC8FC \uD569\uACC4 ${n(r.items.total)}\uAC1C \uC0C1\uC8FC \xB7 ~${r.total} tokens/\uC138\uC158`,
2068
+ "",
2069
+ " \uC9C0\uC2DC\uBB38 = \uC6B0\uB9AC\uAC00 \uD56D\uC0C1 \uC77D\uD788\uAC8C \uB123\uC740 \uAC83. **\uC791\uC744\uC218\uB85D \uC88B\uC740 \uAC12\uC774 \uC544\uB2C8\uB2E4** \u2014 \uD310\uB2E8\uC740",
2070
+ " '\uBD88\uD544\uC694\uD55C \uC9C0\uC2DC\uBB38\uC774 \uC788\uB098'\uB85C \uD55C\uB2E4. ratchet \uC740 \uC870\uC6A9\uD55C \uC99D\uAC00\uB9CC \uB9C9\uB294\uB2E4.",
2071
+ " \uBC1C\uD654 \uD45C\uBA74 = \uC2A4\uD0AC\xB7\uC5D0\uC774\uC804\uD2B8\uAC00 \uBD88\uB9AC\uB824\uACE0 \uC0C1\uC8FC\uC2DC\uD0A4\uB294 descriptor. \uAE4E\uC73C\uBA74 \uC548 \uBD88\uB9B0\uB2E4."
1980
2072
  ];
1981
2073
  }
1982
2074
 
@@ -1996,6 +2088,9 @@ export {
1996
2088
  EXTERNAL_ASSETS,
1997
2089
  DEV_METHOD_SKILL_IDS,
1998
2090
  INTERNAL_BUNDLED_SKILL_IDS,
2091
+ CONTINUOUS_SKILLS,
2092
+ RENAMED_SKILL_IDS,
2093
+ RETIRED_SKILL_IDS,
1999
2094
  TRUST_TIER,
2000
2095
  assetTrustTier,
2001
2096
  isAssetSelected,
@@ -2026,11 +2121,14 @@ export {
2026
2121
  legacyInstallLogPath,
2027
2122
  HARNESS_ANCHOR_FILE,
2028
2123
  HARNESS_IMPORT_LINE,
2124
+ withContinuousSkillsNote,
2029
2125
  renderFillScaffold,
2030
2126
  upsertHarnessImport,
2031
2127
  stripHarnessImport,
2128
+ buildAssetSpec,
2032
2129
  resolveRules,
2033
2130
  ALL_RULES,
2131
+ RETIRED_AGENT_IDS,
2034
2132
  isCliNeutralTarget,
2035
2133
  buildManifest,
2036
2134
  CATEGORIES,
@@ -2043,4 +2141,4 @@ export {
2043
2141
  formatResidentCostLine,
2044
2142
  formatResidentCostBlock
2045
2143
  };
2046
- //# sourceMappingURL=chunk-YSW3OLH4.js.map
2144
+ //# sourceMappingURL=chunk-3QBHZUVB.js.map