@su-record/vibe 3.2.8 → 3.2.10

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/CLAUDE.md CHANGED
@@ -42,7 +42,7 @@ No `console.log` in commits · No hardcoded strings/numbers · No commented-out
42
42
  Loop semantics SSOT: `vibe/rules/loop-contract.md` (ANCHOR→ACT→JUDGE→RECORD; exit = gates pass │ stuck │ max_iterations).
43
43
  - **Loop until P1 = 0 AND no new findings** — run/verify state is tracked in `.vibe/metrics/run-ledger.json`; stuck is judged by discover-hash (2 identical rounds), not by the model
44
44
  - **Narrowing scope**: Round 1 full → Round 2 P1+P2 → Round 3+ P1 only
45
- - **Stuck** → ask user (fill values / approve sub-100 / abort); `automationLevel: autonomous` records a TODO and continues non-interactively. Never silently proceed sub-100
45
+ - **Stuck** → **ends the loop** in both modes. `confirm` asks the user (fill values / approve sub-100 / abort); `autonomous` records a TODO and moves to the next independent unit non-interactively it does NOT keep retrying the stuck loop, and never records sub-100 as complete
46
46
  - **Changed files only** — never full-project scan
47
47
 
48
48
  ## Architecture (Non-Obvious)
@@ -125,7 +125,7 @@ $vibe "<requirement>" [+ 📎 attachments] # Codex
125
125
  | `--max-iter N` | 10 | Iteration cap |
126
126
  | `automationLevel` | `confirm` | `confirm` / `autonomous` (non-interactive; stuck → TODO) — `.vibe/config.json` |
127
127
 
128
- **Deprecated aliases** (mapped, not taught): `ralph`→default(no-op) · `verify`→default(no-op) · `quick`→`--max-iter 1` · `ralplan`→loop applied to planning · `ultrawork`/`ulw`→`automationLevel: autonomous` + parallel ACT
128
+ **Deprecated aliases** (mapped, not taught): `ralph`→default(no-op) · `verify`→default(no-op) · `quick`→`--max-iter 1` + min JUDGE · `ralplan`→loop applied to planning · `ultrawork`/`ulw`→`automationLevel: autonomous` + parallel ACT
129
129
 
130
130
  ## Skill Tiers
131
131
 
@@ -56,6 +56,38 @@ describe('D1 — vibe 디스패처: stakes 분류 규칙', () => {
56
56
  expect(doc).toMatch(/SPEC 승인 메시지에 stakes 확인 질문/);
57
57
  });
58
58
  });
