oh-my-customcode 1.1.80 → 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 +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/templates/.claude/skills/deep-plan/SKILL.md +8 -0
- package/templates/.claude/skills/pipeline/workflows/auto-dev.yaml +171 -16
- package/templates/.claude/skills/post-release-followup/SKILL.md +2 -0
- package/templates/.claude/skills/professor-triage/SKILL.md +6 -0
- package/templates/manifest.json +1 -1
- package/templates/workflows/auto-dev.yaml +171 -16
package/dist/cli/index.js
CHANGED
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -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
|
|
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
|
|
424
|
-
subsequent delegation prompt, recompute
|
|
425
|
-
<path> | grep -c '^+[^+]'`)
|
|
426
|
-
|
|
427
|
-
|
|
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
|
|
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
|
|
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.
|
|
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 |
|
package/templates/manifest.json
CHANGED
|
@@ -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
|
|
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
|
|
424
|
-
subsequent delegation prompt, recompute
|
|
425
|
-
<path> | grep -c '^+[^+]'`)
|
|
426
|
-
|
|
427
|
-
|
|
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
|
|
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
|
|
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.
|
|
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
|
|