ADR-0051: Reachable transaction Save action
- Status: Accepted
- Date: 2026-10-15
Context
Save followed every optional editor section and disappeared below the merchant
keyboard (issue #126). Item validation errors appeared under Amount, and
overlapping save requests could repeat persistence work. ADR-0046 already owns
the draft baseline, dirty-state flag, working serialization, and the guarded
save/validation path.
Decision
Keep Save in a full-width Scaffold bottom bar above IME/navigation insets in manual, existing, and review-created editors. Keep the destructive Delete button in the scrollable form for existing rows, with its confirmation. Amount's Next focuses Merchant; Merchant's Done calls the same ViewModel save method as the button.
The Save affordance consumes ADR-0046's contract instead of adding a parallel
one: its enabled state and duplicate-submission guard read the shared working
StateFlow, and submission goes through the one guarded save method.
Validation records the affected field so the editor focuses it — Amount,
Merchant, or the offending item line, expanding Items when needed. Persistence
failures reuse ADR-0046's retry behavior and surface a message.
Consequences
Optional sections and keyboard visibility do not determine Save reachability. The action consumes vertical space while the form scrolls independently. Submission state, exit confirmation, and retry remain a single contract owned by ADR-0046.