Skip to content

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.