hollow-testsTests that test nothing
Tests with no assertion or only constant ones, swallowed errors and un-awaited promises — in Jest, Vitest, Mocha, node:test, pytest and unittest.
Fini Proof™ · CLI 0.6.4
Deterministic checks return PASS, FAIL or NOT_MEASURED.
Trial: 7 days, 7 proof commands, 1 repository. Every trial run needs an internet connection, because each run is checked with FINIPE. The trial starts on your first proof command.
Already using Fini Proof? Sign in to your Developer workspace$ npx fini-proof check --base origin/main engines hollow-tests secrets fail-open skip-ratchet tenant-filter migrations HIGH src/orders/order.service.ts:42 TENANT_FILTER_MISSING proof: fini-proof prove --engine tenant-filter --file src/orders/order.service.ts --line 42 HIGH test/refund.spec.ts:18 hollow-tests/NO_ASSERTION VERDICT: FAIL (exit 1) · evidence .fini-proof/runs/<run id>.json$ git commit -am "scope order lookup by tenant, assert refund"$ npx fini-proof check --base origin/mainVERDICT: PASS (exit 0)
The problem
A reviewer reads the diff and trusts the green tick. The expensive bugs sit where the tick is wrong.
An agent asked to “add tests” often writes tests with no real assertion. Coverage goes up, CI goes green, and nothing is protected.
In multi-tenant software, one query without a tenant filter is a data leak. In the diff it looks like any other line.
A step with “|| true”, a skipped suite, a “.only” left in by mistake: the pipeline reports success because nothing was checked.
How it works
A check that has never been seen to fail is not evidence. So before a check reads your code, it has to catch a defect we planted. Deterministic checks return PASS, FAIL or NOT_MEASURED. A negative control must fail before that check counts. fini-proof@0.6.4 runs on your machine; the licence check is offline. Optional upload sends paths, hashes, findings and the HEAD author email, not file contents. Online entitlement is not in this package. A report is unsigned and self-reported. This does not find every defect, and it is not mathematical or independent certification.
Each engine first runs on planted defects (negative controls) and clean look-alikes (positive controls). If it misses one, the result is NOT_MEASURED — never a pass.
On a pull request only the changed files are judged, so old debt does not block new work. Existing skipped tests and applied migrations are recorded once as a baseline.
Each finding names the file, line and rule, with a fix and a prove command that reproduces it. Every run writes an evidence file with a hash of every input, and SARIF for code scanning.
Every check ran, every control behaved, and nothing blocking remains.
At least one blocking finding, each with its file, line and proof command.
Something could not be checked — an unreadable file, a missing base branch, a check that missed its planted bug. “Could not check” is never turned into a pass.
Six built-in checks
Deterministic engines, not a language model’s opinion. Installing the package and an optional evidence upload use the network. The checks themselves are local.
hollow-testsTests with no assertion or only constant ones, swallowed errors and un-awaited promises — in Jest, Vitest, Mocha, node:test, pytest and unittest.
tenant-filterA query on a multi-tenant table with no tenant condition. It reads your schema to find which tables hold tenant data — raw SQL, TypeORM, Prisma, Knex, Django, SQLAlchemy and more.
migrationsDropped tables and columns, type rewrites, NOT NULL without a default, and migrations with no way back — plain SQL, Flyway, Prisma, TypeORM, Knex, Alembic, Django and more.
fail-openSteps and scripts that report success when they failed: “|| true”, “set +e”, continue-on-error, an empty catch, “except: pass”.
secretsCloud keys, private keys, API tokens and real values in .env files. If gitleaks is installed, Fini Proof runs it and holds it to the same planted-defect test.
skip-ratchetA focused “.only” is always caught. Existing skips are recorded once; after that the count can only go down unless someone writes down why.
Guardrails for AI coding agents
Coding agents are fast — and happy to report “all tests pass” about tests that assert nothing. Fini Proof sits between the agent and “done”.
A Stop hook keeps the agent from finishing while the verdict is FAIL and hands it the findings. A PostToolUse hook checks each file as it is written.
“fini-proof mcp” gives any MCP client three tools — check, explain_finding and list_rules — on the same licensed path and evidence as the CLI.
An AGENTS.md section plus a CI gate. The gate also fails a pull request that changes the checker’s own config or baseline without human approval.
Every evidence file records who made the change — a person or an agent — and which verifier checked it. A verifier cannot attest its own change.
You can tell an agent to make CI green. It cannot switch off the check that decides.
Works where you already work
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- run: npx --yes fini-proof check --base origin/${{ github.base_ref }} --sarif-out fini-proof.sarif
env: { FINI_PROOF_LICENCE: ${{ secrets.FINI_PROOF_LICENCE }} }Security and your data
Local engines. The 0.6.4 engines are deterministic and make no model call. They do not upload source file contents.
Optional evidence upload. Sending a run to your Developer workspace is optional. The record can include paths, hashes, finding text and the git author email of HEAD. It does not include file contents. See Privacy Policy §23.
Offline licence check. In 0.6.4 an Ed25519 licence is checked on the machine, with no network call for that check. Downloading the package with npx is a separate network step. Online authorisation is not what this package does.
No lock-in. Results come out as JSON and SARIF, so you keep them if you ever leave.
Never trains on your code. Customer code is never used to train or fine-tune any model.
CLI, six checks, proof state, SARIF and JSON, CI templates, MCP server, Claude Code and Codex integration.
GitHub App with check runs and annotations. Results uploaded to your Developer workspace show as self-reported until the hosted verifier ships.
IDE extension. SOC 2 and ISO 27001: not certified today, and we do not claim to be.
Who it is for
CTO / VP Engineering
Let agents write more of the code while a check you control decides what counts as done.
Head of QA and release
Find the tests that pass whatever the code does, and stop skipped tests piling up without anyone deciding.
CISO and compliance
Each run records engine versions, input hashes, the verdict and who made the change — exported as JSON and SARIF.
IT services delivery head
Attach proof of verification to every client delivery, so acceptance is about evidence, not opinion.
Pricing
Amounts exclude applicable tax.
7 days, 7 proof commands, 1 repository. Every trial run needs an internet connection.
| Plan | INR | USD |
|---|---|---|
| Individual Billed monthly | ₹2,000 per month | $20 per monthreference only |
| Individual Billed annually | ₹20,000 per year | $200 per yearreference only |
| Team Billed monthly, per developer | ₹2,000 per developer per month Sold for 2–99 developers. | $20 per developer per monthreference only Sold for 2–99 developers. |
| Team Billed annually, per developer | ₹20,000 per developer per year Sold for 2–99 developers. | Not offered in USD |
USD prices are shown for reference; payment is available in INR for buyers in India. International payments open soon.
Larger teams, security reviews, or terms of your own. Tell us what you need.
Contact usGet started
Sign in to the Developer workspace, add a repository, and run the published CLI. For an engineering walkthrough, use the contact form.
Trial: 7 days, 7 proof commands, 1 repository. The trial starts on your first proof command, and every trial run needs an internet connection.
Sign in and open a repository$20 for 1 developer(s) per month, prepaid before applicable tax
See plans and pricingFAQ
Guides
Why a Fini Proof check must catch a planted defect before its silence counts as evidence, and what the 0.6.4 engines actually do.
What the NOT_MEASURED verdict means in fini-proof 0.6.4, which conditions produce it, and why it is never turned into a pass.
How to run the fini-proof 0.6.4 CLI in GitHub Actions, GitLab CI, Jenkins or Bitbucket, including licence and optional upload.
How the 0.6.4 CLI sits with Claude Code hooks, an AGENTS.md gate and the MCP server. What is ready, early or not in this package.
Sign in, then repository, CLI and report. An engineering demo uses the contact form.