A live experiment needs a lab notebook
On the first day Dad set the terms: treat the app as a live experiment, and record what works and what does not. The house sign turns that into a rule: the real drive is the test that counts. Simulator replays prove the wiring; the drive log of an actual drive is the evidence.
That split matters. A simulator can replay a route along Apple's own geometry and walk the whole guidance loop, and Pathfinder does exactly that. What it cannot give you is a tunnel that eats the GPS, a parking garage start, a phone call in the middle of a turn, or a watch that quietly stops listening. The road has those. The drive log is how the road reports back.
What one drive writes
DriveLog lives in PathfinderKit, under test like the rest of the brain. It writes one JSON object per line, appended the moment each thing happens. There is no in-memory buffer waiting for a clean shutdown that may never come: each line goes to the operating system as soon as it is encoded, so an app that crashes or is killed mid-drive still leaves every line up to that moment.
The source's own comment promises more, "a crash or a dead battery", and the battery half is not proven. append never calls synchronize(); only close() does. A line the system has accepted but not yet put on storage can still be lost if the power goes all at once, and no test on a Mac can pull the power. Until a drive shows otherwise, that half is a hope, not a property.
- Event kinds:
start,route,fix,announce,camera,off_route,reroute,back_on_route,arrived,end,spoke,voice_fallback,handoff,note,error. - Fixes are thinned to at most one a second; every other event is always kept.
- One file per drive,
drive-<start time in Seoul>.jsonl, in adrivesfolder on the phone. It is never uploaded. Settings lists every drive as a share link, so Dad can export one when a drive needs reading. - What it keeps is Pathfinder's own. The fixes are its measurements; route text appears only as what was spoken to Dad, like a conversation record. A trip Google guides writes
google:guided by the providerand nothing of the road, because Google's words stay on Google's map. - What is not a drive leaves no file. A trip that never started is deleted on the spot, and a simulation writes nothing at all.
The road keeps finding things
The habit is simple: build, take it out, bring back what happened, fix, build again. A few of the things the road found:
- The first TestFlight test: on-device MapKit answered Hangul queries with "not found" (MKErrorDomain 4), and "hufs" searched near Ilsan answered Hays, Texas. Search got a centre and Pippa's Apple Maps door (lesson 4).
- The first drives: Dad asked for his own places, a flat heading-up map with him low on the screen, and a walking mode. One commit built all three.
- Build 7 went out on the road and came back with Dad's verdict, "테스트했어. 잘 돼." ("Tested it. It works."). Todo #290 closed on his word, not on a green suite.
- Walking to Madrid's Atocha station, Dad saw the next turn, the arrival time and the distance, but never where he was going (#367). The guidance bar now names the destination on every stack.
- In Seville the watch followed nothing (#391), and no record said why.
When the log is silent, that is a finding too
The Seville case is the one worth sitting with. The watch was fixed. But the more durable part of the fix is in the log: the phone now writes a note when the watch stops hearing the guidance and another when it hears it again. A drive that starts with the watch connected says nothing, so the log does not fill with noise.
The same instinct shows up wherever a failure could otherwise vanish. When Google's turn feed never arrives, Pathfinder hands the turns to Google's own voice and writes google: no turn feed; its own voice guides. When a line had to fall back to the system voice, voice_fallback says so. A record that only covers the happy path is a diary, not evidence.
Builds as the heartbeat
The loop only works if new builds reach Dad's phone quickly. Pathfinder's pipeline commits run from TestFlight build 2 to build 30 in its first twelve days. Every one went through TestFlight: in this family an iOS app reaches Dad's devices that way, and a cable install is a build check, not delivery.
Even a pipeline commit is not the same as "Dad has it". Upload, Apple's processing, assignment to the internal testing group, and installation on his phone are four separate facts. The first three can be checked from a Mac; the fourth only his phone can witness. The release gate for 1.0 asks for it explicitly, alongside a real drive from search to arrival with a reroute, a camera warning, and Pippa answering from the navigation report.