Tenant taken from the request body
Any caller can refund another tenant’s order by sending its tenantId. Read it from req.auth.
src/refunds/create.ts:15
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 connect/contents read-only/no repository copies, ever
Choose a depth on the dial. Price Guard quotes the review and checks it against your caps before anything is spent. Then only the findings that survive a second, independent check are posted, each with an ID it keeps across pushes.
Price GuardThe price is on the PR before anything is spentAdd partial refunds #517
feat/partial-refunds→main
Review depth
per medium PRp50 about 1.6 minutes
Triage, a deep reasoning pass, then every finding verified.
Price Guard
Choose a depth to rerun the review. Arrow keys work too.
src/refunds/create.ts+3−3
export async function createRefund(req: Req) { const { orderId } = req.body; const tenantId = req.auth.tenantId; const { orderId, pence, tenantId } = req.body;F-0141 const order = await db.order.findFirst({ where: { id: orderId, tenantId }, }); if (!order) throw notFound("order"); if (pence > order.totalPence) throw tooMuch();F-0142 return psp.refund({ charge: order.chargeId, idempotencyKey: req.id, amount: pence,F-0143 });}migrations/0042_refund_status.sql+3−0
ALTER TABLE refunds ADD COLUMN status text;UPDATE refunds SET status = 'settled'F-0144 WHERE settled_at IS NOT NULL;src/webhooks/psp.ts+1−1
export function verify(req: Req) { const sig = req.header("psp-signature"); const expected = sign(req.rawBody); if (!safeEqual(sig, expected)) throw denied(); if (sig !== expected) throw denied(); return JSON.parse(req.rawBody);}Any caller can refund another tenant’s order by sending its tenantId. Read it from req.auth.
src/refunds/create.ts:15
Two partial refunds can add up to more than the customer paid.
src/refunds/create.ts:20
A client retry after a timeout now refunds the same request twice.
src/refunds/create.ts:23
One unbatched UPDATE holds locks on refunds while it runs. Batch it, and add a way back.
migrations/0042_refund_status.sql:2
Claims, not metrics. Each one is how the product behaves on every pull request it reads.
The estimate is on the PR first. Caps fall back to Glance and say so; nothing is skipped in silence.
A second pass re-reads each finding against the code. Only what survives reaches your PR.
Config and team rules are read from the branch you merge into, so a PR can’t rewrite its own review.
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.
Depth sets how much reading a review does, and so what it costs and how long it takes. Set it per repo, branch and path, or ask for one on the PR with @forseti review deep.
£0.04· p50 00:38
A fast summary of the change with a self-check. No line comments.
Use it forDocs, config, low-risk repos
£0.43· p50 01:35
A fast triage pass, a deep reasoning pass, then a second, independent check of each finding. Low-risk files get the fast pass.
Use it forMost pull requests (the default)
£0.58· p50 02:30
Standard, plus specialist passes for security, reliability and performance, and tests and contracts, each verified.
Use it forPayments, auth, migrations, release branches
£10.23· p50 09:00
Deep, plus adjudication of blocking or uncertain findings, and an agent in a sandbox that attaches a failing test or run log to each serious finding.
Use it forTeams in the early-access queue
About MolecularPrices and p50 times are Forseti’s estimate for a medium PR of about 1,000 changed lines, excluding VAT. Every PR is quoted on its own size; small PRs cost less.
Indicative · tested 20 October 2026
Forseti tests every depth on pull requests with bugs planted on purpose, and publishes the results, including what each depth misses.
Deep caught every serious planted bug on both sets.
14 test pull requests with 29 planted bugs, 24 of them serious. Ranges show run-to-run variation. The samples are small, so treat these figures as indicative.
How Forseti tests| Depth | Small PRs44–128 changed lines | Large PRs1,065–3,391 changed lines |
|---|---|---|
| Glance | 58%8–10 of 15 | 45%6–7 of 14 |
| Standard | 87%13 of 15 | 82%11–12 of 14 |
| Deep | 87%13 of 15 | 93%13 of 14 |
The review is the start. Everything around it is built to answer one question quickly: can this merge?
Review Ledger
Every finding keeps an ID and a state across pushes: open, fixed, disputed or accepted. A finding is never raised twice, and the check says exactly which commit it judged.
Merge readiness
Conflicts, CI, approvals, approvals gone stale after a push, how long a PR has waited, and Forseti’s verdict next to CI. Daily or weekly digests go to Slack or Teams.
Attention map & reviewers
Up to three hunks where risk, uncertainty and new code meet, each with a reason, and two people to read them from CODEOWNERS and recent authors.
Ask Forseti & release notes
Answers cite file and line, in the dashboard or with @forseti ask on GitHub. Merged PRs become notes grouped by Features, Fixes and Breaking.
Domain packs
VAT applied twice, a migration that locks a hot table, a query that forgets the tenant. Packs pair deterministic checks with a focused pass, and each ships with seeded test cases.
moneyInteger pence, VAT once per band, rounding rules.migrationsLock safety, batching, CONCURRENTLY, and a way back.tenancy-authTenant scoping, IDOR, and auth where routes are mounted.piiPersonal data in logs and responses, retention, GDPR deletion.architectureYour layering rules, from .forseti/architecture.yml.Integrations
GitHub today; Jira, Linear, Slack and Teams connect now; GitLab, Bitbucket and Azure next.
Live today
Connect now
Next
Built, and still being verified end to end. Not live yet.
Drive it from the pull request
reviewaskexplainconfirmpauseresumesplitrelease-notesconfighelpBuy prepaid credit when you need it. Every pull request is priced by its size and the depth you choose, and the price is on the PR before anything is spent.
2,000 credits
£20+ VAT
Enough to see Forseti on a handful of real pull requests.
10,000 credits
£100+ VAT
For a team reviewing every pull request, every week.
50,000 credits
£500+ VAT
For busy organisations with many repositories.
Per medium PR: Glance £0.04, Standard £0.43, Deep £0.58. Prices exclude VAT, which is added at checkout.
See pricingConnect GitHub in four clicks. Contents stay read-only, and no repository is ever copied.
Built by UnknwnAI in the UK.