-
8c30a7ab09
refactor(ts): convert small hooks + version to TypeScript (TS8)
null
2026-07-03 22:01:30 -0500
-
3c51464bec
refactor(ts): convert pure lib utilities to TypeScript (TS7)
null
2026-07-03 21:59:16 -0500
-
7c6be66794
refactor(ts): convert client/lib/trackerUtils to TypeScript (TS6)
null
2026-07-03 21:53:45 -0500
-
7bb68db442
refactor(ts): convert usePaymentActions to TypeScript (TS5)
null
2026-07-03 21:47:12 -0500
-
62a99fcaa4
build(lint): extend ESLint to .ts/.tsx via typescript-eslint
null
2026-07-03 21:44:35 -0500
-
b221e02d85
refactor(ts): convert client/lib/utils to TypeScript (TS4)
null
2026-07-03 21:42:46 -0500
-
7d9bf12bdc
docs(history): TypeScript foundation + branded money types (T1-T3)
null
2026-07-03 21:37:21 -0500
-
255036afc2
feat(ts): branded Cents/Dollars money types — first TS conversion (T2)
null
2026-07-03 21:36:24 -0500
-
907a407399
build(ts): TypeScript foundation — tsconfig + typecheck in CI (T1)
null
2026-07-03 21:33:26 -0500
-
47c031f1e4
build(react): enable React Compiler (React 19 auto-memoization) (F2)
null
2026-07-03 21:20:26 -0500
-
a0a8579a08
refactor(tracker): shared useTogglePaid mutation hook — finish Tracker mutations (F1)
null
2026-07-03 21:18:18 -0500
-
c86acd7d75
docs(history): React Query deeper adoption — error handling, prefetch, useMutation (P1-P3)
null
2026-07-03 21:05:31 -0500
-
ad9fcbd56f
refactor(tracker): shared useQuickPay mutation hook (P3)
null
2026-07-03 21:04:43 -0500
-
e941f05cd6
feat(tracker): prefetch adjacent month on nav hover for instant switching (P2)
null
2026-07-03 20:58:23 -0500
-
2793927a5c
feat(query): global background-refetch error toast (P1)
null
2026-07-03 20:56:31 -0500
-
1fe71a7d5e
docs(history): React Query migration of all 7 manual-fetch pages (R5)
null
2026-07-03 20:26:32 -0500
-
6802a66e82
refactor(bank): migrate BankTransactionsPage ledger to React Query (R5.7)
null
2026-07-03 20:25:47 -0500
-
2e8bc07552
refactor(spending): migrate SpendingPage to React Query (R5.6)
null
2026-07-03 20:22:13 -0500
-
1cb0325560
refactor(snowball): migrate SnowballPage to React Query (R5.5)
null
2026-07-03 20:18:14 -0500
-
a37697d492
refactor(summary): migrate SummaryPage to React Query (R5.4)
null
2026-07-03 20:14:31 -0500
-
a0e4f87fe1
refactor(subscriptions): migrate SubscriptionsPage to React Query (R5.3)
null
2026-07-03 20:12:02 -0500
-
9cb254ea13
refactor(bills): migrate BillsPage to React Query (R5.2)
null
2026-07-03 20:08:28 -0500
-
bb024ce161
refactor(analytics): migrate AnalyticsPage to React Query (R5.1)
null
2026-07-03 20:04:14 -0500
-
65c61d71fa
docs(history): React correctness audit + ESLint enforcement (R1-R4)
null
2026-07-03 19:58:54 -0500
-
1387f7c2d7
fix(client): guard param-driven data loaders against out-of-order responses (R3)
null
2026-07-03 19:57:04 -0500
-
02395b9ad4
refactor(client): remove orphaned dead logic flagged by ESLint (R2c)
null
2026-07-03 19:51:21 -0500
-
b8d394061b
fix(client): resolve all 13 exhaustive-deps warnings (R2b)
null
2026-07-03 19:47:14 -0500
-
5e267e4fa7
fix(client): fix ESLint errors — real latent bugs (R2a)
null
2026-07-03 19:42:52 -0500
-
c679022592
build(lint): add ESLint 9 + eslint-plugin-react-hooks/react-refresh (R1)
null
2026-07-03 19:41:24 -0500
-
38417ad8da
docs(history): BM2 bill-modal decompose summary (v0.41.0)
null
2026-07-03 19:25:15 -0500
-
20b46c81df
refactor(bill-modal): extract TemplateSection (BM2, 7/n)
null
2026-07-03 19:23:57 -0500
-
ad68d965b6
refactor(bill-modal): extract LinkedTransactionsSection (BM2, 6/n)
null
2026-07-03 19:22:58 -0500
-
301bb152ef
refactor(bill-modal): extract UnmatchDialogs + shared transactionDisplay (BM2, 5/n)
null
2026-07-03 19:20:02 -0500
-
c61e3d84a5
refactor(bill-modal): extract PaymentFormFields (BM2, 4/n)
null
2026-07-03 19:16:10 -0500
-
afba78e86b
refactor(bill-modal): extract PaymentHistoryList (BM2, 3/n)
null
2026-07-03 19:11:05 -0500
-
9d670985fe
refactor(bill-modal): extract AutopayTrustIndicator (BM2, 2/n)
null
2026-07-03 19:07:35 -0500
-
1018c55bb3
refactor(bill-modal): extract DebtDetailsSection (BM2, 1/n)
null
2026-07-03 19:06:12 -0500
-
2b710c459b
feat(tracker): summary-card redesign — de-dup Paid, surface Remaining + progress (T3)
null
2026-07-03 18:49:35 -0500
-
4a76eb9b92
feat(tracker): optimistic pay/skip + toast.promise on syncs (M1/M2)
null
2026-07-03 18:47:32 -0500
-
55b515c401
feat(tracker): Pay-all-due per bucket + reversible quick-pay with specific toasts (T4)
null
2026-07-03 18:43:01 -0500
-
995f635d35
refactor(tracker): consolidate isPaidStatus + rowOutstanding + toast gap (T5)
null
2026-07-03 18:36:30 -0500
-
d92cc38116
fix(bill-modal): correctness + toast fallbacks + validator consolidation (BM1)
null
2026-07-03 18:32:25 -0500
-
e9c5e4d1d3
test(tracker): cover paymentAccounting + analytics money services (X2)
null
2026-07-03 18:28:12 -0500
-
9f4b53d37a
perf(tracker): batch getTracker per-bill queries (kill N+1) (P1)
null
2026-07-03 18:25:55 -0500
-
73631ab812
fix(tracker): route error handling + autopay write atomicity (T2)
null
2026-07-03 18:21:28 -0500
-
c91c97ef41
feat(tracker): live cross-query invalidation for the app shell (X3)
null
2026-07-03 18:19:30 -0500
-
10e159352a
fix(notifications): honor per-bill reminder_days_before + expose for all bills (BM3)
null
2026-07-03 18:16:10 -0500
-
ad1f5bebf6
fix(bill-modal): SimpleFIN import refreshes payments + Tracker live (BM4)
null
2026-07-03 18:11:28 -0500
-
4a38cc8614
fix(tracker): gate bank card unpaid/remaining by occurrence + add trackerService tests (T1)
null
2026-07-03 18:10:28 -0500
-
d689ff6e68
fix(tracker): quick-pay duplicate guard + atomic balance write (X1)
null
2026-07-03 18:05:19 -0500
-
836dbdb9ae
fix(snowball): surface projection errors + polish (Snowball #2,#3,#8)
null
2026-07-03 17:08:41 -0500
-
2b315f5d18
refactor(snowball): consolidate plan endpoints, standardize errors, fix N+1 (Snowball #4,#6,#7)
null
2026-07-03 17:04:31 -0500
-
db4d33513e
fix(debt): honest payoff date for unpayable debts + math tests (Snowball #1,#5)
null
2026-07-03 17:01:17 -0500
-
877e4c6d3c
docs(data): record the Data page overhaul + sign-off (Batch 6)
null
2026-07-03 15:25:25 -0500
-
d53a64b604
feat(data): "Erase my data" danger zone (Batch 5)
null
2026-07-03 15:21:07 -0500
-
314e4ff45e
feat(export): JSON export + date-range/format payments export (Batch 4)
null
2026-07-03 15:15:36 -0500
-
bd1eee00b0
feat(import): OFX/QFX transaction import (Batch 3)
null
2026-07-03 15:11:59 -0500
-
c7b110cd68
feat(data): actionable badges, health dots, at-a-glance stats, palette links (Batch 2)
null
2026-07-03 15:05:25 -0500
-
6a1b2f62b2
feat(data): two-pane shell + connection hero + deep-linking (Batch 1)
null
2026-07-03 15:02:36 -0500
-
212117a61a
feat(data): modernize SectionCard chrome (Batch 0 — Data overhaul)
null
2026-07-03 14:57:03 -0500
-
5aa5c0cc0e
docs(qa): mark IMP-CODE-02 fully shipped (database.js 4174 -> 1297)
null
2026-07-03 13:34:37 -0500
-
12d9d4c5a8
refactor(db): extract legacy-reconcile migrations + lock version-sync (IMP-CODE-02)
null
2026-07-03 13:34:01 -0500
-
026c6a56b8
refactor(db): extract the versioned migrations array into its own module (IMP-CODE-02)
null
2026-07-03 13:31:00 -0500
-
78ad63dda4
docs(qa): IMP-UX-02 state audit complete — no gaps found
null
2026-07-03 13:07:56 -0500
-
318ffa368e
docs(qa): archive IMP-CODE-02 partial (catalog seed extracted)
null
2026-07-03 13:05:44 -0500
-
7f2faeaede
refactor(db): extract subscription-catalog seed data out of database.js (IMP-CODE-02)
null
2026-07-03 13:05:16 -0500
-
9aa312082d
docs(qa): archive IMP-CODE-03 (canonical match-state writer)
null
2026-07-03 13:02:47 -0500
-
fa2432265c
refactor(match): one canonical writer for transaction match state (IMP-CODE-03)
null
2026-07-03 13:02:10 -0500
-
c47638a373
docs(qa): archive IMP-UX-01 (recently-deleted restore view)
null
2026-07-03 12:57:08 -0500
-
aace5a4356
feat(bills): "Recently deleted" restore view for the 30-day window (IMP-UX-01)
null
2026-07-03 12:56:45 -0500
-
e09025430b
docs(qa): archive IMP-IA-01 (Data in primary nav)
null
2026-07-03 12:50:43 -0500
-
0b1c6a8322
feat(nav): surface Data in the primary app menu (IMP-IA-01)
null
2026-07-03 12:50:07 -0500
-
54484ec8a0
docs(qa): archive IMP-CODE-01 (money formatter consolidation)
null
2026-07-03 12:47:07 -0500
-
a15f00c568
refactor(client): single source of truth for money formatting (IMP-CODE-01)
null
2026-07-03 12:46:22 -0500
-
6f5ad9a015
docs(qa): record real end-to-end SimpleFIN sync validation
null
2026-07-03 12:26:22 -0500
-
cc6332731f
docs(qa): add improvement lens + B17/B18 batches + seeded backlog
null
2026-07-03 12:23:37 -0500
-
b3168fca70
fix(qa): retention GC orphaned matched transactions on bill purge (QA-B5-04)
null
2026-07-03 11:04:59 -0500
-
07b6a04a97
chore: gitignore tests/Site-BKUP-Test/ (live DB copy — never commit)
null
2026-07-03 10:42:58 -0500
-
a5671ab3be
fix(qa): harden DB file permissions — was world-readable 644 (QA-B16-02)
null
2026-07-03 10:32:39 -0500
-
fc2daf2e9e
docs(qa): Cycle 1 header — 15 findings, B16 complete
null
2026-07-03 10:06:24 -0500
-
2963d11d1b
fix(qa): version check is opt-out-able (QA-B16-01)
null
2026-07-03 10:05:37 -0500
-
e8190170dc
docs(qa): B16 execution — log QA-B16-01 (version check "optional" but no opt-out)
null
2026-07-03 09:55:58 -0500
-
9876207781
docs(qa): add B16 (migrations, secrets & deploy) — close plan coverage gaps
null
2026-07-03 09:53:37 -0500
-
d82aa06652
docs(qa): Cycle 1 sign-off — all 17 batches run & complete, re-run clean
null
2026-07-03 09:13:39 -0500
-
5ffe2db85a
test(qa): export→import round-trip preserves money (B9 data integrity)
null
2026-07-02 22:26:49 -0500
-
c31d8cbe9e
fix(qa): escape bill name in reminder email HTML — XSS via bill name (B14-04)
null
2026-07-02 22:18:05 -0500
-
2050e13407
fix(qa): notification _push export was clobbered → "Send test push" 500'd (B10-01)
null
2026-07-02 22:11:34 -0500
-
972daa9b07
docs(qa): mark B-UI batch probed (primitive behavior spec added)
null
2026-07-02 22:04:14 -0500
-
5fe1f6499b
test(qa): B-UI primitive behavior spec (dialog/select/disabled)
null
2026-07-02 22:03:52 -0500
-
18c7025f3a
docs(qa): record Cycle 1 sign-off — 12 findings fixed, automated re-run clean
null
2026-07-02 21:57:50 -0500
-
ccf89e6df1
test(qa): summary skip-exclusion + per-month override regression (B2/B5)
null
2026-07-02 21:56:46 -0500
-
ad474f1ac1
test(qa): admin/status authorization probe + B10/B11/B12 coverage notes
null
2026-07-02 21:48:05 -0500
-
3c1d000bab
test(qa): production-build smoke (B15) — validates split chunks at runtime
null
2026-07-02 21:45:25 -0500
-
819cfdfa9f
fix(qa): bank-tracking unpaid_this_month gates by occurrence (QA-B5-02)
null
2026-07-02 21:41:33 -0500
-
1bd282f47b
fix(qa): Analytics "expected" gates by occurrence (matches Tracker/Summary)
null
2026-07-02 21:23:37 -0500
-
a15ff056b3
fix(qa): Summary excludes bills not due in the month (reconciles with Tracker)
null
2026-07-02 21:19:35 -0500
-
72d06aa2d8
fix(qa): cent-exact toCents rounding + money.js test coverage
null
2026-07-02 21:11:12 -0500
-
98c8fab176
fix(qa): resolve a11y nested-interactive on Categories & Snowball rows
null
2026-07-02 21:02:15 -0500
-
127b69ffc2
chore(qa): vendor chunk splitting, remove unused markdown deps, remove dead totalInterestPaid (batch 0.41.0 QA cleanup)
null
2026-07-02 20:47:50 -0500
-
029c227685
fix(qa): seed demo data amounts, bill amount validation, negative USD format, a11y aria-labels, Playwright E2E setup (batch 0.41.0 QA)
null
2026-07-02 20:36:09 -0500