Invoice app shipped roadmap gaps: paidAt validation (UI + PATCH), two-step mark-paid dialogs, /receipt/[id] shareable receipt page, server validation mapped into InvoiceEditor, bulk mark paid on the invoices list, and receipts list Page link + paid-date labeling.
PATCH /api/invoices/[id] returns 400 + { error, fields[] } when payment date is before invoice date (validatePaidAtForInvoice).MarkPaidDialog (editor + card), BulkMarkPaidDialog (list); markAsPaid hook returns structured MarkInvoicePaidResult for error messages./receipt/[id] (ReceiptViewPage) — paid receipts only for full preview; unpaid gets redirect-style messaging + edit link.docs/features/roadmap.md, invoice-receipt-flow.md, testing/manual-scenarios.md, utility/api-reference.md, architecture/system-overview.md).