Ten thousand honest rows
Fabricate eighteen months of believable history as deterministic JSON, then load it via the bulk Web API — with validation queries standing in as tests.
- Generate believable demo data deterministically from a spec
- Load it idempotently via the bulk Web API, knowing the no-code alternates
- Validate the load with queries that behave like tests
A demo dies on empty grids. Contoso needs eighteen months of believable history, concentrated on two story accounts so their timelines are rich: Meridian State Pension, the relationship at risk, and Aldgate Re, the onboarding story. The client book is a specific mix, and it has to add up:
- 14 pensions
- 4 sovereign wealth funds
- 8 insurers
- 9 endowments
- 5 corporates
That is 40 institutional clients, with 65 contacts, 22 open opportunities, 31 funded mandates, and 300 cases distributed the way discovery said they were.
The enumerated tables come to fewer than five hundred rows; the other 9,600 are the activity history — the emails, meetings, and calls that make a timeline read like a relationship.
The data-fabricator generates it as JSON from the spec, seeded with 42 so the same run always produces the same dataset — the environment is rebuildable in an afternoon, not reconstructed by hand. It writes files and stops; it never loads.
The dataverse-operator loads. The path is the Web API bulk operations — CreateMultiple and UpsertMultiple, keyed on a stable natural key so every load is idempotent⊙ . Two no-code alternates are worth naming for a client who will ask: the Configuration Migration Tool, and the FastTrack Copilot Studio sample-data agent.⊙ For a harness, the coded bulk path wins because it is deterministic and diffable.
Validation queries are tests
The load is not done when it finishes; it is done when it passes. The operator runs validation queries that behave exactly like tests: row counts match the spec, the two story accounts have the timelines they are supposed to, and there are no orphaned child records. A load that “worked” but left Meridian State Pension with an empty mandate history has not worked — it has set up a dead grid in beat two. Treat the queries as the definition of done.
In the field
Ask the data-fabricator to generate a small seeded dataset from a spec with fixed counts, then run it twice and diff the output — it should be identical. Load it with the operator and write three validation queries. If any fails, the fix is in the data, not the demo.
- 04-data/*.json — the deterministic dataset, seed 42
- A loaded environment that passes the validation queries