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.
4 clicks to connectcontents read-onlyno repository copies, ever
Allocate stock under an order lock #482
feat/order-lock→main· 3 files · +7 −3
export function priceLine(l: CartLine) { const net = l.unitPence * l.qty; const vat = roundHalfUp(net * VAT_RATE); const vat = Math.trunc(net * VAT_RATE);VAT truncated, not rounded
Math.trunc drops part-pence, so 399.8p is billed as 399p.
return { net, vat, gross: net + vat };}// Called by checkout and the retry worker,// so two runs can overlap for one order. export async function allocate(id: string) { await locks.acquire(`order:${id}`); locks.acquire(`order:${id}`);Lock taken without await
Two runs can reserve the same stock before the lock is held.
try { for (const l of await lines(id)) { await reserve(l); } } finally { await locks.release(`order:${id}`); }}export function overdue(tenantId: string) { return db.invoice.findMany({ where: { tenantId, status: "open" },Tenant filter removed
Returns open invoices for every tenant; tenantId is unused.
where: { status: "open", dueAt: { lt: now() }, }, orderBy: { dueAt: "asc" }, });}Posted to GitHub·3 findings·Standard·£0.35
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.
01 · The product
One reviewer for the whole path to merge.
Depth you choose, a price you see first, findings that survive a second look, and the context around the PR: the issue it closes, the dependencies it adds, the people who should look.
Review
What it reads, and how hard.
- Reviews & depthChoose how hard every PR is read: Glance, Standard or Deep.
- Attention map & reviewersThe hunks that need human eyes, and who should look.
- Domain packsMoney, migrations, tenancy, PII and architecture checks.
- Intent checkIn testingDoes the PR do what its issue asked? Evidence per criterion.
- Supply chainIn testingNew dependencies, advisories, licences and typosquats.
Control & trust
What it costs, and what it remembers.
- Price GuardThe price on the PR before anything is spent.
- Review LedgerOne record per PR: every finding keeps its ID across pushes.
- Team memory & precisionIn testingIt learns what your team dismisses, and shows its hit rate.
Workflow
Where it meets the rest of your day.
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 · ← →
per medium PRp50 01:35
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.
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) {2const order = await orders.get(req.id);3if (req.sig === sign(req.raw)) {4for (const l of order.lines) {5const it = await db.item(l.itemId);6await pay.refund(it.charge, l.pence);7}8return { amount: order.pence };9return { total: order.pence };10}11}
Refund repeats on webhook retry
Unknown order crashes the handler
Agents at Standard
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.
Permissions requested
No write access to code- Pull requestsread & write
- Checksread & write
- Issuesread & write
- Contentsread-only
- Metadataread-only
03 · How it works
Four clicks to set up. Nothing to do after that.
- 01Connect
4 clicks
Continue with GitHub, authorize Forseti, pick the account, install. Done some of it before? GitHub skips those steps.
Install Forsetigithub.comContinue with GitHubclick 1Authorize Forseticlick 2Yyour-orgOrganisationclick 3YyouPersonal accountPermissions requested
No write access to code- Pull requestsread & write
- Checksread & write
- Issuesread & write
- Contentsread-only
- Metadataread-only
Installclick 4 - 02Choose
repos · branches · depth
Pick repos and branches, and a depth per branch or path. Defaults: the default branch, Standard, drafts skipped.
Repositories3 of 4 enabledFilter repositories…- your-org/apimainrelease/*
- your-org/webmain
- your-org/workermain
- your-org/docs
Depth on mainGlanceStandardDeepMolecularest. £0.79 per medium PR · cap £40/mo · on cap: Glance
- 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/apiconversationforsetibotreviewed 2 min after pushStandard£0.35src/orders/allocate.ts · line 31− await locks.acquire(`order:${id}`);+ locks.acquire(`order:${id}`);BlockingLock taken without awaitTwo 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 suggestionReplyForseti1 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.
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.
at the cap → drops to Glance and says so on the PR
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.
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
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, read from the base branchdepth:default: standardmain: deepprofile: balancedpaths:instructions:- path: "src/billing/**"text: "Amounts are integer pence."packs: [money, migrations]
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.
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
Compare
Side-by-side pages built from each vendor’s public pages, every fact sourced and dated.
Both sides heard. Every merge settled.
Connect GitHub in four clicks. Your first review starts by itself on your latest small open PR.