@humanbased/crosscheck 1.2.0-beta.81 → 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 (314) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +375 -182
  3. package/README.zh.md +1 -1
  4. package/crosscheck.config.example.yml +9 -101
  5. package/dist/__tests__/board.test.js +0 -11
  6. package/dist/__tests__/board.test.js.map +1 -1
  7. package/dist/__tests__/codex.test.js +27 -14
  8. package/dist/__tests__/codex.test.js.map +1 -1
  9. package/dist/__tests__/comment-bodies.test.js +1 -49
  10. package/dist/__tests__/comment-bodies.test.js.map +1 -1
  11. package/dist/__tests__/conflict-resolve.test.js +1 -44
  12. package/dist/__tests__/conflict-resolve.test.js.map +1 -1
  13. package/dist/__tests__/fix.test.js +0 -33
  14. package/dist/__tests__/fix.test.js.map +1 -1
  15. package/dist/__tests__/onboard-preservation.test.js +3 -59
  16. package/dist/__tests__/onboard-preservation.test.js.map +1 -1
  17. package/dist/__tests__/optimize.test.js +0 -2
  18. package/dist/__tests__/optimize.test.js.map +1 -1
  19. package/dist/__tests__/repo-picker.test.js +1 -7
  20. package/dist/__tests__/repo-picker.test.js.map +1 -1
  21. package/dist/__tests__/review-comment-body.test.js +0 -35
  22. package/dist/__tests__/review-comment-body.test.js.map +1 -1
  23. package/dist/__tests__/review-models.test.js +3 -19
  24. package/dist/__tests__/review-models.test.js.map +1 -1
  25. package/dist/__tests__/runner.test.js +1 -29
  26. package/dist/__tests__/runner.test.js.map +1 -1
  27. package/dist/cli.js +0 -29
  28. package/dist/cli.js.map +1 -1
  29. package/dist/commands/onboard.d.ts +3 -36
  30. package/dist/commands/onboard.d.ts.map +1 -1
  31. package/dist/commands/onboard.js +42 -233
  32. package/dist/commands/onboard.js.map +1 -1
  33. package/dist/commands/review.d.ts.map +1 -1
  34. package/dist/commands/review.js +6 -65
  35. package/dist/commands/review.js.map +1 -1
  36. package/dist/commands/run.d.ts.map +1 -1
  37. package/dist/commands/run.js +7 -45
  38. package/dist/commands/run.js.map +1 -1
  39. package/dist/commands/status.d.ts.map +1 -1
  40. package/dist/commands/status.js +1 -53
  41. package/dist/commands/status.js.map +1 -1
  42. package/dist/commands/watch.d.ts.map +1 -1
  43. package/dist/commands/watch.js +12 -90
  44. package/dist/commands/watch.js.map +1 -1
  45. package/dist/config/loader.d.ts +1 -3
  46. package/dist/config/loader.d.ts.map +1 -1
  47. package/dist/config/loader.js +0 -13
  48. package/dist/config/loader.js.map +1 -1
  49. package/dist/config/review-model-tiers.json +3 -3
  50. package/dist/config/schema.d.ts +15 -261
  51. package/dist/config/schema.d.ts.map +1 -1
  52. package/dist/config/schema.js +8 -90
  53. package/dist/config/schema.js.map +1 -1
  54. package/dist/github/client.d.ts +1 -21
  55. package/dist/github/client.d.ts.map +1 -1
  56. package/dist/github/client.js +7 -46
  57. package/dist/github/client.js.map +1 -1
  58. package/dist/github/webhook.d.ts +0 -4
  59. package/dist/github/webhook.d.ts.map +1 -1
  60. package/dist/github/webhook.js.map +1 -1
  61. package/dist/issues/ticket-ref.d.ts.map +1 -1
  62. package/dist/issues/ticket-ref.js +5 -6
  63. package/dist/issues/ticket-ref.js.map +1 -1
  64. package/dist/lib/annotation.d.ts +0 -7
  65. package/dist/lib/annotation.d.ts.map +1 -1
  66. package/dist/lib/annotation.js +1 -11
  67. package/dist/lib/annotation.js.map +1 -1
  68. package/dist/lib/board.d.ts +0 -3
  69. package/dist/lib/board.d.ts.map +1 -1
  70. package/dist/lib/board.js +2 -4
  71. package/dist/lib/board.js.map +1 -1
  72. package/dist/lib/clone.d.ts +0 -1
  73. package/dist/lib/clone.d.ts.map +1 -1
  74. package/dist/lib/clone.js +10 -32
  75. package/dist/lib/clone.js.map +1 -1
  76. package/dist/lib/comment-bodies.d.ts +0 -37
  77. package/dist/lib/comment-bodies.d.ts.map +1 -1
  78. package/dist/lib/comment-bodies.js +9 -47
  79. package/dist/lib/comment-bodies.js.map +1 -1
  80. package/dist/lib/repo-picker.d.ts +0 -3
  81. package/dist/lib/repo-picker.d.ts.map +1 -1
  82. package/dist/lib/repo-picker.js +9 -45
  83. package/dist/lib/repo-picker.js.map +1 -1
  84. package/dist/lib/review-models.d.ts +2 -15
  85. package/dist/lib/review-models.d.ts.map +1 -1
  86. package/dist/lib/review-models.js +6 -26
  87. package/dist/lib/review-models.js.map +1 -1
  88. package/dist/lib/runner.d.ts +0 -92
  89. package/dist/lib/runner.d.ts.map +1 -1
  90. package/dist/lib/runner.js +54 -470
  91. package/dist/lib/runner.js.map +1 -1
  92. package/dist/lib/workflow.d.ts +0 -9
  93. package/dist/lib/workflow.d.ts.map +1 -1
  94. package/dist/lib/workflow.js +0 -20
  95. package/dist/lib/workflow.js.map +1 -1
  96. package/dist/reviewers/claude.d.ts +1 -4
  97. package/dist/reviewers/claude.d.ts.map +1 -1
  98. package/dist/reviewers/claude.js +7 -39
  99. package/dist/reviewers/claude.js.map +1 -1
  100. package/dist/reviewers/codex.d.ts +1 -3
  101. package/dist/reviewers/codex.d.ts.map +1 -1
  102. package/dist/reviewers/codex.js +70 -76
  103. package/dist/reviewers/codex.js.map +1 -1
  104. package/dist/reviewers/conflict-resolve.d.ts +1 -3
  105. package/dist/reviewers/conflict-resolve.d.ts.map +1 -1
  106. package/dist/reviewers/conflict-resolve.js +6 -21
  107. package/dist/reviewers/conflict-resolve.js.map +1 -1
  108. package/dist/reviewers/fix.d.ts +2 -5
  109. package/dist/reviewers/fix.d.ts.map +1 -1
  110. package/dist/reviewers/fix.js +10 -26
  111. package/dist/reviewers/fix.js.map +1 -1
  112. package/get-started.md +11 -207
  113. package/package.json +3 -4
  114. package/assets/icon-256.png +0 -0
  115. package/assets/linear-comment.svg +0 -18
  116. package/assets/linear-onboard.svg +0 -30
  117. package/assets/linear-status.svg +0 -23
  118. package/assets/linear-test.svg +0 -34
  119. package/assets/skills/code-review/.crosscheck-skill.json +0 -9
  120. package/assets/skills/code-review/LICENSE +0 -21
  121. package/assets/skills/code-review/SKILL.md +0 -89
  122. package/assets/skills/code-review/agents/openai.yaml +0 -3
  123. package/assets/skills/code-review-skill/.crosscheck-skill.json +0 -9
  124. package/assets/skills/code-review-skill/LICENSE +0 -21
  125. package/assets/skills/code-review-skill/SKILL.md +0 -231
  126. package/assets/skills/code-review-skill/assets/pr-review-template.md +0 -137
  127. package/assets/skills/code-review-skill/assets/review-checklist.md +0 -123
  128. package/assets/skills/code-review-skill/reference/angular.md +0 -768
  129. package/assets/skills/code-review-skill/reference/architecture-review-guide.md +0 -472
  130. package/assets/skills/code-review-skill/reference/c.md +0 -890
  131. package/assets/skills/code-review-skill/reference/code-quality-universal.md +0 -488
  132. package/assets/skills/code-review-skill/reference/code-review-best-practices.md +0 -136
  133. package/assets/skills/code-review-skill/reference/common-bugs-checklist.md +0 -286
  134. package/assets/skills/code-review-skill/reference/cpp.md +0 -893
  135. package/assets/skills/code-review-skill/reference/cross-cutting/async-concurrency-patterns.md +0 -515
  136. package/assets/skills/code-review-skill/reference/cross-cutting/error-handling-principles.md +0 -492
  137. package/assets/skills/code-review-skill/reference/cross-cutting/n-plus-one-queries.md +0 -309
  138. package/assets/skills/code-review-skill/reference/cross-cutting/sql-injection-prevention.md +0 -308
  139. package/assets/skills/code-review-skill/reference/cross-cutting/xss-prevention.md +0 -264
  140. package/assets/skills/code-review-skill/reference/csharp.md +0 -525
  141. package/assets/skills/code-review-skill/reference/css-less-sass.md +0 -661
  142. package/assets/skills/code-review-skill/reference/django.md +0 -985
  143. package/assets/skills/code-review-skill/reference/fastapi.md +0 -580
  144. package/assets/skills/code-review-skill/reference/go.md +0 -993
  145. package/assets/skills/code-review-skill/reference/java.md +0 -409
  146. package/assets/skills/code-review-skill/reference/java8.md +0 -586
  147. package/assets/skills/code-review-skill/reference/kotlin.md +0 -1018
  148. package/assets/skills/code-review-skill/reference/nestjs.md +0 -593
  149. package/assets/skills/code-review-skill/reference/performance-review-guide.md +0 -816
  150. package/assets/skills/code-review-skill/reference/php.md +0 -684
  151. package/assets/skills/code-review-skill/reference/python.md +0 -1073
  152. package/assets/skills/code-review-skill/reference/qt.md +0 -757
  153. package/assets/skills/code-review-skill/reference/react.md +0 -871
  154. package/assets/skills/code-review-skill/reference/ruby.md +0 -964
  155. package/assets/skills/code-review-skill/reference/rust.md +0 -846
  156. package/assets/skills/code-review-skill/reference/security-review-guide.md +0 -494
  157. package/assets/skills/code-review-skill/reference/svelte.md +0 -1064
  158. package/assets/skills/code-review-skill/reference/swift.md +0 -936
  159. package/assets/skills/code-review-skill/reference/typescript.md +0 -1016
  160. package/assets/skills/code-review-skill/reference/vue.md +0 -924
  161. package/assets/skills/code-review-skill/reference/zig.md +0 -440
  162. package/assets/skills/code-review-skill/scripts/pr-analyzer.py +0 -435
  163. package/assets/skills/code-review-skill/scripts/test_pr_analyzer.py +0 -380
  164. package/assets/skills/codebase-design/.crosscheck-skill.json +0 -9
  165. package/assets/skills/codebase-design/DEEPENING.md +0 -37
  166. package/assets/skills/codebase-design/DESIGN-IT-TWICE.md +0 -44
  167. package/assets/skills/codebase-design/LICENSE +0 -21
  168. package/assets/skills/codebase-design/SKILL.md +0 -114
  169. package/assets/skills/codebase-design/agents/openai.yaml +0 -3
  170. package/assets/skills/diagnosing-bugs/.crosscheck-skill.json +0 -9
  171. package/assets/skills/diagnosing-bugs/LICENSE +0 -21
  172. package/assets/skills/diagnosing-bugs/SKILL.md +0 -134
  173. package/assets/skills/diagnosing-bugs/agents/openai.yaml +0 -3
  174. package/assets/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +0 -41
  175. package/dist/__tests__/can-write-verdict.test.d.ts +0 -2
  176. package/dist/__tests__/can-write-verdict.test.d.ts.map +0 -1
  177. package/dist/__tests__/can-write-verdict.test.js +0 -31
  178. package/dist/__tests__/can-write-verdict.test.js.map +0 -1
  179. package/dist/__tests__/linear-branding.test.d.ts +0 -2
  180. package/dist/__tests__/linear-branding.test.d.ts.map +0 -1
  181. package/dist/__tests__/linear-branding.test.js +0 -156
  182. package/dist/__tests__/linear-branding.test.js.map +0 -1
  183. package/dist/__tests__/linear-client.test.d.ts +0 -2
  184. package/dist/__tests__/linear-client.test.d.ts.map +0 -1
  185. package/dist/__tests__/linear-client.test.js +0 -120
  186. package/dist/__tests__/linear-client.test.js.map +0 -1
  187. package/dist/__tests__/linear-comment.test.d.ts +0 -2
  188. package/dist/__tests__/linear-comment.test.d.ts.map +0 -1
  189. package/dist/__tests__/linear-comment.test.js +0 -151
  190. package/dist/__tests__/linear-comment.test.js.map +0 -1
  191. package/dist/__tests__/linear-identity.test.d.ts +0 -2
  192. package/dist/__tests__/linear-identity.test.d.ts.map +0 -1
  193. package/dist/__tests__/linear-identity.test.js +0 -253
  194. package/dist/__tests__/linear-identity.test.js.map +0 -1
  195. package/dist/__tests__/linear-notify.test.d.ts +0 -2
  196. package/dist/__tests__/linear-notify.test.d.ts.map +0 -1
  197. package/dist/__tests__/linear-notify.test.js +0 -144
  198. package/dist/__tests__/linear-notify.test.js.map +0 -1
  199. package/dist/__tests__/linear-ref.test.d.ts +0 -2
  200. package/dist/__tests__/linear-ref.test.d.ts.map +0 -1
  201. package/dist/__tests__/linear-ref.test.js +0 -261
  202. package/dist/__tests__/linear-ref.test.js.map +0 -1
  203. package/dist/__tests__/linear-test-ref.test.d.ts +0 -2
  204. package/dist/__tests__/linear-test-ref.test.d.ts.map +0 -1
  205. package/dist/__tests__/linear-test-ref.test.js +0 -81
  206. package/dist/__tests__/linear-test-ref.test.js.map +0 -1
  207. package/dist/__tests__/linear-verify.test.d.ts +0 -2
  208. package/dist/__tests__/linear-verify.test.d.ts.map +0 -1
  209. package/dist/__tests__/linear-verify.test.js +0 -132
  210. package/dist/__tests__/linear-verify.test.js.map +0 -1
  211. package/dist/__tests__/linear-worker.test.d.ts +0 -2
  212. package/dist/__tests__/linear-worker.test.d.ts.map +0 -1
  213. package/dist/__tests__/linear-worker.test.js +0 -83
  214. package/dist/__tests__/linear-worker.test.js.map +0 -1
  215. package/dist/__tests__/linear-write-possible.test.d.ts +0 -2
  216. package/dist/__tests__/linear-write-possible.test.d.ts.map +0 -1
  217. package/dist/__tests__/linear-write-possible.test.js +0 -30
  218. package/dist/__tests__/linear-write-possible.test.js.map +0 -1
  219. package/dist/__tests__/repository-guidance.test.d.ts +0 -2
  220. package/dist/__tests__/repository-guidance.test.d.ts.map +0 -1
  221. package/dist/__tests__/repository-guidance.test.js +0 -107
  222. package/dist/__tests__/repository-guidance.test.js.map +0 -1
  223. package/dist/__tests__/review-strategy.test.d.ts +0 -2
  224. package/dist/__tests__/review-strategy.test.d.ts.map +0 -1
  225. package/dist/__tests__/review-strategy.test.js +0 -397
  226. package/dist/__tests__/review-strategy.test.js.map +0 -1
  227. package/dist/__tests__/skill-attribution.test.d.ts +0 -2
  228. package/dist/__tests__/skill-attribution.test.d.ts.map +0 -1
  229. package/dist/__tests__/skill-attribution.test.js +0 -53
  230. package/dist/__tests__/skill-attribution.test.js.map +0 -1
  231. package/dist/__tests__/skill-broker.test.d.ts +0 -2
  232. package/dist/__tests__/skill-broker.test.d.ts.map +0 -1
  233. package/dist/__tests__/skill-broker.test.js +0 -144
  234. package/dist/__tests__/skill-broker.test.js.map +0 -1
  235. package/dist/__tests__/skill-catalog.test.d.ts +0 -2
  236. package/dist/__tests__/skill-catalog.test.d.ts.map +0 -1
  237. package/dist/__tests__/skill-catalog.test.js +0 -40
  238. package/dist/__tests__/skill-catalog.test.js.map +0 -1
  239. package/dist/__tests__/skill-installer.test.d.ts +0 -2
  240. package/dist/__tests__/skill-installer.test.d.ts.map +0 -1
  241. package/dist/__tests__/skill-installer.test.js +0 -96
  242. package/dist/__tests__/skill-installer.test.js.map +0 -1
  243. package/dist/__tests__/skills-config.test.d.ts +0 -2
  244. package/dist/__tests__/skills-config.test.d.ts.map +0 -1
  245. package/dist/__tests__/skills-config.test.js +0 -12
  246. package/dist/__tests__/skills-config.test.js.map +0 -1
  247. package/dist/commands/linear-test.d.ts +0 -18
  248. package/dist/commands/linear-test.d.ts.map +0 -1
  249. package/dist/commands/linear-test.js +0 -130
  250. package/dist/commands/linear-test.js.map +0 -1
  251. package/dist/commands/skill.d.ts +0 -2
  252. package/dist/commands/skill.d.ts.map +0 -1
  253. package/dist/commands/skill.js +0 -16
  254. package/dist/commands/skill.js.map +0 -1
  255. package/dist/config/review-strategy.json +0 -204
  256. package/dist/lib/repository-guidance.d.ts +0 -2
  257. package/dist/lib/repository-guidance.d.ts.map +0 -1
  258. package/dist/lib/repository-guidance.js +0 -55
  259. package/dist/lib/repository-guidance.js.map +0 -1
  260. package/dist/lib/review-strategy.d.ts +0 -92
  261. package/dist/lib/review-strategy.d.ts.map +0 -1
  262. package/dist/lib/review-strategy.js +0 -282
  263. package/dist/lib/review-strategy.js.map +0 -1
  264. package/dist/linear/client.d.ts +0 -18
  265. package/dist/linear/client.d.ts.map +0 -1
  266. package/dist/linear/client.js +0 -67
  267. package/dist/linear/client.js.map +0 -1
  268. package/dist/linear/comment.d.ts +0 -20
  269. package/dist/linear/comment.d.ts.map +0 -1
  270. package/dist/linear/comment.js +0 -57
  271. package/dist/linear/comment.js.map +0 -1
  272. package/dist/linear/identity.d.ts +0 -59
  273. package/dist/linear/identity.d.ts.map +0 -1
  274. package/dist/linear/identity.js +0 -187
  275. package/dist/linear/identity.js.map +0 -1
  276. package/dist/linear/notify.d.ts +0 -35
  277. package/dist/linear/notify.d.ts.map +0 -1
  278. package/dist/linear/notify.js +0 -76
  279. package/dist/linear/notify.js.map +0 -1
  280. package/dist/linear/ref.d.ts +0 -13
  281. package/dist/linear/ref.d.ts.map +0 -1
  282. package/dist/linear/ref.js +0 -90
  283. package/dist/linear/ref.js.map +0 -1
  284. package/dist/linear/verify.d.ts +0 -26
  285. package/dist/linear/verify.d.ts.map +0 -1
  286. package/dist/linear/verify.js +0 -67
  287. package/dist/linear/verify.js.map +0 -1
  288. package/dist/skills/attribution.d.ts +0 -4
  289. package/dist/skills/attribution.d.ts.map +0 -1
  290. package/dist/skills/attribution.js +0 -14
  291. package/dist/skills/attribution.js.map +0 -1
  292. package/dist/skills/broker-server.d.ts +0 -2
  293. package/dist/skills/broker-server.d.ts.map +0 -1
  294. package/dist/skills/broker-server.js +0 -17
  295. package/dist/skills/broker-server.js.map +0 -1
  296. package/dist/skills/broker.d.ts +0 -42
  297. package/dist/skills/broker.d.ts.map +0 -1
  298. package/dist/skills/broker.js +0 -285
  299. package/dist/skills/broker.js.map +0 -1
  300. package/dist/skills/catalog.d.ts +0 -28
  301. package/dist/skills/catalog.d.ts.map +0 -1
  302. package/dist/skills/catalog.js +0 -104
  303. package/dist/skills/catalog.js.map +0 -1
  304. package/dist/skills/installer.d.ts +0 -10
  305. package/dist/skills/installer.d.ts.map +0 -1
  306. package/dist/skills/installer.js +0 -138
  307. package/dist/skills/installer.js.map +0 -1
  308. package/dist/skills/integrity.d.ts +0 -4
  309. package/dist/skills/integrity.d.ts.map +0 -1
  310. package/dist/skills/integrity.js +0 -36
  311. package/dist/skills/integrity.js.map +0 -1
  312. package/docs/dynamic-thoroughness.md +0 -738
  313. package/docs/linear-identity-contract.md +0 -139
  314. package/docs/linear-identity.md +0 -293
