◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Beta since 09/15 with no stable date yet; running projects in Expo Go has required login since 09/03●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Beta since 09/15 with no stable date yet; running projects in Expo Go has required login since 09/03●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
Articles/AI Models
◉ AI Models/2026-07-05Advanced

When Your Finance App's AI Keeps Dumping Everything Into 'Other' — Field Notes on Catching Silent Classification Drift

An AI expense classifier in a Rork finance app can be accurate at launch and quietly decay over months until the monthly advice goes wrong. Here is how I instrumented confidence and category distribution to get ahead of the drift, with working code.

Rork585AI31finance-appGemini8observability4classification-drift

✦ Premium Article

The Classification Used to Be Right, Then the Advice Started to Slip

I was running an AI finance app I had built on Rork as an indie developer. Snap a receipt, and Gemini pulls the amount, the store name, and a category; at month end it produces advice from your spending pattern. The first weeks felt great, and I used it every day myself.

The trouble came months later, creeping in. One month the advice said "your food spending is steady," but my gut said the opposite — my wallet felt lighter than usual. I opened the data and found grocery runs scattered into "Other." The classifier was breaking.

The way it broke was the nasty part. The app never crashed, never threw an error. It just slowly fattened "Other" while every real category thinned out — and the month-end advice, built on top of that classification, quietly went off target. The numbers came out cleanly every month; I simply could no longer trust them.

As an indie developer running several apps myself, here are my notes on how I traced that silent decay and what instrumentation I added to recover, with the code I actually run. I am writing this for anyone building a Rork app that lets AI sort expenses or receipts, so you do not end up a step behind the way I did.

"Other" Fattens Up in Silence

Before the cause, it is worth spelling out why I failed to notice. The classifier's failure was hard to see in two distinct ways.

First, seen one record at a time, "Other" always looks like a defensible choice. Putting a genuinely ambiguous expense into "Other" is not wrong. The problem was that its frequency climbed month over month. A judgment that looks fine in isolation traced an abnormal trend in aggregate.

Second, the classifier itself stayed quiet. The JSON Gemini returned carried a confidence value, but I only used it for the branch (below 0.5, ask the user) and never looked at it over time. Confidence was thrown away every single time, leaving no way to look back.

SymptomSeen one at a timeSeen in aggregate
Assignment to "Other"Looks reasonableRatio rises each month
Falling confidenceWaved through above the thresholdAverage quietly trends down
Off-target adviceOne line feels barely offSystematically wrong vs. reality

Looking back, several triggers had stacked up. More users brought more unfamiliar store names; a model update shifted behavior slightly; seasonal items changed the vocabulary on receipts. None was a single blow. That is exactly why I needed something that measures the trend, not each record.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦Logging classification confidence per record and tracking the monthly decline in average confidence
✦Quantifying category distribution drift as a distance to catch a bloating 'Other' bucket early
✦Using the user correction rate as ground truth and gating advice generation on classifier health
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

◉ AI Models2026-09-28
Keep Fixing in the Same Thread, or Restore and Rephrase? What I Learned Fixing One Rork Bug Both Ways
When a Rork fix request fails for the third time, do you keep going or use Restore and ask differently? I fixed the same bug both ways and compared round trips, leftover code, and where I now draw the line.
◉ AI Models2026-09-17
The recommended replacement was already gone — auditing all 74 rows of Gemini's deprecation table
Cross-checking Gemini's deprecation table turned up five rows where the recommended replacement had itself already shut down, including gemini-2.5-flash-image, which goes away on October 2. Here is how to verify a migration target, and how to catch the 404 before your users do.
◉ AI Models2026-07-17
The Three-Minute Video That Kept Failing — Moving Rork's Gemini Uploads Off the Worker
How I rerouted video uploads to the Gemini Files API from a Cloudflare Workers relay to a direct device-to-Google path — why the 128MB isolate limit breaks the relay, how to hand out a resumable upload URL without leaking your API key, what Expo SDK 54 broke on the device side, and how the 20GB project ceiling and media resolution decide the bill.