- Drop ParseRuleKind from parse_rules (enum survives only in rule_candidates):
a rule is now a condition (pattern + matchMode + optional txTypeGuard) plus
any set of actions (merchantCanonical/categoryId/accountId) or isIgnore
- Field-wise resolution: findClassificationRule fills merchant/category,
findAccountRule feeds the account resolver - one message may use both
- Per-rule autoApply toggle + ruleAutoApplyEnabled gate check; off -> Inbox
with full prefill
- Dedup guard in ParseRulesRepositoryImpl.create: same condition updates or
reactivates the existing row instead of inserting a duplicate
- ParsingPipeline.reapplyRulesToInbox: sweep app inbox cards on cached AI
drafts after createRule/ignoreWithRule (zero tokens)
- Schema v2 -> v3 migration (drop kind, add auto_apply) + migration_v3_test
- Rework rule_editor_screen into a single unified form; update rules list,
rule cards, source app detail, l10n strings, and tests
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace the Inbox badge button in MonthHeader with a bottom-nav tab
(hidden when notification parsing is disabled). Redirect /inbox → /home
when parsing is off, register the Inbox shell branch unconditionally,
and add a settings action to the Inbox screen. Move the parsing tile to
the top of the profile screen so settings stay reachable when the tab
is hidden. Add tests for the nav tab visibility and inbox routing, plus
a release-install PowerShell helper that preserves app data.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>