@humanbased/crosscheck 1.3.1-beta.7 → 1.6.0-beta.5

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 (152) hide show
  1. package/README.md +16 -1
  2. package/assets/demo-block-to-approve.gif +0 -0
  3. package/assets/demo-block-to-approve.mp4 +0 -0
  4. package/dist/__tests__/base-ref-recovery.test.d.ts +2 -0
  5. package/dist/__tests__/base-ref-recovery.test.d.ts.map +1 -0
  6. package/dist/__tests__/base-ref-recovery.test.js +102 -0
  7. package/dist/__tests__/base-ref-recovery.test.js.map +1 -0
  8. package/dist/__tests__/board.test.js +246 -17
  9. package/dist/__tests__/board.test.js.map +1 -1
  10. package/dist/__tests__/codex-env.test.js +4 -0
  11. package/dist/__tests__/codex-env.test.js.map +1 -1
  12. package/dist/__tests__/credential-free-origin.test.js +134 -2
  13. package/dist/__tests__/credential-free-origin.test.js.map +1 -1
  14. package/dist/__tests__/demo-arc.test.d.ts +2 -0
  15. package/dist/__tests__/demo-arc.test.d.ts.map +1 -0
  16. package/dist/__tests__/demo-arc.test.js +73 -0
  17. package/dist/__tests__/demo-arc.test.js.map +1 -0
  18. package/dist/__tests__/doc-only-verdict.test.d.ts +2 -0
  19. package/dist/__tests__/doc-only-verdict.test.d.ts.map +1 -0
  20. package/dist/__tests__/doc-only-verdict.test.js +79 -0
  21. package/dist/__tests__/doc-only-verdict.test.js.map +1 -0
  22. package/dist/__tests__/error-classification.test.js +14 -0
  23. package/dist/__tests__/error-classification.test.js.map +1 -1
  24. package/dist/__tests__/fix-requires-recheck.test.d.ts +2 -0
  25. package/dist/__tests__/fix-requires-recheck.test.d.ts.map +1 -0
  26. package/dist/__tests__/fix-requires-recheck.test.js +56 -0
  27. package/dist/__tests__/fix-requires-recheck.test.js.map +1 -0
  28. package/dist/__tests__/human-feedback.test.d.ts +2 -0
  29. package/dist/__tests__/human-feedback.test.d.ts.map +1 -0
  30. package/dist/__tests__/human-feedback.test.js +132 -0
  31. package/dist/__tests__/human-feedback.test.js.map +1 -0
  32. package/dist/__tests__/inconclusive-review.test.d.ts +2 -0
  33. package/dist/__tests__/inconclusive-review.test.d.ts.map +1 -0
  34. package/dist/__tests__/inconclusive-review.test.js +110 -0
  35. package/dist/__tests__/inconclusive-review.test.js.map +1 -0
  36. package/dist/__tests__/merge-gate.test.d.ts +2 -0
  37. package/dist/__tests__/merge-gate.test.d.ts.map +1 -0
  38. package/dist/__tests__/merge-gate.test.js +220 -0
  39. package/dist/__tests__/merge-gate.test.js.map +1 -0
  40. package/dist/__tests__/no-verdict.test.d.ts +2 -0
  41. package/dist/__tests__/no-verdict.test.d.ts.map +1 -0
  42. package/dist/__tests__/no-verdict.test.js +415 -0
  43. package/dist/__tests__/no-verdict.test.js.map +1 -0
  44. package/dist/__tests__/pr-spec.test.js +37 -0
  45. package/dist/__tests__/pr-spec.test.js.map +1 -1
  46. package/dist/__tests__/run.test.js +50 -1
  47. package/dist/__tests__/run.test.js.map +1 -1
  48. package/dist/__tests__/runner.test.js +82 -1
  49. package/dist/__tests__/runner.test.js.map +1 -1
  50. package/dist/__tests__/standing-verdict-history.test.d.ts +2 -0
  51. package/dist/__tests__/standing-verdict-history.test.d.ts.map +1 -0
  52. package/dist/__tests__/standing-verdict-history.test.js +109 -0
  53. package/dist/__tests__/standing-verdict-history.test.js.map +1 -0
  54. package/dist/__tests__/step-plan.test.d.ts +2 -0
  55. package/dist/__tests__/step-plan.test.d.ts.map +1 -0
  56. package/dist/__tests__/step-plan.test.js +129 -0
  57. package/dist/__tests__/step-plan.test.js.map +1 -0
  58. package/dist/cli.js +12 -0
  59. package/dist/cli.js.map +1 -1
  60. package/dist/commands/merge.d.ts +11 -0
  61. package/dist/commands/merge.d.ts.map +1 -0
  62. package/dist/commands/merge.js +188 -0
  63. package/dist/commands/merge.js.map +1 -0
  64. package/dist/commands/review.d.ts.map +1 -1
  65. package/dist/commands/review.js +29 -7
  66. package/dist/commands/review.js.map +1 -1
  67. package/dist/commands/run.d.ts +53 -0
  68. package/dist/commands/run.d.ts.map +1 -1
  69. package/dist/commands/run.js +197 -32
  70. package/dist/commands/run.js.map +1 -1
  71. package/dist/commands/watch.d.ts.map +1 -1
  72. package/dist/commands/watch.js +32 -8
  73. package/dist/commands/watch.js.map +1 -1
  74. package/dist/config/loader.d.ts +4 -0
  75. package/dist/config/loader.d.ts.map +1 -1
  76. package/dist/config/loader.js +8 -0
  77. package/dist/config/loader.js.map +1 -1
  78. package/dist/config/review-strategy.json +5 -5
  79. package/dist/github/client.d.ts +18 -1
  80. package/dist/github/client.d.ts.map +1 -1
  81. package/dist/github/client.js +19 -3
  82. package/dist/github/client.js.map +1 -1
  83. package/dist/github/merge.d.ts +28 -0
  84. package/dist/github/merge.d.ts.map +1 -1
  85. package/dist/github/merge.js +41 -0
  86. package/dist/github/merge.js.map +1 -1
  87. package/dist/github/webhook.d.ts +1 -0
  88. package/dist/github/webhook.d.ts.map +1 -1
  89. package/dist/github/webhook.js.map +1 -1
  90. package/dist/lib/board.d.ts +29 -3
  91. package/dist/lib/board.d.ts.map +1 -1
  92. package/dist/lib/board.js +228 -50
  93. package/dist/lib/board.js.map +1 -1
  94. package/dist/lib/clone.d.ts +65 -1
  95. package/dist/lib/clone.d.ts.map +1 -1
  96. package/dist/lib/clone.js +252 -16
  97. package/dist/lib/clone.js.map +1 -1
  98. package/dist/lib/human-feedback.d.ts +9 -0
  99. package/dist/lib/human-feedback.d.ts.map +1 -0
  100. package/dist/lib/human-feedback.js +83 -0
  101. package/dist/lib/human-feedback.js.map +1 -0
  102. package/dist/lib/logger.d.ts +1 -1
  103. package/dist/lib/logger.d.ts.map +1 -1
  104. package/dist/lib/logger.js +6 -0
  105. package/dist/lib/logger.js.map +1 -1
  106. package/dist/lib/merge-gate.d.ts +70 -0
  107. package/dist/lib/merge-gate.d.ts.map +1 -0
  108. package/dist/lib/merge-gate.js +138 -0
  109. package/dist/lib/merge-gate.js.map +1 -0
  110. package/dist/lib/no-verdict.d.ts +104 -0
  111. package/dist/lib/no-verdict.d.ts.map +1 -0
  112. package/dist/lib/no-verdict.js +262 -0
  113. package/dist/lib/no-verdict.js.map +1 -0
  114. package/dist/lib/pr-spec.d.ts +7 -0
  115. package/dist/lib/pr-spec.d.ts.map +1 -1
  116. package/dist/lib/pr-spec.js +12 -1
  117. package/dist/lib/pr-spec.js.map +1 -1
  118. package/dist/lib/pr-workflow-state.d.ts +37 -0
  119. package/dist/lib/pr-workflow-state.d.ts.map +1 -1
  120. package/dist/lib/pr-workflow-state.js +58 -1
  121. package/dist/lib/pr-workflow-state.js.map +1 -1
  122. package/dist/lib/review-strategy.d.ts +14 -0
  123. package/dist/lib/review-strategy.d.ts.map +1 -1
  124. package/dist/lib/review-strategy.js +32 -1
  125. package/dist/lib/review-strategy.js.map +1 -1
  126. package/dist/lib/runner.d.ts +51 -2
  127. package/dist/lib/runner.d.ts.map +1 -1
  128. package/dist/lib/runner.js +211 -105
  129. package/dist/lib/runner.js.map +1 -1
  130. package/dist/lib/tips.d.ts.map +1 -1
  131. package/dist/lib/tips.js +1 -0
  132. package/dist/lib/tips.js.map +1 -1
  133. package/dist/lib/verdict.d.ts +30 -1
  134. package/dist/lib/verdict.d.ts.map +1 -1
  135. package/dist/lib/verdict.js +94 -9
  136. package/dist/lib/verdict.js.map +1 -1
  137. package/dist/reviewers/codex-env.d.ts.map +1 -1
  138. package/dist/reviewers/codex-env.js +2 -0
  139. package/dist/reviewers/codex-env.js.map +1 -1
  140. package/dist/reviewers/codex.d.ts.map +1 -1
  141. package/dist/reviewers/codex.js +3 -1
  142. package/dist/reviewers/codex.js.map +1 -1
  143. package/dist/reviewers/fix.d.ts +2 -2
  144. package/dist/reviewers/fix.d.ts.map +1 -1
  145. package/dist/reviewers/fix.js +10 -4
  146. package/dist/reviewers/fix.js.map +1 -1
  147. package/docs/growth/launch/README.md +59 -0
  148. package/docs/growth/launch/essay-stop-letting-one-agent-review-its-own-code.md +118 -0
  149. package/docs/growth/launch/posts.md +175 -0
  150. package/docs/trust.md +16 -1
  151. package/get-started.md +16 -0
  152. package/package.json +11 -3
