VerisKit / Docs
Get started fast.
VerisKit runs the test and quality tools your project already has, then returns one honest verdict with a Markdown report you can paste into a pull request. The package is `veriskit` and the command is `veris`. This guide takes you from install through your first verdict, then covers the three states and exit codes, the developer loop (affected and watch), project intelligence (scan and plan), the evidence system and how to sign it, publishing the verdict to a pull request, browser tests, run history, and the `veriskit-mcp` server an AI agent calls to verify its own work. Everything lives under `.veris/` in your repo. Nothing uploads unless you pass `--github`, and VerisKit never calls an LLM.
Install
Run
VerisKit needs Node.js 20 or newer, a git repository, and npm / npx. There is no account, no API key, and no install script.
Run init from the repo root. It detects your stack and writes .veris/config.json. Detection is read-only and never overwrites an existing config.
npx veriskit init
The package is veriskit; the command it installs is veris. To keep veris on your PATH, add it as a dev dependency:
npm install -D veriskit
Then every command runs as veris <command>.
Detect the stack
Add as a dev dependency
Quickstart
Run
From an initialized repo, prove a change and write the report in two commands.
veris verify
veris report
verify runs every configured check in parallel and prints the verdict. report writes a Markdown summary to .veris/reports/ that you paste straight into the pull request. A clean run reads like this:
VerisKit
Project veriskit
Checks
✓ types 1.2s
✓ unit 2.4s
✓ lint 0.6s
Result
✓ Verified
Commit 4fa33a9 · tree clean
Report
.veris/reports/verify-20260710-153000.md
veris doctor checks your environment and detected stack if a command behaves unexpectedly, and veris test runs the detected test tool on its own.
Prove the change
Write the PR report
Check the setup
The verdict and exit codes
Run
VerisKit returns one verdict with three states, not two. A wall of green checkmarks does not tell you whether a change is safe, so VerisKit reads the real exit codes and output of each check and never folds a skipped or unknown result into verified.
| Verdict | Exit code | Meaning |
|---|---|---|
verified |
0 |
every configured check ran and passed |
failed |
1 |
at least one check failed |
partial |
2 (0 with --partial-ok) |
no failures, but a check was skipped or its result is unknown |
A partial verdict is not a pass. It means a check could not run or its result is unknown, for example a tool that is configured but missing, or a suite that reported nothing. Use --partial-ok when you want to accept a partial on purpose; it exits 0 while still labeling the run partial in the output and the report. The exit codes are stable, so a pull request or CI job can gate on them directly.
Developer loop
Run
Running the whole suite on every save is slow enough that people skip it. VerisKit narrows the run to what your change actually reached.
veris affected
veris affected --base main
veris watch
affected runs only the checks, and only the test files, reached by your changes, using an import graph built from the project's own TypeScript. Pass --base <ref> to scope it to a PR or CI diff. watch re-runs the affected checks as files change, with native fs.watch and a --poll fallback.
Narrowing is conservative. When VerisKit cannot prove a smaller set is safe, it runs the full suite, so an affected test is never skipped. affected and watch never report a bare Verified either: a scoped run says so, so you always know whether the verdict covered everything or only the slice you touched.
Only what changed
Against a base ref
Re-run on save
Project intelligence
Run
Coverage percentages hide the risk. VerisKit maps how the code connects, then points at the files that matter and have no tests behind them.
veris scan
veris plan
scan maps the import graph from the project's own TypeScript, with a dependency-free scanner fallback, writes .veris/graph.json, and surfaces untested high-impact files. plan turns that into prioritized recommendations: high-impact untested files, weak verification, and risky changes.
Both are read-only and analysis only. VerisKit recommends what to test; it does not generate tests or edit your code.
Map the import graph
Recommend what to test
Evidence system
Run
Every verify and affected run writes a canonical, git-anchored record, so a verdict is something you can recompute later rather than a line in a log.
veris evidence show
veris evidence bundle
veris evidence verify .veris/evidence/<bundle>.json
Each run writes .veris/runs/<id>/evidence.json (schema veriskit/evidence@1) with a sha256 integrity digest over the whole record and a sha256 of each per-check log. evidence show prints the latest record's key facts. evidence bundle packages the latest run, the record, report, and logs, each digested, into one portable proof file under .veris/evidence/. evidence verify <file> recomputes the digests and checks a record or a bundle.
An integrity digest detects later edits and corruption. On its own it is not forgery-proof, so publish the digest separately or sign it, as below.
Print the latest record
Bundle a portable proof
Recompute and check
Sign the evidence
Run
Since 0.4.1 you can sign a record, so a reviewer can check that it came from a key you control and nothing changed after.
veris evidence keygen
veris evidence sign .veris/runs/<id>/evidence.json
veris evidence verify .veris/runs/<id>/evidence.json --pubkey keys/veris.pub
evidence keygen creates an Ed25519 keypair using Node's built-in crypto, so signing adds no dependency. veris init gitignores keys/. evidence sign <evidence.json> writes a detached signature over the record's integrity digest, and a bundle carries the signature with it.
evidence verify finds a sibling signature and checks it on its own. Pass --pubkey <file> or --key-id <id> to assert who the signer must be. In CI, set VERISKIT_SIGNING_KEY to supply the key.
Signing is opt-in, and unsigned evidence still verifies for integrity.
A signature proves that a key vouched for this record. It does not prove who holds that key, unless you assert the expected signer with --pubkey or --key-id. Keyless signing through sigstore is still planned.
Create a keypair
Sign a record
Assert the signer
Publish to a pull request
Run
Your verdict lands in your terminal. The reviewer is in the pull request. Pass --github and VerisKit posts it there.
veris verify --github
That posts and updates one sticky PR comment carrying the verdict and report, and creates a GitHub Check Run whose conclusion follows the verdict: verified passes, failed fails, and partial is neutral. Re-runs edit the same comment rather than adding another, so a busy PR does not fill up with bot noise.
VerisKit reads GITHUB_TOKEN from the environment and never stores it. In a workflow, grant the job both permissions:
permissions:
pull-requests: write
checks: write
Without them the publish fails with GitHub's own message, for example "Resource not accessible by integration". Since 0.5.1 VerisKit surfaces that message so a failed publish is diagnosable, and the token never appears in an error.
Publishing is a side channel, and it cannot rescue a bad run. A missing token or a run outside a PR prints a notice and the exit code still reflects the verdict. A GitHub API error is reported and then ignored. The verdict comes from your checks, never from whether the comment posted.
veris badge writes a shields.io endpoint JSON so a README badge shows the last verdict. All of this uses the GitHub API over Node's built-in fetch, so none of it adds a dependency.
Post the verdict to the PR
Write a README badge
Browser tests
Run
VerisKit can run your Playwright suite as part of the verdict. It is opt-in, so a normal veris verify stays fast.
veris verify --browser
That runs playwright test alongside your other checks and folds the result into the same honest verdict. To make it part of every run instead, add a browser entry to .veris/config.json.
When init detects Playwright, veris doctor lists browser as an available capability, so you can see it is there before you turn it on.
If VerisKit cannot parse the results, it reports the check as unknown rather than claiming it passed. That turns the run partial, which is the honest answer: the browser suite ran, and VerisKit cannot tell you what it proved.
Run the browser suite too
See detected capabilities
History
Run
Every run leaves an evidence record, so VerisKit can show you the trend instead of just the last result.
veris log
veris log --flaky
veris log lists past runs newest first, each with its verdict, its checks, and the commit it ran against. veris log --flaky reads across recent runs and names the checks that both passed and failed. Those are the ones to fix before you trust a green run.
History is local to the machine. The .veris/runs directory is gitignored, so a teammate's runs are not in your log, and your log does not land in the repo.
See past runs
Find flaky checks
Use with AI agents (MCP)
Run
Since 0.6.0, VerisKit ships veriskit-mcp, a Model Context Protocol server over stdio, so an AI agent verifies its own change against your real tooling and reads the evidence back as tool calls, rather than reporting that the work is done.
Point any MCP-aware client at the package:
{
"mcpServers": {
"veriskit": { "command": "npx", "args": ["-y", "veriskit-mcp"] }
}
}
The server exposes seven tools. Five only read:
veris_doctorreports the environment and the detected stack.veris_scanmaps the import graph and untested high-impact files.veris_planreturns the prioritized recommendations.veris_logreturns past runs and flaky checks.veris_evidence_verifyrecomputes and checks a record or bundle.
Two run your project's test tooling:
veris_verifyruns every configured check and returns the verdict.veris_affectedruns only the checks and test files your changes reached.
Each one returns the same structured, honest verdict the CLI returns, so a partial reads as a partial to the agent too. An agent cannot talk VerisKit into a pass, because the verdict still comes from your tools' real exit codes.
The veriskit CLI keeps its two runtime dependencies. The official MCP SDK lives only in veriskit-mcp, so the package you install in CI never grows to support an agent.
Alongside AgentLoopKit, which decides what the agent does next, and AgentFlight, which records what it did, VerisKit answers whether you can trust the result. Now the agent can ask directly.
What it does not do yet
VerisKit names its edges instead of hiding them. Today it does not:
- Detect framework routes or endpoints. It verifies the checks your project runs, not live HTTP surfaces.
- Generate tests.
scanandplanrecommend what to test; writing the tests is yours. - Model monorepos. It works from one project root. Multiple packages under one repo are not modeled yet.
- Fully analyze every project. On plain-JS projects, or TypeScript 7.x native-compiler projects, it uses a dependency-free scanner fallback instead of the full graph.
- Sign without a key.
evidence signcovers Ed25519 signing with your own key. Keyless signing through sigstore is still planned, and a signature proves a key vouched for the record, not who holds the key, unless you assert the signer. - Share history across a team.
veris logreads the local.veris/runsdirectory, which is gitignored, so history is per machine.
The CLI runs locally with two dependencies, cac and picocolors, and Node built-ins. --github is the one outbound path, and you opt into it.
Command reference
The full surface, compact.
initdetects the stack and writes.veris/config.json. Read-only detection; never overwrites an existing config.doctorchecks your environment and the detected stack, including whether browser is available.testruns the detected test tool on its own.verifyruns every configured check in parallel and returns verified, failed, or partial, with exit codes 0, 1, and 2.--githubposts the verdict to the PR,--browseralso runs the Playwright suite, and--partial-okexits 0 on a partial.reportwrites a Markdown summary of the latest run under.veris/reports/.badgewrites a shields.io endpoint JSON for a README status badge.affectedruns only the checks and test files reached by your changes.--base <ref>scopes it to a diff.watchre-runs affected checks as files change.--pollfor filesystems that need it.loglists past runs from the stored evidence records.--flakynames checks that both passed and failed recently.scanmaps the import graph and finds untested high-impact files.planrecommends what to test from the scan.evidence verify | bundle | showrecomputes a record, packages a portable proof file, or prints the latest record.verifytakes--pubkeyor--key-idto assert the signer.evidence keygen | signcreates an Ed25519 keypair, or writes a detached signature over a record's digest.
Separately, the veriskit-mcp package serves seven of these to an AI agent over MCP: veris_doctor, veris_scan, veris_plan, veris_log, veris_evidence_verify, veris_verify, and veris_affected.
Everything is local and read-mostly. VerisKit runs your configured checks only when you invoke verify, affected, watch, or test, and it reaches the network only when you pass --github.
More from the studio
ProjScan
ProjScan tells reviewers when to bootstrap, prove, or stop. Review Gate returns one decision; bootstrap is explicit. Local proof, no code upload.
ViewAgentLoopKit
The local control plane for low-token, verifiable agent loops. It owns scope, gates, and completion decisions, with a token receipt on every step.
ViewAgentFlight
agentflight guard watches local trust while your coding agent works; agentflight finish writes the Review Passport that proves the result.
View