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β addedshowTransactionSyncChecking / Done / Error(+destroyTransactionSync), reusing the exact sameCompactBody/ colours /baseOptionsas 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βhandleSyncToAccountingnow firescheckingat start anddone/errorat 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 --noEmitclean.
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.
72446812026-06-30 β feat(bank-sync): transaction sync shows the same notification bubble as statement sync (T-144)