Files
dashboards/.agents/phases/todo/21_page_cleanups/00_phase.md
T
ducoterra f9b1565abb chore(agent): phase roadmap from TODO.md, 5 phases
Convert the 11 TODO items to phases 20-24 (masthead/nav polish,
page cleanups, /disks hiding unconfigured hosts, LLM rate window,
dev mTLS rollout). TODO.md cleared; items now live in
.agents/phases/todo/.

LLM-Generated: true
2026-10-20 18:06:46 -04:00

4.7 KiB
Raw Blame History

Phase 21 — Page cleanups: pause, GPU values, certs scroll

Source: TODO.md L7, L9, L12 — "remove the pause button, GPU data as its own values, /certs table horizontal scroll" Story: n/a Context: src/dashboards/web/pages/{disks,llm,system,ups}.html line 25 (the #pause button, the only one in the served markup — /, /certs and /settings have none), src/dashboards/web/static/app.js (lines 587–615 the poll() _paused plumbing, lines 773–783 the #pause binding plus the Space shortcut), src/dashboards/web/static/dash.css line 203 (the comment naming the pause button), src/dashboards/web/static/page-system.js (lines 150–156 gpuSub() — the dense sub-line the TODO quotes, lines 164–188 renderGpuSlot(), line 72 the data-k="gpus" hero slot), tests/test_api.py (line 1425 — the six-heroes pin: "exactly six heroes: CPU, MEM, TEMP, DISK, GPU, NET", asserted over the three captures: discrete GPU, APU, no-GPU), src/dashboards/web/pages/certs.html line 81 (<table class="data" id="agents-table"> — no .scroll modifier; dash.css gives table.data a scroll container only with the .scroll class), src/dashboards/web/static/page-certs.js (lines 55–56 — the table element references)

Objective

Three small page-level cleanups, one per workstream: the pause button is gone from every page (the hidden-tab skip stays — a background tab idling its polls is not the operator's pause), the /system GPU data is split out of the dense sub-line into its own labelled values and a host with no GPU omits the slot instead of printing n/a, and the /certs agents table scrolls horizontally so the right-hand columns are reachable on a phone. No API surface changes; the pins that name the old behaviour (six heroes incl. an n/a GPU slot, the unpinned pause button) are rewritten, not left rotting.

Dependencies

  • 20_masthead_nav_polish (todo) — the pause button lives in the masthead row task 01.01 reflows, and the /system hero row is re-measured under the new bar; landing 20 first keeps 21's diff confined to the page bodies.

Tasks

  1. 01_remove_pause_button.md — delete the button, the Space shortcut, the setPaused/_paused plumbing and the CSS comment; the hidden-tab skip survives
  2. 02_gpu_own_values.md — the dense gpuSub() line becomes four labelled values per card; a GPU-less host omits the slot (five heroes, no n/a)
  3. 03_certs_table_scroll.md — #agents-table gets the .scroll modifier so its right-hand columns are reachable at phone width

Testing & Quality

  • Unit/integration: tests/test_api.py — the served-page pins: the pause button absent from the four pages (a return of #pause fails a test), the six-heroes pin rewritten (GPU-present host: six, GPU-absent host: five with no data-k="gpus" slot), the #agents-table .scroll pin; tests/test_system_contract.py + tests/card_contract.py stay green (the API fields are unchanged — only the page's reading of them moves)
  • Coverage: >90% on new/modified code (the phase is markup + JS + CSS; the gate applies to the changed Python test files)
  • The phase is "Complete" only when the entire project test suite passes 100% (every test in the project, not just this phase's)

Documentation & Consistency

  • The final pass reviews README.md and AGENTS.md in full against the project as it stands after this phase — fixing every inconsistency found, including pre-existing ones not caused by this phase. AGENTS.md's /system paragraph ("a missing number or verdict — gateway's CPU temp, any host's absent GPU — prints n/a uncoloured") is the one rule this phase inverts for the GPU slot (the CPU-temp n/a stays — the TODO quotes the GPU line only); the sentence is split, the GPU half rewritten to the omission rule, and the pause button's mention in the masthead comment dropped.

Completion Criteria

  • no page serves a #pause button or binds the Space key; a hidden tab still skips its polls (served-bytes pin + a CDP visibilitychange check)
  • /system's GPU slot prints model / VRAM / pool / temp as four labelled values; a GPU-less host (the no-GPU capture, gateway) renders five heroes with no GPU slot and no n/a in it (screenshots in data/logs/)
  • at 360 px the /certs agents table scrolls horizontally to its last column (screenshot in data/logs/)
  • uv run pytest green, coverage not down, ruff + pyright clean
  • bash .agents/validate.sh green (including node --check of the modified page scripts)
  • no behavior change in completed work: the six-hero order on GPU hosts, the hidden-tab skip, the GPU history charts, the /certs row contents and the event pager are all unchanged