Your tests check the paths you thought of. Polygraph checks the ones you didn't.
> /plugin marketplace add cognitive-fab/polygraph> /plugin install polygraph@polygraph
FAQ
polygraph is a Claude Code plugin with 5 hand-picked skills for testing work, indexed on Flowy. Install it with the command on its page. It includes polyviz, polygen, polygraph. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Repo: cognitive-fab/polygraph
Your tests check the paths you thought of. Polygraph checks the ones you didn't.
Polygraph is a Claude Code plugin (and standalone CLI) that finds bugs in stateful code β workflows, reducers, protocol handlers, checkout flows, session managers β by exhaustively exploring every state the code can reach over a finite, declared domain of actions and payloads, and flagging the ones that break rules you care about, like "a customer is never charged twice."
You don't need to know anything about formal verification to use it. You write the rules as plain JavaScript predicates. The heavy lifting β deriving a formal model of your code, exploring the state space, producing a shortest path to each violation β is done for you.
Disclosure β read this first. Polygraph is experimental, not peer-reviewed, unproven technology. It is a consistency check, not a proof: a clean run means the code's observable behavior matches an independent reading of its own source, and nothing more. "Exhaustive" always means exhaustive over the finite (action, data) domains declared in the contract β not over unbounded real-world data (see What "exhaustive" means). Every finding is a lead to investigate by hand, not an established result. Do not rely on it as your only safeguard for correctness- or safety-critical code.
Polygraph is developed by Cognitive Fab LLC (https://cognitivefab.com). For questions, commercial support, or collaboration, reach us at hello@cognitivefab.com.
The DAAO demo β a Dual-Authorization Action Order machine taken end to end
through the method (author it, break it, catch it, version-gate it) β lives in
its own repo: cognitive-fab/polygraph-demo-daao.
Three articles walk the demos:
/polygraph:verify.Unit tests execute the scenarios you wrote. A state machine of even modest size has orders of magnitude more reachable states than any test suite visits β and the bugs that hurt in production live in the combinations nobody wrote a test for: a retry landing after a cancel, a timeout racing a confirmation, an event arriving in a state where nobody expected it.
Polygraph attacks that gap in two ways:
Audit existing code (/polygraph:verify). An LLM reads your source and
writes an independent, executable specification of it β a second opinion on
what the code does. Polygraph then (1) replays real execution traces
against that spec to confirm it's faithful, and (2) model-checks it:
starting from the initial state, it tries every action with every declared
payload value, visits every state reachable that way, and reports any state that violates
one of your rules β with the shortest sequence of actions that gets there.
That counterexample path is a ready-made repro for the bug.
Author new code (polygen). Give it a one-sentence feature description
and it writes the state machine and its rules, model-checks its own
output, repairs violations, and hands you code with a passing exhaustive
check plus a generated regression trace corpus β verified from the moment
it's written.
Real result: on a production SaaS subscription-billing machine, this method
independently corroborated a genuine double-charge bug
(examples/case-study-subscription.md).
In the controlled eval, replay alone found 0/5 seeded bugs β model checking
found 5/5, with counterexamples
(eval/FINDING-faithful-reproduction.md).
Those tools work β but you have to hand-translate your code into their
language and keep the translation current, which is why almost nobody does
it. Specifying even a small-to-midsize system is a multi-month effort, and
every code change invalidates the spec. Polygraph's bet is that an LLM can
produce that formal model from your source cheaply enough to rerun on every
change, and that replaying real traces against the model tells you whether to
trust it. You stay in JavaScript the whole time. (If you do want the real
thing, an optional --tla flag mechanically transpiles the winning spec to
TLA+ and runs TLC over it.)
This bet is no longer a fringe position β and the strongest evidence for it comes from a project that is ahead of Polygraph on the one axis the two share:
Specula: Scaling formal specifications for autonomous model checking of system code. arXiv:2607.25333, July 2026. https://github.com/specula-org/Specula (Apache-2.0)
Specula is an agentic TLA+ pipeline standing on the same three legs Polygraph does β spec generation, model checking, trace validation. Its paper reports 249 bugs across 48 projects (MongoDB, Etcd, ScyllaDB, GCC libgomp, LLVM libomp), 207 previously unknown, 68 confirmed and 24 fixed upstream, at a median of $57 and 3.7 hours per system. The convergent finding is the one that matters: the LLM alone is not trustworthy, but an LLM held accountable by a model checker and trace validation is a practical bug-finder.
Where Specula is ahead of Polygraph's audit engine, plainly:
The difference is not that Polygraph audits better. It is that auditing is
one engine of several here, and Specula has no authoring, no CI gate, no
runtime, and no versioning β its paper states specs are generated from a
snapshot and must be regenerated when the code changes. At $57 and 3.7 hours
per system it structurally cannot run on every merge request; Polygraph's
model check and replay are keyless and deterministic, which is what makes
polygate possible. Different bet, different slot. If your problem is deep
bugs in a large concurrent or distributed system written in C, C++, Go, Rust,
Java, or Erlang, use Specula β that is what it is for, and it is good at
it.
The five engines share one artifact family, so what one produces the next can consume: Polygraph audits (this document), polygen authors, polyrun executes, polyvers evolves, polynv elicits the rules they all check against.
Deep dives:
docs/ARCHITECTURE.mdβ how the five engines fit together;docs/SDLC.mdβ a team lifecycle for integrating them into agentic workflows, with the human gates spelled out;docs/polyrun-spec.mdβ the durable-execution harness specification;docs/VERSIONING.mdβ an essay on why versioning state machines is hard and how the gates here make compatibility a checked property instead of a review vibe. Each doc has interactive diagrams inline; browse them all atdocs/diagrams/index.dc.html.
Everything revolves around three artifacts you can read and diff:
A contract (contract.json) β what's observable: the state fields
that matter, the actions the machine accepts, the data each action can
carry, which states are terminal. This is the scope of the audit.
A spec β an executable model of your code, written by an LLM from your
source. By default it's a strict, self-describing state-machine module
(the SAM pattern v2 strict profile): every action it
ignores must say why (reject(reason)), it can't hide bookkeeping
state, and it declares its own action/data domains β so the model checker
knows exactly what to explore with zero configuration. Several specs are
generated independently and vote, so one bad generation doesn't decide the
outcome.
Invariants (invariants.mjs) β your rules, as plain JS functions over
a state: "never charged without a confirmed transaction", "an expired
session can't accept input." These encode your intent, which is the
one thing no tool can derive from the code β code with a bug is a faithful
description of the wrong behavior.
Then two checks run:
Check 1 β replay (is the spec faithful?). Real execution traces β
captured by wrapping your dispatch/reducer once, so every step logs a
{pre, action, data, post} window β are replayed against each spec. Before
any generated spec is trusted, controls run: a hand-written reference spec
must score 100% and a deliberately mutated one must fail, proving the harness
can actually tell good from bad. Disagreements are triaged into
spec-errors (the LLM misread the code), code-findings (the code
disagrees with an independent reading of itself β investigate), and
contract-errors (the contract mis-scoped the problem).
Check 2 β model check (where the bugs are). The faithful spec is iterated exhaustively from its initial state against your invariants. This is the step that finds what tests miss: replay can only flag a bug when spec and code disagree, and a faithful spec reproduces the bug right along with the code. Model checking reaches the bad state anyway and prints the shortest path to it. Every check also runs a determinism double-pass for free.
The checker enumerates a finite (action, data) domain declared in the
contract (or inferred from traces) and visits every state reachable from
init over that domain. So the precise coverage claim is: state machines
expressible in the SAM v2 strict profile with finite declared domains β
control-dominated logic (order workflows, auth lockouts, approval flows)
whose data can be finitized to representative values. It is not "arbitrary
state machines": a machine whose behavior depends on unbounded counters,
amounts, or strings is checked only at the representative values someone
declared. Finitizing data this way is the classic, defensible modeling move β
it is exactly what TLA+ users do with model bounds β but the abstraction gap
between the declared domain and real data is where bugs can hide, and no
current gate measures that gap. Choosing domain values that exercise every
boundary the code branches on (and re-checking the contract when the code
grows a new branch) is human judgment, on the same footing as writing the
invariants. One mitigation is built in: the domain cross-check that catches
contract/code vocabulary mismatches
(examples/case-study-polygen-domain-gap.md)
β but it checks spelling agreement, not representativeness. The other
half of the judgment β whether the invariants you wrote are strong β now
has a partial measure: polynv's mutation adequacy grade
(polynv/README.md) reports how many behaviorally
distinct machine mutations your rule set kills, with its own blind spot
stated (behavior-removing mutations largely evade safety invariants).
The domain-representativeness gap itself remains unmeasured.
polygen runs the same machinery in reverse: draft contract β author
module β propose invariants β model-check β self-repair on violations (capped
at --repair-max rounds; a non-converging run is reported as NOT converged,
never silently presented as clean) β synthesize and independently replay a
trace corpus. It also cross-checks that contract and code agree on their
action/data vocabulary, because the two come from independent model calls β
examples/case-study-polygen-domain-gap.md
shows a real run where a silent enum-spelling mismatch collapsed the
explorable state space, and how the check caught it.
polygen output is JS/TS only: the generated module is directly usable in a JS/TS codebase; porting a verified model to another language would need its own differential check and is out of scope.
| step | who does it | how long |
|---|---|---|
| Define the contract (observable fields, actions, terminals) | you, or Claude drafts it for your review | minutes |
| Capture traces (instrument a copy, drive scenarios) | the agent, in Claude Code β it builds test doubles/emulators if needed; standalone, you wrap your dispatch once (snippet below) | the bulk of the work standalone; delegated in Claude Code |
| Write invariants (your rules as JS predicates) | you β this is your intent; the tool can propose, only you can confirm | minutes per rule |
| Generate specs, replay, model-check | automatic | minutes |
| Triage findings | you β every finding is a lead, not a verdict | depends on what it finds |
Trace capture is historically what made this kind of verification expensive, and it's the step the agent now carries: in the origin study, a Claude agent built a payment-terminal emulator and a fault-injection proxy, instrumented a production payment workflow, drove 17 scenarios, and produced a 75-window corpus autonomously. What stays with you is judgment: confirming the contract covers the right state, and sanity-checking any doubles the agent built against reality.
One hard prerequisite: the code must be runnable in isolation, because traces are ground truth captured from the code actually executing. If it has a clean step boundary (a dispatch, reducer, or handler), you're set. If it only runs against a DB/network/device, stand up doubles first (or let the agent do it). If it can't run at all, replay degenerates to checking specs against your expectations, which can't find code bugs.
Wrapping the boundary standalone is one line per scenario:
import { withTracing } from '<plugin>/scripts/instrument/trace-emitter.mjs';
// project ONLY the contract's observable keys:
const project = () => ({ txState: m.txState, orderId: m.orderId });
const dispatch = withTracing(rawDispatch, project, 'traces/s1_normal.ndjson');
// Redux-style reducer: tapReducer(...) Β· SAM component: withSamTracing(...) β see scripts/instrument/
Only spec generation, code authoring, and polynv's optional
headless --llm harvest call the Anthropic API. Everything that
checks, replays, explores, elicits, grades, or drift-checks runs locally
on Node β₯ 20.
| task | command | API key? | why |
|---|---|---|---|
| Try the quickstart / run the test suite | npm test | no | replays bundled specs against bundled traces |
| Validate a trace corpus | validate_corpus.mjs | no | local schema/shape checks |
| Replay saved specs against traces | verify.mjs --specs β¦ | no | pure local execution |
| Model-check a spec against invariants | check.mjs | no | exhaustive local exploration |
| Escalate to TLA+/TLC | verify.mjs --tla | no | mechanical transpile + local TLC (needs Java + tla2tools.jar via POLYGRAPH_JAVA / POLYGRAPH_TLA_JAR) |
| Elicit / grade / drift-check invariants (polynv) | polynv/bin/polynv.mjs harvest|grade|driftβ¦ | no | templates, miners, pre-checks, mutation grade β all local exploration |
| Generate specs from source | verify.mjs --source β¦ --model β¦ | yes (ANTHROPIC_API_KEY) | the LLM writes the specs |
| Author new code (polygen) | polygen.mjs --intent β¦ --model β¦ | yes (ANTHROPIC_API_KEY) | the LLM drafts contract, code, and invariants |
| Headless LLM harvest (polynv) | polynv β¦ harvest --llm --model β¦ | yes (ANTHROPIC_API_KEY) | the LLM proposes domain priors + code-reading candidates (in a Claude Code session this source needs no key β the assistant supplies it) |
This applies inside Claude Code too: the skills and subagents shell out to
these same scripts, so the generate and polygen steps need
ANTHROPIC_API_KEY set in your environment β your Claude Code session
credentials are not used for them.
As a Claude Code plugin (this repo is its own marketplace):
/plugin marketplace add cognitive-fab/polygraph
/plugin install polygraph@polygraph
Or clone directly: git clone https://github.com/cognitive-fab/polygraph ~/.claude/plugins/polygraph.
Update later with /plugin marketplace update polygraph. Requires Node β₯ 20.
No npm install is needed for the core loop: the SAM runtime is vendored
(scripts/vendor/sam-pattern.cjs, resolved through scripts/sam-lib.mjs), and
the two npm dependencies are each used by exactly one optional path β acorn
by the --tla escalation tier, pg by polyrun's Postgres store.
Everything here works in the Claude Code VS Code extension as well as the
terminal β the extension bundles the same CLI, runs locally with the same
filesystem and shell access, and shares ~/.claude/settings.json with the CLI,
so a plugin installed on one surface is available on the other.
Type /plugin in the prompt box and select Manage plugins, then:
https://github.com/cognitive-fab/polygraph
and hit Add. (The field says "GitHub repo, URL, or pathβ¦", but the
owner/repo shorthand that works in the terminal may not be accepted
here β the full GitHub URL always is.)polygraph appears under Available β
Install, and pick a scope: for you (all projects), for this
project (shared with collaborators), or locally (just you, just this
repo)Two things behave differently from the terminal, and both look like a broken plugin if you hit them cold:
ANTHROPIC_API_KEY may not reach the extension. VS Code does not
reliably inherit your shell environment, so the key that works in your
terminal can be invisible to the extension β and the generation steps above
need it. Set it in the env block of ~/.claude/settings.json (shared by
both surfaces, so it is the one place worth doing this), or launch VS Code
from a terminal with code ., or use the claudeCode.environmentVariables
extension setting. Everything in the no-key half of the table above β
--specs replay, check.mjs, polyvers, polynv, polyrun, polyviz, the
controls β is unaffected.Ctrl+`) for those:
node scripts/verify.mjs β¦ works there directly, and everything in
Use it as a plain CLI applies
unchanged.Then just ask in plain language β "verify this state machine", "does this code do what I think it does?", "write a verifiable checkout flow", "what invariants should this machine have?" β or use the entry points directly:
| you type | what it is | when to use it |
|---|---|---|
/polygraph:polygraph | audit skill | guided end-to-end audit β Claude designs the contract, captures traces, runs controls, triages with you |
/polygraph:verify | audit command | you already have contract + traces; just run generate + replay |
polygraph-verifier | audit subagent | hand off the whole audit for an autonomous run |
/polygraph:polygen | author skill / command | write a NEW verified state machine from a feature description |
polygen | author subagent | hand off the whole authoring loop |
/polygraph:polyvers | version skill / command | gate a machine version change against the fleet: lanes, migrations, stimuli, seeded model check (no API key) |
polyvers | version subagent | hand off the whole compatibility check + migration scaffold |
polyrun | execute CLI | run a verified machine durably β state, effects, timers, children β and keep checking it in production (no API key) |
/polygraph:polynv | elicit skill / command | find the invariants themselves: harvested + pre-checked candidates, domain priors, a plugin-led interview, a mutation grade of the result (no API key) |
polynv | elicit subagent | prepare the interview autonomously (harvest, pre-check, grade, ranked questions) β the interview itself stays with you |
# replay saved specs (no API key)
node scripts/verify.mjs --contract contract.json --traces traces/ --specs specs/ --out out/
# generate + replay (needs ANTHROPIC_API_KEY)
node scripts/verify.mjs --contract contract.json --source src/machine.ts \
--traces traces/ --model opus-5 --n 5 --out out/
# validate a corpus (no API key)
node scripts/validate_corpus.mjs contract.json traces/
# escalate the winning spec to TLC (no API key; needs Java toolchain)
POLYGRAPH_JAVA=/path/to/java POLYGRAPH_TLA_JAR=/path/to/tla2tools.jar \
node scripts/verify.mjs --contract contract.json --traces traces/ --specs specs/ --tla --out out/
# elicit invariants: harvest candidates, then grade the confirmed set (no API key)
node polynv/bin/polynv.mjs harvest --artifacts <machine-dir> --traces traces/
node polynv/bin/polynv.mjs questions --artifacts <machine-dir> # ranked, pre-checked; answer via `record`
node polynv/bin/polynv.mjs grade --artifacts <machine-dir> --include-invariants
# author NEW verifiable code (needs ANTHROPIC_API_KEY)
node scripts/polygen.mjs --intent "<feature description>" --model opus-5 --out out/
# gate a version change against the live fleet (no API key)
node polyvers/bin/polyvers.mjs check --old machines/v1 --new machines/v2 --snapshots archive/
# run it durably, and keep checking it in production (no API key)
node polyrun/bin/polyrun.mjs deploy --config polyrun.config.mjs
node polyrun/bin/polyrun.mjs check-product --config polyrun.config.mjs --parent order \
--invariants invariants.compose.mjs
node polyrun/bin/polyrun.mjs audit --config polyrun.config.mjs
polygen writes everything to <out>/: contract.json, next.cjs (the
module), invariants.mjs, traces/*.ndjson, and polygen-report.md. The
handoff after a polygen run is deliberately manual: review the contract and
invariants (they're the model's reading of your intent, not ground truth),
wire the module into your real handler β call it, don't reimplement it β then
run /polygraph:verify against traces captured from the integrated code.
That last step catches drift between the pure model and the glue around it.
There is no default model β pass --model. Recommended: opus-5 or
better β deriving a faithful transition-function spec is a hard reasoning task,
and lighter models (e.g. sonnet-5) are not powerful enough for it.
The recommendation is per-step (RECOMMENDED_MODELS in scripts/models.mjs;
full analysis in docs/opus5_consolidated_report.md).
The split from the 2026-07-24 study: on reading code, opus-5 beat fable-5
outright at half the price; on one-shot formal authoring with no retry,
fable-5 was ahead β and the gap closes as soon as a repair loop feeds
checker errors back.
| step | recommended | why |
|---|---|---|
verify (spec derivation) | opus-5 | 5/5 seeded bugs, 0 false alarms on the 8-machine A/B; fable-5 also 5/5 but 1 false alarm, at 2Γ the price |
polygen (repair loop on, the default) | opus-5 | its authoring misses were one-line syntax habits the repair loop fixes in one round |
polygen --repair-max 0 (one-shot) | fable-5 | passed the model checker cold where opus-5 went 1/5 first-try (suggestive β single fable-5 sample) |
| polynv headless harvest | opus-5 | candidates are mechanically pre-checked downstream, so the retry-regime logic applies |
| polyvers / polyviz / polyrun | β | no model calls |
| alias | resolves to | notes |
|---|---|---|
opus-5 | claude-opus-5 | recommended for every step with a retry/repair loop; use this or a newer Opus |
fable-5 | claude-fable-5 | recommended only for one-shot formal authoring (no retry); strongest in the origin study |
opus-4.8 | claude-opus-4-8 | previous recommendation; still strong β and the refusal fallback (see below) |
sonnet-5 | claude-sonnet-5 | available, but underpowered for spec derivation β not recommended |
opus-5 measured on the 8-machine A/B (eval/ab-v2.mjs, 2026-07-24, n=3):
5/5 seeded bugs detected, 0 false alarms, 0 dead specs β all five detections at
the model-check tier rather than the cheaper replay tier, so budget for the
exhaustive pass. One caveat, seen only on the legacy bare-next prompt: the API
refused two of the eight machines (stop_reason: refusal, category: cyber)
because their source comments describe a payment-guard bypass. opus-4.8 and
sonnet-5 did not refuse the same input, and the default v2 prompt was
unaffected β but if a refusal costs you a run, that is the fallback to reach
for.
Anything not in the alias table (scripts/models.mjs) is passed to the API
verbatim, so an exact Anthropic model id always works. Reasoning models spend
output tokens on thinking before the answer; if you lower --max-tokens from
the default 32000 and see empty specs (stop_reason: max_tokens), raise it
back.
examples/turnstile-v2/, no API key):
npm test validates the corpus and runs the positive/negative controls;
npm run verify:turnstile-v2 replays the bundled specs.examples/case-study-subscription.md): a real
end-to-end run on a closed-source SaaS billing machine that corroborated a
genuine double-charge bug β plus an honest look at the risks the method
can't see (external-service boundaries).examples/polygen-otp/): authored from one
sentence; 8 states, 0 violations, a 134-window synthesized corpus, 0
independent-replay failures.examples/polygen-cart-checkout/, narrated in
examples/case-study-polygen-domain-gap.md): the contract/code vocabulary
mismatch that motivated the domain cross-check, including a false positive
the fix introduces.examples/etcd-raft-v2/): a v2 spec + invariants
exercising the TLA+ escalation..claude-plugin/plugin.json plugin manifest
skills/ the methods, as instructions Claude follows:
polygraph (audit), polygen (author),
polyvers (version), polynv (elicit)
commands/ /polygraph:verify, :polygen, :polyvers, :polynv
agents/ polygraph-verifier, polygen, polyvers, polynv subagents
scripts/ the shared core: sam-tv.mjs (replayer),
check.mjs (model checker), to-tla.mjs +
tla-check.mjs (TLC tier), verify, generate,
polygen, validate_corpus, models,
vendor/sam-pattern.cjs, instrument/*
polyrun/ durable execution engine (README.md)
polyvers/ versioning engine (README.md)
polynv/ invariants-elicitation engine (README.md)
templates/ contract.schema.json + contract.example.json
examples/ worked examples and case studies (see above)
eval/ the seeded-bug A/B eval and findings
test/ npm test β no API key needed
Engine introductions: docs/polygen.md Β·
polyrun/README.md Β·
polyvers/README.md Β·
polynv/README.md. The audit engine (Polygraph
itself) is this document.
The method is introduced in:
Jean-Jacques Dubray. Can Code Specify a System Precisely Enough to Formally Verify It? arXiv:2607.05076, July 2026. https://arxiv.org/abs/2607.05076
The 2.0 release gate: a seeded-bug A/B eval passing at parity or better at two model tiers, with two bugs newly caught at the cheap replay tier and zero dead specs.
SysMoBench (v3, January 2026) grades a generated specification in four phases, the decisive one replaying execution traces captured from the running system. Three things worth stating plainly:
SysMoBench-1 below is our own fork.
Neither fact is disqualifying; both should be visible.https://github.com/jdubray/SysMoBench-1 is our own fork, not an independent evaluation of Polygraph.
Related work: Emilie Ma, Scaling formal methods with LLMs (Berlin Buzzwords), which presents SysMoBench and Specula together and reaches the same conclusion from the formal-methods side: model checking plus trace validation is what makes LLM-generated specs trustworthy.
If you use Polygraph in your work, please cite the paper (see CITATION.cff).
Polygraph 1.x derived a bare next(state, action, data) function instead of
the strict SAM v2 module. That pipeline remains available end-to-end behind
--legacy-bare-next for one release (npm run test:legacy,
npm run verify:turnstile). The v2 strict profile replaced it because it
closes whole failure classes by construction β silent no-op specs, hidden
bookkeeping state, vacuous exploration β while the N-spec voting layer absorbs
what v2 gives up. The one discipline sentence the study showed carried
bare-next's replay robustness is kept verbatim in the v2 prompts. (The repo's
historical disk name, bare-next-verify, records this lineage.)
Apache-2.0 β see LICENSE.
.claude-plugin/
marketplace.json
plugin.json
.gitignore
agents/
polygen.md
polynv.md
polyvers.md
verifier.md
assets/
polygraph-architecture.png
polygraph-verify.jpg
vscode-marketplaces-tab.png
vscode-open-manage-plugins.png
vscode-plugins-tab.png
CHANGELOG.md
CITATION.cff
commands/
polygen.md
polynv.md
polyvers.md
verify.md
docs/
ARCHITECTURE.md
capture-plan.md
composition-plan.md
composition-semantics.md
diagrams/
architecture-01-five-engines.dc.html
architecture-02-artifact-family.dc.html
architecture-03-polygraph-audit.dc.html
architecture-04-polygen-author.dc.html
architecture-05-polyvers-evolve.dc.html
architecture-06-polynv-elicit.dc.html
architecture-07-polynv-grade.dc.html
index.dc.html
polyrun-01-runtime.dc.html
polyrun-02-dispatch.dc.html
polyrun-03-effects-loop.dc.html
sdlc-01-lifecycle.dc.html
sdlc-02-division-of-labor.dc.html
sdlc-03-failure-playbook.dc.html
sdlc-04-entry-points.dc.html
sdlc-05-flow.dc.html
sdlc-flow.mermaid
support.js
thumbs/
architecture-01-five-engines.png
architecture-02-artifact-family.png
architecture-03-polygraph-audit.png
architecture-04-polygen-author.png
architecture-05-polyvers-evolve.png
architecture-06-polynv-elicit.png
architecture-07-polynv-grade.png
index.png
polyrun-01-runtime.png
polyrun-02-dispatch.png
polyrun-03-effects-loop.png
sdlc-01-lifecycle.png
sdlc-02-division-of-labor.png
sdlc-03-failure-playbook.png
sdlc-04-entry-points.png
sdlc-05-flow.png
versioning-01-taxonomy.png
versioning-02-four-versions.png
versioning-03-migration.png
versioning-01-taxonomy.dc.html
versioning-02-four-versions.dc.html
versioning-03-migration.dc.html
fleet-study-plan.md
opus5_consolidated_report.md
polygen.md
polygraph-paper-submitted.pdf
polygraph-paper.pdf
polygraph-paper.tex
polynv-plan.md
polyrun-spec.md
polysec-spec.md
polyvers-plan.md
polyviz-spec.md
SDLC.md
tier3-protocol.md
verify-enhancements-plan.md
VERSIONING.md
eval/
AB-V2-RESULTS.md
ab-v2.mjs
check-eval.mjs
FINDING-faithful-reproduction.md
FINDING-hatchet-reject-annotation.md
FINDING-n8n-reject-no-write.md
FINDING-raft-field-study.md
FINDING-xstate-union-schema.md
fleet-study/
tier1/
cases.mjs
README.md
results.json
results.md
run.mjs
tier2/
adjudication.md
README.md
results.json
results.md
run-versions.mjs
tier3/
FINDINGS.md
pair-a/
make-fleet.mjs
RESULTS.md
v2.4.0/
contract.json
invariants.mjs
next.cjs
VALIDATION.md
v2.5.0/
contract.json
invariants.mjs
migrate.cjs
next.cjs
pair-b/
RESULTS.md
v2.17.1/
contract.json
invariants.mjs
next.cjs
VALIDATION.md
v2.17.2/
contract.json
invariants.mjs
migrate.cjs
next.cjs
README.md
lib/
drive.mjs
machines/
m01-subscription-renewal/
contract.json
gen-traces.mjs
ground-truth.json
invariants.mjs
reference.cjs
source.cjs
m02-auth-lockout/
contract.json
gen-traces.mjs
ground-truth.json
invariants.mjs
reference.cjs
source.cjs
m03-job-queue/
contract.json
gen-traces.mjs
ground-truth.json
invariants.mjs
reference.cjs
source.cjs
m04-doc-approval/
contract.json
gen-traces.mjs
ground-truth.json
invariants.mjs
reference.cjs
source.cjs
m05-payment-capture/
contract.json
gen-traces.mjs
ground-truth.json
invariants.mjs
reference.cjs
source.cjs
m06-traffic-light/
contract.json
gen-traces.mjs
ground-truth.json
invariants.mjs
reference.cjs
source.cjs
m07-cart/
contract.json
gen-traces.mjs
ground-truth.json
invariants.mjs
reference.cjs
source.cjs
m08-conflict-oos/
contract.json
gen-traces.mjs
ground-truth.json
invariants.mjs
reference.cjs
source.cjs
mechanism-eval.mjs
README.md
skill-ab.mjs
sysmobench/
etcd/
.gitignore
check-verdict.mjs
gen/
contract.json
results.json
spec-1.cjs
spec-2.cjs
spec-3.cjs
spec-4.cjs
spec-5.cjs
harness/
go.mod
go.sum
main.go
map-traces.mjs
mutate.mjs
README.md
score-generated.mjs
examples/
case-study-polygen-domain-gap.md
case-study-subscription.md
etcd-raft-v2/
contract.json
invariants.mjs
spec.cjs
fleet-study-stripe/
.gitignore
capture/
capture.mjs
stripe-map.mjs
machines/
subscription-v1/
contract.json
invariants.mjs
next.cjs
subscription-v2-addition/
contract.json
invariants.mjs
next.cjs
subscription-v2-dunning/
contract.json
invariants.mjs
migrate.cjs
MIGRATION-NOTE.md
next.cjs
subscription-v2-shape/
contract.json
invariants.mjs
migrate.cjs
MIGRATION-NOTE.md
next.cjs
README.md
polygen-cart-checkout/
contract.json
invariants.mjs
next.cjs
polygen-report.md
README.md
traces/
authorize_declined.ndjson
authorize_error.ndjson
authorize_noop_after_authorized.ndjson
capture_first_attempt_declined_then_retry_success.ndjson
capture_first_attempt_error_then_retry_success_diff_key.ndjson
capture_first_attempt_success_k2.ndjson
capture_idempotent_diff_key_after_captured.ndjson
capture_idempotent_diff_result_after_captured.ndjson
capture_idempotent_same_key_after_captured.ndjson
capture_retry_from_error_same_key.ndjson
dunning_multi_retry_loop.ndjson
expired_false_noop_from_captured.ndjson
expired_false_noop_from_idle.ndjson
expired_false_noop_from_reserved.ndjson
expiry_window_after_false_then_true.ndjson
expiry_window_from_authorized.ndjson
expiry_window_from_reserved.ndjson
noop_authorize_before_reservation.ndjson
noop_capture_before_authorization.ndjson
noop_capture_from_idle.ndjson
normal_path_full_capture.ndjson
partial_rollback_direct.ndjson
partial_rollback_then_capture_noop.ndjson
partial_rollback_then_expiry_noop.ndjson
reservation_failed_result_failed.ndjson
reserve_only_from_idle_after_authorized.ndjson
reserve_only_from_idle_after_reserved.ndjson
reserve_only_from_idle_after_terminal_failure.ndjson
polygen-otp/
contract.json
invariants.mjs
next.cjs
polygen-report.md
README.md
traces/
dunning_retry_loop.ndjson
expired_never_verifies_attempts0.ndjson
expired_never_verifies_attempts1.ndjson
expired_never_verifies_attempts2.ndjson
expired_no_penalty_match_false.ndjson
expired_no_penalty_match_true.ndjson
expired_no_penalty_match_undefined.ndjson
issue_resets_from_locked.ndjson
issue_resets_from_no_code.ndjson
issue_resets_from_pending.ndjson
issue_resets_from_verified.ndjson
live_match_verifies_from_attempts0.ndjson
live_match_verifies_from_attempts1.ndjson
live_match_verifies_from_attempts2.ndjson
live_mismatch_first.ndjson
live_mismatch_second.ndjson
live_mismatch_third_locks.ndjson
lock_threshold_after_reset_relock.ndjson
lock_threshold_direct.ndjson
lock_threshold_with_expired_interspersed.ndjson
locked_blocks_verification_expired.ndjson
locked_blocks_verification_match_false.ndjson
locked_blocks_verification_match_true.ndjson
noop_attempt_locked.ndjson
noop_attempt_no_code.ndjson
noop_attempt_verified.ndjson
normal_path.ndjson
unknown_action_noop.ndjson
polygraph-oms-go/
contract.json
controls/
controls-shipment/
mutant.js
mutant.js
harness/
go.mod
go.sum
main.go
shipment.go
invariants.mjs
README.md
results/
results-generated/
findings.json
findings.md
specs/
spec_0.js
spec_1.js
spec_2.js
results-mutant/
findings.json
findings.md
results-shipment/
results-shipment-generated/
findings.json
findings.md
specs/
spec_0.js
spec_1.js
spec_2.js
results-shipment-mutant/
findings.json
findings.md
findings.json
findings.md
findings.json
findings.md
shipment-contract.json
shipment-invariants.mjs
source/
api-excerpt.go.txt
shipment-workflows.go
UPSTREAM-LICENSE
workflows.go
specs/
specs-shipment/
reference.js
reference.js
traces/
traces-shipment/
t1_normal_progression.ndjson
t2_direct_delivery_skips_dispatch.ndjson
t3_status_regression.ndjson
t4_bogus_carrier_status.ndjson
t5_duplicate_update.ndjson
t6_regression_to_pending_then_onward.ndjson
s1_happy_two_fulfillments.ndjson
s2_amend_then_complete.ndjson
s3_customer_cancel.ndjson
s4_customer_timeout.ndjson
s5_charge_declined_single.ndjson
s6_charge_error_single.ndjson
s7_partial_shipment_failure.ndjson
s8_all_unavailable_amend_completes_empty.ndjson
s9_both_charges_fail_order_failed.ndjson
polynv-oms/
order/
contract.json
effects.cjs
effects.manifest.json
intent-ledger.json
INTENT-LOG.md
invariants.mjs
next.cjs
README.md
polyrun-oms/
bin/
oms-server.mjs
... 463 moreΒ© 2026 Flowy Β· Free and open source
Built for Claude Code Β· Not affiliated with Anthropic