M2-10 (1/2): read every route and bin it #54
No reviewers
Labels
No labels
area/agent
area/capture
area/editor
area/geo
area/security
area/sync
area/transcription
area/ui
area/vault
area/voice-memos
blocked
milestone/M1
milestone/M2
milestone/M3
milestone/M4
needs-decision
needs-hardware
p0
p1
p2
type/bug
type/enhancement
type/feature
type/idea
type/infrastructure
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Stash/stash-ios!54
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "m2-10-heat-map"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The first half of M2-10 (#39). Wes decided on 2026-08-10 that the issue ships as two PRs: this is
the whole-library read and the binning, with their tests. There is nothing to look at on a phone
yet, which is the point of splitting here — this is the half where the rules live and the half a
review can check.
What this is
HeatGrid— how often each 25-metre square of ground has been walked, across every recording.fixes that landed in it. Counting fixes ranks five minutes at a bus stop above a street walked a
hundred times, which inverts the question the map is asked.
occasional street as indistinguishable from ground nobody has covered. The dark parts are the
point.
rather than merely being dropped. An unknown radius is not a bad one — a GPX from another tool
carries none. Both rules are
TrackFigures', at its numbers.seconds it is a hole in the route, and drawing across it draws a path through buildings.
cells(in:)honours the same wrap.reaches the cap goes on getting hotter where it already knows about and says it stopped taking
new ground.
TrackLibrary— one cancellable pass off the main actor that reads every track the date filteradmits, folds each route into the grid as it is read, and drops its points before opening the next.
What it could not draw comes back as separate facts: files that will not read, and routes still
sitting unassembled in a parts folder. A directory that will not list throws rather than answering
"no routes".
The measurement
Reading every file on every open is the honest implementation and it was measured rather than
asserted to be fine. Debug simulator build: 100 tracks of 2,400 fixes — 5.5 s; 500 tracks of
300 fixes — 6.0 s. Almost all of it is XML parsing. A real library is tens of tracked memos, so
nothing here is cached; reading concurrently is the obvious next lever and is deliberately not
pulled until the device number is in hand.
What was validated
make test— 668 tests, green.make lint— clean.adversarially by Codex, then strengthened against all eight of its findings. Ten mutations were
run against the finished suite; each is caught by its intended test and nothing else.
the polar-latitude one crashes the test runner with exactly the trap it names.
What was NOT validated
pass belongs to the second one.
phone against a real library. That number is taken at the second PR's hand-off.
from "opened and then discarded" through the public API, and adding a seam for it would be a
production change made to satisfy a test. What is tested is the accounting: removing the filter
fails. The cost claim is unverified.
Still to come, in the second PR
The screen, the
MKMapViewrenderer, the map icon on the memo list, the date filter's menu, theempty states and their copy, the centring fix — and with it the documented exception to M2-06's
rule and the correction to both location purpose strings, which describe a use narrower than what
the app will do once a map can ask where the phone is.
Full reasoning and every Codex disposition:
.agent/m2-10-heat-map/PLAN.mdandSUMMARY.md.⚠️ No screenshots of this feature anywhere — this repository is public and a heat map of daily walks
is a home address with extra steps. Every fixture is synthetic coordinates.