explore · the long version

The whole thing, unhurried.

पूरी बात, बिना जल्दबाज़ी के.

The landing says what Sathi refuses to do. This says why that is the hard part — the shape of the problem, how confidence gets constructed when the model will not give you one worth trusting, and every number we measured, each with the page it came off. Nothing here is a user count, a survey or a testimonial. We have not run Sathi in a shop yet, and saying otherwise would be the one thing this product exists to refuse.

A notebook line is not a record. It is a reminder, written for someone who already knows the rest.

एक notebook की line record नहीं होती। वह उस आदमी के लिए लिखी याददाश्त होती है जिसे बाकी सब पहले से पता है।

That it was Tuesday, that it was for atta, that Ramesh already had ₹700 outstanding, that his brother settles at month end.

A notebook line reading: रमेश को 200 उधार
no dateतारीख नहींno itemसामान नहींno running balanceबाकी हिसाब नहींno directionलिया या दिया, पता नहीं

All of that lives in the owner’s head. The notebook only stores the part that is hard to hold in memory: the number.

01 — the problem

The real system of record is the owner’s memory. The notebook is a lossy backup for it.

दुकानदार का असली हिसाब उसकी याददाश्त में है। बही तो उसका अधूरा backup है।

That works right up until it doesn’t.

  • 01

    Memory decays before the debt does.

    याददाश्त कर्ज़ से पहले मिट जाती है

    A customer who comes weekly stays fresh. One who came twice, six weeks ago, does not. The line is still in the book and is now meaningless — the owner cannot reconstruct what it was for, or whether it was settled.

  • 02

    Memory is unshareable.

    याददाश्त बाँटी नहीं जा सकती

    The owner's son minds the counter for an afternoon. He can read the book but not the context, so he either refuses credit to a good customer or extends it to a bad one.

  • 03

    Memory is uncontestable.

    याददाश्त पर बहस नहीं जीती जाती

    When Ramesh says he already paid, there are two recollections and one ambiguous line. No evidence. The owner eats the loss or damages a relationship they depend on — and when the customer lives four doors down, the relationship usually wins.

  • 04

    Memory cannot add up forty pages.

    चालीस पन्ने कोई दोबारा नहीं जोड़ता

    Arithmetic drift compounds silently: a carried-forward total off by ₹300 stays wrong for months, and an entry written twice on consecutive days is never caught.

The loss is not fraud. It is attrition.

नुकसान चोरी का नहीं है। नुकसान रिस-रिस कर होता है।

Udhaar quietly stops being collectable because the record became unverifiable, and the owner writes it off rather than argue.

why nobody has fixed it

Every existing answer asks the owner to change behaviour: install a ledger app, type each transaction, migrate the book. They don’t — writing one line takes two seconds, and the notebook never crashes, never needs a password, and works while the customer stands there impatiently.

Sathi asks for nothing. Keep writing in the book. Photograph the page at closing.

Sathi कुछ नहीं माँगता। बही में लिखते रहिए।

02 — what it does

It treats the notebook as a claim to be verified — and its own reading of it exactly the same way.

बही को सच नहीं, दावा मानता है — और अपनी खुद की पढ़ाई को भी।

a

Classify first, count second

पहले पहचानो, फिर जोड़ो

Classify every block before anything is counted. Only udhaar and payment become ledger entries — a supplier note parsed as customer debt corrupts a balance permanently.

  • रमेश को 200 उधारudhaar→ entry
  • सीता ने भुगतान किया 500payment→ entry
  • अशोक से 156000 का सामान लियाsupplierexcluded
  • मोहन का ऑर्डर → ब्रेड 60, दूध 120, कुल 180orderexcluded
  • दुकान का खर्च (सफाई वाला) 100 नकद दियाnoteexcluded
b

Read it twice, not once

एक बार नहीं, दो बार पढ़ो

Two passes, from genuinely different pixels. Asking the same read for a different output format returns the same wrong number serialised differently — so pass B perturbs the image instead. Where they disagree, both readings survive.

matching rule

