Small week. Four commits, all in kickstand-web. Two rally-badge PRs and two CI fixes on the mobile OTA pipeline. Worth writing about because the CI fixes are the kind of thing that eats an afternoon and teaches a lesson you keep.
Rally badges, finally rendering everywhere
PRs #532 and #533 fix a bug that had been quietly embarrassing us for a while: rally badges (rows keyed rally-<slug>-<year>) resolved correctly in the Trophy Case but nowhere else. The community feed rendered an icon-less fallback. The showcase picker silently dropped them — so users literally could not pin a rally badge to their profile. Earned-badge celebrations never fired.
The fix normalizes rally-row resolution across every surface that touches earned badges. Same PR also lays down the design spec for GPS check-in, which is the next thing on the rally track. Nothing clever in the fix — it's the kind of thing that shows up when a feature gets bolted on in one place and the rest of the codebase never learns about it.
Two CI failures, both about tools that lie
The mobile OTA workflow broke twice this week. Both failures are worth writing down.
First: the environment guard on the OTA workflow started failing on Aug 3 (run #3), claiming every EXPO_PUBLIC_* var was missing. All six were in fact set in the production EAS environment. The actual failure: eas-cli >= 21 removed the --non-interactive flag from env:list. My guard had || true on the end, which swallowed the unknown-flag error, handed the guard an empty variable list, and let it "correctly" fail the run for missing env.
Fix: drop the removed flag, remove the || true, fail loudly if env:list errors. || true is a code smell in CI. If you don't want to know when a command fails, you don't want to be running it.
Second: expo-github-action tried to install eas-cli via yarn on a Node 24 runner and hit exit 1 on /usr/local/bin/yarn. Run #4's log line — Installing eas-cli (24.7.0) from cache or with yarn — made the failure obvious once you actually read it. The action wrapper wasn't giving us anything: eas-cli honors EXPO_TOKEN natively in CI. So I ripped the wrapper out on both the verify and publish steps and replaced it with npm -g install eas-cli plus the token env var.
Fewer dependencies, one fewer thing to break the next time Node bumps a major.
The pattern
Both CI fixes were the same shape: a tool changed underneath me, and a defensive shim (|| true, an action wrapper) hid the actual error message. The lesson isn't "don't use wrappers" — it's that every layer of indirection is a place where a real error gets turned into a lying one.
That's the week. Back to rally check-in next.