Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
c8f8cc2
Add a live web dashboard, and three settings the fleet had no way to …
kristofferR Jul 28, 2026
b3619c0
Make the dialogs reachable by keyboard, and back off when the stream …
kristofferR Jul 28, 2026
cc33231
Keep the dashboard running across a reboot
kristofferR Jul 28, 2026
66270d8
Make the fleet defaults editable, and say what changing one would do
kristofferR Jul 28, 2026
e461be1
Let each repository decide how its fix sessions run
kristofferR Jul 28, 2026
033c6d1
Say which bots actually run, and let the Bots page change it
kristofferR Jul 28, 2026
daec87f
Use one on/off control everywhere
kristofferR Jul 28, 2026
0f26059
Give the Bots page the Runs and Required pair, not one switch in a co…
kristofferR Jul 28, 2026
4867f87
Stop a cached index.html pinning the dashboard to an old bundle
kristofferR Jul 28, 2026
9657680
Make the Bots page a guide, not a third place to flip the same switch
kristofferR Jul 28, 2026
3367268
Stop reading crq's own trigger posts as evidence a bot is working
kristofferR Jul 28, 2026
b37f1d5
Move a pre-dashboard fleet's settings into shared state, and make the…
kristofferR Jul 28, 2026
24d1979
One binary: the watcher and its fix sessions are both crq
kristofferR Jul 28, 2026
36d4926
Let an install say the credential is there when it cannot be proved f…
kristofferR Jul 28, 2026
0aa766f
Say what each pull request is about, and let a list be narrowed
kristofferR Jul 28, 2026
d4c610a
Point the attention items somewhere, and put holds where the repo lives
kristofferR Jul 28, 2026
747af84
Let each host say what it can reach, so the fleet can be read as a fleet
kristofferR Jul 28, 2026
f9da856
Per-bot trigger settings, and say who a fleet default does not reach
kristofferR Jul 28, 2026
d1a6091
Say what enrolling would cost, and give an empty fleet something to read
kristofferR Jul 28, 2026
ba462a3
Give a converged round a verdict, and a suggestion its evidence
kristofferR Jul 28, 2026
2296033
Say what stopping a repository does, and let Setup answer for the fleet
kristofferR Jul 28, 2026
1853fc6
Reach a repository's reviewers from the row that made you want to
kristofferR Jul 28, 2026
71a3f15
Let the dashboard count itself as a service on its host
kristofferR Jul 28, 2026
1fa867c
Stop enabling review bots nobody signed up for
kristofferR Jul 28, 2026
0ca4419
Make a fleet setting mean the same thing everywhere it is read
kristofferR Jul 28, 2026
ee6d7ce
Make an off switch mean off, everywhere it is read
kristofferR Jul 28, 2026
b296344
Answer from the state the write lands on, not the one the process sta…
kristofferR Jul 28, 2026
94120e4
Answer each setting from the layer that actually decides it
kristofferR Jul 28, 2026
aea0fa0
Make an off switch, a fleet setting and a preview mean what they say
kristofferR Jul 28, 2026
9852f39
Read each setting from the layer that decides it, and say what was ob…
kristofferR Jul 28, 2026
0d3dc72
Read a setting from the layer that owns it, and keep what a newer bin…
kristofferR Jul 28, 2026
04978f1
Ask the layer that knows: the primary, the agent, and this machine's …
kristofferR Jul 28, 2026
2cf5e36
Keep what a newer binary wrote, and ask the layer that answered
kristofferR Jul 28, 2026
18cd1e6
fix: make autofix failures self-healing
kristofferR Jul 28, 2026
3af693d
feat: add queue prioritization
kristofferR Jul 28, 2026
5c139cf
Address dashboard and fleet review feedback
kristofferR Jul 28, 2026
27aee74
fix: parse review findings by bot dialect
kristofferR Jul 28, 2026
292fd25
fix: clean Codex review body formatting
kristofferR Jul 28, 2026
99fde72
fix: trust only structured provider outages
kristofferR Jul 28, 2026
b51e7b4
Fix review configuration state handling
kristofferR Jul 28, 2026
58910db
Fix review lifecycle edge cases
kristofferR Jul 28, 2026
e6d15fe
Address outstanding review findings
kristofferR Jul 28, 2026
d206058
Address remaining dashboard review findings
kristofferR Jul 28, 2026
2806e7c
Fix remaining review safety gaps
kristofferR Jul 28, 2026
a9369ab
Improve setup diagnostics and controls
kristofferR Jul 28, 2026
f19045c
Fix dashboard review workflow edge cases
kristofferR Jul 28, 2026
8342b77
Fix withdrawn review reply parsing
kristofferR Jul 28, 2026
f31cff5
Add autofix policies and live logs
kristofferR Jul 28, 2026
d65854b
Address PR review feedback
kristofferR Jul 28, 2026
b1b4b76
Serialize live log polling
kristofferR Jul 28, 2026
4aafb8e
Make dashboard responsive on mobile
kristofferR Jul 28, 2026
956c110
Trigger required reviews when checks are unreadable
kristofferR Jul 28, 2026
708c8af
Make always review triggers unconditional
kristofferR Jul 28, 2026
acf9706
Address dashboard and reviewer state feedback
kristofferR Jul 28, 2026
d2076fd
Fix fleet settings review edge cases
kristofferR Jul 28, 2026
b97630b
Address dashboard review feedback
kristofferR Jul 28, 2026
e6b6f37
Refactor dashboard with Effect v4
kristofferR Jul 28, 2026
16308ca
Fix dashboard review feedback
kristofferR Jul 29, 2026
cf183b3
Fix dashboard review regressions
kristofferR Jul 29, 2026
7816274
Fix remaining dashboard review issues
kristofferR Jul 29, 2026
c196857
Fix review state bookkeeping edge cases
kristofferR Jul 29, 2026
e1a42d6
Fix fleet settings and dispatch consistency
kristofferR Jul 29, 2026
7a1b38f
Fix dashboard review configuration races
kristofferR Jul 29, 2026
98dc0cd
Address review feedback on enrollment and dashboard state
kristofferR Jul 29, 2026
cff57ef
Fix review settings edge cases
kristofferR Jul 29, 2026
e1fe14e
Address remaining review feedback
kristofferR Jul 29, 2026
3cacdfe
Fix dispatch ownership and reviewer settings
kristofferR Jul 29, 2026
b8dc7ee
Fix remaining review feedback
kristofferR Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
dist/
# The dashboard's built SPA is the ONE dist that is committed: internal/serve
# embeds it with go:embed, so a clean checkout cannot compile without it. Every
# other dist is build output.
/dist/
web/dist/
# Explicit, because a global gitignore's blanket "dist/" also matches this one
# and git will not descend into an excluded directory to re-include its files.
!internal/serve/dist/
web/node_modules/
*.log
.DS_Store

