Does the code keep its promise?
Assay extracts every implicit claim your code makes. Handles null. Validates input. Retries on failure. Then it checks the code against each claim, one at a time.
AI writes code that compiles clean, reads right, and still does not do what it says it does. Assay extracts every claim your app makes, verifies each against the code, then triages every failure. Real defect: fix it. Spec drift: leave the code alone.
One production app: 319 claims verified. 25 bugs. 8 of them were the spec’s fault, not the code’s.
npx tryassay assess /path/to/projectnpx tryassay assess /path/to/projectnpx tryassay fix /path/to/projectRuns with your Anthropic API key, roughly $1–10 in tokens by repo size. Reports publish to the Assay portal by default; --no-publish keeps everything local. fix applies the real defects. Never the spec-drift ones.
Assay extracts every implicit claim your code makes. Handles null. Validates input. Retries on failure. Then it checks the code against each claim, one at a time.
Assay also works backward, from the code to the claims. The swallowed error, the path with no guard, the branch that returns the wrong shape. It surfaces behavior no claim covers.
Claim extraction and dual-direction checking are a patent-backed method, not a linter pass. Assay reasons about what the code intends, then proves it or breaks it.
Under the hood it is a neurosymbolic verification loop: neural systems extract claims, symbolic oracles verify them.
An LLM reads your code and identifies every implicit claim it makes. "This function handles null input." "This API returns sorted results." No regex or AST parser can do this — it requires semantic understanding. This is the neural layer.
A deterministic oracle tests each claim. For code, that means actual test execution in an isolated subprocess. The oracle does not hallucinate. It runs the code and reports what happened. This is the symbolic layer.
Every failed claim is classified: real defect, spec drift, or uncertain. Real defects get a fix prompt your coding agent can apply — or `assay fix` applies them for you. Spec drift gets flagged so nobody "fixes" correct code.
Buffer.from('').constructor.constructor('return process')()Found and reportedclient.Get(httpsURL) // user-controlled, full response consumedFound and reported
path, _ := filepath.Split(os.Args[0]) // attacker controls argv[0]Found and reported
await fetch(switchRemote(url, remote), { ... }) // no assertValidURL()Found and reportedwriteFileSync(configPath, TOML.stringify(config)) // mode defaults 0o644Found and reported
new Uint8Array(16).map(() => (Math.random() * 255) | 0)Found and reported
Cricket scoring app, Next.js + Supabase. 205 claims verified, 18 bugs found (2 critical, 1 high, 15 medium). Real developer, real repo, published report.
of 164 blind holdout CVEs caught at the exact vulnerable code — advisories no rule was learned from, strictest definition.
points of blind recall in the last teaching cycle — 26.8% → 32.9% on the same 164-CVE holdout.
real vulnerabilities scored from the GitHub Advisory Database, each scanned as the code existed before the fix.
A finding only counts as a catch if it lands on the code the fix later changed, and stops firing once the fix is applied. Looser definitions inflate the number; we lead with the strictest and publish all three. The benchmark re-runs every Monday and appends to a public TSV.
The full benchmark, misses includedRLVF showed negative scaling: more training data makes models worse at self-verification. Verification must remain external. That is the product.
LVR pilot: 126 files, 354 claims, 27 bugs fixed. Zero scaffolding.
Investing, partnership, enterprise pilot, or research collaboration — we answer our own email.
Get in touchRun Assay inside Claude Code, Cursor, or Windsurf via the lucid-mcp server. Free scans for community members, too.
MCP setup guide ↗npx tryassay assess /path/to/project