oh-my-customcode 1.1.80 → 1.1.82

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.80",
220
+ version: "1.1.82",
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.80",
2329
+ version: "1.1.82",
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.80",
6
+ "version": "1.1.82",
7
7
  "description": "Batteries-included agent harness for Claude Code",
8
8
  "type": "module",
9
9
  "bin": {
@@ -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 |
@@ -1397,6 +1397,73 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
1397
1397
 
1398
1398
  ---
1399
1399
 
1400
+ ## v2.1.281 (2026-09-23)
1401
+
1402
+ > Issue: #1731 — Claude Code v2.1.281 compatibility documentation
1403
+ > Scope-ceiling check (R017): 설치 CC는 **2.1.282**(`claude --version`=2.1.282, `npm view @anthropic-ai/claude-code version`=2.1.282 실측)입니다. 2.1.282 CHANGELOG를 확인한 결과 2.1.281 항목을 되돌린 사례는 없습니다 — 아래 "재개된 세션 재전송" 항목(3번)은 2.1.282에서 "Fixed more cases of continued or resumed sessions (`--continue`, `--resume`) re-sending earlier messages in a changed form, which could make the API drop Claude's earlier reasoning"로 사례가 확장될 뿐, 되돌리기가 아니라 같은 방향의 보강입니다.
1404
+
1405
+ ### 설정 · 세션 위임
1406
+
1407
+ - CHANGELOG 원문: "Added `"attribution": false` in `settings.json` to hide all commit and PR attribution; older CLI versions skip a settings file that holds it, so keep the object form in files shared across versions"
1408
+ (281) 이 저장소는 attribution을 CC 설정이 아니라 system-reminder 기반 `Co-Authored-By`/`Generated with` 문구로 관리하므로, `settings.json`에 이 키를 추가할 계획이 없다면 harness 변경은 불필요합니다 — 향후 추가할 경우 구버전 CLI와 공유하는 설정 파일에서는 object 형태를 유지해야 합니다.
1409
+ - CHANGELOG 원문: "Fixed `--setting-sources` (and SDK `settingSources`) not being forwarded to spawned sessions: teammates, `/bg`, `claude agents` sessions and `--worktree --tmux` now start with the parent's restriction"
1410
+ (281) `--setting-sources`로 제한한 설정 범위가 teammate·`/bg`·`claude agents`·`--worktree --tmux`로 스폰된 세션에 전달되지 않던 결함이 수정되어, 부모 세션의 설정 제한이 이제 하위 세션까지 상속됩니다 — 이 저장소는 `--setting-sources`를 명시적으로 쓰지 않으므로 직접 영향은 없습니다.
1411
+
1412
+ ### 재개(resume) · prompt cache
1413
+
1414
+ - CHANGELOG 원문: "Fixed resumed sessions re-sending earlier turns in a changed form (a parallel tool-call turn, an MCP tool call's input or a tool-search result while its server was still reconnecting, or a tool-search result whose loading turn was interrupted), which could make the API drop the conversation's prior reasoning"
1415
+ (281) 재개된 세션이 병렬 tool-call 턴·재연결 중이던 MCP 도구 입력·로딩이 끊긴 tool-search 결과를 바뀐 형태로 재전송해 API가 이전 reasoning을 버리던 결함이 수정되었습니다 — 위 스코프 상한 확인대로 2.1.282에서 사례가 추가로 확장됩니다.
1416
+ - CHANGELOG 원문: "Fixed resuming a very large session sometimes restoring only its last few messages"
1417
+ (281) 매우 큰 세션을 재개할 때 마지막 몇 메시지만 복원되던 결함이 수정되어, `/fsd` 등 장기 세션을 압축 후 재개하는 흐름의 신뢰성이 개선됩니다.
1418
+ - CHANGELOG 원문: "Fixed a session resumed after a restart during a pending permission prompt sending a different history than before, which broke the prompt cache from that point"
1419
+ (281) 대기 중인 권한 프롬프트 도중 재시작 후 재개된 세션이 이전과 다른 히스토리를 보내 그 지점부터 prompt cache가 깨지던 결함이 수정되어, R012 statusline `prompt_cache` 필드가 보고하는 cache-miss 원인 후보 중 하나가 줄어듭니다.
1420
+ - CHANGELOG 원문: "Fixed resuming a session that ended during a tool call: Claude now sees the call and is told its outcome is unknown, and a manual resume no longer adds a hidden "Continue" message"
1421
+ (281) 도구 호출 도중 종료된 세션을 재개하면 이제 Claude가 그 호출을 인지하고 결과를 "알 수 없음"으로 안내받으며, 수동 재개 시 숨은 "Continue" 메시지도 더 이상 추가되지 않습니다 — R020 "Failure/Interrupt Report ≠ Actual Failure" 표가 다루는 중단 처리 계열과 같은 방향의 보강입니다.
1422
+ - CHANGELOG 원문: "Fixed sessions with an earlier advisor result the API could no longer read failing one request every turn and repeatedly losing earlier reasoning; the history is now repaired once"
1423
+ (281) 이전 advisor 결과를 API가 더 이상 읽지 못해 매 턴 요청이 실패하고 이전 reasoning을 반복 소실하던 결함이 수정되어(히스토리를 1회 복구), R005가 기록한 advisor 미지원 프록시 계열 오류와는 별개로 advisor 자체의 히스토리 손상 축이 줄어듭니다.
1424
+ - CHANGELOG 원문: "Fixed the prompt cache being lost when an MCP server disconnects mid-conversation, or is still connecting after a resume, while tool search is off (for example behind a proxy or gateway)"
1425
+ (281) MCP 서버가 대화 도중 연결이 끊기거나 재개 후에도 계속 연결 중일 때(tool search가 꺼진 상태) prompt cache가 소실되던 결함이 수정되어, R019 ontology-RAG/wiki-RAG처럼 이 저장소가 세션 중 MCP 서버에 의존하는 경로의 비용 안정성이 개선됩니다.
1426
+ - CHANGELOG 원문: "Improved auto mode after resuming a session in a new process: the permission classifier can now reuse its earlier prompt cache instead of rewriting it"
1427
+ (281) 새 프로세스에서 세션을 재개한 뒤 auto mode 권한 classifier가 이전 prompt cache를 재사용할 수 있게 되어, `defaultMode` 무시 결함(v2.1.257, R010/R002 기록)과 별개로 재개 직후 auto mode 판정 비용이 줄어듭니다.
1428
+
1429
+ ### 권한 · rm 프롬프트 · sandbox
1430
+
1431
+ - CHANGELOG 원문: "Fixed a turn that could retry indefinitely, ignoring `--max-turns`, when the model alternated unparseable tool calls and output-limit truncation"
1432
+ (281) 모델이 파싱 불가능한 도구 호출과 출력 상한 절단을 번갈아 낼 때 `--max-turns`를 무시하고 무한 재시도하던 결함이 수정되어, R020 "maxTurns 절단 실증" 항목이 전제하는 턴 상한 자체의 신뢰성이 개선됩니다 — 이 결함은 "무시하고 계속 도는" 역방향 사례이므로, R020이 주로 다루는 "조기 절단" 문제와는 반대 축입니다.
1433
+ - CHANGELOG 원문: "Fixed a recursive `rm` whose target is only command-substitution output, such as `rm -rf "$(pwd)"`, running unprompted in auto and `--dangerously-skip-permissions` mode; it now asks even with a Bash allow rule, unless run with `CLAUDE_CODE_DISABLE_SUBSTITUTION_RM_PROMPT=1`"
1434
+ (281) `rm -rf "$(pwd)"`처럼 대상이 command-substitution 출력뿐인 재귀 `rm`이 auto·`--dangerously-skip-permissions` 모드에서 무프롬프트로 실행되던 결함이 수정되어, Bash allow rule이 있어도 이제 확인을 묻습니다(`CLAUDE_CODE_DISABLE_SUBSTITUTION_RM_PROMPT=1`로 끌 수 있음) — R001 Destructive Git Commands 표가 다루는 파괴적 명령 계열과 같은 방향의 플랫폼 보강입니다.
1435
+ - CHANGELOG 원문: "Improved the dangerous-rm check to also flag a removal at a shell variable followed by a top-level directory name, at a variable derived from the working directory, or at a backslash-only target"
1436
+ (281) 작업 디렉터리에서 파생된 변수나 최상위 디렉터리명이 뒤따르는 셸 변수, backslash-only 대상까지 dangerous-rm 검사가 넓어져, 위 항목과 함께 R001이 명시하지 않는 rm 패턴의 플랫폼 측 탐지 범위가 확장됩니다.
1437
+ - CHANGELOG 원문: "Changed the dangerous `rm` prompt in `--dangerously-skip-permissions` and auto mode to wait 2 minutes for an answer, then deny the command with a rewrite hint so unattended sessions keep going (`CLAUDE_CODE_DISABLE_DANGEROUS_RM_TIMEOUT=1` turns this off)"
1438
+ (281) `--dangerously-skip-permissions`·auto mode의 dangerous rm 프롬프트가 응답을 2분 대기한 뒤 거부(재작성 힌트 포함)하도록 바뀌어, 무인 세션이 응답 없는 rm 프롬프트에 영구히 멈추지 않고 진행합니다(`CLAUDE_CODE_DISABLE_DANGEROUS_RM_TIMEOUT=1`로 끌 수 있음) — `/fsd` 같은 무인 루프에서 rm이 필요한 작업이 있다면 2분 뒤 자동 거부됨을 전제해야 합니다.
1439
+ - CHANGELOG 원문: "Fixed sandboxed Bash commands being unable to write to `$TMPDIR` when `CLAUDE_CODE_TMPDIR` is set"
1440
+ (281) `CLAUDE_CODE_TMPDIR`가 설정된 상태에서 샌드박스된 Bash 명령이 `$TMPDIR`에 쓰지 못하던 결함이 수정되어, R005가 기록한 샌드박스 도구 공백·`$TMPDIR` 안내와 함께 이 저장소의 스크래치패드 작업 경로 안정성이 개선됩니다.
1441
+
1442
+ ### 훅 · MCP 연결 타이밍 · plugin validate
1443
+
1444
+ - CHANGELOG 원문: "Fixed `mcp_tool` hooks on blocking events (PreToolUse and similar) being skipped while their MCP server was still connecting; they now wait for it, up to the MCP connect timeout"
1445
+ (281) `mcp_tool` 훅이 blocking 이벤트(PreToolUse 등)에서 MCP 서버가 아직 연결 중일 때 건너뛰던 결함이 수정되어 이제 MCP connect timeout까지 대기합니다 — 이 저장소는 현재 `mcp_tool` 타입 훅을 배선하지 않았으나, R006 Hook Event Types가 다루는 4개 핸들러 타입 중 하나의 신뢰성 보강입니다.
1446
+ - CHANGELOG 원문: "Added MCP server checks to `claude plugin validate`: it reports `.mcp.json` entries that would be silently dropped at load, undeclared `${user_config.*}` references, and insecure URLs"
1447
+ (281) `claude plugin validate`에 `.mcp.json` 항목이 로드 시 조용히 누락되는 경우, 미선언 `${user_config.*}` 참조, 불안전한 URL을 보고하는 MCP 검사가 추가되어, R017 "스킬 추가·수정 후 `claude plugin validate`를 개수 대조와 함께 실행" 조항의 검증 범위가 넓어집니다.
1448
+ - CHANGELOG 원문: "Fixed `claude plugin validate` reporting `privacyPolicyUrl`, `supportUrl` and other listing metadata keys in plugin.json as unknown fields"
1449
+ (281) `claude plugin validate`가 plugin.json의 `privacyPolicyUrl`·`supportUrl` 등 리스팅 메타데이터 키를 unknown field로 오보고하던 결함이 수정되어, 위 R017 조항 실행 시의 오탐 1종이 줄어듭니다.
1450
+ - CHANGELOG 원문: "Improved plugin hook-failure errors to name the offending plugin, and added a `claude plugin validate` warning when a shell-form hook leaves `${CLAUDE_PLUGIN_ROOT}` unquoted (it breaks on plugin paths with spaces)"
1451
+ (281) 플러그인 훅 실패 오류에 해당 플러그인 이름이 명시되고, shell-form 훅이 `${CLAUDE_PLUGIN_ROOT}`를 따옴표 없이 쓰면(경로에 공백이 있을 때 깨짐) `claude plugin validate` 경고가 추가되어, R023 Workflow Script Sanity Check가 다루는 "셸 변수 이스케이프" 계열 점검이 plugin validate 단계에서도 보강됩니다.
1452
+
1453
+ ### /loop · 예약 작업
1454
+
1455
+ - CHANGELOG 원문: "Fixed scheduled tasks and `/loop` wakeups being fired again every second when their delivery failed, which could make Claude Code exit at the end of a turn"
1456
+ (281) 전달에 실패한 예약 작업·`/loop` 웨이크업이 매초 재발화되어 턴 종료 시 Claude Code가 종료될 수 있던 결함이 수정되어, 이 저장소가 무인 루프(`/fsd` 등)에서 겪을 수 있던 조용한 조기 종료 원인 하나가 줄어듭니다.
1457
+
1458
+ 기타 157건 — 이 저장소 비해당 (VSCode·Claude Code on the web·Claude Tag·Code Review 전용 26건(VSCode 6, web 6, Claude Tag 13, Code Review 1), Windows 전용 2건 포함, 나머지 129건은 UI 다이얼로그·키바인딩·마우스·vim 모드·Claude apps gateway/Bedrock/Vertex 세부사항 등).
1459
+
1460
+ **Action items**:
1461
+ - 19건 모두 CC 플랫폼 신뢰성·안전장치 보강이며 즉각적인 harness 변경(룰 수정)은 불필요합니다.
1462
+ - 위 dangerous rm 2분 타임아웃(권한 · rm 프롬프트 · sandbox 3번째 항목)은 `/fsd` 등 무인 루프가 rm을 직접 실행하지 않는 한(R010 Sensitive Path Handling상 `.claude/**` 조작은 rm이 아닌 Write/Edit) 이 저장소에는 즉시 영향이 없으나, 향후 무인 루프에 rm이 포함될 경우 이 타임아웃을 전제로 설계해야 합니다.
1463
+ - 2.1.282 CHANGELOG의 harness 관련 항목(예: 2.1.281 "재전송 changed form" resume 결함의 추가 사례 수정)은 별도 이슈에서 2.1.282 섹션으로 다룹니다.
1464
+
1465
+ ---
1466
+
1400
1467
  ## Known Platform Issues & Workarounds
1401
1468
 
1402
1469
  ### Agent tool malformed parsing on long / special-character prompts (#1241)
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.80",
2
+ "version": "1.1.82",
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