Expand Down
28 changes: 19 additions & 9 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ Dependency rule (Go-enforced, no cycles): `dialect ← engine ← crq`, `state
static `KnownCoReviewers()` list — Codex, Cursor Bugbot, Macroscope — each
carrying its login, config name, check-run app slug, trigger command, and its
wording hooks (`ClassifyComment`, `ClassifyCheck`, `ResolvedInSHA`,
`FindingDedupeKey`, …). The only place a bot's literal wording may appear.
`FindingDedupeKey`, `Price`, …). The only place a bot's literal wording may
appear. `pricing.go` holds the vendors' published prices and the per-bot cost
estimators behind `PricesCheckedAt` — money is bot knowledge like any other.
- `internal/gh/` — GitHub REST/GraphQL transport, bot-agnostic. Owns the "GitHub
REST quota" concept under the name **Throttle** (`ThrottleWait`/`IsThrottled`).
The only package (besides dialect) allowed to say "rate limit".
Expand All @@ -30,18 +32,26 @@ Dependency rule (Go-enforced, no cycles): `dialect ← engine ← crq`, `state
credential-safe Git execution, stale-worktree pruning, and mirror migration.
Owns persistent filesystem and process I/O for checkouts; `crq` supplies only
configured roots and a current-token resolver.
- `internal/state/` — persisted schema v4: one `Round` per PR, one global
`FireSlot`, the CodeRabbit `AccountQuota`, an `Archive` ring. Round transition
- `internal/state/` — persisted schema v5: one `Round` per PR, one global
`FireSlot`, the CodeRabbit `AccountQuota`, an `Archive` ring, and the
per-repository records (`Repos` reviewer overrides incl. `PrimaryOff`,
`RepoAutofix`, `Enrolled`). `WriterCaps` is a monotonic integer bumped
whenever one of those records starts changing decisions, so a fleet running
two binary versions can name the hosts that will ignore a new one. Round transition
methods, durable tombstones for tidied trigger comments, the CAS store, and
dashboard rendering. `Round.CoBots` holds per-
co-reviewer trigger bookkeeping; Codex's entry is **dual-written** to the
legacy `Codex*` round fields because the fleet shares one state ref across
binary versions (`Normalize` folds them back on load). `Round` and `State` also
**round-trip unknown JSON members** (`tolerant.go`), so a field a newer binary
added survives being read and rewritten by an older one — which is what makes
ordinary additions safe without another dual-write or schema bump. Schema v4
is the deliberate exception: older v3 clients refuse it, fencing pumping
clients that cannot enforce administrative holds.
binary versions (`Normalize` folds them back on load). `State`, `Round` and
every record NESTED inside them — `FireSlot`, `FleetDefaults`, `SolverSettings`,
`RepoReviewers`, `RepoEnrollment`, `HostReport`, `ToolReport` — **round-trip unknown JSON members** (`tolerant.go`), so a
field a newer binary added survives being read and rewritten by an older one.
Nesting is why each needs its own: the carrier recognises the member by name
and hands the whole object to an ordinary decoder, which drops anything inside
it. That is what makes ordinary additions safe without another dual-write or
schema bump. Schema v4 deliberately fenced older v3 pumping clients that
could not enforce administrative holds. Schema v5 similarly fences v4
writers that would erase the dispatch scheduler's model and cooldown state.
- `internal/engine/` — PURE decision logic, `now` passed in, no ctx/gh:
`DecideFire` (the single fire owner), `Progress` (fired/reviewing round
transitions), `Completion` (the one "is the round done?"), `BlockingFindings`
Expand Down
23 changes: 22 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -409,8 +409,29 @@ crq hold # list held PRs