59
+ /**
60
+ * 디스패처의 Stakes 표는 **의도적 사본**이다 — 모델이 다른 파일을 로드하지 않고
61
+ * 판정할 수 있어야 하므로 D1 이 본문 존재를 요구한다. 문제는 사본이 조용히
62
+ * 드리프트한다는 것이고, 실제로 그런 일이 있었다:
63
+ *
64
+ * SSOT `production` | 기본값 — 신호 없음·상충 포함
65
+ * 사본 `production` | 기본값 — 신호 없음 ← "상충 포함" 소실
66
+ *
67
+ * 신호가 상충할 때 상향(production)하지 않으면 리뷰어 셋과 max_iterations 가
68
+ * 통째로 축소된다. 사본을 허용하는 대신 드리프트를 CI 에서 막는다.
69
+ */
70
+ describe('D1/D2 — Stakes 사본 드리프트 가드', () => {
71
+ const dispatcher = read('skills/vibe/SKILL.md');
72
+ const ssot = read('vibe/rules/loop-contract.md');
73
+ it('상충 신호 → production 상향 규칙이 SSOT 와 사본 양쪽에 있다', () => {
74
+ expect(ssot, 'SSOT production 행에 "상충" 누락').toMatch(/`production`[^\n]*상충/);
75
+ expect(dispatcher, '디스패처 사본 production 행에 "상충" 누락').toMatch(/`production`[^\n]*상충/);
76
+ });
77
+ it('prototype 판정 신호가 SSOT 와 사본 양쪽에서 유지보수 가능성을 언급한다', () => {
78
+ expect(ssot).toMatch(/`prototype`[^\n]*유지보수 가능성/);
79
+ expect(dispatcher).toMatch(/`prototype`[^\n]*유지보수 가능성/);
80
+ });
81
+ it('사본이 SSOT 우선임을 명시한다 (충돌 시 판단 근거)', () => {
82
+ expect(dispatcher).toMatch(/SSOT 가 이긴다|SSOT가 이긴다/);
83
+ });
84
+ it('세 stakes 값의 판정 신호가 양쪽에 모두 존재한다', () => {
85
+ for (const level of ['`demo`', '`prototype`', '`production`']) {
86
+ expect(ssot, `SSOT 에 ${level} 누락`).toContain(level);
87
+ expect(dispatcher, `사본에 ${level} 누락`).toContain(level);
88
+ }
89
+ });
90
+ });
59
91
  describe('D3 — vibe.spec: 승인 게이트 stakes 편승 질문', () => {
60
92
  const doc = read('skills/vibe.spec/SKILL.md');
61
93
  it('Stakes 편승 질문 규칙이 승인 섹션에 존재한다', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"stakes-contract.test.js","sourceRoot":"","sources":["../../src/__tests__/stakes-contract.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stakes-contract.test.js","sourceRoot":"","sources":["../../src/__tests__/stakes-contract.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stuck-semantics.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stuck-semantics.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/stuck-semantics.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ /**
5
+ * `stuck` 시맨틱 계약 — 4개 문서가 서로 모순됐던 회귀를 막는다.
6
+ *
7
+ * 발견 경위: Codex 하네스에 SKILL.md 를 읽혀 검증하던 중, 같은 규칙이 문서마다
8
+ * 다르게 적혀 있는 것이 드러났다.
9
+ *
10
+ * loop-contract.md:24 stuck = EXIT 조건
11
+ * loop-contract.md:44 autonomous = "기록 후 계속" ← 같은 파일 안에서 상충
12
+ * CLAUDE.md autonomous "continues"
13
+ * vibe/SKILL.md autonomous → "루프 종료" ← 정반대
14
+ *
15
+ * 확정된 시맨틱: **stuck 은 어느 automationLevel 에서도 루프를 종료한다.**
16
+ * 2회 연속 동일 발견은 정의상 재시도가 무의미하므로 루프 연장은 성립하지 않는다.
17
+ * automationLevel 이 결정하는 것은 "사람에게 묻는지" 와 "다음 단위로 넘어가는지" 뿐이며,
18
+ * 미달은 절대 완료로 기록하지 않는다.
19
+ */
20
+ const ROOT = path.resolve(__dirname, '..', '..');
21
+ function read(rel) {
22
+ return fs.readFileSync(path.join(ROOT, rel), 'utf-8');
23
+ }
24
+ /** stuck 규칙을 진술하는 모든 문서 — 새 문서를 추가하면 여기에 등록한다 */
25
+ const DOCS_STATING_STUCK = [
26
+ 'vibe/rules/loop-contract.md',
27
+ 'CLAUDE.md',
28
+ 'AGENTS.md',
29
+ 'skills/vibe/SKILL.md',
30
+ 'skills/vibe.run/references/automation-level.md',
31
+ 'skills/vibe.run/references/coverage-loop.md',
32
+ ];
33
+ describe('stuck 시맨틱 — SSOT', () => {
34
+ const ssot = read('vibe/rules/loop-contract.md');
35
+ it('stuck 이 루프를 종료한다고 명시한다', () => {
36
+ expect(ssot).toMatch(/그 루프는 종료한다/);
37
+ });
38
+ it('autonomous 의 "계속" 이 루프 연장이 아님을 명시한다', () => {
39
+ expect(ssot).toMatch(/stuck 난 루프를 더 돌린다는 뜻이 아니다/);
40
+ });
41
+ it('미달을 완료로 기록하지 않는다는 규칙이 있다', () => {
42
+ expect(ssot).toMatch(/완료로 기록하지 않는다/);
43
+ });
44
+ it('confirm/autonomous 모두 루프는 종료임을 표로 구분한다', () => {
45
+ // 질문 여부와 루프 종료를 섞지 말라는 지시가 있어야 한다
46
+ expect(ssot).toMatch(/이 둘을 섞지 말/);
47
+ });
48
+ });
49
+ describe('stuck 시맨틱 — 문서 간 정합', () => {
50
+ it.each(DOCS_STATING_STUCK)('%s 가 stuck 을 "계속 재시도" 로 기술하지 않는다', (rel) => {
51
+ const doc = read(rel);
52
+ // stuck 을 언급하지 않는 문서는 검사 대상이 아니다
53
+ if (!/stuck/i.test(doc))
54
+ return;
55
+ // "stuck → 계속" 류의 단정을 금지한다. 부정문("계속한다는 뜻이 아니다",
56
+ // "keep retrying" 를 부정하는 문장)은 허용해야 하므로, 금지 패턴은
57
+ // stuck 직후에 곧바로 연장을 지시하는 형태로 좁힌다.
58
+ expect(doc, `${rel}: stuck 을 루프 연장으로 기술함`)
59
+ .not.toMatch(/stuck[^\n.]{0,40}(?:이면|→|->)\s*(?:루프를? )?계속(?!한다는 뜻이 아니)/);
60
+ });
61
+ it.each(DOCS_STATING_STUCK)('%s 가 sub-100/미달을 완료로 기록하지 않는다고 유지한다', (rel) => {
62
+ const doc = read(rel);
63
+ if (!/stuck/i.test(doc))
64
+ return;
65
+ // 각 문서는 미달 처리를 어떤 형태로든 명시해야 한다 (완료 금지 / TODO / 인박스)
66
+ expect(doc, `${rel}: 미달 처리 규칙 없음`)
67
+ .toMatch(/완료로 기록하지 않는다|as complete|TODO|인박스/);
68
+ });
69
+ /**
70
+ * stuck 은 **발견 해시**로 판정한다. 커버리지 수치로 바꿔 적으면 판정이 달라진다 —
71
+ * 커버리지가 그대로여도 남은 항목이 바뀌었으면 진전이고, 반대로 커버리지가 올라도
72
+ * 같은 발견이 반복되면 막힌 것이다. coverage-loop.md 가 실제로 "연속 2회 동일
73
+ * 커버리지" 로 적혀 있었다.
74
+ */
75
+ it('stuck 판정 기준을 커버리지 수치로 바꿔 적은 문서가 없다', () => {
76
+ for (const rel of DOCS_STATING_STUCK) {
77
+ expect(read(rel), `${rel}: stuck 을 커버리지 수치로 판정`)
78
+ .not.toMatch(/연속 2회 동일 커버리지/);
79
+ }
80
+ });
81
+ });
82
+ /**
83
+ * Deprecated 별칭 환원은 loop-contract 의 표가 유일 SSOT 다.
84
+ * 요약을 여러 곳에 두었더니 `quick` 의 "최소 JUDGE" 가 빠지고 `ralplan` 이
85
+ * 누락되는 식으로 어긋났다 — 부분 요약은 전체 사본보다 드리프트를 알아채기 어렵다.
86
+ */
87
+ describe('deprecated 별칭 매핑 정합', () => {
88
+ const ssot = read('vibe/rules/loop-contract.md');
89
+ it('SSOT 에 별칭 5종이 모두 정의돼 있다', () => {
90
+ for (const alias of ['`ralph`', '`verify`', '`quick`', '`ralplan`', '`ultrawork`']) {
91
+ expect(ssot, `SSOT 에 ${alias} 누락`).toContain(alias);
92
+ }
93
+ });
94
+ it('SSOT 의 quick 은 --max-iter 1 + 최소 JUDGE 다', () => {
95
+ expect(ssot).toMatch(/`quick`[^\n]*--max-iter 1[^\n]*최소 JUDGE/);
96
+ });
97
+ it.each(['CLAUDE.md', 'AGENTS.md'])('%s 의 quick 요약이 최소 JUDGE 를 빠뜨리지 않는다', (rel) => {
98
+ const doc = read(rel);
99
+ if (!/`quick`/.test(doc))
100
+ return;
101
+ expect(doc, `${rel}: quick 에 최소 JUDGE 누락`)
102
+ .toMatch(/`quick`→`--max-iter 1`[^\n]*(?:min JUDGE|최소 JUDGE)/);
103
+ });
104
+ it('automation-level.md 는 별칭 요약을 두지 않고 SSOT 를 가리킨다', () => {
105
+ const doc = read('skills/vibe.run/references/automation-level.md');
106
+ expect(doc).toMatch(/요약도 두지 않는다/);
107
+ });
108
+ });
109
+ //# sourceMappingURL=stuck-semantics.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stuck-semantics.test.js","sourceRoot":"","sources":["../../src/__tests__/stuck-semantics.test.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,8 @@ export interface CodexHooksConfig {
12
12
  PreToolUse: CodexHookEntry[];
13
13
  PostToolUse: CodexHookEntry[];
14
14
  Stop: CodexHookEntry[];
15
+ /** CC 의 context_window_* Notification 등가물 — Codex 에는 임계치 알림이 없다 */
16
+ PreCompact: CodexHookEntry[];
15
17
  };
16
18
  }
17
19
  export declare function buildCodexHooksConfig(coreDir?: string): CodexHooksConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"CodexHooks.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.ts"],"names":[],"mappings":"AAKA,UAAU,gBAAgB;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE;QACL,YAAY,EAAE,cAAc,EAAE,CAAC;QAC/B,gBAAgB,EAAE,cAAc,EAAE,CAAC;QACnC,UAAU,EAAE,cAAc,EAAE,CAAC;QAC7B,WAAW,EAAE,cAAc,EAAE,CAAC;QAC9B,IAAI,EAAE,cAAc,EAAE,CAAC;KACxB,CAAC;CACH;AAaD,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,MAA2B,GAAG,gBAAgB,CAW5F;AAaD,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,MAA2B,GACnC,IAAI,CAWN"}
1
+ {"version":3,"file":"CodexHooks.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.ts"],"names":[],"mappings":"AAKA,UAAU,gBAAgB;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE;QACL,YAAY,EAAE,cAAc,EAAE,CAAC;QAC/B,gBAAgB,EAAE,cAAc,EAAE,CAAC;QACnC,UAAU,EAAE,cAAc,EAAE,CAAC;QAC7B,WAAW,EAAE,cAAc,EAAE,CAAC;QAC9B,IAAI,EAAE,cAAc,EAAE,CAAC;QACvB,mEAAmE;QACnE,UAAU,EAAE,cAAc,EAAE,CAAC;KAC9B,CAAC;CACH;AAaD,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,MAA2B,GAAG,gBAAgB,CAY5F;AAaD,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,MAA2B,GACnC,IAAI,CAWN"}
@@ -20,6 +20,7 @@ export function buildCodexHooksConfig(coreDir = getCoreConfigDir()) {
20
20
  PreToolUse: [hookEntry(normalizedCoreDir, 'PreToolUse')],
21
21
  PostToolUse: [hookEntry(normalizedCoreDir, 'PostToolUse')],
22
22
  Stop: [hookEntry(normalizedCoreDir, 'Stop')],
23
+ PreCompact: [hookEntry(normalizedCoreDir, 'PreCompact')],
23
24
  },