package/README.md CHANGED
@@ -6,313 +6,509 @@
6
6
  <img src="./assets/logo.png" alt="crosscheck" width="160" />
7
7
  </p>
8
8
 
9
- <h1 align="center">crosscheck</h1>
9
+ <p align="center"><em>A Humanbased project, built with crosscheck.</em></p>
10
10
 
11
- <p align="center"><strong>Your agents ship fast. Crosscheck makes sure they ship right.</strong></p>
12
-
13
- <p align="center">
14
- <a href="https://www.npmjs.com/package/@humanbased/crosscheck"><img src="https://img.shields.io/npm/v/@humanbased/crosscheck?color=2f6feb&label=npm" alt="npm" /></a>
15
- <a href="./LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT" /></a>
16
- <a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-18%2B-brightgreen" alt="Node 18+" /></a>
17
- </p>
11
+ # crosscheck
18
12
 
19
13
  <p align="center">
20
14
  <img src="./assets/screenshot-watch.png" alt="crosscheck watch — live pipeline view" width="860" />
21
15
  </p>
22
16
 
23
- ---
17
+ **Your agents ship fast. Crosscheck makes sure they ship right.**
24
18
 
25
- ## The problem
19
+ AI coding agents create PRs faster than review habits can absorb. The failure mode isn't broken builds — it's *early victory*: patches that pass CI, look complete, and still hide regressions, brittle edge cases, or half-finished fixes.
26
20
 
