Approve titlebox, health layout and colour presets #69
Notifications
Due Date
No due date set.
Blocks
Depends on
#70 Approve the Fenris TUI polish specification and handoff
xavierk/Fenris
#67 Define monitoring signals and honest warm-up estimates
xavierk/Fenris
#68 Choose daily graph encoding and hourly drill-down
xavierk/Fenris
Reference: xavierk/Fenris#69
Reference in New Issue
Block a user
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.
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 openprototype/titlebox-health-presets/index.htmldirectly. 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:
🐺 Fenris by Bongbetic, with fallbackFenris by Bongbetic;by Bongbeticcredit in the service strip;${XDG_CONFIG_HOME:-~/.config}/fenris/tui.json, not/etc/fenris/fenris.confand not the observation store;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.themefor preset activation, theme-generated variables and$text/color: autofor legibility, widget-relative mouse coordinates/focusable widgets/Pilot clicks for keyboard+mouse proof paths. Local repo lockfile still pinstextual==8.2.8; this prototype is static HTML and has no runtime dependency.Open decisions for live grilling:
${XDG_CONFIG_HOME:-~/.config}/fenris/tui.jsonfor preset and reduced-motion, explicitly outside collector config?t presetandm motionwhile keeping p/r/c/d/q unchanged?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.
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 openprototype/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 priorby Bongbeticservice-strip credit in the forthcoming companion spec.This explicitly supersedes the prior dashboard-clarity header/credit placement (
Fenris — NVMe endurance monitorplus 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 CLIstatusfacts.Approved controls: keep global
p/r/c/d/qunchanged; graph focus keeps the settled graph controls from Choose daily graph encoding and hourly drill-down; add accessible TUI controls fort presetandm 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
● Monitoringstate, 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)andApp.themesupport theme registration/activation; Textual theme variables plus$text/color: autosupport legibility; mouse events provide screen/widget-relative coordinates and focusable widgets can be resolved/clicked for keyboard+mouse proof paths. Local repo lockfile still pinstextual==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.