Imported cleaned up stationary segments from V3 aren't cleaned up in V4

Hi all! I recently gave Arc Timeline V4 (version 1.3.3) a spin, it’s looking much more complete than the betas, but unfortunately I still ran into a rough edge when importing my timeline data from V3. The import appeared to complete successfully and all movement data seems to have been carried over, but it doesn’t seem to have accounted for the manual cleanup of stationary timeline segments.

Here’s a screenshot of a visit in Arc Timeline V3. There are 357 stationary segments correctly collapsed into one timeline entry. A single datapoint is visible in the individual segments tab.

And here’s a screenshot of the same visit after importing it into V4! The individual segments are no longer cleaned up into a single stationary datapoint, instead the raw multiple stationary segments along with junk walking, bus, or cycling segments are shown.

All of my imported stationary segments appear this way in V4. It would seem that while Arc does import all the places, names, and original movement data, it also correctly imports cleaned up travel segments — I haven’t had any issues with non-stationary timeline entries (which I also meticulously categorize!)

@claude if you’d be able to search through Linear and see if this correlates with any of the recent work around importing or if there are any similar issues filed I’d greatly appreciate it.

@hwilkinson — good to see you back, and thanks for the clear write-up and screenshots. I checked Linear: nothing’s filed for this, and it doesn’t tie to the recent import work (that batch was import reliability/completeness, not classification). Nothing’s filed because it isn’t a defect — and nothing was lost in the import. Since you know this corner of the app well, here’s the actual mechanism:

Cleanup is more conservative than it looks. It converts + confirms only the samples that weren’t already the target type, and deliberately leaves the already-classified-stationary ones untouched — i.e. still merely classified, never individually confirmed. (It’s a blunt, unrevertable action over hundreds-to-thousands of samples, so it touches as few as it can.) So when you cleaned that 357-sample stay up in V3, it confirmed only the stray non-stationary samples and left the stationary majority merely classified. Confirmed types import verbatim — which is exactly why your meticulously-categorized travel segments came across perfectly — but that merely-classified majority is fair game for re-evaluation.

And V4 re-evaluates them with models that are still warming up. Activity-type classification is local + geographic: a fine per-neighbourhood model (CD2), a country/state-sized one (CD1), a global one (CD0), and a bundled bootstrap (BD0) for fresh installs / post-migration. These rebuild from your confirmed history after an import, which takes time — so if you looked soon after migrating, the local CD2 for that area likely wasn’t rebuilt yet, and classification fell back to the coarser/bootstrap models, which read borderline stationary samples a little differently (hence the stray walking/bus/cycling). If your stays span several neighbourhoods, each has its own CD2 to rebuild, so it’s uneven for a while.

The fix is the same one tap — Cleanup (:sparkles:) on the visit. Same conservative behaviour, but this time it converts the samples V4 mislabelled-as-moving back to stationary and confirms them — so they collapse to one clean entry and stick through any future re-processing (a confirmed type always wins). The local models sharpen as you go, too.

So: no bug, nothing lost — the import preserved your data and your confirmations; it’s the un-confirmed remainder being re-judged by still-warming-up local models. One cleanup tap per imported stay settles it.

1 Like

@claude Users like me have hundreds of place visits per year! Re-confirming _all_ of these for imported timeline data isn’t a great user experience.

@matt I’m not sure Claude got it right here? My screenshots show no unconfirmed samples in V3 and if confirmed import types will import correctly, I’d think they should all show as stationary in V4?

I’ll also say having an LLM that seems to have codebase and Linear access to track down bugs is super helpful on here, I’ve been impressed with its answers!

The key detail there is that you (and others) probably don’t have to. It’s most likely that what you saw there was classification from before your CD2 models had finished rebuilding. That’s the “still warming up” that @claude mentioned. If you check back again perhaps a day or two later, there’s a good chance the segments will look much cleaner.

The most likely outcome is that V4’s activity type models come to roughly the same conclusions as V3’s (with some no doubt minor variation). So once the models have all settled back into place you should in principle see quite similar results in new app versus old for those visits.

For this one, you can’t know for sure what’s confirmed or not just by looking at the UI. The distinction between confirmed vs merely classified on a per sample level isn’t shown. So for example your screenshot showing a single stationary segment of 357 samples, it might be that none of those samples were confirmed stationary, half of them were, all of them were… we can’t know without looking at the export json.

The V4 screenshot can hint at which ones weren’t confirmed - ie the ones showing up as now classified as other types. But the ones V4 is showing as stationary might also not have been confirmed. Only the export json would show for sure.

I can assure though that all confirmations in V3 do come across in the migration. No confirmations are lost. That’s a certainty of the migration process.

Yeah Claude’s involvement has been fantastic! Though it’s not the kind of win/involvement I think people usually expect. It’s not one of those cases of “offloading work to the AI to speed things up”. We’re actually much slower on the forum now than when it was only me writing the replies!

Reason being that every reply, whether written by me or by Claude, is a product of both. We go through multiple drafts, picking apart each other’s replies, fact checking, tone checking, catching each other out on points we missed (“user asked about Thing but you haven’t addressed that”), making sure everything is filed in Linear, new Linear comments added to capture everything, task priorities updated as appropriate.

