This is the whole screen, as the app's own code prints it:
( ! )
Alpha stopped and needs you.
We can't say why yet from here - check on Alpha.
Stopped 31 min in.
ALPHA: Stopped
THE DOCK: Online
TODAY: 2 runs, 31 min.
[canned data]
It's the phone's home screen for one situation: Alpha stopped partway through a clean, and the app has no idea why. I design the app's screens and Anjali builds the part that talks to the dock, and this is the second screen of mine that has been written as working code rather than drawn. It's also the smallest. Everything in the banner comes from one row the dock keeps about the last run: how the run ended, how many minutes it lasted, and how far Alpha travelled if the dock knows (today it doesn't, so that line doesn't appear at all). The numbers above come from the stand-in dock we build against, which is what "[canned data]" at the bottom means. If you're adding them up: two runs today make 31 minutes, and the last one alone was 31, so in the canned data the other run lasted zero. I've left the printout exactly as the code prints it.
Why there's no button
Three years of making thumbnails have trained my hand to end a screen like this on a big friendly button. Resume. Try again. There isn't one, because the app can read the dock and it can't tell Alpha anything yet: nothing on the wire carries a command from the app. A Resume button that does nothing when you press it is a lie with rounded corners, and it would be the first thing on the screen a person touched. So the one instruction on the glass is a sentence: go and look.
31 minutes in, and no clock
The line I like best is the dullest one. "Stopped 31 min in." There's no "at 9:20" after it, and there's a reason.
The dock on the bench has no real-time clock, and nothing sets its clock over the network yet. It counts from the moment it was switched on, so it can tell you a run lasted 31 minutes and, on its own, it has no idea whether that was breakfast or midnight. Your phone has a clock, but it only knows when you looked, and that isn't when Alpha stopped. The row does have slots for a start time and an end time. Today they are empty, and the screen draws their emptiness as nothing at all: no dash, no "unknown", no little clock icon waiting for a number.
That sounds obvious written down, and my first sketch of this screen still had "at 9:20" on it. The stand-in dock we build against carried a made-up "09:14" for two days, because nothing on the screen side refused it. In Anjali's words, "a screen that ignores a wall is the next place a fixture lies quietly." So this screen refuses a clock time outright, and the refusal carries its own end date, which I'll get to.
There's a second, smaller version of the same idea. When the dock loses touch with Alpha mid-run, the line reads "Lost touch 9 min in." My draft said "Last heard." Anjali handed it back with an example that I can't improve on: the row records the moment the dock gave up waiting, five seconds after the last thing it heard. If Alpha's last message arrived 8 minutes 57 seconds into the run, the dock closes the row at 9 minutes 2 seconds, and the old line, rounding down to the minute, said "last heard 9 min in" about something it last heard at 8. Her way of putting it: "the dock can't say when it last heard; it can say when it lost touch."
Eight things it won't draw
Before this screen puts a single character on the glass, it checks the row, and if something is off it refuses, instead of drawing its best guess. Today a refusal is a loud error in the code. What the phone shows in its place isn't designed yet. That design is on my desk, and a stopped robot's screen can't go blank because one stray field turned up.
There are eight of those checks. Seven came off the paper version with Anjali, and the eighth is mine. Three that a normal person would feel:
- A "needs you" banner with no run behind it. If the dock says a run ended and there's no
row, you don't get an alarm about nothing.
- Anything anywhere in the dock's message with "cause" or "reason" in its name. The dock
doesn't know why Alpha stopped, so a field claiming to know gets the whole screen refused rather than shown.
- A clock time in those empty slots. This is the eighth, the one I added, and it's this
screen's rule rather than the dock's. The dock is allowed to send a time; this screen won't draw one until the dock can really tell it.
Each of the eight has its own test. On Wednesday morning all of them ran, twice, on Priya's bench shell, and passed. Four of them passed for the first time.
The first time the tests ran
When I wrote the test file, my laptop didn't have the testing tool on it, which is a very me problem to have, so it sat for four days without executing anywhere. Last Friday Anjali read it, without running anything, and found a bug: the file loaded two of its pieces in the wrong order, and it would have fallen over before a single test started. My quick run-through never saw it because it loads them the other way round. I fixed it on Monday, and I fixed it in a way that doesn't depend on the order, because I know exactly who would tidy those two lines into alphabetical order one day and break it again.
Tuesday afternoon the file ran for the first time. The order fix held. And then four of the eleven tests failed, all the same way, all on the rule about "cause" and "reason".
My screen wasn't wrong. The stand-in dock was. It hands each test a copy of a pretend message to work on, and it was copying only the outer layer. Think of photocopying the cover of a folder and handing over the original pages inside. One of my tests deliberately writes a "reason" into one of those inside pages, to prove the screen refuses it. That write went into the original, every test after it got a message with a reason in it, and the screen refused every one of them for exactly the right rule. Anjali, when she found it: "Your tests are right. My docstring said a screen couldn't dirty the fixture, and my test for that only dirtied the one layer I'd copied."
Her fix copies the whole folder. It passed Wednesday morning, twice, and after it all eleven of my tests passed, twice, in the same sitting. The screen went into the app's code at 09:35.
The ground under the screen had gone green a day earlier: the stand-in dock's empty clock slots, the change that took "09:14" out, passed on Tuesday's 08:30 ring. Anjali's record: 15 passed, and "12/12 green" on the home screen's own checks, both twice, on Priya's bench shell.
Block 13 ran half its roll
Last week's piece said block 13 would roll the marked tyre twice, once at the first stop and once at the close, and that the gap between the two would say whether the tyre's squash under Alpha's weight changes over a block. The first roll happened. The second didn't.
The Tuesday 08:30 ring that cleared those clock slots also came up red on one line: a count in the test file that should have gone up when five new things were registered in the ledger last week, and didn't. The red wasn't in the code that writes the ledger. The test's own count was stale, and the fix is one digit. The rule written down the afternoon before said a red means the block runs its first stop only, with the reason in the cell, and the one-digit fix doesn't happen at the bench, because a file edited at 08:40 hasn't been tested. The first stop ran and the close didn't.
The close roll is chalk, a tape measure and Alpha's own weight. It doesn't need that code. By the evening Cass had changed the rule: "A red at a ring costs the legs that need the red file. Nothing else."
The first roll found the squash again: about a third of a percent, the same size as block 12's first stop. Priya's reading of it: "So it's a repeatable constant at the START of a block." What it can't say is whether it moves across a block, and that was the question. The pair of rolls moves to block 14 on Friday, first stop and close.
The door
As of the 23 September table, covering the seven days before it: two visits, both to the front page on 22 September, and no post opened. Last week's piece and its channel post were both out inside that window.
When the eighth check retires
The eighth check passed its own test for the first time on Wednesday, and the screen's source file already says, in writing, the day it comes off: the day the dock can tell the time and the contract between the dock and the app says so. It comes off by a dated edit, and the line that draws "at 9:20" goes in with the same edit, with its test. Until then, 31 minutes in is everything the dock knows, and it's what the screen says.