Working notes
Eight habits for not believing my own results, and the time each one caught something. Most of them came from being wrong first.
Curb runs on data the city never published. I work it out from where parking tickets actually get issued, which means almost everything the app says began as an inference I made up. That is a fine way to build a product and a terrible way to be right, so most of my time goes into trying to knock my own answers down.
These are the habits that stuck. They are in rough order of how often they save me.
01
Every decision I write down carries three things: what the evidence was, what it cost, and what would falsify it. The third one is the only one that does any work later.
Writing it down before you go looking is the part that matters, because afterwards you will find a reason the thing you already believe is fine. Two dozen decisions in this project have that column filled in, and the ones that later turned out wrong were caught by it.
02
When I need accurate information about something physical, I stopped searching open-data portals and started asking who touches the thing as part of their job. Whoever has to act on it keeps it true, because they pay for it being wrong.
Fire hydrants made this obvious. A crew has to find a hydrant at three in the morning in smoke, so the fire department's inventory was exact, and the four points I checked by eye were all where it said. The water utility's version of the same data was off by tens of meters and missing well over a hundred hydrants, because the utility does not fight fires. Same objects, same city, completely different reliability.
The same logic found the meter inventory, from the division that operates the meters, and the permit district map, from the people who sell the permits. Datasets that merely mention a thing drift. Datasets somebody works from stay true.
03
I was told phone location was accurate to somewhere around five to ten meters. That sounded roughly right and it was load-bearing, because the whole question of which curb you are against depends on it. So I pulled the real numbers out of my own field logs.
Two hundred and thirty-one fixes. The median was eight meters, the worst tenth was forty, and the best was two. So the hand-wave was not far off on average and badly wrong at the edges, which is where all the failures live.
The better find was hiding in the same data. A handful of values repeated exactly, to the centimetre, dozens of times. Real measurement error never does that. Those were not GPS readings at all, they were the phone falling back to wifi and cell positioning and reporting a canned number. And the eight meter median turned out to be a setting I had chosen for battery life rather than anything about the hardware. Asked properly, the same phone gets two.
04
I found what looked like a real pattern: blocks being swept twice a week rather than once. It held up as I added more data, which is usually the test for whether something is real or just noise, so I wrote it into the spec.
It was not real. It was two sides of a frontage road getting merged into one, and the reason they merged was mine. I had rounded the coordinates to four decimal places, which is about eleven meters, and the thing I was trying to measure sits about ten meters across. The rounding erased the exact signal I was looking for.
That one still bothers me, in a useful way. A false finding that gets stronger with more data is the worst kind, because every instinct says more data settles it. Now when a result surprises me I check the code before I check the world.
05
A block near La Fayette Park was telling people not to park in a legal metered space. My pipeline had flagged a white zone across the whole stretch, and the obvious read was that it was an artifact worth deleting.
I drove there and read the sign. The curb is time-shared: white zone early morning and evening, metered in the middle of the day, open on Sundays. Both things were true at once, and deleting the white zone would have erased a real parking ban that starts at 6:30 in the morning.
Then the data agreed, once I knew what to look for. Hundreds of tickets on that segment, clustered at six, seven and eight in the morning, none at nine, picking back up at one and peaking around five. The shape had been sitting there the whole time. I could not see it until I had stood in front of the pole.
06
This project runs long enough that I hand it to myself weeks later and have to trust notes I barely remember writing. So the handoff has a section near the end that lists what a summary of it is most likely to get wrong.
It mostly warns about retracted claims. When you state something confidently and then overturn it in one line an hour later, the confident version is what survives being condensed and the correction is what gets dropped. So the file names those specifically, and says which ones are dead.
The verification journal does a blunter version. It opens with a banner telling you that several entries below recommend a method that is now banned, and not to trust them. I could have deleted those entries and the file would read better. It would also have quietly taught the next reader that the record is clean, which it is not.
07
About a week into the verification work, a much faster way to pull street imagery turned up. Undocumented, free, uncapped, and it only worked if you sent a fake browser identity with the request.
I checked whether the speed was the point, and it was not. That endpoint refuses an honest request exactly the way it refuses no request at all. The pretending was not a side effect of the method, it was the method.
This is a product whose entire claim is that its data is honestly sourced, so it cannot rest on imagery obtained by pretending to be a browser. The rule now names two approved ways to look at a street and says there is no third, and it answers the argument in advance, because the argument comes back every time somebody is in a hurry. Three checks that used the method before it was withdrawn are written into the provenance record rather than quietly dropped.
A boundary you have never paid for is not really a boundary. This one cost real speed, twice, and stayed.
08
Curb does not handle event closures, EV charging spaces, or anything that depends on where a driveway or a hydrant sits relative to your bumper. Those are not oversights, they are the restriction types that citation data genuinely cannot resolve, and each one is written down as out of scope with the reason.
The same goes for the things I decided not to decide. Working through a set of edge cases about whose drive the app had just seen, I ruled on most of them and explicitly parked eight, which are recorded as deferred rather than left looking settled.
An unanswered question that is marked unanswered is fine. One that looks answered is a problem you will find later, at the worst time.
Working with AI
I built most of this alongside AI agents, and the thing that made it work was writing down the relationship rather than improvising it.
Three rules did most of the work. Asking about something is not asking for it, so an exploratory question gets analysis and a dry run and nothing that changes the shipping database. Nothing ships until I have tested it, batched, not one change at a time. And you never adjust a test anchor to make a test pass, which sounds obvious and is exactly the shortcut a system under pressure will reach for.
There is also a rule about learning. A lesson only becomes a rule after it happens twice or I confirm it, and no lesson is allowed to weaken the honesty rules. That is the same boundary I wrote for Curb itself, where the agent can learn how readily to interrupt you but can never learn to stay quiet about a tow zone.
The reason I trust the arrangement is not that it felt smooth. It is that every overrule this summer is written down with its reasoning, and the record shows each one held. That record is the part I can show.
Limits
All of it points at the same kind of question. Is this curb red, is that sweeping day right, is this number real. I check claims about the world constantly and claims about people almost never.
There are behavioral claims sitting underneath the whole design. That a hedged sentence makes someone go look at the sign. That silence gets read as safety. Those are predictions about a person, and no amount of citation data will settle them. The right test is small, five people and an afternoon, and I have not run it yet, because the data still moves enough that I would be testing a moving target.
That is the next thing.