@@ -0,0 +1,175 @@
1
+ # Launch posts — drafts
2
+
3
+ > **Not published.** These are drafts for a human to post. Every number traces to
4
+ > [`docs/dynamic-thoroughness.md`](../../dynamic-thoroughness.md). Read
5
+ > [`README.md`](./README.md) in this folder before posting anything — particularly the
6
+ > self-promotion rules per community, which differ and are enforced.
7
+
8
+ The through-line in all of them: **the reviewer being correct was not the bottleneck.** That is the one non-obvious thing we learned, and it is what earns attention. Lead with it rather than with the product.
9
+
10
+ ---
11
+
12
+ ## X / Twitter
13
+
14
+ **Version A — the finding (recommended)**
15
+
16
+ > We built an AI code reviewer. Of 40 BLOCK findings sampled, 39 were verifiable; none were false.
17
+ >
18
+ > Yet 62% of PRs merged past its findings. Median review-to-merge gap: 4 minutes.
19
+ >
20
+ > Being right isn't a gate. [link]
21
+
22
+ **Version B — the failure mode**
23
+
24
+ > Ask the agent that wrote a patch to review it and it'll say it's good. The reasoning that produced the bug is now judging it.
25
+ >
26
+ > Not a prompt problem: blind spot and reviewer share a context window.
27
+ >
28
+ > Our Claude PRs go to Codex, and back. [link]
29
+
30
+ **Version C — one concrete defect**
31
+
32
+ > A function took an `expected_mode` param for dual-control confirmation and never put it in the request body. Two lines apart. Dual control silently bypassed. Tests passed.
33
+ >
34
+ > The agent that wrote it called it done. A different agent caught it.
35
+ >
36
+ > [link]
37
+
38
+ Thread continuation for A or B, if you want one:
39
+
40
+ > 2/ The census: 400 merged PRs, 199 crosscheck-engaged, one week.
41
+ >
42
+ > Reviews landed before merge 94% of the time. 38% of PRs reached APPROVE. 56% of the rest merged within five minutes of the review — or before it landed.
43
+ >
44
+ > 3/ The reason was ours: crosscheck created a lifecycle status while a run was in flight, but the verdict lived only in a comment. `crosscheck/review` wasn't required by branch protection, so GitHub merged the second CI went green.
45
+ >
46
+ > 4/ The trap: gating first would have made it worse. Findings never stopped arriving, so an enforced unbounded loop turns "merged in 4 minutes" into "blocked for two days."
47
+ >
48
+ > Bound the loop, then gate, then optimize latency. In that order.
49
+ >
50
+ > 5/ MIT, shells out to configured vendor CLIs. With subscription-authenticated Claude and Codex, there's no separate hosted service or per-review API bill; API-key auth is also supported.
51
+ >
52
+ > Try it with Crosscheck's own writes suppressed: `crosscheck run <pr-url> --dry-run` (the vendor CLI still runs under its configured permissions).
53
+ >
54
+ > [repo link]
55
+
56
+ ---
57
+
58
+ ## LinkedIn
59
+
60
+ > **We measured our AI code reviewer and the result inverted the roadmap.**
61
+ >
62
+ > We build with coding agents daily. The failure mode that costs us isn't a broken build — CI catches those. It's what we've started calling early victory: a patch that passes CI, reads as complete, has a confident summary attached, and quietly carries a regression or a half-finished fix.
63
+ >
64
+ > Asking the agent that wrote the patch to review it doesn't help. The reasoning that produced the bug is the reasoning now judging it.
65
+ >
66
+ > In our two-vendor setup, we routed each PR to a *different* agent — Claude-authored PRs to Codex, and back — with findings returning to the author agent for repair and a recheck before merge.
67
+ >
68
+ > Then we ran a census: 400 merged PRs over one week, 199 of them reviewed by the system. We sampled 40 of its blocking findings and hand-read each against the file it cited.
69
+ >
70
+ > Of 40 sampled findings, 39 were verifiable and none were false; one was unverifiable. ~85% of the verifiable findings were genuine defects. Reviews landed before merge 94% of the time.
71
+ >
72
+ > And 62% of PRs merged straight past them. Median gap from last review to merge: four minutes.
73
+ >
74
+ > The problem was never review quality. The verdict lived in a comment, and `crosscheck/review` wasn't required by branch protection, so GitHub merged the moment CI went green.
75
+ >
76
+ > The counter-intuitive part: adding the gate first would have made things worse. Findings never stopped arriving across rounds, and enforcing an unbounded loop converts "merged past findings in four minutes" into "blocked for two days." Bound the loop, then gate, then optimize latency.
77
+ >
78
+ > Two things I'd take to any team shipping agent-authored code:
79
+ >
80
+ > → Don't let the author review its own work. Treat it as an architectural constraint, not a prompt preference.
81
+ > → Measure whether your review changes the merge decision — the share of real defects fixed inside the merge window. Not findings per PR.
82
+ >
83
+ > Crosscheck is MIT and shells out to configured vendor CLIs. With subscription authentication, there is no separate per-review API bill; API-key authentication is also supported. Full census, including the two analytical approaches we abandoned, is in the repo.
84
+ >
85
+ > [repo link]
86
+
87
+ ---
88
+
89
+ ## Hacker News — Show HN
90
+
91
+ **Title** (80 char limit; both fit)
92
+
93
+ - `Show HN: Crosscheck – route agent-authored PRs to a different agent for review`
94
+ - `Show HN: We measured our AI code reviewer; being correct wasn't the bottleneck`
95
+
96
+ Prefer the first for a Show HN — it says what the thing is. Use the second as a regular submission of the essay if the Show HN doesn't land.
97
+
98
+ **First comment** (post immediately after submitting)
99
+
100
+ > Author here. When both vendors are configured, Crosscheck routes each agent-authored PR to a *different* agent than the one that wrote it — Claude-authored PRs to Codex and vice versa — then sends findings back to the author agent to fix and rechecks before the PR is merge-ready. It shells out to the configured CLIs rather than adding a hosted service. With subscription authentication, there is no separate per-review API bill; API-key authentication is also supported.
101
+ >
102
+ > The motivating failure isn't broken builds. It's patches that pass CI, read as complete, and carry a regression or a fix that addresses the symptom rather than the cause. Asking the authoring agent to review its own work doesn't catch those — the reasoning that produced the bug is the one judging it.
103
+ >
104
+ > The part I'd actually like feedback on is what happened when we measured it. We censused 400 merged PRs over a week (199 crosscheck-engaged), sampled 40 BLOCK findings, and hand-read each against the file it cited at the reviewed sha: 39 were verifiable and none were false; one was unverifiable. ~85% of the verifiable findings were genuine defects, and 94% of reviews landed before merge.
105
+ >
106
+ > And 62% of PRs merged past them anyway, median four minutes after the last review. The cause was structural and ours: crosscheck created a lifecycle status while a run was in flight, but the verdict lived only in a comment and `crosscheck/review` wasn't required by branch protection. GitHub merged as soon as CI went green.
107
+ >
108
+ > What surprised me is that fixing that first would have been harmful. Findings kept arriving across rounds, so enforcing an unbounded loop turns "merged past findings in four minutes" into "blocked for two days." The order has to be: bound the loop, then gate, then reduce latency.
109
+ >
110
+ > Honest limits: it never merges on its own — only a person running `crosscheck merge` can reach the gated merge path. It doesn't replace human review, and your diff reaches Anthropic/OpenAI through their own CLIs under their terms — crosscheck adds no separate upload path. The census is one team, one week, our conventions; I'd be interested in whether the 4-minute number reproduces elsewhere or whether we're just undisciplined.
111
+ >
112
+ > First run with Crosscheck's GitHub writes suppressed: `crosscheck run <pr-url> --dry-run`. It still clones locally and invokes the configured vendor CLI under that CLI's permissions.
113
+ >
114
+ > MIT: [repo link]. The census, including two analytical approaches we abandoned, is in docs/dynamic-thoroughness.md.
115
+
116
+ **Notes for the poster**
117
+
118
+ - Submit the repo URL, not the essay, for a Show HN.
119
+ - Be present for the first two hours. The questions to expect: "isn't this just two LLMs agreeing with each other," "what's the token cost per PR," "why not use existing review bots," and "0 false positives is not believable." Answer the last one with the labelling method (hand-read against the cited sha, seeded sample, 6 severity-inflated cases counted as *true*) rather than restating the number.
120
+ - Do not seed upvotes or comments. HN detects it and it ends the launch.
121
+
122
+ ---
123
+
124
+ ## Reddit
125
+
126
+ Community rules on self-promotion differ, several ban it outright, and moderators enforce it. Check each sidebar before posting; where promotion is restricted, post the essay's finding as a discussion and mention the tool only if asked.
127
+
128
+ ### r/ExperiencedDevs — discussion framing, no product lead
129
+
130
+ **Title:** `39 verifiable AI code-review findings, 0 false — and 62% of PRs merged past them anyway.`
131
+
132
+ > We ship a lot of agent-authored PRs and built an independent reviewer for them (a different model than the one that wrote the patch). Before trusting it we ran a census: 400 merged PRs over a week, sampled 40 of its blocking findings, and hand-read each one against the file it cited at the sha it was reviewed at.
133
+ >
134
+ > Of the 40 sampled findings, 39 were verifiable and none were false; one was unverifiable. ~85% of the verifiable findings were genuine defects. 94% of reviews landed before the merge.
135
+ >
136
+ > Then the uncomfortable number: only 38% of PRs reached an approving verdict, and the median gap between the last review and the merge was 4 minutes. Most PRs merged straight past correct findings.
137
+ >
138
+ > The cause turned out to be structural rather than about review quality: the verdict lived only in a PR comment. Crosscheck created a lifecycle status while the run was in flight, but that status did not represent the verdict and appeared in no branch protection rule, so nothing stopped a merge the moment CI went green.
139
+ >
140
+ > What I didn't expect: adding the required check first would have made it worse. Findings kept arriving in later rounds, so enforcing an unbounded review loop converts "merged in 4 minutes" into "blocked for two days." We had to bound the loop before gating it.
141
+ >
142
+ > Curious whether others measuring review effectiveness see the same thing — that precision and latency aren't the binding constraint, and the review simply isn't part of the merge decision. And how you bounded the loop without capping it somewhere arbitrary.
143
+
144
+ ### r/ClaudeAI and r/ClaudeCode — practitioner framing
145
+
146
+ **Title:** `Stopped letting Claude review its own PRs — routed them to Codex instead. Here's what the findings looked like.`
147
+
148
+ > I use Claude Code as my main author. Asking it to review its own patch was consistently useless — not wrong exactly, just agreeable. The reasoning that wrote the bug is the reasoning judging it, and it already convinced itself once.
149
+ >
150
+ > So I wired up both vendors: Claude-authored PRs go to Codex, Codex-authored PRs go to Claude, findings return to the original author agent to fix, then a recheck.
151
+ >
152
+ > Sampled 40 of the blocking findings and hand-checked them against the source. Of 39 verifiable findings, none were false; one was unverifiable. The good ones weren't lint-grade — they read the repo's own convention docs and traced call paths across services. One caught a function that accepted an `expected_mode` param for dual-control confirmation and never put it in the request body. Two lines apart, tests green.
153
+ >
154
+ > It shells out to the configured `claude` and `codex` CLIs. With subscription authentication, there is no separate per-review API bill; API-key authentication is also supported. MIT.
155
+ >
156
+ > To suppress Crosscheck's own GitHub writes on a first run: `crosscheck run <pr-url> --dry-run`. It still clones locally and invokes the vendor CLI under that CLI's configured permissions.
157
+ >
158
+ > [repo link]
159
+
160
+ ### r/ChatGPTCoding — same shape, Codex-first
161
+
162
+ Use the r/ClaudeAI draft with the vendors swapped: Codex as the author, Claude as the reviewer. Keep the concrete defect example — it is what makes the post land.
163
+
164
+ ---
165
+
166
+ ## What not to say
167
+
168
+ Guardrails, so nothing in this launch has to be walked back:
169
+
170
+ - **No invented numbers.** Everything quotable is in `docs/dynamic-thoroughness.md`. If a number isn't there, it doesn't get posted.
171
+ - **No comparison to CR-Bench precision without the caveat.** 3.6–5.1% vs ~85% is not apples to apples; quoting it bare is the kind of claim that gets correctly torn apart.
172
+ - **No "catches every bug."** 6 of 40 findings were severity-inflated. Say so when it comes up.
173
+ - **No fake adoption.** No user counts, no "teams are using," no testimonials we don't have.
174
+ - **No claim that it replaces human review.** It makes agent output reviewable.
175
+ - **No implication that source stays local.** It reaches the model vendors through their CLIs, and the trust doc says so plainly.
package/docs/trust.md CHANGED
@@ -79,10 +79,25 @@ The workflow is a sequence of steps, and each step's mutations are listed below.
79
79
  | **recheck** | Same as review — a second comment, and release of the pending status. **No code.** |
