Surface fallback-split rows more prominently in the settlements UI (0.00 EUR is alarming) #14
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Symptom
A real cash-out from a Sintra ATM lands on the operator's wallet and the Settlements table shows:
processed⚠The
0.00 EURreads as a bug. The⚠next toprocessedis the existingused_fallback_split=trueindicator, but it's small, tooltip-only, and easy to miss. An operator looking at this row thinks satmachineadmin failed to record the fiat amount — when in fact bitSpire never sent it.Root cause
Not in this repo.
aiolabs/lamassu-next#44(filed, still open as of 2026-05-15) tracks the bitSpire-sidePayment.extraenrichment. Until that ships:wallet_fiat_*(operator-reporting, USD) — not the customer-paid amount/currency.is_bitspire_payment(extra)returns False (nosource: "bitspire"marker),parse_settlementfalls into_parse_fallback,fiat_amountis hardcoded to0.0,exchange_rateto0.0.dcadistribution leg skips with"no exchange_rate on settlement (bitSpire fallback path; see aiolabs/lamassu-next#44)".See the comment thread on
aiolabs/lamassu-next#44for the live evidence from the 2026-05-15 test.The UX gap
Right now the operator has to:
⚠icon.used_fallback_split=true.aiolabs/lamassu-next#44link.That's four steps to learn "this is a known upstream gap, not a bug here."
Proposed UX
Until
lamassu-next#44lands and the fallback path goes cold, fallback-split rows should be visually distinct without the operator hunting:Fiat column: instead of rendering
0.00 EURonused_fallback_split=truerows, render—orpendingwith a tooltip explaining that bitSpire didn't supply the split metadata yet (links tolamassu-next#44).Status chip: keep the green
processed(the Lightning side really did settle) but pair it with a deep-orangefallbackchip — small, in-line, distinct from the⚠icon — so the row reads as "settled but distribution-blocked" at a glance.Settlements page banner (when any visible row has
used_fallback_split=true): a one-liner explaining the upstream issue once at the top, not on every row. Auto-disappears when no fallback rows are showing.Worklist consideration: should fallback-split rows surface in the worklist? Arguments both ways:
Recommendation: add a fifth worklist bucket
awaiting_upstreamthat listsused_fallback_split=truerows, with no action buttons — purely informational. Distinct fromrejected(security) anderrored(operational, retry-able) andstuck_*(recoverable via force-reset).Acceptance criteria
used_fallback_split=truerows render—(or similar) in the Fiat column, not0.00 EUR.⚠icon gains a pairedfallbackchip on the status cell for visual scannability.aiolabs/lamassu-next#44.awaiting_upstreambucket (informational, no actions). Total worklist count includes it.used_fallback_split,fiat_amount,error_messageon the skippeddcaleg).Out of scope
wallet_fiat_*fields as a stopgap. Confusing — those are operator-side USD reporting, not customer-paid fiat. Oncelamassu-next#44ships, the right fields will be present; don't bake in a stopgap that conflicts.dcaleg without an exchange rate is correct.References
aiolabs/lamassu-next#44(2026-05-15 comment has end-to-end evidence)bitspire.py:_parse_fallback(hardcodes 0.0);bitspire.py:is_bitspire_payment(thesourcecheck)static/js/index.jsworklist buckets;templates/satmachineadmin/index.htmlsettlements table