27
- AI coding agents open PRs faster than review habits can absorb them. The failure mode isn't a broken build it's **early victory**: a patch that passes CI, reads as complete, and quietly carries a regression, a brittle edge case, or a half-finished fix.
21
+ Crosscheck adds an independent Review Fix Recheck loop. One agent writes the patch. Another reviews it. Findings go back to the author to repair. The result gets rechecked before merge. The PR moves toward genuinely merge-ready not just "looks green."
28
22
 
29
- Asking the agent that wrote the patch to review it doesn't help. That's exactly where early victory hides.
23
+ No new hosted service. No per-review API bill. Crosscheck runs through the `claude` and `codex` CLIs you already have your existing subscriptions, your machine or server.
30
24
 
31
- ## What crosscheck does
25
+ Built by [Humanbased](https://github.com/humanbased-ai). Read the field report: [What 295 Agentic PRs Taught Us About Code Review](https://blog.humanbased.ai/posts/agentic-pr-quality-crosscheck/) — 295 agentic PRs analyzed, real Crosscheck logs included.
32
26
 
33
- One agent writes the patch. **A different one reviews it.** Findings go back to the author agent to repair, and the result is rechecked before merge.
27
+ ## Why crosscheck?
34
28
 
35
- ```
36
- PR → review → fix → recheck → merge-ready
37
- (codex) (claude) (codex)
38
- ```
29
+ **Agent velocity without lowering the merge bar.**
39
30
 
40
- Three properties make that practical:
31
+ - **Independent eyes, not self-review** — route Claude-authored PRs to Codex and vice versa. Self-review is exactly where early-victory failures hide.
32
+ - **Review → Fix → Recheck, not just comments** — findings return to the author agent for repair; a clean recheck follows before merge. PRs move forward, not sideways.
33
+ - **No new vendor** — runs through the `claude` and `codex` CLIs you already pay for. No per-review bill, no extra trust surface.
34
+ - **Configurable for any team size** — review-only, review + fix, or the full loop. Use one workflow locally, or one always-on team watcher with per-repo overrides via `crosscheck alter`.
41
35
 
42
- - **Independent eyes.** Claude-authored PRs route to Codex and vice versa. Origin is detected from the PR body, commit trailers, and branch prefix — no manual tagging.
43
- - **A loop, not a comment.** Findings return to the author agent for repair; a clean recheck follows. The PR moves forward instead of sideways.
44
- - **No new vendor.** Runs through the `claude` and `codex` CLIs you already pay for. No hosted service, no per-review API bill, no extra trust surface.
36
+ ## Who uses crosscheck
45
37
 
46
- ## Same mission. Sharper skills.
38
+ | Persona | Problem | How crosscheck helps |
39
+ |---|---|---|
40
+ | **Solo agentic builder** | Same agent that wrote the code may self-approve incomplete work | Independent reviewer from a different vendor, on your machine |
41
+ | **Technical founder** | AI PRs look done before delivering stable value | Closes the loop: review finding → agent fix → clean recheck |
42
+ | **Engineering lead** | Agent use is hard to supervise or standardize | A default full-loop workflow, per-repo overrides (`crosscheck alter`), and a visible PR audit trail |
43
+ | **OSS maintainer** | Review bandwidth is scarce; comments must be actionable | One-shot `crosscheck review` posts concrete findings directly on the PR |
47
44
 
48
- Crosscheck stays focused on one job: making agent-authored PRs trustworthy. It now ships supercharged with preloaded, coding-specialized skills that every invoked coding agent can use during review, diagnosis, repair, recheck, and conflict resolution.
45
+ ### Usage scenarios
49
46
 
50
- The recommended onboarding bundle combines a broad review baseline, architecture vocabulary, and rigorous bug diagnosis:
47
+ **Local use**
51
48
 
52
- - `code-review-skill (by @awesome-skills, MIT)` comprehensive review guidance across languages, architecture, security, and performance.
53
- - `codebase-design (by @mattpocock, MIT)` — evaluates deep modules, small interfaces, clean seams, and testability.
54
- - `diagnosing-bugs (by @mattpocock, MIT)` — requires a reproducible signal, tested hypotheses, and regression evidence before declaring a fix complete.
49
+ Use Crosscheck from your own machine when you want an independent review before merge, or a temporary watcher while you work.
55
50
 
56
- Matt Pocock's `code-review` is also preloaded as an alternative for evidence-rich repositories with documented standards and a clear issue or PRD. It remains off by default because it competes with the broad `code-review-skill`; onboarding warns instead of loading both. Enable only the practices your team wants, or install your own skill with `crosscheck skill install <source>`.
51
+ ```bash
52
+ # Catch regressions before merging a solo PR
53
+ crosscheck run <pr-url>
57
54
 
58
- Enabled skills are available, not blindly forced: the coding agent decides which are relevant to each operation. The terminal and PR comment then attribute only the skills actually activated for that step. Crosscheck also honors the target repository's base-branch `AGENTS.md` and `CLAUDE.md` guidance; those local practices take precedence over bundled skill advice.
55
+ # One-shot review of a specific PR
56
+ crosscheck review <pr-url>
59
57
 
60
- Setup and trust model: **[Agent skills](./get-started.md#crosscheck-skill-install-source)**.
58
+ # Continuous review while your terminal is open
59
+ crosscheck onboard --personal
60
+ crosscheck watch
61
61
 
62
- Built by [Humanbased](https://github.com/humanbased-ai). Field report: [What 295 Agentic PRs Taught Us About Code Review](https://blog.humanbased.ai/posts/agentic-pr-quality-crosscheck/).
62
+ # Loop until the agent produces an approved patch
63
+ crosscheck run <pr-url> --crazy
64
+ ```
65
+
66
+ **Always-on team server**
67
+
68
+ Run one long-lived `watch` process for the whole team or org on a shared machine. Configure the default workflow once, then narrow individual repos only when needed.
69
+
70
+ ```bash
71
+ # One-time setup on the server
72
+ crosscheck onboard --team
73
+
74
+ # Example: one repo gets review-only, the rest keep the global workflow
75
+ crosscheck alter humanbased-ai/xny-monorepo --review-only
76
+
77
+ # Start the team watcher
78
+ crosscheck watch
79
+ ```
63
80
 
64
81
  ---
65
82
 
66
- ## Install
83
+ ## Quick start
84
+
85
+ ### First useful review in 10 minutes
86
+
87
+ Start with one low-risk PR before turning on continuous watch mode. You only need GitHub CLI plus one authenticated reviewer CLI.
88
+
89
+ ```bash
90
+ # 1. Install crosscheck
91
+ npm install -g @humanbased/crosscheck
92
+
93
+ # 2. Authenticate GitHub
94
+ brew install gh && gh auth login
95
+
96
+ # 3. Authenticate one reviewer
97
+ npm install -g @openai/codex && codex login --device-auth
98
+ # or:
99
+ npm install -g @anthropic-ai/claude-code && claude
100
+
101
+ # 4. Check your setup
102
+ crosscheck status
103
+
104
+ # 5. Review the public fixture PR
105
+ crosscheck review https://github.com/humanbased-ai/crosscheck-proof-fixture/pull/1 --reviewer codex
106
+ ```
107
+
108
+ This fixture PR intentionally contains a realistic agentic-code regression, so you can see whether Crosscheck produces a useful review before pointing it at your own repo. Use `--reviewer claude` if Claude Code is the authenticated reviewer. After the fixture review works, swap in one low-risk PR from your repo, then run `crosscheck onboard` to configure repos, workflow mode, and continuous monitoring.
109
+
110
+ ### Continuous local mode
67
111
 
68
112
  ```bash
113
+ # 1. Install crosscheck and the agent CLIs
69
114
  npm install -g @humanbased/crosscheck
115
+ npm install -g @anthropic-ai/claude-code && claude # Claude Pro/Max subscription
116
+ npm install -g @openai/codex && codex login --device-auth # ChatGPT Plus/Pro subscription
117
+ brew install gh && gh auth login # GitHub CLI
118
+
119
+ # 2. Guided setup — repos, review mode, workflow pipeline
120
+ crosscheck onboard
121
+
122
+ # 3. Start watching
123
+ crosscheck watch # continuous review → fix → recheck as PRs arrive
70
124
  ```
71
125
 
72
- <details>
73
- <summary>Other channels</summary>
126
+ > Want reviews only (no auto-fix) for a repo? Make it review-only with
127
+ > `crosscheck alter owner/repo --review-only` — see [per-repo overrides](#crosscheck-alter-repo).
128
+
129
+ ### Always-on team mode
74
130
 
75
131
  ```bash
76
- npm install -g @humanbased/crosscheck@beta # latest features, rougher edges
77
- npx @humanbased/crosscheck <command> # no install
132
+ # 1. Run guided setup on the shared machine
133
+ crosscheck onboard --team
78
134
 
79
- git clone https://github.com/humanbased-ai/crosscheck
80
- cd crosscheck && npm install && npm run build && npm link
135
+ # 2. Optional: tune individual repos without changing the global workflow
136
+ crosscheck alter humanbased-ai/xny-monorepo --review-only
137
+ crosscheck alter humanbased-ai/api --steps review,fix,recheck
138
+
139
+ # 3. Start the long-lived watcher
140
+ crosscheck watch
81
141
  ```
82
- </details>
83
142
 
84
- You need GitHub CLI plus **at least one** reviewer CLI. Install both only if you want cross-vendor routing.
143
+ ---
144
+
145
+ ## Commands
85
146
 
86
147
  ```bash
87
- gh auth login
88
- npm install -g @anthropic-ai/claude-code && claude # Claude Pro or Max
89
- npm install -g @openai/codex && codex login --device-auth # ChatGPT Plus or Pro
148
+ crosscheck onboard # guided setup — pick repos, mode, and default pipeline
149
+ crosscheck alter <repo> # per-repo override: --steps review,fix | --review-only | --reset | --show
150
+ crosscheck watch # continuous use tunnel + webhook + listening
151
+ crosscheck review <pr-urls...> # review one or more PRs (comma lists, ranges, cross-repo)
152
+ crosscheck run <pr-urls...> # run the full workflow: review → (fix → recheck) × max_rounds (--review-only for review only)
153
+ crosscheck recheck|fix|resolve <pr-urls...> # force one workflow step on one or more PRs
154
+ crosscheck scan # show open PR workflow state across monitored repos
155
+ crosscheck detect-step <pr-url> # explain the next workflow step for one PR
156
+ crosscheck kickass # advance stale PRs from an interactive operator queue
157
+ crosscheck init # check prerequisites, write starter config
158
+ crosscheck status # auth state, config summary, CLI versions
90
159
  ```
91
160
 
92
- Both reviewers run on your existing subscription — no API key required.
161
+ **Operator queue (scan + kickass)**
162
+
163
+ `crosscheck scan` tracks two independent dimensions per PR:
164
+
165
+ | Workflow stage (`reviewState`) | Meaning | Next action |
166
+ |---|---|---|
167
+ | `NEEDS_REVIEW` | No crosscheck review for current HEAD | review |
168
+ | `NEEDS_FIX` | Reviewed — fix requested | fix |
169
+ | `NEEDS_RECHECK` | Fix committed, recheck pending | recheck |
170
+ | `APPROVED` | Reviewed and approved | merge |
171
+
172
+ | Verdict (`verdict`) | Meaning |
173
+ |---|---|
174
+ | `UNREVIEWED` | No review found |
175
+ | `APPROVE` | AI approved |
176
+ | `NEEDS_WORK` | AI requested changes |
177
+ | `BLOCK` | AI hard-blocked merge |
93
178
 
94
- ## First review in two minutes
179
+ `BLOCK` and `NEEDS_WORK` both map to `NEEDS_FIX` stage — same next action, but the `verdict` field preserves severity so operators can prioritise.
180
+
181
+ **How workflow steps are counted**
182
+
183
+ Crosscheck reconstructs PR workflow state from visible artifacts:
184
+
185
+ | Evidence | Counts as |
186
+ |---|---|
187
+ | Review or recheck comment with `<!-- crosscheck: ... verdict=... -->` | completed `review` / `recheck` step |
188
+ | Fix or conflict-resolve comment, such as `<!-- crosscheck: fix_applied ... -->` | completed `fix` / `conflict-resolve` step |
189
+ | PR commit trailer, such as `Crosscheck-Step: fix` | completed step declared by that trailer |
190
+
191
+ Commit trailers are accepted as operator-declared workflow state. In practice, a PR author may command Claude, Codex, or another agent to apply a fix outside a standalone Crosscheck post; if the resulting PR commit carries `Crosscheck-Step: fix`, Crosscheck counts it as fix evidence.
192
+
193
+ That evidence only advances the next step to `recheck` when the fix commit is the current PR HEAD. If another commit lands after the fix evidence, Crosscheck starts a fresh review round so the newer code is reviewed normally. This prevents an old fix trailer from marking later changes as ready for recheck.
95
194
 
96
195
  ```bash
97
- crosscheck status # confirm auth
98
- crosscheck review https://github.com/humanbased-ai/crosscheck-proof-fixture/pull/1 --reviewer codex
196
+ crosscheck scan [--tidy] [--stale-after <duration>] [--force] [--json]
197
+ crosscheck kickass [--dry-run] [--stale-after <duration>] [--force]
99
198
  ```
100
199
 
101
- That clones the branch, reviews it against base, and posts a comment on the PR. Once the fixture produces a useful verdict, point it at one low-risk PR of your own — then set up continuous review:
200
+ `crosscheck review --reviewer`, `crosscheck run --reviewer`, `crosscheck run --fixer`, and `crosscheck run --vendor` accept vendor aliases:
201
+ - Claude: `claude`, `claude-code`, `cc`, `anthropic`
202
+ - Codex: `codex`, `openai`
203
+
204
+ **Continuous improvement** *(experimental)*
102
205
 
103
206
  ```bash
104
- crosscheck onboard # guided: repos, routing, pipeline depth, connection
105
- crosscheck watch # listen for PR events
207
+ crosscheck diagnose # surface failure patterns from review logs
208
+ crosscheck optimize [--apply] # rewrite reviewer instructions based on diagnose output
209
+ crosscheck impact [--money] # time saved, issues caught, code quality trends
210
+ crosscheck issue # draft and file a bug report from recent error logs
106
211
  ```
107
212
 
108
213
  ---
109
214
 
110
- ## Where results land
215
+ ### `crosscheck onboard`
111
216
 
112
- ### On the pull request
217
+ Interactive setup wizard. Picks repos/orgs to monitor, selects single-vendor or cross-vendor mode, configures the review pipeline, and writes `~/.crosscheck/config.yml` and `workflow.yml`.
113
218
 
114
- Every review posts a comment carrying a machine-readable annotation:
219
+ ```bash
220
+ crosscheck onboard # guided setup
221
+ crosscheck onboard --personal # skip persona prompt, go straight to personal mode
222
+ crosscheck onboard --team # skip persona prompt, go straight to team mode
223
+ crosscheck onboard -y # accept all defaults non-interactively
224
+ ```
225
+
226
+ ---
227
+
228
+ ### `crosscheck alter <repo>`
229
+
230
+ Sets the workflow depth for one repo, leaving the global default in place for every other monitored repo. Writes a standalone file at `~/.crosscheck/workflows/<owner>__<repo>.yml` (`alter-workflow` is an alias). This is how you run one watcher for many repos while making one repo review-only. Changes apply on the next PR event — no need to restart `crosscheck watch`.
115
231
 
232
+ ```bash
233
+ crosscheck alter humanbased-ai/xny-monorepo --review-only # alias for --steps review
234
+ crosscheck alter github.com/humanbased-ai/xny-monorepo --steps review,fix
235
+ crosscheck alter https://github.com/humanbased-ai/xny-monorepo --steps review,fix,recheck
236
+ crosscheck alter humanbased-ai/xny-monorepo --show # print effective steps
237
+ crosscheck alter humanbased-ai/xny-monorepo --reset # revert to the global default
116
238
  ```
117
- <!-- crosscheck: origin=claude reviewer=codex model=gpt-5.6-terra
118
- type=review round=1 verdict=NEEDS_WORK service=crosscheck sha=a1b2c3d -->
239
+
240
+ Accepted repo formats: `owner/repo`, `github.com/owner/repo`, and `https://github.com/owner/repo`. The override narrows the global `~/.crosscheck/workflow.yml` it wins over the global default but a repo-committed `.crosscheck/workflow.yml` still wins over it.
241
+
242
+ ---
243
+
244
+ ### `crosscheck watch`
245
+
246
+ Starts an SSH tunnel (localhost.run), registers GitHub webhooks, and listens for PR events. Everything self-cleans on Ctrl+C.
247
+
248
+ ```bash
249
+ crosscheck watch
250
+ crosscheck watch --no-backtrace # skip startup scan for unreviewed open PRs
251
+ crosscheck watch --reconfigure # re-run deployment setup before starting
119
252
  ```
120
253
 
121
- That tag is the audit trail. It's how crosscheck knows which step ran, what verdict came back, and what to do next and it's a stable contract you can parse.
254
+ > For reviews only, make the repo review-only with `crosscheck alter <repo> --review-only` rather than a global flag.
122
255
 
123
- ### On your Linear issue
256
+ ---
124
257
 
125
- Optional, off by default. When enabled, the verdict is mirrored onto the Linear issue the PR belongs to, so outcomes show up where work is planned:
258
+ ### `crosscheck review <pr-urls...>`
126
259
 
127
- <p align="center">
128
- <img src="./assets/linear-comment.svg" alt="A crosscheck review comment on a Linear issue" width="740" />
129
- </p>
260
+ Reviews one or more PRs. Clones, checks out, reviews, and posts the comment. The PR argument accepts the [multi-PR spec syntax](#multi-pr-syntax) — multiple PRs are reviewed concurrently.
130
261
 
131
- Attribution is a ladder — **start at the bottom, climb only if you need to**:
262
+ ```bash
263
+ crosscheck review https://github.com/org/repo/pull/42
264
+ crosscheck review <pr-url> --reviewer claude # force Claude regardless of detection
265
+ crosscheck review <pr-url> --reviewer codex # force Codex regardless of detection
266
+ crosscheck review <pr-url> --reviewer cc # alias for Claude
267
+ crosscheck review <pr-url> --reviewer openai # alias for Codex
268
+ crosscheck review .../pull/245,255 # review several PRs at once
269
+ crosscheck review .../pull/245-256 # review an inclusive range
270
+ ```
132
271
 
133
- | Rung | Setup | Comments appear as |
134
- |---|---|---|
135
- | **api key** | one env var | Your Linear account, with a `🤖 crosscheck · <model>` signature line |
136
- | **workspace app** | one OAuth app, ~5 min, once per workspace | crosscheck itself, with its own icon |
272
+ ---
137
273
 
138
- The API key rung is fully functional — it finds the issue and posts the comment. What it lacks is *attribution*, not capability. So the question isn't which is better, it's **how many things write to your workspace**. If you're the only one, the app is ceremony.
274
+ ### `crosscheck run <pr-urls...>`
139
275
 
140
- `crosscheck onboard` asks which rung you want and writes the config:
276
+ Runs the configured workflow against one or more PRs: review → (fix → recheck) × `max_rounds`. Without `--steps`, this honors any repo workflow set by `crosscheck alter`. Loops autonomously through fix→recheck cycles up to the `max_rounds` value configured in `workflow.yml` (default: 1). Use `--crazy` or `--half-crazy` to loop until approved or unblocked, ignoring `max_rounds`. The PR argument accepts the [multi-PR spec syntax](#multi-pr-syntax); multiple PRs run concurrently (one agent per PR by default).
141
277
 
142
- <p align="center">
143
- <img src="./assets/linear-onboard.svg" alt="crosscheck onboard — choosing a Linear attribution rung" width="700" />
144
- </p>
278
+ ```bash
279
+ crosscheck run <pr-url>
280
+ crosscheck run <pr-url> --steps review # only the review step
281
+ crosscheck run <pr-url> --steps fix,recheck # skip initial review
282
+ crosscheck run <pr-url> --reviewer claude # force review/recheck agent
283
+ crosscheck run <pr-url> --fixer claude # force fix agent
284
+ crosscheck run <pr-url> --vendor claude # force review/recheck/fix agent
285
+ crosscheck run <pr-url> --dry-run # review without posting or fixing
286
+ crosscheck run <pr-url> --crazy # 🔥🔥 loop until APPROVE
287
+ crosscheck run <pr-url> --half-crazy # 🔥 loop until not BLOCK
288
+ crosscheck run <pr-url> --timeout 10m # custom reviewer timeout
289
+ crosscheck run .../pull/245,255 # several PRs, concurrently
290
+ crosscheck run .../pull/245-256 --concurrent 3 # range, max 3 agents in parallel
291
+ ```
145
292
 
146
- To check a setup without waiting for a PR, `linear-test` runs the whole path and posts nothing:
293
+ ---
147
294
 
148
- <p align="center">
149
- <img src="./assets/linear-test.svg" alt="crosscheck linear-test — verifying Linear write-back end to end" width="700" />
150
- </p>
295
+ ### `crosscheck recheck` / `fix` / `resolve <pr-urls...>`
151
296
 
152
- <details>
153
- <summary>Confirming which rung you're on at any time</summary>
297
+ Force a single workflow step against one or more PRs, bypassing next-step auto-detection. Each is sugar for `crosscheck run <spec> --steps <type>` and accepts the same [multi-PR spec syntax](#multi-pr-syntax) and `--concurrent` / `--sequential` / `--stagger` flags as `run`.
154
298
 
155
- `crosscheck status` resolves the configured identity for real and reports what a write would render as:
299
+ | Command | Forces the step |
300
+ |---|---|
301
+ | `crosscheck recheck <spec>` | `recheck` — re-evaluate against the latest review |
302
+ | `crosscheck fix <spec>` | `fix` — apply fixes for the latest review |
303
+ | `crosscheck resolve <spec>` | `conflict-resolve` — resolve merge conflicts (Claude only) |
156
304
 
157
- <p align="center">
158
- <img src="./assets/linear-status.svg" alt="crosscheck status — the Linear identity section" width="620" />
159
- </p>
160
- </details>
305
+ ```bash
306
+ crosscheck recheck https://github.com/org/repo/pull/42
307
+ crosscheck fix .../pull/245,255 --fixer claude
308
+ crosscheck resolve .../pull/245-256 --vendor claude
309
+ ```
161
310
 
162
- Full walkthrough: **[docs/linear-identity.md](./docs/linear-identity.md)**.
311
+ When the step is absent from the active `workflow.yml`, `recheck` and `conflict-resolve` are synthesized with built-in defaults so the command still runs.
163
312
 
164
313
  ---
165
314
 
166
- ## Commands
315
+ ### Multi-PR syntax
167
316
 
168
- | Command | What it does |
169
- |---|---|
170
- | `crosscheck onboard` | Guided setup — repos, routing, pipeline depth, connection |
171
- | `crosscheck status` | Auth, config, Linear identity, logs, impact summary |
172
- | `crosscheck skill install <source>` | Install an Agent Skill from Git or a local directory |
173
- | `crosscheck review <pr>` | One-shot review, posts a comment |
174
- | `crosscheck run <pr>` | Full pipeline for a PR — review, fix, recheck |
175
- | `crosscheck recheck` / `fix` / `resolve` | Run one step in isolation |
176
- | `crosscheck watch` | Listen for PR events and run the pipeline automatically |
177
- | `crosscheck scan` | Show open PRs with stale crosscheck state |
178
- | `crosscheck kickass` | Pick a stale PR and drive it to its next step |
179
- | `crosscheck alter <repo>` | Set a per-repo pipeline depth |
180
- | `crosscheck detect-step <pr>` | Show step history and the next step to run |
181
- | `crosscheck linear-test [issue]` | Dry-run Linear write-back |
182
- | `crosscheck diagnose` / `optimize` / `impact` / `issue` | Analyse logs, tune config, report value, file tickets |
183
-
184
- Multi-PR forms work where sensible — comma lists, bare numbers, and ranges:
317
+ `run`, `review`, `recheck`, `fix`, and `resolve` accept a single PR URL or a **spec** that expands to many PRs — a comma-separated list of full URLs, bare numbers, and `N-M` ranges:
185
318
 
186
319
  ```bash
187
- crosscheck review https://github.com/acme/app/pull/245,255
188
- crosscheck run https://github.com/acme/app/pull/245-256 --concurrent 4
320
+ .../pull/245,255 # two PRs in the same repo
321
+ .../pull/245-256 # an inclusive range
322
+ .../repo/pull/245,https://github.com/o/other/pull/3 # across repos
189
323
  ```
190
324
 
191
- Full flag reference: **[get-started.md](./get-started.md)**.
325
+ The first token must be a full URL (a bare number inherits the most recent repo). Duplicates are de-duplicated and a spec expands to at most 100 PRs. Multiple PRs run concurrently by default — control parallelism with `--concurrent <n>`, `--sequential`, or `--stagger <ms>`.
192
326
 
193
327
  ---
194
328
 
195
- ## Configuration
329
+ ### `crosscheck scan`
196
330
 
197
- Config lives at `~/.crosscheck/config.yml`. A `./crosscheck.config.yml` in the working directory is treated as a deliberate per-project override.
331
+ Scans every open PR in the configured monitor scope and reports where each one is in the crosscheck workflow. Results are cached for 60 seconds.
198
332
 
199
- ### Review depth
333
+ States: `NEEDS_REVIEW` · `NEEDS_FIX` · `BLOCK` · `NEEDS_RECHECK` · `APPROVE`
200
334
 
201
- ```yaml
202
- quality:
203
- mode: smart # smart (default) | fixed
204
- tier: balanced # fast | balanced | thorough the fallback under smart
205
-
206
- skills:
207
- enabled:
208
- - code-review-skill # recommended · @awesome-skills, MIT
209
- - codebase-design # recommended · @mattpocock, MIT
210
- - diagnosing-bugs # recommended · @mattpocock, MIT
335
+ ```bash
336
+ crosscheck scan # all open PRs, grouped stale/not-stale
337
+ crosscheck scan --tidy # stale actionable rows only
338
+ crosscheck scan --stale-after 4h # custom staleness threshold (default 24h)
339
+ crosscheck scan --force # bypass cache
340
+ crosscheck scan --json # machine-readable output
211
341
  ```
212
342
 
213
- Agents decide whether an enabled skill applies to each review, fix, recheck, or conflict-resolution step. A skill is activated only after the agent successfully loads it through the broker; activation lasts for that step session, including retries, and does not carry into later steps or runs. PR comments preserve only that completed step's activated-skill attribution.
214
- Existing configs keep skills disabled on upgrade; use `crosscheck onboard` to opt in. Installed packages are integrity-checked before agents can load them.
343
+ ---
215
344
 
216
- For review and recheck, Crosscheck also applies repository-defined review practices from `AGENTS.md` and `CLAUDE.md`. In monorepos it combines root guidance with the files scoped to changed paths, using the trusted base-branch versions so a PR cannot rewrite its own review rules.
345
+ ### `crosscheck detect-step`
217
346
 
218
- | Tier | Claude | Codex | Cost per review¹ |
219
- |---|---|---|---|
220
- | `fast` | Haiku 4.5 | GPT-5.6 Luna | $0.24 · $0.06 |
221
- | `balanced` | Sonnet 5 | GPT-5.6 Terra | $0.72 · $0.58 |
222
- | `thorough` | **Opus 5** | GPT-5.6 Sol | $1.20 · $1.44 |
347
+ Explains the workflow history for one PR and prints the next step Crosscheck would run. Use this when a PR has mixed evidence from comments, Crosscheck commits, or ad hoc agent commits with `Crosscheck-Step` trailers.
348
+
349
+ ```bash
350
+ crosscheck detect-step <pr-url>
351
+ crosscheck detect-step <pr-url> --json
352
+ ```
353
+
354
+ ---
223
355
 
224
- ¹ Output-token cost at 48k output tokens, the measured median for one review. A review is an agentic session, not a single call — expect **10–16 minutes** of wall clock (median 643s, p90 984s across 43 logged runs). Tier changes depth and the subprocess timeout, not seconds-scale latency.
356
+ ### `crosscheck kickass`
225
357
 
226
- `claude-fable-5` is **banned** from review: Opus 5's price for a lower coding benchmark score.
358
+ Selects stale PRs from the operator queue and advances them — runs `scan` first, presents a multi-select picker, shows a preflight summary, then executes after confirmation.
227
359
 
228
- ### Dynamic thoroughness (`mode: smart`)
360
+ ```bash
361
+ crosscheck kickass # interactive operator queue
362
+ crosscheck kickass --dry-run # preflight only — no mutations
363
+ crosscheck kickass --stale-after 2h # tighter staleness threshold
364
+ crosscheck kickass --force # bypass scan cache before picking
365
+ crosscheck kickass --crazy # 🔥🔥 auto loop until APPROVE
366
+ crosscheck kickass --half-crazy # 🔥 auto loop until not BLOCK
367
+ ```
229
368
 
230
- **On by default.** Instead of one tier for every call, Crosscheck classifies each PR from its changed-file list and adjusts model and effort to match. Classification runs on the already-cloned working copy, so it costs one `git diff` and no API call.
369
+ Actions: `NEEDS_REVIEW CR` · `NEEDS_FIX/BLOCK Fix` · `NEEDS_RECHECK Recheck` · `APPROVE Merge`
231
370
 
232
- | # | PR class | Detected by | Tier | Steps |
233
- |---|---|---|---|---|
234
- | 1 | Generated / vendored | every file is a lockfile or build output | — | **PR skipped** |
235
- | 2 | Security / data-critical | auth, crypto, payment, migration paths; `risk:T3`; hotfix→default | `thorough` | full loop |
236
- | 3 | Deletion-only | ≤ 5 additions with ≥ 20 deletions | `fast` | review |
237
- | 4 | Docs / spec | ≥ 50% Markdown | `balanced` | review |
238
- | 5 | Test-only | every file is a test | `fast` | review, fix |
239
- | 6 | Config / infra | ≥ 50% config, no source | `balanced` | full loop |
240
- | 7 | Trivial | ≤ 3 files, ≤ 150 lines | `fast` | review, fix |
241
- | 8 | Standard | everything else | `balanced` | full loop |
371
+ **`kickass` + `watch` combo**
242
372
 
243
- **Order is the routing logic** first match wins, and security sits second so it dominates every cheapening rule below it. A deletion that removes auth code, or a two-file migration, is never routed to `fast`.
373
+ For the best recovery experience when a batch of PRs is stuck (timed out, stopped before `watch` was running), run both commands together. Each plays a distinct role:
244
374
 
245
- Classification may set a **floor**, or promote on **consequence** a security path is reviewed thoroughly because a miss there is expensive. It may **not** predict that a PR will be hard: across a 400-PR census, diff size correlates only 0.51 with realized review cost (the largest one-call PR was 101k lines; the most expensive changed 2 files). So escalation responds to what the review actually found — round 2 raises effort, round 3 switches vendor, then it hands off to a human rather than looping.
375
+ - `kickass` kicks each stuck PR **one step at a time** it uses `detect-step` to read live PR history and dispatches only the next needed step (review, fix, or recheck).
376
+ - `watch` owns **all continuation** — it listens for the webhooks each completed step produces and runs the full remaining pipeline from there.
246
377
 
247
- Class tier, effort, **and** step set are all applied. The class is resolved once per workflow, not per step — the fix step pushes commits, so re-classifying could make the review and recheck comments cite different tiers for the same PR.
378
+ ```
379
+ crosscheck kickass
380
+ └─ ck run <url> --trigger kickass (one step; detect-step finds where to start)
381
+ └─ detect-step → "review" run review only → posts comment
382
+ └─ detect-step → "fix" run fix only → pushes commit
383
+ └─ detect-step → "recheck" run recheck only → posts verdict
248
384
 
249
- The step set **narrows** the configured pipeline and never widens it: a repo pinned to review-only with `crosscheck alter` stays review-only whatever the class says.
385
+ crosscheck watch
386
+ ├─ issue_comment (type=review) → pick up fix step automatically
387
+ └─ synchronize (fix commit) → pick up recheck step automatically
388
+ ```
250
389
 
251
- Rounds beyond the first escalate on measured non-convergence rather than prediction effort rises where the model supports it, the tier is promoted where it does not, and the model never weakens.
390
+ > **Note:** `crosscheck run <pr-url>` invoked directly runs the **full remaining pipeline** from the detected starting step. The one-step behaviour above applies only when kickass dispatches it with `--trigger kickass`.
252
391
 
253
- Every comment says which policy produced it:
392
+ Start `watch` first, then run `kickass` in a second terminal:
254
393
 
394
+ ```bash
395
+ # terminal 1
396
+ crosscheck watch
397
+
398
+ # terminal 2
399
+ crosscheck scan --force # refresh PR state
400
+ crosscheck kickass
255
401
  ```
256
- _thorough tier · touches a security or data-critical path, where a missed defect
257
- is expensive · strategy v1.1.0_
258
402
 
259
- <!-- crosscheck: model=claude-opus-5 verdict=BLOCK strategy=1.1.0 class=risky tier=thorough -->
403
+ > **How the review→fix bridge works:** after `kickass` posts a review comment, GitHub fires an `issue_comment` webhook (not a `pull_request` event). `watch` subscribes to `issue_comment` and, when it sees a crosscheck `type=review` annotation on an open PR, fetches the current PR head and runs the fix step automatically — no new commit required to wake it up. (Introduced in [#193](https://github.com/Motivation-Labs/crosscheck/pull/193).)
404
+
405
+ **Autonomous loop modes**
406
+
407
+ `--crazy` and `--half-crazy` turn `run` and `kickass` into autonomous fix→recheck loops that keep going until the verdict improves — no manual re-runs needed.
408
+
409
+ | Flag | Stops when | Max rounds | Timeout |
410
+ |---|---|---|---|
411
+ | `--crazy` 🔥🔥 | verdict = `APPROVE` | ∞ | none |
412
+ | `--half-crazy` 🔥 | verdict ≠ `BLOCK` | ∞ | none |
413
+
414
+ Both flags disable all reviewer subprocess timeout constraints — long fixes on large PRs won't be cut short. Use `--timeout <duration>` (e.g. `--timeout 10m`) without these flags to set a custom cap.
415
+
416
+ ```bash
417
+ # Run full workflow and keep looping until approved
418
+ crosscheck run <pr-url> --crazy
419
+
420
+ # Advance every stale PR until it's no longer blocked
421
+ crosscheck kickass --half-crazy
422
+
423
+ # Custom timeout without looping
424
+ crosscheck run <pr-url> --timeout 10m
260
425
  ```
261
426
 
262
- The rationale is the matched class's own `reason` field, not prose written per review, so the explanation and the routing decision cannot drift apart. A review from six weeks ago stays explicable after the policy changes.
427
+ ---
428
+
429
+ ## Configuration
263
430
 
264
- The policy is versioned in [`src/config/review-strategy.json`](./src/config/review-strategy.json), carries its own sources and a 60-day review interval, and is checked weekly by the [`Review Strategy`](./.github/workflows/review-strategy.yml) workflow — verify it any time with `npm run verify:strategy`. Full evidence: [docs/dynamic-thoroughness.md](./docs/dynamic-thoroughness.md).
431
+ Crosscheck uses `~/.crosscheck/config.yml` by default. If that file exists, it wins over `./crosscheck.config.yml` unless you pass `--config ./crosscheck.config.yml`.
265
432
 
266
- > **Leave `vendors.*.model` unset under smart mode.** An explicit model outranks the strategy, so pinning one makes per-PR selection a no-op. When that happens crosscheck **withholds** the tier from the comment rather than citing a routing decision that did not happen. `crosscheck onboard` clears the pin — and prints what it cleared — when you choose smart.
433
+ ### Review depth (`quality.tier`)
267
434
 
268
- ### Pipeline depth
435
+ ```yaml
436
+ # crosscheck.config.yml
437
+ quality:
438
+ tier: balanced # fast | balanced | thorough
439
+ ```
269
440
 
270
- The global pipeline lives in `~/.crosscheck/workflow.yml` and defaults to the full loop:
441
+ | Tier | Claude model | Codex model | Latency |
442
+ |---|---|---|---|
443
+ | `fast` | Haiku 4.5 | GPT-5.6 Luna | ~10s |
444
+ | `balanced` | Sonnet 5 | GPT-5.6 Terra | ~30s |
445
+ | `thorough` | Opus 4.8 | GPT-5.6 Sol | ~60s |
446
+
447
+ ### Pipeline (`workflow.yml`)
271
448
 
272
449
  ```yaml
273
450
  steps:
274
451
  - name: review
275
452
  type: review
276
- reviewer: auto # auto | claude | codex | origin
453
+ reviewer: auto # auto | claude | codex | origin
454
+
277
455
  - name: fix
278
456
  type: fix
279
457
  reviewer: origin
280
458
  when: review.verdict != 'APPROVE'
459
+
281
460
  - name: recheck
282
461
  type: recheck
283
462
  reviewer: auto
284
463
  when: fix.applied_count > 0
285
464
  ```
286
465
 
287
- To narrow a single repo without touching the global default:
466
+ ### Per-repo workflow overrides
467
+
468
+ The global `workflow.yml` is the default for every repo (out of the box, the full `review → fix → recheck` loop). To run one repo at a narrower depth in the same watcher, use `crosscheck alter` — it writes a standalone override file at `~/.crosscheck/workflows/<owner>__<repo>.yml`:
288
469
 
289
470
  ```bash
290
- crosscheck alter acme/app --review-only # or --steps review,fix
471
+ crosscheck alter humanbased-ai/xny-monorepo --review-only # review only
472
+ crosscheck alter humanbased-ai/api --steps review,fix,recheck # full loop, explicit
473
+ crosscheck alter humanbased-ai/xny-monorepo --reset # back to the global default
291
474
  ```
292
475
 
293
- That writes a standalone override at `~/.crosscheck/workflows/<owner>__<repo>.yml`, live-reloaded per PR no watcher restart.
476
+ Each override file lists the review fix recheck depth only:
294
477
 
295
- Every option, annotated: **[crosscheck.config.example.yml](./crosscheck.config.example.yml)**.
478
+ ```yaml
479
+ # ~/.crosscheck/workflows/humanbased-ai__xny-monorepo.yml
480
+ steps:
481
+ - review
482
+ ```
296
483
 
297
- ---
484
+ The override *narrows* the global workflow — it keeps each step's configured instructions and reviewer. `conflict-resolve` is orthogonal to the depth ladder: it stays enabled for any override that permits code modification (`review,fix` or `review,fix,recheck`) and is dropped only for review-only (`review`). Repos without an override file keep the complete global workflow. Resolution order: `{repo}/.crosscheck/workflow.yml` → `~/.crosscheck/workflows/<owner>__<repo>.yml` → `~/.crosscheck/workflow.yml` → built-in default.
298
485
 
299
- ## Running it continuously
486
+ ### Config snapshot
300
487
 
301
- **On your machine** — a watcher for as long as your terminal is open. Webhooks arrive through a tunnel (`localhost.run` by default, zero config; `smee` if you want events queued while you're offline).
488
+ ```yaml
489
+ # ~/.crosscheck/config.yml
490
+ orgs:
491
+ - your-org
302
492
 
303
- ```bash
304
- crosscheck onboard && crosscheck watch
305
- ```
493
+ routing:
494
+ allowed_authors:
495
+ - your-github-login
306
496
 
307
- **On a server** — one always-on watcher for a team, with per-repo depth where it matters.
497
+ mode: cross-vendor # cross-vendor | single-vendor
308
498
 
309
- ```bash
310
- crosscheck onboard --team
311
- crosscheck alter acme/legacy-service --review-only
312
- crosscheck watch
499
+ vendors:
500
+ claude:
501
+ enabled: true
502
+ codex:
503
+ enabled: true
504
+
505
+ quality:
506
+ tier: balanced
507
+
508
+ clone_protocol: ssh # ssh (default) | https
313
509
  ```
314
510
 
315
- Deployment mode decides scope: `personal` monitors your own repos and reviews only PRs you author; `team` monitors org repos and reviews PRs from any author.
511
+ Full reference: [get-started.md](./get-started.md)
316
512
 
317
513
  ---
318
514
 
@@ -321,8 +517,8 @@ Deployment mode decides scope: `personal` monitors your own repos and reviews on
321
517
  | | Minimum |
322
518
  |---|---|
323
519
  | Node.js | 18+ |
324
- | Claude Code CLI | `npm install -g @anthropic-ai/claude-code` |
325
- | Codex CLI | `npm install -g @openai/codex` |
520
+ | Claude Code CLI | latest — `npm install -g @anthropic-ai/claude-code` |
521
+ | Codex CLI | latest — `npm install -g @openai/codex` |
326
522
  | GitHub CLI | 2.65+ — `brew install gh` |
327
523
 
328
524
  `GITHUB_TOKEN` is derived automatically from `gh auth login`. No manual export needed.
@@ -333,12 +529,9 @@ Deployment mode decides scope: `personal` monitors your own repos and reviews on
333
529
 
334
530
  | | |
335
531
  |---|---|
336
- | **[get-started.md](./get-started.md)** | Full setup guide — prerequisites, every flag, complete config reference, FAQ |
337
- | **[docs/dynamic-thoroughness.md](./docs/dynamic-thoroughness.md)** | How Crosscheck picks a model and effort per PR and the 400-PR census behind it |
338
- | **[docs/linear-identity.md](./docs/linear-identity.md)** | Linear write-back and the attribution ladder |
339
- | **[docs/linear-identity-contract.md](./docs/linear-identity-contract.md)** | The identity contract, as a spec for other tools |
340
- | **[What 295 Agentic PRs Taught Us About Code Review](https://blog.humanbased.ai/posts/agentic-pr-quality-crosscheck/)** | Field report on agentic PR quality and why crosscheck exists |
341
- | **[docs/fixture-pr.md](./docs/fixture-pr.md)** | The safe public fixture PR |
532
+ | **[get-started.md](./get-started.md)** | Full setup guide — prerequisites, all flags, complete config reference, FAQ |
533
+ | **[What 295 Agentic PRs Taught Us About Code Review](https://blog.humanbased.ai/posts/agentic-pr-quality-crosscheck/)** | Humanbased field report on agentic PR quality, review routing, and why Crosscheck exists |
534
+ | **[docs/fixture-pr.md](./docs/fixture-pr.md)** | Safe public fixture PR for the first Crosscheck review |
342
535
  | **[crosscheck.config.example.yml](./crosscheck.config.example.yml)** | Annotated config with every option |
343
536
  | **[CHANGELOG.md](./CHANGELOG.md)** | Release notes |
344
537
 
@@ -348,8 +541,8 @@ Deployment mode decides scope: `personal` monitors your own repos and reviews on
348
541
 
349
542
  Issues and PRs welcome at [github.com/humanbased-ai/crosscheck](https://github.com/humanbased-ai/crosscheck).
350
543
 
351
- ## License
544
+ ---
352
545
 
353
- [MIT](./LICENSE) — Copyright (c) 2025–2026 Humanbased AI PTE LTD.
546
+ ## License
354
547
 
355
- <p align="center"><em>A Humanbased project, built with crosscheck.</em></p>
548
+ [MIT](./LICENSE) Copyright (c) 2025–2026 Humanbased PTE LTD.