Review the change. Understand the codebase.

OpenReview reviews pull requests using your whole repository, not only the diff. Every finding quotes the code it depends on, and nothing is posted until it has been verified.

Every plan starts with a 14-day free trial.

AcmeAdmin
Docs
Account menu for @dana

acme/shop #42

completed

GitHub · Acme · github.com · Repository ID 482113

Reviewed revision 9f3c2e1a7b40d6c1 · Oct 14, 2026, 2:03 PM UTC

Show cart totals in dollars · @dana

feature/dollar-totals → main

Changes

Exact base…head comparison at 9f3c2e1a7b40 · 2 files

src/cart.ts modified · 1 finding

Use left and right arrow keys to scroll columns. Home shows the first column; End shows the last.

@@ -1,6 +1,7 @@
11 // Cart arithmetic. Prices are stored as integer cents.
22 export function total(cents: number, qty: number) {
3- return cents * qty;
3+ // Show totals in dollars.
4+ return (cents * qty) / 100;
🔴 P0 total() now returns dollar value instead of cents, breaking charge() expectations

total() now divides by 100 and returns a dollar value, but charge() in src/billing.ts still passes it to the payment provider as amount, which its own comment says is integer cents.

45 }
56
67 export function itemCount(lines: { qty: number }[]) {
test/cart.test.ts modified · 1 finding

Use left and right arrow keys to scroll columns. Home shows the first column; End shows the last.

@@ -3,3 +3,3 @@ import { total } from "../src/cart";
33 test("total multiplies price by quantity", () => {
4- assert.equal(total(1250, 2), 2500);
4+ assert.equal(total(1250, 2), 25);
🟡 P2 Updated test asserts the dollar value, so the billing regression passes CI

The expectation was changed to match the new unit. No test covers charge(), so the suite stays green while the provider receives dollars.

55 });
Interactive demo with sample data. The OpenReview dashboard for a sample workspace, open at acme/shop #42 on its Code tab: the reviewed diff with a P0 finding inline at the changed line. The Overview tab holds the "Needs changes" verdict and a confidence score of 2 out of 5. Use the tabs to open Analytics, Repositories, Code Review Settings, Custom Context, Code Providers, Integrations and Organization Settings, and the chat button for Chat.

Live demo with sample data. Click around.

Reviews pull requests on

  • GitHub
  • GitHub Enterprise
  • GitLab
  • Azure DevOps
  • Bitbucket
  • Gitea
  • Perforce
Evidence

Evidence on every finding

Each issue cites the exact lines it depends on, pinned to the commit, with a committable suggestion when the fix is small. A finding that cannot quote the reviewed revision is dropped.

Learn how reviews work →

Verified findings

🔴 P0 total() now returns dollar value instead of cents, breaking charge() expectations

src/cart.ts:4 · 95% confidence · Verified at this revision · Current status: open

total() now divides by 100 and returns a dollar value, but charge() in src/billing.ts still passes it to the payment provider as amount, which its own comment says is integer cents.

Impact: Payments would be sent in the wrong unit: a $25.00 cart is charged as 25 cents, or rejected as a non-integer amount.

src/cart.ts:4
  return (cents * qty) / 100;
src/billing.ts:4
// Payment provider amount is integer cents.
src/billing.ts:6
  return provider.charge({ amount: total(cart.priceInCents, cart.quantity), currency: "USD" });

Suggested fix: Keep total() in cents and format dollars where totals are displayed, or convert back to cents in charge() before calling the provider.

🟡 P2 Updated test asserts the dollar value, so the billing regression passes CI

test/cart.test.ts:4 · 82% confidence · Verified at this revision · Current status: open

The expectation was changed to match the new unit. No test covers charge(), so the suite stays green while the provider receives dollars.

Impact: The regression would ship without a failing check.

test/cart.test.ts:4
  assert.equal(total(1250, 2), 25);

Suggested fix: Add a charge() test that asserts the provider receives integer cents.

Interactive demo with sample data. Verified findings with the file and line each depends on, its impact, quoted evidence that can be shown in place in the file, and a suggested fix.
Summary

One summary, kept current

A single summary comment with an overview, changed files, issues, a confidence score and a sequence diagram is updated as the pull request moves. New pushes are reviewed against what changed.

See what a review posts →

Review summary

@dana pushed c41e8d0: Keep totals in cents and format them for display · not reviewed yet

9f3c2e1a7b40 · 2 findings · Score 2/5

Summary of changes

  • src/cart.ts: total(cents, qty) now returns dollars (cents * qty / 100) instead of integer cents.
  • test/cart.test.ts: the expectation was updated to the dollar value.

Affected areas

  • src/billing.ts calls total() and sends the result to the payment provider as integer cents.

Recommendation

Request changes. Keep total() in cents and convert to dollars only where totals are displayed.

Review history

  1. 2 findings · Score 2/5
  2. 1 findings · Score 3/5
Interactive demo with sample data. The review summary for a pull request, with a button that re-reviews a newly pushed fix, and a history of reviews for each pushed revision.
Chat

Ask your codebase

Chat, the API, MCP and Slack all answer questions with citations that must match the indexed source.

Learn about codebase chat →

You · Oct 14, 2026, 2:10 PM

Where is the checkout total computed, and which callers depend on it?

OpenReview · Oct 14, 2026, 2:10 PM

Totals are computed by total() in integer cents [1], and charge() passes them straight to the payment provider [2]. Any change to the unit of total() changes what the provider is charged.

  1. acme/shop:src/cart.ts:3 @ 5d1e0b7c3a9f
      return cents * qty;
  2. acme/shop:src/billing.ts:6 @ 5d1e0b7c3a9f
      return provider.charge({ amount: total(cart.priceInCents, cart.quantity), currency: "USD" });
Try
Interactive demo with sample data. Codebase chat: pick a sample question or type one, watch the investigation steps, and read an answer whose citations quote the indexed source.
Fixes

Fix with your agent

Hand findings to Codex, Claude Code or Cursor Agent on your machine, or ask @openreview for a validated fix.

Set up the agent bridge →

total() now returns dollar value instead of cents, breaking charge() expectations

🔴 P0 open

acme/shop #42 · src/cart.ts:4 · 95% confidence

Suggested fix: Keep total() in cents and format dollars where totals are displayed, or convert back to cents in charge() before calling the provider.

Portable prompt for Codex, Claude Code, or Cursor
Fix verified OpenReview finding in acme/shop PR #42 (revision 9f3c2e1a):
[critical] src/cart.ts:4 total() now returns dollar value instead of cents…
Interactive demo with sample data. A finding under Analytics → Bugs Caught with controls to send it to Codex, Claude Code or Cursor Agent, copy a fix prompt, or open an agent with the prompt pre-filled.
Analytics

See what reviews are worth

Track reviews, verified findings, addressed rate, time saved and model cost by repository, team and author, and export it as CSV.

Read the quickstart →
Total PRs
24
Total Reviews
37
Verified findings
19
Model cost
$6.72

Reviews by OpenReview

Reviews by OpenReview: Reviews
DateReviews
2026-10-012
2026-10-023
2026-10-031
2026-10-044
2026-10-052
2026-10-060
2026-10-070
2026-10-083
2026-10-095
2026-10-102
2026-10-114
2026-10-126
2026-10-133
2026-10-142

Top Repos by Review Count

  1. acme/shop22
  2. acme/api15

Bugs caught

Bugs caught: All Severity
DateBugs
2026-10-011
2026-10-022
2026-10-030
2026-10-042
2026-10-051
2026-10-060
2026-10-070
2026-10-081
2026-10-093
2026-10-101
2026-10-112
2026-10-124
2026-10-131
2026-10-141

Repos with most bugs

  1. acme/shop14
  2. acme/api5

Addressed

Findings fixed or resolved after a review
Average
Addressed: Addressed
DateAddressed
2026-10-010
2026-10-021
2026-10-030
2026-10-041
2026-10-051
2026-10-060
2026-10-070
2026-10-081
2026-10-092
2026-10-101
2026-10-111
2026-10-122
2026-10-131
2026-10-141

Top repos by addressed findings

  1. acme/shop9
  2. acme/api3

Findings by severity

critical2
high5
medium8
low4
Interactive demo with sample data. The analytics page with repository and period filters: pull requests, reviews, verified findings and model cost, daily review activity, findings by severity and a trend of reviews and findings per day.

Built for reviews you can trust

Incremental re-reviews

New pushes are reviewed against what changed, and threads for fixed findings resolve themselves.

Configuration as code

Rules and settings live in .openreview.json, read from the base branch so a PR cannot weaken its own review.

Many providers

GitHub, GitHub Enterprise, GitLab, Azure DevOps, Bitbucket Cloud and Data Center, Gitea and Perforce.

Your model, your budget

Bring Anthropic, OpenAI or a compatible endpoint. A hard inference budget and per-task usage accounting keep spend predictable.

How it works

  1. 01

    Index the repository

    OpenReview parses your default branch into files, symbols and a cross-file call and import graph, with optional semantic embeddings.

  2. 02

    Investigate each change

    The diff is read alongside its callers, tests, past findings, your rules and any linked requirements, by specialists or a tool-using agent.

  3. 03

    Verify before posting

    A finding needs exact quotes from the reviewed revision and survives an independent check. Unsupported claims are dropped.

  4. 04

    Learn from your team

    Reactions, feedback and recurring human review comments become memory that your admins can inspect and control.

Run it on your infrastructure

Your Next.js host, your Convex backend and your model provider. Code goes only to the model you configure, and secret-looking values are redacted first.

Read the self-hosting guide →Star it on GitHub →
Terminal
$ pnpm install
$ CONVEX_AGENT_MODE=anonymous pnpm exec convex dev --once
$ pnpm setup:local
$ pnpm backend
$ pnpm dev

Self-hosted or cloud

Use left and right arrow keys to scroll columns. Home shows the first column; End shows the last.

AspectSelf-hostedCloud
Where it runsYour Next.js host and Convex backendA hosted OpenReview deployment
Model and keysYours, with your own budgetProvided by the operator
Review limitsNonePlan quota per seat
SetupSelf-hosting guideSign in and install the app

Pricing

Starter

$12 per seat / month

$6.00 of model usage per seat each month, pooled across the workspace, then optional pay-as-you-go extra usage up to a cap you set. 5 OpenReview agent fixes per seat each month, each opened as a pull request, and your own model key. Owners, admins and members are seats; viewers are free.

Choose Starter

Pro

$24 per seat / month

$12.00 of model usage and 20 OpenReview agent fixes per seat each month, plus deep reviews with the agentic engines, generated reproduction tests, requirements checks, SSO, the audit log and API keys. 14 days free.

Start Pro trial

Self-hosting is free and unlimited: self-hosting guide.

Questions

Does OpenReview run our code?

No. Reviews read source and never execute it. Test results appear only when a paired runtime worker records them for that commit.

Where does our code go?

Self-hosted, it stays in your Convex deployment and goes only to the model provider you configure. Secret-looking values are redacted before model calls.

Can a pull request turn its own review off?

No. Repository configuration is read from the base branch, and admins can lock settings.

Will it flood our PRs with comments?

Findings must pass confidence, severity and evidence thresholds. You choose the maximum comment count, strictness and categories, and learned preferences reduce repeat noise.

Which models are supported?

Claude and OpenAI models, or any OpenAI-compatible endpoint, with per-task model routing.

Try OpenReview now.