@humanbased/crosscheck 1.2.0-beta.79 → 1.2.0-beta.80

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/README.md CHANGED
@@ -218,7 +218,7 @@ For review and recheck, Crosscheck also applies repository-defined review practi
218
218
  |---|---|---|---|
219
219
  | `fast` | Haiku 4.5 | GPT-5.6 Luna | ~10s |
220
220
  | `balanced` | Sonnet 5 | GPT-5.6 Terra | ~30s |
221
- | `thorough` | Opus 4.8 | GPT-5.6 Sol | ~60s |
221
+ | `thorough` | Opus 5 | GPT-5.6 Sol | ~60s |
222
222
 
223
223
  ### Pipeline depth
224
224
 
@@ -47,7 +47,7 @@ quality:
47
47
  # ───────── ─────────────────── ─────────── ─────── ──────
48
48
  # fast Haiku 4.5 · low GPT-5.6 Luna · low ~10s lowest
49
49
  # balanced Sonnet 5 · medium GPT-5.6 Terra · med ~30s standard
50
- # thorough Opus 4.8 · max GPT-5.6 Sol · high ~60s higher
50
+ # thorough Opus 5 · max GPT-5.6 Sol · high ~60s higher
51
51
  #
52
52
  # crosscheck onboard writes these automatically when you pick a tier.
53
53
  # You can override individual vendor settings in the vendors: block below.
