Alpha fixes: 5 decisions before the final PR

17/10/2026. The five threads finished their work and reviewed each other. I then combined all five PRs on the latest main, ran every check, and had an independent reviewer read the whole set. Most problems have a clear fix. Five need your choice, because each one changes how the app behaves for the user or how much risk we accept. Each choice below has the background, real examples, the options, and my recommendation (already selected). At the end, a box collects your choices so you can copy them back to me.

Round 2 (17/10/2026, afternoon): decisions 1–5 are done (all A). Two new decisions need you: 6. SELF cheque corrections and 7. the fill and your own choices. The choice box at the end now lists all seven; only 6 and 7 are new.
Original PDFs. Each example has a button that opens the real statement at the right page, in a new tab. The rows are marked: the row in question, the earlier row with the same text, another example. The PDFs show real names, unlike the text on this page. One PDF already had yellow marks without a border; those are not mine.
The five decisions
  1. Cheque rows the books booked two ways
  2. Cheques that print no payee name
  3. How sure a tie looks
  4. No pop-up: fill a payee's entries automatically
  5. How the five PRs reach main

Where things stand

PRWhat it does (the option you chose)State
#148 Cash rulesCash withdrawals (SELF cheques, also printed as "SELF-CHQPAID"; ATM) are saved to the cash ledger automatically when the company has one cash ledger. A line in Suggestions says how many and links to Review.Open, checks pass
#149 Cheque learningSilent fill: after you choose a ledger for one cheque, the payee's other cheques with the same text are saved automatically. The cheque number no longer makes each cheque look new.Open, checks pass; replay check fails (decision 1)
#150 Export listThe Export step lists entries that have a suggestion nobody saved, before they go to Suspense. Accept one, or Accept all / Ctrl+Shift+Enter.Open, checks pass
#152 Suspense stepAfter a choice, a pop-up lists Suspense entries that just got a suggestion ("Now suggested"), and a header line counts them with Accept them.Open, checks pass; pop-up to be replaced (decision 4)
#153 Ledger tiesThe matcher breaks ties by direction, group and bank. A tie that stays shows "1/2" in the Ledger box; Alt+] / Alt+[ switch the ledger shown.Open, checks pass; tie colour (decision 3)

Combined check (all five on the latest main)

Change against mainfreshpriorfull
Right ledger saved automatically+120+99+96
Right ledger saved or offered first ("good rows")+17+17+8
Decisions left for the user−17−17−8
Wrong ledger saved automatically0 → 01 → 11 → 3

The replay has a rule: no change may add a wrong automatic save. The "full" column breaks it by 2. Decision 1 is about those 2 rows.

1Cheque rows the books booked two ways

When the books booked the same cheque text to two different ledgers, what should the automatic fill do?

Background

With #149, one choice for a cheque fills the payee's other cheques with the same text. That is the whole point: in the alpha, KESARI NANDAN ART had 10 "SELF-CHQPAID" cheques, and after 2 choices the other 8 still waited. On the production copy, #149 would fill 66 waiting rows (62 SELF cheques to Cash, 4 JAY ART cheques to JAY ART), all right.

But sometimes the accountant booked the same cheque text to two ledgers. Then the fill copies the earlier booking, and it is wrong. The replay found 2 such rows (names replaced):

Row A — a cheque deposit
CHQ DEP-MICR-16-JETPUR: <customer's full name> : RAJKOT DIST CO-OP BANK Earlier identical deposit (01/11/2023, ₹1,00,000) → books: the customer's father's ledger This deposit (20/12/2023, ₹51,000) → books: the customer's own ledger (the name printed) #149 saves: the father's ledger ✗

Here the narration itself names the right ledger, and the name matcher finds it. The reviewer tested a small fix: on a cheque row, when a name in the text points to another ledger more strongly than the learned one, do not save automatically; suggest instead. Result: wrong saves 3 → 2, and no good row is lost. I will apply this fix in every option below.

Row B — a bearer cheque
<first name>-CHQPAID-VAVDI (a cheque paid to a person, cashed at the Vavdi branch) Earlier identical cheque (17/09/2021, ₹20,000) → books: LABOUR WAGES EXPENSE This cheque (01/10/2021, ₹15,000) → books: Cash Account #149 saves: LABOUR WAGES EXPENSE ✗

Nothing in the text tells these two apart. The person collected cash once for wages and once as cash. No rule can fix this row without stopping the fill after one choice.

