@humanbased/crosscheck 1.2.0-beta.80 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +388 -149
  3. package/README.zh.md +1 -1
  4. package/crosscheck.config.example.yml +2 -63
  5. package/dist/__tests__/codex.test.js +27 -14
  6. package/dist/__tests__/codex.test.js.map +1 -1
  7. package/dist/__tests__/comment-bodies.test.js +1 -49
  8. package/dist/__tests__/comment-bodies.test.js.map +1 -1
  9. package/dist/__tests__/conflict-resolve.test.js +1 -44
  10. package/dist/__tests__/conflict-resolve.test.js.map +1 -1
  11. package/dist/__tests__/fix.test.js +0 -33
  12. package/dist/__tests__/fix.test.js.map +1 -1
  13. package/dist/__tests__/onboard-preservation.test.js +0 -5
  14. package/dist/__tests__/onboard-preservation.test.js.map +1 -1
  15. package/dist/__tests__/optimize.test.js +0 -2
  16. package/dist/__tests__/optimize.test.js.map +1 -1
  17. package/dist/__tests__/repo-picker.test.js +1 -7
  18. package/dist/__tests__/repo-picker.test.js.map +1 -1
  19. package/dist/__tests__/review-comment-body.test.js +0 -35
  20. package/dist/__tests__/review-comment-body.test.js.map +1 -1
  21. package/dist/__tests__/review-models.test.js +3 -19
  22. package/dist/__tests__/review-models.test.js.map +1 -1
  23. package/dist/__tests__/runner.test.js +1 -29
  24. package/dist/__tests__/runner.test.js.map +1 -1
  25. package/dist/cli.js +0 -29
  26. package/dist/cli.js.map +1 -1
  27. package/dist/commands/onboard.d.ts +0 -11
  28. package/dist/commands/onboard.d.ts.map +1 -1
  29. package/dist/commands/onboard.js +2 -88
  30. package/dist/commands/onboard.js.map +1 -1
  31. package/dist/commands/review.d.ts.map +1 -1
  32. package/dist/commands/review.js +6 -65
  33. package/dist/commands/review.js.map +1 -1
  34. package/dist/commands/run.d.ts.map +1 -1
  35. package/dist/commands/run.js +3 -23
  36. package/dist/commands/run.js.map +1 -1
  37. package/dist/commands/status.d.ts.map +1 -1
  38. package/dist/commands/status.js +1 -53
  39. package/dist/commands/status.js.map +1 -1
  40. package/dist/commands/watch.d.ts.map +1 -1
  41. package/dist/commands/watch.js +6 -52
  42. package/dist/commands/watch.js.map +1 -1
  43. package/dist/config/loader.d.ts +1 -3
  44. package/dist/config/loader.d.ts.map +1 -1
  45. package/dist/config/loader.js +0 -13
  46. package/dist/config/loader.js.map +1 -1
  47. package/dist/config/review-model-tiers.json +3 -3
  48. package/dist/config/schema.d.ts +10 -254
  49. package/dist/config/schema.d.ts.map +1 -1
  50. package/dist/config/schema.js +2 -62
  51. package/dist/config/schema.js.map +1 -1
  52. package/dist/github/client.d.ts +1 -6
  53. package/dist/github/client.d.ts.map +1 -1
  54. package/dist/github/client.js +7 -15
  55. package/dist/github/client.js.map +1 -1
  56. package/dist/issues/ticket-ref.d.ts.map +1 -1
  57. package/dist/issues/ticket-ref.js +5 -6
  58. package/dist/issues/ticket-ref.js.map +1 -1
  59. package/dist/lib/clone.d.ts +0 -1
  60. package/dist/lib/clone.d.ts.map +1 -1
  61. package/dist/lib/clone.js +10 -32
  62. package/dist/lib/clone.js.map +1 -1
  63. package/dist/lib/comment-bodies.d.ts +0 -35
  64. package/dist/lib/comment-bodies.d.ts.map +1 -1
  65. package/dist/lib/comment-bodies.js +9 -43
  66. package/dist/lib/comment-bodies.js.map +1 -1
  67. package/dist/lib/repo-picker.d.ts +0 -3
  68. package/dist/lib/repo-picker.d.ts.map +1 -1
  69. package/dist/lib/repo-picker.js +9 -45
  70. package/dist/lib/repo-picker.js.map +1 -1
  71. package/dist/lib/review-models.d.ts +2 -15
  72. package/dist/lib/review-models.d.ts.map +1 -1
  73. package/dist/lib/review-models.js +6 -26
  74. package/dist/lib/review-models.js.map +1 -1
  75. package/dist/lib/runner.d.ts +0 -12
  76. package/dist/lib/runner.d.ts.map +1 -1
  77. package/dist/lib/runner.js +42 -186
  78. package/dist/lib/runner.js.map +1 -1
  79. package/dist/lib/workflow.d.ts +0 -9
  80. package/dist/lib/workflow.d.ts.map +1 -1
  81. package/dist/lib/workflow.js +0 -20
  82. package/dist/lib/workflow.js.map +1 -1
  83. package/dist/reviewers/claude.d.ts +1 -4
  84. package/dist/reviewers/claude.d.ts.map +1 -1
  85. package/dist/reviewers/claude.js +7 -39
  86. package/dist/reviewers/claude.js.map +1 -1
  87. package/dist/reviewers/codex.d.ts +1 -3
  88. package/dist/reviewers/codex.d.ts.map +1 -1
  89. package/dist/reviewers/codex.js +70 -76
  90. package/dist/reviewers/codex.js.map +1 -1
  91. package/dist/reviewers/conflict-resolve.d.ts +1 -3
  92. package/dist/reviewers/conflict-resolve.d.ts.map +1 -1
  93. package/dist/reviewers/conflict-resolve.js +6 -21
  94. package/dist/reviewers/conflict-resolve.js.map +1 -1
  95. package/dist/reviewers/fix.d.ts +2 -5
  96. package/dist/reviewers/fix.d.ts.map +1 -1
  97. package/dist/reviewers/fix.js +10 -26
  98. package/dist/reviewers/fix.js.map +1 -1
  99. package/get-started.md +4 -139
  100. package/package.json +3 -4
  101. package/assets/icon-256.png +0 -0
  102. package/assets/linear-comment.svg +0 -18
  103. package/assets/linear-onboard.svg +0 -30
  104. package/assets/linear-status.svg +0 -23
  105. package/assets/linear-test.svg +0 -34
  106. package/assets/skills/code-review/.crosscheck-skill.json +0 -9
  107. package/assets/skills/code-review/LICENSE +0 -21
  108. package/assets/skills/code-review/SKILL.md +0 -89
  109. package/assets/skills/code-review/agents/openai.yaml +0 -3
  110. package/assets/skills/code-review-skill/.crosscheck-skill.json +0 -9
  111. package/assets/skills/code-review-skill/LICENSE +0 -21
  112. package/assets/skills/code-review-skill/SKILL.md +0 -231
  113. package/assets/skills/code-review-skill/assets/pr-review-template.md +0 -137
  114. package/assets/skills/code-review-skill/assets/review-checklist.md +0 -123
  115. package/assets/skills/code-review-skill/reference/angular.md +0 -768
  116. package/assets/skills/code-review-skill/reference/architecture-review-guide.md +0 -472
  117. package/assets/skills/code-review-skill/reference/c.md +0 -890
  118. package/assets/skills/code-review-skill/reference/code-quality-universal.md +0 -488
  119. package/assets/skills/code-review-skill/reference/code-review-best-practices.md +0 -136
  120. package/assets/skills/code-review-skill/reference/common-bugs-checklist.md +0 -286
  121. package/assets/skills/code-review-skill/reference/cpp.md +0 -893
  122. package/assets/skills/code-review-skill/reference/cross-cutting/async-concurrency-patterns.md +0 -515
  123. package/assets/skills/code-review-skill/reference/cross-cutting/error-handling-principles.md +0 -492
  124. package/assets/skills/code-review-skill/reference/cross-cutting/n-plus-one-queries.md +0 -309
  125. package/assets/skills/code-review-skill/reference/cross-cutting/sql-injection-prevention.md +0 -308
  126. package/assets/skills/code-review-skill/reference/cross-cutting/xss-prevention.md +0 -264
  127. package/assets/skills/code-review-skill/reference/csharp.md +0 -525
  128. package/assets/skills/code-review-skill/reference/css-less-sass.md +0 -661
  129. package/assets/skills/code-review-skill/reference/django.md +0 -985
  130. package/assets/skills/code-review-skill/reference/fastapi.md +0 -580
  131. package/assets/skills/code-review-skill/reference/go.md +0 -993
  132. package/assets/skills/code-review-skill/reference/java.md +0 -409
  133. package/assets/skills/code-review-skill/reference/java8.md +0 -586
  134. package/assets/skills/code-review-skill/reference/kotlin.md +0 -1018
  135. package/assets/skills/code-review-skill/reference/nestjs.md +0 -593
  136. package/assets/skills/code-review-skill/reference/performance-review-guide.md +0 -816
  137. package/assets/skills/code-review-skill/reference/php.md +0 -684
  138. package/assets/skills/code-review-skill/reference/python.md +0 -1073
  139. package/assets/skills/code-review-skill/reference/qt.md +0 -757
  140. package/assets/skills/code-review-skill/reference/react.md +0 -871
  141. package/assets/skills/code-review-skill/reference/ruby.md +0 -964
  142. package/assets/skills/code-review-skill/reference/rust.md +0 -846
  143. package/assets/skills/code-review-skill/reference/security-review-guide.md +0 -494
  144. package/assets/skills/code-review-skill/reference/svelte.md +0 -1064
  145. package/assets/skills/code-review-skill/reference/swift.md +0 -936
  146. package/assets/skills/code-review-skill/reference/typescript.md +0 -1016
  147. package/assets/skills/code-review-skill/reference/vue.md +0 -924
  148. package/assets/skills/code-review-skill/reference/zig.md +0 -440
  149. package/assets/skills/code-review-skill/scripts/pr-analyzer.py +0 -435
  150. package/assets/skills/code-review-skill/scripts/test_pr_analyzer.py +0 -380
  151. package/assets/skills/codebase-design/.crosscheck-skill.json +0 -9
  152. package/assets/skills/codebase-design/DEEPENING.md +0 -37
  153. package/assets/skills/codebase-design/DESIGN-IT-TWICE.md +0 -44
  154. package/assets/skills/codebase-design/LICENSE +0 -21
  155. package/assets/skills/codebase-design/SKILL.md +0 -114
  156. package/assets/skills/codebase-design/agents/openai.yaml +0 -3
  157. package/assets/skills/diagnosing-bugs/.crosscheck-skill.json +0 -9
  158. package/assets/skills/diagnosing-bugs/LICENSE +0 -21
  159. package/assets/skills/diagnosing-bugs/SKILL.md +0 -134
  160. package/assets/skills/diagnosing-bugs/agents/openai.yaml +0 -3
  161. package/assets/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +0 -41
  162. package/dist/__tests__/can-write-verdict.test.d.ts +0 -2
  163. package/dist/__tests__/can-write-verdict.test.d.ts.map +0 -1
  164. package/dist/__tests__/can-write-verdict.test.js +0 -31
  165. package/dist/__tests__/can-write-verdict.test.js.map +0 -1
  166. package/dist/__tests__/linear-branding.test.d.ts +0 -2
  167. package/dist/__tests__/linear-branding.test.d.ts.map +0 -1
  168. package/dist/__tests__/linear-branding.test.js +0 -156
  169. package/dist/__tests__/linear-branding.test.js.map +0 -1
  170. package/dist/__tests__/linear-client.test.d.ts +0 -2
  171. package/dist/__tests__/linear-client.test.d.ts.map +0 -1
  172. package/dist/__tests__/linear-client.test.js +0 -120
  173. package/dist/__tests__/linear-client.test.js.map +0 -1
  174. package/dist/__tests__/linear-comment.test.d.ts +0 -2
  175. package/dist/__tests__/linear-comment.test.d.ts.map +0 -1
  176. package/dist/__tests__/linear-comment.test.js +0 -151
  177. package/dist/__tests__/linear-comment.test.js.map +0 -1
  178. package/dist/__tests__/linear-identity.test.d.ts +0 -2
  179. package/dist/__tests__/linear-identity.test.d.ts.map +0 -1
  180. package/dist/__tests__/linear-identity.test.js +0 -253
  181. package/dist/__tests__/linear-identity.test.js.map +0 -1
  182. package/dist/__tests__/linear-notify.test.d.ts +0 -2
  183. package/dist/__tests__/linear-notify.test.d.ts.map +0 -1
  184. package/dist/__tests__/linear-notify.test.js +0 -144
  185. package/dist/__tests__/linear-notify.test.js.map +0 -1
  186. package/dist/__tests__/linear-ref.test.d.ts +0 -2
  187. package/dist/__tests__/linear-ref.test.d.ts.map +0 -1
  188. package/dist/__tests__/linear-ref.test.js +0 -261
  189. package/dist/__tests__/linear-ref.test.js.map +0 -1
  190. package/dist/__tests__/linear-test-ref.test.d.ts +0 -2
  191. package/dist/__tests__/linear-test-ref.test.d.ts.map +0 -1
  192. package/dist/__tests__/linear-test-ref.test.js +0 -81
  193. package/dist/__tests__/linear-test-ref.test.js.map +0 -1
  194. package/dist/__tests__/linear-verify.test.d.ts +0 -2
  195. package/dist/__tests__/linear-verify.test.d.ts.map +0 -1
  196. package/dist/__tests__/linear-verify.test.js +0 -132
  197. package/dist/__tests__/linear-verify.test.js.map +0 -1
  198. package/dist/__tests__/linear-worker.test.d.ts +0 -2
  199. package/dist/__tests__/linear-worker.test.d.ts.map +0 -1
  200. package/dist/__tests__/linear-worker.test.js +0 -83
  201. package/dist/__tests__/linear-worker.test.js.map +0 -1
  202. package/dist/__tests__/linear-write-possible.test.d.ts +0 -2
  203. package/dist/__tests__/linear-write-possible.test.d.ts.map +0 -1
  204. package/dist/__tests__/linear-write-possible.test.js +0 -30
  205. package/dist/__tests__/linear-write-possible.test.js.map +0 -1
  206. package/dist/__tests__/repository-guidance.test.d.ts +0 -2
  207. package/dist/__tests__/repository-guidance.test.d.ts.map +0 -1
  208. package/dist/__tests__/repository-guidance.test.js +0 -107
  209. package/dist/__tests__/repository-guidance.test.js.map +0 -1
  210. package/dist/__tests__/review-strategy.test.d.ts +0 -2
  211. package/dist/__tests__/review-strategy.test.d.ts.map +0 -1
  212. package/dist/__tests__/review-strategy.test.js +0 -195
  213. package/dist/__tests__/review-strategy.test.js.map +0 -1
  214. package/dist/__tests__/skill-attribution.test.d.ts +0 -2
  215. package/dist/__tests__/skill-attribution.test.d.ts.map +0 -1
  216. package/dist/__tests__/skill-attribution.test.js +0 -53
  217. package/dist/__tests__/skill-attribution.test.js.map +0 -1
  218. package/dist/__tests__/skill-broker.test.d.ts +0 -2
  219. package/dist/__tests__/skill-broker.test.d.ts.map +0 -1
  220. package/dist/__tests__/skill-broker.test.js +0 -144
  221. package/dist/__tests__/skill-broker.test.js.map +0 -1
  222. package/dist/__tests__/skill-catalog.test.d.ts +0 -2
  223. package/dist/__tests__/skill-catalog.test.d.ts.map +0 -1
  224. package/dist/__tests__/skill-catalog.test.js +0 -40
  225. package/dist/__tests__/skill-catalog.test.js.map +0 -1
  226. package/dist/__tests__/skill-installer.test.d.ts +0 -2
  227. package/dist/__tests__/skill-installer.test.d.ts.map +0 -1
  228. package/dist/__tests__/skill-installer.test.js +0 -96
  229. package/dist/__tests__/skill-installer.test.js.map +0 -1
  230. package/dist/__tests__/skills-config.test.d.ts +0 -2
  231. package/dist/__tests__/skills-config.test.d.ts.map +0 -1
  232. package/dist/__tests__/skills-config.test.js +0 -12
  233. package/dist/__tests__/skills-config.test.js.map +0 -1
  234. package/dist/commands/linear-test.d.ts +0 -18
  235. package/dist/commands/linear-test.d.ts.map +0 -1
  236. package/dist/commands/linear-test.js +0 -130
  237. package/dist/commands/linear-test.js.map +0 -1
  238. package/dist/commands/skill.d.ts +0 -2
  239. package/dist/commands/skill.d.ts.map +0 -1
  240. package/dist/commands/skill.js +0 -16
  241. package/dist/commands/skill.js.map +0 -1
  242. package/dist/config/review-strategy.json +0 -202
  243. package/dist/lib/repository-guidance.d.ts +0 -2
  244. package/dist/lib/repository-guidance.d.ts.map +0 -1
  245. package/dist/lib/repository-guidance.js +0 -55
  246. package/dist/lib/repository-guidance.js.map +0 -1
  247. package/dist/lib/review-strategy.d.ts +0 -62
  248. package/dist/lib/review-strategy.d.ts.map +0 -1
  249. package/dist/lib/review-strategy.js +0 -235
  250. package/dist/lib/review-strategy.js.map +0 -1
  251. package/dist/linear/client.d.ts +0 -18
  252. package/dist/linear/client.d.ts.map +0 -1
  253. package/dist/linear/client.js +0 -67
  254. package/dist/linear/client.js.map +0 -1
  255. package/dist/linear/comment.d.ts +0 -20
  256. package/dist/linear/comment.d.ts.map +0 -1
  257. package/dist/linear/comment.js +0 -57
  258. package/dist/linear/comment.js.map +0 -1
  259. package/dist/linear/identity.d.ts +0 -59
  260. package/dist/linear/identity.d.ts.map +0 -1
  261. package/dist/linear/identity.js +0 -187
  262. package/dist/linear/identity.js.map +0 -1
  263. package/dist/linear/notify.d.ts +0 -35
  264. package/dist/linear/notify.d.ts.map +0 -1
  265. package/dist/linear/notify.js +0 -76
  266. package/dist/linear/notify.js.map +0 -1
  267. package/dist/linear/ref.d.ts +0 -13
  268. package/dist/linear/ref.d.ts.map +0 -1
  269. package/dist/linear/ref.js +0 -90
  270. package/dist/linear/ref.js.map +0 -1
  271. package/dist/linear/verify.d.ts +0 -26
  272. package/dist/linear/verify.d.ts.map +0 -1
  273. package/dist/linear/verify.js +0 -67
  274. package/dist/linear/verify.js.map +0 -1
  275. package/dist/skills/attribution.d.ts +0 -4
  276. package/dist/skills/attribution.d.ts.map +0 -1
  277. package/dist/skills/attribution.js +0 -14
  278. package/dist/skills/attribution.js.map +0 -1
  279. package/dist/skills/broker-server.d.ts +0 -2
  280. package/dist/skills/broker-server.d.ts.map +0 -1
  281. package/dist/skills/broker-server.js +0 -17
  282. package/dist/skills/broker-server.js.map +0 -1
  283. package/dist/skills/broker.d.ts +0 -42
  284. package/dist/skills/broker.d.ts.map +0 -1
  285. package/dist/skills/broker.js +0 -285
  286. package/dist/skills/broker.js.map +0 -1
  287. package/dist/skills/catalog.d.ts +0 -28
  288. package/dist/skills/catalog.d.ts.map +0 -1
  289. package/dist/skills/catalog.js +0 -104
  290. package/dist/skills/catalog.js.map +0 -1
  291. package/dist/skills/installer.d.ts +0 -10
  292. package/dist/skills/installer.d.ts.map +0 -1
  293. package/dist/skills/installer.js +0 -138
  294. package/dist/skills/installer.js.map +0 -1
  295. package/dist/skills/integrity.d.ts +0 -4
  296. package/dist/skills/integrity.d.ts.map +0 -1
  297. package/dist/skills/integrity.js +0 -36
  298. package/dist/skills/integrity.js.map +0 -1
  299. package/docs/dynamic-thoroughness.md +0 -286
  300. package/docs/linear-identity-contract.md +0 -139
  301. package/docs/linear-identity.md +0 -293