24
25
  };
25
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CodexHooks.js","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAqBxD,SAAS,cAAc,CAAC,OAAe,EAAE,SAAiB;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvG,OAAO,QAAQ,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,SAAS,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,EAAE,SAAiB;IACnD,OAAO;QACL,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAkB,gBAAgB,EAAE;IACxE,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO;QACL,KAAK,EAAE;YACL,YAAY,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;YAC5D,gBAAgB,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;YACpE,UAAU,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;YACxD,WAAW,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;YAC1D,IAAI,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;SAC7C;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,CAAC;QACzC,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9E,OAAO,MAAiC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,WAAmB,EACnB,UAAkB,gBAAgB,EAAE;IAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG;QACX,GAAG,QAAQ;QACX,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC,KAAK;KAC5C,CAAC;IACF,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"CodexHooks.js","sourceRoot":"","sources":["../../../src/cli/setup/CodexHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAuBxD,SAAS,cAAc,CAAC,OAAe,EAAE,SAAiB;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvG,OAAO,QAAQ,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,SAAS,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,EAAE,SAAiB;IACnD,OAAO;QACL,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAkB,gBAAgB,EAAE;IACxE,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO;QACL,KAAK,EAAE;YACL,YAAY,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;YAC5D,gBAAgB,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;YACpE,UAAU,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;YACxD,WAAW,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;YAC1D,IAAI,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;YAC5C,UAAU,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;SACzD;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,CAAC;QACzC,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9E,OAAO,MAAiC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,WAAmB,EACnB,UAAkB,gBAAgB,EAAE;IAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG;QACX,GAAG,QAAQ;QACX,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC,KAAK;KAC5C,CAAC;IACF,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACpE,CAAC"}
@@ -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:17:16.249Z] rm -rf /
2
- [2026-07-26T20:17:16.366Z] ls -la
3
- [2026-07-26T20:17:16.472Z] rm -rf src/infra/lib/evolution/
1
+ [2026-07-26T20:59:53.013Z] rm -rf /
2
+ [2026-07-26T20:59:53.129Z] ls -la
3
+ [2026-07-26T20:59:53.242Z] 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.8",
3
+ "version": "3.2.10",
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.
@@ -7,7 +7,7 @@ user-invocable: true
7
7
 
