Find what this change actually broke.
Compare base and head in equivalent environments. Separate a new violation from a pre-existing defect, a resolved issue, an unchanged outcome or an incomparable run.
Explore the mechanismBusiness-rule verification for pull requests
Bracel checks on every pull request, before merge, that the rules guarding your money, permissions and access still hold, by executing them. If it can’t establish the result, it doesn’t pass the change.
Business-rule checks for pull requests
Check what matters. Before you merge.
Turn your team’s approved business rules into executable checks. Bracel runs supported scenarios in your CI and reports what happened on the pull request.
Chapter 01 · The run
PR #482 changes how refunds are validated. In your own runner, Bracel starts the application and executes every approved rule that applies.
Chapter 01 · The run
Both authentication checks are refused, as expected. The refund rule fails: a refund beyond the remaining captured amount was accepted.
What changed ↓The gap
Code ships faster than ever, and it is reviewed faster too. But a review is an opinion: it reads the change, it does not run it. So a rule that guards money or access can break quietly, pass review, and reach your customers.
A review is an opinion. Bracel runs the rule.
Chapter 02 · The change
The new guard compares each refund to the captured amount, not to what is left of it. It reads well, the tests that existed still pass, and the review approves it.
A review reads the change. Bracel runs the rule.
export async function refund(paymentId: string, amount: number) { const payment = await payments.get(paymentId); if (payment.refunded + amount > payment.captured) { if (amount > payment.captured) { throw new RefundExceedsCapture(paymentId); } return payments.addRefund(paymentId, amount); } Review · approved
Nice simplification, much easier to read. Ship it.
Illustrative story · not customer data
Chapter 03 · The rule
01 / 05Payments
A rule your team approved, read from your base commit. Pay 100.00, refund 50.00, then try 50.01 more: the over-refund is refused and the total does not move.
Available · refund.amount-cap@1
02 / 05Access control
Each protected route gets a request without credentials. Every one must be refused. One open door is a FAIL.
Available · http.auth-required@1
Chapter 04 · The evidence
Tests check what someone thought to test. Bracel executes the rule your team approved, next to the checks you already have, with the evidence one click away.
Refund flow cleanup #482
Some checks were not successful3 successful · 1 failing
This branch has no conflicts with the base branch
Bracel is not a required check here. The FAIL is advisory; merging stays possible.
Merge pull requestMerging is blocked
Your administrators made Bracel Verify a required check, so a failing result blocks merging.
Merge pull requestBranch protection, set by your administrators
Bracel changes no merge settings. If your administrators make the check required, a failing result blocks merging.
Run it yourself. Point a rule at a route, choose how the app answers, read the verdict.Runs next to your build and tests, as one more check on the pull request.
States the rule, what was expected, what was observed and why the verdict follows.
Shows the release and code digest it ran with, and that it ran in your own CI.
Recorded on GitHub
Inspect a real refund violation, a valid refactor and an unsupported-profile result from our internal acceptance rehearsal. Each names what ran and the commit it tested.
03 / 05Tenant isolation
Acting as tenant A, the check reaches for a record that belongs to tenant B. The wall has to hold.
Business-rule scenario
Every check ends in one of four verdicts: PASS, FAIL, UNKNOWN or NOT_APPLICABLE. Only PASS means the rule held.
Chapter 05 · The fix
Bracel Fix reads the failure, writes one patch, and lets Verify run it in a clean environment with values it never saw. You get a draft pull request, never a merge.
Session
Why it failed
The refund adds the amount to the refunded total without looking at the capture. The update now applies only while the new total stays within the capture, in one atomic statement, so concurrent refunds cannot both pass.
src/payments/refunds.ts
export async function refund(id: string, amount: number) { const updated = await db.affected( 'UPDATE payments SET refunded = refunded + $2' + ' WHERE id = $1 AND refunded + $2 <= captured', [id, amount]); if (updated === 0) throw new RefundExceedsCapture(id); return payments.get(id);}Verify · clean environment · rules from the base commit · hold-out values
PASS · the listed behaviours were executed and held
Fix: refunds never exceed the captured amount
Proposed by AI. AI can be wrong. Review it like any other change.
04 / 05Subscriptions and billing
Upgrade in the middle of a cycle, then read the invoice. The amount has to match the pricing rules, to the cent.
Business-rule scenario
Chapter 06 · Where it ran
In customer-CI mode, Bracel runs entirely inside your own GitHub Actions, from a pinned, checksummed release that you install into a private repository you own. No part of the check runs on Bracel’s servers.
Telemetry none · data sent to Bracel none · token read-only · secrets none · network during build and run none Every claim and its scope →
05 / 05Webhooks and events
Deliver an event, then deliver it again. One effect, one record, however many times it arrives.
Business-rule scenario
Business-rule verification
Seven verification areas. One evidence contract. A controlled path from finding a violation to reviewing a repair.
Only valid transitions may change a record.
Competing requests must preserve the same invariant.
Repeating a request must not repeat its business effect.
Access must respect ownership, roles and revoked permissions.
A failed operation must not leave an invalid partial result.
The change under test must not redefine its own judge.
A finding must include enough context to reproduce it.
Five language tracks · two database tracks
Node / TypeScript · Python · Java / JVM · Go · C# / .NET
PostgreSQL and MySQL for each track. Defined Redis scenarios. Explicit execution profiles keep support precise.
From observation to decision
A verdict is the beginning. The evidence tells you what failed, whether the change introduced it, and what a repair actually preserves.
Compare base and head in equivalent environments. Separate a new violation from a pre-existing defect, a resolved issue, an unchanged outcome or an incomparable run.
Explore the mechanismInspect committed state, balances, stock, permissions and emitted effects. A rejected request that still writes unauthorized data is a violation.
Explore the mechanismExercise admitted overlapping schedules, lost responses, duplicate deliveries, restarts and fault points. Record the schedule and the convergence window.
Explore the mechanismCarry the code and policy revisions, image and dependency digests, seed, initial state, schedule and fault point into a clean replay. Keep original and minimized evidence distinct.
Explore the mechanismRetain an observed violation even when another scenario cannot finish. Separate verdict, coverage, applicability and execution state; a successful job alone is not PASS.
Explore the mechanismProtect the approved rules and evaluator. Run the original failure, held-out neighboring behavior, legitimate paths and required customer checks against the actual patched commit.
Explore the mechanismApprove outgoing file names, snippets and tool results. Bound attempts, tokens, time and cost. Review the diff and residual risks; a changed target commit requires revalidation.
Explore the mechanismIntegrations
Five language tracks. PostgreSQL and MySQL. Redis where the scenario needs it. One rule and evidence contract, inside your GitHub workflow.
GitHub Actions
Where every check runs
The pull_request trigger on GitHub-hosted ubuntu-24.04 runners, in your own account. The action is pinned by full commit SHA.
Pull requests
Where the verdict appears
The check summary lands on the pull request: approved rule, why it ran, expected, observed, why, next step and provenance.
Workflow artifacts
Optional evidence file
An opt-in JSON evidence file with the same fields as the summary, kept 7 days in your repository.
Code owners
Protects the rules
Protect .github/workflows/ and the rules file with CODEOWNERS, so changes to Bracel itself always get review.
Branch protection
Optional merge gate
Bracel changes no merge settings. Your administrators decide whether the check is required.
Node.js / TypeScript
Node.js 24 · Express 5 · TypeScript 7
JavaScript and TypeScript applications on Node.js 24 with Express 5, installed from package-lock.json. Approved business rules run through a pinned runtime, build and application profile.
Python
Python 3.13 · FastAPI · Uvicorn
Python 3.13 applications on FastAPI and Uvicorn, with hash-pinned requirements. Behaviour is verified through a versioned runtime, dependency and observation profile.
Java / JVM
Java 21 · Spring Boot 4.1 · Maven
Java 21 applications on Spring Boot 4.1, built with Maven against a checksum-verified dependency list.
Go
Go 1.26 · net/http
Go 1.26 services on the standard net/http library, built from go.mod and go.sum.
C# / .NET
.NET 10 · ASP.NET Core
.NET 10 applications on ASP.NET Core minimal APIs, restored from a locked packages file.
PostgreSQL
PostgreSQL 18
Persisted state, transaction boundaries, concurrent writes and recovery, across all five language profiles.
MySQL
MySQL 8.4
Business invariants against MySQL persistence and the transaction semantics declared by the profile, across all five language profiles.
Redis
Redis 8 · with PostgreSQL
The defined cache, session, deduplication and asynchronous side-effect scenarios, with PostgreSQL as the system of record. Redis use is declared per profile.
npm
Node.js · package-lock.json
Installed with npm ci from package-lock.json, with install scripts disabled.
pip
Python · hash-pinned requirements.txt
Installed with --require-hashes from binary wheels only; every package must match its recorded hash.
Maven
Java · dependency checksum list
Resolved with strict checksums and compared with the repository’s dependency-checksums.txt, including on a cache hit.
Go modules
Go · go.mod and go.sum
Downloaded against go.sum and built read-only, so the module graph cannot change during the build.
NuGet
.NET · packages.lock.json
Restored in locked mode from packages.lock.json.
Docker
Isolated execution
Images pinned by digest. Dependencies are fetched only while preparing, through a per-run proxy limited to the package registries; the application then runs with no network route out, a read-only file system and bounded memory, CPU and processes.
See every requirement.
All integrations and execution profiles →Chapter 07 · Plans
The same verification engine in every plan. Pay for shared evidence, approvals and team coordination. Model and CI costs remain separate.
Free
$0
self-managed verification
Prove the rule in your own workflow.
Team
$119
/ org / month, annual
Keep the rule, its owner and its evidence connected.
Business
$399
/ org / month, annual
Coordinate critical rules across services and teams.
Enterprise
Custom
by agreement
Agree deployment, identity and assurance requirements.
Questions
BRAY-sel.
No. Bracel does not comment on style or guess at intent. It executes the rules your team approved and reports what happened. The verdict comes from execution, not from a language model’s text.
Your administrators control merge policy. Bracel reports the observed result; your required checks decide whether a change can merge.
It runs in your own GitHub Actions runner. In our tests on GitHub-hosted runners, the action sends no telemetry and no data to us. Every data path is listed on the security page. An optional evidence file stays in your repository as a workflow artifact for 7 days; nothing reaches us unless you send it.
The result is NOT_APPLICABLE: 0 checks executed and no verification claim. It succeeds, so a pull request that changes none of a rule’s paths merges without that rule running. Omit paths to run a rule on every pull request.
Bracel could not establish the result: the project is outside the supported profile, a rule could not run, or the pull request changes Bracel’s own rules or workflow. UNKNOWN is never shown as a pass. The summary says why and what to do next.
Node.js/TypeScript, Python, Java/JVM, Go and C#/.NET, with PostgreSQL and MySQL for each track and defined Redis scenarios. Each execution profile specifies versions, framework, dependencies, observation and fault capabilities. See integrations for the scope.
Sequence and state transitions, concurrency, retries and duplicate effects, authorization and tenancy, partial failure and recovery, evaluation integrity, and reproduction. Each rule publishes its scenario, observations and outcome conditions.
No. Review and tests keep doing their jobs. Bracel adds an executed check for the specific rules you name.
Free evaluation access and organization plans are shown on the pricing page. Fix inference uses your own model key and an explicit budget. Provider costs are separate; no payment is collected in this preview.
A controlled repair workflow. Start from a reproduced FAIL, approve model sharing, inspect a bounded patch and its independent validation, then review the draft pull request. PASS is necessary, never sufficient; a human decides whether to merge.
Check your repository on the compatibility page, then follow the quickstart: approve a rule, add the workflow, and open a pull request.
Email security@bracel.dev. That includes a suspected incorrect PASS, which we treat as a security issue.
Protect the rules that move money and control access. Start with one.
Request access