Open source · MIT Built by Piyush Pathak

The QA gate for AI-written code.

Coding agents can make CI pass. Vigilis makes sure it should. Point it at the Playwright, Cypress, or Selenium suite you already have: it heals safe drift, blocks real regressions, and signs the proof.

$ npm i -D vigilis
★ Star on GitHub
qa-gate.run live
scanning suite… DEPLOY

click any cell for its run report

Works with Playwright/Cypress/Selenium ·runs in your CI·your own keys
The problem

Tell any coding agent to make CI pass, and the cheapest path to green is deleting the test that caught the bug.

A general coding agent
objective: make CI pass
> "make the checkout test pass"
· expected $49.00, got $0.00
· rewrites assertion to expect $0.00
· CI turns green
the $0.00 checkout bug ships
Vigilis
objective: tell the truth
$ vigilis heal --spec checkout
· triage: real regression, not drift
· refuses to touch the spec
· gate fails, deploy blocked
bug caught, refusal sealed

Vigilis is the one that refuses. And signs proof of the call.

Watch it happen

A real run refusing a real bug.

vigilis heal · checkout.spec.ts
After the refusal

The refusal goes where your team already works.

A real-bug refusal can page Slack and open a Linear ticket — each linking the signed receipt. Heals and flakes stay silent; only a held regression interrupts anyone.

Slack alert#qa-alerts
fireson a real-bug refusal only — never on heals or flakes
postscheckout-total.spec.ts — expected $49.00, got $0.00
linkssigned receipt · ssn_8f31c0
suspected regression · receipt attached · offline verifiable
Linear ticketauto-filed
opensone issue for the held regression
linkssigned receipt in the issue body
dedupCI re-runs reuse the same ticket — no spam
deduplicated · receipt attached · auditable
Optional, off by default. A no-op until you set SLACK_WEBHOOK_URL / LINEAR_API_KEY — nothing leaves your CI without your keys.

A refusal flags a suspected real regression, not a confirmed bug. The receipt is verifiable and auditable — it proves the agent refused and what it saw, not that the judgement was correct. Every alert and ticket links that signed receipt, so a human can verify before they act.

Vigilis vs. the rest

Everyone else heals to green. Vigilis heals to true.

DIY coding agentsClaude Code, Codex, Cursor + Playwright MCP
Optimize for "make it pass." No refusal, no contract, no proof. They will rewrite the assertion that caught the bug.
Self-healing platformsShiplight, QA Wolf, Autonoma, Mabl, Testim
Heal to make builds green, then report real bugs. Masking is mitigated by human review or confidence scores, soft controls on a system grading its own work.
Vigilis
Heals the suite you already have. Refuses real regressions as a hard, fail-closed contract. Signs every call into an independent, offline-verifiable receipt.
What a verdict looks like

Two failures. Two very different receipts.

The same agent meets a cosmetic change and a real bug. It heals one, refuses the other — and signs proof of which.

Healed · safe driftacme/web
testlogin.spec.ts
causebutton id renamed, same button, same label
change
- #login
+ #signin
resultre-ran → green, fix PR opened
signed · chain intact · suite stays green
Refused · real bugacme/checkout
testcheckout-total.spec.ts
causebehaviour changed, not selector drift
assertexpected $49.00, got $0.00
resultspec untouched, deploy blocked
signed · chain intact · bug surfaced

A dashboard you can edit isn't evidence. Every verdict is sealed by an independent notary into a tamper-evident receipt — so “the agent refused a real bug” is something you can prove to an auditor, not just claim.

Why everyone shipping AI-written code needs this: the moment an agent can change code with no human watching, “trust me” stops being enough. You need a signed record of what it decided — from a notary that can't quietly rewrite it. Verifiable and auditable: it proves what happened, not that the judgment was correct.

Stop shipping false green.

Drop Vigilis into the suite you already have.

quickstart
$ npm i -D vigilis
$ npx playwright install chromium
$ vigilis init
$ vigilis generate https://your-app.com --run

Runs in your CI with your own Anthropic key and chromium. About 10¢ per run on Haiku, Opus by default. Read the docs ▸

Receipts, not promises

Same failure. Three verdicts. The agent picks, and proves which.

Any tool can turn a build green. The question is what it did with the failure: heal safe drift, park a flake, or refuse to bury a real bug.

Triage

A spec just failed. What kind of failure is it?  bug · drift · flake

Healedif drift ▸
causelocator stale, testid renamed
change
- getByTestId('login-btn')
+ getByTestId('signin-btn')
verifyre-ran → 3 passed
resultfix PR opened for review
observed by Vigilis · sealed by Treeship
Quarantinedif flake ▸
causetiming / environment, not code
actionflagged, not silently retried
resultquarantined for review
observed by Vigilis · sealed by Treeship
Refused to healif real bug ▸
causebehaviour changed, not drift
assertexpected $49.00, got $0.00
changenone, spec untouched
resultQA Gate failed, deploy blocked
observed by Vigilis · sealed by Treeship

Every heal and every refusal becomes an offline-verifiable receipt when the Treeship CLI is present. No hard dependency, --no-receipt to opt out.

Why you can trust it

Whoever writes the code can't be the one who clears it.

Three separate layers. No layer grades its own work. Open each to see the boundary it can't cross.

Actor Whatever writes the code & tests dev · Claude Code · Codex · any agent
Does

Write code, specs, and fixes. Propose changes.

Never

Decide whether its own output is correct, or clear its own build.

observed by ▾
Observer Vigilis verifies the behaviour runs · triages · heals safe drift · refuses real bugs · gates the deploy
Does

Judge the actor's output. Heal cosmetic drift, refuse real regressions, block the gate.

Never

Edit a spec to force a pass, or vouch for itself. Its verdict is handed on, not self-sealed.

sealed by ▾
Notary Treeship signs the evidence independent, offline-verifiable receipt for every heal and refusal
Does

Seal what Vigilis decided into a tamper-evident receipt anyone can verify.

Never

Judge correctness or change a verdict. It proves what happened, nothing more.

Three layers, and no layer grades its own work. That separation is the guarantee, not a bigger model.

Under the hood

One core. Four behaviors.

01

Author · soon

Plain-English intent in, a structured test plan out. (on the roadmap)

→ *.plan.json
02

Generate

Explores the app from a URL and writes specs with real assertions.

→ tests/*.spec.ts
03

Triage

Classifies every failure: real bug, DOM drift, or flake.

→ root-cause report
04

Heal

Rewrites the locator, re-runs to verify green, opens a PR. Refuses real bugs.

→ pull request
Wrapped by CI: the loop runs as a required QA Gate check in GitHub Actions. / Wrapped by Treeship + ZMem: each heal and refusal is sealed into a signed receipt, and prior verdicts are recalled as governed memory.
Vigilis is built by Piyush Pathak. It consumes Treeship for independent attestation and ZMem for governed memory — external primitives Vigilis doesn't own or control. Because the notary that signs every verdict is independent, Vigilis can make a fail-closed, signed guarantee the rest of the category can't.