Skip to content

uid: T-144 title: Transaction sync shows the same notification bubble as statement sync (OCBC + Airwallex) status: done area: accounting created: 2026-06-30 updated: 2026-06-30 related: T-143


T-144 β€” Transaction sync notification bubble

Why (owner, 2026-06-30)

The owner logged into both Airwallex and OCBC through the web app and nothing appeared to sync. Root cause (investigated read-only): the transaction auto-sync was wired to fire on the bank-connect transition and an account is auto-selected β€” but it ran in silent mode, which suppressed both the result modal and the error toast. So a failure, a "0 new", and a successful import all looked identical: nothing. (Contrast: the statement sync already shows a bottom-left "checking β†’ done/error" bubble for the same flow.)

Owner, 2026-06-30 (verbatim): "can you make it so that transaction syncing actually shows a notification like the syncing of statements? (Same style notification bubble)"

What shipped

  • components/finance/bankStatementSyncPopup.tsx β€” added showTransactionSyncChecking / Done / Error (+ destroyTransactionSync), reusing the exact same CompactBody / colours / baseOptions as the statement toasts, on a separate notification slot (bank-transaction-sync-${provider}) so a tx bubble and a statement bubble can both be visible without clobbering each other.
  • components/finance/OCBCVelocityDashboard.tsx β€” handleSyncToAccounting now fires checking at start and done/error at the end, for both the silent auto-run and manual runs. The manual run still also opens its detailed result modal; the silent auto-run (the one that was invisible) now reports its outcome. The error path no longer swallows the failure.
  • components/finance/BankDashboard.tsx β€” same wiring for the Airwallex transaction auto-sync.

Why this matters (beyond cosmetics)

The silent auto-sync is the reason a 6-week-stale feed went unnoticed. Making it report "Synced N new / 0 new / Failed: …" turns a black box into a signal β€” and is also the quickest way to see why a given login didn't import (e.g. a wide date-range failure), which the previous silent path hid.

Verification

  • βœ… Attestation (Accounting (Diagnostics)): read AGENTS.md; checked the board by scope β€” no task covered transaction-sync feedback; the statement-sync popup (T-143-adjacent infra) is reused, not duplicated. Tracking T-144.
  • Source: Accounting (Diagnostics) Β· https://claude.ai/code/session_01G58Y71noihrYCDEDMexmea
  • Proposed/approved by: the owner (verbatim above).
  • NODE_OPTIONS=--max-old-space-size=4096 npx tsc --noEmit clean.

Follow-up (separate, owner-requested 2026-06-30 β€” pending sign-off)

The owner also asked: "scan for existing transactions (while avoiding duplications), look for missing information and backfill." That is a distinct, write-to-existing-prod-tx feature (turn the sync's skip-duplicate into skip-or-backfill: fill empty bank-feed fields only β€” ocbc.particulars/note, reference, remarks, description, and the future running balance β€” never touching user categorisation / status / memo). Tracked separately pending the owner's confirmation of the exact backfill field allowlist + non-clobber rules.

Blast Radius

Bank Access UI only (OCBC Velocity + Airwallex dashboards) + the shared sync popup module. No change to the sync API, dedup logic, or any stored data.

Commit index (backfilled 2026-07-01, best-effort Β· Coaching (Diagnostic))

Candidate related commits, auto-backfilled from git on main: commits whose message references this task's UID or a PR number it cites. Not verified β€” this squash-merged history can't yield a precise per-task list, so rows tagged (mentions only) name the task in passing (may be tangential) and untagged work commits may be missing. Treat as a starting point: verify, prune tangential rows, and append any real ones per the AGENTS.md "record every related SHA" policy.

  • 7244681 2026-06-30 β€” feat(bank-sync): transaction sync shows the same notification bubble as statement sync (T-144)