8
8
  # /vibe.review
9
9
 
10
- **Parallel Agent Code Review** - 13+ specialists review simultaneously
10
+ **Parallel Agent Code Review** focus 전문 리뷰어를 **가능한 범위에서 병렬로, 나머지는 순차로** 실행 (production 기본 셋 8종 + 조건부)
11
11
 
12
12
  ## Usage
13
13
 
@@ -139,7 +139,9 @@ run agent security-reviewer args: "Review {FILES} for vulnerabilities"
139
139
 
140
140
  Stack-specific focus (`idioms`) is added when the diff touches that stack's files. Collect all results, then dedupe/merge findings before Phase 3.
141
141
 
142
- **Core Reviewers (Always Runparallel `code-reviewer` instances, one per focus, plus `security-reviewer`):**
142
+ **Core Reviewers (production stakes 의 기본 셋 — `code-reviewer` focus 별로 하나씩 + `security-reviewer`):**
143
+
144
+ > demo/prototype 에서는 위 리뷰어 스케일링 표의 축소 셋만 실행한다. 이 표는 **production 의 전체 셋**이며 "무조건 8개 전부"라는 뜻이 아니다 — stakes 판정이 셋 크기를 결정한다 (SSOT: `vibe/rules/loop-contract.md` Stakes 표).
143
145
  | Agent (focus) | Focus |
