Build log / archive
September 2026_
5 builds logged this month.
The server's answers become the test paper
- This morning's new iPhone test rig had one honest asterisk: the sample server answers it tested against were copied out by hand. Careful hands, but hands — if the server's real answers ever drifted from the transcription, the tests would keep passing against yesterday's truth. As of tonight the samples are generated by the server's own code: fifteen real answers — your account, her cycle status and calendar, test results, the retest window, the two-minute check, notification settings, heat events, feedback, badges, the weight trajectory — written down exactly as the wire carries them, quirks and all (decimal values that arrive as text, dates to the millisecond).
- Three locks hold the loop shut: the server refuses to build if a stored sample stops matching what its code actually sends; the iPhone build refuses if any sample stops decoding — or if a new sample appears with no test reading it; and the website's checks read the same files. A change on any side that would break another now goes red on the build board before it can reach a phone.
- Writing it down honestly caught a small fib in the old hand-copied version: it tested the iPhone against a heat-event source label the server cannot actually send. Nothing was broken — but that is precisely the class of quiet drift this machinery exists to end.
The iPhone's engine room meets a compiler
- Until today the iPhone app had one honest gap in its safety net: the machinery that checks every update could catch a typo in the code, but not a wrong assumption — whether the app still reads the server's answers correctly, whether the doctor's summary sheet still builds the same document as the website's, whether a reference value quietly drifted. All of that was checked by a careful human read, every day, by hand. As of today the core of the app — how it reads your data off the wire, the doctor's copy, the WHO reference points, the weight-unit conversions, the shared vocabularies — is compiled and put through sixty-one real tests by machine on every single change.
- The very first pass caught something real: if the server ever sent an impossible calendar date (a February 31st), the iPhone would have quietly rendered it as a different day — early March, with nothing to say it wasn't yours. It now refuses to show a day the server never sent, the same rule the server itself follows.
- The tests also pin the two platforms together, word for word: the reference values on a semen analysis, the wording of what's shared with a partner and what's withheld, the labels on notifications — the iPhone and the website can no longer drift apart on any of them without a build going red.
The welcome mat was never out
- Today's two truth-telling sweeps got the house treatment: read back line by line, adversarially, before anything new was built on them. The iPhone sweep held clean — every new call checked against the real API, every screen's states re-derived. The website's sweep held too, but auditing it turned up something older hiding underneath: the "New here? Run first briefing" pointer on the Today page — the one card meant to greet a brand-new account and point it at the three-minute setup — could never actually appear for the person it was written for. A quirk in how the page judged "nothing here yet" meant the only visitors who ever saw it were ones whose connection had partly failed. The welcome mat existed; it was just never put out. It now greets exactly who it should: every read landed, nothing logged anywhere, here's where to start.
- A browser test now registers a fresh account and checks the welcome card is standing, so the front door can't quietly lose its greeting again.
- And one manner the iPhone learned yesterday reached the website: on a dropped connection, a linked partner's Today page no longer quietly rearranges itself while a read is failed — the tiles stay put and say what happened, same rule on both platforms.
The iPhone stops lying about bad connections
- This morning's fix taught the website to admit when a request fails instead of dressing the failure up as an empty page. This afternoon the iPhone app got the same lesson, because it had the same disease everywhere: on a flaky connection Today could declare "All cool" over a heat log it never fetched, tell a man with months of results "Nothing logged yet — log your first test", and invite a linked partner to "set up partner tracking"; Key dates, the Playbook and the medications ledger sat on "Loading…" forever with no way back; the feedback page could quietly show your sent history as if it had never existed; and My Fertility's quieter panels — the retest window, the two-minute check, the Body charts — simply weren't there, indistinguishable from features that don't exist.
- Every screen now says what actually happened, in its place, with a Try again that re-fetches — the same honest line, word for word, as the website's. Today gets the one-line summary at the top for the panels that hide when empty, the Comms screen never claims the AI writer is off when it merely couldn't check, notification settings explain themselves instead of sitting greyed out, and a heat event you delete or re-tag that didn't save says so instead of quietly reappearing.
- The sweep also caught a proper bug hiding in the calendar: the day editor's "Your levers" section — the quick Met / Not chips for logging your daily habits from the grid — could never appear at all, because the code that fetched the lever board only ran once the section was already on screen. It loads properly now, on every day within the two-week logging window, and a lever tap that doesn't save tells you nothing was saved.
The whole shop stops lying about bad connections
- Yesterday's find in the staff room — panels that quietly vanished when a request failed — raised an obvious question: does the rest of the shop do that too? It did, all over. On a flaky connection the feedback page could show you a history with nothing in it, as if everything you'd ever sent had gone; the playbook could greet a page of logged moves with "Nothing logged yet"; the medications ledger could claim "Nothing logged" over real entries; the weight card could say "No weigh-ins yet" to someone with months of history. Worst of all, the Today page: a failed heat-exposure check declared "All cool", a failed test lookup said "Nothing logged yet — log your first test", and a failed status check told a linked account to "set up partner tracking". Every one of those is a confident statement about your data made by a page that hadn't managed to read it.
- All of it now tells the truth. When a section fails to load it says so, in its place, with a Try again that re-fetches just what's missing — no reload, no lost work. Today gets one honest line at the top for the panels that hide entirely when they're empty, so a thin-looking morning can never silently be a broken one. The Comms page no longer claims the AI writer is switched off when it simply couldn't check, and notification settings no longer sit on "Loading…" forever with no way back. Deleting or re-tagging a heat event that didn't save now says it didn't, instead of quietly putting the row back.
- And the browser tests have learned to break the network on purpose: they now cut individual connections mid-page, watch the honest message appear where the false "all clear" used to be, and click Try again to see the real data land. A page that goes back to bluffing fails the build.