whisper-money/app
Víctor Falcón 88b43dfb99 feat(ai): learn a forward rule from category corrections
When a user corrects a category the AI assigned, the system now records
the correction as a deterministic, forward-looking automation rule so the
same merchant — or the same distinctive description — is never
mis-categorized the same way again. The next matching transaction is
caught by the rule before the model ever runs, ending the
correct-it-every-time loop.

- New RuleOrigin::Correction: rules learned from corrections, protected
  from the AI self-heal and editable like any rule in settings.
- AiRuleLearner::learnFromCorrection keys on the merchant when present
  (stable as the description varies), otherwise on the description's
  distinctive tokens, guarded against over-broad description rules that
  could silently mis-file en masse.
- A key lives in exactly one correction rule, so changing your mind moves
  it to the new category. Correcting a transaction a prior correction
  rule categorized is also learnable, so correction rules stay fixable.
- Extract DescriptionTokenizer, shared by RuleSuggestionAggregator and the
  learner, removing the duplicated distinctive-token logic.
- TransactionMatcher::countMatchingAll backs the over-broad guard.
- The update endpoint returns the learned rule; the transactions table
  shows a toast with an instant Undo.
2026-06-29 16:52:58 +02:00
..
Actions feat(subscriptions): trial/pricing A/B/C experiment (#600) 2026-06-27 18:00:15 +02:00
Ai/Agents feat(ai): auto-categorize transactions with AI (behind flag) (#535) 2026-06-15 16:35:20 +02:00
Console/Commands feat(stats): add --no-discord to the remaining report commands (#607) 2026-06-29 15:32:31 +02:00
Contracts feat(connections): manage which accounts a bank connection syncs (#558) 2026-06-18 16:22:49 +02:00
Enums feat(ai): learn a forward rule from category corrections 2026-06-29 16:52:58 +02:00
Events Add Budgeting Feature to Track and Manage Spending (#36) 2026-01-21 15:25:50 +01:00
Exceptions/Banking fix(banking): skip inaccessible EnableBanking accounts instead of failing the connection (#559) 2026-06-19 08:59:05 +02:00
Features feat(subscriptions): trial/pricing A/B/C experiment (#600) 2026-06-27 18:00:15 +02:00
Http feat(ai): learn a forward rule from category corrections 2026-06-29 16:52:58 +02:00
Jobs fix(banking): only log sync failures once the connection gives up (#603) 2026-06-27 16:04:36 +00:00
Listeners fix(discord): skip zero-amount payment stats messages (#540) 2026-06-15 19:21:47 +02:00
Mail feat(email): follow up after post-onboarding AI consent (#596) 2026-06-26 17:56:06 +00:00
Models feat(dashboard): add accounts manager dialog with visibility toggle and reorder (#604) 2026-06-27 16:11:25 +00:00
Notifications fix: verify email via signed link without requiring login (#490) 2026-06-05 10:01:32 +02:00
Policies refactor(policies): extract HandlesUserOwnership trait (#478) 2026-06-03 17:43:30 +02:00
Providers feat(demo): gate demo account access behind a config flag (#580) 2026-06-22 11:01:27 +00:00
Rules feat: parent/child category tree (#474) 2026-06-03 19:30:12 +02:00
Services feat(ai): learn a forward rule from category corrections 2026-06-29 16:52:58 +02:00