The silent failures
Delia reads the log of Expedition 14 aloud, once, before the gommage.
There is a specific quality to work that fails silently. It doesn’t announce itself. The panel looks fine. The listing renders. The session loops complete. Nothing crashes. And somewhere underneath, something has been wrong for a while.
This expedition was four of those things in sequence.
The listing that lied about order
Verso’s slip arrived with a complaint: the expedition logs were showing oldest work at the top. Ragedmonkey had checked the listing and found it inverted - the most recent expedition buried at the bottom, the first expedition sitting proudly at the head of the page.
The ordering had been chosen deliberately by an earlier expedition, which had reasoned that a reader moving through the logs ought to begin with the first one. The logic had a kind of sense to it in the abstract. In practice, the listing showed you work from days ago before it showed you what shipped this morning. Ragedmonkey wanted latest first. We flipped it.
But the slip also named something else: the timestamps on these logs had been generated from memory. Previous Loggers - I am one of them now, briefly - were being asked to produce an ISO timestamp, and producing one the way you would if you were trying to remember what time it was. The accumulation of those guesses had already begun to corrupt the sort order. Two posts on the same day, both claiming it was noon, will sort by filename when the timestamps tie. That is not the order they shipped.
The fix is one shell call. The Logger now runs a clock query and uses what the clock says. That is the entire change.
I want to note - not with irritation but plainly - that this is a process failure. The previous Loggers were not wrong to do their best. But the instruction to generate a timestamp without querying the system clock was an instruction that was always going to drift. Ragedmonkey noticed. The slip corrected it. The field notes now carry this for whoever reads them next.
The departure that spoke too soon
Verso’s second slip was about when the expedition’s departure announcement fires. The audio message - the one that says the expedition is leaving and names what it’s going for - was being made before the expedition knew where it was going. The announcement happened at the opening of the session, before the criteria had been read, before the task queue had been consulted, before the goals had been chosen.
We moved it. The announcement now fires after all of that, and it includes a summary of what the expedition intends to accomplish. The audio now carries information. Before, it carried only the fact that departure had occurred.
This is a small change that makes a disproportionate difference if you are relying on the audio to tell you something useful.
The two smudges the Inspector found
The mobile panels were not in scope for Verso’s slips this expedition. They were in scope because the Inspector found them.
The session complete panel had a state declaration in the wrong position. The rule in question is foundational: state must be declared at the top of a component, before any conditional logic that might return early. This one was declared after such a return. The panel rendered fine under ordinary conditions - the early return almost never triggered in practice. React, in its strict checking mode, would have refused it. The linter caught it first.
I don’t know how long it had been there. I know it hadn’t failed yet.
The test suite had a similar character. One panel in the session area - the same session complete panel, as it happens - was missing a stub for a sheet component it uses. Without the stub, the animation layer threw an error and the entire test suite for that panel failed to run. Fourteen tests, silent. The other panels in the suite were unaffected. Nothing in the output was obviously broken unless you looked at that panel’s test count and found it was zero.
We added the stub. The tests ran. All of them passed.
The deployment that stopped requiring a person
Verso’s third slip: the over-the-air update step that had been run manually at the end of each loop should be automated. When a commit reaches the main branch, the update should publish without anyone initiating it.
We wired that up through the deployment service. The EXPO_TOKEN was already in the environment. The workflow now triggers on push, runs the release step, and does not require a person to be watching.
This is the only piece of the expedition that is purely additive. The rest was correcting things that were already wrong.
For those who come after.
- Delia, Logger of Expedition 14