# seedfall # Documentation seedfall runs your Go system in a simulated world, breaks it on purpose (crashes, lost messages, half-written files), and lets you replay any failure exactly. These pages are grouped by what you want to do. If you are new, read the first one and stop there for now. ## Start here - [Getting started](getting-started.md): find, shrink, fix and prove a real bug in about five minutes, using an example that is included. - [Installing seedfall](install.md): every way to install it, and how to check the install worked. - [FAQ](faq.md): short answers, such as how seedfall differs from other tools and what it cannot test. - [Troubleshooting](troubleshooting.md): look up an error message and see how to fix it. ## Find a bug - [Networking](networking.md): let your nodes talk to each other inside the simulation. - [Properties and checks](properties.md): write the statements your system must keep true, such as "an acknowledged write is never lost". - [Storage engines that need mmap or flock](compat.md): test databases such as bbolt, pebble and badger. - [Config files, profiles and seeded disks](config.md): keep several test setups in one file and start nodes from an existing disk. - [Feedback-guided exploration](explore.md): hunt for bugs that need two rare events in one run. - [BUGGIFY](buggify.md): mark places in your own code where seedfall may force a rare path. - [Mutation testing your checks](mutate.md): find out whether your checks would notice a real bug. - [Running Antithesis SDK code](antithesis.md): run programs that already use the Antithesis Go SDK. - [Use your Gostman collections as workloads](gostman.md): reuse API checks you already wrote. ## Understand a failure - [Timelines, logs and time-travel debugging](timeline.md): see a failing run as a diagram, a filtered log or a step-by-step debugger. - [Causality analysis](cause.md): find which fault actually made a seed fail. - [Inspecting the disk at the moment of failure](inspect.md): see which bytes were saved and which a crash would lose. - [Proving a fix with `seedfall verify`](verify.md): show that a fix works, and pin the bug so it cannot come back. - [Triage reports](reports.md): group many failing seeds into a short list of bugs. ## Use in CI - [Running seedfall in CI](ci.md): the GitHub Action, machine-readable output, time limits and `go test`. - [Using seedfall from AI coding agents](agents.md): the MCP server and skills that let an agent run seedfall for you. ## Reference - [Configuration and faults](faults.md): every `seedfall.json` field and every fault seedfall can inject. - [Properties, linearizability and determinism](properties.md): the full `sim` API for checks. - [Triage reports](reports.md): findings, classification, failure artifacts, notifications and utilization. - [Troubleshooting](troubleshooting.md): the error catalog, keyed by exact message. - [How seedfall works](how-it-works.md): the simulated clock, the disk and network models, checking, shrinking and speed. - [Testing seedfall itself](testing.md): what the project's own tests prove. - [Findings](findings/README.md): bugs seedfall found in open-source projects, with replay commands. ## About the project - [Contributing](../CONTRIBUTING.md): development setup, tests and commit style. - [Roadmap](../ROADMAP.md): what is planned and what is not done yet. - [Security policy](../SECURITY.md) and [code of conduct](../CODE_OF_CONDUCT.md). # Using seedfall from AI coding agents This page is for people who let an AI coding agent, such as Claude Code, Cursor or Codex, do the testing work. seedfall can talk to the agent directly through an MCP server (a standard way for an agent to call tools) and ships skills (step-by-step instructions the agent follows). Use it to let the agent find a bug, shrink it, fix it and prove the fix. `seedfall mcp` serves seedfall's core operations over the [Model Context Protocol](https://modelcontextprotocol.io) on stdio. An agent such as Claude Code, Cursor or Codex can then sweep seeds, replay a failure and shrink it on its own, then use the exact fault schedule and trace to fix the bug and prove the fix. No API key and no hosted service are involved: the agent you already use does the reasoning. ## Setup Install the binary first. Every integration below runs it: ```sh go install github.com/kunalgoesbyken/seedfall/cmd/seedfall@latest ``` ### Skills The skills follow the [Agent Skills](https://agentskills.io/specification) format, so any agent that reads `SKILL.md` files can use them. To install them with the [`skills` CLI](https://github.com/vercel-labs/skills): ```sh npx skills add kunalgoesbyken/seedfall ``` ### MCP server Claude Code: ```sh claude mcp add seedfall -- seedfall mcp ``` Cursor, or any client that reads an `mcpServers` file: ```json { "mcpServers": { "seedfall": { "command": "seedfall", "args": ["mcp"] } } } ``` Config paths in tool calls are resolved against the server's working directory, which is normally your project root. Every tool that takes `config` also takes an optional `profile` and a `set` list of `path=value` overrides, the same as `-profile` and `-set` on the command line ([config.md](config.md)). ## Tools | Tool | Arguments | Returns | |---|---|---| | `seedfall_init` | optional `dir`, `config`, `nodes`, `workload`, `dry_run` | The module's `main` packages and which become nodes, the packages that block a `GOOS=wasip1` build (compile errors and cgo, each with its import chain and the shim that covers it), `compat_shims` for every dependency `compat_overlay` would swap, the starter config and its starter profiles, the files written, and the next steps. See [onboarding](#onboarding-a-new-module) | | `seedfall_run` | `config`, `seeds` (for example `1-200`), optional `rotate`, `check`, `skip_pinned`, `until_novelty`, `batch`, `timeout` | First the [pinned regressions](verify.md#pinned-regressions), stopping at one that fails again. Then seeds passed, the lowest failing seed with its reason, [classification](reports.md#classification), the faults before the failure, the trace tail, a replay command and `artifacts_dir` ([failure artifacts](reports.md#failure-artifacts)), plus property coverage, `seeds_per_second`, `virtual_seconds_per_wall_second` and `utilization` ([reports.md](reports.md#utilization)), and, with `faults.buggify` on, `buggify_sites` ([buggify](buggify.md#coverage)). With `until_novelty`, `stopped` and the `exploration` growth table ([explore.md](explore.md#stopping-a-plain-sweep)) | | `seedfall_explore` | `config`, optional `seeds`, `rounds`, `batch`, `until_novelty`, `budget`, `explore_seed`, `keep_going`, `corpus` | Feedback-guided search: every round with the new signals and functions it added, the stop reason, the corpus size, property coverage, throughput, and the first failure with `artifacts_dir` and a replay command ([explore.md](explore.md)) | | `seedfall_replay` | `config`, `seed`, optional `faults` file | The same failure view for one seed, or the trace tail if it passes, with a `note` when a shrunk schedule's shorter duration ended the run before the workload finished. A failure view of a run that recorded operations also names its `history_file` and, on a linearizability violation, its `timeline_file`. Every result has the run's `determinism_hash` and its `events` from `sim.Event` or `lifecycle.SendEvent` | | `seedfall_logs` | `config`, `seed`, optional `faults`, `node`, `grep`, `from`, `to`, `net_trace`, `limit` | The run's trace lines filtered by node, regular expression and virtual time, each with its node, instance and time, and a node's slog JSON output parsed into `fields`, plus how many lines matched ([timeline.md](timeline.md#logs)) | | `seedfall_trace_search` | `config`, `seed`, `pattern`, optional `faults`, `context` (default 3), `node`, `from`, `to`, `net_trace`, `limit` | Each line that matches the regular expression (on the given nodes, inside the virtual time window) with `context` trace lines of every node before and after it, as windows of numbered lines with their virtual time, node and instance, overlapping windows merged, plus how many lines matched ([timeline.md](timeline.md#searching-the-trace)) | | `seedfall_debug` | `config`, `seed`, optional `faults`, `at`, `net_trace`, `commands` | Replays to `at`, runs each debugger command (`where`, `net`, `faults`, `ls`, `stat`, `cat`, `step`, `until `, `to