Skip to content
Price GuardPriced on the PR before it runs

Every pull request,judged before it merges.

Forseti reviews every PR at the depth you choose, posts only verified findings, and quotes the price before it spends a penny.

Connect GitHub

4 clicks to connectcontents read-onlyno repository copies, ever

Allocate stock under an order lock #482

feat/order-lock→main

QueuedReviewingReview posted
vat.ts+1 −1allocate.ts+1 −1overdue.ts+5 −1
src/billing/vat.ts+1 −1
12export function priceLine(l: CartLine) {
13 const net = l.unitPence * l.qty;
14removed: const vat = roundHalfUp(net * VAT_RATE);
14added: const vat = Math.trunc(net * VAT_RATE);
Should fixmoney · roundingverifyingVerified

VAT truncated, not rounded

Math.trunc drops part-pence, so 399.8p is billed as 399p.

Commit suggestion1-line fix
15 return { net, vat, gross: net + vat };
16}
src/orders/allocate.ts+1 −1
27// Called by checkout and the retry worker,
28// so two runs can overlap for one order.
29 
30export async function allocate(id: string) {
31removed: await locks.acquire(`order:${id}`);
31added: locks.acquire(`order:${id}`);
BlockingconcurrencyverifyingVerified

Lock taken without await

Two runs can reserve the same stock before the lock is held.

Commit suggestion1-line fix
32 try {
33 for (const l of await lines(id)) {
34 await reserve(l);
35 }
36 } finally {
37 await locks.release(`order:${id}`);
38 }
39}
src/invoices/overdue.ts+5 −1
8export function overdue(tenantId: string) {
9 return db.invoice.findMany({
10removed: where: { tenantId, status: "open" },
Blockingsecurity · tenancyverifyingVerified

Tenant filter removed

Returns open invoices for every tenant; tenantId is unused.

Commit suggestion1-line fix
10added: where: {
11added: status: "open",
12added: dueAt: { lt: now() },
13added: },
14added: orderBy: { dueAt: "asc" },
15 });
16}

Posted to GitHub·3 findings·Standard·£0.35

Not ready · 2 blocking
ExampleA sample pull request reviewed at Standard depth. Figures are illustrative.

Priced before it runs

The estimate is on the PR first. Caps fall back to Glance and say so; nothing is skipped in silence.

Verified before it posts

A second pass re-reads each finding against the code. Only what survives reaches your PR.

Rules from the base branch

Config and team rules are read from the branch you merge into, so a PR can't rewrite its own review.

Never cloned, never trained on

Diffs are read with a read-only token and held in memory. Findings keep only the few lines they quote, and you can switch that off.

02 · Depth & price

Turn the dial. Watch the review and the price change together.

Depth decides which agents look at your code. Every review is quoted on the PR before anything is spent, and a cap never stops a review: it drops to Glance and says so.

Depth dial

drag · click · ← →

£0.79

per medium PRp50 01:35

Live

Standard: £0.79 per medium PR, about 1.6 minutes

What runs

A fast triage pass, a deep reasoning pass, then a second, independent check of each finding. Low-risk files get the fast pass.

100
Estimated, at Standard£79.00/mo

Medium PRs (about 1,000 changed lines). Smaller PRs cost less, and re-reviews charge only for new changes. Figures come from our cost model and are confirmed by measured runs before launch.

Sample PR · refund webhook

2 verified

1export async function refund(req: Req) {
2 const order = await orders.get(req.id);
3 if (req.sig === sign(req.raw)) {
4 for (const l of order.lines) {
5 const it = await db.item(l.itemId);
6 await pay.refund(it.charge, l.pence);
7 }
8 return { amount: order.pence };
9 return { total: order.pence };
10 }
11}
BlockingL6 · finder

Refund repeats on webhook retry

Should fixL4 · finder

Unknown order crashes the handler

2 comments posted·Standardverdict 1 blocking

Agents at Standard

runs deeper tiers
Deep · specialists+ static · nextPull requestdiff + contextTriagefast passFinderdeep reasoningVerifiersecond checkAdjudicatorfinal rulingProofsandbox · testsGitHubreview postedSecurityPerfTestsContracts

Free

£0

Glance on public repos, plus trial credit to try Standard and Deep on your own PRs.

Team

£8per active PR author / month

800 credits included per author, then pay as you go. Caps fall back to Glance instead of stopping.

Business

£20per active PR author / month

Everything in Team, plus a priority queue, SSO and Change Sets as they arrive.

Enterprise

Annual

An annual agreement with invoicing and a DPA. Bring your own key and EU processing are on the roadmap.

Plans in full. Recommended pricing. 1 credit = £0.01. Final numbers are set after measured runs on a golden set of real PRs.

03 · How it works

Four clicks to set up. Nothing to do after that.

Install Forseti
github.com
Continue with GitHubclick 1
Authorize Forseticlick 2
Yyour-orgOrganisationclick 3
YyouPersonal account

Permissions requested

No write access to code
  • Pull requestsread & write
  • Checksread & write
  • Issuesread & write
  • Contentsread-only
  • Metadataread-only
