Define monitoring signals and honest warm-up estimates #67
Notifications
Due Date
No due date set.
Blocks
Depends on
#69 Approve titlebox, health layout and colour presets
xavierk/Fenris
#70 Approve the Fenris TUI polish specification and handoff
xavierk/Fenris
#71 Reconcile unallocated usage with UTC projection evidence
xavierk/Fenris
Reference: xavierk/Fenris#67
Reference in New Issue
Block a user
Parent map: Fenris TUI polish and hourly history
Question
What precise state, precedence, text, and timing contract makes monitoring and data readiness truthful at a glance?
HITL grilling + domain-modeling. Approved direction: blinking green Monitoring, explicit Collecting, steady amber Paused, red Error/Stale; text always visible. Preserve ADR 0002 projection rules and ADR 0003 boot/runtime and deliberate-disable semantics.
Resolve mapping from actual timer/collection/store evidence to status, including healthy time between collection runs, UI refresh versus collector liveness, unknown/unavailable status, external service stop versus deliberate pause, failures with fresh data, and conflicting facts. Define blink cadence and reduced-motion/non-colour fallback. Keep boot enablement, last outcome, freshness and collection activity distinct; no false healthy signal.
Separately resolve conditional remaining-hours estimates for projection warm-up, including qualifying UTC days, low coverage, pauses, stale data, missing baseline/unsupported counters, and cases with no defensible ETA. State remaining qualifying evidence and assumptions, never promise a fixed countdown. First graph-data availability must not wait for projection confidence; coordinate with the hourly-data contract without inventing its answer. Preserve TUI/CLI parity where already binding and explicit quit-versus-pause semantics.
Answer must include a decision table, exact wording, state precedence and example transitions; history/counter/projection absence needs explanatory text, not a blank or misleading zero.
Resolution — approved monitoring-signal and warm-up contract
Human accepted every Round 1 and Round 2 recommendation in live grilling ("recommendation accepted" ×2). Planning only; wording below is spec-ready for the companion spec. One mechanical gap fixed at resolution: Round 2's accepted glyph set omitted a glyph for Interrupted; ⊘ was added (single-width, consistent with the accepted set).
Status lattice — eight states
Text label always visible; colour never the sole carrier (glyph + text). No animation in any state except Monitoring's dot.
● Monitoring◐ Collecting— run in flight (≤ 90 s)‖ Paused—monitoring paused — paused time excluded from your usage habit○ Waiting—last sample X ago/awaiting first sample(empty store) /awaiting another sample(one sample, no compatible pair, per #66)⊘ Interrupted—collection stopped outside Fenris — monitoring period still open✖ Error—last run failed (exit N)(+last good sample X agowhen data is still fresh) orobservation store unreadable — see journal◌ Stale—last sample X days ago(timer active, no failure recorded)? Unknown—service state unavailableReduced motion (Textual
SCREEN_REDUCE_MOTIONor user preference): static ●, no pulse — which is exactly the CLI's permanent form.Precedence
Base order: Error > Interrupted > Paused > Stale > Waiting > Monitoring > Unknown.
last sample 49 days agoas a fact line; staleness is the expected consequence of the user's own choice, not an alarm.run in flight — paused). It reverts within ≤ 90 s to whatever the outcome earns.Distinct facts — never folded into the status word
Last sample: X agoalways displayed (own axis).Start at boot: on/off; enabled≠active is explained by the state text itself.Blink means exactly "monitoring enabled and data fresh" — never data refresh.
Detection and timing
systemctl showpoll (timer + service units) drives the status strip; the full store refresh stays at 5-min cadence. Status transitions are re-evaluated every poll tick from the cached newest-sample timestamp + current clock, so aging boundaries (Waiting→Stale at 48 h) cross within ~5 s without a store read; only a new sample needs the refresh. Poll failure → Unknown.ActiveState= activating (oneshot in flight).Canonical example transitions
✖ Error—last run failed (exit 3) · last good sample 4 min ago● Monitoring(self-clears ≈ 5 min)◐ Collecting—run in flight — retry→ Error or Monitoring on outcome○ Waiting→◐ Collecting→● Monitoring⊘ Interrupted—collection stopped outside Fenris⊘ Interrupted— +last sample 3 days ago(names both facts; never silently degrades to Stale-without-stop)‖ Paused(amber) —last sample 49 days ago○ Waiting—awaiting first sample○ Waiting—awaiting another sample(#66 wording)✖ Error—observation store unreadable — see journal; nothing store-derived renders (ADR 0005)Warm-up and conditional estimates
Confidence block during warm-up (counts per #71: current controller segment; qualifying = represented monitored UTC date with ≥ 50 % coverage; gate = 14 represented / 12 qualifying):
No countdown by hours: days are the grain, and a day can still fail qualification — a promised ETA would be fabricated confidence.
Withheld-estimate reason lines (one per cause, never a blank or misleading zero):
No endurance baseline — set a rated TBW to see an estimateDrive does not report write countersestimate not updating — last sample X ago(#71 frozen-endpoint rule)First graph-data availability is independent of estimate availability (#66): the graph renders from first usable evidence while the estimate stays gated.
Once warm-up clears, the existing frozen-spec lifespan line renders unchanged with its Limited/Supported label; this contract adds only the progress block, the reason lines and the frozen note — no new steady-state format is invented here.
CLI parity
fenris statusadopts the identical status vocabulary, precedence, glyphs (statically rendered) and reason lines. Collecting appears in CLI output only if a run is in flight at query time.Preserved unchanged
ADR 0002 projection math and confidence categories; ADR 0003 lifecycle, sanctioned toggle and cadence; ADR 0005 failure contract; #66 hourly-history and first-data contract; #71 UTC accounting and warm-up gate; quit-versus-pause semantics; no fabricated history; the TUI stays read-only.