80
80
  | **fix** | Code. Commits to the PR's own branch and pushes there, plus a "fix applied" comment. If that push cannot land (protected branch, deleted branch, fork), it pushes the same commit to `fix/cr-<pr>-review-issues`, opens a follow-up PR targeting the original branch, and labels it `cr-autofix`. In `delivery.mode: comment` it pushes nothing and posts the diff as a suggestion instead. |
81
81
  | **conflict-resolve** | Code. Merges the base branch into the PR branch, resolves conflicts, and pushes the merge commit to the PR branch, plus a comment. Skipped for fork PRs. |
82
+ | **`crosscheck merge`** (never automatic) | Merges the pull request. Not a workflow step — no verdict, webhook, or scheduled run reaches it; it happens only when a person types the command. See below. |
82
83
 
83
84
  Boundaries that hold across every step:
84
85
 
85
- - **Never merges.** No command merges a pull request — there is no code path from any verdict to a merge. `crosscheck scan` will tell you a PR looks merge-ready; a human or your own automation acts on that.
86
+ - **Never merges on its own.** No verdict, webhook, or scheduled run reaches a merge — there is no code path from a review to one. The single exception is explicit: `crosscheck merge <pr-url>`, which merges only when a person runs it, and only when the gate below is satisfied. `watch`, `run`, `kickass` and `scan` cannot merge anything.
87
+
88
+ This boundary used to be absolute, and the change is worth stating plainly rather than leaving for you to notice: earlier versions had no merge code at all. If you relied on "crosscheck cannot merge, whatever it is told to do", the guarantee is now "crosscheck cannot merge unless a human invokes one specific command", which is a weaker promise. Nothing else in this document changed.
89
+
90
+ | Invocation | Merges when |
91
+ |---|---|
92
+ | `crosscheck merge <pr>` | an `APPROVE` verdict covers the exact commit being merged, and GitHub reports the PR mergeable |
93
+ | `--loose` | the standing verdict covers HEAD and is not `BLOCK` (so `NEEDS WORK` merges) |
94
+ | `--tight` | the default, plus every check green and no unresolved blocking finding |
95
+ | `--force` | no verdict gate at all. Logged as `merge_completed` with the verdict it overrode |
96
+ | `--dry-run` | never — evaluates the gate and reports |
97
+
98
+ Three things hold at every level, `--force` included. A conflicted PR is refused, because `--force` overrides crosscheck's opinion and not git's. The merge is submitted with the head SHA the gate evaluated, so GitHub rejects it if the branch moved in between — an approval can never be applied to a commit that arrived after it. And branch protection is GitHub's to enforce: crosscheck asks, and a protected branch can still say no.
99
+
100
+ To keep the old absolute guarantee, do not grant the token `contents: write`, or simply do not run the command — nothing else invokes it.
86
101
  - **Never touches your base branch.** Pushes go to the PR's head branch or to a new `fix/cr-*` branch. `main` and `staging` are only ever read.