Installclick 4

03 · How it works

Four clicks to set up. Nothing to do after that.

  1. 01Connect

    4 clicks

    Continue with GitHub, authorize Forseti, pick the account, install. Done some of it before? GitHub skips those steps.

    Install Forseti
    github.com
    Continue with GitHubclick 1
    Authorize Forseticlick 2
    Yyour-orgOrganisationclick 3
    YyouPersonal account

    Permissions requested

    No write access to code
    • Pull requestsread & write
    • Checksread & write
    • Issuesread & write
    • Contentsread-only
    • Metadataread-only
    Installclick 4
  2. 02Choose

    repos · branches · depth

    Pick repos and branches, and a depth per branch or path. Defaults: the default branch, Standard, drafts skipped.

    Repositories
    3 of 4 enabled
    Filter repositories…
    • your-org/apimainrelease/*
    • your-org/webmain
    • your-org/workermain
    • your-org/docs
    Depth on mainGlanceStandardDeepMolecular

    est. £0.79 per medium PR · cap £40/mo · on cap: Glance

  3. 03Reviews land in GitHub

    0 clicks a day

    One review per push: a few strong comments, one-click suggestions, and a check that reads clear @ sha.

    PR #482 ·your-org/api
    conversation
    forsetibotreviewed 2 min after pushStandard£0.35
    src/orders/allocate.ts · line 31
    − await locks.acquire(`order:${id}`);
    + locks.acquire(`order:${id}`);
    BlockingLock taken without await

    Two runs can reserve the same stock before the lock is held. Verified against the retry worker's call path.

    Suggested change
    − locks.acquire(`order:${id}`);
    + await locks.acquire(`order:${id}`);
    Commit suggestionReply
    Forseti1 blocking opennot clear @ 4e1a9c2

04 · Why teams trust it

Trust it with your merge button and your budget.

Read-only access, rules from the base branch, no repository copies. The permissions, the data flow and the threat model are all published.

01Price Guard

The price is on the PR before anything is spent.

Caps per PR, developer and month fall back to a cheaper review instead of stopping, and say so on the PR. Re-reviews charge only for new changes. No auto-refill.

forseti · Standardquote £0.35 · before run
£25.60 this monthcap £40

at the cap → drops to Glance and says so on the PR

02Review Ledger

One living record per pull request.

Every finding keeps an ID and a state across pushes: open, fixed, disputed or accepted. The same commit and policy give the same verdict, and the check reads clear @ sha.

F-1Lock taken without awaitopenfixed
F-2Tenant filter removedopenfixed
F-3VAT truncated, not roundedopenaccepted
Forseti: clear @ 9f3c2a1
03Molecular proof

Serious findings arrive with proof.

At Molecular depth an agent runs the related tests in a sandbox and attaches a failing test or run log to each serious finding. In early access.

$ forseti prove F-1 # sandbox, read-only token

running refund.retry.spec.ts …

✕ refunds once on retry: expected 1 call, got 2

✓ failing test attached to F-1

04Safe by construction

A pull request can’t rewrite its own review.

Rules are read from the base branch only. Analysis runs with a read-only token and jailed tools. Your repository is never cloned, kept or trained on.

  • contents: read-only token
  • rules: read from the base branch
  • tools: jailed, no network
  • repo: never cloned or trained on

05 · For developers

Configure it like code. Drive it from the PR.

No config is needed to start. When you want control, a .forseti.yaml on the base branch sets depth by branch and path, and a comment on any pull request changes what happens next.

.forseti.yaml
# .forseti.yaml, read from the base branch
depth:
default: standard
main: deep
profile: balanced
paths:
instructions:
- path: "src/billing/**"
text: "Amounts are integer pence."
packs: [money, migrations]
PR #518 · conversationExample
PS

priya commented

@forseti review deep

check run · Forseti / review · in progress

Deep · 640 lines · estimate £3.18 · about 02:19

The command is acknowledged with a reaction on the comment.

@forseti review glance@forseti confirm@forseti pause@forseti resume@forseti config@forseti explain@forseti ask@forseti split

06 · Switch in minutes

Bring the rules you already wrote.

Paste or scan the config your current reviewer reads. Forseti previews how each rule maps to its own policies and team rules before anything is applied, and exports everything back as plain files whenever you like.

  • .coderabbit.yaml
  • .greptile/
  • BUGBOT.md
  • .github/copilot-instructions.md
  • .cursor/rules
  • .gemini/
  • AGENTS.md · CLAUDE.md
GitHubLive
GitLabReady, connect your account
BitbucketReady, connect your account
Azure DevOpsReady, connect your account

Compare

Side-by-side pages built from each vendor’s public pages, every fact sourced and dated.

Forseti vsCodeRabbitForseti vsGreptileForseti vsGitHub Copilot code reviewForseti vsCursor BugbotThe full comparison matrix

Both sides heard. Every merge settled.

Connect GitHub in four clicks. Your first review starts by itself on your latest small open PR.