@@ -61,7 +61,7 @@ describe('loadRepositoryReviewGuidance', () => {
61
61
  git('commit', '-m', 'change');
62
62
  const { execa } = await import('execa');
63
63
  const execaMock = vi.mocked(execa);
64
- const quality = { tier: 'balanced', focus: [] };
64
+ const quality = { tier: 'balanced', mode: 'smart', focus: [] };
65
65
  const claudeVendor = { effort: 'medium' };
66
66
  const codexVendor = { auth: 'subscription' };
67
67
  let codexInstructions = '';
@@ -1 +1 @@
1
- {"version":3,"file":"repository-guidance.test.js","sourceRoot":"","sources":["../../src/__tests__/repository-guidance.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository-guidance.test.js","sourceRoot":"","sources":["../../src/__tests__/repository-guidance.test.ts"],"names":[],"mappings":"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"}
@@ -24,7 +24,10 @@ describe('review model resolution', () => {
24
24
  it('resolves Claude models by tier', () => {
25
25
  expect(resolveClaudeModel(quality('fast'))).toBe('claude-haiku-4-5-20251001');
26
26
  expect(resolveClaudeModel(quality('balanced'))).toBe('claude-sonnet-5');
27
- expect(resolveClaudeModel(quality('thorough'))).toBe('claude-opus-4-8');
27
+ // thorough moved from the legacy claude-opus-4-8 to claude-opus-5 — identical
28
+ // $5/$25 pricing, higher coding benchmark score. The stale pin was a silent
29
+ // capability loss.
30
+ expect(resolveClaudeModel(quality('thorough'))).toBe('claude-opus-5');
28
31
  });
29
32
  it('honors an explicit vendors.claude.model over the tier mapping', () => {
30
33
  // Regression for #176: vendors.claude.model was silently ignored.
@@ -34,7 +37,7 @@ describe('review model resolution', () => {
34
37
  expect(resolveClaudeModel(quality('thorough'), claudeVendor('sonnet', 'api-key'))).toBe('sonnet');
35
38
  });
36
39
  it('falls back to the tier mapping when vendors.claude.model is unset', () => {
37
- expect(resolveClaudeModel(quality('thorough'), claudeVendor(null))).toBe('claude-opus-4-8');
40
+ expect(resolveClaudeModel(quality('thorough'), claudeVendor(null))).toBe('claude-opus-5');
38
41
  });
39
42
  it('resolves Codex API-key models by tier and configured override', () => {
40
43
  expect(resolveCodexModel(quality('fast'), codexVendor('api-key'))).toBe('gpt-5.6-luna');
@@ -1 +1 @@
1
- {"version":3,"file":"review-models.test.js","sourceRoot":"","sources":["../../src/__tests__/review-models.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review-models.test.js","sourceRoot":"","sources":["../../src/__tests__/review-models.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=review-strategy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-strategy.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/review-strategy.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,195 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { resolveReviewStrategy, detectDomain, escalate, clampEffort, effortLevelsFor, isModelBanned, strategyModelFor, strategyVersion, ladderLimits, } from '../lib/review-strategy.js';
3
+ import { resolveClaudeModel, resolveCodexModel, effectiveTier } from '../lib/review-models.js';
4
+ const pr = (files, over = {}) => resolveReviewStrategy({ files, additions: 100, deletions: 50, ...over });
5
+ describe('PR classification', () => {
6
+ it('skips a lockfile-only PR entirely', () => {
7
+ const r = pr(['package-lock.json', 'pnpm-lock.yaml']);
8
+ expect(r.classId).toBe('generated');
9
+ expect(r.tier).toBeNull();
10
+ expect(r.steps).toEqual([]);
11
+ });
12
+ it('promotes a security path to thorough', () => {
13
+ const r = pr(['src/auth/session.ts']);
14
+ expect(r.classId).toBe('risky');
15
+ expect(r.tier).toBe('thorough');
16
+ expect(r.steps).toEqual(['review', 'fix', 'recheck']);
17
+ });
18
+ it('promotes on a risk:T3 label even with innocuous paths', () => {
19
+ const r = pr(['src/widget.ts'], { labels: ['risk:T3'] });
20
+ expect(r.classId).toBe('risky');
21
+ expect(r.tier).toBe('thorough');
22
+ });
23
+ it('promotes a hotfix targeting the default branch', () => {
24
+ const r = pr(['src/widget.ts'], { title: 'hotfix(api): patch', baseRef: 'main', defaultBranch: 'main' });
25
+ expect(r.classId).toBe('risky');
26
+ });
27
+ it('does not promote a hotfix targeting a non-default branch', () => {
28
+ const r = pr(['src/widget.ts'], { title: 'hotfix(api): patch', baseRef: 'staging', defaultBranch: 'main' });
29
+ expect(r.classId).not.toBe('risky');
30
+ });
31
+ // Ordering regression: `risky` must sit above every cheapening rule, or a
32
+ // deletion of auth code falls through to `fast`.
33
+ it('classifies a deletion of auth code as risky, not deletion-only', () => {
34
+ const r = pr(['src/auth/legacy-session.ts'], { additions: 0, deletions: 400 });
35
+ expect(r.classId).toBe('risky');
36
+ expect(r.tier).toBe('thorough');
37
+ });
38
+ it('classifies a two-file migration as risky, not trivial', () => {
39
+ const r = pr(['db/migrations/20260101_add.sql', 'src/x.ts'], { additions: 10, deletions: 2 });
40
+ expect(r.classId).toBe('risky');
41
+ });
42
+ it('classifies a pure deletion as deletion-only with no fix loop', () => {
43
+ const r = pr(['src/widget.ts', 'src/helper.ts'], { additions: 0, deletions: 300 });
44
+ expect(r.classId).toBe('deletion_only');
45
+ expect(r.tier).toBe('fast');
46
+ expect(r.steps).toEqual(['review']);
47
+ });
48
+ it('gives a docs PR review with no fix or recheck', () => {
49
+ const r = pr(['docs/design.md', 'docs/adr/0001.md', 'src/x.ts']);
50
+ expect(r.classId).toBe('docs');
51
+ expect(r.steps).toEqual(['review']);
52
+ });
53
+ it('classifies a test-only PR as fast', () => {
54
+ const r = pr(['src/__tests__/a.test.ts', 'src/__tests__/b.spec.ts']);
55
+ expect(r.classId).toBe('test_only');
56
+ expect(r.tier).toBe('fast');
57
+ });
58
+ it('classifies a small source change as trivial', () => {
59
+ const r = pr(['src/widget.ts'], { additions: 20, deletions: 10 });
60
+ expect(r.classId).toBe('trivial');
61
+ expect(r.tier).toBe('fast');
62
+ });
63
+ it('falls through to standard for an ordinary change', () => {
64
+ const r = pr(['src/a.ts', 'src/b.ts', 'src/c.ts', 'src/d.ts'], { additions: 400, deletions: 200 });
65
+ expect(r.classId).toBe('standard');
66
+ expect(r.tier).toBe('balanced');
67
+ });
68
+ it('falls through to standard when no files can be listed', () => {
69
+ expect(pr([]).classId).toBe('standard');
70
+ });
71
+ it('carries a citable reason and the strategy version on every class', () => {
72
+ const r = pr(['src/auth/x.ts']);
73
+ expect(r.reason.length).toBeGreaterThan(10);
74
+ expect(r.version).toBe(strategyVersion());
75
+ });
76
+ });
77
+ describe('domain detection', () => {
78
+ it('detects a frontend-dominant PR', () => {
79
+ expect(detectDomain(['a.tsx', 'b.scss', 'c.ts'])).toBe('frontend');
80
+ });
81
+ it('detects a backend-dominant PR', () => {
82
+ expect(detectDomain(['a.py', 'b.go', 'c.tsx'])).toBe('backend');
83
+ });
84
+ // Backend is the conservative default: its preference list is `measured`
85
+ // while the frontend list is still a hypothesis.
86
+ it('falls back to backend on a tie or when neither is present', () => {
87
+ expect(detectDomain(['a.tsx', 'b.py'])).toBe('backend');
88
+ expect(detectDomain(['README.md'])).toBe('backend');
89
+ expect(detectDomain([])).toBe('backend');
90
+ });
91
+ });
92
+ describe('escalation ladder', () => {
93
+ it('leaves round 1 at the class tier', () => {
94
+ expect(escalate({ tier: 'balanced', effort: 'medium' }, 1, 'claude-sonnet-5'))
95
+ .toEqual({ tier: 'balanced', effort: 'medium' });
96
+ });
97
+ it('raises effort at round 2 and again at round 3, holding the model', () => {
98
+ expect(escalate({ tier: 'balanced', effort: 'medium' }, 2, 'claude-sonnet-5'))
99
+ .toEqual({ tier: 'balanced', effort: 'high' });
100
+ expect(escalate({ tier: 'balanced', effort: 'medium' }, 3, 'claude-sonnet-5'))
101
+ .toEqual({ tier: 'balanced', effort: 'xhigh' });
102
+ });
103
+ it('never weakens the model across rounds', () => {
104
+ const out = escalate({ tier: 'thorough', effort: 'high' }, 3, 'claude-opus-5');
105
+ expect(out.tier).toBe('thorough');
106
+ });
107
+ // The OpenCode case: most open-weight models expose no effort ladder, so the
108
+ // effort step has to degrade to a model step or escalation silently no-ops.
109
+ it('promotes a tier when the model has no effort control', () => {
110
+ expect(effortLevelsFor('claude-haiku-4-5-20251001')).toEqual([]);
111
+ expect(escalate({ tier: 'fast', effort: null }, 2, 'claude-haiku-4-5-20251001'))
112
+ .toEqual({ tier: 'balanced', effort: null });
113
+ });
114
+ it('caps tier promotion at thorough', () => {
115
+ expect(escalate({ tier: 'thorough', effort: null }, 3, 'claude-haiku-4-5-20251001').tier)
116
+ .toBe('thorough');
117
+ });
118
+ });
119
+ describe('effort clamping', () => {
120
+ it('passes through a supported level', () => {
121
+ expect(clampEffort('claude-opus-5', 'xhigh')).toBe('xhigh');
122
+ });
123
+ it('returns null for a model with no effort parameter', () => {
124
+ expect(clampEffort('claude-haiku-4-5-20251001', 'high')).toBeNull();
125
+ });
126
+ it('snaps down to the nearest supported level', () => {
127
+ // deepseek exposes none/high/max — xhigh must snap down to high, not fail.
128
+ expect(clampEffort('deepseek-v4-pro', 'xhigh')).toBe('high');
129
+ });
130
+ });
131
+ describe('banned models', () => {
132
+ it('bans claude-fable-5 from review', () => {
133
+ expect(isModelBanned('claude-fable-5')).toBe(true);
134
+ expect(isModelBanned('claude-opus-5')).toBe(false);
135
+ });
136
+ it('never routes a banned model from any vendor tier', () => {
137
+ for (const vendor of ['claude', 'codex', 'opencode']) {
138
+ for (const tier of ['fast', 'balanced', 'thorough']) {
139
+ const model = strategyModelFor(vendor, tier);
140
+ expect(model).toBeTruthy();
141
+ expect(isModelBanned(model)).toBe(false);
142
+ }
143
+ }
144
+ });
145
+ });
146
+ describe('model resolution honours the strategy', () => {
147
+ const quality = (over = {}) => ({ tier: 'balanced', mode: 'smart', focus: [], ...over });
148
+ it('uses the strategy tier in smart mode', () => {
149
+ expect(resolveClaudeModel(quality(), undefined, { tier: 'thorough' })).toBe('claude-opus-5');
150
+ expect(resolveClaudeModel(quality(), undefined, { tier: 'fast' })).toBe('claude-haiku-4-5-20251001');
151
+ });
152
+ it('ignores the strategy tier in fixed mode', () => {
153
+ expect(resolveClaudeModel(quality({ mode: 'fixed' }), undefined, { tier: 'thorough' }))
154
+ .toBe('claude-sonnet-5');
155
+ });
156
+ it('falls back to the configured tier when no strategy resolved', () => {
157
+ expect(effectiveTier(quality(), null)).toBe('balanced');
158
+ expect(effectiveTier(quality(), { tier: null })).toBe('balanced');
159
+ });
160
+ it('routes thorough to opus-5, not the legacy opus-4-8', () => {
161
+ expect(resolveClaudeModel(quality(), undefined, { tier: 'thorough' })).toBe('claude-opus-5');
162
+ });
163
+ // Regression: the old `auth !== 'api-key' → 'default'` guard discarded a
164
+ // configured model, sending 81% of observed reviews out unpinned.
165
+ it('honours a configured codex model under subscription auth', () => {
166
+ const vendor = { enabled: true, model: 'gpt-5.6-sol', auth: 'subscription', effort: 'medium', timeout_sec: null, quality: 'medium' };
167
+ expect(resolveCodexModel(quality(), vendor)).toBe('gpt-5.6-sol');
168
+ });
169
+ it('drives the codex tier model from the strategy under api-key auth', () => {
170
+ const vendor = { enabled: true, model: null, auth: 'api-key', effort: 'medium', timeout_sec: null, quality: 'medium' };
171
+ expect(resolveCodexModel(quality(), vendor, { tier: 'thorough' })).toBe('gpt-5.6-sol');
172
+ expect(resolveCodexModel(quality(), vendor, { tier: 'fast' })).toBe('gpt-5.6-luna');
173
+ });
174
+ it('keeps the CLI default under subscription auth with nothing configured', () => {
175
+ // The built-in tier mapping stays api-key-only on purpose: the gpt-5.6-*
176
+ // IDs require codex >= 0.147.0 and would 400 on an older CLI, so a
177
+ // subscription user with no model configured keeps the CLI's own default.
178
+ const vendor = { enabled: true, model: null, auth: 'subscription', effort: 'medium', timeout_sec: null, quality: 'medium' };
179
+ expect(resolveCodexModel(quality(), vendor, { tier: 'thorough' })).toBe('default');
180
+ });
181
+ it('drives model_tiers selection from the strategy under subscription auth', () => {
182
+ const vendor = { enabled: true, model: null, auth: 'subscription', effort: 'medium', timeout_sec: null, quality: 'medium', model_tiers: { thorough: 'gpt-5.6-sol' } };
183
+ expect(resolveCodexModel(quality(), vendor, { tier: 'thorough' })).toBe('gpt-5.6-sol');
184
+ expect(resolveCodexModel(quality(), vendor, { tier: 'fast' })).toBe('default');
185
+ });
186
+ });
187
+ describe('ladder limits', () => {
188
+ it('bounds rounds, blocking findings, and wall clock', () => {
189
+ const l = ladderLimits();
190
+ expect(l.maxRounds).toBe(3);
191
+ expect(l.maxBlocking).toBe(5);
192
+ expect(l.maxWallClockMin).toBeGreaterThan(0);
193
+ });
194
+ });
195
+ //# sourceMappingURL=review-strategy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-strategy.test.js","sourceRoot":"","sources":["../../src/__tests__/review-strategy.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,YAAY,GACb,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAG9F,MAAM,EAAE,GAAG,CAAC,KAAe,EAAE,OAA6D,EAAE,EAAE,EAAE,CAC9F,qBAAqB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;AAE1E,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACnC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;QACzB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAA;QACrC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC/B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QACxD,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAA;QACxG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAA;QAC3G,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,0EAA0E;IAC1E,iDAAiD;IACjD,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,4BAA4B,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;QAC9E,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,gCAAgC,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7F,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,eAAe,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;QAClF,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACvC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC3B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC,CAAA;QAChE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC9B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,CAAC,CAAA;QACpE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACnC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAA;QACjE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACjC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;QAClG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAClC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAA;QAC/B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;QAC3C,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACpE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,yEAAyE;IACzE,iDAAiD;IACjD,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACvD,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACnD,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;aAC3E,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;aAC3E,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;QAChD,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;aAC3E,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,eAAe,CAAC,CAAA;QAC9E,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,6EAA6E;IAC7E,4EAA4E;IAC5E,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,eAAe,CAAC,2BAA2B,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAChE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,2BAA2B,CAAC,CAAC;aAC7E,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,2BAA2B,CAAC,CAAC,IAAI,CAAC;aACtF,IAAI,CAAC,UAAU,CAAC,CAAA;IACrB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,WAAW,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,2EAA2E;QAC3E,MAAM,CAAC,WAAW,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAU,EAAE,CAAC;gBAC7D,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;gBAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,CAAA;gBAC1B,MAAM,CAAC,aAAa,CAAC,KAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,MAAM,OAAO,GAAG,CAAC,OAA+B,EAAE,EAAiB,EAAE,CACnE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAkB,CAAA;IAE5E,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAC5F,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;IACtG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;aACpF,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACvD,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;IAEF,yEAAyE;IACzE,kEAAkE;IAClE,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAuB,CAAA;QACzJ,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAuB,CAAA;QAC3I,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACtF,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IACrF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,yEAAyE;QACzE,mEAAmE;QACnE,0EAA0E;QAC1E,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAuB,CAAA;QAChJ,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACpF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAuB,CAAA;QAC1L,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACtF,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAChF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,GAAG,YAAY,EAAE,CAAA;QACxB,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC3B,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC7B,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -14,18 +14,18 @@
14
14
  {
15
15
  "name": "Anthropic model catalog",
16
16
  "url": "https://platform.claude.com/docs/en/about-claude/models/overview",
17
- "checks": ["claude-haiku-4-5-20251001", "claude-sonnet-5", "claude-opus-4-8"]
17
+ "checks": ["claude-haiku-4-5-20251001", "claude-sonnet-5", "claude-opus-5"]
18
18
  },
19
19
  {
20
20
  "name": "Anthropic model selection guide",
21
21
  "url": "https://platform.claude.com/docs/en/about-claude/models/choosing-a-model",
22
- "checks": ["Claude Haiku 4.5", "Claude Sonnet 5", "Claude Opus 4.8"]
22
+ "checks": ["Claude Haiku 4.5", "Claude Sonnet 5", "Claude Opus 5"]
23
23
  }
24
24
  ],
25
25
  "claude": {
26
26
  "fast": "claude-haiku-4-5-20251001",
27
27
  "balanced": "claude-sonnet-5",
28
- "thorough": "claude-opus-4-8"
28
+ "thorough": "claude-opus-5"
29
29
  },
30
30
  "codex_api": {
31
31
  "fast": "gpt-5.6-luna",
@@ -0,0 +1,202 @@
1
+ {
2
+ "schema_version": 1,
3
+ "version": "1.0.0",
4
+ "updated": "2026-08-07",
5
+ "generated_at": "2026-08-07T05:00:00Z",
6
+ "review_interval_days": 60,
7
+ "report": "docs/dynamic-thoroughness.md",
8
+ "runtime_status": "defined_not_wired",
9
+ "_runtime_status_note": "This file is the adopted policy, but no runtime code reads it yet — resolveClaudeModel/resolveCodexModel still apply the single quality.tier. Verification, documentation, and the citation contract are in place ahead of the resolver so the policy is settled before it is enforced.",
10
+ "_comment": "Single source of truth for how crosscheck picks a model, effort, and step set. Every review comment cites `version` so a past review can be explained by the policy in force when it ran. Supersedes review-model-tiers.json, which is retained for backwards compat. Re-verify every review_interval_days with `npm run verify:strategy`.",
11
+
12
+ "sources": [
13
+ {
14
+ "name": "Anthropic model catalog",
15
+ "url": "https://platform.claude.com/docs/en/about-claude/models/overview",
16
+ "checks": ["claude-opus-5", "claude-sonnet-5", "claude-haiku-4-5-20251001"]
17
+ },
18
+ {
19
+ "name": "Anthropic effort parameter",
20
+ "url": "https://platform.claude.com/docs/en/build-with-claude/effort",
21
+ "checks": ["xhigh", "effort"]
22
+ },
23
+ {
24
+ "name": "OpenAI model catalog",
25
+ "url": "https://developers.openai.com/api/docs/models",
26
+ "checks": ["gpt-5.6-luna", "gpt-5.6-terra", "gpt-5.6-sol"]
27
+ }
28
+ ],
29
+
30
+ "benchmarks": {
31
+ "swe_bench_verified": {
32
+ "measures": "Resolving real GitHub issues in Python repositories. Backend/general proxy only.",
33
+ "source": "https://benchlm.ai/benchmarks/sweVerified",
34
+ "as_of": "2026-08-06",
35
+ "caveat": "Comparable within one leaderboard run. Cross-leaderboard positions are indicative only."
36
+ },
37
+ "frontend_code_arena": {
38
+ "measures": "Blind pairwise human preference on generated frontend output: visual fidelity, interaction design, function.",
39
+ "source": "https://thenewstack.io/kimi-k3-open-weight-coding/",
40
+ "as_of": "2026-07-18",
41
+ "caveat": "Measures generation, not defect detection. Claude Opus 5 is absent from the retrieved leaderboard - a missing measurement, not a low score."
42
+ }
43
+ },
44
+
45
+ "models": {
46
+ "claude-opus-5": { "vendor": "claude", "license": "closed", "in_usd_mtok": 5, "out_usd_mtok": 25, "context": 1000000, "swe_bench_verified": 0.960, "frontend_elo": null, "effort_levels": ["low","medium","high","xhigh","max"] },
47
+ "claude-sonnet-5": { "vendor": "claude", "license": "closed", "in_usd_mtok": 3, "out_usd_mtok": 15, "context": 1000000, "swe_bench_verified": 0.852, "frontend_elo": null, "effort_levels": ["low","medium","high","xhigh","max"] },
48
+ "claude-haiku-4-5-20251001": { "vendor": "claude", "license": "closed", "in_usd_mtok": 1, "out_usd_mtok": 5, "context": 200000, "swe_bench_verified": 0.733, "frontend_elo": null, "effort_levels": [] },
49
+ "gpt-5.6-sol": { "vendor": "codex", "license": "closed", "in_usd_mtok": 5, "out_usd_mtok": 30, "context": 1050000, "swe_bench_verified": null, "frontend_elo": 1618, "effort_levels": ["none","low","medium","high","xhigh","max"] },
50
+ "gpt-5.6-terra": { "vendor": "codex", "license": "closed", "in_usd_mtok": 2, "out_usd_mtok": 12, "context": 1050000, "swe_bench_verified": null, "frontend_elo": null, "effort_levels": ["none","low","medium","high","xhigh","max"] },
51
+ "gpt-5.6-luna": { "vendor": "codex", "license": "closed", "in_usd_mtok": 0.2, "out_usd_mtok": 1.2, "context": 1050000, "swe_bench_verified": null, "frontend_elo": null, "effort_levels": ["none","low","medium","high","xhigh","max"] },
52
+
53
+ "kimi-k3": { "vendor": "opencode", "license": "Modified MIT", "in_usd_mtok": 3, "out_usd_mtok": 15, "context": 1000000, "swe_bench_verified": null, "frontend_elo": 1679, "effort_levels": [], "status": "planned" },
54
+ "glm-5.2": { "vendor": "opencode", "license": "MIT", "in_usd_mtok": 1.4, "out_usd_mtok": 4.4, "context": 1000000, "swe_bench_verified": null, "frontend_elo": 1587, "effort_levels": [], "status": "planned" },
55
+ "deepseek-v4-pro": { "vendor": "opencode", "license": "MIT", "in_usd_mtok": 0.435, "out_usd_mtok": 0.87, "context": 1000000, "swe_bench_verified": 0.806, "frontend_elo": null, "effort_levels": ["none","high","max"], "status": "planned" },
56
+ "deepseek-v4-flash": { "vendor": "opencode", "license": "MIT", "in_usd_mtok": 0.14, "out_usd_mtok": 0.28, "context": 1000000, "swe_bench_verified": 0.790, "frontend_elo": null, "effort_levels": ["none","high","max"], "status": "planned" }
57
+ },
58
+
59
+ "banned_models": [
60
+ {
61
+ "model": "claude-fable-5",
62
+ "reason": "Banned from code review on cost. $50/MTok output is 2x claude-opus-5 for a LOWER SWE-bench Verified score (95.0 vs 96.0). At the measured 48k output tokens per review that is $2.40 a call with no capability justification.",
63
+ "banned_on": "2026-08-07"
64
+ }
65
+ ],
66
+
67
+ "vendors": {
68
+ "claude": {
69
+ "cli": "claude", "honors_model_under_subscription": true, "min_cli_version": null,
70
+ "tiers": { "fast": "claude-haiku-4-5-20251001", "balanced": "claude-sonnet-5", "thorough": "claude-opus-5" }
71
+ },
72
+ "codex": {
73
+ "cli": "codex", "honors_model_under_subscription": true, "min_cli_version": "0.147.0",
74
+ "_min_cli_version_note": "gpt-5.6-* return HTTP 400 'requires a newer version of Codex' below this. The CLI accepts --model under subscription auth; the old auth!=api-key guard in resolveCodexModel was wrong and dropped the configured model.",
75
+ "tiers": { "fast": "gpt-5.6-luna", "balanced": "gpt-5.6-terra", "thorough": "gpt-5.6-sol" }
76
+ },
77
+ "opencode": {
78
+ "cli": "opencode", "honors_model_under_subscription": true, "min_cli_version": null,
79
+ "status": "planned",
80
+ "tiers": { "fast": "deepseek-v4-flash", "balanced": "glm-5.2", "thorough": "kimi-k3" }
81
+ }
82
+ },
83
+
84
+ "domains": {
85
+ "_comment": "Capability is domain-shaped, not scalar. claude-opus-5 leads backend defect resolution; kimi-k3 leads frontend. A single tier ladder cannot express that. Detected from changed-file extensions; `mixed` and `unknown` both fall back to `backend`, the conservative default.",
86
+ "frontend": {
87
+ "match_extensions": ["tsx", "jsx", "vue", "svelte", "css", "scss", "less", "html"],
88
+ "threshold": "more frontend files than backend files",
89
+ "preferred": { "thorough": ["kimi-k3", "gpt-5.6-sol", "claude-opus-5"], "balanced": ["glm-5.2", "claude-sonnet-5"], "fast": ["gpt-5.6-luna", "deepseek-v4-flash"] },
90
+ "basis": "Frontend Code Arena Elo: kimi-k3 1679 > gpt-5.6-sol 1618 > glm-5.2 1587. Falls back to installed vendors when opencode is unavailable.",
91
+ "confidence": "hypothesis - the benchmark measures generation, not review. Pending local A/B."
92
+ },
93
+ "backend": {
94
+ "match_extensions": ["py", "go", "rs", "java", "rb", "php", "sql", "ts"],
95
+ "preferred": { "thorough": ["claude-opus-5", "gpt-5.6-sol"], "balanced": ["claude-sonnet-5", "gpt-5.6-terra"], "fast": ["deepseek-v4-flash", "gpt-5.6-luna", "claude-haiku-4-5-20251001"] },
96
+ "basis": "SWE-bench Verified: claude-opus-5 0.960 > claude-sonnet-5 0.852 > deepseek-v4-pro 0.806 > claude-haiku-4-5 0.733.",
97
+ "confidence": "measured"
98
+ }
99
+ },
100
+
101
+ "_pr_classes_note": "ORDER IS THE ROUTING LOGIC - first match wins. `risky` sits second, immediately after `generated`, so consequence-based promotion dominates every cheapening rule below it: a deletion-only PR that removes auth code, or a 2-file change to a migration, must not fall through to `fast`.",
102
+ "pr_classes": [
103
+ {
104
+ "id": "generated", "label": "Generated / vendored only",
105
+ "match": { "all_files_match": ["(^|/)(dist|build|node_modules)/", "\\.(lock|sum)$", "(package-lock|pnpm-lock|yarn\\.lock)", "\\.(pb|_pb2)\\.[a-z]+$", "(^|/)generated/"] },
106
+ "tier": null, "effort": null, "steps": [],
107
+ "reason": "every changed file is generated or vendored - nothing here is human-authored"
108
+ },
109
+ {
110
+ "id": "risky", "label": "Security / data-critical",
111
+ "_any_path_matches_note": "Anchored on path segments and extensions. Unanchored, `auth` matched author/authors/oauth and `migration` matched MIGRATION_AND_GROWTH.md, promoting a pure-docs PR to thorough with a full fix/recheck loop.",
112
+ "match": {
113
+ "any_path_matches": ["(^|/)auth([/.]|$)", "(^|/)tokens?([/.]|$)", "(^|/)secrets?([/.]|$)", "(^|/)credentials?([/.]|$)", "(^|/)passwords?([/.]|$)", "(^|/)crypto([/.]|$)", "(^|/)payments?([/.]|$)", "(^|/)billing([/.]|$)", "(^|/)migrations?([/.]|$)", "\\.sql$", "(^|/)permissions?([/.]|$)", "(^|/)rbac([/.]|$)", "(^|/)sessions?([/.]|$)", "(^|/)cors([/.]|$)"],
114
+ "or_labels": ["risk:T3"],
115
+ "or_hotfix_to_default_branch": true
116
+ },
117
+ "tier": "thorough", "effort": "high", "steps": ["review", "fix", "recheck"],
118
+ "reason": "touches a security or data-critical path, where a missed defect is expensive - promoted on consequence, not on predicted difficulty"
119
+ },
120
+ {
121
+ "id": "deletion_only", "label": "Deletion-only",
122
+ "match": { "additions_max": 5, "requires_deletions": true },
123
+ "tier": "fast", "effort": "medium", "steps": ["review"],
124
+ "focus": "dangling references only: imports, call sites, config keys, route registrations, docs pointing at removed symbols",
125
+ "reason": "removal-only, so the risk is reference breakage rather than defect density; a wrong deletion is reverted, not patched"
126
+ },
127
+ {
128
+ "id": "docs", "label": "Documentation / specification",
129
+ "match": { "doc_fraction_min": 0.5 },
130
+ "tier": "balanced", "effort": "high", "steps": ["review"],
131
+ "focus": "internal contradiction, claims contradicted by the code the doc describes, stale cross-references",
132
+ "reason": "specification review is open-ended design negotiation, which no automated fix loop terminates - review only"
133
+ },
134
+ {
135
+ "id": "test_only", "label": "Test-only",
136
+ "match": { "all_files_match": ["((^|/)(__tests__|tests?|e2e|fixtures?)(/|$)|\\.(test|spec)\\.)"] },
137
+ "tier": "fast", "effort": "medium", "steps": ["review", "fix"],
138
+ "focus": "assertions that cannot fail, over-mocking that voids the test, coverage claimed but not exercised",
139
+ "reason": "tests only - no production code path changes"
140
+ },
141
+ {
142
+ "id": "config_infra", "label": "Config / infrastructure",
143
+ "match": { "config_fraction_min": 0.5, "source_files_max": 0 },
144
+ "tier": "balanced", "effort": "high", "steps": ["review", "fix", "recheck"],
145
+ "focus": "secrets in plaintext, permission widening, resource limits, deploy-order breakage",
146
+ "reason": "low defect density but high blast radius - cheap to review, expensive to get wrong"
147
+ },
148
+ {
149
+ "id": "trivial", "label": "Trivial",
150
+ "match": { "files_max": 3, "src_churn_max": 150 },
151
+ "tier": "fast", "effort": "medium", "steps": ["review", "fix"],
152
+ "reason": "small and low-risk, and PRs this size merge in minutes - latency matters more than depth"
153
+ },
154
+ {
155
+ "id": "standard", "label": "Standard code",
156
+ "match": {},
157
+ "tier": "balanced", "effort": "medium", "steps": ["review", "fix", "recheck"],
158
+ "reason": "default class - no narrower rule matched"
159
+ }
160
+ ],
161
+
162
+ "ladder": {
163
+ "_comment": "Escalate on measured non-convergence, never on predicted complexity. Scope narrows each round; the model never weakens. Where a model exposes no effort levels, the effort step degrades to a model step (see effort_fallback).",
164
+ "max_blocking_findings": 5,
165
+ "max_rounds": 3,
166
+ "max_wall_clock_min": 60,
167
+ "effort_fallback": "promote_tier",
168
+ "rounds": [
169
+ { "round": 1, "step": "review", "scope": "full_pr", "tier": "class", "effort": "class" },
170
+ { "round": 1, "step": "fix", "scope": "blocking_only", "tier": "same_as_review", "effort": "one_below_review" },
171
+ { "round": 2, "step": "recheck", "scope": "delta_plus_open", "tier": "same_as_review", "effort": "high" },
172
+ { "round": 3, "step": "recheck", "scope": "delta_plus_open", "tier": "same_as_review", "effort": "xhigh", "cross_vendor_switch": true },
173
+ { "round": 4, "step": "handoff", "scope": "digest", "tier": null, "effort": null }
174
+ ]
175
+ },
176
+
177
+ "modes": {
178
+ "cross_vendor": {
179
+ "strength": "An independent second perspective. A vendor switch broke a stalled loop twice in the census (PR #2057, #2060) after same-vendor escalation had failed for 3-6 rounds.",
180
+ "round_3_lever": "switch vendor AND raise effort",
181
+ "max_rounds": 3
182
+ },
183
+ "single_vendor": {
184
+ "strength": "One CLI to authenticate, version, and monitor. No routing logic.",
185
+ "round_3_lever": "raise effort, then promote one tier - no fresh-eyes option exists",
186
+ "max_rounds": 2
187
+ }
188
+ },
189
+
190
+ "conflict_resolve": {
191
+ "tier": "fast", "effort": "low",
192
+ "reason": "mechanical text surgery bounded by conflict markers - measured at 37s against ~643s for a review"
193
+ },
194
+
195
+ "citation": {
196
+ "_comment": "Every crosscheck comment states the strategy it ran under, so a past review can be explained by the policy in force at the time.",
197
+ "annotation_fields": ["strategy", "class", "tier"],
198
+ "annotation_example": "<!-- crosscheck: origin=claude reviewer=claude model=claude-opus-5 type=review round=1 verdict=BLOCK strategy=1.0.0 class=risky tier=thorough service=crosscheck sha=abc123 -->",
199
+ "body_template": "{tier} tier · {reason} · strategy v{version}",
200
+ "body_example": "_Reviewed with [Claude Code](https://claude.ai/code) via [Crosscheck](https://github.com/humanbased-ai/crosscheck) with Opus 5 (high) — thorough tier · touches a security or data-critical path, where a missed defect is expensive · strategy v1.0.0_"
201
+ }
202
+ }
@@ -1,8 +1,21 @@
1
1
  import type { CodexVendorConfig, QualityConfig, VendorConfig } from '../config/schema.js';
2
2
  export declare const CLAUDE_TIER_MODELS: Record<QualityConfig['tier'], string>;
3
3
  export declare const CODEX_TIER_MODELS_API: Record<QualityConfig['tier'], string>;
4
- export declare function resolveClaudeModel(quality: QualityConfig, vendor?: VendorConfig): string;
5
- export declare function resolveCodexModel(quality: QualityConfig, vendor: CodexVendorConfig): string;
4
+ /**
5
+ * The tier in force for one call. Under `quality.mode: 'smart'` the per-PR
6
+ * strategy wins; otherwise the single configured tier applies. Falls back to the
7
+ * configured tier whenever no strategy resolved — one-shot commands, or a PR
8
+ * whose file list could not be read.
9
+ */
10
+ export declare function effectiveTier(quality: QualityConfig, strategy?: {
11
+ tier: QualityConfig['tier'] | null;
12
+ } | null): QualityConfig['tier'];
13
+ export declare function resolveClaudeModel(quality: QualityConfig, vendor?: VendorConfig, strategy?: {
14
+ tier: QualityConfig['tier'] | null;
15
+ } | null): string;
16
+ export declare function resolveCodexModel(quality: QualityConfig, vendor: CodexVendorConfig, strategy?: {
17
+ tier: QualityConfig['tier'] | null;
18
+ } | null): string;
6
19
  export declare function modelDisplayName(model: string): string | null;
7
20
  export declare function primaryModelFromUsage(modelUsage: unknown): string | null;
8
21
  //# sourceMappingURL=review-models.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"review-models.d.ts","sourceRoot":"","sources":["../../src/lib/review-models.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAkBzF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,CAAgC,CAAA;AACrG,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,CAAmC,CAAA;AAE3G,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAMxF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAS3F;AAcD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG7D;AAQD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAgBxE"}
1
+ {"version":3,"file":"review-models.d.ts","sourceRoot":"","sources":["../../src/lib/review-models.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAkBzF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,CAAgC,CAAA;AACrG,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,CAAmC,CAAA;AAE3G;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,EACtB,QAAQ,CAAC,EAAE;IAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GACvD,aAAa,CAAC,MAAM,CAAC,CAGvB;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,YAAY,EACrB,QAAQ,CAAC,EAAE;IAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GACvD,MAAM,CAMR;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,CAAC,EAAE;IAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GACvD,MAAM,CAWR;AAcD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG7D;AAQD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAgBxE"}