Gemini quietly drops %1$s from translations, and no reviewer catches it
Format specifiers go missing, turn full-width, or get duplicated when Gemini translates app strings. Here are the four failure modes I keep seeing in production, how to stop them at generation time, and a short check that catches the rest.
The One Call I Refuse to Hand Gemini During a Phased Release
Day one of a phased release has nowhere near the sample size to tell a healthy build from a broken one. Here is the three-state rollout gate I use, and the narrow job I give Gemini inside it.
How Many Assistant-Dependent Lines Are Still in Your App?
On September 4th, Google Assistant on Android begins its replacement by Gemini. Here is how to grep your own project for every entry point an assistant can open, and how to turn that list into utterances you can actually test on a device.
A minimal pre-send guard for Gemini-drafted app review replies
Store replies are risky after you hit send, not before. Here is a short Python guard that blocks unkeepable promises, leaked contact details, and register slips, plus the two false positives it produced on the first run.
The Assistant Switch Is One-Way, So the Baseline Has to Be Captured Now
From September 4, Google Assistant is replaced by Gemini, and a device that has switched cannot go back. Here is how I started recording voice-originated launches inside my own apps, and the assumption about splitting before and after by date that turned out to be wrong.
Your Shipped App Still Remembers the Retired Model
Finishing the server-side migration is only half of a model retirement. The older builds of your app still hold the old model name, and once the cutoff passes, rolling back stops being a recovery option. Here is how I moved model resolution onto the server.
Moving to the Batch Tier Cancels Out the Gemini 3.7 Flash Price Increase Exactly
Introductory pricing for Gemini 3.7 Flash ends on December 31, 2026, and the rate doubles the next day. Here is which models are affected, which are not, and how to project your January bill from the usage you already have.
The Memory Wasn't Lost — It Was Written to a Different Profile
A Memory Bank profile is identified by the pair of schema and scope. When call sites build that scope slightly differently, extra profiles appear with no error at all. Here are the measured numbers for how badly it fragments, and how three candidate fixes actually performed.
Measuring Update Policies for Memory Profiles: The Guard That Cost Me 16 Points of Accuracy
Memory profiles went GA in Memory Bank, making structured memory available to downstream code. I built three update policies and compared them under identical conditions. The one that looked obviously correct turned out to be the worst. Full harness code and the path to per-field TTLs.
What Decided Our Cascade's Economics Wasn't the Escalation Rate
Putting Flash-Lite in front of 3.6 Flash and escalating only the hard items looks like an easy win. Estimating it from the escalation rate alone will mislead you. Here is the break-even solved with the escalated subset's output length in the equation.
Still image or short clip? Deciding feature placement from the cost gap between Nano Banana 2 Lite and Omni Flash
When I froze over whether a wallpaper app's hero asset should be a still image or a short moving loop, the deciding factor was not taste but the order of magnitude of the cost. Here is how to normalize Nano Banana 2 Lite and Omni Flash onto the same footing, down to a working decision function.
"No Watermark Detected" Doesn't Mean It Isn't AI — The Asymmetry of SynthID
Images generated with Gemini carry a SynthID watermark. But a positive result and a negative result don't carry the same weight, and that asymmetry changes how you should track provenance.