87
102
  - **Never force-pushes over your work.** A rejected non-fast-forward push is retried by rebasing onto the remote branch; if that fails it gives up and falls back to the follow-up PR.
88
103
  - **Never edits outside the clone.** All work happens in a `mkdtemp` directory that is deleted when the step finishes, pass or fail.
package/get-started.md CHANGED
@@ -323,6 +323,22 @@ Waiting for PR events — Ctrl+C to stop.
323
323
 
324
324
  When you press `Ctrl+C`, the SSH tunnel and any registered webhooks are cleaned up automatically.
325
325
 
326
+ **Browsing the session history.** The live board holds every PR the session has
327
+ handled, not just the ones on screen. The footer says where you are:
328
+
329
+ ```
330
+ live · page 1/4 │ showing 18 of 61 │ ctrl+< older ctrl+> newer
331
+ ```
332
+
333
+ Press `ctrl+<` (or plain `<`) to page back through the history and `ctrl+>` (or
334
+ plain `>`) to return to the live page. `ctrl+←` / `ctrl+→` work too, for
335
+ terminals that swallow modified punctuation — macOS Terminal never forwards
336
+ `cmd`, so use the bare `<` / `>` keys there. The live page keeps its place while
337
+ you browse: new PR events land on it without yanking you forward. Per-event
338
+ narration (routing decisions, strategy picks) is no longer printed between the
339
+ rows — it goes to the file log at `~/.crosscheck/logs/`, which `crosscheck
340
+ status` points at.
341
+
326
342
  **Token scope for org webhooks:** `GITHUB_TOKEN` needs `write:org` scope for org-level coverage. For repo-level, `repo` scope is sufficient.