144
146
  |-------|-------|
145
147
  | security-reviewer | OWASP Top 10, vulnerabilities |
@@ -171,7 +173,7 @@ UI 파일이 없으면 이 Phase 전체를 건너뛴다 — reference 도 읽지
171
173
 
172
174
  **검증 방법: "양쪽 동시 읽기"**
173
175
 
174
- 반드시 **생산자와 소비자 코드를 동시에** Read하여 교차 비교한다.
176
+ 생산자와 소비자 코드를 **같은 판단 안에서 함께** 읽어 교차 비교한다 (한쪽만 읽고 판단 금지). 두 파일을 동시에 열 도구가 없어도 규칙은 유효하다 — 순서대로 전체를 읽은 뒤 비교하면 된다.
175
177
 
176
178
  > Read `references/boundary-check.md` for the full verification-area table and checklist.
177
179
 
@@ -223,12 +225,16 @@ After agent results:
223
225
 
224
226
  ### Auto-Fix 실패 시 Codex Rescue (Codex 플러그인 활성화 시)
225
227
 
226
- P1/P2 auto-fix 가 **재시도 1회까지 실패**하면(= 시도 2회), TODO 로 내리기 전에 Codex 에 **1회** 위임한다 — escalation ladder SSOT: 위 Anti-Patterns:
228
+ P1/P2 auto-fix 가 **재시도 1회까지 실패**하면(= 시도 2회), TODO 로 내리기 전에 Codex 에 **1회** 위임한다 — escalation ladder SSOT: 위 Anti-Patterns.
229
+
230
+ 위임 요청 내용(호출 표면 무관):
227
231
 
