{% extends "base.html" %} {% block title %}Health ยท {{ app_name }}{% endblock %} {% import "_chart.html" as ch %} {# ๐ด GAPS ARE DRAWN AS BREAKS, NOT JOINED โ in core/chart.py, which is where that rule now lives for the whole app. history() returns a null for a day with no reading, and the natural single polyline would draw a straight line across a fortnight nobody measured: a picture of steady progress invented out of missing data. Same contract as the tiles above โ unknown must not look like a value. #} {% block body %}
Nothing has arrived {% if s.last_sync %}since {{ s.last_sync|local }} ({{ s.last_sync|rel(now) }}){% else %}ever{% endif %}. Rules are not firing, and the numbers below โ if there are any โ are old.
Check sync-health-to-latch.py on the apps pod.
โ{{ r.line }}โ
{% endfor %}Penalties are held back today. Rewards still count โ moving at all on a day like this is worth more, not less.
Nothing measured for today yet. That is not the same as a zero โ no rule can fire on a day nobody measured, in either direction.
{% endif %}{% if q.last %}Nothing logged for {{ q.days }} days โ last was {{ q.last }}. {% else %}Never logged.{% endif %}
Shown rather than hidden on purpose: a blank space reads as "fine", and the point of tracking this is to notice when it stops.
| rule | today | reading | effect |
|---|---|---|---|
| {{ r.rule.title }} | {%- if r.state is none -%}unknown {%- elif r.withheld and r.state -%}held back {%- elif r.fired -%}fired {%- elif r.state -%}ready {%- else -%}no{%- endif -%} | {%- if r.value is none -%}no reading {%- else -%}{{ '%g'|format(r.value) }} vs {{ '%g'|format(r.threshold) }}{%- endif -%} | {%- if r.rule.xp %}+{{ r.rule.xp }} xp{% endif -%} {%- if r.rule.seconds %}{{ ' ยท ' if r.rule.xp }}{{ (r.rule.seconds // 60)|abs }} min {{ 'off' if r.rule.seconds < 0 else 'on' }}{% endif -%} {%- if r.rule.recovery %} eases the day{% endif -%} |
A day with no reading is a break in the line, never a zero โ about a quarter of days carry none. ๐ how these are drawn