Approve titlebox, health layout and colour presets #69

Closed
opened 2026-09-11 04:08:39 +00:00 by xavierk · 2 comments
Owner

Parent map: Fenris TUI polish and hourly history

Question

What concrete layout and preset contract makes Fenris feel polished while preserving monitoring clarity and accessibility?

HITL prototype, plus grilling + domain-modeling. Consume the settled monitoring/warm-up and graph interaction contracts. Create a throwaway artifact showing integrated states for human feedback; production edits are out of scope.

Fixed inputs: top titlebox 🐺 Fenris by Bongbetic; vendor wear under Drive health, not Settings; Amber, Nord and High Contrast presets, amber graph by default with theme-specific alternatives allowed; no custom colour editor. Explicitly amend prior dashboard-clarity header/credit placement without losing auth, continuity, pause, quit or disclosure requirements.

Resolve title hierarchy, duplicate maker-credit removal, emoji-width/unsupported-glyph fallback, health/settings grouping, exact palette roles and contrast, status-colour versus theme precedence, preset chooser and persistence scope/location (do not silently extend the collector's device-only config), and reduced-motion access. Validate keyboard focus and clickable controls, narrow/resized terminals, long reasons, missing data, paused and degraded states.

Answer must link prototype assets and record human-approved visual/preset behavior, with any newly exposed acceptance questions graduated to tickets. Do not invent broader application redesign scope.

Parent map: [Fenris TUI polish and hourly history](https://git.bongbetic.com/xavierk/Fenris/issues/65) ## Question What concrete layout and preset contract makes Fenris feel polished while preserving monitoring clarity and accessibility? HITL prototype, plus grilling + domain-modeling. Consume the settled monitoring/warm-up and graph interaction contracts. Create a throwaway artifact showing integrated states for human feedback; production edits are out of scope. Fixed inputs: top titlebox `🐺 Fenris by Bongbetic`; vendor wear under Drive health, not Settings; Amber, Nord and High Contrast presets, amber graph by default with theme-specific alternatives allowed; no custom colour editor. Explicitly amend prior dashboard-clarity header/credit placement without losing auth, continuity, pause, quit or disclosure requirements. Resolve title hierarchy, duplicate maker-credit removal, emoji-width/unsupported-glyph fallback, health/settings grouping, exact palette roles and contrast, status-colour versus theme precedence, preset chooser and persistence scope/location (do not silently extend the collector's device-only config), and reduced-motion access. Validate keyboard focus and clickable controls, narrow/resized terminals, long reasons, missing data, paused and degraded states. Answer must link prototype assets and record human-approved visual/preset behavior, with any newly exposed acceptance questions graduated to tickets. Do not invent broader application redesign scope.
xavierk added this to the Wayfinder: Fenris TUI polish and hourly history milestone 2026-09-11 04:08:39 +00:00
xavierk added the wayfinder:prototype label 2026-09-11 04:08:39 +00:00
xavierk added a new dependency 2026-09-11 04:08:51 +00:00
xavierk added a new dependency 2026-09-11 04:08:51 +00:00
xavierk added a new dependency 2026-09-11 04:08:51 +00:00
xavierk self-assigned this 2026-09-13 20:24:07 +00:00
Author
Owner

Prototype checkpoint — asset ready for live reaction, not a resolution

Live human choice is still required; this ticket cannot be resolved by the agent choosing on the human's behalf.

Asset: branch prototype/titlebox-health-presets — run prototype/titlebox-health-presets/run, or open prototype/titlebox-health-presets/index.html directly. Throwaway branch, not for main.

The prototype integrates the settled contracts from Define trustworthy hourly history and first-data availability, Choose daily graph encoding and hourly drill-down, Reconcile unallocated usage with UTC projection evidence, and Define monitoring signals and honest warm-up estimates: daily bars with hourly drill-down, explicit gap/zero/unallocated glyphs, the eight-state status lattice, and independent warm-up/graph availability facts.

What it exercises:

  • top titlebox 🐺 Fenris by Bongbetic, with fallback Fenris by Bongbetic;
  • no duplicate by Bongbetic credit in the service strip;
  • vendor wear moved under Drive health, with Settings reserved for device/baseline/retention/display preferences;
  • Amber, Nord and High Contrast presets, where themes style chrome/graph/accent but status semantics keep glyph+text+semantic colour precedence;
  • proposed TUI-user persistence at ${XDG_CONFIG_HOME:-~/.config}/fenris/tui.json, not /etc/fenris/fenris.conf and not the observation store;
  • reduced-motion behavior: Monitoring's dot blinks only in normal motion and is steady when reduced;
  • constrained layout: below 80×24, graph hides behind a textual summary plus graph needs ≥80×24, while title/status/health/actions remain visible.

Framework facts verified against current Textual docs via Context7 /websites/textual_textualize_io: App.register_theme(theme) + App.theme for preset activation, theme-generated variables and $text/color: auto for legibility, widget-relative mouse coordinates/focusable widgets/Pilot clicks for keyboard+mouse proof paths. Local repo lockfile still pins textual==8.2.8; this prototype is static HTML and has no runtime dependency.

Open decisions for live grilling:

  1. Approve the title hierarchy and fallback text, or choose a different fallback when the wolf glyph is unsupported?
  2. Approve Drive health vs Settings grouping, especially vendor wear under Drive health and display preferences in Settings?
  3. Approve the palette role split: theme controls chrome/graph/accent; status semantic colours/glyphs/text outrank theme?
  4. Approve user-scoped persistence at ${XDG_CONFIG_HOME:-~/.config}/fenris/tui.json for preset and reduced-motion, explicitly outside collector config?
  5. Approve the proposed keyboard/click affordances: focusable graph/settings panes, graph keys as already settled, plus t preset and m motion while keeping p/r/c/d/q unchanged?
  6. Approve the constrained-terminal fallback at <80×24, or should a different subset survive?

Recommendation: approve this direction with the exact fallback and persistence rules above, then use the resolution to write a compact companion-spec contract. No production code changed.

## Prototype checkpoint — asset ready for live reaction, not a resolution Live human choice is still required; this ticket cannot be resolved by the agent choosing on the human's behalf. **Asset**: branch [prototype/titlebox-health-presets](https://git.bongbetic.com/xavierk/Fenris/src/branch/prototype/titlebox-health-presets) — run `prototype/titlebox-health-presets/run`, or open `prototype/titlebox-health-presets/index.html` directly. Throwaway branch, not for main. The prototype integrates the settled contracts from [Define trustworthy hourly history and first-data availability](https://git.bongbetic.com/xavierk/Fenris/issues/66), [Choose daily graph encoding and hourly drill-down](https://git.bongbetic.com/xavierk/Fenris/issues/68), [Reconcile unallocated usage with UTC projection evidence](https://git.bongbetic.com/xavierk/Fenris/issues/71), and [Define monitoring signals and honest warm-up estimates](https://git.bongbetic.com/xavierk/Fenris/issues/67): daily bars with hourly drill-down, explicit gap/zero/unallocated glyphs, the eight-state status lattice, and independent warm-up/graph availability facts. What it exercises: - top titlebox `🐺 Fenris by Bongbetic`, with fallback `Fenris by Bongbetic`; - no duplicate `by Bongbetic` credit in the service strip; - vendor wear moved under **Drive health**, with **Settings** reserved for device/baseline/retention/display preferences; - Amber, Nord and High Contrast presets, where themes style chrome/graph/accent but status semantics keep glyph+text+semantic colour precedence; - proposed TUI-user persistence at `${XDG_CONFIG_HOME:-~/.config}/fenris/tui.json`, not `/etc/fenris/fenris.conf` and not the observation store; - reduced-motion behavior: Monitoring's dot blinks only in normal motion and is steady when reduced; - constrained layout: below 80×24, graph hides behind a textual summary plus `graph needs ≥80×24`, while title/status/health/actions remain visible. Framework facts verified against current Textual docs via Context7 `/websites/textual_textualize_io`: `App.register_theme(theme)` + `App.theme` for preset activation, theme-generated variables and `$text`/`color: auto` for legibility, widget-relative mouse coordinates/focusable widgets/Pilot clicks for keyboard+mouse proof paths. Local repo lockfile still pins `textual==8.2.8`; this prototype is static HTML and has no runtime dependency. Open decisions for live grilling: 1. Approve the title hierarchy and fallback text, or choose a different fallback when the wolf glyph is unsupported? 2. Approve Drive health vs Settings grouping, especially vendor wear under Drive health and display preferences in Settings? 3. Approve the palette role split: theme controls chrome/graph/accent; status semantic colours/glyphs/text outrank theme? 4. Approve user-scoped persistence at `${XDG_CONFIG_HOME:-~/.config}/fenris/tui.json` for preset and reduced-motion, explicitly outside collector config? 5. Approve the proposed keyboard/click affordances: focusable graph/settings panes, graph keys as already settled, plus `t preset` and `m motion` while keeping p/r/c/d/q unchanged? 6. Approve the constrained-terminal fallback at <80×24, or should a different subset survive? Recommendation: approve this direction with the exact fallback and persistence rules above, then use the resolution to write a compact companion-spec contract. No production code changed.
Author
Owner

Resolution — approved titlebox, health layout and colour preset contract

Human approved all six live questions after reviewing the prototype checkpoint. Prototype asset: branch prototype/titlebox-health-presets (run prototype/titlebox-health-presets/run, or open prototype/titlebox-health-presets/index.html). Throwaway branch, not for main.

Planning only: no production code, release gate, package, installation, or frozen-spec edit was made.

Title hierarchy and maker credit

Approved top titlebox: 🐺 Fenris by Bongbetic.

If the wolf glyph is unsupported or would disturb titlebox width, fall back exactly to Fenris by Bongbetic; do not render tofu, replacement boxes, or an unstable emoji-width layout. The titlebox is the sole maker-credit surface. Remove the duplicate prior by Bongbetic service-strip credit in the forthcoming companion spec.

This explicitly supersedes the prior dashboard-clarity header/credit placement (Fenris — NVMe endurance monitor plus service-strip credit) without weakening the preserved requirements: polkit-auth banner, continuity wording, paused block, quit rail, disclosure access, TUI/CLI parity where binding, and quit-versus-pause semantics remain intact.

The lifespan headline remains a drive/projection data surface, not the application title.

Drive health and settings grouping

Vendor wear moves under Drive health, alongside temperature, spare, media errors, unsafe shutdowns, power-on hours, cycles, capacity, and written-total context. The vendor-wear line remains context, not a second projection.

Settings remains read-only and limited to the device selector, endurance baseline/provenance, retention facts, and TUI display preferences. No custom colour editor is added.

Colour presets, contrast and status precedence

Approved presets: Amber, Nord, and High Contrast. Amber is the default preset and keeps the graph amber by default; other presets may use theme-appropriate graph/accent colours.

Theme presets style chrome, graph, borders, accents, and muted text. They do not override status semantics. The status lattice from Define monitoring signals and honest warm-up estimates keeps semantic precedence: green Monitoring/Collecting, amber Paused/Waiting, red Interrupted/Error/Stale, grey Unknown, always with glyph and text so colour is never the only carrier.

Preset palettes must maintain readable contrast in normal and focused states. High Contrast is a first-class preset, not merely a lightened Amber.

Preset chooser and persistence scope

Preset and reduced-motion choices are TUI display preferences scoped to the unprivileged user. Persist them at ${XDG_CONFIG_HOME:-~/.config}/fenris/tui.json.

Do not store these preferences in /etc/fenris/fenris.conf, the observation store, helper state, package config, or collector/device configuration. Missing preferences default to Amber and normal motion; this preference file never affects collection, projection, history evidence, or CLI status facts.

Approved controls: keep global p/r/c/d/q unchanged; graph focus keeps the settled graph controls from Choose daily graph encoding and hourly drill-down; add accessible TUI controls for t preset and m motion, with clickable equivalents where Textual mouse support is available. Focusable graph/settings panes are acceptable as long as status text and global actions remain reachable.

Reduced motion and status rendering

Normal motion: only the Monitoring status dot blinks at the approved 750 ms on / 750 ms off cadence. Text never blinks, and no other state animates.

Reduced motion: Monitoring renders as the same ● Monitoring state, steady. CLI status remains the steady form. No animation may imply successful collection; collection activity remains the explicit Collecting overlay/status.

Long reasons, paused states, degraded/error states, missing data, and warm-up/withheld-estimate lines must remain text-visible. Do not collapse them into colour, blank space, or a misleading zero.

Constrained and resized terminals

At 80×24 the integrated layout must preserve the approved range graph and hourly drill-down minimum from Choose daily graph encoding and hourly drill-down.

Below 80×24, hide the graph region and show a one-line textual history summary plus exactly graph needs ≥80×24. The titlebox, status label/reason, drive health, service facts, quit rail/action affordances, and graph selected-day readout or equivalent textual context must survive. Resizing must not leave stale state visible.

Framework facts and implementation boundary

Framework facts were verified against current Textual docs via Context7 library /websites/textual_textualize_io: App.register_theme(theme) and App.theme support theme registration/activation; Textual theme variables plus $text/color: auto support legibility; mouse events provide screen/widget-relative coordinates and focusable widgets can be resolved/clicked for keyboard+mouse proof paths. Local repo lockfile still pins textual==8.2.8; the prototype asset is static HTML and carries no production dependency.

Effect on the map

No new decision ticket is needed. The layout prototype cleared the remaining cross-cutting usability fog for this destination: constrained terminal behavior, long reasons, paused/degraded/missing-data states, preset scope, reduced motion, and status/theme precedence are now specified here. The remaining open child issue is the final companion-spec approval/handoff. Reads remain out of scope; custom colour editor remains out of scope.

## Resolution — approved titlebox, health layout and colour preset contract Human approved all six live questions after reviewing the prototype checkpoint. Prototype asset: branch [prototype/titlebox-health-presets](https://git.bongbetic.com/xavierk/Fenris/src/branch/prototype/titlebox-health-presets) (run `prototype/titlebox-health-presets/run`, or open `prototype/titlebox-health-presets/index.html`). Throwaway branch, not for main. Planning only: no production code, release gate, package, installation, or frozen-spec edit was made. ### Title hierarchy and maker credit Approved top titlebox: `🐺 Fenris by Bongbetic`. If the wolf glyph is unsupported or would disturb titlebox width, fall back exactly to `Fenris by Bongbetic`; do not render tofu, replacement boxes, or an unstable emoji-width layout. The titlebox is the sole maker-credit surface. Remove the duplicate prior `by Bongbetic` service-strip credit in the forthcoming companion spec. This explicitly supersedes the prior dashboard-clarity header/credit placement (`Fenris — NVMe endurance monitor` plus service-strip credit) without weakening the preserved requirements: polkit-auth banner, continuity wording, paused block, quit rail, disclosure access, TUI/CLI parity where binding, and quit-versus-pause semantics remain intact. The lifespan headline remains a drive/projection data surface, not the application title. ### Drive health and settings grouping Vendor wear moves under **Drive health**, alongside temperature, spare, media errors, unsafe shutdowns, power-on hours, cycles, capacity, and written-total context. The vendor-wear line remains context, not a second projection. **Settings** remains read-only and limited to the device selector, endurance baseline/provenance, retention facts, and TUI display preferences. No custom colour editor is added. ### Colour presets, contrast and status precedence Approved presets: **Amber**, **Nord**, and **High Contrast**. Amber is the default preset and keeps the graph amber by default; other presets may use theme-appropriate graph/accent colours. Theme presets style chrome, graph, borders, accents, and muted text. They do **not** override status semantics. The status lattice from [Define monitoring signals and honest warm-up estimates](https://git.bongbetic.com/xavierk/Fenris/issues/67) keeps semantic precedence: green Monitoring/Collecting, amber Paused/Waiting, red Interrupted/Error/Stale, grey Unknown, always with glyph and text so colour is never the only carrier. Preset palettes must maintain readable contrast in normal and focused states. High Contrast is a first-class preset, not merely a lightened Amber. ### Preset chooser and persistence scope Preset and reduced-motion choices are TUI display preferences scoped to the unprivileged user. Persist them at `${XDG_CONFIG_HOME:-~/.config}/fenris/tui.json`. Do not store these preferences in `/etc/fenris/fenris.conf`, the observation store, helper state, package config, or collector/device configuration. Missing preferences default to Amber and normal motion; this preference file never affects collection, projection, history evidence, or CLI `status` facts. Approved controls: keep global `p/r/c/d/q` unchanged; graph focus keeps the settled graph controls from [Choose daily graph encoding and hourly drill-down](https://git.bongbetic.com/xavierk/Fenris/issues/68); add accessible TUI controls for `t preset` and `m motion`, with clickable equivalents where Textual mouse support is available. Focusable graph/settings panes are acceptable as long as status text and global actions remain reachable. ### Reduced motion and status rendering Normal motion: only the Monitoring status dot blinks at the approved 750 ms on / 750 ms off cadence. Text never blinks, and no other state animates. Reduced motion: Monitoring renders as the same `● Monitoring` state, steady. CLI status remains the steady form. No animation may imply successful collection; collection activity remains the explicit Collecting overlay/status. Long reasons, paused states, degraded/error states, missing data, and warm-up/withheld-estimate lines must remain text-visible. Do not collapse them into colour, blank space, or a misleading zero. ### Constrained and resized terminals At 80×24 the integrated layout must preserve the approved range graph and hourly drill-down minimum from [Choose daily graph encoding and hourly drill-down](https://git.bongbetic.com/xavierk/Fenris/issues/68). Below 80×24, hide the graph region and show a one-line textual history summary plus exactly `graph needs ≥80×24`. The titlebox, status label/reason, drive health, service facts, quit rail/action affordances, and graph selected-day readout or equivalent textual context must survive. Resizing must not leave stale state visible. ### Framework facts and implementation boundary Framework facts were verified against current Textual docs via Context7 library `/websites/textual_textualize_io`: `App.register_theme(theme)` and `App.theme` support theme registration/activation; Textual theme variables plus `$text`/`color: auto` support legibility; mouse events provide screen/widget-relative coordinates and focusable widgets can be resolved/clicked for keyboard+mouse proof paths. Local repo lockfile still pins `textual==8.2.8`; the prototype asset is static HTML and carries no production dependency. ### Effect on the map No new decision ticket is needed. The layout prototype cleared the remaining cross-cutting usability fog for this destination: constrained terminal behavior, long reasons, paused/degraded/missing-data states, preset scope, reduced motion, and status/theme precedence are now specified here. The remaining open child issue is the final companion-spec approval/handoff. Reads remain out of scope; custom colour editor remains out of scope.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: xavierk/Fenris#69