bravos
Shift-left security that runs with every commit.
Bravos makes the coding agent you already use work your threat model, code graph, SAST and authorized pentests, then gates every pull request and keeps a test that guards each fix.
npm install -g @bugb-technologies/bravosOpen your project in your coding agent (Claude Code, Codex, Cursor…), then paste this.
+1 exposure declared on the new route: #orders-api → #idorEvery risk mapped, with 5 still open
02 · Threat modelThreat modelling
Every risk, mapped where it lives.
Written next to the code, drawn four ways.
03 · Code graphTeam plan
Your codebase as a map. Every route to what it touches.
04 · SASTTeam plan
Findings, sorted by what can reach them.
Deterministic analysis, placed on the code graph. Nothing is sent anywhere.
- 61all findings
- 23on a path from an entry point
- 9corroborated or plausible
- 2fail the gate
- User-controlled URL reaches http.get
src/uploads/import.ts:31viaPOST /uploads/importfail@exposes #uploads to #ssrf - No ownership check before db.orders.findAll
src/api/orders.ts:42viaGET /orders/exportfail@exposes #orders-api to #idor - Unescaped HTML rendered in admin notes
src/admin/notes.tsx:66viaPOST /admin/noteswarn@exposes #admin to #stored-xss - Model output passed to a tool unchecked
src/agent/tools.ts:19viatool: send_emailwarn@exposes #support-agent to #prompt-injection - Signature compared with ==
src/webhooks/payments.ts:14viaPOST /webhooks/paywarn - Path built from the upload filename
src/uploads/store.ts:27viaPOST /uploads@mitigates … using #path-normalise - Secret read from env written to a log
src/admin/settings.ts:18no entry reaches itwarn@exposes #admin to #secret-leak - Dependency with a published advisory
package-lock.jsonno entry reaches it - Hard-coded key in a test fixture
tests/fixtures/pay.ts:3no entry reaches it - Regex with a nested quantifier
src/lib/slug.ts:9no entry reaches itreview: noise
showing 10 of 61 · sample
05 · ProvenAuthorized testing
Then it tests a running copy, and keeps the proof.
Against a target you own, with real logins, inside the scope you committed.
12 tracked · 0 reached a verdict
- Login 1unauthenticatedqueued0/14 probes3 refuted
- Login 2customerqueued0/19 probes2 confirmed1 ambiguous4 refuted
- Login 3adminqueued0/14 probes1 refuted1 not run
@confirmed lines, recorded in the project's evidence ledger“Not run” and “ambiguous” are listed, not hidden. They prove nothing either way, so they stay untested.
06 · Gate and retest
Each proof becomes a test that guards the fix.
A retest kit in your repository, and a gate on every pull request.
src/api/orders.ts41 const orders = await db.orders.findAll({42+ where: { customerId: session.user.id },43 })
Bravos #orders-api → #idor — confirmed, on a changed path
- ✓Passed: Threat model parses and resolvesModel validated
- ✓Passed: No undisclosed new exposurenothing new
- ✗Failed: No confirmed exploit on a changed path2 on changed files
/bravos-recheck| severity | asset → threat | verdict | location | outcome |
|---|---|---|---|---|
| 2 confirmed · 0 refuted of 12 tracked | ||||
| high | #orders-api → #idor | confirmed · kit | src/api/orders.ts:42 | still exploitable |
| high | #uploads → #ssrf | confirmed · kit | src/uploads/import.ts:31 | still exploitable |
▸ bravos security gate ✓ Threat model parses and resolves ✓ New claims meet the evidence bar ✓ No undisclosed new exposure ✗ No confirmed exploit on a changed path Confirmed-exploitable claims on changed files, with no @ticket for them in that file: high #idor on #orders-api — src/api/orders.ts:42 high #ssrf on #uploads — src/uploads/import.ts:31
/bravos-ship makes the same rulings before gh pr createbravos watch: open, confirmed, tested and stale, liveHow it fits
What Bravos provides, and what you bring.
Constant · provided by Bravos
Shared context
The state every skill reads and writes back. It lives in your repository, shared through git.
- Threat model
- Hypothesis ledger
- Retest kits
- Code graph
skills /bravos-…contextannotatecodegraphsastreport
- Constant, provided by Bravos
- Changes over time, you bring it
- 01AnnotateThe threat model, written into your code.
/bravos-annotate - 02TemplatizeEach open exposure becomes a testable security check.
/bravos-templatize - 03ProveProbes run against a target you own, with real logins.
/bravos-prove - 04LedgerEach result goes into the project's evidence ledger; kits replay after a fix.
/bravos-recheck - 05GateA confirmed exploit on a changed path fails the pull request.
bravos sync --ci
bravos
Secure your next pull request.
npm install -g @bugb-technologies/bravosInstall as a plugin in your coding agent
See the plugin guide for supported coding agents, installation instructions and differences from CLI setup. Every plugin needs the CLI above.
Only want the pull-request gate? uses: Bugb-Technologies/bravos-action@v1 needs no licence. GitHub Marketplace