[
 "accepts integer cents",
 "computes totals",
 "creates a draft with computed totals",
 "creates and fetches a customer",
 "enforces the minimum",
 "filters the list by status and rejects unknown statuses",
 "formats cents",
 "ignores drafts and void invoices",
 "issues a draft without mutating it",
 "issues with sequential numbers",
 "knows its currencies and sums",
 "knows when an open invoice is overdue",
 "marks an open invoice paid",
 "marks an open invoice paid in full",
 "migrates a v0 file (embedded customer) on load and writes it back",
 "normalises the email",
 "parses a minimal invoice",
 "persists updates to the file and reloads them",
 "refuses a file from a newer build",
 "refuses to issue twice",
 "refuses to pay drafts and void invoices",
 "rejects a bad email",
 "rejects a discount above the subtotal",
 "rejects an invoice for an unknown customer",
 "rejects floats and strings",
 "rejects fractional cents in unit prices",
 "requires at least one line",
 "returns 400 on invalid input and 404 on unknown ids",
 "returns 404 for unknown routes",
 "returns 409 when paying a void invoice and 404 for unknown invoices",
 "starts empty in memory",
 "sums open invoices per currency and counts overdue ones",
 "validates the currency and due date",
 "voids drafts and open invoices, never paid ones"
]