Every review is one trip through the same pipeline. A webhook enqueues a job; the worker claims it; the pipeline loads the PR, decides how much to spend, runs the review, filters the output, and posts. This page walks the whole path in order.
GitHub PR opened / updated │ signed webhook (verified) ▼inline webhook endpoint ──► review job queued │ picked up by the worker ▼ ┌─ the review pipeline ──────────────────────────────────────┐ │ 1. guard / skip checks (repo enabled? PR open? head fresh?) │ │ 2. incremental base (diff only since last reviewed head) │ │ 3. path filters + diff compression │ │ 4. project-type detection → guideline pack │ │ 5. triage — a fast model (trivial vs substantive) │ │ 6. budget gate │ │ 7. deep review — a frontier model, agentic loop │ │ 8. validation gate (confidence, severity, dedup, anchoring) │ │ 9. post GitHub review: summary + inline comments │ │ 10. persist review + findings + cost, absorb repo memory │ └────────────────────────────────────────────────────────────┘
The webhook path does almost nothing — it verifies the signature and queues a job. GitHub gives webhooks only a few seconds to respond, so all model work happens later in the worker. Reviewable PR actions are opened, synchronize, ready for review, and reopened; drafts are skipped; a closed PR triggers the feedback harvest.
inline reviews only what’s new. It finds the last completed review for this PR and uses that review’s head as the comparison base, so a third push reviews only the third push’s changes — deduped against everything already flagged.
Commenting @inline full review on the PR forces a full re-review from scratch. A force-push that breaks the compare API falls back to a full diff automatically.
Two cost levers run here before a single token reaches a model:
Path filters drop files that never deserve a review — lockfiles, build output, dependencies, generated code, minified JS, migrations, snapshots, images, fixtures. This is the cheapest lever: filtered files cost nothing. Defaults are combined with per-repo and per-workspace globs you set in review config.
Diff compression ranks the surviving files by change volume, de-prioritizes enormous files, and clips the diff sent to the model. Anything omitted is noted so the review agent can pull it in later with its file-reading tools.
inline detects whether the PR is TypeScript, React, React Native, C#, and so on, and selects the matching guideline pack — a language-specific set of review rules folded into the review.
trivial — no deep review. inline records the verdict, notes a low-risk line on the walkthrough, syncs the gate, and stops. This is where most of the cost savings come from.
substantive — proceed to the deep review. When in doubt, triage chooses substantive.
Between triage and the expensive deep review, inline checks the workspace’s monthly budget. At 80% of the cap it fires a one-time alert. Past the cap, if budget-degrade is on, it stops at triage and records the review as incomplete — which excludes it from the incremental base, so the PR gets a real review next month instead of being silently skipped.
Research external context (when web research is enabled).
submit_review
The required terminal tool that returns the findings.
The loop is bounded by a step ceiling and a per-turn output cap. The explorer subagents run on a fast model at a fraction of the deep model’s price, carrying the token-heavy breadth work while the frontier model does the judgment. If the loop hits the step ceiling without submitting a review, the review is recorded incomplete and the incremental base is held so nothing is lost.
The model is told, emphatically, that a review with no findings is a success — never comment on style, formatting, naming, docs, or coverage, and refute your own finding before flagging it.
Everything the model submits passes through a validation gate before anything is posted. Findings are suppressed (never dropped — they’re stored with a reason and visible in the portal) when they are low-confidence, below the repo’s severity threshold, duplicates, un-anchorable to the diff, or beyond the comment cap. This is the machinery that keeps inline quiet — it has its own page: Noise control.
inline posts a single GitHub review: a summary comment (the walkthrough sticky comment, finalized here) plus inline comments anchored to changed lines. If GitHub rejects the inline anchors, it falls back to a body-only review so the findings still land.
Finally the pipeline records the review and its findings with full cost accounting, reopens any re-confirmed findings, auto-resolves threads for findings that are now addressed, syncs the merge gate, optionally enqueues a walkthrough page, sandbox tests, or an auto-fix PR — and folds this review’s summary and findings into the repo’s memory with a cheap model call.
Jobs are drained by an in-process worker. It claims jobs atomically, serializes work per-PR so two jobs on the same PR never double-post, dispatches each job to the right handler by type, and continuously recovers stale jobs. Failed jobs retry with exponential backoff up to a bounded attempt count.