You · Oct 14, 2026, 2:10 PM
Where is the checkout total computed, and which callers depend on it?
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.
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
Needs changes · computed from the score, unresolved findings and review coverage
2/5 · confidence that the change is safe to merge
The change silently alters a unit that billing depends on; payments would be sent in the wrong unit.
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.
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.
Exact base…head comparison at 9f3c2e1a7b40 · 2 files
src/cart.ts modified · 1 findingUse left and right arrow keys to scroll columns. Home shows the first column; End shows the last.
@@ -1,6 +1,7 @@ | ||
| 1 | 1 | // Cart arithmetic. Prices are stored as integer cents. |
| 2 | 2 | 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. | ||
| 4 | 5 | } |
| 5 | 6 | |
| 6 | 7 | export function itemCount(lines: { qty: number }[]) { |
test/cart.test.ts modified · 1 findingUse 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"; | ||
| 3 | 3 | 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. | ||
| 5 | 5 | }); |
Live demo with sample data. Click around.
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 →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.
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.
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 →@dana pushed c41e8d0: Keep totals in cents and format them for display · not reviewed yet
9f3c2e1a7b40 · 2 findings · Score 2/5
total(cents, qty) now returns dollars (cents * qty / 100) instead of integer cents.src/billing.ts calls total() and sends the result to the payment provider as integer cents.Request changes. Keep total() in cents and convert to dollars only where totals are displayed.
Chat, the API, MCP and Slack all answer questions with citations that must match the indexed source.
Learn about codebase chat →Hand findings to Codex, Claude Code or Cursor Agent on your machine, or ask @openreview for a validated fix.
Set up the agent bridge →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.
Opens your agent with the prompt pre-filled; nothing runs until you send it.
Fix verified OpenReview finding in acme/shop PR #42 (revision 9f3c2e1a): [critical] src/cart.ts:4 total() now returns dollar value instead of cents…
Track reviews, verified findings, addressed rate, time saved and model cost by repository, team and author, and export it as CSV.
Read the quickstart →| Date | Reviews |
|---|---|
| 2026-10-01 | 2 |
| 2026-10-02 | 3 |
| 2026-10-03 | 1 |
| 2026-10-04 | 4 |
| 2026-10-05 | 2 |
| 2026-10-06 | 0 |
| 2026-10-07 | 0 |
| 2026-10-08 | 3 |
| 2026-10-09 | 5 |
| 2026-10-10 | 2 |
| 2026-10-11 | 4 |
| 2026-10-12 | 6 |
| 2026-10-13 | 3 |
| 2026-10-14 | 2 |
| Date | Bugs |
|---|---|
| 2026-10-01 | 1 |
| 2026-10-02 | 2 |
| 2026-10-03 | 0 |
| 2026-10-04 | 2 |
| 2026-10-05 | 1 |
| 2026-10-06 | 0 |
| 2026-10-07 | 0 |
| 2026-10-08 | 1 |
| 2026-10-09 | 3 |
| 2026-10-10 | 1 |
| 2026-10-11 | 2 |
| 2026-10-12 | 4 |
| 2026-10-13 | 1 |
| 2026-10-14 | 1 |
| Date | Addressed |
|---|---|
| 2026-10-01 | 0 |
| 2026-10-02 | 1 |
| 2026-10-03 | 0 |
| 2026-10-04 | 1 |
| 2026-10-05 | 1 |
| 2026-10-06 | 0 |
| 2026-10-07 | 0 |
| 2026-10-08 | 1 |
| 2026-10-09 | 2 |
| 2026-10-10 | 1 |
| 2026-10-11 | 1 |
| 2026-10-12 | 2 |
| 2026-10-13 | 1 |
| 2026-10-14 | 1 |
New pushes are reviewed against what changed, and threads for fixed findings resolve themselves.
Rules and settings live in .openreview.json, read from the base branch so a PR cannot weaken its own review.
GitHub, GitHub Enterprise, GitLab, Azure DevOps, Bitbucket Cloud and Data Center, Gitea and Perforce.
Bring Anthropic, OpenAI or a compatible endpoint. A hard inference budget and per-task usage accounting keep spend predictable.
OpenReview parses your default branch into files, symbols and a cross-file call and import graph, with optional semantic embeddings.
The diff is read alongside its callers, tests, past findings, your rules and any linked requirements, by specialists or a tool-using agent.
A finding needs exact quotes from the reviewed revision and survives an independent check. Unsupported claims are dropped.
Reactions, feedback and recurring human review comments become memory that your admins can inspect and control.
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 →$ pnpm install$ CONVEX_AGENT_MODE=anonymous pnpm exec convex dev --once$ pnpm setup:local$ pnpm backend$ pnpm dev
Use left and right arrow keys to scroll columns. Home shows the first column; End shows the last.
| Aspect | Self-hosted | Cloud |
|---|---|---|
| Where it runs | Your Next.js host and Convex backend | A hosted OpenReview deployment |
| Model and keys | Yours, with your own budget | Provided by the operator |
| Review limits | None | Plan quota per seat |
| Setup | Self-hosting guide | Sign in and install the app |
$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.
$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.
Self-hosting is free and unlimited: self-hosting guide.
No. Reviews read source and never execute it. Test results appear only when a paired runtime worker records them for that commit.
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.
No. Repository configuration is read from the base branch, and admins can lock settings.
Findings must pass confidence, severity and evidence thresholds. You choose the maximum comment count, strictness and categories, and learned preferences reduce repeat noise.
Claude and OpenAI models, or any OpenAI-compatible endpoint, with per-task model routing.