@su-record/vibe 3.2.9 → 3.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CLAUDE.md +2 -2
  2. package/dist/__tests__/stakes-contract.test.js +32 -0
  3. package/dist/__tests__/stakes-contract.test.js.map +1 -1
  4. package/dist/__tests__/stuck-semantics.test.d.ts +2 -0
  5. package/dist/__tests__/stuck-semantics.test.d.ts.map +1 -0
  6. package/dist/__tests__/stuck-semantics.test.js +109 -0
  7. package/dist/__tests__/stuck-semantics.test.js.map +1 -0
  8. package/dist/cli/postinstall/fs-utils.d.ts +18 -1
  9. package/dist/cli/postinstall/fs-utils.d.ts.map +1 -1
  10. package/dist/cli/postinstall/fs-utils.js +42 -0
  11. package/dist/cli/postinstall/fs-utils.js.map +1 -1
  12. package/dist/cli/postinstall/fs-utils.test.js +78 -1
  13. package/dist/cli/postinstall/fs-utils.test.js.map +1 -1
  14. package/dist/cli/postinstall/main.d.ts.map +1 -1
  15. package/dist/cli/postinstall/main.js +5 -1
  16. package/dist/cli/postinstall/main.js.map +1 -1
  17. package/dist/cli/setup/CodexHooks.d.ts +2 -0
  18. package/dist/cli/setup/CodexHooks.d.ts.map +1 -1
  19. package/dist/cli/setup/CodexHooks.js +1 -0
  20. package/dist/cli/setup/CodexHooks.js.map +1 -1
  21. package/dist/cli/setup/CodexHooks.test.js +4 -2
  22. package/dist/cli/setup/CodexHooks.test.js.map +1 -1
  23. package/hooks/scripts/__tests__/.vibe/command-log.txt +3 -3
  24. package/hooks/scripts/__tests__/codex-hook-adapter.test.js +33 -0
  25. package/hooks/scripts/codex-hook-adapter.js +20 -0
  26. package/package.json +1 -1
  27. package/skills/vibe/SKILL.md +4 -4
  28. package/skills/vibe.analyze/SKILL.md +0 -2
  29. package/skills/vibe.review/SKILL.md +0 -14
  30. package/skills/vibe.run/SKILL.md +8 -8
  31. package/skills/vibe.run/references/automation-level.md +51 -0
  32. package/skills/vibe.run/references/coverage-loop.md +94 -0
  33. package/skills/vibe.run/references/process-steps.md +1 -1
  34. package/skills/vibe.spec/SKILL.md +0 -2
  35. package/vibe/rules/loop-contract.md +11 -2
  36. package/skills/vibe.run/references/ralph-loop.md +0 -173
  37. package/skills/vibe.run/references/ultrawork-mode.md +0 -151
