Fix stack overflow in BudgetService.GetCategoryBalancesAsync
Details
ZBB mode was recursively calling GetCategoryBalancesAsync for each
previous month back to DateOnly(1, 1, 1), causing unbounded recursion
that exhausted the stack. Replaced with an iterative forward pass from
the earliest budget period/transaction month to the requested month,
accumulating rollovers in a running dictionary. Added a 2000-month
hard cutoff as a safety net.
Use SpecifyKind(Utc) for DateTimeOffset field initializers
Details
DateTime.Today is Kind=Local, and constructing DateTimeOffset with a
mismatched offset throws ArgumentException. Using SpecifyKind to mark
the date as UTC makes the single-arg constructor always use offset zero,
avoiding any timezone mismatch regardless of local system timezone.
Use local timezone offset for DateTimeOffset initialization
Details
DateTime.Today has Kind=Local, so the offset must match the local
timezone. Using TimeSpan.Zero crashed on any non-UTC machine.
Account hierarchy, CRDT conflict resolution, performance optimization, AI financial insights, quick budget entry (v3.1.0)
Details
Five major features for the Finance plugin:
1. Chart of Accounts Hierarchy — AccountHierarchyService with tree operations
(children, descendants, ancestors, roots, depth), cycle/orphan/depth validation,
aggregate balance across subtrees, and tree building with orphan safety.
2. CRDT Conflict Resolution Integration — ConflictAwareRepository wrapping
FinanceRepository with baseline tracking and automatic merge dispatch.
Added ResolveCategoryGroup (sticky Hidden, name LWW) and
ResolveReconciliationCheckpoint (sticky reconciliation, conservative balance).
EntityCache enhanced with per-entity GetSingle/SetSingle and prefix invalidation.
3. Performance Optimization — BalanceSnapshotService for pre-computed per-account
per-month balance snapshots with 5min TTL caching. ReconciliationService
subset-sum algorithm replaced with bottom-up DP (O(n*target) vs exponential
backtracking).
4. AI Financial Insight Intents — 6 new intents: monthly summary, spending
breakdown with trends, budget health with overspent/underfunded flagging,
multi-month financial trends with direction indicators, account overview with
net worth, and smart receipt categorization with 100+ merchant keyword patterns
across 9 categories. Enriched IndexableContent with monthly transaction
summaries and budget status for RAG context.
5. Enhanced Quick Actions — QuickBudgetEntryForm (Cmd+Shift+B) for logging
income/expenses with category selection from any interface. New command palette
entries for "Record a Purchase" and "Record Income".
128 tests total (63 new), all passing. Version 3.0.0 → 3.1.0.
Add reports & analytics, fix NUnit test runner (v3.0.0)
Details
Fix dotnet test discovery by adding explicit PrivStack.Sdk and
PrivStack.UI.Adaptive package references to the test csproj —
transitive dependencies were not copied due to Private=false in
Directory.Build.targets. All 65 tests now pass via dotnet test.
Add comprehensive financial reporting feature with four report types:
spending by category (date-filtered, horizontal bar chart), income vs
expenses (12-month paired bars), net worth over time (cumulative
asset/liability snapshots), and category trends (single-category
spending history). Reports use native Avalonia ProgressBar controls
for bar chart rendering — no external charting libraries.
New files: Report.cs (4 immutable DTOs), ReportingService.cs (pure
logic, 4 query methods), ReportsViewModel.cs (tab selection, date
range, normalized bar widths), ReportsView.axaml + code-behind.
Wired into FinanceViewModel (Reports property + GoToReportsCommand),
FinanceView.axaml (DataTemplate + nav button), and command palette
(Go to Reports with ChartBar icon). Added 9 reporting tests covering
all four report methods including edge cases.
Get notified about new releases