327
343
 
328
344
  **Review-only for a repo:** make a repo post reviews and nothing else with `crosscheck alter <repo> --review-only` — crosscheck never runs the fix, recheck, or conflict-resolve steps for it, and never pushes commits to its PRs:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@humanbased/crosscheck",
3
- "version": "1.3.1-beta.7",
3
+ "version": "1.6.0-beta.5",
4
4
  "description": "AI code review pipeline that turns agent-written PRs into merge-ready patches",
5
5
  "bin": {
6
6
  "crosscheck": "dist/cli.js",
@@ -29,7 +29,11 @@
29
29
  "test": "vitest run",
30
30
  "lint": "eslint src --ext .ts",
31
31
  "prepublishOnly": "npm run typecheck && npm run build",
32
- "verify:strategy": "node scripts/verify-review-strategy.mjs"
32
+ "verify:strategy": "node scripts/verify-review-strategy.mjs",
33
+ "demo:capture": "tsx demo/capture.ts",
34
+ "demo:play": "tsx demo/replay.ts",
35
+ "demo:record": "vhs demo/block-to-approve.tape && vhs demo/block-to-approve-short.tape",
36
+ "demo:time": "tsx demo/measure.ts"
33
37
  },
34
38
  "dependencies": {
35
39
  "chalk": "^5.3.0",
@@ -75,5 +79,9 @@
75
79
  "url": "https://github.com/humanbased-ai/crosscheck/issues"
76
80
  },
77
81
  "author": "Humanbased PTE LTD",
78
- "license": "MIT"
82
+ "license": "MIT",
83
+ "publishConfig": {
84
+ "access": "public",
85
+ "registry": "https://registry.npmjs.org/"
86
+ }
79
87
  }