oh-my-customcode 1.1.79 → 1.1.81

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.
package/dist/cli/index.js CHANGED
@@ -217,7 +217,7 @@ var init_package = __esm(() => {
217
217
  workspaces: [
218
218
  "packages/*"
219
219
  ],
220
- version: "1.1.79",
220
+ version: "1.1.81",
221
221
  description: "Batteries-included agent harness for Claude Code",
222
222
  type: "module",
223
223
  bin: {
package/dist/index.js CHANGED
@@ -2326,7 +2326,7 @@ var package_default = {
2326
2326
  workspaces: [
2327
2327
  "packages/*"
2328
2328
  ],
2329
- version: "1.1.79",
2329
+ version: "1.1.81",
2330
2330
  description: "Batteries-included agent harness for Claude Code",
2331
2331
  type: "module",
2332
2332
  bin: {
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "workspaces": [
4
4
  "packages/*"
5
5
  ],
6
- "version": "1.1.79",
6
+ "version": "1.1.81",
7
7
  "description": "Batteries-included agent harness for Claude Code",
8
8
  "type": "module",
9
9
  "bin": {
@@ -118,6 +118,8 @@ Fable 5는 high effort가 기본값이며, `xhigh`는 capability-sensitive 작
118
118
 
119
119
  <!-- DETAIL: effort frontmatter CC version notes (historical)
120
120
  > **v2.1.267+**: `effort:` 프론트매터 관련 결함·신규 상한 3건 — (a) 커스텀 커맨드·스킬·서브에이전트의 `effort:` 프론트매터가, 기본 effort가 여전히 고정된 모델(Opus 4.7, Opus 4.8, Fable 5)에서 **무시**되던 결함이 수정되었습니다. 즉 267 이전에는 이 파일의 "스킬 `effort`가 에이전트 `effort`보다 우선한다"는 서술과 위 「Fable 5 Effort 전략」의 `effort` 명시 지침이 Fable 5 / Opus 4.8 에이전트에서 **런타임 효과가 없었습니다** — 프론트매터 effort는 실제 실행된 effort의 증거가 아니었습니다. (b) 신규 `maxEffortLevel` 설정(최상위 또는 `modelSettings` 하위 모델별)이 모든 provider에서 effort 레벨 상한을 강제합니다 — 사용자는 여전히 더 낮은 레벨을 선택할 수 있습니다. 이는 프론트매터 `effort`보다 **상위에 위치하는 설정 레벨 상한**이므로, `xhigh`를 선언한 에이전트도 상한이 설정돼 있으면 그 상한에서 실행됩니다(프론트매터로 유추하지 말고 실효 effort를 확인). (c) `/model opusplan[1m]`이 "Model not found"로 거부되던 결함이 265에서 수정되어, `/model` 명령에서 이 표기가 이제 수용됩니다 — 프론트매터 `model: opusplan[1m]` 경로는 릴리즈 노트가 언급하지 않으므로 미실측입니다.
121
+ >
122
+ > **후속 (v2.1.280+)**: CHANGELOG 원문 — "Changed Opus 4.7, Opus 4.8 and Fable 5 to stop holding their launch-default effort over `/effort` in `-p` or the Agent SDK, a project, managed or `--settings` `effortLevel`, or a per-model level." 이는 위 (a) 프론트매터 결함(267에서 이미 수정됨)과는 별개로, `-p`/Agent SDK의 `/effort`·프로젝트/managed/`--settings`의 `effortLevel`·모델별 레벨이 launch-default effort에 눌리던 문제를 해소한 후속 조치입니다 — 프론트매터·스킬/에이전트 effort 우선순위에 대한 영향은 릴리즈 노트가 언급하지 않아 미실측이며, 위 (b) `maxEffortLevel` 상한 원칙은 이 후속 조치와 무관하게 그대로 유효합니다.
121
123
  -->
122
124
 
123
125
  <!-- DETAIL: Mythos 5 (non-GA, not registered — reference only)
@@ -60,6 +60,14 @@ Research-only analysis produces findings based on assumptions about the codebase
60
60
  | Ecomode | Auto-activate for team result aggregation (R013) |
61
61
  | REVISE limit | Max 2 cycles before user escalation |
62
62
 
63
+ ## Lightweight Mode (conditional)
64
+
65
+ Deep Plan MAY substitute a lightweight pass for the full 3-phase pipeline when the conditions defined in `auto-dev.yaml`'s `## Cross-tier — Lightweight Skill-Mode Substitution` section are met — this skill does not restate those conditions; read them from that section before invoking lightweight mode. The resulting plan artifact or output MUST state which mode ran (`mode: full` or `mode: lightweight`) and MUST include the justification log required by that section.
66
+
67
+ ## Positive-Control Gate (Search/Retrieval Experiment Plans)
68
+
69
+ When a plan's Phase 1/2 measures a search or retrieval experiment (a new lane, ranking knob, or similar), do NOT trust a negative or neutral result until a positive control confirms the measurement can detect an effect — verify that the change moves candidates for at least one real query from the actual query distribution. If it does not, report the result as "measurement inconclusive", not "no effect".
70
+
63
71
  ## Differentiation
64
72
 
65
73
  | Skill | Scope | Code Verification | Phases |
@@ -178,6 +178,17 @@ steps:
178
178
  For each scoped issue, extract target file/directory paths from its title+body (explicit
179
179
  paths, backtick-quoted paths, or clearly named targets).
180
180
 
181
+ Measure each extracted path with `git ls-files` NOW, before scope is committed — do not
182
+ defer this to implement time — but ONLY for a target the issue treats as an EXISTING
183
+ file (edit/refactor of a path the issue claims already exists). If such a path is absent
184
+ from this repo (e.g. it belongs to a different repository), route that issue to
185
+ decision-needed or exclude it from this scope immediately (scope-selection 단계에서
186
+ 이슈가 가리키는 경로의 `git ls-files` 실측을 선행, #1725 찐빠 #4). For a target the issue
187
+ is CREATING (a new file), this absence check does not apply — a new file is by
188
+ definition untracked (R010 「Required Checks」: 신규 생성 대상은 path-existence 확인에서
189
+ 제외); instead confirm the parent directory exists, and do NOT exclude the issue solely
190
+ because the new file path itself is absent.
191
+
181
192
  Check against `.claude/rules/MUST-orchestrator-coordination.md` "Protected Paths":
182
193
  - `.claude/hooks/**` → EXCLUDED from mgr-creator routing; requires EXPLICIT USER APPROVAL
183
194
  (security-critical). If any scoped issue targets this path, request approval for the
@@ -271,7 +282,10 @@ steps:
271
282
  ## Tier 3 — standard (fallback)
272
283
 
273
284
  If neither docs-only nor lite met → set compression_mode=standard
274
- - All pipeline steps execute normally with full skill spawns
285
+ - All pipeline steps execute normally with full skill spawns — EXCEPT the two
286
+ Cross-tier exceptions below ("Pre-Existing Converged Artifact Substitution" and
287
+ "Lightweight Skill-Mode Substitution"), which stay available under standard mode too
288
+ when their own conditions are met ("Independent of the tier selected above").
275
289
  - Log: "[compression-mode] standard mode (scope={n}, mixed/high-risk labels, large scope, or code logic change)"
276
290
 
277
291
  ## Cross-tier — State-Change Side Effects Are NEVER Compressed
@@ -330,6 +344,36 @@ steps:
330
344
 
331
345
  This authorizes, under an audit log, a substitution that would otherwise be a standard-mode contract deviation. Origin: #1309 (a converged `/research` artifact was used in place of triage/plan/deep-plan under standard mode without an authorizing rule).
332
346
 
347
+ ## Cross-tier — Lightweight Skill-Mode Substitution
348
+
349
+ Independent of the tier selected above, the triage / plan / deep-plan skill spawns MAY be
350
+ replaced by orchestrator-integrated analysis — a lightweight mode — even in standard mode,
351
+ ONLY when ALL of the following hold. deep-verify is NOT eligible for this lightweight-mode
352
+ substitution (see NEVER list below) — it remains eligible only for the separate
353
+ pre-existing-converged-artifact substitution described above (a full prior skill spawn's
354
+ output reused, not orchestrator-integrated shortcutting).
355
+ 1. Scope size ≤ 3 issues (이슈에 코드 근거가 있고 범위가 이슈 3건 이하이면 경량 모드,
356
+ #1721 제안 4 — 사용자 결정: 상한 3건).
357
+ 2. For EVERY scoped issue in this substitution, EITHER the issue body cites concrete code
358
+ evidence (a file path AND an anchor — function name / unique string, not just a claim),
359
+ OR the orchestrator has recorded the measured root cause together with the exact
360
+ command used to measure it (scope=1 + 오케스트레이터 실측 원인 확정 조건의 감사 로그
361
+ 대체 조항, #1727 찐빠 #1).
362
+ 3. A MANDATORY justification log line is emitted naming the step and the evidence basis:
363
+ "[compression-mode] lightweight skill-mode substitution — step '{step}', scope={n},
364
+ evidence={file:anchor or measured-cause+command}".
365
+ 4. The resulting artifact explicitly states its own mode (`mode: full` or
366
+ `mode: lightweight`) so downstream steps and reviewers can tell it apart from a full
367
+ skill spawn (결과물에 모드를 표시, #1721 제안 4).
368
+
369
+ This substitution is NEVER available for implement, verify-build, release, ci-check, or
370
+ deep-verify.
371
+ It replaces analysis output ONLY — every step's state-change side effect still runs in
372
+ full regardless of substitution (see "Cross-tier — State-Change Side Effects Are NEVER
373
+ Compressed" above).
374
+
375
+ If any condition above cannot be concretely asserted, do NOT substitute — spawn the skill.
376
+
333
377
  ## Output
334
378
 
335
379
  compression_mode ∈ {docs-only, lite, standard} as pipeline state for downstream steps.
@@ -338,17 +382,17 @@ steps:
338
382
 
339
383
  - name: triage
340
384
  skill: professor-triage
341
- description: "Cross-analysis triage with priority assessment (scoped to release manifest) — skipped if docs-only, integrated-analysis allowed if lite"
385
+ description: "Cross-analysis triage with priority assessment (scoped to release manifest) — skipped if docs-only, integrated-analysis allowed if lite; independent of tier, MAY run in lightweight mode when compression-mode-eval's 'Cross-tier — Lightweight Skill-Mode Substitution' conditions are met"
342
386
  depends_on: compression-mode-eval
343
387
 
344
388
  - name: plan
345
389
  skill: release-plan
346
- description: "Release unit plan from triaged issues — skipped if docs-only, integrated-analysis allowed if lite"
390
+ description: "Release unit plan from triaged issues — skipped if docs-only, integrated-analysis allowed if lite; independent of tier, MAY run in lightweight mode when compression-mode-eval's 'Cross-tier — Lightweight Skill-Mode Substitution' conditions are met"
347
391
  depends_on: triage
348
392
 
349
393
  - name: deep-plan
350
394
  skill: deep-plan
351
- description: "Research-validated implementation plan (research → plan → verify) — skipped if docs-only, integrated-analysis allowed if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). 리서치·계측 위임의 완료 조건에는 결론 수치를 산출물 표에서 jq/awk로 재계산해 병기하도록 명시한다(#1707 #4)."
395
+ description: "Research-validated implementation plan (research → plan → verify) — skipped if docs-only, integrated-analysis allowed if lite; independent of tier, MAY run in lightweight mode when compression-mode-eval's 'Cross-tier — Lightweight Skill-Mode Substitution' conditions are met. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). 리서치·계측 위임의 완료 조건에는 결론 수치를 산출물 표에서 jq/awk로 재계산해 병기하도록 명시한다(#1707 #4)."
352
396
  depends_on: plan
353
397
 
354
398
  - name: implement
@@ -363,6 +407,12 @@ steps:
363
407
  - Use specialized agents (lang-*, be-*, fe-*, infra-*) over general-purpose
364
408
  4. TDD via superpowers:test-driven-development when tests apply
365
409
  5. Commit via mgr-gitnerd with `Refs #<N>` trailer in body — NEVER `Fixes`/`Closes`/`Resolves` (#1542).
410
+ Commit trailers MUST use ONLY the exact trailer text the orchestrator supplies in the
411
+ delegation prompt — the agent MUST NOT add or rewrite any other trailer (observed in
412
+ another project's session: a subagent added an unapproved model-attribution trailer to 4
413
+ local commits, citing the repo's own past-commit convention as justification; the trailer
414
+ did not remain on the target branch because the squash-merge specified the PR body
415
+ separately) (#1728 찐빠 #6).
366
416
  ⚠ implement-stage commits land directly on develop (no PR gate here). A close-keyword trailer on a
367
417
  develop-bound commit auto-closes the issue on push — BEFORE release/tag/publish (observed v1.1.38,
368
418
  07:49:26Z). Close keywords belong ONLY in the release-stage PR body (see release step 3.b) — auto-tag.yml
@@ -375,6 +425,15 @@ steps:
375
425
  bypasses the quality gate and is on the standing deny list (R010).
376
426
  Note: git worktrees run typecheck only (`.husky/pre-commit` lines 7-12 branch on
377
427
  `[ -f .git ]` and exit 0), so the long budget matters most on the MAIN worktree.
428
+ OPTION: the implement-stage commit MAY be deferred until AFTER deep-verify
429
+ corrections have landed, combining the implement changes and the deep-verify
430
+ corrections into ONE commit (정정 커밋 추가 비용 절감, #1727 찐빠 #4) — allowed
431
+ ONLY before any push to develop, and MUST be announced to the user. The deferred
432
+ commit still carries the `Refs #<N>` trailer and the 400000ms timeout above. Risk:
433
+ verify-build and deep-verify then run against an uncommitted working tree until the
434
+ combined commit lands. DEADLINE: the combined commit MUST land — with the
435
+ `.husky/pre-commit` gate passing — before the release step begins; release step
436
+ 1.a requires a clean working tree, so a deferred commit cannot cross into release.
378
437
  6. On success: remove in-progress, add verify-ready
379
438
  7. On failure: remove in-progress, add needs-review, comment error summary
380
439
 
@@ -394,10 +453,44 @@ steps:
394
453
  delegation prompt's sentences and rewrite any match (cause: the R016 「신설 조항의 동일
395
454
  반복 self-check」 was known as text but not executed as a procedure, #1707 #1).
396
455
  - Every rule/skill/guide TEXT-editing delegation prompt MUST include this fixed constraint
397
- block: (a) Korean 합쇼체 for new sentences, do not imitate adjacent 반말; (b) locate by anchor
456
+ block: (a) Korean 합쇼체 for new sentences, do not imitate adjacent 반말 — completion
457
+ criteria MUST include THREE deterministic checks, scoped to edited text files (md/yaml)
458
+ and restricted to added lines only (`git diff -U0 -- <edited md/yaml files> | grep
459
+ '^+'`): family check `grep -cE '(한다|된다|않는다|따른다|했다|있다|없다|넣는다|이다)[.。 "]'`
460
+ = 0, line-final auxiliary check `grep -E '다[.。"]?$' | grep -vc '니다[.。"]?$'` = 0
461
+ (the family list alone misses endings such as 따른다/했다/있다 and unpunctuated
462
+ line-final endings; the line-final check excludes 합쇼체 `-니다` endings so it does not
463
+ flag correct sentences — verified against 6 반말/평서형 positive samples and 6 합쇼체
464
+ negative samples, 12/12 correct) (#1711 찐빠 #3), AND line-final noun-ending check
465
+ `grep -E '(함|됨|필요)[.。"]?$'` = 0 (반말/명사 종결 endings such as 확인함·정정
466
+ 필요·완료됨 fall entirely outside the 다-ending regexes above and were previously
467
+ undetectable — verified against 4 명사 종결 positive samples and 4 합쇼체 negative
468
+ samples, 8/8 correct) (#1728 찐빠 #2 residual). Even with all three checks, a residual
469
+ gap remains for 반말/명사 종결 variants the patterns above do not enumerate — the agent
470
+ MUST also read the newly added lines directly as a final check, not rely on regex alone.
471
+ When an edit re-emits a pre-existing
472
+ line unchanged in meaning (e.g. reformatting), judge only the newly added span, not the
473
+ whole re-emitted line; (b) locate by anchor
398
474
  strings, never line numbers; (c) copy quotations from `gh issue view --json body` output and
399
475
  verify with `grep -F`; (d) ±1 heading check including re-binding of relative references (위
400
- 표/아래 표/직전 조항); (e) copy to `templates/` mirror and confirm `md5 -q` equality (#1707 #3).
476
+ 표/아래 표/직전 조항); (e) copy to `templates/` mirror and confirm `md5 -q` equality (#1707 #3);
477
+ (f) when paraphrasing a quoted source, preserve its result word, subject, and causal
478
+ direction (결과어·주체·인과 방향 보존) — this is checked SEPARATELY from the `grep -F`
479
+ lexical match, by placing the paraphrase and the original sentence side by side in the
480
+ completion report (#1711 찐빠 #1); (g) version/count example values written
481
+ into rule/skill text use placeholders, never real literals (룰 예시 값은 플레이스홀더,
482
+ 실값 리터럴 금지) — the rule corpus is itself a grep target, and a real literal can
483
+ contaminate the very command a clause cites (#1711 찐빠 #2); (h) any temporary file the
484
+ delegation creates MUST live under a per-agent-unique path (`$TMPDIR` or the session
485
+ scratchpad), never a fixed shared path (#1722 찐빠 #7).
486
+ - Every delegation prompt (not only rule/skill/guide TEXT edits) MUST instruct the agent
487
+ that if a guard, classifier, or permission check blocks an action, it MUST NOT route
488
+ around it (e.g. via a shell glob or path rewrite) — it MUST stop and report the block
489
+ verbatim (R010 「품질 게이트 우회 금지 — 훅 차단은 보고 대상」, extended here from git
490
+ hooks to guards/classifiers/permissions generally) (#1728 찐빠 #1).
491
+ - After any delegation that creates temporary files under constraint (h) above, the
492
+ orchestrator MUST confirm with `git status --short` that no stray file was left in the
493
+ repo (#1721 찐빠 #7).
401
494
  - Document mirror/parity delegations (README/ARCHITECTURE/CLAUDE.md ko-en, templates
402
495
  mirrors, etc.) MUST be split to ≤3 files per delegation (a companion cap alongside the
403
496
  arithmetic below, not a replacement for it); compute turn arithmetic (files × 3 +
@@ -420,17 +513,52 @@ steps:
420
513
  `.gitignore` rule) — MUST be excluded from delegation scope, or its tracked status
421
514
  decided first, before dispatch (R010 「Agent Capability Pre-Check」 git-tracked row)
422
515
  (#1709 #4).
423
- - When forwarding a number an agent reported (row/line/file counts, etc.) into a
424
- subsequent delegation prompt, recompute it once via diff/ls (e.g. `git diff -U0 --
425
- <path> | grep -c '^+[^+]'`) before restating it — do not relay an unverified
426
- agent-reported count (R023 「리서치 위임의 결론 수치는 표에서 재계산해 병기」 #1707 #4
427
- 확장, #1709 #5).
516
+ - When forwarding a number OR an identifier (file path, rule number, issue number) an
517
+ agent reported into a subsequent delegation prompt, recompute the number once via
518
+ diff/ls (e.g. `git diff -U0 -- <path> | grep -c '^+[^+]'`) AND re-check the
519
+ identifier once via a corpus-wide grep of the reported CONTENT key, not the reported
520
+ identifier itself (e.g. if an agent reports "<rule-N> covers <content key>", grep the
521
+ content key — `git grep -n '<content key>' .claude/rules/` — not `<rule-N>`) and
522
+ compare the file/rule where that content actually lives against the reported identifier
523
+ before restating either — do not relay an unverified agent-reported count or identifier
524
+ (R023 「리서치 위임의 결론 수치는 표에서 재계산해 병기」 #1707 #4 확장, #1709 #5, #1722
525
+ 찐빠 #3).
526
+ - Delegations that build or replace an evaluation/test harness or a production code path
527
+ (fixtures, ablation lanes, scoring/oracle logic) MUST require bidirectional proof, not
528
+ a single-direction pass: (a) positive AND negative fixtures — a fixture set that can
529
+ both pass and fail, and for a replaced code path, invalid-input fixtures compared
530
+ against the original's rc/stderr, not just valid-input stdout parity; (b) a control —
531
+ the change MUST be measured before AND after together with the SAME harness (대조군:
532
+ 변경 전후를 함께 측정, #1721 찐빠 #1) — this before/after measurement is MANDATORY, not
533
+ an example; reverting the change to confirm the result flips, or a synthetic
534
+ positive-control input returning a non-zero candidate/hit count, are additional means
535
+ of proving the harness can detect an effect at all, not substitutes for the before/after
536
+ measurement; (c) no working around a discovered product or measurement defect to force
537
+ a pass — halt and report instead (R023 「Conditional-Output Verification」 양성/음성 짝
538
+ 원칙 확장, #1721 찐빠 #1, #1727 찐빠 #2, #1728 찐빠 #2).
428
539
  - For `claude-code-release` issues, CC release knowledge goes to
429
540
  `guides/claude-code/15-version-compatibility.md` (+ templates mirror) per rule; a rule
430
541
  file gets at most ONE line of behavioral norm only when agent behavior must change.
431
- Delegations adding visible text to `CLAUDE.md`/`.claude/rules/*.md` MUST keep the
542
+ Delegations correcting a CC-note (a note the issue claims is wrong) MUST enclose the
543
+ upstream CHANGELOG lines (measured with `grep -nF`) and the original target paragraph
544
+ as ground truth; if the issue's premise differs from the primary source, the primary
545
+ source wins and the discrepancy is reported rather than silently inherited into the
546
+ corrected wording (#1730 찐빠 #1).
547
+ - When review-correction work is split across file-ownership delegations (one file per
548
+ agent), every split delegation prompt MUST carry the FULL list of review findings
549
+ (not only the subset touching that agent's file) as a self-check list, so a fix in one
550
+ file does not reintroduce a defect the review flagged in a sibling file (#1730 찐빠
551
+ #2).
552
+ - Delegations adding visible text to `CLAUDE.md`/`.claude/rules/*.md` MUST keep the
432
553
  comment-stripped total ≤140,000 chars (hard limit 150,000, validate-docs
433
- `--programmatic-only`) — retire/DETAIL-wrap something else in-change if needed (R016 버전노트 보존정책 / 예산 게이트, #1717).
554
+ `--programmatic-only`) — retire/DETAIL-wrap something else in-change if needed (R016
555
+ 버전노트 보존정책 / 예산 게이트, #1717). Any delegation that compresses or conceals rule
556
+ text (DETAIL-wrapping, retirement) MUST deterministically confirm that every visible
557
+ approval/prohibition/MUST sentence present in the file at HEAD is semantically still
558
+ present in the new visible text afterwards (의미상 남았는가) — a visible-text-to-visible-
559
+ text comparison, not a summary-vs-summary one, using a deterministic method: per-sentence
560
+ `grep -F` of key phrases from each of HEAD's visible approval/prohibition/MUST sentences
561
+ against the new comment-stripped text (#1722 찐빠 #1).
434
562
 
435
563
 
436
564
  ## Sensitive Path Handling (CC v2.1.121+)
@@ -475,6 +603,17 @@ steps:
475
603
  - If current FAIL count > baseline → NEW regression detected → halt + report failure list
476
604
  - If current FAIL count <= baseline → continue with advisory log "X failures (baseline {n}, delta {d})"
477
605
  5. Build verification (if package has build script)
606
+ 6. Coverage threshold check (equivalent to `.husky/pre-commit`'s coverage gate — this
607
+ step exists so that a deferred implement-stage commit, per the implement step 5
608
+ OPTION, is still coverage-gated before release even though the hook has not run yet):
609
+ - bun test --coverage — standalone (NO pipe), read exit code directly
610
+ - Extract Function/Line coverage from the "All files" summary line
611
+ - Read the CURRENT threshold value and the new-source-file relaxation rule directly
612
+ from `.husky/pre-commit` at run time — do NOT hardcode a threshold number in this
613
+ workflow; the hook's threshold can change independently of this file
614
+ - If either Function or Line coverage falls below the threshold `.husky/pre-commit`
615
+ currently applies (accounting for its dynamic relaxation for commits containing
616
+ newly added `src/**/*.ts`/`.tsx` files): halt + report the shortfall
478
617
 
479
618
  For Python/Go/Docker/static-site projects: auto-detect and run equivalent (py_compile + pytest / go build + go vet + go test / docker build / file validation).
480
619
 
@@ -482,6 +621,7 @@ steps:
482
621
  - Lint errors (exit != 0)
483
622
  - Typecheck errors
484
623
  - NEW test failures (regression from baseline)
624
+ - Coverage below the threshold `.husky/pre-commit` currently applies
485
625
  - Build failure
486
626
  - Lockfile drift
487
627
 
@@ -491,7 +631,7 @@ steps:
491
631
 
492
632
  - name: deep-verify
493
633
  skill: deep-verify
494
- description: "Multi-angle release quality verification — self-review checklist if docs-only; mgr-sauron R017 + core self-check if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). lite 분할 표준(#1652 #3-4): (1) mgr-sauron R017 구조 검증 단일 목표 위임 1건 + (2) 변경 성격별 적대적 리뷰 단일 목표 위임 1건 — 스크립트 변경이면 실행 재현 기반 adversarial-review, 룰/스킬/yaml 텍스트 변경이면 문구 정합·배선 리뷰. 훅·advisor 옵션 변경이면 합성 픽스처 외에 이 프로젝트 실 트랜스크립트 1건 계수 실측을 완료 조건에 포함(#1703 권장 2). 근거: v1.1.59/60 두 반복 연속 적대적 리뷰가 신규 회귀(M-3/M-4, heredoc 위조)를 실행 재현으로 포착. 검증 위임 표준 문안: 오케스트레이터가 이미 실측한 항목(bun test·lint·typecheck·template-sync·wiki-sync·validate-docs·미러 md5)은 위임서에 재실행 금지 목록으로 열거하고 재실측 대상만 지정한다 — v1.1.61 세션에서 금지 목록 없는 sauron 위임이 bun test를 재실행하다 25턴 절단됐고, 금지 목록을 명시한 재위임은 16 tool_uses로 완주했다(R020 maxTurns 절단 누적 7건째). Ordering: any wiki resync/manifest reseed for the changed rules/skills is dispatched after this step's findings are applied, not alongside it (#1688)."
634
+ description: "Multi-angle release quality verification — self-review checklist if docs-only; mgr-sauron R017 + core self-check if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). lite 분할 표준(#1652 #3-4): (1) mgr-sauron R017 구조 검증 단일 목표 위임 1건 + (2) 변경 성격별 적대적 리뷰 단일 목표 위임 1건 — 스크립트 변경이면 실행 재현 기반 adversarial-review, 룰/스킬/yaml 텍스트 변경이면 문구 정합·배선 리뷰. 훅·advisor 옵션 변경이면 합성 픽스처 외에 이 프로젝트 실 트랜스크립트 1건 계수 실측을 완료 조건에 포함(#1703 권장 2). 근거: v1.1.59/60 두 반복 연속 적대적 리뷰가 신규 회귀(M-3/M-4, heredoc 위조)를 실행 재현으로 포착. 검증 위임 표준 문안: 오케스트레이터가 이미 실측한 항목(bun test·lint·typecheck·template-sync·wiki-sync·validate-docs·미러 md5)은 위임서에 재실행 금지 목록으로 열거하고 재실측 대상만 지정한다 — v1.1.61 세션에서 금지 목록 없는 sauron 위임이 bun test를 재실행하다 25턴 절단됐고, 금지 목록을 명시한 재위임은 16 tool_uses로 완주했다(R020 maxTurns 절단 누적 7건째). 검증 위임도 편집 위임과 동일하게 턴 산술(대상 파일 수 × 판단 항목 수)을 계산해 위임서에 명시하고, 예산을 넘으면 파일군별로 분할해야 합니다 — v1.1.77 sauron 1차 위임은 30여 파일 + 판단 4항목을 단일 위임에 넣어 판정 없이 25턴에서 절단됐습니다(#1722 찐빠 #2). Ordering: any wiki resync/manifest reseed for the changed rules/skills is dispatched after this step's findings are applied, not alongside it (#1688)."
495
635
  depends_on: verify-build
496
636
 
497
637
  - name: release
@@ -551,6 +691,8 @@ steps:
551
691
  ⚠ do NOT add Closes/Fixes/Resolves keywords to this commit message (#1542) — this commit merges into
552
692
  develop later via the release PR; a close keyword here bypasses the PR-body mechanism auto-tag.yml
553
693
  relies on (see step 3.b below). Use `Refs #N` if a cross-reference is needed.
694
+ ⚠ Commit trailers MUST use ONLY the exact trailer text supplied in this delegation
695
+ prompt — do not add or rewrite any other trailer (#1728 찐빠 #6; see implement step 5).
554
696
  ⚠ Bash timeout (#1645): delegate this commit with an explicit `timeout: 400000` — the
555
697
  main-worktree pre-commit hook runs the full test suite (~165s) and the Bash default of
556
698
  120000ms kills it with exit 143. `--no-verify` is NOT an acceptable workaround (R010).
@@ -631,7 +773,10 @@ steps:
631
773
  If NOT: skip with "No CI configured. Skipping." and continue.
632
774
  2. If CI exists:
633
775
  - gh run list --limit 10
634
- - Wait for runs triggered by the new tag/push
776
+ - Wait for runs triggered by the new tag/push — poll WITHIN the Bash timeout budget
777
+ (loop_count × sleep_interval + command time ≤ timeout, with margin), or prefer a
778
+ single bounded call `gh run watch <run-id> --exit-status` (optionally
779
+ run_in_background) over an unbounded manual poll loop (#1711 찐빠 #6).
635
780
  - If failures: diagnose, fix, re-verify
636
781
  3. For npm projects with auto-tag.yml: MANDATORY additional check:
637
782
  gh run list --workflow auto-tag.yml --limit 1 --json conclusion,displayTitle
@@ -646,7 +791,17 @@ steps:
646
791
  - Branch naming mismatch (branch not matching release/v* pattern — fix: verify branch name)
647
792
  Report: "[ci-check] auto-tag.yml: {conclusion}" as mandatory line in CI status report.
648
793
  4. For npm projects: verify npm publish succeeded (npm view <pkg> version)
649
- 5. Report final CI status.
794
+ 5. Verify every scoped issue's label/state lifecycle landed: `in-progress` removed and
795
+ the issue CLOSED for each issue that was in this release's scope — do not rely on the
796
+ implement step having run the lifecycle transition; check directly with
797
+ `gh issue view <N> --json state,labels` (#1722 찐빠 #6, closes gap where CLOSED issues
798
+ retained `in-progress`). This step finds AND fixes, not verify-only: if a stale
799
+ `in-progress` label remains, remove it (`gh issue edit <N> --remove-label
800
+ in-progress`) and report the fix; if the issue is still OPEN, do NOT close it here —
801
+ closing stays with auto-tag.yml unless it failed to close that issue, in which case
802
+ report the open issue for manual close per release step 3.d above (#1722 하네스 제안
803
+ 4).
804
+ 6. Report final CI status.
650
805
  description: "Post-release CI verification and fix loop"
651
806
  depends_on: release
652
807
 
@@ -166,6 +166,8 @@ gh issue create \
166
166
 
167
167
  Add priority label (`P1`, `P2`, `P3`) based on categorization. Default for auto-registered items: `P3` (escalate to `P2` for MEDIUM+ severity).
168
168
 
169
+ **`## 권장 조치`의 미검증 제안은 `[가설]` 태그 필수**: `{권장 사항}`에 적는 수정안이 실행·테스트 등으로 검증되지 않았다면, 문장 앞에 `[가설]` 태그를 붙이고 무엇을 확인하면 검증되는지 함께 적으십시오. 원인 진단에만 `[가설]`을 붙이고 제안 수정안은 확정형으로 적으면, 그 제안을 그대로 적용했을 때 실패할 위험이 후속 세션으로 이월됩니다(R020 Diagnostic Hypothesis Verification, Origin: #1725 찐빠 #1).
170
+
169
171
  ## Notes
170
172
 
171
173
  - This skill runs in the main conversation context (via workflow skill step)
@@ -38,6 +38,12 @@ Analyzes GitHub issues directly against the current codebase. For each issue, se
38
38
  | 4 | Multi-Perspective Analysis & Output | general-purpose agents | sonnet/opus |
39
39
  | 5 | Act | mgr-gitnerd | — |
40
40
 
41
+ ## Lightweight Mode (Cross-Tier Substitution)
42
+
43
+ Independent of the auto-dev compression tier selected, this skill's Phase 1-4 may be replaced by a lightweight orchestrator analysis instead of a full skill spawn, but only when the conditions in `.claude/skills/pipeline/workflows/auto-dev.yaml` (runtime source) `## Cross-tier — Lightweight Skill-Mode Substitution` are met (scope ≤3 issues, code evidence or a measured root cause with the command used, and a mandatory justification log entry). This skill does not duplicate those conditions here — that section is the authoritative gate.
44
+
45
+ When lightweight mode is used, the triage output (Phase 4E artifact and/or Phase 4D comment) MUST state which mode produced it: `mode: full` or `mode: lightweight`.
46
+
41
47
  ## Delegation Contract
42
48
 
43
49
  | Phase | Agent | Mode |
@@ -1320,13 +1320,13 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
1320
1320
  ### 모델 · effort
1321
1321
 
1322
1322
  - CHANGELOG 원문: "Added Claude Opus 5.5 (`claude-opus-5-5`), now the default Opus model — 1M context, $4/$20 per Mtok with $0.20/Mtok cache reads"
1323
- (280) Opus 5.5가 기본 Opus 모델이 되었으므로, R006 Model Specification Tier 2 표에 `claude-opus-5-5` 전체 ID를 추가할지 검토가 필요합니다 — 아래 rule candidates 참조.
1323
+ (280) Opus 5.5가 기본 Opus 모델이 되었으므로, R006 Model Specification Tier 2 표에 `claude-opus-5-5` 전체 ID를 추가할지 검토가 필요합니다 — 아래 Action items 참조.
1324
1324
  - CHANGELOG 원문: "Changed the default model on Pro and Team Standard plans from Sonnet to Opus, matching Max, Team Premium, and Enterprise"
1325
1325
  (280) Pro/Team Standard 플랜의 기본 모델이 Sonnet에서 Opus로 바뀌었으므로, 해당 플랜을 쓰는 세션은 R005 비용 인식 관점에서 기본값 자체가 더 비싸진 상태로 시작됩니다.
1326
1326
  - CHANGELOG 원문: "Changed an effort level saved before `/effort` became per-model to no longer apply to newly released models such as Opus 5.5; they start at their default until you pick a level"
1327
1327
  (280) Opus 5.5처럼 새로 출시된 모델은 과거 저장된 effort 값을 물려받지 않고 기본 effort로 시작하므로, 이 저장소의 effort 관련 지침을 새 모델에 그대로 적용하기 전 실측이 필요합니다.
1328
1328
  - CHANGELOG 원문: "Changed Opus 4.7, Opus 4.8 and Fable 5 to stop holding their launch-default effort over `/effort` in `-p` or the Agent SDK, a project, managed or `--settings` `effortLevel`, or a per-model level"
1329
- (280) Opus 4.7·4.8·Fable 5가 더 이상 `/effort` 등 명시적 effort 설정을 무시하지 않게 되어, R006이 v2.1.267 노트에서 기록한 "effort 프론트매터가 무시된다"는 전제가 이 세 모델에서는 더 이상 성립하지 않습니다 — 아래 rule candidates 참조.
1329
+ (280) Opus 4.7·4.8·Fable 5는 `-p`나 Agent SDK에서 쓰는 `/effort`, 프로젝트·managed·`--settings` `effortLevel`, 모델별 레벨에 대해 launch-default effort를 더 이상 우선시하지 않게 되었습니다. R006이 v2.1.267 노트에서 기록한 것은 이 세 모델의 커스텀 커맨드·스킬·서브에이전트 `effort:` 프론트매터 무시 결함이 267에서 **수정됐다**는 사실이며, 280은 그 수정을 세션·설정 경로로 확장한 후속 변경입니다 — 아래 Action items 참조.
1330
1330
 
1331
1331
  ### MCP
1332
1332
 
@@ -1392,7 +1392,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
1392
1392
  기타 91건 — 이 저장소 비해당(VSCode/Claude Code on the web/Claude Tag/Code Review 전용 29건, Windows·self-hosted runner 전용 4건 포함, 나머지는 UI 다이얼로그·마우스·키바인딩 폴리시, Artifact 도구 세부사항, 마켓플레이스 커밋 추적 등 저빈도 항목).
1393
1393
 
1394
1394
  **Action items**:
1395
- - R006 Model Specification Tier 2 표에 `claude-opus-5-5` 행을 v1.1.77에서 추가 완료. v2.1.267 DETAIL 노트(Opus 4.7·4.8·Fable 5 effort 무시 서술)는 이번 릴리즈의 반전 사실을 아직 반영하지 않았으므로 다음 룰 편집 세션에서 정정이 필요합니다.
1395
+ - R006 Model Specification Tier 2 표에 `claude-opus-5-5` 행을 v1.1.77에서 추가 완료. R006의 v2.1.267 DETAIL 노트(Opus 4.7·4.8·Fable 5의 `effort:` 프론트매터 무시 결함이 267에서 수정됐다는 기록)에는 #1720에서 v2.1.280의 후속 변경("Changed Opus 4.7, Opus 4.8 and Fable 5 to stop holding their launch-default effort over `/effort` in `-p` or the Agent SDK, a project, managed or `--settings` `effortLevel`, or a per-model level")을 반영한 후속 노트를 추가했습니다.
1396
1396
  - 그 외 항목은 CC 플랫폼 신뢰성 개선이며 이 저장소 harness 변경은 불필요합니다.
1397
1397
 
1398
1398
  ---
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.79",
2
+ "version": "1.1.81",
3
3
  "lastUpdated": "2026-09-03",
4
4
  "omcustomMinClaudeCode": "2.1.121",
5
5
  "omcustomMinClaudeCodeReason": "Sensitive-path direct Write/Edit on .claude/** under bypassPermissions (R010 deprecation, #1101)",
@@ -178,6 +178,17 @@ steps:
178
178
  For each scoped issue, extract target file/directory paths from its title+body (explicit
179
179
  paths, backtick-quoted paths, or clearly named targets).
180
180
 
181
+ Measure each extracted path with `git ls-files` NOW, before scope is committed — do not
182
+ defer this to implement time — but ONLY for a target the issue treats as an EXISTING
183
+ file (edit/refactor of a path the issue claims already exists). If such a path is absent
184
+ from this repo (e.g. it belongs to a different repository), route that issue to
185
+ decision-needed or exclude it from this scope immediately (scope-selection 단계에서
186
+ 이슈가 가리키는 경로의 `git ls-files` 실측을 선행, #1725 찐빠 #4). For a target the issue
187
+ is CREATING (a new file), this absence check does not apply — a new file is by
188
+ definition untracked (R010 「Required Checks」: 신규 생성 대상은 path-existence 확인에서
189
+ 제외); instead confirm the parent directory exists, and do NOT exclude the issue solely
190
+ because the new file path itself is absent.
191
+
181
192
  Check against `.claude/rules/MUST-orchestrator-coordination.md` "Protected Paths":
182
193
  - `.claude/hooks/**` → EXCLUDED from mgr-creator routing; requires EXPLICIT USER APPROVAL
183
194
  (security-critical). If any scoped issue targets this path, request approval for the
@@ -271,7 +282,10 @@ steps:
271
282
  ## Tier 3 — standard (fallback)
272
283
 
273
284
  If neither docs-only nor lite met → set compression_mode=standard
274
- - All pipeline steps execute normally with full skill spawns
285
+ - All pipeline steps execute normally with full skill spawns — EXCEPT the two
286
+ Cross-tier exceptions below ("Pre-Existing Converged Artifact Substitution" and
287
+ "Lightweight Skill-Mode Substitution"), which stay available under standard mode too
288
+ when their own conditions are met ("Independent of the tier selected above").
275
289
  - Log: "[compression-mode] standard mode (scope={n}, mixed/high-risk labels, large scope, or code logic change)"
276
290
 
277
291
  ## Cross-tier — State-Change Side Effects Are NEVER Compressed
@@ -330,6 +344,36 @@ steps:
330
344
 
331
345
  This authorizes, under an audit log, a substitution that would otherwise be a standard-mode contract deviation. Origin: #1309 (a converged `/research` artifact was used in place of triage/plan/deep-plan under standard mode without an authorizing rule).
332
346
 
347
+ ## Cross-tier — Lightweight Skill-Mode Substitution
348
+
349
+ Independent of the tier selected above, the triage / plan / deep-plan skill spawns MAY be
350
+ replaced by orchestrator-integrated analysis — a lightweight mode — even in standard mode,
351
+ ONLY when ALL of the following hold. deep-verify is NOT eligible for this lightweight-mode
352
+ substitution (see NEVER list below) — it remains eligible only for the separate
353
+ pre-existing-converged-artifact substitution described above (a full prior skill spawn's
354
+ output reused, not orchestrator-integrated shortcutting).
355
+ 1. Scope size ≤ 3 issues (이슈에 코드 근거가 있고 범위가 이슈 3건 이하이면 경량 모드,
356
+ #1721 제안 4 — 사용자 결정: 상한 3건).
357
+ 2. For EVERY scoped issue in this substitution, EITHER the issue body cites concrete code
358
+ evidence (a file path AND an anchor — function name / unique string, not just a claim),
359
+ OR the orchestrator has recorded the measured root cause together with the exact
360
+ command used to measure it (scope=1 + 오케스트레이터 실측 원인 확정 조건의 감사 로그
361
+ 대체 조항, #1727 찐빠 #1).
362
+ 3. A MANDATORY justification log line is emitted naming the step and the evidence basis:
363
+ "[compression-mode] lightweight skill-mode substitution — step '{step}', scope={n},
364
+ evidence={file:anchor or measured-cause+command}".
365
+ 4. The resulting artifact explicitly states its own mode (`mode: full` or
366
+ `mode: lightweight`) so downstream steps and reviewers can tell it apart from a full
367
+ skill spawn (결과물에 모드를 표시, #1721 제안 4).
368
+
369
+ This substitution is NEVER available for implement, verify-build, release, ci-check, or
370
+ deep-verify.
371
+ It replaces analysis output ONLY — every step's state-change side effect still runs in
372
+ full regardless of substitution (see "Cross-tier — State-Change Side Effects Are NEVER
373
+ Compressed" above).
374
+
375
+ If any condition above cannot be concretely asserted, do NOT substitute — spawn the skill.
376
+
333
377
  ## Output
334
378
 
335
379
  compression_mode ∈ {docs-only, lite, standard} as pipeline state for downstream steps.
@@ -338,17 +382,17 @@ steps:
338
382
 
339
383
  - name: triage
340
384
  skill: professor-triage
341
- description: "Cross-analysis triage with priority assessment (scoped to release manifest) — skipped if docs-only, integrated-analysis allowed if lite"
385
+ description: "Cross-analysis triage with priority assessment (scoped to release manifest) — skipped if docs-only, integrated-analysis allowed if lite; independent of tier, MAY run in lightweight mode when compression-mode-eval's 'Cross-tier — Lightweight Skill-Mode Substitution' conditions are met"
342
386
  depends_on: compression-mode-eval
343
387
 
344
388
  - name: plan
345
389
  skill: release-plan
346
- description: "Release unit plan from triaged issues — skipped if docs-only, integrated-analysis allowed if lite"
390
+ description: "Release unit plan from triaged issues — skipped if docs-only, integrated-analysis allowed if lite; independent of tier, MAY run in lightweight mode when compression-mode-eval's 'Cross-tier — Lightweight Skill-Mode Substitution' conditions are met"
347
391
  depends_on: triage
348
392
 
349
393
  - name: deep-plan
350
394
  skill: deep-plan
351
- description: "Research-validated implementation plan (research → plan → verify) — skipped if docs-only, integrated-analysis allowed if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). 리서치·계측 위임의 완료 조건에는 결론 수치를 산출물 표에서 jq/awk로 재계산해 병기하도록 명시한다(#1707 #4)."
395
+ description: "Research-validated implementation plan (research → plan → verify) — skipped if docs-only, integrated-analysis allowed if lite; independent of tier, MAY run in lightweight mode when compression-mode-eval's 'Cross-tier — Lightweight Skill-Mode Substitution' conditions are met. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). 리서치·계측 위임의 완료 조건에는 결론 수치를 산출물 표에서 jq/awk로 재계산해 병기하도록 명시한다(#1707 #4)."
352
396
  depends_on: plan
353
397
 
354
398
  - name: implement
@@ -363,6 +407,12 @@ steps:
363
407
  - Use specialized agents (lang-*, be-*, fe-*, infra-*) over general-purpose
364
408
  4. TDD via superpowers:test-driven-development when tests apply
365
409
  5. Commit via mgr-gitnerd with `Refs #<N>` trailer in body — NEVER `Fixes`/`Closes`/`Resolves` (#1542).
410
+ Commit trailers MUST use ONLY the exact trailer text the orchestrator supplies in the
411
+ delegation prompt — the agent MUST NOT add or rewrite any other trailer (observed in
412
+ another project's session: a subagent added an unapproved model-attribution trailer to 4
413
+ local commits, citing the repo's own past-commit convention as justification; the trailer
414
+ did not remain on the target branch because the squash-merge specified the PR body
415
+ separately) (#1728 찐빠 #6).
366
416
  ⚠ implement-stage commits land directly on develop (no PR gate here). A close-keyword trailer on a
367
417
  develop-bound commit auto-closes the issue on push — BEFORE release/tag/publish (observed v1.1.38,
368
418
  07:49:26Z). Close keywords belong ONLY in the release-stage PR body (see release step 3.b) — auto-tag.yml
@@ -375,6 +425,15 @@ steps:
375
425
  bypasses the quality gate and is on the standing deny list (R010).
376
426
  Note: git worktrees run typecheck only (`.husky/pre-commit` lines 7-12 branch on
377
427
  `[ -f .git ]` and exit 0), so the long budget matters most on the MAIN worktree.
428
+ OPTION: the implement-stage commit MAY be deferred until AFTER deep-verify
429
+ corrections have landed, combining the implement changes and the deep-verify
430
+ corrections into ONE commit (정정 커밋 추가 비용 절감, #1727 찐빠 #4) — allowed
431
+ ONLY before any push to develop, and MUST be announced to the user. The deferred
432
+ commit still carries the `Refs #<N>` trailer and the 400000ms timeout above. Risk:
433
+ verify-build and deep-verify then run against an uncommitted working tree until the
434
+ combined commit lands. DEADLINE: the combined commit MUST land — with the
435
+ `.husky/pre-commit` gate passing — before the release step begins; release step
436
+ 1.a requires a clean working tree, so a deferred commit cannot cross into release.
378
437
  6. On success: remove in-progress, add verify-ready
379
438
  7. On failure: remove in-progress, add needs-review, comment error summary
380
439
 
@@ -394,10 +453,44 @@ steps:
394
453
  delegation prompt's sentences and rewrite any match (cause: the R016 「신설 조항의 동일
395
454
  반복 self-check」 was known as text but not executed as a procedure, #1707 #1).
396
455
  - Every rule/skill/guide TEXT-editing delegation prompt MUST include this fixed constraint
397
- block: (a) Korean 합쇼체 for new sentences, do not imitate adjacent 반말; (b) locate by anchor
456
+ block: (a) Korean 합쇼체 for new sentences, do not imitate adjacent 반말 — completion
457
+ criteria MUST include THREE deterministic checks, scoped to edited text files (md/yaml)
458
+ and restricted to added lines only (`git diff -U0 -- <edited md/yaml files> | grep
459
+ '^+'`): family check `grep -cE '(한다|된다|않는다|따른다|했다|있다|없다|넣는다|이다)[.。 "]'`
460
+ = 0, line-final auxiliary check `grep -E '다[.。"]?$' | grep -vc '니다[.。"]?$'` = 0
461
+ (the family list alone misses endings such as 따른다/했다/있다 and unpunctuated
462
+ line-final endings; the line-final check excludes 합쇼체 `-니다` endings so it does not
463
+ flag correct sentences — verified against 6 반말/평서형 positive samples and 6 합쇼체
464
+ negative samples, 12/12 correct) (#1711 찐빠 #3), AND line-final noun-ending check
465
+ `grep -E '(함|됨|필요)[.。"]?$'` = 0 (반말/명사 종결 endings such as 확인함·정정
466
+ 필요·완료됨 fall entirely outside the 다-ending regexes above and were previously
467
+ undetectable — verified against 4 명사 종결 positive samples and 4 합쇼체 negative
468
+ samples, 8/8 correct) (#1728 찐빠 #2 residual). Even with all three checks, a residual
469
+ gap remains for 반말/명사 종결 variants the patterns above do not enumerate — the agent
470
+ MUST also read the newly added lines directly as a final check, not rely on regex alone.
471
+ When an edit re-emits a pre-existing
472
+ line unchanged in meaning (e.g. reformatting), judge only the newly added span, not the
473
+ whole re-emitted line; (b) locate by anchor
398
474
  strings, never line numbers; (c) copy quotations from `gh issue view --json body` output and
399
475
  verify with `grep -F`; (d) ±1 heading check including re-binding of relative references (위
400
- 표/아래 표/직전 조항); (e) copy to `templates/` mirror and confirm `md5 -q` equality (#1707 #3).
476
+ 표/아래 표/직전 조항); (e) copy to `templates/` mirror and confirm `md5 -q` equality (#1707 #3);
477
+ (f) when paraphrasing a quoted source, preserve its result word, subject, and causal
478
+ direction (결과어·주체·인과 방향 보존) — this is checked SEPARATELY from the `grep -F`
479
+ lexical match, by placing the paraphrase and the original sentence side by side in the
480
+ completion report (#1711 찐빠 #1); (g) version/count example values written
481
+ into rule/skill text use placeholders, never real literals (룰 예시 값은 플레이스홀더,
482
+ 실값 리터럴 금지) — the rule corpus is itself a grep target, and a real literal can
483
+ contaminate the very command a clause cites (#1711 찐빠 #2); (h) any temporary file the
484
+ delegation creates MUST live under a per-agent-unique path (`$TMPDIR` or the session
485
+ scratchpad), never a fixed shared path (#1722 찐빠 #7).
486
+ - Every delegation prompt (not only rule/skill/guide TEXT edits) MUST instruct the agent
487
+ that if a guard, classifier, or permission check blocks an action, it MUST NOT route
488
+ around it (e.g. via a shell glob or path rewrite) — it MUST stop and report the block
489
+ verbatim (R010 「품질 게이트 우회 금지 — 훅 차단은 보고 대상」, extended here from git
490
+ hooks to guards/classifiers/permissions generally) (#1728 찐빠 #1).
491
+ - After any delegation that creates temporary files under constraint (h) above, the
492
+ orchestrator MUST confirm with `git status --short` that no stray file was left in the
493
+ repo (#1721 찐빠 #7).
401
494
  - Document mirror/parity delegations (README/ARCHITECTURE/CLAUDE.md ko-en, templates
402
495
  mirrors, etc.) MUST be split to ≤3 files per delegation (a companion cap alongside the
403
496
  arithmetic below, not a replacement for it); compute turn arithmetic (files × 3 +
@@ -420,17 +513,52 @@ steps:
420
513
  `.gitignore` rule) — MUST be excluded from delegation scope, or its tracked status
421
514
  decided first, before dispatch (R010 「Agent Capability Pre-Check」 git-tracked row)
422
515
  (#1709 #4).
423
- - When forwarding a number an agent reported (row/line/file counts, etc.) into a
424
- subsequent delegation prompt, recompute it once via diff/ls (e.g. `git diff -U0 --
425
- <path> | grep -c '^+[^+]'`) before restating it — do not relay an unverified
426
- agent-reported count (R023 「리서치 위임의 결론 수치는 표에서 재계산해 병기」 #1707 #4
427
- 확장, #1709 #5).
516
+ - When forwarding a number OR an identifier (file path, rule number, issue number) an
517
+ agent reported into a subsequent delegation prompt, recompute the number once via
518
+ diff/ls (e.g. `git diff -U0 -- <path> | grep -c '^+[^+]'`) AND re-check the
519
+ identifier once via a corpus-wide grep of the reported CONTENT key, not the reported
520
+ identifier itself (e.g. if an agent reports "<rule-N> covers <content key>", grep the
521
+ content key — `git grep -n '<content key>' .claude/rules/` — not `<rule-N>`) and
522
+ compare the file/rule where that content actually lives against the reported identifier
523
+ before restating either — do not relay an unverified agent-reported count or identifier
524
+ (R023 「리서치 위임의 결론 수치는 표에서 재계산해 병기」 #1707 #4 확장, #1709 #5, #1722
525
+ 찐빠 #3).
526
+ - Delegations that build or replace an evaluation/test harness or a production code path
527
+ (fixtures, ablation lanes, scoring/oracle logic) MUST require bidirectional proof, not
528
+ a single-direction pass: (a) positive AND negative fixtures — a fixture set that can
529
+ both pass and fail, and for a replaced code path, invalid-input fixtures compared
530
+ against the original's rc/stderr, not just valid-input stdout parity; (b) a control —
531
+ the change MUST be measured before AND after together with the SAME harness (대조군:
532
+ 변경 전후를 함께 측정, #1721 찐빠 #1) — this before/after measurement is MANDATORY, not
533
+ an example; reverting the change to confirm the result flips, or a synthetic
534
+ positive-control input returning a non-zero candidate/hit count, are additional means
535
+ of proving the harness can detect an effect at all, not substitutes for the before/after
536
+ measurement; (c) no working around a discovered product or measurement defect to force
537
+ a pass — halt and report instead (R023 「Conditional-Output Verification」 양성/음성 짝
538
+ 원칙 확장, #1721 찐빠 #1, #1727 찐빠 #2, #1728 찐빠 #2).
428
539
  - For `claude-code-release` issues, CC release knowledge goes to
429
540
  `guides/claude-code/15-version-compatibility.md` (+ templates mirror) per rule; a rule
430
541
  file gets at most ONE line of behavioral norm only when agent behavior must change.
431
- Delegations adding visible text to `CLAUDE.md`/`.claude/rules/*.md` MUST keep the
542
+ Delegations correcting a CC-note (a note the issue claims is wrong) MUST enclose the
543
+ upstream CHANGELOG lines (measured with `grep -nF`) and the original target paragraph
544
+ as ground truth; if the issue's premise differs from the primary source, the primary
545
+ source wins and the discrepancy is reported rather than silently inherited into the
546
+ corrected wording (#1730 찐빠 #1).
547
+ - When review-correction work is split across file-ownership delegations (one file per
548
+ agent), every split delegation prompt MUST carry the FULL list of review findings
549
+ (not only the subset touching that agent's file) as a self-check list, so a fix in one
550
+ file does not reintroduce a defect the review flagged in a sibling file (#1730 찐빠
551
+ #2).
552
+ - Delegations adding visible text to `CLAUDE.md`/`.claude/rules/*.md` MUST keep the
432
553
  comment-stripped total ≤140,000 chars (hard limit 150,000, validate-docs
433
- `--programmatic-only`) — retire/DETAIL-wrap something else in-change if needed (R016 버전노트 보존정책 / 예산 게이트, #1717).
554
+ `--programmatic-only`) — retire/DETAIL-wrap something else in-change if needed (R016
555
+ 버전노트 보존정책 / 예산 게이트, #1717). Any delegation that compresses or conceals rule
556
+ text (DETAIL-wrapping, retirement) MUST deterministically confirm that every visible
557
+ approval/prohibition/MUST sentence present in the file at HEAD is semantically still
558
+ present in the new visible text afterwards (의미상 남았는가) — a visible-text-to-visible-
559
+ text comparison, not a summary-vs-summary one, using a deterministic method: per-sentence
560
+ `grep -F` of key phrases from each of HEAD's visible approval/prohibition/MUST sentences
561
+ against the new comment-stripped text (#1722 찐빠 #1).
434
562
 
435
563
 
436
564
  ## Sensitive Path Handling (CC v2.1.121+)
@@ -475,6 +603,17 @@ steps:
475
603
  - If current FAIL count > baseline → NEW regression detected → halt + report failure list
476
604
  - If current FAIL count <= baseline → continue with advisory log "X failures (baseline {n}, delta {d})"
477
605
  5. Build verification (if package has build script)
606
+ 6. Coverage threshold check (equivalent to `.husky/pre-commit`'s coverage gate — this
607
+ step exists so that a deferred implement-stage commit, per the implement step 5
608
+ OPTION, is still coverage-gated before release even though the hook has not run yet):
609
+ - bun test --coverage — standalone (NO pipe), read exit code directly
610
+ - Extract Function/Line coverage from the "All files" summary line
611
+ - Read the CURRENT threshold value and the new-source-file relaxation rule directly
612
+ from `.husky/pre-commit` at run time — do NOT hardcode a threshold number in this
613
+ workflow; the hook's threshold can change independently of this file
614
+ - If either Function or Line coverage falls below the threshold `.husky/pre-commit`
615
+ currently applies (accounting for its dynamic relaxation for commits containing
616
+ newly added `src/**/*.ts`/`.tsx` files): halt + report the shortfall
478
617
 
479
618
  For Python/Go/Docker/static-site projects: auto-detect and run equivalent (py_compile + pytest / go build + go vet + go test / docker build / file validation).
480
619
 
@@ -482,6 +621,7 @@ steps:
482
621
  - Lint errors (exit != 0)
483
622
  - Typecheck errors
484
623
  - NEW test failures (regression from baseline)
624
+ - Coverage below the threshold `.husky/pre-commit` currently applies
485
625
  - Build failure
486
626
  - Lockfile drift
487
627
 
@@ -491,7 +631,7 @@ steps:
491
631
 
492
632
  - name: deep-verify
493
633
  skill: deep-verify
494
- description: "Multi-angle release quality verification — self-review checklist if docs-only; mgr-sauron R017 + core self-check if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). lite 분할 표준(#1652 #3-4): (1) mgr-sauron R017 구조 검증 단일 목표 위임 1건 + (2) 변경 성격별 적대적 리뷰 단일 목표 위임 1건 — 스크립트 변경이면 실행 재현 기반 adversarial-review, 룰/스킬/yaml 텍스트 변경이면 문구 정합·배선 리뷰. 훅·advisor 옵션 변경이면 합성 픽스처 외에 이 프로젝트 실 트랜스크립트 1건 계수 실측을 완료 조건에 포함(#1703 권장 2). 근거: v1.1.59/60 두 반복 연속 적대적 리뷰가 신규 회귀(M-3/M-4, heredoc 위조)를 실행 재현으로 포착. 검증 위임 표준 문안: 오케스트레이터가 이미 실측한 항목(bun test·lint·typecheck·template-sync·wiki-sync·validate-docs·미러 md5)은 위임서에 재실행 금지 목록으로 열거하고 재실측 대상만 지정한다 — v1.1.61 세션에서 금지 목록 없는 sauron 위임이 bun test를 재실행하다 25턴 절단됐고, 금지 목록을 명시한 재위임은 16 tool_uses로 완주했다(R020 maxTurns 절단 누적 7건째). Ordering: any wiki resync/manifest reseed for the changed rules/skills is dispatched after this step's findings are applied, not alongside it (#1688)."
634
+ description: "Multi-angle release quality verification — self-review checklist if docs-only; mgr-sauron R017 + core self-check if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). lite 분할 표준(#1652 #3-4): (1) mgr-sauron R017 구조 검증 단일 목표 위임 1건 + (2) 변경 성격별 적대적 리뷰 단일 목표 위임 1건 — 스크립트 변경이면 실행 재현 기반 adversarial-review, 룰/스킬/yaml 텍스트 변경이면 문구 정합·배선 리뷰. 훅·advisor 옵션 변경이면 합성 픽스처 외에 이 프로젝트 실 트랜스크립트 1건 계수 실측을 완료 조건에 포함(#1703 권장 2). 근거: v1.1.59/60 두 반복 연속 적대적 리뷰가 신규 회귀(M-3/M-4, heredoc 위조)를 실행 재현으로 포착. 검증 위임 표준 문안: 오케스트레이터가 이미 실측한 항목(bun test·lint·typecheck·template-sync·wiki-sync·validate-docs·미러 md5)은 위임서에 재실행 금지 목록으로 열거하고 재실측 대상만 지정한다 — v1.1.61 세션에서 금지 목록 없는 sauron 위임이 bun test를 재실행하다 25턴 절단됐고, 금지 목록을 명시한 재위임은 16 tool_uses로 완주했다(R020 maxTurns 절단 누적 7건째). 검증 위임도 편집 위임과 동일하게 턴 산술(대상 파일 수 × 판단 항목 수)을 계산해 위임서에 명시하고, 예산을 넘으면 파일군별로 분할해야 합니다 — v1.1.77 sauron 1차 위임은 30여 파일 + 판단 4항목을 단일 위임에 넣어 판정 없이 25턴에서 절단됐습니다(#1722 찐빠 #2). Ordering: any wiki resync/manifest reseed for the changed rules/skills is dispatched after this step's findings are applied, not alongside it (#1688)."
495
635
  depends_on: verify-build
496
636
 
497
637
  - name: release
@@ -551,6 +691,8 @@ steps:
551
691
  ⚠ do NOT add Closes/Fixes/Resolves keywords to this commit message (#1542) — this commit merges into
552
692
  develop later via the release PR; a close keyword here bypasses the PR-body mechanism auto-tag.yml
553
693
  relies on (see step 3.b below). Use `Refs #N` if a cross-reference is needed.
694
+ ⚠ Commit trailers MUST use ONLY the exact trailer text supplied in this delegation
695
+ prompt — do not add or rewrite any other trailer (#1728 찐빠 #6; see implement step 5).
554
696
  ⚠ Bash timeout (#1645): delegate this commit with an explicit `timeout: 400000` — the
555
697
  main-worktree pre-commit hook runs the full test suite (~165s) and the Bash default of
556
698
  120000ms kills it with exit 143. `--no-verify` is NOT an acceptable workaround (R010).
@@ -631,7 +773,10 @@ steps:
631
773
  If NOT: skip with "No CI configured. Skipping." and continue.
632
774
  2. If CI exists:
633
775
  - gh run list --limit 10
634
- - Wait for runs triggered by the new tag/push
776
+ - Wait for runs triggered by the new tag/push — poll WITHIN the Bash timeout budget
777
+ (loop_count × sleep_interval + command time ≤ timeout, with margin), or prefer a
778
+ single bounded call `gh run watch <run-id> --exit-status` (optionally
779
+ run_in_background) over an unbounded manual poll loop (#1711 찐빠 #6).
635
780
  - If failures: diagnose, fix, re-verify
636
781
  3. For npm projects with auto-tag.yml: MANDATORY additional check:
637
782
  gh run list --workflow auto-tag.yml --limit 1 --json conclusion,displayTitle
@@ -646,7 +791,17 @@ steps:
646
791
  - Branch naming mismatch (branch not matching release/v* pattern — fix: verify branch name)
647
792
  Report: "[ci-check] auto-tag.yml: {conclusion}" as mandatory line in CI status report.
648
793
  4. For npm projects: verify npm publish succeeded (npm view <pkg> version)
649
- 5. Report final CI status.
794
+ 5. Verify every scoped issue's label/state lifecycle landed: `in-progress` removed and
795
+ the issue CLOSED for each issue that was in this release's scope — do not rely on the
796
+ implement step having run the lifecycle transition; check directly with
797
+ `gh issue view <N> --json state,labels` (#1722 찐빠 #6, closes gap where CLOSED issues
798
+ retained `in-progress`). This step finds AND fixes, not verify-only: if a stale
799
+ `in-progress` label remains, remove it (`gh issue edit <N> --remove-label
800
+ in-progress`) and report the fix; if the issue is still OPEN, do NOT close it here —
801
+ closing stays with auto-tag.yml unless it failed to close that issue, in which case
802
+ report the open issue for manual close per release step 3.d above (#1722 하네스 제안
803
+ 4).
804
+ 6. Report final CI status.
650
805
  description: "Post-release CI verification and fix loop"
651
806
  depends_on: release
652
807