> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getasym.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Seeding

> Deterministic fixtures vs AI-generated data, and when to use each.

A fresh clone is empty. **Seeding** puts it into a known starting state so your
agent run begins from the same place every time. asymmetric has two ways to seed,
and you can use both.

## Fixtures — deterministic and reproducible

A fixture is a named pack of SQL applied directly to the clone's database. Same
fixture, same rows, every time. This is what you want for **scored, repeatable**
evals.

```bash theme={null}
asymmetric seed slack-a1b2 --fixture acme-corp
```

Or seed on spin in one step:

```bash theme={null}
asymmetric spin slack --seed acme-corp
```

Available fixtures come from the template's `seed.fixtures` glob (`./seeds/*.sql`).
`acme-corp` is the bundled Slack example. Every template supports fixtures.

## AI seeding — realistic and varied

AI seeding asks an LLM for a dataset, then **creates it through the clone's REST
API** — not by injecting SQL. That means every record goes through real signup,
real auth, and real validation, so the data is referentially sound the same way a
human using the product would produce.

```bash theme={null}
asymmetric seed slack-a1b2 --ai
```

The generator produces a **Slack-shaped** workspace (workspaces, channels,
messages) and drives the Slack API to create it — so AI seeding targets the Slack
clone today. For the other templates, use fixtures.

Set `ANTHROPIC_API_KEY` to enable it; without the key, `--ai` is skipped with a
warning rather than failing. The model is **`claude-haiku-4-5`**.

What it does, in order:

<Steps>
  <Step title="Generate">
    Claude returns a dataset: a workspace, users, channels, and messages.
  </Step>

  <Step title="Sign up + create">
    The first user signs up and creates the workspace; remaining users sign up
    and join.
  </Step>

  <Step title="Channels + messages">
    Channels are created and joined, then messages are posted as their authors.
  </Step>

  <Step title="Count">
    Written and rejected records are tallied. Rejections are best-effort — a few
    bad records don't fail the whole seed; up to five warnings are shown.
  </Step>
</Steps>

```
  ✓ seeded slack-a1b2  (ai: 20 (0 rejected))
    ! signup alice-0: 409 conflict
```

### Default volumes

The default brief is *"a small, fast-moving software startup."* The generation
volume sets the size — `medium` is the default:

| Volume             | Users | Channels | Messages |
| ------------------ | ----- | -------- | -------- |
| `small`            | 4     | 3        | 12       |
| `medium` (default) | 6     | 4        | 20       |
| `large`            | 8     | 5        | 30       |

## Fixtures vs AI: which to use

| Use fixtures when…                                                   | Use AI when…                                                  |
| -------------------------------------------------------------------- | ------------------------------------------------------------- |
| You're scoring a repeatable eval and need identical input every run. | You want realistic, varied data that looks human.             |
| You're in CI and can't depend on an API key or model availability.   | You're exploring agent behavior, not measuring it to the row. |
| You want speed and zero external calls.                              | A few rejected records are acceptable.                        |

You can combine them: load a fixture for the deterministic backbone, then layer
AI data on top.

## Reset replays the seed

`asymmetric reset <id>` drops the database, re-runs migrations, and **re-applies
the clone's last seed**. So once a clone is seeded, getting back to that exact
starting state for the next trial is one command — no rebuild. To reset every
clone in an [environment](/concepts/environments) at once, use
`asymmetric env reset <name>`.