Two readings are paired on the words with the digits stripped out. The amount is what is in dispute, so it must never drive the match. Keying on the full text found zero disagreements — it was discarding the smudge as “seen by only one pass.”

c

Reconcile on two axes

दो तरफ़ से मिलान

Within a page: do the entries sum to the total the owner already wrote? Across pages: does each customer's carried-forward balance match what Sathi computed from every earlier page?

Notebook line: बबलू का ऑर्डर → दाल 100, चावल 150, तेल 60, कुल 310
100 + 150 + 60 = 310verified · पक्का

Three order groups on the test page summed exactly to their written totals and were promoted to 0.99 verified. Three figures confirming each other is stronger evidence than any single read.

d

What it could not read never becomes a balance

जो पढ़ा नहीं गया, वह हिसाब में नहीं जाएगा

Anything unreadable or contested becomes a card carrying its source crop, never a value. The owner resolves it by tapping or by speaking, and the correction propagates forward through every later page.

Notebook line: बबूल को 450 उधार

Both passes agree the amount is 450. They disagree on who owes it — one read बबूल, the other बबदूल, and the ledger already holds a बबलू.

approximately, unverified: ₹450

Below the identity floor Sathi queues rather than resolves. Merging these silently moves ₹450 onto the wrong person; splitting them silently invents a customer.

What comes out is a corrected per-customer ledger with provenance on every figure — and a ranked list of who to chase today.

03 — how confidence is constructed

Confidence does not come from the model. It is built from two separate witnesses.

भरोसा मॉडल से नहीं आता। वह दो अलग गवाहों से बनाया जाता है।

Confidence is not read off the model — see §04 for why it cannot be. It is constructed here, from two signals that fail independently.

signal a

Cross-pass consensus

दो पढ़ाई की आपसी सहमति

The page is read twice from genuinely different pixels — not the same read asked for a different output format, which returns the same wrong number serialised differently. Two readings are paired on the line text with the digits stripped out: the amount is precisely what is in dispute, so it must never drive the match. Where they disagree, both survive in competingReadings and the entry is not resolved.

signal b

The arithmetic already on the page

जो जोड़ दुकानदार पहले ही लिख चुका है

Line items that sum to a written total mutually confirm each other — three figures agreeing is stronger evidence than any single read, and it costs nothing because the owner wrote the total anyway. A mismatch does not condemn the page; it localises which group is wrong.

They are never wrong together — which is why there are two.

दोनों एक साथ गलत नहीं होते — इसीलिए दो हैं।

A confidently misread digit sails through consensus and breaks the arithmetic. A page whose written total is itself wrong sails through the arithmetic and breaks nothing else. The two signals catch different failures, which is the only reason two are worth having. A value that fails either one is a card, not a balance.

what the two signals produce

verified · पक्का

Both passes agree, or the page’s own total confirms it

₹14,200

plain numeral · no chrome

uncertain · जाँच चाहिए

The two passes differ, or the sum does not reconcile

approximately, unverified: ₹9,120

≈ prefix · dotted underline

unreadable · पढ़ा नहीं गया

Not legible — deliberately not guessed

रकम पढ़ी नहीं गई

numeral suppressed entirely

Colour is never the only carrier. Every state also has a glyph and a distinct numeral treatment, so it survives deuteranopia, greyscale printing, and a cracked screen in daylight. The three figures above are illustrative of the treatment, not measurements.

what happens once there is a second page

Checking one page is easy. The real work is matching it against every page before it.

एक पन्ना जाँचना आसान है। असली काम पिछले पन्नों से मिलाना है।

Carry-forward, checked not copied

Page 2 opens with रमेश का पुराना हिसाब 1200. Sathi does not accept it — it checks that figure against the balance it computed for रमेश from page 1. They do not match.

approximately, unverified: ₹1,900delta · fired

carry-forward mismatch across the two pages · the card carries its crop

Two names queued, not resolved

Below the identity floor Sathi asks. Both questions look alike and are not: बबूल / बबलू are two spellings on the page — an answer merges a customer across every page. रमेश / रेशम is one line two passes read differently — an answer must fix that entry and nothing else.

