Annotated makeBillDraft's return as SourceBill (index-signatured) and exported it, so its draft output stays typed; BillModal keeps initialBill: Partial<Bill> and callers cast makeBillDraft(...) as Partial<Bill> at the boundary. typecheck 0.
Five self-contained leaf modules, no behavior change: - reorder.ts — generic moveInArray<T>, reorderPayload, movedItemId - billingSchedule.ts — a Schedule union + typed normalize/label helpers - billDrafts.ts — SourceBill/Template/Category shapes for makeBillDraft - trackerTableColumns.ts — typed column parse/normalize - cashflowUtils.ts — typed SVG step-path timeline geometry (Safe-to-Spend) noUncheckedIndexedAccess handled via in-range `!` (guarded lengths) and destructuring defaults. Their .test.js suites import the .ts transparently via Vite/vitest and still pass. typecheck 0, lint 0 errors (47 warns), build green, 48 client tests pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>