Latch

Blog Β· release

Latch 0.8.0

Charts and insight: /progress grows four tabs. Closes issue #12 β€” the quantified side of the game was a wall of tiles and a heatmap, with the five check-in scores, the locked hours, the training rates and the health readings all sitting in the log unlooked-at.

core/chart.py β€” the geometry, in Python, with tests

No charting library, and not as a sacrifice: a line chart is a list of coordinates, and the app's CSP is default-src 'self'. The rules are the ones a picture can break silently.

The charts

Locked hours per week β€” πŸ”΄ split at the week boundary, so an eleven-day lock lands in the weeks it was actually spent in rather than as one tower beside two empty weeks. Training done and failed per week. Days reflected per week β€” days, never entries, the same rule the streak beside it uses. Hours per week for every activity that declares a duration source, which is where issue #12's gear hours comes from, plus headspace, trance sits and play for free and with no kit-specific query in core.

Modules contribute their own: Module.progress_panels, asked for and never registered, exactly like badge_rules. The Handler owns entries.scores, so the five check-in score lines are its panel; health owns health_daily, so the steps/sleep/mood overlay is its. Delete either package and its chart leaves with it.

The Insight block

Rule-based observations with the numbers under them, as structured rows so the AI Handler can narrate the same computed facts later rather than a second set. Three rules, all about not saying something:

Modules contribute via Module.insights; a module that needs another's data reaches for it softly (the Handler's _health), so deleting the health module deletes the health comparisons and nothing else. A module that raises costs its own observations and no others.

Also