@humanbased/crosscheck 1.2.0 → 1.3.0-beta.82
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +182 -375
- package/README.zh.md +1 -1
- package/assets/icon-256.png +0 -0
- package/assets/linear-comment.svg +18 -0
- package/assets/linear-onboard.svg +30 -0
- package/assets/linear-status.svg +23 -0
- package/assets/linear-test.svg +34 -0
- package/assets/skills/code-review/.crosscheck-skill.json +9 -0
- package/assets/skills/code-review/LICENSE +21 -0
- package/assets/skills/code-review/SKILL.md +89 -0
- package/assets/skills/code-review/agents/openai.yaml +3 -0
- package/assets/skills/code-review-skill/.crosscheck-skill.json +9 -0
- package/assets/skills/code-review-skill/LICENSE +21 -0
- package/assets/skills/code-review-skill/SKILL.md +231 -0
- package/assets/skills/code-review-skill/assets/pr-review-template.md +137 -0
- package/assets/skills/code-review-skill/assets/review-checklist.md +123 -0
- package/assets/skills/code-review-skill/reference/angular.md +768 -0
- package/assets/skills/code-review-skill/reference/architecture-review-guide.md +472 -0
- package/assets/skills/code-review-skill/reference/c.md +890 -0
- package/assets/skills/code-review-skill/reference/code-quality-universal.md +488 -0
- package/assets/skills/code-review-skill/reference/code-review-best-practices.md +136 -0
- package/assets/skills/code-review-skill/reference/common-bugs-checklist.md +286 -0
- package/assets/skills/code-review-skill/reference/cpp.md +893 -0
- package/assets/skills/code-review-skill/reference/cross-cutting/async-concurrency-patterns.md +515 -0
- package/assets/skills/code-review-skill/reference/cross-cutting/error-handling-principles.md +492 -0
- package/assets/skills/code-review-skill/reference/cross-cutting/n-plus-one-queries.md +309 -0
- package/assets/skills/code-review-skill/reference/cross-cutting/sql-injection-prevention.md +308 -0
- package/assets/skills/code-review-skill/reference/cross-cutting/xss-prevention.md +264 -0
- package/assets/skills/code-review-skill/reference/csharp.md +525 -0
- package/assets/skills/code-review-skill/reference/css-less-sass.md +661 -0
- package/assets/skills/code-review-skill/reference/django.md +985 -0
- package/assets/skills/code-review-skill/reference/fastapi.md +580 -0
- package/assets/skills/code-review-skill/reference/go.md +993 -0
- package/assets/skills/code-review-skill/reference/java.md +409 -0
- package/assets/skills/code-review-skill/reference/java8.md +586 -0
- package/assets/skills/code-review-skill/reference/kotlin.md +1018 -0
- package/assets/skills/code-review-skill/reference/nestjs.md +593 -0
- package/assets/skills/code-review-skill/reference/performance-review-guide.md +816 -0
- package/assets/skills/code-review-skill/reference/php.md +684 -0
- package/assets/skills/code-review-skill/reference/python.md +1073 -0
- package/assets/skills/code-review-skill/reference/qt.md +757 -0
- package/assets/skills/code-review-skill/reference/react.md +871 -0
- package/assets/skills/code-review-skill/reference/ruby.md +964 -0
- package/assets/skills/code-review-skill/reference/rust.md +846 -0
- package/assets/skills/code-review-skill/reference/security-review-guide.md +494 -0
- package/assets/skills/code-review-skill/reference/svelte.md +1064 -0
- package/assets/skills/code-review-skill/reference/swift.md +936 -0
- package/assets/skills/code-review-skill/reference/typescript.md +1016 -0
- package/assets/skills/code-review-skill/reference/vue.md +924 -0
- package/assets/skills/code-review-skill/reference/zig.md +440 -0
- package/assets/skills/code-review-skill/scripts/pr-analyzer.py +435 -0
- package/assets/skills/code-review-skill/scripts/test_pr_analyzer.py +380 -0
- package/assets/skills/codebase-design/.crosscheck-skill.json +9 -0
- package/assets/skills/codebase-design/DEEPENING.md +37 -0
- package/assets/skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/assets/skills/codebase-design/LICENSE +21 -0
- package/assets/skills/codebase-design/SKILL.md +114 -0
- package/assets/skills/codebase-design/agents/openai.yaml +3 -0
- package/assets/skills/diagnosing-bugs/.crosscheck-skill.json +9 -0
- package/assets/skills/diagnosing-bugs/LICENSE +21 -0
- package/assets/skills/diagnosing-bugs/SKILL.md +134 -0
- package/assets/skills/diagnosing-bugs/agents/openai.yaml +3 -0
- package/assets/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/crosscheck.config.example.yml +101 -9
- package/dist/__tests__/board.test.js +11 -0
- package/dist/__tests__/board.test.js.map +1 -1
- package/dist/__tests__/can-write-verdict.test.d.ts +2 -0
- package/dist/__tests__/can-write-verdict.test.d.ts.map +1 -0
- package/dist/__tests__/can-write-verdict.test.js +31 -0
- package/dist/__tests__/can-write-verdict.test.js.map +1 -0
- package/dist/__tests__/codex.test.js +14 -27
- package/dist/__tests__/codex.test.js.map +1 -1
- package/dist/__tests__/comment-bodies.test.js +49 -1
- package/dist/__tests__/comment-bodies.test.js.map +1 -1
- package/dist/__tests__/conflict-resolve.test.js +44 -1
- package/dist/__tests__/conflict-resolve.test.js.map +1 -1
- package/dist/__tests__/fix.test.js +33 -0
- package/dist/__tests__/fix.test.js.map +1 -1
- package/dist/__tests__/linear-branding.test.d.ts +2 -0
- package/dist/__tests__/linear-branding.test.d.ts.map +1 -0
- package/dist/__tests__/linear-branding.test.js +156 -0
- package/dist/__tests__/linear-branding.test.js.map +1 -0
- package/dist/__tests__/linear-client.test.d.ts +2 -0
- package/dist/__tests__/linear-client.test.d.ts.map +1 -0
- package/dist/__tests__/linear-client.test.js +120 -0
- package/dist/__tests__/linear-client.test.js.map +1 -0
- package/dist/__tests__/linear-comment.test.d.ts +2 -0
- package/dist/__tests__/linear-comment.test.d.ts.map +1 -0
- package/dist/__tests__/linear-comment.test.js +151 -0
- package/dist/__tests__/linear-comment.test.js.map +1 -0
- package/dist/__tests__/linear-identity.test.d.ts +2 -0
- package/dist/__tests__/linear-identity.test.d.ts.map +1 -0
- package/dist/__tests__/linear-identity.test.js +253 -0
- package/dist/__tests__/linear-identity.test.js.map +1 -0
- package/dist/__tests__/linear-notify.test.d.ts +2 -0
- package/dist/__tests__/linear-notify.test.d.ts.map +1 -0
- package/dist/__tests__/linear-notify.test.js +144 -0
- package/dist/__tests__/linear-notify.test.js.map +1 -0
- package/dist/__tests__/linear-ref.test.d.ts +2 -0
- package/dist/__tests__/linear-ref.test.d.ts.map +1 -0
- package/dist/__tests__/linear-ref.test.js +261 -0
- package/dist/__tests__/linear-ref.test.js.map +1 -0
- package/dist/__tests__/linear-test-ref.test.d.ts +2 -0
- package/dist/__tests__/linear-test-ref.test.d.ts.map +1 -0
- package/dist/__tests__/linear-test-ref.test.js +81 -0
- package/dist/__tests__/linear-test-ref.test.js.map +1 -0
- package/dist/__tests__/linear-verify.test.d.ts +2 -0
- package/dist/__tests__/linear-verify.test.d.ts.map +1 -0
- package/dist/__tests__/linear-verify.test.js +132 -0
- package/dist/__tests__/linear-verify.test.js.map +1 -0
- package/dist/__tests__/linear-worker.test.d.ts +2 -0
- package/dist/__tests__/linear-worker.test.d.ts.map +1 -0
- package/dist/__tests__/linear-worker.test.js +83 -0
- package/dist/__tests__/linear-worker.test.js.map +1 -0
- package/dist/__tests__/linear-write-possible.test.d.ts +2 -0
- package/dist/__tests__/linear-write-possible.test.d.ts.map +1 -0
- package/dist/__tests__/linear-write-possible.test.js +30 -0
- package/dist/__tests__/linear-write-possible.test.js.map +1 -0
- package/dist/__tests__/onboard-preservation.test.js +59 -3
- package/dist/__tests__/onboard-preservation.test.js.map +1 -1
- package/dist/__tests__/optimize.test.js +2 -0
- package/dist/__tests__/optimize.test.js.map +1 -1
- package/dist/__tests__/pr-status.test.js +163 -2
- package/dist/__tests__/pr-status.test.js.map +1 -1
- package/dist/__tests__/pr-workflow-state.test.js +102 -1
- package/dist/__tests__/pr-workflow-state.test.js.map +1 -1
- package/dist/__tests__/repo-picker.test.js +7 -1
- package/dist/__tests__/repo-picker.test.js.map +1 -1
- package/dist/__tests__/repository-guidance.test.d.ts +2 -0
- package/dist/__tests__/repository-guidance.test.d.ts.map +1 -0
- package/dist/__tests__/repository-guidance.test.js +107 -0
- package/dist/__tests__/repository-guidance.test.js.map +1 -0
- package/dist/__tests__/review-comment-body.test.js +35 -0
- package/dist/__tests__/review-comment-body.test.js.map +1 -1
- package/dist/__tests__/review-models.test.js +19 -3
- package/dist/__tests__/review-models.test.js.map +1 -1
- package/dist/__tests__/review-strategy.test.d.ts +2 -0
- package/dist/__tests__/review-strategy.test.d.ts.map +1 -0
- package/dist/__tests__/review-strategy.test.js +397 -0
- package/dist/__tests__/review-strategy.test.js.map +1 -0
- package/dist/__tests__/runner.test.js +29 -1
- package/dist/__tests__/runner.test.js.map +1 -1
- package/dist/__tests__/skill-attribution.test.d.ts +2 -0
- package/dist/__tests__/skill-attribution.test.d.ts.map +1 -0
- package/dist/__tests__/skill-attribution.test.js +53 -0
- package/dist/__tests__/skill-attribution.test.js.map +1 -0
- package/dist/__tests__/skill-broker.test.d.ts +2 -0
- package/dist/__tests__/skill-broker.test.d.ts.map +1 -0
- package/dist/__tests__/skill-broker.test.js +144 -0
- package/dist/__tests__/skill-broker.test.js.map +1 -0
- package/dist/__tests__/skill-catalog.test.d.ts +2 -0
- package/dist/__tests__/skill-catalog.test.d.ts.map +1 -0
- package/dist/__tests__/skill-catalog.test.js +40 -0
- package/dist/__tests__/skill-catalog.test.js.map +1 -0
- package/dist/__tests__/skill-installer.test.d.ts +2 -0
- package/dist/__tests__/skill-installer.test.d.ts.map +1 -0
- package/dist/__tests__/skill-installer.test.js +96 -0
- package/dist/__tests__/skill-installer.test.js.map +1 -0
- package/dist/__tests__/skills-config.test.d.ts +2 -0
- package/dist/__tests__/skills-config.test.d.ts.map +1 -0
- package/dist/__tests__/skills-config.test.js +12 -0
- package/dist/__tests__/skills-config.test.js.map +1 -0
- package/dist/cli.js +29 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/detect-step.d.ts.map +1 -1
- package/dist/commands/detect-step.js +4 -0
- package/dist/commands/detect-step.js.map +1 -1
- package/dist/commands/kickass.d.ts.map +1 -1
- package/dist/commands/kickass.js +3 -2
- package/dist/commands/kickass.js.map +1 -1
- package/dist/commands/linear-test.d.ts +18 -0
- package/dist/commands/linear-test.d.ts.map +1 -0
- package/dist/commands/linear-test.js +130 -0
- package/dist/commands/linear-test.js.map +1 -0
- package/dist/commands/onboard.d.ts +36 -3
- package/dist/commands/onboard.d.ts.map +1 -1
- package/dist/commands/onboard.js +233 -42
- package/dist/commands/onboard.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +65 -6
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +51 -7
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/skill.d.ts +2 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +16 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +53 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +169 -64
- package/dist/commands/watch.js.map +1 -1
- package/dist/config/loader.d.ts +3 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +13 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/review-model-tiers.json +3 -3
- package/dist/config/review-strategy.json +204 -0
- package/dist/config/schema.d.ts +261 -15
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +90 -8
- package/dist/config/schema.js.map +1 -1
- package/dist/github/client.d.ts +21 -1
- package/dist/github/client.d.ts.map +1 -1
- package/dist/github/client.js +46 -7
- package/dist/github/client.js.map +1 -1
- package/dist/github/webhook.d.ts +4 -0
- package/dist/github/webhook.d.ts.map +1 -1
- package/dist/github/webhook.js.map +1 -1
- package/dist/issues/ticket-ref.d.ts.map +1 -1
- package/dist/issues/ticket-ref.js +6 -5
- package/dist/issues/ticket-ref.js.map +1 -1
- package/dist/lib/annotation.d.ts +7 -0
- package/dist/lib/annotation.d.ts.map +1 -1
- package/dist/lib/annotation.js +11 -1
- package/dist/lib/annotation.js.map +1 -1
- package/dist/lib/board.d.ts +3 -0
- package/dist/lib/board.d.ts.map +1 -1
- package/dist/lib/board.js +4 -2
- package/dist/lib/board.js.map +1 -1
- package/dist/lib/clone.d.ts +1 -0
- package/dist/lib/clone.d.ts.map +1 -1
- package/dist/lib/clone.js +32 -10
- package/dist/lib/clone.js.map +1 -1
- package/dist/lib/comment-bodies.d.ts +37 -0
- package/dist/lib/comment-bodies.d.ts.map +1 -1
- package/dist/lib/comment-bodies.js +47 -9
- package/dist/lib/comment-bodies.js.map +1 -1
- package/dist/lib/pr-status.d.ts.map +1 -1
- package/dist/lib/pr-status.js +36 -2
- package/dist/lib/pr-status.js.map +1 -1
- package/dist/lib/pr-workflow-state.d.ts +5 -0
- package/dist/lib/pr-workflow-state.d.ts.map +1 -1
- package/dist/lib/pr-workflow-state.js +36 -1
- package/dist/lib/pr-workflow-state.js.map +1 -1
- package/dist/lib/repo-picker.d.ts +3 -0
- package/dist/lib/repo-picker.d.ts.map +1 -1
- package/dist/lib/repo-picker.js +45 -9
- package/dist/lib/repo-picker.js.map +1 -1
- package/dist/lib/repository-guidance.d.ts +2 -0
- package/dist/lib/repository-guidance.d.ts.map +1 -0
- package/dist/lib/repository-guidance.js +55 -0
- package/dist/lib/repository-guidance.js.map +1 -0
- package/dist/lib/review-models.d.ts +15 -2
- package/dist/lib/review-models.d.ts.map +1 -1
- package/dist/lib/review-models.js +26 -6
- package/dist/lib/review-models.js.map +1 -1
- package/dist/lib/review-strategy.d.ts +92 -0
- package/dist/lib/review-strategy.d.ts.map +1 -0
- package/dist/lib/review-strategy.js +282 -0
- package/dist/lib/review-strategy.js.map +1 -0
- package/dist/lib/runner.d.ts +92 -0
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/runner.js +470 -54
- package/dist/lib/runner.js.map +1 -1
- package/dist/lib/workflow.d.ts +9 -0
- package/dist/lib/workflow.d.ts.map +1 -1
- package/dist/lib/workflow.js +20 -0
- package/dist/lib/workflow.js.map +1 -1
- package/dist/linear/client.d.ts +18 -0
- package/dist/linear/client.d.ts.map +1 -0
- package/dist/linear/client.js +67 -0
- package/dist/linear/client.js.map +1 -0
- package/dist/linear/comment.d.ts +20 -0
- package/dist/linear/comment.d.ts.map +1 -0
- package/dist/linear/comment.js +57 -0
- package/dist/linear/comment.js.map +1 -0
- package/dist/linear/identity.d.ts +59 -0
- package/dist/linear/identity.d.ts.map +1 -0
- package/dist/linear/identity.js +187 -0
- package/dist/linear/identity.js.map +1 -0
- package/dist/linear/notify.d.ts +35 -0
- package/dist/linear/notify.d.ts.map +1 -0
- package/dist/linear/notify.js +76 -0
- package/dist/linear/notify.js.map +1 -0
- package/dist/linear/ref.d.ts +13 -0
- package/dist/linear/ref.d.ts.map +1 -0
- package/dist/linear/ref.js +90 -0
- package/dist/linear/ref.js.map +1 -0
- package/dist/linear/verify.d.ts +26 -0
- package/dist/linear/verify.d.ts.map +1 -0
- package/dist/linear/verify.js +67 -0
- package/dist/linear/verify.js.map +1 -0
- package/dist/reviewers/claude.d.ts +4 -1
- package/dist/reviewers/claude.d.ts.map +1 -1
- package/dist/reviewers/claude.js +39 -7
- package/dist/reviewers/claude.js.map +1 -1
- package/dist/reviewers/codex.d.ts +3 -1
- package/dist/reviewers/codex.d.ts.map +1 -1
- package/dist/reviewers/codex.js +76 -70
- package/dist/reviewers/codex.js.map +1 -1
- package/dist/reviewers/conflict-resolve.d.ts +3 -1
- package/dist/reviewers/conflict-resolve.d.ts.map +1 -1
- package/dist/reviewers/conflict-resolve.js +21 -6
- package/dist/reviewers/conflict-resolve.js.map +1 -1
- package/dist/reviewers/fix.d.ts +5 -2
- package/dist/reviewers/fix.d.ts.map +1 -1
- package/dist/reviewers/fix.js +26 -10
- package/dist/reviewers/fix.js.map +1 -1
- package/dist/skills/attribution.d.ts +4 -0
- package/dist/skills/attribution.d.ts.map +1 -0
- package/dist/skills/attribution.js +14 -0
- package/dist/skills/attribution.js.map +1 -0
- package/dist/skills/broker-server.d.ts +2 -0
- package/dist/skills/broker-server.d.ts.map +1 -0
- package/dist/skills/broker-server.js +17 -0
- package/dist/skills/broker-server.js.map +1 -0
- package/dist/skills/broker.d.ts +42 -0
- package/dist/skills/broker.d.ts.map +1 -0
- package/dist/skills/broker.js +285 -0
- package/dist/skills/broker.js.map +1 -0
- package/dist/skills/catalog.d.ts +28 -0
- package/dist/skills/catalog.d.ts.map +1 -0
- package/dist/skills/catalog.js +104 -0
- package/dist/skills/catalog.js.map +1 -0
- package/dist/skills/installer.d.ts +10 -0
- package/dist/skills/installer.d.ts.map +1 -0
- package/dist/skills/installer.js +138 -0
- package/dist/skills/installer.js.map +1 -0
- package/dist/skills/integrity.d.ts +4 -0
- package/dist/skills/integrity.d.ts.map +1 -0
- package/dist/skills/integrity.js +36 -0
- package/dist/skills/integrity.js.map +1 -0
- package/docs/dynamic-thoroughness.md +738 -0
- package/docs/linear-identity-contract.md +139 -0
- package/docs/linear-identity.md +293 -0
- package/get-started.md +223 -11
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -6,509 +6,313 @@
|
|
|
6
6
|
<img src="./assets/logo.png" alt="crosscheck" width="160" />
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
|
-
<
|
|
9
|
+
<h1 align="center">crosscheck</h1>
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
<p align="center"><strong>Your agents ship fast. Crosscheck makes sure they ship right.</strong></p>
|
|
12
12
|
|
|
13
13
|
<p align="center">
|
|
14
|
-
<
|
|
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>
|
|
15
17
|
</p>
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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."
|
|
22
|
-
|
|
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.
|
|
24
|
-
|
|
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.
|
|
26
|
-
|
|
27
|
-
## Why crosscheck?
|
|
28
|
-
|
|
29
|
-
**Agent velocity without lowering the merge bar.**
|
|
30
|
-
|
|
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`.
|
|
35
|
-
|
|
36
|
-
## Who uses crosscheck
|
|
37
|
-
|
|
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 |
|
|
19
|
+
<p align="center">
|
|
20
|
+
<img src="./assets/screenshot-watch.png" alt="crosscheck watch — live pipeline view" width="860" />
|
|
21
|
+
</p>
|
|
44
22
|
|
|
45
|
-
|
|
23
|
+
---
|
|
46
24
|
|
|
47
|
-
|
|
25
|
+
## The problem
|
|
48
26
|
|
|
49
|
-
|
|
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.
|
|
50
28
|
|
|
51
|
-
|
|
52
|
-
# Catch regressions before merging a solo PR
|
|
53
|
-
crosscheck run <pr-url>
|
|
29
|
+
Asking the agent that wrote the patch to review it doesn't help. That's exactly where early victory hides.
|
|
54
30
|
|
|
55
|
-
|
|
56
|
-
crosscheck review <pr-url>
|
|
31
|
+
## What crosscheck does
|
|
57
32
|
|
|
58
|
-
|
|
59
|
-
crosscheck onboard --personal
|
|
60
|
-
crosscheck watch
|
|
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.
|
|
61
34
|
|
|
62
|
-
# Loop until the agent produces an approved patch
|
|
63
|
-
crosscheck run <pr-url> --crazy
|
|
64
35
|
```
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|
36
|
+
PR → review → fix → recheck → merge-ready
|
|
37
|
+
(codex) (claude) (codex)
|
|
79
38
|
```
|
|
80
39
|
|
|
81
|
-
|
|
40
|
+
Three properties make that practical:
|
|
82
41
|
|
|
83
|
-
|
|
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.
|
|
84
45
|
|
|
85
|
-
|
|
46
|
+
## Same mission. Sharper skills.
|
|
86
47
|
|
|
87
|
-
|
|
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.
|
|
88
49
|
|
|
89
|
-
|
|
90
|
-
# 1. Install crosscheck
|
|
91
|
-
npm install -g @humanbased/crosscheck
|
|
50
|
+
The recommended onboarding bundle combines a broad review baseline, architecture vocabulary, and rigorous bug diagnosis:
|
|
92
51
|
|
|
93
|
-
|
|
94
|
-
|
|
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.
|
|
95
55
|
|
|
96
|
-
|
|
97
|
-
npm install -g @openai/codex && codex login --device-auth
|
|
98
|
-
# or:
|
|
99
|
-
npm install -g @anthropic-ai/claude-code && claude
|
|
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>`.
|
|
100
57
|
|
|
101
|
-
|
|
102
|
-
crosscheck status
|
|
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.
|
|
103
59
|
|
|
104
|
-
|
|
105
|
-
crosscheck review https://github.com/humanbased-ai/crosscheck-proof-fixture/pull/1 --reviewer codex
|
|
106
|
-
```
|
|
60
|
+
Setup and trust model: **[Agent skills](./get-started.md#crosscheck-skill-install-source)**.
|
|
107
61
|
|
|
108
|
-
|
|
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/).
|
|
63
|
+
|
|
64
|
+
---
|
|
109
65
|
|
|
110
|
-
|
|
66
|
+
## Install
|
|
111
67
|
|
|
112
68
|
```bash
|
|
113
|
-
# 1. Install crosscheck and the agent CLIs
|
|
114
69
|
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
|
|
124
70
|
```
|
|
125
71
|
|
|
126
|
-
>
|
|
127
|
-
>
|
|
128
|
-
|
|
129
|
-
### Always-on team mode
|
|
72
|
+
<details>
|
|
73
|
+
<summary>Other channels</summary>
|
|
130
74
|
|
|
131
75
|
```bash
|
|
132
|
-
|
|
133
|
-
crosscheck
|
|
76
|
+
npm install -g @humanbased/crosscheck@beta # latest features, rougher edges
|
|
77
|
+
npx @humanbased/crosscheck <command> # no install
|
|
134
78
|
|
|
135
|
-
|
|
136
|
-
crosscheck
|
|
137
|
-
crosscheck alter humanbased-ai/api --steps review,fix,recheck
|
|
138
|
-
|
|
139
|
-
# 3. Start the long-lived watcher
|
|
140
|
-
crosscheck watch
|
|
79
|
+
git clone https://github.com/humanbased-ai/crosscheck
|
|
80
|
+
cd crosscheck && npm install && npm run build && npm link
|
|
141
81
|
```
|
|
82
|
+
</details>
|
|
142
83
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
## Commands
|
|
84
|
+
You need GitHub CLI plus **at least one** reviewer CLI. Install both only if you want cross-vendor routing.
|
|
146
85
|
|
|
147
86
|
```bash
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
|
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
|
|
159
90
|
```
|
|
160
91
|
|
|
161
|
-
|
|
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 |
|
|
92
|
+
Both reviewers run on your existing subscription — no API key required.
|
|
178
93
|
|
|
179
|
-
|
|
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.
|
|
94
|
+
## First review in two minutes
|
|
194
95
|
|
|
195
96
|
```bash
|
|
196
|
-
crosscheck
|
|
197
|
-
crosscheck
|
|
97
|
+
crosscheck status # confirm auth
|
|
98
|
+
crosscheck review https://github.com/humanbased-ai/crosscheck-proof-fixture/pull/1 --reviewer codex
|
|
198
99
|
```
|
|
199
100
|
|
|
200
|
-
|
|
201
|
-
- Claude: `claude`, `claude-code`, `cc`, `anthropic`
|
|
202
|
-
- Codex: `codex`, `openai`
|
|
203
|
-
|
|
204
|
-
**Continuous improvement** *(experimental)*
|
|
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:
|
|
205
102
|
|
|
206
103
|
```bash
|
|
207
|
-
crosscheck
|
|
208
|
-
crosscheck
|
|
209
|
-
crosscheck impact [--money] # time saved, issues caught, code quality trends
|
|
210
|
-
crosscheck issue # draft and file a bug report from recent error logs
|
|
104
|
+
crosscheck onboard # guided: repos, routing, pipeline depth, connection
|
|
105
|
+
crosscheck watch # listen for PR events
|
|
211
106
|
```
|
|
212
107
|
|
|
213
108
|
---
|
|
214
109
|
|
|
215
|
-
|
|
110
|
+
## Where results land
|
|
216
111
|
|
|
217
|
-
|
|
112
|
+
### On the pull request
|
|
218
113
|
|
|
219
|
-
|
|
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`.
|
|
114
|
+
Every review posts a comment carrying a machine-readable annotation:
|
|
231
115
|
|
|
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
|
|
238
116
|
```
|
|
239
|
-
|
|
240
|
-
|
|
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
|
|
117
|
+
<!-- crosscheck: origin=claude reviewer=codex model=gpt-5.6-terra
|
|
118
|
+
type=review round=1 verdict=NEEDS_WORK service=crosscheck sha=a1b2c3d -->
|
|
252
119
|
```
|
|
253
120
|
|
|
254
|
-
|
|
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.
|
|
255
122
|
|
|
256
|
-
|
|
123
|
+
### On your Linear issue
|
|
257
124
|
|
|
258
|
-
|
|
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:
|
|
259
126
|
|
|
260
|
-
|
|
127
|
+
<p align="center">
|
|
128
|
+
<img src="./assets/linear-comment.svg" alt="A crosscheck review comment on a Linear issue" width="740" />
|
|
129
|
+
</p>
|
|
261
130
|
|
|
262
|
-
|
|
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
|
-
```
|
|
131
|
+
Attribution is a ladder — **start at the bottom, climb only if you need to**:
|
|
271
132
|
|
|
272
|
-
|
|
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 |
|
|
273
137
|
|
|
274
|
-
|
|
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.
|
|
275
139
|
|
|
276
|
-
|
|
140
|
+
`crosscheck onboard` asks which rung you want and writes the config:
|
|
277
141
|
|
|
278
|
-
|
|
279
|
-
crosscheck
|
|
280
|
-
|
|
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
|
-
```
|
|
142
|
+
<p align="center">
|
|
143
|
+
<img src="./assets/linear-onboard.svg" alt="crosscheck onboard — choosing a Linear attribution rung" width="700" />
|
|
144
|
+
</p>
|
|
292
145
|
|
|
293
|
-
|
|
146
|
+
To check a setup without waiting for a PR, `linear-test` runs the whole path and posts nothing:
|
|
294
147
|
|
|
295
|
-
|
|
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>
|
|
296
151
|
|
|
297
|
-
|
|
152
|
+
<details>
|
|
153
|
+
<summary>Confirming which rung you're on at any time</summary>
|
|
298
154
|
|
|
299
|
-
|
|
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) |
|
|
155
|
+
`crosscheck status` resolves the configured identity for real and reports what a write would render as:
|
|
304
156
|
|
|
305
|
-
|
|
306
|
-
crosscheck
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
```
|
|
157
|
+
<p align="center">
|
|
158
|
+
<img src="./assets/linear-status.svg" alt="crosscheck status — the Linear identity section" width="620" />
|
|
159
|
+
</p>
|
|
160
|
+
</details>
|
|
310
161
|
|
|
311
|
-
|
|
162
|
+
Full walkthrough: **[docs/linear-identity.md](./docs/linear-identity.md)**.
|
|
312
163
|
|
|
313
164
|
---
|
|
314
165
|
|
|
315
|
-
|
|
166
|
+
## Commands
|
|
316
167
|
|
|
317
|
-
|
|
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:
|
|
318
185
|
|
|
319
186
|
```bash
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
.../repo/pull/245,https://github.com/o/other/pull/3 # across repos
|
|
187
|
+
crosscheck review https://github.com/acme/app/pull/245,255
|
|
188
|
+
crosscheck run https://github.com/acme/app/pull/245-256 --concurrent 4
|
|
323
189
|
```
|
|
324
190
|
|
|
325
|
-
|
|
191
|
+
Full flag reference: **[get-started.md](./get-started.md)**.
|
|
326
192
|
|
|
327
193
|
---
|
|
328
194
|
|
|
329
|
-
|
|
195
|
+
## Configuration
|
|
330
196
|
|
|
331
|
-
|
|
197
|
+
Config lives at `~/.crosscheck/config.yml`. A `./crosscheck.config.yml` in the working directory is treated as a deliberate per-project override.
|
|
332
198
|
|
|
333
|
-
|
|
199
|
+
### Review depth
|
|
334
200
|
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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
|
|
341
211
|
```
|
|
342
212
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
### `crosscheck detect-step`
|
|
346
|
-
|
|
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.
|
|
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.
|
|
348
215
|
|
|
349
|
-
|
|
350
|
-
crosscheck detect-step <pr-url>
|
|
351
|
-
crosscheck detect-step <pr-url> --json
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
---
|
|
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.
|
|
355
217
|
|
|
356
|
-
|
|
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 |
|
|
357
223
|
|
|
358
|
-
|
|
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.
|
|
359
225
|
|
|
360
|
-
|
|
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
|
-
```
|
|
226
|
+
`claude-fable-5` is **banned** from review: 2× Opus 5's price for a lower coding benchmark score.
|
|
368
227
|
|
|
369
|
-
|
|
228
|
+
### Dynamic thoroughness (`mode: smart`)
|
|
370
229
|
|
|
371
|
-
|
|
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.
|
|
372
231
|
|
|
373
|
-
|
|
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 |
|
|
374
242
|
|
|
375
|
-
|
|
376
|
-
- `watch` owns **all continuation** — it listens for the webhooks each completed step produces and runs the full remaining pipeline from there.
|
|
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`.
|
|
377
244
|
|
|
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
|
|
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.
|
|
384
246
|
|
|
385
|
-
|
|
386
|
-
├─ issue_comment (type=review) → pick up fix step automatically
|
|
387
|
-
└─ synchronize (fix commit) → pick up recheck step automatically
|
|
388
|
-
```
|
|
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.
|
|
389
248
|
|
|
390
|
-
|
|
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.
|
|
391
250
|
|
|
392
|
-
|
|
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.
|
|
393
252
|
|
|
394
|
-
|
|
395
|
-
# terminal 1
|
|
396
|
-
crosscheck watch
|
|
253
|
+
Every comment says which policy produced it:
|
|
397
254
|
|
|
398
|
-
# terminal 2
|
|
399
|
-
crosscheck scan --force # refresh PR state
|
|
400
|
-
crosscheck kickass
|
|
401
255
|
```
|
|
256
|
+
_thorough tier · touches a security or data-critical path, where a missed defect
|
|
257
|
+
is expensive · strategy v1.1.0_
|
|
402
258
|
|
|
403
|
-
|
|
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
|
|
259
|
+
<!-- crosscheck: … model=claude-opus-5 verdict=BLOCK strategy=1.1.0 class=risky tier=thorough … -->
|
|
425
260
|
```
|
|
426
261
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
## Configuration
|
|
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.
|
|
430
263
|
|
|
431
|
-
|
|
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).
|
|
432
265
|
|
|
433
|
-
|
|
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.
|
|
434
267
|
|
|
435
|
-
|
|
436
|
-
# crosscheck.config.yml
|
|
437
|
-
quality:
|
|
438
|
-
tier: balanced # fast | balanced | thorough
|
|
439
|
-
```
|
|
268
|
+
### Pipeline depth
|
|
440
269
|
|
|
441
|
-
|
|
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`)
|
|
270
|
+
The global pipeline lives in `~/.crosscheck/workflow.yml` and defaults to the full loop:
|
|
448
271
|
|
|
449
272
|
```yaml
|
|
450
273
|
steps:
|
|
451
274
|
- name: review
|
|
452
275
|
type: review
|
|
453
|
-
reviewer: auto
|
|
454
|
-
|
|
276
|
+
reviewer: auto # auto | claude | codex | origin
|
|
455
277
|
- name: fix
|
|
456
278
|
type: fix
|
|
457
279
|
reviewer: origin
|
|
458
280
|
when: review.verdict != 'APPROVE'
|
|
459
|
-
|
|
460
281
|
- name: recheck
|
|
461
282
|
type: recheck
|
|
462
283
|
reviewer: auto
|
|
463
284
|
when: fix.applied_count > 0
|
|
464
285
|
```
|
|
465
286
|
|
|
466
|
-
|
|
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`:
|
|
287
|
+
To narrow a single repo without touching the global default:
|
|
469
288
|
|
|
470
289
|
```bash
|
|
471
|
-
crosscheck alter
|
|
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
|
|
290
|
+
crosscheck alter acme/app --review-only # or --steps review,fix
|
|
474
291
|
```
|
|
475
292
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
```yaml
|
|
479
|
-
# ~/.crosscheck/workflows/humanbased-ai__xny-monorepo.yml
|
|
480
|
-
steps:
|
|
481
|
-
- review
|
|
482
|
-
```
|
|
293
|
+
That writes a standalone override at `~/.crosscheck/workflows/<owner>__<repo>.yml`, live-reloaded per PR — no watcher restart.
|
|
483
294
|
|
|
484
|
-
|
|
295
|
+
Every option, annotated: **[crosscheck.config.example.yml](./crosscheck.config.example.yml)**.
|
|
485
296
|
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
```yaml
|
|
489
|
-
# ~/.crosscheck/config.yml
|
|
490
|
-
orgs:
|
|
491
|
-
- your-org
|
|
297
|
+
---
|
|
492
298
|
|
|
493
|
-
|
|
494
|
-
allowed_authors:
|
|
495
|
-
- your-github-login
|
|
299
|
+
## Running it continuously
|
|
496
300
|
|
|
497
|
-
|
|
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).
|
|
498
302
|
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
codex:
|
|
503
|
-
enabled: true
|
|
303
|
+
```bash
|
|
304
|
+
crosscheck onboard && crosscheck watch
|
|
305
|
+
```
|
|
504
306
|
|
|
505
|
-
|
|
506
|
-
tier: balanced
|
|
307
|
+
**On a server** — one always-on watcher for a team, with per-repo depth where it matters.
|
|
507
308
|
|
|
508
|
-
|
|
309
|
+
```bash
|
|
310
|
+
crosscheck onboard --team
|
|
311
|
+
crosscheck alter acme/legacy-service --review-only
|
|
312
|
+
crosscheck watch
|
|
509
313
|
```
|
|
510
314
|
|
|
511
|
-
|
|
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.
|
|
512
316
|
|
|
513
317
|
---
|
|
514
318
|
|
|
@@ -517,8 +321,8 @@ Full reference: [get-started.md](./get-started.md)
|
|
|
517
321
|
| | Minimum |
|
|
518
322
|
|---|---|
|
|
519
323
|
| Node.js | 18+ |
|
|
520
|
-
| Claude Code CLI |
|
|
521
|
-
| Codex CLI |
|
|
324
|
+
| Claude Code CLI | `npm install -g @anthropic-ai/claude-code` |
|
|
325
|
+
| Codex CLI | `npm install -g @openai/codex` |
|
|
522
326
|
| GitHub CLI | 2.65+ — `brew install gh` |
|
|
523
327
|
|
|
524
328
|
`GITHUB_TOKEN` is derived automatically from `gh auth login`. No manual export needed.
|
|
@@ -529,9 +333,12 @@ Full reference: [get-started.md](./get-started.md)
|
|
|
529
333
|
|
|
530
334
|
| | |
|
|
531
335
|
|---|---|
|
|
532
|
-
| **[get-started.md](./get-started.md)** | Full setup guide — prerequisites,
|
|
533
|
-
| **[
|
|
534
|
-
| **[docs/
|
|
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 |
|
|
535
342
|
| **[crosscheck.config.example.yml](./crosscheck.config.example.yml)** | Annotated config with every option |
|
|
536
343
|
| **[CHANGELOG.md](./CHANGELOG.md)** | Release notes |
|
|
537
344
|
|
|
@@ -541,8 +348,8 @@ Full reference: [get-started.md](./get-started.md)
|
|
|
541
348
|
|
|
542
349
|
Issues and PRs welcome at [github.com/humanbased-ai/crosscheck](https://github.com/humanbased-ai/crosscheck).
|
|
543
350
|
|
|
544
|
-
---
|
|
545
|
-
|
|
546
351
|
## License
|
|
547
352
|
|
|
548
|
-
[MIT](./LICENSE) — Copyright (c) 2025–2026 Humanbased PTE LTD.
|
|
353
|
+
[MIT](./LICENSE) — Copyright (c) 2025–2026 Humanbased AI PTE LTD.
|
|
354
|
+
|
|
355
|
+
<p align="center"><em>A Humanbased project, built with crosscheck.</em></p>
|