@@ -29,8 +29,10 @@ describe('CodexHooks', () => {
29
29
  const localHooksPath = path.join(REPO_ROOT, '.codex', 'hooks.json');
30
30
  it.skipIf(!fs.existsSync(localHooksPath))('local .codex/hooks.json is in sync with what installProjectCodexHooks would generate', () => {
31
31
  const committed = JSON.parse(fs.readFileSync(localHooksPath, 'utf-8'));
32
- // Verify structure: all 5 events present with adapter command
33
- const events = ['SessionStart', 'UserPromptSubmit', 'PreToolUse', 'PostToolUse', 'Stop'];
32
+ // Verify structure: every registered event present with adapter command
33
+ const events = [
34
+ 'SessionStart', 'UserPromptSubmit', 'PreToolUse', 'PostToolUse', 'Stop', 'PreCompact',
35
+ ];
34
36
  for (const event of events) {
35
37
  const cmd = committed.hooks[event][0].hooks[0].command;
36
38
  expect(cmd).toContain('codex-hook-adapter.js');
@@ -1 +1 @@
1
- {"version":3,"file":"CodexHooks.test.js","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CodexHooks.test.js","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- [2026-07-26T20:30:54.627Z] rm -rf /
2
- [2026-07-26T20:30:54.745Z] ls -la
3
- [2026-07-26T20:30:54.863Z] rm -rf src/infra/lib/evolution/
1
+ [2026-07-26T21:05:20.483Z] rm -rf /
2
+ [2026-07-26T21:05:20.609Z] ls -la
3
+ [2026-07-26T21:05:20.727Z] rm -rf src/infra/lib/evolution/
@@ -28,4 +28,37 @@ describe('codex-hook-adapter', () => {
28
28
  expect(output.hookSpecificOutput.permissionDecision).toBe('deny');
29
29
  expect(output.hookSpecificOutput.permissionDecisionReason).toContain('Deleting root or home directory');
30
30
  });
31
+
32
+ /**
33
+ * Codex 에는 CC 의 context_window_* Notification 등가물이 없어, PreCompact 를
34
+ * 붙이기 전까지 압축 전 체크포인트가 아예 저장되지 않았다.
35
+ */
36
+ it('handles PreCompact without failing or injecting context', () => {
37
+ const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-codex-precompact-'));
38
+
39
+ const result = spawnSync(process.execPath, [ADAPTER, 'PreCompact'], {
40
+ cwd,
41
+ input: JSON.stringify({ cwd }),
42
+ encoding: 'utf-8',
43
+ timeout: 30000,
44
+ });
45
+
46
+ expect(result.status).toBe(0);
47
+ // 압축 직전에 컨텍스트를 더 늘리면 역효과 — stdout 주입이 없어야 한다
48
+ expect(result.stdout.trim()).toBe('');
49
+ });
50
+
51
+ it('ignores unknown events instead of erroring', () => {
52
+ const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'vibe-codex-unknown-'));
53
+
54
+ const result = spawnSync(process.execPath, [ADAPTER, 'SubagentStop'], {
55
+ cwd,
56
+ input: JSON.stringify({ cwd }),
57
+ encoding: 'utf-8',
58
+ timeout: 10000,
59
+ });
60
+
61
+ expect(result.status).toBe(0);
62
+ expect(result.stdout.trim()).toBe('');
63
+ });
31
64
  });
@@ -116,6 +116,23 @@ function handleStop() {
116
116
  // Turn-complete side effects stay on Codex notify to avoid duplicate commits.
117
117
  }
118
118
 
119
+ /**
120
+ * PreCompact → context-save.
121
+ *
122
+ * CC 는 `Notification` 의 context_window_80/90/95 matcher 로 임계치마다 저장한다.
123
+ * Codex 에는 그 알림이 없어 압축 전 체크포인트가 아예 저장되지 않았다 — 압축으로
124
+ * 컨텍스트가 날아가도 복원 지점이 없었다.
125
+ *
126
+ * PreCompact 는 임계치 추정이 아니라 "지금 압축한다"는 확정 신호라 오히려 정확하다.
127
+ * urgency 는 `high` — 압축이 임박했으므로 medium 보다 강하되, 세션 종료 직전은
128
+ * 아니므로 critical 은 아니다. context-save 자체가 30s 디바운스를 가지므로
129
+ * 연속 압축에도 중복 저장되지 않는다.
130
+ */
131
+ function handlePreCompact() {
132
+ runScript('context-save.js', ['high']);
133
+ // stdout 주입 없음 — 압축 직전에 컨텍스트를 더 늘리는 것은 역효과다.
134
+ }
135
+
119
136
  switch (eventName) {
120
137
  case 'SessionStart':
121
138
  writeAdditionalContext(combinedOutput(runScript('session-start.js')));
@@ -132,6 +149,9 @@ switch (eventName) {
132
149
  case 'Stop':
133
150
  handleStop();
134
151
  break;
152
+ case 'PreCompact':
153
+ handlePreCompact();
154
+ break;
135
155
  default:
136
156
  break;
137
157
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@su-record/vibe",
3
- "version": "3.2.9",
3
+ "version": "3.2.11",
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",
@@ -77,13 +77,13 @@ user-invocable: true
77
77
 
78
78
  ### Phase 1-b: Stakes 분류 (태스크 무게)
79
79
 
80
- 의도와 별개로 태스크의 **무게(stakes)** 를 분류한다 — 매핑 SSOT: `vibe/rules/loop-contract.md`의 Stakes 표.
80
+ 의도와 별개로 태스크의 **무게(stakes)** 를 분류한다 — 매핑 SSOT: `vibe/rules/loop-contract.md`의 Stakes 표. 아래 표는 디스패처가 다른 파일을 로드하지 않고 판정할 수 있도록 둔 사본이며, **SSOT 와 문구가 어긋나면 SSOT 가 이긴다** (드리프트는 `stakes-contract.test.ts` 가 CI 에서 차단한다).
81
81
 
82
82
  | stakes | 판정 신호 | 적용 프로파일 |
83
83
  |---|---|---|
84
84
  | `demo` | 명시 키워드(데모·일회성·실험·테스트용·throwaway·토이), 닫힌 표현(그냥·간단히·빠르게·한 줄만·quick·just — 보조 신호), 기존 프로젝트 코드와 무관한 신규 폴더, `.vibe/config.json` 없는 임시 디렉토리 | `--max-iter 1` + 리뷰 1패스 + **검증 스크립트 신규 생성 금지** |
85
- | `prototype` | 검증용 초기 버전 명시, 배포 대상 아님 | demo 와 동일 프로파일 |
86
- | `production` | 기본값 — 신호 없음 | 기존 기본 동작 (수렴 루프, 기본 리뷰어 셋) |
85
+ | `prototype` | 검증용 초기 버전 명시, 유지보수 가능성 있으나 배포 대상 아님 | demo 와 동일 프로파일 |
86
+ | `production` | 기본값 — 신호 없음·**상충 포함** | 기존 기본 동작 (수렴 루프, 기본 리뷰어 셋) |
87
87
 
88
88
  - **불확실하면 상향한다** (production). 신호가 상충하면 SPEC 승인 메시지에 stakes 확인 질문 1개를 편승시킨다 — 별도 확인 왕복을 만들지 않는다.
89
89
  - **닫힌 표현은 보조 신호** — 기존 프로젝트 코드 위 작업에서 닫힌 표현만 있으면(명시 키워드·임시 디렉토리 없음) 단독 하향하지 않고 상충으로 간주해 편승 질문으로 확정한다 (SSOT: `vibe/rules/loop-contract.md`).
@@ -180,7 +180,7 @@ Phase 4: /vibe.verify → 검증
180
180
  각 phase 종료 후 JUDGE 단계:
181
181
  - 게이트 통과 (P1=0 ∧ verifyPassed) → 루프 종료, Phase 5 보고
182
182
  - 게이트 미통과 → RECORD(run-ledger + loop-history.jsonl) 후 다음 ANCHOR로
183
- - stuck(연속 2회 동일 findings 해시) → `automationLevel: confirm`이면 사용자 질문; `autonomous`이면 TODO 기록 후 루프 종료
183
+ - stuck(연속 2회 동일 findings 해시) → **어느 automationLevel 에서도 루프를 종료한다.** `confirm`이면 사용자 질문, `autonomous`이면 질문 없이 TODO 기록 후 다음 독립 단위로. 미달을 완료로 기록하지 않는다 (SSOT: `vibe/rules/loop-contract.md` stuck 절)
184
184
  - max_iterations(기본 10) 도달 → 잔여를 인박스로 이월
185
185
 
186
186
  ### Phase 5: 종료 보고
@@ -95,8 +95,6 @@ Each mode has a weighted completeness checklist. Score = sum(checked items × we
95
95
 
96
96
  ---
97
97
 
98
- ARGUMENTS: $ARGUMENTS
99
-
100
98
  ## Done Criteria
101
99
 
102
100
  - [ ] The report records the target and selected mode.
@@ -293,20 +293,6 @@ definitions, index/update behavior, output paths, and completion criteria.
293
293
 
294
294
  ---
295
295
 
296
- ARGUMENTS: $ARGUMENTS
297
-
298
- ## 리뷰어 스케일링
299
-
300
- Stakes SSOT는 `vibe/rules/loop-contract.md` Stakes 표다.
301
-
302
- | stakes | 변경 파일 | reviewer set |
303
- |---|---|---|
304
- | demo | ≤5 | correctness + security 2종 |
305
- | demo / prototype | >5 또는 prototype | correctness + security + data-integrity 3종 |
306
- | production | any | Core Reviewers 전체 |
307
-
308
- Production Core Reviewers는 `security-reviewer`와 `code-reviewer`의 다음 focus를 모두 유지한다: `focus: correctness`, `focus: data-integrity`, `focus: performance`, `focus: architecture`, `focus: complexity`, `focus: git-history`, `focus: test-coverage`.
309
-
310
296
  ## Done Criteria
311
297
 
312
298
  - [ ] Every finding has P1/P2/P3 severity and `file:line` evidence.
@@ -119,7 +119,7 @@ After implementing each scenario, **automatic verification**:
119
119
  ## **ULTRAWORK Mode** (ulw) — deprecated alias
120
120
 
121
121
  > 루프 시맨틱은 `vibe/rules/loop-contract.md`를 따른다. `ultrawork`/`ulw`는 `automationLevel: autonomous` + 병렬 ACT의 deprecated 별칭이다.
122
- > 전체 Boulder Loop 다이어그램, automation level 정의, confirmation matrix: `references/ultrawork-mode.md`
122
+ > `autonomous`가 vibe.run 안에서 구체적으로 바꾸는 것: `references/automation-level.md`
123
123
 
124
124
  `ultrawork` 또는 `ulw` 포함 시 vibe.run-specific 동작:
125
125
  - 병렬 탐색 — 하네스의 네이티브 서브에이전트를 **동시 슬롯 한도까지** 스폰 (CC: 한 메시지에 3개 이상). 슬롯이 부족하면 개수를 줄이거나 순차 실행하되 탐색 항목을 버리지 않는다
@@ -142,16 +142,16 @@ After implementing each scenario, **automatic verification**:
142
142
 
143
143
  Every `/vibe.run` invocation must explicitly initialize `.vibe/metrics/run-ledger.json` (fields: `runStarted`, `runFeature`, `verifyPassed`, `verifyAt`) and reset `verifyPassed` to `false`. Before completion, invoke `/vibe.verify`; its `verify-ledger.js` step must record `verifyPassed`, `verifyAt`, and command evidence, then read the ledger back and enforce `verifyPassed === true && verifyAt > runStarted`. Stop/auto-commit hooks may warn or short-circuit this sequence when available, but they are acceleration only and never the correctness basis.
144
144
 
145
- ### Interactive Checkpoints
145
+ ### Interactive Checkpoints (`--interactive` 전용)
146
146
 
147
- Checkpoints are decision gates inserted at critical points. At L3/L4, most are **auto-resolved** using the default option.
147
+ > ⚠️ **기본 실행에서는 발화하지 않는다.** SPEC 승인이 유일한 의무적 사람 개입이라는 loop-contract 계약을 깨지 않기 위해, 아래 체크포인트는 사용자가 `--interactive` 를 준 경우에만 사람에게 묻는다. 그 외에는 표의 기본 옵션으로 **자동 해소하고 기록만 남긴다** (`automationLevel` 값과 무관).
148
148
 
149
- | Type | When It Fires | Default Option |
149
+ | Type | 발화 시점 | 기본 옵션 |
150
150
  |------|--------------|----------------|
151
- | `requirements_confirm` | Before starting Phase 1 | Confirm (a) |
152
- | `architecture_choice` | When architecture approach is ambiguous | Clean/balanced (b) |
153
- | `implementation_scope` | Before any large scope change (6+ files) | Approve (a) |
154
- | `fix_strategy` | When critical issues are found during quality gate | Fix all (a) |
151
+ | `requirements_confirm` | Phase 1 시작 전 | Confirm (a) |
152
+ | `architecture_choice` | 아키텍처 접근이 모호할 | Clean/balanced (b) |
153
+ | `implementation_scope` | 범위 변경 (6+ 파일) | Approve (a) |
154
+ | `fix_strategy` | 품질 게이트에서 critical 발견 | Fix all (a) |
155
155
 
156
156
  Checkpoint format example:
157
157
  ```
@@ -0,0 +1,51 @@
1
+ # Automation Level — vibe.run 자율성 축
2
+
3
+ > vibe.run SKILL.md 에서 `automationLevel` 동작이 필요할 때 로드한다.
4
+ >
5
+ > **SSOT는 `vibe/rules/loop-contract.md`다.** 이 파일은 그 계약이 vibe.run 안에서
6
+ > 구체적으로 무엇을 바꾸는지만 설명한다. 값·별칭·exit 조건을 여기서 새로 정의하지 않는다.
7
+
8
+ ## 값은 둘뿐이다
9
+
10
+ | `automationLevel` | 사람 개입 |
11
+ |---|---|
12
+ | `confirm` (기본) | SPEC 승인 1회 + stuck 시 질문 |
13
+ | `autonomous` | SPEC 승인·stuck 질문 모두 skip |
14
+
15
+ > ⚠️ **stuck 은 두 값 모두에서 루프를 종료한다.** `autonomous` 가 바꾸는 것은 "사람에게 묻는지" 뿐이며, stuck 난 루프를 더 돌린다는 뜻이 아니다 (2회 연속 동일 발견은 정의상 재시도가 무의미). 미달은 TODO 로 남기고 다음 독립 단위로 넘어가며, **완료로 기록하지 않는다.** SSOT: `vibe/rules/loop-contract.md` stuck 절.
16
+
17
+ `.vibe/config.json` 에서 설정한다. 루프 자체(ANCHOR→ACT→JUDGE→RECORD)는 두 값에서
18
+ **동일하게** 돌아간다 — automationLevel 은 루프의 유무가 아니라 **질문 여부**를 바꾼다.
19
+
20
+ > ⛔ L0/L1/L4 같은 레벨 체계는 없다. 과거 이 문서가 5단계 레벨과 confirmation matrix 를
21
+ > 정의했지만 loop-contract 에 그런 값은 존재하지 않았다 — 실행할 수 없는 스펙이었다.
22
+ > `manual`/`guided`/`full-auto` 를 요구하는 지시를 만나면 위 두 값으로 환원한다.
23
+
24
+ ## `autonomous` 가 vibe.run 에서 바꾸는 것
25
+
26
+ | 항목 | `confirm` | `autonomous` |
27
+ |---|---|---|
28
+ | stuck 처리 | **루프 종료** + 사용자에게 질문 | **루프 종료** + TODO 기록 후 다음 시나리오 (질문 없음) |
29
+ | ACT 병렬화 | 순차 허용 | 서로 의존하지 않는 시나리오 병렬 |
30
+ | 컨텍스트 85%+ | 경고 | 자동 저장 |
31
+ | 외부 LLM (GPT/Antigravity) | 명시 요청 시 | 활성화돼 있으면 자동 상담 |
32
+ | Race Review | 명시 요청 시 | 기본 활성 |
33
+
34
+ **바뀌지 않는 것**: 시나리오 단위 구현→검증 원자성. `autonomous` 라도 여러 시나리오를
35
+ 묶어 빅뱅으로 만들지 않는다 (SSOT: SKILL.md "하네스-안전 증분").
36
+
37
+ ## 파괴적 작업은 자율성과 무관하다
38
+
39
+ `autonomous` 는 **파일 수정·테스트 실행**의 확인을 없애는 것이고, 아래는 어느 값에서도
40
+ 사람 확인을 받는다:
41
+
42
+ - push / release / 배포 / 버전 범프 — 루프의 권한 밖 (loop-contract "금지")
43
+ - 되돌리기 어려운 삭제, 외부 발송
44
+
45
+ ## Deprecated 별칭
46
+
47
+ 매핑 SSOT 는 `vibe/rules/loop-contract.md` 의 Deprecated 별칭 표다.
48
+ **여기에 요약도 두지 않는다** — 별칭을 만나면 그 표를 읽어서 환원한다.
49
+
50
+ > WHY: 이 자리에 요약을 두었더니 `quick` 의 "최소 JUDGE" 가 빠지고 `ralplan` 이 아예
51
+ > 누락돼 SSOT 와 어긋났다. 부분 요약은 전체 사본보다 드리프트를 알아채기 어렵다.
@@ -0,0 +1,94 @@
1
+ # Coverage Loop — RTM 기반 완료 판정
2
+
3
+ > vibe.run SKILL.md 에서 RTM/커버리지 검증이 필요할 때 로드한다.
4
+ >
5
+ > **루프 시맨틱(ANCHOR/ACT/JUDGE/RECORD/stuck/max_iterations)의 SSOT 는
6
+ > `vibe/rules/loop-contract.md` 다.** 이 파일은 vibe.run 의 JUDGE 를 RTM 커버리지로
7
+ > 구체화하는 방법만 다룬다.
8
+
9
+ ## 문제와 해법
10
+
11
+ 모델은 구현이 부분적일 때도 "완료"라고 보고한다. 그래서 완료 판정을 자기보고가 아니라
12
+ **RTM 커버리지 수치**에 맡긴다 — JUDGE 기준은 `coveragePercent === 100`.
13
+
14
+ > ⚠️ **"루프 종료" ≠ "feature 완료".** stuck·max_iterations 로 루프가 끝나도 커버리지가
15
+ > 100% 미만이면 **미달로 기록**한다. 미달을 완료로 표기하는 것은 이 게이트의 존재 이유를
16
+ > 무효화한다 — 그게 바로 막으려던 자기보고다.
17
+
18
+ ```
19
+ 모든 phase 종료
20
+
21
+ (stuck 판정은 커버리지 수치가 아니라 **발견 해시**로 한다 — 커버리지가 그대로여도
22
+ 남은 항목이 달라졌으면 진전이 있는 것이고, 반대로 커버리지가 올라도 같은 발견이
23
+ 반복되면 막힌 것이다. SSOT: loop-contract stuck 절)
24
+
25
+ RTM 생성 → coveragePercent, uncoveredRequirements[]
26
+
27
+ 100%? ──YES──→ 완료 (최종 RTM 보고)
28
+
29
+ NO
30
+
31
+ uncoveredRequirements 를 구현 → RTM 재생성
32
+
33
+ stuck? (연속 2회 동일 발견(discover/findings) 해시 — loop-ledger.js check-stuck)
34
+ ├─ confirm → 루프 종료 + 사용자 질문 (값 제공 / sub-100 승인 / 중단)
35
+ └─ autonomous → 루프 종료 + 미달 커버리지를 TODO 로 기록 (질문 없음)
36
+
37
+ max_iterations(기본 10) 도달 → 잔여 인박스 이월
38
+ ```
39
+
40
+ ## RTM 생성
41
+
42
+ ```bash
43
+ node -e "import('{{VIBE_PATH_URL}}/node_modules/@su-record/vibe/dist/tools/index.js').then(t => { const r = t.generateTraceabilityMatrix('{feature-name}', {projectPath: process.cwd()}); console.log(JSON.stringify(r, null, 2)); })"
44
+ ```
45
+
46
+ `generateTraceabilityMatrix` 는 동기 함수다 — 반환값에 `.then()` 을 쓰지 않는다.
47
+
48
+ > SPEC 기본 경로는 `.vibe/specs/<feature>.md` (레거시 프로젝트는 `.claude/vibe/specs/`
49
+ > → `.claude/specs/` 로 폴백).
50
+ > **`status === 'empty'` 는 게이트 실패/판정불가로 취급한다 — 절대 100% 통과로 읽지 않는다.**
51
+
52
+ ## RTM 지표
53
+
54
+ | 지표 | 의미 |
55
+ |---|---|
56
+ | `totalRequirements` | SPEC 의 REQ-* 총 개수 |
57
+ | `specCovered` | SPEC 매핑이 있는 요구사항 |
58
+ | `featureCovered` | Feature 시나리오가 있는 요구사항 |
59
+ | `testCovered` | 테스트 파일이 있는 요구사항 |
60
+ | `coveragePercent` | 전체 커버리지 |
61
+ | `uncoveredRequirements` | 누락된 REQ-* 목록 |
62
+
63
+ ## 루프 규칙
64
+
65
+ | 규칙 | 내용 |
66
+ |---|---|
67
+ | 범위 축소 금지 | "간단히 구현했다"/"기본 버전" 으로 끝내지 않는다 — 요청 전체를 구현한다 |
68
+ | 갭 목록은 RTM 이 준다 | `uncoveredRequirements` 배열을 쓴다. 수동 대조하지 않는다 |
69
+ | 반복 표시 | 진행 상황에 회전 번호를 표시한다 |
70
+ | 수확 체감 | 3회전 이후는 핵심 요구사항(REQ-*-001~003) 우선, P2/P3 는 계속하되 후순위 |
71
+
72
+ ## 금지 표현
73
+
74
+ 커버리지 미달을 완료로 포장하는 문장들 — 발견하면 그 자리에서 구현으로 대체한다.
75
+
76
+ | 쓰지 않는다 | 대신 |
77
+ |---|---|
78
+ | "기본 버전을 구현했다" | 전체 버전을 구현한다 |
79
+ | "단순화된 접근이다" | 명세대로 구현한다 |
80
+ | "X 는 나중에 추가할 수 있다" | X 를 지금 추가한다 |
81
+ | "데모 목적으로는" | 프로덕션 수준으로 구현한다 |
82
+ | "핵심 기능은 완료됐다" | 모든 기능이 완료돼야 한다 |
83
+
84
+ ## 출력 형식
85
+
86
+ 회전마다 아래를 보고한다 (RTM 원본을 그대로 덤프하지 않는다):
87
+
88
+ ```
89
+ Coverage [회전 N]: {coveragePercent}% (spec {specCovered}/{total} · feature {featureCovered}/{total} · test {testCovered}/{total})
90
+ Uncovered: REQ-login-004, REQ-login-007
91
+ → 미달 — uncovered 구현 진행
92
+ ```
93
+
94
+ 100% 도달 시 build/test 결과를 함께 붙이고 RTM 저장 경로를 보고한다.
@@ -162,7 +162,7 @@ Auto-update scenario status with `Last verified` timestamp and quality score.
162
162
 
163
163
  ### 8. Coverage Verification Loop (RTM)
164
164
 
165
- > 루프 시맨틱은 `vibe/rules/loop-contract.md`를 따른다. 여기서의 exit 기준은 `coveragePercent === 100`. RTM 다이어그램, 출력 형식, 반복 규칙: `references/ralph-loop.md`
165
+ > 루프 시맨틱은 `vibe/rules/loop-contract.md`를 따른다. 여기서의 exit 기준은 `coveragePercent === 100`. RTM 다이어그램, 출력 형식, 반복 규칙: `references/coverage-loop.md`
166
166
 
167
167
  After ALL phases complete:
168
168
 
@@ -83,8 +83,6 @@ trace(`/vibe.trace`)·contract(`/vibe.contract`) 는 사용자가 요청하거
83
83
 
84
84
  ---
85
85
 
86
- ARGUMENTS: $ARGUMENTS
87
-
88
86
  ## Bundled implementation
89
87
 
90
88
 
@@ -31,7 +31,16 @@
31
31
  종료 권한은 테스트 exit code·run-ledger·RTM 같은 **결정론적 Judge**에만 있다. Model Judge는 누락·모순·위험을 발견하는 보조 수단이며, 발견을 테스트나 관측 가능한 기준으로 내리기 전에는 차단 근거가 아니다. Human Taste는 공개·배포 시점의 사람 판단으로 남고 루프의 완료 상태를 변경하지 않는다.
32
32
 
33
33
  ### stuck (결정론)
34
- 연속 2회 회전의 발견(discover/findings) 해시가 동일 → 중단하고 사람에게 (`loop-ledger.js check-stuck`이 판정·기록). "다시 해보면 될 것 같다"는 모델 판단으로 무시 금지.
34
+ 연속 2회 회전의 발견(discover/findings) 해시가 동일 → **그 루프는 종료한다** (`loop-ledger.js check-stuck`이 판정·기록). "다시 해보면 될 것 같다"는 모델 판단으로 무시 금지.
35
+
36
+ **stuck 은 루프 종료이고, 그 다음 행동은 `automationLevel` 이 결정한다** — 이 둘을 섞지 말 것:
37
+
38
+ | | 루프 | 사람에게 질문 | 그 다음 |
39
+ |---|---|---|---|
40
+ | `confirm` | 종료 | **한다** (값 채우기 / sub-100 승인 / 중단) | 사용자 응답에 따름 |
41
+ | `autonomous` | 종료 | 하지 않음 | TODO 기록 후 **다음 독립 작업 단위로** 진행 (비대화형) |
42
+
43
+ > `autonomous` 의 "계속" 은 **stuck 난 루프를 더 돌린다는 뜻이 아니다** — 2회 연속 동일 발견은 정의상 재시도가 무의미하다. 같은 목표를 붙잡지 않고 다음 단위로 넘어간다는 뜻이며, 미달은 TODO/인박스에 남는다. 미달 상태를 **완료로 기록하지 않는다.**
35
44
 
36
45
  ## 파라미터 (기본값)
37
46
 
@@ -41,7 +50,7 @@
41
50
  | `exit` | 게이트 통과 (P1=0 ∧ verifyPassed) | 종료 기준. coverage 100% 등으로 상향 가능 |
42
51
  | `--interactive` | off | 단계별 확인 모드 (회전마다 사람 승인 — 과거의 기본값) |
43
52
  | `--max-iter N` | — | 회전 상한 명시 (N=1이면 1회 시도) |
44
- | `automationLevel` | `confirm` | `confirm`(SPEC·stuck에서 질문) / `autonomous`(기록 후 계속, 비대화형) — `.vibe/config.json` |
53
+ | `automationLevel` | `confirm` | `confirm`(SPEC·stuck에서 질문) / `autonomous`(질문 없이 TODO 기록 후 다음 단위로, 비대화형) — `.vibe/config.json`. **어느 값에서도 stuck 은 루프를 종료한다** (위 stuck 절) |
45
54
  | `stakes` | `production` | 태스크 무게. `demo` / `prototype` / `production` — 아래 매핑이 SSOT |
46
55
 
47
56
  ## Stakes — 태스크 무게 비례 실행 (SSOT)
@@ -1,173 +0,0 @@
1
- # Ralph Loop — Coverage Verification Reference
2
-
3
- > Loaded by vibe.run SKILL.md for RTM/coverage verification. **루프 시맨틱(ANCHOR/ACT/JUDGE/RECORD/stuck/max_iterations)의 SSOT는 `vibe/rules/loop-contract.md`다.** 이 파일은 vibe.run-specific한 RTM 기반 커버리지 검증 메커니즘을 문서화한다.
4
- >
5
- > `ralph`는 loop-contract의 deprecated 별칭으로, "exit: coverage-100"이 설정된 기본 루프와 동일하다. 더 이상 별도 모드가 아니다.
6
-
7
- ## Coverage Verification Loop
8
-
9
- > **Inspired by [ghuntley.com/ralph](https://ghuntley.com/ralph)**: "Deterministically bad in an undeterministic world" — Keep iterating until TRULY complete.
10
-
11
- **Problem**: AI often claims "complete" when implementation is partial.
12
-
13
- **Solution**: RTM-based automated coverage verification — loop-contract의 JUDGE 기준은 `coveragePercent === 100`.
14
-
15
- ```
16
- ┌─────────────────────────────────────────────────────────────────┐
17
- │ COVERAGE VERIFICATION LOOP (loop-contract + RTM) │
18
- │ │
19
- │ After ALL phases complete: │
20
- │ │
21
- │ ┌──────────────────────────────────────────────────────────┐ │
22
- │ │ RTM COVERAGE VERIFICATION [Iteration {{ITER}}/{{MAX}}] │ │
23
- │ │ │ │
24
- │ │ Generate RTM via core tools: │ │
25
- │ │ → generateTraceabilityMatrix("{feature-name}") │ │
26
- │ │ │ │
27
- │ │ Coverage Metrics (automated): │ │
28
- │ │ □ Requirements coverage: {coveragePercent}% │ │
29
- │ │ □ SPEC → Feature mapping: {featureCovered}/{total} │ │
30
- │ │ □ Feature → Test mapping: {testCovered}/{total} │ │
31
- │ │ □ Build successful? │ │
32
- │ │ □ Tests passing? │ │
33
- │ │ │ │
34
- │ │ UNCOVERED: {uncoveredRequirements[]} │ │
35
- │ └──────────────────────────────────────────────────────────┘ │
36
- │ │ │
37
- │ ┌──────────┴──────────┐ │
38
- │ │ Coverage == 100%? │ │
39
- │ └──────────┬──────────┘ │
40
- │ │ │ │
41
- │ NO YES │
42
- │ │ │ │
43
- │ ↓ ↓ │
44
- │ ┌────────────────┐ ┌────────────────┐ │
45
- │ │ IMPLEMENT │ │ TRULY DONE │ │
46
- │ │ UNCOVERED │ │ │ │
47
- │ │ REQUIREMENTS │ │ Report final │ │
48
- │ │ (auto-extract) │ │ RTM coverage │ │
49
- │ └───────┬────────┘ └────────────────┘ │
50
- │ │ │
51
- │ └──────────→ [Re-generate RTM] │
52
- │ │
53
- │ │ │
54
- │ ↓ │
55
- │ stuck? (loop-ledger.js check-stuck: 연속 2회 동일 커버리지) │
56
- │ │ │
57
- │ ├─ automationLevel confirm: Ask user │
58
- │ │ 1. Provide resolution → retry │
59
- │ │ 2. "proceed" → TODO + done │
60
- │ │ 3. "abort" → stop │
61
- │ └─ automationLevel autonomous: TODO + done │
62
- │ │
63
- │ max_iterations 기본 10 — 도달 시 잔여 인박스 이월 │
64
- │ ZERO TOLERANCE for silent scope reduction │
65
- └─────────────────────────────────────────────────────────────────┘
66
- ```
67
-
68
- ## RTM Invocation
69
-
70
- ```bash
71
- # Generate RTM for coverage verification (generateTraceabilityMatrix is synchronous — no .then())
72
- node -e "import('{{VIBE_PATH_URL}}/node_modules/@su-record/vibe/dist/tools/index.js').then(t => { const r = t.generateTraceabilityMatrix('{feature-name}', {projectPath: process.cwd()}); console.log(JSON.stringify(r, null, 2)); })"
73
- ```
74
-
75
- > **Note:** Default SPEC path is `.vibe/specs/<feature>.md` (falls back to `.claude/vibe/specs/` then `.claude/specs/` for legacy projects).
76
- > `status === 'empty'` means the gate MUST be treated as failed/not-applicable, never as 100% pass.
77
-
78
- ## RTM Metrics
79
-
80
- | Metric | Description |
81
- |--------|-------------|
82
- | `totalRequirements` | Total REQ-* items in SPEC |
83
- | `specCovered` | Requirements with SPEC mapping |
84
- | `featureCovered` | Requirements with Feature scenarios |
85
- | `testCovered` | Requirements with test files |
86
- | `coveragePercent` | Overall coverage percentage |
87
- | `uncoveredRequirements` | List of missing REQ-* IDs |
88
-
89
- ## Coverage Loop Rules
90
-
91
- | Rule | Description |
92
- |------|-------------|
93
- | **No Scope Reduction** | Never say "simplified" or "basic version" — implement FULL request |
94
- | **Iteration Tracking** | Display `[{{ITER}}]` to show progress; max_iterations 기본 10 |
95
- | **RTM-Based Gap List** | Use `uncoveredRequirements` array — no manual comparison |
96
- | **Coverage Threshold** | JUDGE: `coveragePercent === 100` → exit (loop-contract exit=coverage-100) |
97
- | **Stuck Handling** | `loop-ledger.js check-stuck`: 연속 2회 동일 커버리지 → confirm이면 질문; autonomous이면 TODO + done |
98
- | **Diminishing Returns** | Iteration 3+ → focus on core requirements (REQ-*-001~003) first; P2/P3 continue but lower priority |
99
-
100
- ## Ralph Loop Output Format
101
-
102
- ```
103
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
104
- RALPH VERIFICATION [Iteration 1]
105
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
106
-
107
- RTM Coverage Report: login
108
-
109
- Requirements Traceability:
110
- Total Requirements: 9
111
- SPEC Covered: 9/9 (100%)
112
- Feature Covered: 5/9 (55%)
113
- Test Covered: 4/9 (44%)
114
-
115
- REQ-login-001: Login form UI → Scenario 1 → login.test.ts
116
- REQ-login-002: Email validation → Scenario 2 → validation.test.ts
117
- REQ-login-003: Password validation → Scenario 2 → validation.test.ts
118
- REQ-login-004: Remember me checkbox → NOT IMPLEMENTED
119
- REQ-login-005: Forgot password link → NOT IMPLEMENTED
120
- REQ-login-006: API integration → Scenario 3 → api.test.ts
121
- REQ-login-007: Loading state → NOT IMPLEMENTED
122
- REQ-login-008: Error toast → NOT IMPLEMENTED
123
- REQ-login-009: Session storage → Scenario 4 → (no test)
124
-
125
- Overall Coverage: 55% BELOW 100% TARGET
126
-
127
- UNCOVERED REQUIREMENTS (auto-extracted from RTM):
128
- 1. REQ-login-004: Remember me checkbox
129
- 2. REQ-login-005: Forgot password link
130
- 3. REQ-login-007: Loading state
131
- 4. REQ-login-008: Error toast notifications
132
-
133
- NOT COMPLETE — Implementing uncovered requirements...
134
-
135
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
136
- RALPH VERIFICATION [Iteration 2]
137
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
138
-
139
- RTM Coverage Report: login
140
-
141
- Requirements Traceability:
142
- Total Requirements: 9
143
- SPEC Covered: 9/9 (100%)
144
- Feature Covered: 9/9 (100%)
145
- Test Covered: 9/9 (100%)
146
-
147
- Overall Coverage: 100% TARGET REACHED
148
-
149
- Build: Passed
150
- Tests: 12/12 Passed
151
- Type Check: No errors
152
-
153
- RALPH VERIFIED COMPLETE!
154
-
155
- RTM saved: .vibe/rtm/login-rtm.md
156
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
157
- ```
158
-
159
- ## When to Trigger Coverage Loop
160
-
161
- 1. After all phases complete (기본 동작 — 별도 키워드 불필요)
162
- 2. Before final quality report
163
- 3. `ralph` 별칭 감지 시 — 기본 동작과 동일, exit=coverage-100으로 해석
164
-
165
- ## Forbidden Responses (VIOLATIONS)
166
-
167
- | NEVER Say | Instead |
168
- |-----------|---------|
169
- | "I've implemented a basic version" | Implement the FULL version |
170
- | "This is a simplified approach" | Implement as specified |
171
- | "You can add X later" | Add X now |
172
- | "For demonstration purposes" | Implement production-ready |
173
- | "The core functionality is done" | ALL functionality must be done |