D9What it costs the developer
You test on ten rows. The client has fifty thousand.
Writing a seeder that produces realistic volume is a day’s work nobody budgets, so every list page is judged on hand-typed rows.
What actually goes wrong
Everything in a list page works at ten rows. Sorting is instant, pagination has one page, the N+1 costs ten queries instead of ten thousand, and the missing index costs nothing. You find out at the same moment your client does.
Development email has the same hole: it goes to a provider you cannot open, so the reset link that never arrives is a mystery rather than a line in a terminal.
What Grit does about it
- Every resource gets a factory and a seeder, so realistic volume is one command rather than a day.
- Seeding runs in batches with the heap flat, so a hundred thousand rows is a command and not an out-of-memory error.
- Mail has a log driver and a Mailhog default, so a reset link is never lost in development.
The commands
Realistic volume, before you look at the screen
grit seed Invoice --count 25000
Mail you can actually read
MAIL_MAILER=log grit start
What it does not do
A faker produces plausible rows, not your client’s distribution. A table where ninety percent of rows belong to one customer behaves differently, and that shape is yours to seed.
