@su-record/vibe 3.2.33 → 3.2.35

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vibe",
3
3
  "displayName": "Vibe",
4
- "version": "3.2.33",
4
+ "version": "3.2.35",
5
5
  "description": "Verification harness for AI coding agents — \"done\" is decided by deterministic gates (test exit codes, run-ledger, regression memory), not the model self-report.",
6
6
  "author": {
7
7
  "name": "su-record",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibe",
3
- "version": "3.2.33",
3
+ "version": "3.2.35",
4
4
  "description": "Verification harness for AI coding agents — \"done\" is decided by deterministic gates (test exit codes, run-ledger, regression memory), not the model self-report.",
5
5
  "author": {
6
6
  "name": "su-record",
package/CLAUDE.md CHANGED
@@ -113,6 +113,17 @@ Legacy: 기존 `.claude/vibe/` 는 런타임에 자동 인식되며 `vibe init`/
113
113
  - **이중 실행 가드**: 플러그인 훅은 `plugin-hook-entry.js` 를 거친다. 프로젝트에 **vibe 훅**이 있으면 플러그인 쪽이 물러난다 — 없으면 게이트가 2회, Stop auto-commit 도 2회 돈다. 판정은 "훅 키가 있다" 가 아니라 "vibe 훅이 있다" (사용자 자작 훅만 있는 프로젝트에서 침묵하면 설치한 의미가 없다). 실행은 spawn 이 아니라 in-process `import` — 위 훅 실행 모델 규약을 플러그인 경로에서도 지킨다
114
114
  - **배포 트리를 커밋하는 이유**: Claude Code 마켓플레이스는 저장소를 **클론**해서 읽는다. `dist/` 는 gitignore 대상이고 `agents/*.md` 의 frontmatter 는 postinstall 이 만든다 — 저장소를 그대로 가리키면 기능이 빠진 플러그인이 된다(실측: 에이전트 11개 중 7개만, description 없이 로드). `plugins/vibe/` 를 커밋하고 드리프트는 `npm run validate:plugin-tree` 가 막는다. `.gitignore` 의 `dist/` 가 이 트리까지 삼키므로 `!/plugins/vibe/dist/` 예외가 필수다
115
115
 
116
+ ### 폭이 큰 작업 — 네이티브 workflow 로 라우팅 (Claude Code)
117
+ Claude Code 는 `Workflow` 도구(dynamic workflows)를 제공한다 — 한 실행에서 **누적 1000 에이전트**, **동시 min(16, cores-2)**. vibe 의 병렬 ACT 는 그보다 앞서 만든 자체 팬아웃이라 이 상한을 쓰지 않는다.
118
+
119
+ **언제 넘길지**: 독립 작업 단위가 **수십 개 이상**이고(파일별 감사·전면 마이그레이션·다각도 탐색), 중간 결과가 세션 컨텍스트에 쌓이면 안 될 때. 조율 비용은 스크립트 변수로 빠지지만 **에이전트 사용량 자체는 그대로 든다** — 절약되는 것은 조율이지 작업이 아니다.
120
+
121
+ **넘기지 않을 때**: 단위가 한 자릿수, 단계가 진짜로 서로 의존, 매 단계 사람 승인이 필요, 또는 아직 뭘 찾는지 모르는 탐색. 이 경우 워크플로는 순수 오버헤드다.
122
+
123
+ - **자동 라우팅하지 않는다** — 워크플로는 사용자가 명시적으로 옵트인해야 하는 도구다. vibe 는 조건에 맞을 때 **제안만** 하고, 기본은 자체 병렬 ACT 를 유지한다
124
+ - **Codex 에는 등가물이 없다** — 하네스별 능력 차이지 워크플로 분기가 아니다. vibe 코어의 루프 계약은 양쪽에서 동일하게 남는다 (Dual-Harness Doctrine)
125
+ - 넘기더라도 **격리·검증 규정은 그대로** 적용된다 — 파일을 쓰는 병렬 단위는 worktree, 검증자는 독립 컨텍스트
126
+
116
127
  ### Gotchas
117
128
  - `better-sqlite3` WAL mode — synchronous API
118
129
  - `crypto.timingSafeEqual` requires same-length buffers — check length first
@@ -61,7 +61,7 @@
61
61
  ]
62
62
  },