Your choice

Why A: the replay shows 96–120 right saves gained for 1 wrong one, and the wrong one comes from inconsistent books, not from a bad rule. Every automatic save is still visible in Review.

2Cheques that print no payee name

When a cheque row prints only a town or a bank (no payee), should one choice still fill the others?

Background

#149 keeps a cheque's number (so no fill) when the text has no payee word. It decides this with word lists: cheque words (CHQ, CLG, MICR…), bank codes, and a list of clearing towns (MUMB, JETPUR…). Any other word counts as a payee. So a town or bank that is not on a list is taken as the payee, and different customers' cheques can look like one payee. Both the code review tool (OpenQodex) and the reviewer flagged this.

CHQ DEP-MICR-16-JETPUR: SBI:STATEBANKOFINDIA ← customer 1's cheque CHQ DEP-MICR-16-JETPUR: SBI:STATEBANKOFINDIA ← customer 2's cheque "STATEBANKOFINDIA" is not on the bank list → looks like a payee → choosing customer 1's ledger saves customer 2's cheque to it ✗ CHQ DEP CLG HOUSE SURAT ← SURAT not on the town list: same risk

The SBI row is real: a ₹1,05,655 deposit on 13/10/2023 in one company's HDFC statement. The books do not hold it, so the replay cannot say who it was from. The BHAKTINAGAR rows are cheques that print only the branch; the books put all of them to Cash.

