field · Jan 20, 2026
The queue is a list, not a spinner
The offline queue is the least glamorous part of Tidep and the part I will defend in any meeting, including meetings that wanted a map instead. A route is a promise that the round can be recorded where it happens. Where it happens often has no signal. If the promise depends on a bar of reception at the top of the embankment, you have built a notebook with extra failure modes.
What is on the device, if you loaded the route before you left, is the route, the limits, the last three readings, and every record and photo you have made since. What is not on the device is the rest of your history and anyone else’s route. We drew that line so the phone is not pretending to be the server. The doc says the same thing in fewer adjectives. This essay is for the times the doc sounds like a compromise and someone asks for the percentage back.
We used to show a percent. Upload 64 percent. It looked like progress, which is why it was a mistake. An inspector at East Ward sat in a truck and watched the number because the number implied that watching was the job. The number stalled at the ridge, as numbers do, and the route stalled with it. Helen Park asked us to take it off. Release 2.3 is a count. Four records waiting. Or none. A count does not invite you to supervise it. It invites you to drive until the count can leave.
The harder bug was honesty. In a cooler at Larkspur, a phone died while a gasket photo was between the camera and the record. The record said saved. The photo was not in the queue. The morning had a checkmark and no picture, which is a worse lie than a missing check, because a missing check looks unfinished and a saved record looks done. Release 2.7 does not mark the record saved until the file is in the queue. If the operating system kills the app first, you take the photo again. I would rather annoy you once than hand your supervisor a phantom.
Conflicts are the other place people ask for magic. Two inspectors, one check, both offline, both sincere. A product can hide this by keeping the later timestamp and dropping the earlier one. Later is not truer. Later is just later, and on two devices the clocks are a rumor. We show both. A supervisor picks, or you correct. It is a few extra minutes in a month, and it is the difference between a number you can defend and a number that changed in a cupboard.
I get asked about “smart sync,” usually by someone who has not stood in the yard. Smart, in that sentence, means silent. Silent sync is how a close from the parking lot overwrites a reading from the room, or the other way around, and the pack looks calm. Calm is not the goal. The goal is a list of what is on the device and what has left it, with no third state called “probably.”
Battery death is ordinary. Cold is ordinary. Gloves are ordinary. None of these are edge cases to be soothed with a toast notification. The queue has to be boring. Boring means: you can explain it to a new inspector in a minute, you can see the count without opening a menu, and a dead phone does not invent a saved photo. If a future version of this screen gets more beautiful and less obvious, we will have failed, and I hope someone on the crew says so before the release, not after a startup.
There is a limit to what the device should promise. If you need a reading from a pole you have not visited and have not cached, you need a network or a prior export. I will not cache the entire cooperative on a phone to avoid that sentence. Phones get lost. A lost phone should not be a copy of every pole you have ever touched. Load the route you are walking. That is the scope of the promise, and the scope is the security model as much as it is the product model.
If you remember one behavior, remember the count and the refusal to say saved too early. Everything else in the field screen is a way to get readings into that queue without inventing a second, kinder truth.