LedgerMap · alpha review 16/10/2026 · design options

When two ledgers tie, the mark should not say "sure"

If 2 or 3 ledgers match an entry in the same way, the matcher gives each the same confidence. The app then fills in the first one with a green or yellow mark. The first one is first because of its name, not its meaning. This page shows four ways to handle a tie. Try each one with the keyboard below.

67 of 299entries with a suggestion on production were ties (22%)
42of them: "Interest" on a term-loan statement, 3 interest ledgers at 80% each
13two look-alike bank-charge ledgers at 91% each
≈ 11ties left after the matcher changes below (estimate; the replay will measure it)

Try the options

Choose an option, then click the table or press Tab to reach it. The table works like the Suggestions step: ↑/↓ move between entries, Enter opens the list, Ctrl+Enter accepts one suggestion, and Ctrl+Shift+Enter accepts all. Clear the "matcher tie-breaks" box to see today's state. The rows come from three parties and are shown as one import here.

Suggestions

Entries with a suggested ledger, least likely first. Check the red and yellow ones; Ctrl+Shift+Enter accepts every suggestion shown.

Sr. no.BankDateNarrationReference DebitCreditBalanceLedger

The four options

Every option includes the same matcher changes (see "What changes in the matcher"). The options differ only in how a tie that is left looks and how the user chooses.

1 · Honest mark

What you see
The same Ledger box as today. A tie gets a split confidence (99% ÷ 2 ≈ 50%), so its mark is red. Red rows sort first, so ties are at the top of the list.
Keys
No new keys. Enter opens the list with the tied ledgers on top, each with its group below its name. ↓ Enter takes the second one.
Focus
As today: it stays in the box while the list is open, then goes to the next entry without a choice below.
Edge cases
  • 3-way tie: 80% ÷ 3 ≈ 27%, red. The list shows all three on top.
  • Duplicates (Trimurti Tools And / & Electricals): red, with two identical names in the list. The user picks the one they use.
  • Ctrl+Shift+Enter still accepts the first tied ledger, as it does for any red row.

2 · "or …" line

What you see
As option 1, plus one small grey line under a tied box that names the other tied ledgers: "or BANK CHARGES EXPENSES". The group is added only if it differs from the first one's group.
Keys
No new keys. Enter then ↓ Enter takes the other one.
Focus
As today. The line is plain text, not a control.
Edge cases
  • 3-way tie: the line lists two names and the row gets taller.
  • Duplicates: "or Trimurti Tools & Electricals" shows at a glance that the books have the ledger twice.
  • Accept-all: as option 1.
  • It adds text to the list, which INF-67 kept to a mark only.

3 · Switch in place

What you see
A tied box shows "1/2" next to its red mark.
Keys
New: Alt+] shows the next tied ledger in the box, and Alt+[ shows the previous one (it wraps). They work on the row and in the box. Ctrl+Enter accepts the ledger shown. (Alt+S was rejected: Firefox uses it for its History menu.)
Focus
It stays where it is. A status line reads the shown ledger: "2 of 2: BANK CHARGES EXPENSES".
Edge cases
  • 3-way tie: "1/3", "2/3", "3/3".
  • Duplicates: switching shows a look-alike name and does not help.
  • Ctrl+Shift+Enter accepts what each box shows, including switched ones.
  • The shown ledger must be kept in tab state, so it is still there after a restart.

4 · Leave ties unfilled

What you see
A tied box is empty, with the grey text "2 ledgers fit · Enter to choose" and no mark. The entry stays on the Suggestions step and sorts first.
Keys
Enter opens the list on the first tied ledger, so Enter Enter takes it. Ctrl+Enter on a tie only says "fits 2 ledgers: press Enter to choose".
Focus
As today.
Edge cases
  • 3-way tie: "3 ledgers fit".
  • Duplicates: the user must always choose between two identical names.
  • Ctrl+Shift+Enter skips ties and says "3 ties are left to choose". A tie is never accepted unseen.

Comparison

OptionProsConsNew keysEffort
1 · Honest markNo UI change. The list stays a mark only (INF-67). Red already means "check this" and sorts first.You do not know it is a tie until you open the list. Accept-all takes the first one.NoneS server only
2 · "or …" lineShows the other choice without opening the list. Shows duplicates clearly.Extra text in the list. Taller rows on 3-way ties.NoneS+ server sends the tie size; one line in the box
3 · Switch in placeFast for "it is the other one": 2 keys.A new shortcut for a rare case. Hidden state per entry. No help with duplicates.Alt+[ Alt+]M tab state, accept-all, help dialog, docs, tests
4 · Leave unfilledA tie is never accepted without being seen.Slows down duplicates and the GST heads. Ctrl+Shift+Enter no longer clears the step.NoneM suggestion logic, accept-all notice, picker highlight, tests

What changes in the matcher (all options)

  1. Define a tie as 2 or more recommendations from the same matcher with the same strength and the same fit for the entry's direction, after sortByRule. Today, any two with equal confidence look like a tie, even when the direction already put the right one first (HARIKRUPA).
  2. Break it by direction and group. A receipt prefers a Sundry Debtors ledger and a payment prefers a Sundry Creditors one. The order already does this (contradicts). The change is that this now ends the tie, so the first one keeps its own confidence.
  3. Break it by the bank ledger. If one tied ledger shares a distinctive word with the statement's bank ledger ("TERM LOAN", "CAR LOAN", "CC", "OD"), it goes first and the tie ends. This fixes the 42 interest rows.
  4. Break it by words in the narration. For a GST payment, a narration that names CGST, SGST, IGST or CESS picks that Cash Ledger.
  5. Break it by past choices. The ledger the user chose more often for this direction goes first. This already exists (exported choices, and live in the import being worked on), so once one bank-charge entry is saved, the others follow.
  6. Split a tie that stays. Each tied ledger's confidence is divided by the tie size (99% → 50%, 91% → 46%, 80% → 27%), so the mark is red. The tracking situation gets a "tied" part, so the replay and production events can measure ties separately.
Ties on productionRowsWhat breaks itLeft (est.)
"Interest" on a term-loan statement: 3 interest expense ledgers42Bank ledger name (TERM LOAN)0
BANK SERVICES CHARGES EXPENSES / BANK CHARGES EXPENSES13The first choice in the import (live learning)≈ 1
GST payment: Cash Ledger CGST / SGST / IGST5A head named in the narration, if it is printed≈ 5
HARIKRUPA TRADERS. (Debtors) / HARIKRUPA TRADERS (Creditors)2Direction (the order was already right)0
Interest credit: 3 income ledgers1Nothing yet1
Trimurti Tools And Electricals / & Electricals (duplicates)1Past choices only1
One-word person names (already red at 20%)2Nothing2
Similar names1Nothing1
Total67≈ 11

Checks after the change: bun run matcheval before and after (first-suggestion accuracy must not fall), and a before/after run on the production copy that lists every tie that was broken or split.

Recommendation

Option 1: the matcher changes plus an honest red mark. No new UI.

  • The matcher removes about 5 of 6 ties. The ones left are real doubts, and red already means "check this" and sorts them to the top.
  • Choosing is already fast: Enter shows the tied ledgers on top, with groups. No new key to learn, and the list stays a mark only (INF-67).
  • Least effort and least risk: server code, tests and the replay only. Older installed apps get the fix without an update.

Second choice: option 2, if you want to see the other ledger without opening the list. It shows duplicate ledgers best, but it adds text to the list.