@@ -1,202 +0,0 @@
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,2 +0,0 @@
1
- export declare function loadRepositoryReviewGuidance(repoDir: string, baseBranch: string): string;
2
- //# sourceMappingURL=repository-guidance.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repository-guidance.d.ts","sourceRoot":"","sources":["../../src/lib/repository-guidance.ts"],"names":[],"mappings":"AAcA,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CA0CxF"}
@@ -1,55 +0,0 @@
1
- import { execFileSync } from 'child_process';
2
- import { dirname } from 'path';
3
- const GUIDANCE_FILES = new Set(['AGENTS.md', 'CLAUDE.md']);
4
- function git(repoDir, args) {
5
- return execFileSync('git', args, {
6
- cwd: repoDir,
7
- encoding: 'utf8',
8
- stdio: ['ignore', 'pipe', 'pipe'],
9
- maxBuffer: 2 * 1024 * 1024,
10
- }).trim();
11
- }
12
- export function loadRepositoryReviewGuidance(repoDir, baseBranch) {
13
- const baseRef = `origin/${baseBranch}`;
14
- try {
15
- const changedPaths = git(repoDir, ['diff', '--name-only', '--diff-filter=ACDMRT', `${baseRef}...HEAD`, '--'])
16
- .split('\n').filter(Boolean);
17
- if (changedPaths.length === 0)
18
- return '';
19
- const scopes = new Set(['.']);
20
- for (const changedPath of changedPaths) {
21
- let scope = dirname(changedPath);
22
- while (scope !== '.') {
23
- scopes.add(scope);
24
- scope = dirname(scope);
25
- }
26
- }
27
- const candidates = [...scopes].flatMap(scope => [...GUIDANCE_FILES].map(file => scope === '.' ? file : `${scope}/${file}`));
28
- const checks = execFileSync('git', ['cat-file', '--batch-check'], {
29
- cwd: repoDir,
30
- encoding: 'utf8',
31
- input: candidates.map(path => `${baseRef}:${path}\n`).join(''),
32
- stdio: ['pipe', 'pipe', 'pipe'],
33
- maxBuffer: 2 * 1024 * 1024,
34
- }).trim().split('\n');
35
- const guidancePaths = candidates
36
- .filter((_, index) => checks[index]?.includes(' blob '))
37
- .sort((a, b) => a.split('/').length - b.split('/').length || a.localeCompare(b));
38
- if (guidancePaths.length === 0)
39
- return '';
40
- const sections = guidancePaths.map(path => {
41
- const scope = dirname(path);
42
- const content = git(repoDir, ['show', `${baseRef}:${path}`]);
43
- return `### ${path} (scope: ${scope === '.' ? 'repository root' : `${scope}/`})\n${content}`;
44
- });
45
- return [
46
- '## Repository-defined review practices (trusted base branch)',
47
- 'These repository practices override conflicting advice from Crosscheck-provided skills. Apply each file only within its stated scope. More specific directory guidance overrides broader guidance. At the same scope, reconcile AGENTS.md and CLAUDE.md; if they conflict, report the ambiguity instead of inventing a rule.',
48
- ...sections,
49
- ].join('\n\n');
50
- }
51
- catch {
52
- return '';
53
- }
54
- }
55
- //# sourceMappingURL=repository-guidance.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repository-guidance.js","sourceRoot":"","sources":["../../src/lib/repository-guidance.ts"],"names":[],"mappings":"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"}
@@ -1,62 +0,0 @@
1
- import type { QualityConfig } from '../config/schema.js';
2
- export type Tier = QualityConfig['tier'];
3
- export type Domain = 'frontend' | 'backend';
4
- export interface PRContext {
5
- files: string[];
6
- additions: number;
7
- deletions: number;
8
- labels?: string[];
9
- title?: string;
10
- baseRef?: string;
11
- defaultBranch?: string;
12
- }
13
- export interface ResolvedStrategy {
14
- /** Strategy file version, stamped into every comment so a past review stays explicable. */
15
- version: string;
16
- classId: string;
17
- classLabel: string;
18
- /** Human-readable rationale, quoted verbatim in the PR comment. */
19
- reason: string;
20
- /** null = skip this PR entirely. */
21
- tier: Tier | null;
22
- effort: string | null;
23
- steps: string[];
24
- focus?: string;
25
- domain: Domain;
26
- }
27
- /**
28
- * Frontend vs backend, by file-extension majority. `mixed` and `unknown` both
29
- * fall back to backend — the conservative default, because the backend
30
- * preference list is `measured` while the frontend list is still a hypothesis.
31
- */
32
- export declare function detectDomain(files: string[]): Domain;
33
- /** Classifies a PR against the strategy's ordered class list. First match wins. */
34
- export declare function resolveReviewStrategy(pr: PRContext): ResolvedStrategy;
35
- /** Effort levels a model accepts. Empty array = the model has no effort control. */
36
- export declare function effortLevelsFor(model: string): string[];
37
- export declare function isModelBanned(model: string): boolean;
38
- export declare function strategyModelFor(vendor: string, tier: Tier): string | null;
39
- export declare function strategyVersion(): string;
40
- export declare function ladderLimits(): {
41
- maxRounds: number;
42
- maxBlocking: number;
43
- maxWallClockMin: number;
44
- };
45
- /**
46
- * Escalation for round N. Raises effort where the model supports it; where it
47
- * does not (most open-weight models expose no effort ladder), degrades to a
48
- * tier promotion instead — `ladder.effort_fallback`.
49
- *
50
- * The model never weakens across rounds. Scope narrows instead: a recheck
51
- * examines the delta plus the open findings, not the whole PR again.
52
- */
53
- export declare function escalate(base: {
54
- tier: Tier;
55
- effort: string | null;
56
- }, round: number, model: string): {
57
- tier: Tier;
58
- effort: string | null;
59
- };
60
- /** Clamps a requested effort to what the model actually accepts. */
61
- export declare function clampEffort(model: string, effort: string | null): string | null;
62
- //# sourceMappingURL=review-strategy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-strategy.d.ts","sourceRoot":"","sources":["../../src/lib/review-strategy.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAIxD,MAAM,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;AACxC,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;AA2E3C,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAA;IACd,oCAAoC;IACpC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAUD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAIpD;AAoDD,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,SAAS,GAAG,gBAAgB,CAerE;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAE1E;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,YAAY,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAMlG;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC3C,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAmBvC;AAED,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAa/E"}
@@ -1,235 +0,0 @@
1
- // Resolves the per-PR review strategy: which class a PR falls into, which tier
2
- // and effort that class earns, and which steps run. Reads the versioned policy
3
- // in config/review-strategy.json so the routing decision and the explanation
4
- // posted on the PR come from one place and cannot drift apart.
5
- //
6
- // Two rules constrain what classification may conclude (see
7
- // docs/dynamic-thoroughness.md §6.8):
8
- // - it may set a FLOOR, or promote on CONSEQUENCE (a security path is
9
- // reviewed thoroughly because a miss there is expensive);
10
- // - it may NOT predict that a PR will be hard. Static features do not support
11
- // that inference — difficulty is discovered by reviewing, so escalation is
12
- // driven by measured non-convergence instead (see escalate()).
13
- import { createRequire } from 'module';
14
- import { z } from 'zod';
15
- const require = createRequire(import.meta.url);
16
- /** Ordered effort ladder. Index-based so escalation is a step, not a lookup. */
17
- const EFFORT_LADDER = ['none', 'low', 'medium', 'high', 'xhigh', 'max'];
18
- const MatchSchema = z.object({
19
- all_files_match: z.array(z.string()).optional(),
20
- any_path_matches: z.array(z.string()).optional(),
21
- or_labels: z.array(z.string()).optional(),
22
- or_hotfix_to_default_branch: z.boolean().optional(),
23
- additions_max: z.number().optional(),
24
- requires_deletions: z.boolean().optional(),
25
- doc_fraction_min: z.number().optional(),
26
- config_fraction_min: z.number().optional(),
27
- source_files_max: z.number().optional(),
28
- files_max: z.number().optional(),
29
- src_churn_max: z.number().optional(),
30
- });
31
- const PRClassSchema = z.object({
32
- id: z.string(),
33
- label: z.string(),
34
- match: MatchSchema,
35
- tier: z.enum(['fast', 'balanced', 'thorough']).nullable(),
36
- // Not z.string(): a typo ("higgh") would validate, then read as -1 in
37
- // clampEffort and silently drop the whole class to the model's lowest level.
38
- effort: z.enum(EFFORT_LADDER).nullable(),
39
- steps: z.array(z.string()),
40
- focus: z.string().optional(),
41
- reason: z.string(),
42
- });
43
- const StrategySchema = z.object({
44
- version: z.string(),
45
- updated: z.string(),
46
- models: z.record(z.string(), z.object({
47
- vendor: z.string(),
48
- effort_levels: z.array(z.string()),
49
- }).passthrough()),
50
- banned_models: z.array(z.object({ model: z.string(), reason: z.string() })).default([]),
51
- vendors: z.record(z.string(), z.object({
52
- tiers: z.record(z.string(), z.string()),
53
- }).passthrough()),
54
- domains: z.record(z.string(), z.unknown()),
55
- // .min(1): resolveReviewStrategy falls back to the last entry, which is
56
- // undefined — and throws on `cls.id` — for an empty list.
57
- pr_classes: z.array(PRClassSchema).min(1),
58
- ladder: z.object({
59
- max_blocking_findings: z.number(),
60
- max_rounds: z.number(),
61
- max_wall_clock_min: z.number(),
62
- effort_fallback: z.string(),
63
- }).passthrough(),
64
- }).passthrough();
65
- const raw = require('../config/review-strategy.json');
66
- const STRATEGY = StrategySchema.parse(raw);
67
- const TIER_LADDER = ['fast', 'balanced', 'thorough'];
68
- /** Position on EFFORT_LADDER; -1 for null or an unrecognised level. */
69
- function effortIndex(effort) {
70
- return effort === null ? -1 : EFFORT_LADDER.indexOf(effort);
71
- }
72
- const FRONTEND_EXT = /\.(tsx|jsx|vue|svelte|css|scss|less|html)$/i;
73
- const BACKEND_EXT = /\.(py|go|rs|java|rb|php|sql|ts)$/i;
74
- const DOC_EXT = /\.(md|mdx|rst|adoc)$/i;
75
- const CONFIG_EXT = /(\.(json|ya?ml|toml|ini|lock|txt|csv|svg|png|jpe?g)$|^\.github\/)/i;
76
- // Anchored on path segments and extensions. Unanchored, `spec` matched
77
- // src/lib/pr-spec.ts and `test` matched any latest.ts, routing ordinary source
78
- // PRs to test_only with a test-focused prompt.
79
- const TEST_PATH = /((^|\/)(__tests__|tests?|e2e|fixtures?)(\/|$)|\.(test|spec)\.)/i;
80
- const GENERATED = /((^|\/)(dist|build|node_modules)\/|\.(lock|sum)$|package-lock|pnpm-lock|yarn\.lock|\.(pb|_pb2)\.[a-z]+$|(^|\/)generated\/)/i;
81
- function srcChurnFraction(files) {
82
- if (files.length === 0)
83
- return { doc: 0, config: 0, source: 0 };
84
- const doc = files.filter(f => DOC_EXT.test(f)).length / files.length;
85
- const config = files.filter(f => CONFIG_EXT.test(f)).length / files.length;
86
- const source = files.filter(f => !DOC_EXT.test(f) && !CONFIG_EXT.test(f) && !GENERATED.test(f) && !TEST_PATH.test(f)).length;
87
- return { doc, config, source };
88
- }
89
- /**
90
- * Frontend vs backend, by file-extension majority. `mixed` and `unknown` both
91
- * fall back to backend — the conservative default, because the backend
92
- * preference list is `measured` while the frontend list is still a hypothesis.
93
- */
94
- export function detectDomain(files) {
95
- const fe = files.filter(f => FRONTEND_EXT.test(f)).length;
96
- const be = files.filter(f => BACKEND_EXT.test(f)).length;
97
- return fe > be ? 'frontend' : 'backend';
98
- }
99
- function matches(cls, pr) {
100
- const m = cls.match;
101
- const { files, additions, deletions } = pr;
102
- // An empty match object is the fallthrough class.
103
- if (Object.keys(m).length === 0)
104
- return true;
105
- // Never classify an empty file list as anything but the fallthrough.
106
- if (files.length === 0)
107
- return false;
108
- if (m.all_files_match) {
109
- const res = m.all_files_match.map(p => new RegExp(p, 'i'));
110
- if (!files.every(f => res.some(r => r.test(f))))
111
- return false;
112
- }
113
- // `any_path_matches` is an OR-group with labels and the hotfix rule: any one
114
- // of the three promotes. Only evaluated when the class declares them.
115
- if (m.any_path_matches || m.or_labels || m.or_hotfix_to_default_branch) {
116
- const pathHit = m.any_path_matches
117
- ? files.some(f => m.any_path_matches.some(p => new RegExp(p, 'i').test(f)))
118
- : false;
119
- const labelHit = m.or_labels ? (pr.labels ?? []).some(l => m.or_labels.includes(l)) : false;
120
- const hotfixHit = m.or_hotfix_to_default_branch === true
121
- && /^hotfix/i.test(pr.title ?? '')
122
- && pr.baseRef !== undefined
123
- && pr.baseRef === pr.defaultBranch;
124
- if (!pathHit && !labelHit && !hotfixHit)
125
- return false;
126
- }
127
- if (m.additions_max !== undefined && additions > m.additions_max)
128
- return false;
129
- if (m.requires_deletions === true && deletions <= 0)
130
- return false;
131
- const frac = srcChurnFraction(files);
132
- if (m.doc_fraction_min !== undefined && frac.doc < m.doc_fraction_min)
133
- return false;
134
- if (m.config_fraction_min !== undefined && frac.config < m.config_fraction_min)
135
- return false;
136
- if (m.source_files_max !== undefined && frac.source > m.source_files_max)
137
- return false;
138
- if (m.files_max !== undefined && files.length > m.files_max)
139
- return false;
140
- if (m.src_churn_max !== undefined) {
141
- const srcFiles = files.filter(f => !GENERATED.test(f) && !CONFIG_EXT.test(f));
142
- // Churn is only attributable per-file with a full diff; approximate with the
143
- // PR total when the change is entirely source, which is the case that matters.
144
- // Fails CLOSED when churn cannot be attributed: falling back to 0 passed
145
- // every cap, so one stray config file routed a 5,000-line change to the
146
- // core runner into `trivial` — fast tier, no recheck.
147
- const churn = srcFiles.length === files.length ? additions + deletions : Infinity;
148
- if (churn > m.src_churn_max)
149
- return false;
150
- }
151
- return true;
152
- }
153
- /** Classifies a PR against the strategy's ordered class list. First match wins. */
154
- export function resolveReviewStrategy(pr) {
155
- const cls = STRATEGY.pr_classes.find(c => matches(c, pr))
156
- ?? STRATEGY.pr_classes[STRATEGY.pr_classes.length - 1];
157
- return {
158
- version: STRATEGY.version,
159
- classId: cls.id,
160
- classLabel: cls.label,
161
- reason: cls.reason,
162
- tier: cls.tier,
163
- effort: cls.effort,
164
- steps: cls.steps,
165
- ...(cls.focus !== undefined && { focus: cls.focus }),
166
- domain: detectDomain(pr.files),
167
- };
168
- }
169
- /** Effort levels a model accepts. Empty array = the model has no effort control. */
170
- export function effortLevelsFor(model) {
171
- return STRATEGY.models[model]?.effort_levels ?? [];
172
- }
173
- export function isModelBanned(model) {
174
- return STRATEGY.banned_models.some(b => b.model === model);
175
- }
176
- export function strategyModelFor(vendor, tier) {
177
- return STRATEGY.vendors[vendor]?.tiers[tier] ?? null;
178
- }
179
- export function strategyVersion() {
180
- return STRATEGY.version;
181
- }
182
- export function ladderLimits() {
183
- return {
184
- maxRounds: STRATEGY.ladder.max_rounds,
185
- maxBlocking: STRATEGY.ladder.max_blocking_findings,
186
- maxWallClockMin: STRATEGY.ladder.max_wall_clock_min,
187
- };
188
- }
189
- /**
190
- * Escalation for round N. Raises effort where the model supports it; where it
191
- * does not (most open-weight models expose no effort ladder), degrades to a
192
- * tier promotion instead — `ladder.effort_fallback`.
193
- *
194
- * The model never weakens across rounds. Scope narrows instead: a recheck
195
- * examines the delta plus the open findings, not the whole PR again.
196
- */
197
- export function escalate(base, round, model) {
198
- if (round <= 1)
199
- return base;
200
- // Clamp the target to what the model accepts, then compare it against what the
201
- // round before already asked for. An exact `levels.includes(target)` test made
202
- // round 3 miss on any model whose ladder tops out below xhigh (deepseek:
203
- // none/high/max) and return base.effort — weaker than round 2.
204
- const target = round >= 3 ? 'xhigh' : 'high';
205
- const clamped = clampEffort(model, target);
206
- const previous = round >= 3 ? clampEffort(model, 'high') ?? base.effort : base.effort;
207
- if (clamped !== null && effortIndex(clamped) > effortIndex(previous)) {
208
- return { tier: base.tier, effort: clamped };
209
- }
210
- // Effort cannot rise on this model — promote a tier instead (the strategy's
211
- // ladder.effort_fallback), capped at thorough.
212
- const idx = TIER_LADDER.indexOf(base.tier);
213
- const promoted = TIER_LADDER[Math.min(idx + 1, TIER_LADDER.length - 1)];
214
- return { tier: promoted, effort: clamped ?? base.effort };
215
- }
216
- /** Clamps a requested effort to what the model actually accepts. */
217
- export function clampEffort(model, effort) {
218
- if (effort === null)
219
- return null;
220
- const levels = effortLevelsFor(model);
221
- if (levels.length === 0)
222
- return null;
223
- if (levels.includes(effort))
224
- return effort;
225
- // Snap down to the nearest supported level rather than failing the call. When
226
- // the model supports nothing at or below the request, snap UP to its lowest
227
- // level instead — sending an effort the model rejects fails the call outright.
228
- const want = EFFORT_LADDER.indexOf(effort);
229
- for (let i = want; i >= 0; i--) {
230
- if (levels.includes(EFFORT_LADDER[i]))
231
- return EFFORT_LADDER[i];
232
- }
233
- return levels[0] ?? null;
234
- }
235
- //# sourceMappingURL=review-strategy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-strategy.js","sourceRoot":"","sources":["../../src/lib/review-strategy.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- import type { FetchLike, ResolvedLinearAuth } from './identity.js';
2
- export interface LinearRequestOptions {
3
- fetchImpl?: FetchLike;
4
- endpoint?: string;
5
- }
6
- export interface LinearIssue {
7
- id: string;
8
- identifier: string;
9
- url: string;
10
- }
11
- export interface LinearComment {
12
- id: string;
13
- url: string;
14
- }
15
- export declare function linearGraphQL<T>(auth: ResolvedLinearAuth, query: string, variables: Record<string, unknown>, opts?: LinearRequestOptions): Promise<T>;
16
- export declare function findIssueByIdentifier(auth: ResolvedLinearAuth, identifier: string, opts?: LinearRequestOptions): Promise<LinearIssue | null>;
17
- export declare function postLinearComment(auth: ResolvedLinearAuth, issueId: string, body: string, opts?: LinearRequestOptions): Promise<LinearComment>;
18
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/linear/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAIlE,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;CACZ;AAQD,wBAAsB,aAAa,CAAC,CAAC,EACnC,IAAI,EAAE,kBAAkB,EACxB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,CAAC,CAAC,CA+BZ;AAQD,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,kBAAkB,EACxB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAa7B;AASD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,aAAa,CAAC,CAgBxB"}