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. Tensile Environments have 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.
hone env seed slack-a1b2 --fixture acme-corpOr seed on spin in one step:
hone env spin slack --seed acme-corpAvailable 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.
hone env seed slack-a1b2 --aiThe 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:
- Generate
Claude returns a dataset: a workspace, users, channels, and messages.
- Sign up + create
The first user signs up and creates the workspace; remaining users sign up and join.
- Channels + messages
Channels are created and joined, then messages are posted as their authors.
- 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.
✓ seeded slack-a1b2 (ai: 20 (0 rejected))
! signup alice-0: 409 conflictDefault 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
hone env 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 at once, use
hone env reset <name>.