63
63
  {
64
- "matcher": "Edit|Write|Bash|Task|SlashCommand|NotebookEdit",
64
+ "matcher": "Edit|Write|Bash|Agent|Skill|Task|SlashCommand|NotebookEdit",
65
65
  "hooks": [
66
66
  {
67
67
  "type": "command",
package/hooks/hooks.json CHANGED
@@ -66,7 +66,7 @@
66
66
  ]
67
67
  },
68
68
  {
69
- "matcher": "Edit|Write|Bash|Task|SlashCommand|NotebookEdit",
69
+ "matcher": "Edit|Write|Bash|Agent|Skill|Task|SlashCommand|NotebookEdit",
70
70
  "hooks": [
71
71
  {
72
72
  "type": "command",
@@ -61,7 +61,7 @@
61
61
  ]
62
62
  },
63
63
  {
64
- "matcher": "Edit|Write|Bash|Task|SlashCommand|NotebookEdit",
64
+ "matcher": "Edit|Write|Bash|Agent|Skill|Task|SlashCommand|NotebookEdit",
65
65
  "hooks": [
66
66
  {
67
67
  "type": "command",
@@ -2,11 +2,21 @@
2
2
  /**
3
3
  * PostToolUse Hook — 툴콜 스텝 카운터 + 패턴 로거 + 3-fail 감지기
4
4
  *
5
- * hooks.json matcher: "Edit|Write|Bash|Task|SlashCommand|NotebookEdit"
5
+ * hooks.json matcher: "Edit|Write|Bash|Agent|Skill|Task|SlashCommand|NotebookEdit"
6
6
  * → Read/Grep/Glob/WebFetch/WebSearch/TodoWrite/ToolSearch/ListMcpResourcesTool
7
7
  * 는 matcher 단에서 제외되어 이 프로세스 자체가 spawn 되지 않는다.
8
8
  * 아래 READ_ONLY_TOOLS 는 defense-in-depth 용 추가 가드이다.
9
9
  *
10
+ * ⚠️ **툴 이름은 하네스가 바꾼다 — 옛 이름을 지우지 않는다.**
11
+ * 서브에이전트 툴이 `Task` → `Agent` 로 바뀌었는데 matcher 가 옛 이름만 갖고 있어
12
+ * 에이전트 스폰이 **한 건도 집계되지 않고 있었다**(2026-08 실측: 세션 로그 60개에서
13
+ * `Agent` 13회 / `Task` 0회). 슬래시 명령도 `SlashCommand` → `Skill` 로 옮겨갔다
14
+ * (`Skill` 116회 / `SlashCommand` 0회).
15
+ *
16
+ * 이 실패는 조용하다 — 카운터가 에러 없이 0을 센다. 그래서 규칙은 한 방향이다:
17
+ * **과다 매칭은 안전하고(스크립트가 걸러낸다) 과소 매칭은 소리 없이 데이터를 잃는다.**
18
+ * 새 이름은 추가하고 옛 이름은 남긴다 — 구버전 하네스 호환도 같이 얻는다.
19
+ *
10
20
  * 책임 1) 액션 툴콜을 1 스텝으로 집계 → `current-run.json`
11
21
  * ↳ /vibe.verify 가 history.jsonl에 append 후 출력
12
22
  * ↳ recipe-extractor 가 meta(startedAt, steps) 소비
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@su-record/vibe",
3
- "version": "3.2.33",
3
+ "version": "3.2.35",
4
4
  "description": "AI Coding Framework for Claude Code — 7+ agents, 52 skills, multi-LLM orchestration",
5
5
  "type": "module",
6
6
  "main": "dist/cli/index.js",
@@ -219,6 +219,11 @@ After agent results:
219
219
 
220
220
  > P1/P2 findings 를 검증하기 위해 네이티브 서브에이전트를 병렬로 스폰한다 —
221
221
  > `security-reviewer` + `code-reviewer` 인스턴스(서로 다른 focus)가 각 finding 을 교차 검증(validate / upgrade / downgrade / remove)한다.
222
+ >
223
+ > **검증자에게 실행자의 컨텍스트를 넘기지 않는다.** 새 서브에이전트로 스폰하는 것 자체가
224
+ > 이 규정이다 — finding 과 대상 파일만 주고, 리뷰 과정의 대화는 주지 않는다.
225
+ > 같은 컨텍스트를 물려받은 검증자는 검증하지 않고 **자기 자신에게 동의한다**.
226
+ > 그러면 교차 검증은 이름만 남고 단일 리뷰와 같아진다 — 더 비싸고, 통과 신호만 늘어난 채로.
222
227
 
223
228
  > Read `references/worked-examples.md` for the full Review Debate example output.
224
229
 
@@ -100,6 +100,12 @@ test -f DESIGN.md
100
100
  └─────────────────────────────────────────────────────────────────┘
101
101
  ```
102
102
 
103
+ > **병렬 쓰기는 격리 없이 하지 않는다.** 병렬 항목이 **파일을 수정하면** 항목별 worktree 에서 실행한다 (`vibe.git-worktree` 패턴, `vibe.loop` 의 `isolation: worktree` 와 같은 축). 읽기 전용 병렬 탐색은 격리 불필요.
104
+ >
105
+ > WHY: 같은 워킹트리에서 두 에이전트가 쓰면 경합한다 — 파일 덮어쓰기, 공유 git 명령 충돌. 프롬프트로 막을 수 있는 종류가 아니라 **구조로만** 막힌다. 실측 사례: Bun 팀이 대규모 포팅을 여러 에이전트로 팬아웃했을 때 공유 워크스페이스에서 서로를 덮어써 운영상 실패했고, 해결책은 프롬프트가 아니라 그룹별 worktree 분리였다.
106
+ >
107
+ > 팬아웃 전에 답이 있어야 하는 3가지: **어디서 작업하는가 · 결과를 어떻게 병합하는가 · 둘이 충돌하면 어떻게 하는가.** 답이 없으면 병렬로 가지 않는다.
108
+
103
109
  > **하네스-안전 증분 (Dual-Harness Doctrine)**: 시나리오는 **가장 작은 검증 단위**다. 한 시나리오 구현 → 즉시 검증 → 다음. `automationLevel: autonomous`이라도 이 단위는 무너뜨리지 않는다 (병렬은 시나리오 간, 검증은 시나리오별). 전문: `vibe/rules/principles/dual-harness-doctrine.md`.
104
110
 
105
111
  ### Automated Verification (Closed Loop)
@@ -179,7 +185,7 @@ Default: a
179
185
  | 1-1 | Phase Isolation Protocol | 3+ phase SPEC 은 phase 단위 격리 + 체크포인트 필수 |
180
186
  | 1-2 | SPEC-First Gate | SPEC 에 없는 것을 구현하지 않는다 |
181
187
  | 2 | Extract Scenario List | Feature 파일의 시나리오가 작업 단위 |
182
- | 3 | Scenario-by-Scenario Implementation | 기본 순차. **구현→검증 쌍은 시나리오 단위로 쪼개지 않는다**. `autonomous` 에서 서로 의존하지 않는 시나리오는 병렬 가능하되 검증은 시나리오별로 각각 (SSOT: 위 "하네스-안전 증분") |
188
+ | 3 | Scenario-by-Scenario Implementation | 기본 순차. **구현→검증 쌍은 시나리오 단위로 쪼개지 않는다**. `autonomous` 에서 서로 의존하지 않는 시나리오는 병렬 가능하되 검증은 시나리오별로 각각 (SSOT: 위 "하네스-안전 증분"), **병렬 시 격리 필수** (아래) |
183
189
  | 4 | Brand Assets | 신규 프로젝트만 (`references/brand-assets.md`) |
184
190
  | 5 | Race Code Review | `references/race-review.md` |
185
191
  | 6 | Quality Report | 자동 생성 |
@@ -193,4 +193,6 @@ JUDGE는 이번 feature의 **신규 생성 파일** 기준으로 검증 코드
193
193
  | `verify` | 기본 동작과 동일 (no-op) — JUDGE는 항상 결정론 검증 |
194
194
  | `quick` | `--max-iter 1` + 최소 JUDGE |
195
195
  | `ralplan` | 같은 계약을 계획 단계에 적용 |
196
- | `ultrawork` / `ulw` | `automationLevel: autonomous` + 병렬 ACT — 루프 시맨틱이 아니라 자율성·병렬성 |
196
+ | `ultrawork` / `ulw` | `automationLevel: autonomous` + 병렬 ACT — 루프 시맨틱이 아니라 자율성·병렬성 축. **병렬 항목이 파일을 수정하면 항목별 worktree 격리 필수** (`vibe.loop` 의 `isolation` 축과 같은 규칙) |
197
+
198
+ > **폭이 수십 단위를 넘으면** Claude Code 네이티브 `Workflow`(누적 1000 에이전트 / 동시 min(16, cores-2))를 **제안**한다 — 자동 전환하지 않는다. 옵트인 도구이고, 조율 비용만 절약될 뿐 에이전트 사용량은 그대로 든다. Codex 에는 등가물이 없으므로 루프 계약 자체는 양쪽 동일하게 유지한다. 넘기더라도 위의 격리 규정과 검증자 컨텍스트 규정은 그대로 적용된다. 상세: `CLAUDE.md` "폭이 큰 작업 — 네이티브 workflow 로 라우팅".