crq tidy <repo> <pr> # delete crq's own spent review-trigger comments (--dry-run previews)

crq serve # ⭐ the live web dashboard (crq serve install enables a reboot-persistent service)
Comment thread
coderabbitai[bot] marked this conversation as resolved.

crq cost <repo> <pr> # what one more review round there would cost, before firing it
# (CRQ_WEEKLY_LIMIT sets the fair-use threshold the dashboard forecasts)

crq fleet # the defaults every repository inherits (env → fleet record → repo override)
crq fleet adopt # ⭐ record THIS host's settings for the fleet (--dry-run shows the plan)
crq fleet env <KEY> [<value>|--clear] # any single setting, by its environment-variable name
crq fleet set [--bots <a,b>] [--required <a,b>] [--min-interval <dur>] [--weekly-limit <n>]
[--autofix-default on|off] [--dry-run] # --dry-run reports the impact, writes nothing

crq solver <repo> # models, scope, clarification policy, attempts, forks and prompt
crq solver set <repo> [--models <first,next,...>] [--severities minor,potential] [--ask uncertain]
crq solver set <repo> [--effort <e>] [--attempts <n>] [--forks on|off] [--prompt <text>]
crq solver set <repo> --inherit models,effort,severities,ask,forks,skip-authors # follow the fleet
crq solver set --fleet [...] # the default every repository inherits

crq repos # which projects crq reviews, and where each answer comes from
crq repos add <repo> | crq repos remove <repo> --reason "<why>" | crq repos default <repo>

crq reviewers <repo> # which bots review this project, and what each costs
crq reviewers set <repo> [--bots <a,b>] [--required <a,b>] # choose them (either flag alone)
crq reviewers set <repo> --no-primary | --primary # CodeRabbit off/on for this project
crq reviewers clear <repo> # back to the fleet default

crq dismiss <repo> <pr> <finding-id> [...] --reason "<why>" # account for a finding with no thread
Expand Down Expand Up @@ -494,7 +515,7 @@ Set these in `~/.config/crq/env` (sourced automatically) or as environment varia
| `CRQ_STATE_REF` | `crq-state-v3` | git ref that stores the typed CAS state. The name is fixed; the schema inside it is v4, and a binary that predates a schema **refuses** the payload rather than erasing it — so upgrade every host together |
| `CRQ_REPOS` | _(all in scope)_ | `autoreview` allowlist — only these `owner/name` repos (comma-separated) |
| `CRQ_EXCLUDE` | _(none)_ | denylist — crq never reviews, watches or fixes these `owner/name` repos (comma-separated) |
| `CRQ_AUTOREVIEW_SKIP_AUTHORS` | `dependabot[bot]` | PR authors `autoreview` never enqueues (comma-separated; case and `[bot]` suffix don't matter) — set to empty to auto-review bot PRs too; manual `crq review` is unaffected |
| `CRQ_AUTOREVIEW_SKIP_AUTHORS` | `dependabot[bot]` | PR authors `autoreview` never enqueues, and the autofix watcher never touches (comma-separated; case and `[bot]` suffix don't matter) — set to empty to auto-review bot PRs too; manual `crq review` is unaffected |
| `CRQ_AUTOREVIEW_SKIP_MARKER` | `<!-- crq:skip-autoreview -->` | exact PR-body marker that suppresses fleet auto-review; set empty to disable; manual `crq loop` is unaffected |
| `CRQ_TIDY` | `0` | set to `1` to delete crq's own spent review-trigger comments as rounds progress (`crq tidy` by hand is unaffected) |
| `CRQ_REQUIRED_BOTS` | `coderabbitai[bot]` | bots that must review the head for convergence (crq waits for all of them) |
Expand Down
Loading