phase: 35_llm_equal_window_heights
**Phase 35 final verification pass — complete.** - Both task files (01, 02) already in `complete/`; verified the work in-tree: `#engines` = `grid cols-2`, `.strip` has no `align-items` (keeps `display: grid`, `gap: .85rem`, `auto-fit minmax(min(340px, 100%), 1fr)`), `.grid.items-start` rule + corrected comment intact, rewritten pin `test_llm_engine_windows_stretch_to_a_common_row_height` in place. - Live re-verified in browser (fresh `35-llm-verify.cjs` run, screenshots re-captured): both engines answering; strip cards 456 px / panel cards 422 px with flat equal bottoms; row gaps 13.6 px (uniform `.85rem`); `n/a` cells preserved; 360 px viewport single-column, no overflow/clip. `/system` no-regress: `grid auto items-start`, expanded disclosure does not stretch collapsed siblings (325.4 → 325.4). - Completion criteria: served `/llm` markup ✓ · live equalized rows + screenshot ✓ · `/system` bytes unchanged ✓ · full suite/coverage/lint ✓ · README/AGENTS.md ✓ · no behaviour change (all existing pins pass) ✓. - Tests: `bash .agents/validate.sh` → **exit 0**: `uv run pytest --cov` **2031 passed, 19 skipped** (15 live + 4 store_perf, opt-in), coverage **98.71%** (94% floor reached); `ruff` all checks passed; `pyright` 0 errors; `node --check` + repo hygiene clean. - Live suite (`--live`, read-only): 4/15 pass (LLM engines); 5 fail solely on host-agent/upsd **connectivity timeouts** (9120/3051 unreachable from this machine — same errors as `dev-server.sh status`); environmental, no code defect. No live changes made (all verification read-only). - Docs: README.md reviewed in full — verified quickstart, installer/agent flags, config defaults, Containerfile facts, script flags, fixtures, test files, polling cadences: **consistent, no changes needed**. AGENTS.md: fixed one stale statement (hermetic skip count "12 live" → "15 live"); nothing else stale. - Dev server up (pid 811266), `/api/health` 200; hosts/upsd DOWN is the pre-existing environmental state, LLM source ok. - Next pending phase: **none** — `todo/` contains only this phase (35).
This commit is contained in:
+10
@@ -0,0 +1,10 @@
|
||||
**Phase 35 final verification pass — complete.**
|
||||
|
||||
- Both task files (01, 02) already in `complete/`; verified the work in-tree: `#engines` = `grid cols-2`, `.strip` has no `align-items` (keeps `display: grid`, `gap: .85rem`, `auto-fit minmax(min(340px, 100%), 1fr)`), `.grid.items-start` rule + corrected comment intact, rewritten pin `test_llm_engine_windows_stretch_to_a_common_row_height` in place.
|
||||
- Live re-verified in browser (fresh `35-llm-verify.cjs` run, screenshots re-captured): both engines answering; strip cards 456 px / panel cards 422 px with flat equal bottoms; row gaps 13.6 px (uniform `.85rem`); `n/a` cells preserved; 360 px viewport single-column, no overflow/clip. `/system` no-regress: `grid auto items-start`, expanded disclosure does not stretch collapsed siblings (325.4 → 325.4).
|
||||
- Completion criteria: served `/llm` markup ✓ · live equalized rows + screenshot ✓ · `/system` bytes unchanged ✓ · full suite/coverage/lint ✓ · README/AGENTS.md ✓ · no behaviour change (all existing pins pass) ✓.
|
||||
- Tests: `bash .agents/validate.sh` → **exit 0**: `uv run pytest --cov` **2031 passed, 19 skipped** (15 live + 4 store_perf, opt-in), coverage **98.71%** (94% floor reached); `ruff` all checks passed; `pyright` 0 errors; `node --check` + repo hygiene clean.
|
||||
- Live suite (`--live`, read-only): 4/15 pass (LLM engines); 5 fail solely on host-agent/upsd **connectivity timeouts** (9120/3051 unreachable from this machine — same errors as `dev-server.sh status`); environmental, no code defect. No live changes made (all verification read-only).
|
||||
- Docs: README.md reviewed in full — verified quickstart, installer/agent flags, config defaults, Containerfile facts, script flags, fixtures, test files, polling cadences: **consistent, no changes needed**. AGENTS.md: fixed one stale statement (hermetic skip count "12 live" → "15 live"); nothing else stale.
|
||||
- Dev server up (pid 811266), `/api/health` 200; hosts/upsd DOWN is the pre-existing environmental state, LLM source ok.
|
||||
- Next pending phase: **none** — `todo/` contains only this phase (35).
|
||||
+1
@@ -0,0 +1 @@
|
||||
ok
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
== uv run pytest --cov (hermetic: no network, live tests skip) ==
|
||||
........................................................................ [ 3%]
|
||||
........................................................................ [ 7%]
|
||||
........................................................................ [ 10%]
|
||||
........................................................................ [ 14%]
|
||||
........................................................................ [ 17%]
|
||||
........................................................................ [ 21%]
|
||||
........................................................................ [ 24%]
|
||||
........................................................................ [ 28%]
|
||||
........................................................................ [ 31%]
|
||||
...................................s.................................... [ 35%]
|
||||
........................................................................ [ 38%]
|
||||
........................................................................ [ 42%]
|
||||
........................................................................ [ 45%]
|
||||
........................................................................ [ 49%]
|
||||
........................................................................ [ 52%]
|
||||
........................................................................ [ 56%]
|
||||
........................................................................ [ 59%]
|
||||
........................................................................ [ 63%]
|
||||
........................................................................ [ 66%]
|
||||
........................................................................ [ 70%]
|
||||
........................................................................ [ 73%]
|
||||
............sssssssssssssss............................................. [ 77%]
|
||||
........................................................................ [ 80%]
|
||||
........................................................................ [ 84%]
|
||||
........................................................................ [ 87%]
|
||||
........................................................................ [ 91%]
|
||||
........................................................................ [ 94%]
|
||||
................................................sss..................... [ 98%]
|
||||
.................................. [100%]
|
||||
=============================== warnings summary ===============================
|
||||
.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1
|
||||
/home/ducoterra/Projects/Personal/dashboards/.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.
|
||||
from starlette.testclient import TestClient as TestClient # noqa
|
||||
|
||||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||||
================================ tests coverage ================================
|
||||
_______________ coverage: platform linux, python 3.14.8-final-0 ________________
|
||||
|
||||
Name Stmts Miss Cover Missing
|
||||
------------------------------------------------------------------
|
||||
src/dashboards/__init__.py 3 0 100%
|
||||
src/dashboards/__main__.py 14 1 93% 32
|
||||
src/dashboards/alerts.py 201 0 100%
|
||||
src/dashboards/api.py 625 9 99% 229, 1278-1280, 1315-1318, 1387, 1395, 1451, 1454
|
||||
src/dashboards/app.py 190 0 100%
|
||||
src/dashboards/auth.py 265 0 100%
|
||||
src/dashboards/certs.py 292 0 100%
|
||||
src/dashboards/collectors.py 256 4 98% 405, 409-410, 445
|
||||
src/dashboards/config.py 132 0 100%
|
||||
src/dashboards/debug.py 14 0 100%
|
||||
src/dashboards/poller.py 165 3 98% 192-194, 279
|
||||
src/dashboards/prom.py 112 5 96% 126, 163, 177, 180, 183
|
||||
src/dashboards/rates.py 73 0 100%
|
||||
src/dashboards/severity.py 49 0 100%
|
||||
src/dashboards/sources/__init__.py 0 0 100%
|
||||
src/dashboards/sources/disks.py 134 0 100%
|
||||
src/dashboards/sources/gateway.py 613 10 98% 339, 588, 601-602, 652, 785, 1089, 1140, 1207, 1569
|
||||
src/dashboards/sources/host.py 209 0 100%
|
||||
src/dashboards/sources/llm.py 282 4 99% 467, 517, 554, 607
|
||||
src/dashboards/sources/nut.py 413 20 95% 153, 172, 186, 198, 204, 217, 225, 241, 319-320, 322, 579, 591, 626, 657, 661, 718-719, 724, 736
|
||||
src/dashboards/sources/nut_sim.py 134 0 100%
|
||||
src/dashboards/store.py 313 2 99% 553-554
|
||||
------------------------------------------------------------------
|
||||
TOTAL 4489 58 99%
|
||||
Required test coverage of 94% reached. Total coverage: 98.71%
|
||||
2031 passed, 19 skipped, 1 warning in 201.30s (0:03:21)
|
||||
== uv run ruff check src tests agent ==
|
||||
All checks passed!
|
||||
== uv run pyright ==
|
||||
0 errors, 0 warnings, 0 informations
|
||||
== node --check src/dashboards/web/static/*.js ==
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
All checks pass. The old pin name remains only in the phase files (untouched by design); `.strip` no longer carries `align-items`; `llm.html` no longer has `items-start`. (Note: the task's "commit per task" line is overridden by the harness rules — the harness makes the one atomic commit per phase, so I left everything in the working tree.)
|
||||
|
||||
**Report — Task 01 (phase 35): stretch the LLM strip and panel rows**
|
||||
|
||||
- `llm.html`: `#engines` div is now `class="grid cols-2"` (dropped `items-start`; grid default `stretch` takes over). Section comment untouched — it names no alignment.
|
||||
- `dash.css`: `.strip` rule lost `align-items: start;` (keeps `display: grid`, `gap: .85rem`, the `auto-fit minmax(min(340px, 100%), 1fr)` columns); the `.grid.items-start` comment rewritten to the new fact — still serves `/system`, `/disks`, `certs`, `settings`, `gateway`; `/llm` rows now use default stretch, extra space = bottom card padding, content top-aligned via `.stack { align-content: start }`.
|
||||
- `tests/test_api.py`: `test_llm_engine_panels_are_not_stretched_to_their_tallest_sibling` replaced in place by `test_llm_engine_windows_stretch_to_a_common_row_height` — pins exact `#engines` class list `grid cols-2`, the `.strip` block (no `align-items`, rule still alive with columns+gap), and `/system`'s `grid auto items-start` in the same test (both directions, no silent convergence); docstring records the 2026-10-25 operator decision incl. rule 2 (`n/a`, never `0`).
|
||||
- Tests: `uv run pytest` → **2031 passed, 19 skipped, 0 failed**; `uv run pytest --cov` → 98.71% (94% floor held); `ruff check src tests agent` clean; `pyright` 0 errors; `bash .agents/validate.sh` → **exit 0**; `uv pip list --outdated` empty (no deps moved).
|
||||
- Docs: no impact — README L1104–1105 `items-start` sentence describes the `/system` disclosure, still accurate; AGENTS.md unaffected (layout preference is not a rule/command/fleet fact). No other served page, payload, or asset changed.
|
||||
- Notable: pre-existing working-tree edits to `NOTES.md`/`TODO.md` (operator's) were left untouched; no live-infra involvement in this task.
|
||||
|
||||
Next pending task: `02_live_verify_and_docs.md` (live browser verification + screenshot, `/system` no-regress, README/AGENTS.md pass).
|
||||
+1
@@ -0,0 +1 @@
|
||||
ok
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
== uv run pytest --cov (hermetic: no network, live tests skip) ==
|
||||
........................................................................ [ 3%]
|
||||
........................................................................ [ 7%]
|
||||
........................................................................ [ 10%]
|
||||
........................................................................ [ 14%]
|
||||
........................................................................ [ 17%]
|
||||
........................................................................ [ 21%]
|
||||
........................................................................ [ 24%]
|
||||
........................................................................ [ 28%]
|
||||
........................................................................ [ 31%]
|
||||
...................................s.................................... [ 35%]
|
||||
........................................................................ [ 38%]
|
||||
........................................................................ [ 42%]
|
||||
........................................................................ [ 45%]
|
||||
........................................................................ [ 49%]
|
||||
........................................................................ [ 52%]
|
||||
........................................................................ [ 56%]
|
||||
........................................................................ [ 59%]
|
||||
........................................................................ [ 63%]
|
||||
........................................................................ [ 66%]
|
||||
........................................................................ [ 70%]
|
||||
........................................................................ [ 73%]
|
||||
............sssssssssssssss............................................. [ 77%]
|
||||
........................................................................ [ 80%]
|
||||
........................................................................ [ 84%]
|
||||
........................................................................ [ 87%]
|
||||
........................................................................ [ 91%]
|
||||
........................................................................ [ 94%]
|
||||
................................................sss..................... [ 98%]
|
||||
.................................. [100%]
|
||||
=============================== warnings summary ===============================
|
||||
.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1
|
||||
/home/ducoterra/Projects/Personal/dashboards/.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.
|
||||
from starlette.testclient import TestClient as TestClient # noqa
|
||||
|
||||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||||
================================ tests coverage ================================
|
||||
_______________ coverage: platform linux, python 3.14.8-final-0 ________________
|
||||
|
||||
Name Stmts Miss Cover Missing
|
||||
------------------------------------------------------------------
|
||||
src/dashboards/__init__.py 3 0 100%
|
||||
src/dashboards/__main__.py 14 1 93% 32
|
||||
src/dashboards/alerts.py 201 0 100%
|
||||
src/dashboards/api.py 625 9 99% 229, 1278-1280, 1315-1318, 1387, 1395, 1451, 1454
|
||||
src/dashboards/app.py 190 0 100%
|
||||
src/dashboards/auth.py 265 0 100%
|
||||
src/dashboards/certs.py 292 0 100%
|
||||
src/dashboards/collectors.py 256 4 98% 405, 409-410, 445
|
||||
src/dashboards/config.py 132 0 100%
|
||||
src/dashboards/debug.py 14 0 100%
|
||||
src/dashboards/poller.py 165 3 98% 192-194, 279
|
||||
src/dashboards/prom.py 112 5 96% 126, 163, 177, 180, 183
|
||||
src/dashboards/rates.py 73 0 100%
|
||||
src/dashboards/severity.py 49 0 100%
|
||||
src/dashboards/sources/__init__.py 0 0 100%
|
||||
src/dashboards/sources/disks.py 134 0 100%
|
||||
src/dashboards/sources/gateway.py 613 10 98% 339, 588, 601-602, 652, 785, 1089, 1140, 1207, 1569
|
||||
src/dashboards/sources/host.py 209 0 100%
|
||||
src/dashboards/sources/llm.py 282 4 99% 467, 517, 554, 607
|
||||
src/dashboards/sources/nut.py 413 20 95% 153, 172, 186, 198, 204, 217, 225, 241, 319-320, 322, 579, 591, 626, 657, 661, 718-719, 724, 736
|
||||
src/dashboards/sources/nut_sim.py 134 0 100%
|
||||
src/dashboards/store.py 313 2 99% 553-554
|
||||
------------------------------------------------------------------
|
||||
TOTAL 4489 58 99%
|
||||
Required test coverage of 94% reached. Total coverage: 98.71%
|
||||
2031 passed, 19 skipped, 1 warning in 198.59s (0:03:18)
|
||||
== uv run ruff check src tests agent ==
|
||||
All checks passed!
|
||||
== uv run pyright ==
|
||||
0 errors, 0 warnings, 0 informations
|
||||
== node --check src/dashboards/web/static/*.js ==
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
All checks complete. The skip set is exactly the expected opt-in set (live + store_perf markers).
|
||||
|
||||
## Report
|
||||
|
||||
- **Live verification (AGENTS.md rule 10):** dev server restarted; `llm:gufo`/`llm:radiance` both ok. Browser (Playwright, live data): strip row cards share height 456 px / flat bottom 812 px; panel row cards share 422 px / flat bottom 1247.7 px; row-to-row gaps both exactly 13.6 px (`.85rem`); `n/a` cells render `n/a` (queue time/p95/slot remaining), severity colours unchanged; 360 px viewport: single column, no overflow/clipping. Screenshot `data/logs/35-llm-equal-windows.png` (+ `35-llm-equal-windows-mobile-360.png`, `35-system-no-regress.png`; script `data/logs/35-llm-verify.cjs`).
|
||||
- **`/system` no-regress:** served `#hosts` still `grid auto items-start`, CSS rule intact; expanding a host's Charts disclosure leaves the collapsed sibling at 325.4 px before and after — no stretch.
|
||||
- **Docs pass:** README reviewed (env table cross-checked against `.env.example` — complete; quickstart/`dev-server.sh` commands match; gateway 1.2.0/1.3.0/1.4.0, routectl, radiance, LLM sections all current). The only `items-start` mention (L1104–1105) is the system-disclosure sentence — still accurate, nothing in the README describes `/llm` rows as own-height. **No README/AGENTS.md changes** (AGENTS.md states no layout-related statement, so nothing became stale; check recorded).
|
||||
- **Tests/gate:** `uv run pytest` → 2031 passed, 19 skipped (only live/store_perf opt-ins), 100% green; `uv run pytest --cov` → 98.71% (floor 94% reached); `ruff` + `pyright` clean; `bash .agents/validate.sh` green.
|
||||
- **Live suite note (no live changes made):** `pytest -m live --live` → 4 passed (the engine tests — the sources this phase touches), 5 failed, all dial timeouts to the real fleet agents (10.1.0.126/10.1.0.51/10.1.1.27) and upsd — the same pre-existing fleet-down state `dev-server.sh status` shows (agents down ~21 h, 8664 consecutive failures); not a regression (phase touched no Python code). I would have re-run the live suite once the agents are reachable; I made no changes to fleet infrastructure.
|
||||
- **Commit:** not made — the harness makes one atomic commit per phase (overrides the per-task commit instruction).
|
||||
- **Next pending task:** none in `todo/35_llm_equal_window_heights/` — phase 35 is complete pending the harness's final pass.
|
||||
+1
@@ -0,0 +1 @@
|
||||
ok
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
== uv run pytest --cov (hermetic: no network, live tests skip) ==
|
||||
........................................................................ [ 3%]
|
||||
........................................................................ [ 7%]
|
||||
........................................................................ [ 10%]
|
||||
........................................................................ [ 14%]
|
||||
........................................................................ [ 17%]
|
||||
........................................................................ [ 21%]
|
||||
........................................................................ [ 24%]
|
||||
........................................................................ [ 28%]
|
||||
........................................................................ [ 31%]
|
||||
...................................s.................................... [ 35%]
|
||||
........................................................................ [ 38%]
|
||||
........................................................................ [ 42%]
|
||||
........................................................................ [ 45%]
|
||||
........................................................................ [ 49%]
|
||||
........................................................................ [ 52%]
|
||||
........................................................................ [ 56%]
|
||||
........................................................................ [ 59%]
|
||||
........................................................................ [ 63%]
|
||||
........................................................................ [ 66%]
|
||||
........................................................................ [ 70%]
|
||||
........................................................................ [ 73%]
|
||||
............sssssssssssssss............................................. [ 77%]
|
||||
........................................................................ [ 80%]
|
||||
........................................................................ [ 84%]
|
||||
........................................................................ [ 87%]
|
||||
........................................................................ [ 91%]
|
||||
........................................................................ [ 94%]
|
||||
................................................sss..................... [ 98%]
|
||||
.................................. [100%]
|
||||
=============================== warnings summary ===============================
|
||||
.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1
|
||||
/home/ducoterra/Projects/Personal/dashboards/.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.
|
||||
from starlette.testclient import TestClient as TestClient # noqa
|
||||
|
||||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||||
================================ tests coverage ================================
|
||||
_______________ coverage: platform linux, python 3.14.8-final-0 ________________
|
||||
|
||||
Name Stmts Miss Cover Missing
|
||||
------------------------------------------------------------------
|
||||
src/dashboards/__init__.py 3 0 100%
|
||||
src/dashboards/__main__.py 14 1 93% 32
|
||||
src/dashboards/alerts.py 201 0 100%
|
||||
src/dashboards/api.py 625 9 99% 229, 1278-1280, 1315-1318, 1387, 1395, 1451, 1454
|
||||
src/dashboards/app.py 190 0 100%
|
||||
src/dashboards/auth.py 265 0 100%
|
||||
src/dashboards/certs.py 292 0 100%
|
||||
src/dashboards/collectors.py 256 4 98% 405, 409-410, 445
|
||||
src/dashboards/config.py 132 0 100%
|
||||
src/dashboards/debug.py 14 0 100%
|
||||
src/dashboards/poller.py 165 3 98% 192-194, 279
|
||||
src/dashboards/prom.py 112 5 96% 126, 163, 177, 180, 183
|
||||
src/dashboards/rates.py 73 0 100%
|
||||
src/dashboards/severity.py 49 0 100%
|
||||
src/dashboards/sources/__init__.py 0 0 100%
|
||||
src/dashboards/sources/disks.py 134 0 100%
|
||||
src/dashboards/sources/gateway.py 613 10 98% 339, 588, 601-602, 652, 785, 1089, 1140, 1207, 1569
|
||||
src/dashboards/sources/host.py 209 0 100%
|
||||
src/dashboards/sources/llm.py 282 4 99% 467, 517, 554, 607
|
||||
src/dashboards/sources/nut.py 413 20 95% 153, 172, 186, 198, 204, 217, 225, 241, 319-320, 322, 579, 591, 626, 657, 661, 718-719, 724, 736
|
||||
src/dashboards/sources/nut_sim.py 134 0 100%
|
||||
src/dashboards/store.py 313 2 99% 553-554
|
||||
------------------------------------------------------------------
|
||||
TOTAL 4489 58 99%
|
||||
Required test coverage of 94% reached. Total coverage: 98.71%
|
||||
2031 passed, 19 skipped, 1 warning in 201.59s (0:03:21)
|
||||
== uv run ruff check src tests agent ==
|
||||
All checks passed!
|
||||
== uv run pyright ==
|
||||
0 errors, 0 warnings, 0 informations
|
||||
== node --check src/dashboards/web/static/*.js ==
|
||||
Reference in New Issue
Block a user