treating the second as the first absorbed राकेश’s real ₹400 into रमेश’s balance · DECISIONS D40

The same entry, written twice

An entry copied onto consecutive days is never caught by hand, because nobody re-reads forty pages. Duplicate detection runs after every ingest and each hit carries both source crops and the delta it would move.

no count quoted here — the only count on record was measured on a fixture pair the demo no longer uses, and a superseded number is still a wrong one

Resolution runs the other way too: answering the page-1 card moves the page-2 carry-forward delta from ₹1,900 to ₹1,700 on screen. Corrections are written down and the superseded reading stays distinguishable from the current one — see scripts/verify_api.ts and DOCS/DECISIONS.md D33, D40.

04 — what it is worth

Sarvam returns a confidence score. It does not track correctness.

Sarvam एक confidence score देता है। वह सही होने से मेल नहीं खाता।

This is the smartest thing we learned, and we learned it by measuring rather than assuming. It is why Sathi builds its own confidence instead of trusting the model’s.

header — दिनांक : 26/07/26 · पेज 1

0.577

correctread perfectly, every character

table — the block holding the smudged supplier figure

0.698

wrong numbercontains a wrong number

It is a layout-detection score — confidence in having found a region, not in having read it. The block containing the error scored 0.121 higher than the block read perfectly. Using it as a proxy for correctness would have promoted the error and demoted the truth.

where these numbers came from

  • One photographed page.

    fixtures/Notebook_one_col.png, 37 handwritten lines, code-mixed Devanagari and Latin, run through the real pipeline on 26/07/26.

  • Read more than once.

    Five extraction variants are on disk in scratch/onecol/. Every claim above is diffable against them.

  • No sample. No survey. No users.

    We have not run Sathi in a shop. Nothing on this page is a user count, a testimonial, or an aggregate — because there isn’t one, and inventing provenance is the exact failure this product exists to refuse.

The same smudged digit, read two ways

एक ही धब्बे वाले अंक की दो पढ़ाई

156000vs155000

pass A full page en-IN · pass B sharp-perturbed hi-IN

The owner's own subtotal was wrong

दुकानदार का अपना जोड़ ही गलत निकला

₹6,220vs₹3,150

22 udhaar lines summed · against the subtotal written on the page

Three order groups summed exactly to their written totals

तीन order groups अपने लिखे जोड़ से बिलकुल मिले

Notebook line: बबलू का ऑर्डर → दाल 100, चावल 150, तेल 60, कुल 310
0.99verified · पक्का

promoted on arithmetic alone · no second pass required

what the lines add up to · entries का जोड़

approximately, unverified: ₹6,220

what the page says · बही में लिखा कुल

approximately, unverified: ₹3,150

Neither figure is promoted. Both stay marked until one is confirmed, because the arithmetic says one of them is wrong and nothing on the page says which. Nobody re-totals forty pages by hand — this is the drift that makes a debt unarguable six weeks later.

If this ran in one shop

assumed · not measuredअनुमान

A labelled back-of-envelope calculation is worth more than a claim about empowering local business. Baseline assumed for one kirana shop: 50–70 regular udhaar customers, ₹60,000–1,20,000 of float, 40–50 days average outstanding, about two hours a month re-adding and chasing. To be validated with one shopkeeper before it is claimed as anything firmer.

01assumed

Time

2 hrs → ~15 min

Two hours a month of manual reconciliation becomes roughly fifteen minutes working a discrepancy queue. Over 70% — and the one movement directly observable, because a judge can watch the queue get worked.

02assumed

Working capital

~₹26,000 released

Aging visibility makes collection systematic instead of reactive. Moving average days-outstanding from 45 to 30 on an ₹80,000 float releases about ₹26,000 into a business that restocks weekly on thin margins.

03unquantified

The one we will not fake

—

Debt written off because the record became unverifiable. We cannot size it today. It is the reason the product exists, and the first thing we would instrument in week one.

Read the landing again with all of this in mind — back to the start.