How often today: in the replay data and the production copy, this caused no wrong save. Real cheque rows without a payee are already handled: "CAS PRES CHQ" (3 different suppliers in ASMARK's books) keeps its number. "CHQ PAID- CHQPAID- BHAKTINAGAR-" (4 rows, all Cash in the books) fills, which is right there. Rows like the SBI example exist in the data but were never booked differently.

Your choice

Why A: it removes the case we can name (bank names) at low cost, keeps the behaviour you chose, and no wrong save of this kind has appeared in real data.

3How sure a tie looks

When two or three ledgers still tie, what colour should the mark be?

Background

A tie is when the matcher finds two or three ledgers equally likely, for example:

SMS alert charge → BANK SERVICES CHARGES EXPENSES or BANK CHARGES EXPENSES GSTN payment → Cash Ledger (CGST) or (SGST) or (IGST) "Interest" on a term loan → INTEREST ON TERM LOAN / INTEREST TO PARTNER / …

In the option you chose, #153 divides the confidence by the number of tied ledgers. A 91% match tied two ways shows as 45%, so every tie is red. But the replay measured how often the first tied ledger is right: two-way ties 31 of 44 (70%), three-way ties 8 of 13 (62%), because #153 now orders tied ledgers by direction and group first.

There is a side effect. The Miracle history clue replaces the server's suggestion when the server's number is lower. A "same amount in the books" clue (50%, right about half the time) now beats every tie, and a "recurring" clue (78%) always does. So a sensible tied suggestion can be replaced by a weaker guess.

Your choice

Why A: the mark is meant to say how likely the suggestion is (90/70 rule). The measured number does that; dividing does not.

4No pop-up: fill a payee's other entries automatically

You asked: if the pop-up lists a payee's other entries, all ticked, how often would the user keep them all? If nearly always, drop the pop-up and fill them automatically. Here is the measurement, and the one choice left.

What the pop-up does today

After you choose a ledger for one entry, a pop-up (on main since 16/10, #115) lists the payee's other open entries, all ticked; Enter saves them all. #152 adds a "Now suggested" part on the Suspense step. Both would go. The payee groups are the app's own: same UPI ID, same account number, or same narration pattern. The pop-up does not look at the direction, so a payee's receipts and payments are offered together.

Measured on the Miracle books (10 companies, what the accountants actually booked)

For every payee group in every statement, I took the books' ledger for the group's first open entry as "your choice", and checked the books' ledger of each entry the pop-up would offer. "All offered entries right" means every offered entry is booked to that same ledger, so pressing Enter with everything ticked (or filling automatically) would be right.

RulePop-upsAll offered entries rightOffered entriesRight
As built: both directions113106 (93.8%)273266 (97.4%)
Same direction only (payments with payments, receipts with receipts)109107 (98.2%)265263 (99.2%)
Entries in the other direction alone——83 (38%)
What the alpha users did (production, 16/10)
So

In the same direction, users would keep everything ticked 98–99% of the time. The pop-up asks a question whose answer is almost always yes, so your call to drop it fits the data. The proposal: no pop-up anywhere in the normal flow; a choice fills the payee's other open entries in the same direction automatically; the status line says "8 more entries got Cash Account"; every filled entry shows in Review and can be changed there; the Settings switch for the pop-up goes. The "N entries here now have a suggestion" line (#152) and the Export list (#150) stay as the last checks for anything not filled.

Your choice

Why A: it removes the pop-up as you want, and "same direction" is the one rule that keeps the fill nearly always right.

5How the five PRs reach main

Who makes the fixes, and how do the five PRs become one change on main?

Background

Today the five PRs point at matching/alpha-fixes, which is 3 commits behind main. Combining them needs conflict fixes in 7 files and one shared generated file (the confidence table) made once on the combined code. Besides your decisions, these fixes need no choice (owner in brackets):

Your choice

Why A: parallel fixes by the owners, one combined check before main, and one clean commit on main.

Round 2: two new decisions (6 and 7)

Decisions 1–5 are done: you chose A for all five, and the five PRs were fixed and combined. Then two reviewers (an independent one and Fable) read the combined change. I fixed what was clear: the fill now respects decision 1's guard, branch names after a bank are no longer payees, glued clearing codes on SELF cheques, the fallback for unmeasured ties, the cash count, and a screen-reader detail. All checks pass, and the replay is unchanged (+120 right automatic saves on a first import; 2 wrong saves in "full", the Row B you accepted). Both reviewers raised the two questions below. Each one changes how the app behaves, so they are your choice.

6One correction on a SELF cheque changes all of them

You change one SELF cheque from Cash to another ledger. Should the other SELF cheques follow?

Background

With #148, SELF cheques ("SELF-CHQPAID- SARDARCHOWK") are saved to Cash Account automatically. With #149, cheques with the same text share one payee pattern (the cheque number no longer splits them). Together, these interact:

10 SELF cheques → all saved to Cash Account automatically (#148) You change cheque 4 to Labour Wages (that one was really wages) → the other 9 SELF cheques become Labour Wages too (#149's learned pattern beats the cash rule) → once exported, every SELF cheque in every later import is saved to Labour Wages

What the books say: in the 10 companies' books, all 99 SELF cheques were booked to Cash Account (5 more were never booked). In the alpha, every SELF cheque a user touched also went to Cash. A SELF cheque that is not cash is a one-off exception, so spreading that exception is almost always wrong.

The independent reviewer reproduced this with a test. It is the same kind of case as Row B in decision 1, but here it spreads to every SELF cheque, not one row.

Your choice

Why A: the books never book SELF cheques anywhere but Cash, so one exception should stay an exception.

7Should the fill change entries you chose yourself?

When you change a ledger, the app fills the same payee's entries that still had the old ledger. Should that include entries you set by hand?

Background

Decision 4 made the payee fill automatic, with no pop-up. The fill takes the payee's open entries in the same direction: no choice, Suspense, or still the old ledger of the entry you changed. That last part came from the old pop-up, which asked first. Now nothing asks, so this happens:

Payee "GST via BillDesk", 3 payments: A, B, C You choose GST Provisional for B and for C, by hand, one at a time Later you change A from GST Provisional to GST Late Fees (only A was a late fee) → B and C, which you chose yourself, silently become GST Late Fees too

Both reviewers flagged this. The 99.2% accuracy in decision 4 was measured on open entries, not on replacing your own choices. On the other hand, an entry filled automatically a moment ago (by matching or by the fill) has no choice of yours to protect.

Your choice

Why A: automatic fill saves key presses on what you have not decided yet; it should never overrule what you have.

Also noted, no decision needed: on the Export list, "Accept all N" saves every listed entry while Ctrl+Shift+Enter saves only the rows a column search shows. I will make both save the same rows. A town name nobody listed can still count as a payee on a cheque (accepted in decision 2). Alt+] / Alt+[ in the Ledger box block typing those characters with Option on macOS; the app ships for Windows, so this is left.
Your choices — copy and paste them back to me.

   

Sources: combined checkout of #148, #149, #150, #152 and #153 on main ba0e44e; bun run matcheval on the 10-company replay corpus; the 17/10 production copy; the threads' cross-reviews and an independent review. Customer names in the examples are shortened or replaced.