Data entry
Every route in apps/web — one page per entity.
Each data-entry route shares the same shape: a table of existing rows, a "+ Add" button that opens
a dialog form, and inline edit/delete. Forms validate on blur per field and on submit at the form
level; dates use a Date | undefined model converted to ISO at the submit boundary.