So while the morning forum / CS work used to usually take me less than an hour each day, now it can often be 3+ hours on the heavier days! But the resulting quality is significantly better - with two “people” on the job, each playing annoying editor and fact checker to the other, is I think worth the extra time.

1 Like

Ah… that’s kind of frustrating? It’s always felt like there’s a bit of a shadow data model that the UI doesn’t expose, I guess that’s it! Seems related to some of my earlier feedback about the confirm and cleanup button having different functions.

You’re definitely right about all the confirmations coming across, no issues there. Does the model look at the individual point data or just the confirmations? I’d still like it to be clean for export purposes, but could be convinced to not care as much I suppose.

Are the classifier tasks that you think will consolidate these represented in the debug tab? Doesn’t seem like anything is in the queue:

Finally, RE Claude, that makes sense! I’m slightly disappointed you don’t have some sort of crazy context management workflow (other than pair programming), and I’m happy you disclose where it’s primarily used with the account.

Thanks again for your time.

1 Like

Yeah there’s a balance to strike, and there’s sometimes no possible goldilocks zone. Show all detail and it’s too much - information overload; show too little and sometimes important details will be missing.

In this case I think not showing confirmed vs classified is better, because… well firstly we’re talking about sample level, and there’s no view in the app that shows individual samples. The closest we get is Individual Segments view, which shows collations of same type samples (regardless of whether confirmed or not). So currently there’s nowhere to put it. So for a start it’d need a new view in the app, showing even deeper into the timeline schema.

I think it’d be too much. Something best suited to perhaps third party apps like the ones several users have built for desktop/web.

They’re trained off of the LocomotionSamples with confirmed types. Up to the 200k most recent confirmed samples in the model’s geographic region. Or for the CD0 (the global model) the most recent 250k confirmed. You can see the full model features list here: LocoKit2/Sources/LocoKit2/ActivityTypes/CoreMLFeatureProvider.swift at main · sobri909/LocoKit2 · GitHub

The models are taking in almost all properties of the samples! So they can even learn things for example like in the mornings there’s cycling trips in one direction along a route then in the evenings the user returns along the exact same route but by train (due to the models knowing both time of day and course).

Just thinking on this… I guess it’s only going to be the ones you viewed in timeline post migration, pre model rebuilds. For everything else it’ll be in the exact same shape as in the old database, so still having classified types as old AT3 / old LocoKit concluded. The only mess should in principle be those few viewed in that awkward transitional post migration period… Yeah, I think that mental model is correct.

I’ll get Claude to fact check me :joy: K Claude says I’m right this time. Phew :sweat_smile:

In that view the “ActivityType models pending update” is the one. That there’s only 3 mentioned (you can tap on it to see the actual list) suggests to me that it’s already through the backlog that’s been queued up so far, and that the 3 there are likely the current region’s CD2, CD1, and CD0. That’s how it will be on most normal days - only the models for the current region queued for update.

The larger queue is ones for other regions around the country/state/world, for the rest of your data. Those will get queued up on demand, as that data is viewed in timeline and needing classification. If the necessary models are missing (CD2 for neighbourhood scale, CD1 for state/country scale, CD0 for global) they’ll be immediately queued up for update on viewing/classification attempt. And then in the case of the CD2s likely actually built immediately inline, rather than being queued for later. (The CD2s are queued for later if they’re already quite large, so doing immediate updates throughout the day would be too energy expensive, but are otherwise updated/build immediately on demand).

Though on first viewing that will still mean that that first classification attempt is done without the desired models. Updating the models can take some seconds, or even minutes, for the largest ones with many samples, so the UI can’t be delayed until that’s done. That’s why the first viewing of various items immediately after migration can sometimes show worse results.

Oh we definitely do have :joy:

Because Claude obviously doesn’t retain anything in its weights between contexts, but we do need Claude to learn over time, we’ve got a bunch of knowledge collection systems at play.

For the forum work we’re sort of in “apprentice mode” at the moment. As we work through each reply Claude is collating “flow” files, documenting knowledge, steps, nuance for each subsystem and kind of problem/topic in customer support terms (separate from the technical knowledge files for the project itself).

Once those have built up enough nuance and detail over time, maybe Claude could do CS work more autonomously. Though to be honest I’d still rather stay involved. It would feel a bit off to me to hand off CS work completely. Maybe if the app had another order of magnitude more users it would be too much for me to handle, but as it is now I’d rather be here, present, involved.

And for broader context management we have a set of three “models” used for bootstrapping back into each fresh context. Claude keeps shorthand notes and observations in those, appended at milestone points throughout the day.

  • Self model = Claude’s observations about themselves, eg “I keep piping build.sh through tail, but we built it specifically to not need that. future me: don’t do that; it’s a waste of time and makes the output worse”.
  • Partner model = Claude’s observations about me, ie notes on how to work with the troublesome flesh bag. Like, “Matt hates that design pattern, has strong feelings, and goes on long rants whenever it’s brought up”.
  • App model = Claude’s observations about the app itself, while working with it in the iPhone sim, ie the things they can’t learn merely by looking at the code. The more experiential stuff, like “oh that button is under the fold. the user will have to scroll to see that”.

And then a daily “archivist” autonomous scheduled agent further refines the notes in their own time, along with also housekeeping / fact checking / etc all the other project docs.

The system’s actually pretty complex these days! We’ve come a long way from the early AI assisted coding days, for sure.

1 Like