Playing
Progress, charts and insight
The four tabs of the Progress page โ what XP, levels and streaks mean, what every chart is actually measuring, and the floors that stop the Insight block inventing findings.
On this page
The Progress page (/progress, and /stats still gets you there) is the quantified
side of the game. Everything on it is computed from the event log, and everything an undo
voided is excluded โ uniformly.
It has four tabs. Each one is a separate page load that computes only itself: none of this is free, and a page that built all four on every visit would get slower the longer you played it.
| Tab | What is on it |
|---|---|
| Overview | The totals, the per-week rates, the 26-week heatmap, where every activity stands |
| Trends | The charts โ locked hours, training, reflections, check-in scores, gear hours, health |
| Insight | Sentences the app can say about your own numbers, with the numbers under them |
| Log | The training board, every event kind, and the last twenty locks |
XP
| Action | XP |
|---|---|
| Lock | 20 |
| Clean unlock (time served) | 50 |
| Early unlock (emergency key) | 0 |
| Reflection (typed or spoken) | 15 |
| Check-in survey | 5 |
| Mantra recited | 3 |
| Affirmation | 2 |
| Headspace session | 1 per minute, max 20 |
| Photo check-in | 5 |
| Note | 2 |
| Wheel spin | 5 |
| Training done | the task's own XP (library default 10) |
XP is the sum over non-voided events. Undo an event and its XP goes with it.
Levels and ranks
Level n needs 100 ร (n โ 1)ยฒ XP โ cheap early, steep later: level 2 at 100, level 3 at
400, level 5 at 1,600, level 10 at 8,100. The bar in the top bar is progress to the next level.
Ranks are tied to levels, in order:
runt โ pup in training โ good boy โ obedient pup โ kennel pup โ show pup โ best boy
Level 7 and beyond stays best boy. There is nothing above it. That is the point.
Streaks
A day counts toward the streak if anything you did was logged on that local day โ a lock, a note, a reflection, a spin, a photo. System events (an expired freeze, an overdue task failing, the Handler's audit) do not count; the streak is about you showing up. The current streak runs back from today, or from yesterday if today is empty so far, until it hits a gap. Best is the longest run ever.
The 26-week heatmap is the same rule, one square per day, shaded by how much happened.
Totals
Sessions, lifetime locked time, longest lock, events, time added, time removed, spins, training done and failed, photos, voice memos, and total voice seconds (which under-reports by any memo whose length could not be measured โ an unknown is never counted as zero).
Rates per week
Training per week, failures per week, spins per week, locks per week, days reflected per week, locked hours per week, and locked (28 d) as a percentage. These are observed rates over the age of the log, clipped to the window they name โ a young log reports honest small numbers rather than nothing. Days reflected counts days, not entries: four reflections in one evening is one day.
The same rates are available as stamp tokens, so a photo can carry Training / week on its overlay. The Progress page renders them too, so a rate that ships broken is visible here, not only inside a downloaded JPEG.
Trends
Every chart is an inline SVG this box drew from your own log. There is no charting library on this machine and there is not going to be one โ nothing is fetched, so nothing can be logged by anyone else. (See Privacy.)
| Chart | What it measures |
|---|---|
| Hours locked | Wall-clock hours inside each week, split at the week boundary so an eleven-day lock lands in the weeks it was actually spent in. Frozen time is included, matching the total locked tile. |
| Training | Assignments done and failed per week, on one axis because they share a unit. |
| Days reflected | Days with at least one reflection โ never entries. Four reflections in one evening is one day, the same rule the streak uses. |
| Check-in scores | The five sliders over the last 60 days, one point per day. A day with three check-ins is that day's mean, not three points. |
| Hours per week, by activity | One chart for every activity that declares a duration source โ gear, play, headspace, trance sits. An activity nothing measures the length of has no hours to show. |
| Health | Steps, sleep and mood on one time axis. |
Five things those charts will not do:
- A gap is a break in the line, never a join. A
Nonemeans nobody measured, and one continuous line through a fortnight nobody measured is a picture of steady progress invented out of missing data. Roughly a quarter of health days carry no reading, so this is the common case, not an edge one. - A week before your log began is blank, not zero. It is drawn as a faint band rather than an empty slot, because a zero-height bar is pixel-identical to a week you did nothing.
- The week in progress is marked or left out. On a bar chart it is hollow and captioned so far; on a line chart it is not drawn at all, because a partial point on a line is indistinguishable from a fall and every trend would end in a cliff.
- Nothing is drawn from one reading. One point is not a line, and a flat stroke reads as steady about a thing measured once. The chart says so in words instead.
- The health chart ends at the last day your phone exported, not today. Apple Health delivers a day's numbers overnight, so today is empty until tomorrow; the date it ends on is printed under it.
On the health chart each line is scaled to its own range, which is printed in the legend: steps run to ~20,000 and sleep to ~8, so one shared axis would draw the sleep line as a flat smear along the floor. Only the time axis is shared โ how far apart two lines sit means nothing at all, and the chart says so.
Insight
The Insight tab is a handful of sentences computed from your log โ "headspace runs 1.5 higher on days you were locked" โ each with the numbers it came from underneath. They are rules in the code, not a model: nothing about your play is sent anywhere to produce them. (Later, the AI Handler will read these out in its own voice; it will be reading these same computed rows.)
Three rules, and all three are about not saying something:
- A comparison needs a real sample on each side. Five days minimum on both, or it is omitted โ not hedged, not shown as "no difference". "Headspace is two points higher on workout days" computed from two workout days is noise wearing a lab coat.
- A difference has to clear a floor to be called one. Two means are never exactly equal. Each comparison names the smallest gap worth a sentence โ four fifths of a point on a 1โ10 slider, a thousand steps, five minutes of play.
- The questions are fixed in the code and every one that clears its floors is printed. The tempting version โ compute thirty comparisons, show the three biggest โ manufactures findings: over enough comparisons the largest gap is large by construction. Nothing here is the result of a hunt.
And a fourth, about language: these are associations in your own log, not causes. "Headspace runs higher on days you worked out" is equally consistent with good days producing workouts, and with a third thing producing both. The page says that once, under the block, rather than hedging every line into uselessness.
An empty Insight tab is the normal state of a young log, and it is the honest one.
Sessions
The Log tab's last twenty locks: started, ended, sentence, adjustments, frozen time, verdict
(clean or early). A hidden-timer lock that is still running shows no sentence and no
remaining time here either โ the sentence is the secret, and started + sentence would give
the end time away.
This page also ships inside the app, at /guide โ so your own instance always serves the guide for the version you are running, with the internet unplugged. Get Latch ยท Something wrong here? Tell me.