228
232
  ```
229
- /codex:rescue "Fix {priority} issue: {issue-description}. File: {file-path}"
233
+ Fix {priority} issue: {issue-description}. File: {file-path}
230
234
  ```
231
235
 
236
+ 이 요청을 Codex 플러그인이 **실제로 제공하는** rescue/review 명령으로 전달한다. 제공 명령을 확인할 수 없으면 위임을 건너뛰고 바로 TODO 로 내린다 — 존재하지 않는 슬래시 명령을 실행하려 시도하지 않는다 (위 "명령 이름을 가정하지 않는다").
237
+
232
238
  Codex 수정 완료 후 해당 리뷰 에이전트가 재검증.
233
239
 
234
240
  ### Phase 6: Todo File Creation (Items Requiring Manual Handling)
@@ -287,20 +293,6 @@ definitions, index/update behavior, output paths, and completion criteria.
287
293
 
288
294
  ---
289
295
 
290
- ARGUMENTS: $ARGUMENTS
291
-
292
- ## 리뷰어 스케일링
293
-
294
- Stakes SSOT는 `vibe/rules/loop-contract.md` Stakes 표다.
295
-
296
- | stakes | 변경 파일 | reviewer set |
297
- |---|---|---|
298
- | demo | ≤5 | correctness + security 2종 |
299
- | demo / prototype | >5 또는 prototype | correctness + security + data-integrity 3종 |
300
- | production | any | Core Reviewers 전체 |
301
-
302
- 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`.
303
-
304
296
  ## Done Criteria
305
297
 
306
298
  - [ ] Every finding has P1/P2/P3 severity and `file:line` evidence.
@@ -119,10 +119,10 @@ 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
- - 병렬 탐색 (3+ Task agents 동시)
125
+ - 병렬 탐색 — 하네스의 네이티브 서브에이전트를 **동시 슬롯 한도까지** 스폰 (CC: 한 메시지에 3 이상). 슬롯이 부족하면 개수를 줄이거나 순차 실행하되 탐색 항목을 버리지 않는다
126
126
  - 비대화형 (중단점 없음)
127
127
  - Race Review (GPT+Antigravity) 기본 활성화
128
128
  - stuck 시 TODO 기록 후 다음 시나리오로 (사용자 질문 없음)
@@ -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
 
@@ -100,7 +98,7 @@ ARGUMENTS: $ARGUMENTS
100
98
  |---|---|
101
99
  | 자연어 요구사항 | 그대로 SPEC 패스의 주 입력 |
102
100
  | 📎 첨부 (md/txt/pdf/이미지 등) | 하네스의 파일 읽기 수단(CC `Read` 도구 / Codex 셸 등)으로 전체를 읽어 분석 후 요구사항에 병합 |
103
- | 파일 경로 인자 (PRD 등) | 존재 확인 후 Read — 첨부와 동일 취급 |
101
+ | 파일 경로 인자 (PRD 등) | 존재 확인 후 전체를 읽는다 — 첨부와 동일 취급 |
104
102
  | **레거시 아티팩트** `.vibe/interviews/{feature}.md`, `.vibe/plans/{feature}.md` | 존재하면 **입력 컨텍스트로만** 읽는다. 절대 요구하거나 재생성하지 않는다 — 없어도 정상 경로 |
105
103
 
106
104
  ## Process
@@ -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 |
@@ -1,151 +0,0 @@
1
- # ULTRAWORK Mode — Automation Level Reference
2
-
3
- > Loaded by vibe.run SKILL.md when user includes `ultrawork` or `ulw` keyword.
4
- >
5
- > **루프 시맨틱(ANCHOR/ACT/JUDGE/RECORD/stuck/max_iterations)의 SSOT는 `vibe/rules/loop-contract.md`다.** `ultrawork`/`ulw`는 `automationLevel: autonomous` + 병렬 ACT의 deprecated 별칭이다. 루프 자체는 모든 실행의 기본 동작이며, ultrawork는 그 루프를 자율(비대화형)·병렬 모드로 돌리는 축을 제어한다.
6
-
7
- ## What `automationLevel: autonomous` Enables
8
-
9
- `ultrawork` (또는 `ulw`, `.vibe/config.json`의 `automationLevel: autonomous`) 설정 시 활성화:
10
-
11
- | Feature | Description |
12
- |---------|-------------|
13
- | **Parallel Exploration** | 3+ Task agents run simultaneously (ACT 병렬화) |
14
- | **Loop (기본 동작)** | 모든 실행의 기본 — exit=게이트 통과 또는 stuck 또는 max_iterations |
15
- | **Context Compression** | Aggressive auto-save at 70%+ context |
16
- | **No Pause** | stuck·SPEC 게이트 외 확인 없음 (`automationLevel: autonomous`) |
17
- | **External LLMs** | Auto-consults GPT/Antigravity if enabled |
18
- | **Error Recovery** | stuck 시 TODO 기록 후 다음으로 (사용자 질문 없음) |
19
- | **Race Review** | Multi-LLM review (GPT+Antigravity) with cross-validation |
20
-
21
- ## Boulder Loop — Parallel ACT Visualization
22
-
23
- 루프 자체는 loop-contract의 기본 동작이다. Boulder Loop는 `automationLevel: autonomous`에서 **병렬 ACT**가 어떻게 실행되는지를 보여주는 다이어그램이다:
24
-
25
- ```
26
- ┌─────────────────────────────────────────────────────────────────┐
27
- │ BOULDER LOOP (ultrawork) │
28
- │ │
29
- │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
30
- │ │ Phase 1 │───→│ Phase 2 │───→│ Phase 3 │───→│ Phase N │ │
31
- │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
32
- │ │ │ │ │ │
33
- │ ↓ ↓ ↓ ↓ │
34
- │ [Parallel] [Parallel] [Parallel] [Parallel] │
35
- │ [Implement] [Implement] [Implement] [Implement] │
36
- │ [Test] [Test] [Test] [Test] │
37
- │ │ │ │ │ │
38
- │ └───────────────┴───────────────┴───────────────┘ │
39
- │ │ │
40
- │ ↓ │
41
- │ ┌──────────────┐ │
42
- │ │ ALL DONE? │ │
43
- │ └──────────────┘ │
44
- │ │ │ │
45
- │ NO YES │
46
- │ │ │ │
47
- │ ↓ ↓ │
48
- │ [Continue] [Complete!] │
49
- │ │
50
- │ loop-contract EXIT: 게이트 통과 │ stuck │ max_iterations │
51
- └─────────────────────────────────────────────────────────────────┘
52
- ```
53
-
54
- ## Example Session (automationLevel: autonomous)
55
-
56
- ```
57
- User: /vibe.run "brick-game" ultrawork
58
-
59
- Claude:
60
- AUTONOMOUS MODE (automationLevel: autonomous)
61
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
62
-
63
- SPEC: .vibe/specs/brick-game.md
64
- 4 Phases detected
65
- Loop: ENABLED (exit = 게이트 통과 | stuck | max_iterations=10)
66
- Parallel ACT: ON
67
- automationLevel: autonomous (stuck → auto-TODO, no confirmation)
68
- Context compression: AGGRESSIVE
69
-
70
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
71
- BOULDER ROLLING... Phase 1/4
72
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
73
-
74
- [PARALLEL] Launching 3 exploration agents...
75
- Exploration complete (7.2s)
76
- Implementing...
77
- Phase 1 complete
78
-
79
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
80
- BOULDER ROLLING... Phase 2/4
81
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
82
-
83
- [PARALLEL] Launching 3 exploration agents...
84
- Exploration complete (6.8s)
85
- Implementing...
86
- Test failed: collision detection
87
- Auto-retry [iteration 1]...
88
- Fixing...
89
- Phase 2 complete
90
-
91
- [...continues automatically...]
92
-
93
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
94
- BOULDER REACHED THE TOP!
95
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
96
-
97
- All 4 phases complete
98
- All acceptance criteria passed
99
- Build succeeded
100
- Tests passed
101
-
102
- Total: 8m 24s
103
- Retries: 2
104
- Context saved: 3 checkpoints
105
- ```
106
-
107
- ## confirm vs autonomous Comparison
108
-
109
- | Aspect | `automationLevel: confirm` (default) | `automationLevel: autonomous` (ultrawork) |
110
- |--------|--------------------------------------|-------------------------------------------|
111
- | Loop | ANCHOR→ACT→JUDGE→RECORD (기본 동작) | 동일 |
112
- | Confirmation gates | stuck·SPEC에서 질문 | stuck 포함 전부 skip → TODO |
113
- | On error | Reports, asks before retry | Auto-retries, auto-TODO on stuck |
114
- | Context 70%+ | Warning only | Auto-compress + save |
115
- | Exploration | Sequential possible | FORCED parallel |
116
-
117
- ## Automation Level System
118
-
119
- **automationLevel**은 루프가 사람 개입 없이 얼마나 자율적으로 진행하는지를 제어한다. `.vibe/config.json`에서 설정하거나, deprecated 별칭 키워드로 런타임 오버라이드 가능.
120
-
121
- ### Level Definitions
122
-
123
- | Level | Name | 설정 방법 | Auto-advance | Auto-retry | Stuck Behavior | Parallel Agents | Checkpoints |
124
- |-------|------|-----------|--------------|------------|----------------|-----------------|-------------|
125
- | L0 | Manual | `manual` | No | No | Ask user every step | No | All |
126
- | L1 | Guided | `guided`, `verify`(deprecated) | No | No | Ask user on stuck | No | All |
127
- | L2 | confirm | default | Yes | Yes (low cap: 2) | Ask user after 2 retries | No | Key points |
128
- | L3 | autonomous | `automationLevel: autonomous` / `ultrawork`(dep) / `ulw`(dep) | Yes | Yes (no cap) | Auto-TODO + proceed | Yes | Checkpoint-only |
129
- | L4 | Full-auto | `ralph`(deprecated) / `ralplan`(deprecated) | Yes | Yes (no cap) | Auto-TODO + proceed | Yes | None |
130
-
131
- ### Detection Rule (deprecated aliases)
132
-
133
- ```
134
- /vibe.run "login" → L2 confirm (default)
135
- /vibe.run "login" ultrawork → L3 autonomous (deprecated alias)
136
- /vibe.run "login" ralph → L4 Full-auto (deprecated alias, exit=coverage-100)
137
- /vibe.run "login" verify → L1 Guided (deprecated alias)
138
- ```
139
-
140
- ### Confirmation Matrix
141
-
142
- | Action | L0 | L1 | L2 | L3 | L4 |
143
- |--------|----|----|----|----|-----|
144
- | `destructive` | confirm | confirm | confirm | confirm | auto |
145
- | `architecture_choice` | confirm | confirm | confirm | auto | auto |
146
- | `implementation_scope` | confirm | confirm | confirm | auto | auto |
147
- | `phase_advance` | confirm | confirm | auto | auto | auto |
148
- | `fix_strategy` | confirm | confirm | auto | auto | auto |
149
- | `retry` | confirm | auto | auto | auto | auto |
150
-
151
- **Rule**: When confirmation is required, pause and display a checkpoint before proceeding.