phase: 26_ups_event_split

**Phase 26 `ups_event_split` — final verification pass (all 3 tasks already complete; nothing missing from `complete/`).**

Verified
- `page-ups.js`: `POWER_EVENT_KINDS = {status,test,action}` split, unconditional `refreshEvents()`, no `state.events`/toggle-fetch, shared `eventRow`, `#ups-errors-card.hidden = errors.length === 0`; `ups.html` error card above the disclosure, `hidden`, outside every `<details>`. Kind set cross-checked against the real writers (`collectors.py:393/409`, `api.py:1043/1058`, `poller.py:127/157/164/190`) — classification is correct.
- Re-ran the phase's browser pass live: `node data/logs/26-task03-verify.cjs` → **31 checks, 0 skipped, ALL PASS** (`data/logs/26-final-verify.out`) — poll-failure rows readable with the disclosure shut, card hidden on a power-only feed and appearing on the first `unreachable`, lists paging independently, 360 px clean.

Tests / lint (all green)
- `uv run pytest` → **1545 passed, 15 skipped**, exit 0 · `bash .agents/validate.sh` → exit 0, coverage **98.94%** (floor 94%) · `uv run ruff check src tests agent` clean · `uv run pyright` 0 errors · `node --check` clean · `uv run pytest -m live --live` (with `.env.dev`) → **11 passed**, dev server reads all 9 sources `ok`.

Completion criteria: poll-failure visible + power collapsed ✅ (pinned + browser); hidden-when-empty card, one `/api/events?source=ups` fetch, shared pager ✅; stale-last-good via the empty `catch` pin ✅; pytest/coverage/ruff/pyright ✅; `validate.sh` ✅; no behaviour change to prior work — `dash.css`/`app.js` untouched, disclosure CSS / pager / row-shape pins pass unchanged ✅.

Docs
- Fixed (pre-existing + this phase's drift): AGENTS.md "one helper with four call sites" → **five over four pages** and the `row(event)` sentence (phase 26 added a second `/ups` call site); invariant 5's `web/static/charts.js` → `src/dashboards/web/static/charts.js`; recorded the completion-pass transcript. README: "one helper renders every feed" now notes five lists. Full sweep otherwise consistent — all 38 env vars match `config.py` exactly, all served routes/scripts/contracts referenced exist, suite/coverage/live counts and marker splits verified.

Deviations: `fastapi 0.153.0 → 0.159.1` advisory left alone (validate.sh declares it advisory-not-a-gate; this phase touched no dependencies, matching prior phases' precedent). Next phase: **`27_mobile_tables_and_audit`**.
This commit is contained in:
2026-10-21 19:42:19 -04:00
parent 2bf236fd92
commit 9ff3c7889b
25 changed files with 734 additions and 121 deletions
@@ -0,0 +1,15 @@
**Phase 26 `ups_event_split` — final verification pass (all 3 tasks already complete; nothing missing from `complete/`).**
Verified
- `page-ups.js`: `POWER_EVENT_KINDS = {status,test,action}` split, unconditional `refreshEvents()`, no `state.events`/toggle-fetch, shared `eventRow`, `#ups-errors-card.hidden = errors.length === 0`; `ups.html` error card above the disclosure, `hidden`, outside every `<details>`. Kind set cross-checked against the real writers (`collectors.py:393/409`, `api.py:1043/1058`, `poller.py:127/157/164/190`) — classification is correct.
- Re-ran the phase's browser pass live: `node data/logs/26-task03-verify.cjs` → **31 checks, 0 skipped, ALL PASS** (`data/logs/26-final-verify.out`) — poll-failure rows readable with the disclosure shut, card hidden on a power-only feed and appearing on the first `unreachable`, lists paging independently, 360 px clean.
Tests / lint (all green)
- `uv run pytest` → **1545 passed, 15 skipped**, exit 0 · `bash .agents/validate.sh` → exit 0, coverage **98.94%** (floor 94%) · `uv run ruff check src tests agent` clean · `uv run pyright` 0 errors · `node --check` clean · `uv run pytest -m live --live` (with `.env.dev`) → **11 passed**, dev server reads all 9 sources `ok`.
Completion criteria: poll-failure visible + power collapsed ✅ (pinned + browser); hidden-when-empty card, one `/api/events?source=ups` fetch, shared pager ✅; stale-last-good via the empty `catch` pin ✅; pytest/coverage/ruff/pyright ✅; `validate.sh` ✅; no behaviour change to prior work — `dash.css`/`app.js` untouched, disclosure CSS / pager / row-shape pins pass unchanged ✅.
Docs
- Fixed (pre-existing + this phase's drift): AGENTS.md "one helper with four call sites" → **five over four pages** and the `row(event)` sentence (phase 26 added a second `/ups` call site); invariant 5's `web/static/charts.js` → `src/dashboards/web/static/charts.js`; recorded the completion-pass transcript. README: "one helper renders every feed" now notes five lists. Full sweep otherwise consistent — all 38 env vars match `config.py` exactly, all served routes/scripts/contracts referenced exist, suite/coverage/live counts and marker splits verified.
Deviations: `fastapi 0.153.0 → 0.159.1` advisory left alone (validate.sh declares it advisory-not-a-gate; this phase touched no dependencies, matching prior phases' precedent). Next phase: **`27_mobile_tables_and_audit`**.
@@ -0,0 +1,66 @@
== uv run pytest --cov (hermetic: no network, live tests skip) ==
........................................................................ [ 4%]
........................................................................ [ 9%]
........................................................................ [ 13%]
........................................................................ [ 18%]
........................................................................ [ 23%]
............................................................s........... [ 27%]
........................................................................ [ 32%]
........................................................................ [ 36%]
........................................................................ [ 41%]
........................................................................ [ 46%]
........................................................................ [ 50%]
........................................................................ [ 55%]
........................................................................ [ 60%]
........................................................................ [ 64%]
........................................................................ [ 69%]
...sssssssssss.......................................................... [ 73%]
........................................................................ [ 78%]
........................................................................ [ 83%]
........................................................................ [ 87%]
........................................................................ [ 92%]
..............................................................sss....... [ 96%]
................................................ [100%]
=============================== warnings summary ===============================
.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1
/var/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.4-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 176 0 100%
src/dashboards/api.py 440 0 100%
src/dashboards/app.py 186 0 100%
src/dashboards/auth.py 265 0 100%
src/dashboards/certs.py 292 0 100%
src/dashboards/collectors.py 205 5 98% 284-285, 289-290, 307
src/dashboards/config.py 120 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/host.py 209 0 100%
src/dashboards/sources/llm.py 178 1 99% 285
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 3495 37 99%
Required test coverage of 94% reached. Total coverage: 98.94%
1545 passed, 15 skipped, 1 warning in 163.65s (0:02:43)
== 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 ==
advisory: dependencies are out of date (AGENTS.md rule 8 — update on purpose):
fastapi 0.153.0 0.159.1 wheel
@@ -0,0 +1,17 @@
All green. Summary:
**Implemented** (`src/dashboards/web/static/page-ups.js`)
- Added `POWER_EVENT_KINDS = new Set(['status', 'test', 'action'])` with a doc comment naming the writers (`collectors.py` `status`/`test`, `api.py` `action`) and stating that any other kind defaults to the visible error list.
- `refreshEvents()` now splits the one unchanged `/api/events?limit=…&source=ups` fetch into `power` (into `#events`, row renderer/eventText/`runtime_seconds` footnote byte-identical) and `errors` (the always-visible half, rendered by task 02).
- Removed the phase-19 lazy gate: `refresh()` calls `await refreshEvents();` unconditionally; `state.events` and the `toggle` handler's fetch logic are deleted — the native `<details>` now gates visibility only; stale-last-good is `refreshEvents()`' empty `catch`.
**Tests / lint / coverage**
- `tests/test_api.py`: replaced `test_ups_events_are_fetched_only_while_the_disclosure_is_open` with its inverted successor `test_ups_events_are_fetched_on_every_poll_and_split_by_kind` (kind set incl. a `UPS_POWER_EVENT_KINDS` table, no `state.events`, unconditional poll fetch, no toggle fetch, `/api/events` URL byte-identical with no `kind=`/`page=`/`severity=` vocabulary, empty catch = stale-last-good); updated the row-shape pin to `Dash.eventsPager($('#events'), power, {`. Also fixed a latent vacuous regex in the old pin (`refreshEvents();` unescaped → never matched).
- `uv run pytest` → **1543 passed, 15 skipped**; `uv run pytest --cov --cov-fail-under=94` → **98.94%** (unchanged); `ruff check src tests agent` clean; `pyright` 0 errors; `node --check` all static JS clean; `bash .agents/validate.sh` **exit 0**.
- Browser proof (invariant 10): `data/logs/26-task01-smoke.cjs` + `data/logs/26-task01-smoke.png` against the restarted dev server (9 sources ok) — page runs with no JS errors, disclosure shut by default yet its list filled by the poll path, rows exactly the power-kind half of a direct `/api/events` read, no error row leaked into the collapsed list. Live store has 199 error-kind vs 1 power-kind row in the last 200 `ups` events — the TODO's complaint, quantified.
**Docs**: AGENTS.md event-feed paragraph rewritten (lazy gate → always-fetched + `kind` split + the new pin name); README.md `/ups` "expandable" paragraph rewritten to the same fact.
**Decisions/deviations**: had to re-pin the two failing phase-19 pins now (task 03 extends them, e.g. the error list's row shape) to keep the suite green; `errors` is computed but not yet drawn — task 02 adds `#events-errors`.
**Next pending task**: `.agents/phases/todo/26_ups_event_split/02_render_both_lists_paged.md`.
@@ -0,0 +1,66 @@
== uv run pytest --cov (hermetic: no network, live tests skip) ==
........................................................................ [ 4%]
........................................................................ [ 9%]
........................................................................ [ 13%]
........................................................................ [ 18%]
........................................................................ [ 23%]
..........................................................s............. [ 27%]
........................................................................ [ 32%]
........................................................................ [ 36%]
........................................................................ [ 41%]
........................................................................ [ 46%]
........................................................................ [ 50%]
........................................................................ [ 55%]
........................................................................ [ 60%]
........................................................................ [ 64%]
........................................................................ [ 69%]
.sssssssssss............................................................ [ 73%]
........................................................................ [ 78%]
........................................................................ [ 83%]
........................................................................ [ 87%]
........................................................................ [ 92%]
............................................................sss......... [ 97%]
.............................................. [100%]
=============================== warnings summary ===============================
.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1
/var/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.4-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 176 0 100%
src/dashboards/api.py 440 0 100%
src/dashboards/app.py 186 0 100%
src/dashboards/auth.py 265 0 100%
src/dashboards/certs.py 292 0 100%
src/dashboards/collectors.py 205 5 98% 284-285, 289-290, 307
src/dashboards/config.py 120 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/host.py 209 0 100%
src/dashboards/sources/llm.py 178 1 99% 285
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 3495 37 99%
Required test coverage of 94% reached. Total coverage: 98.94%
1543 passed, 15 skipped, 1 warning in 165.86s (0:02:45)
== 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 ==
advisory: dependencies are out of date (AGENTS.md rule 8 — update on purpose):
fastapi 0.153.0 0.159.1 wheel
@@ -0,0 +1,19 @@
All green. Final report:
**Implemented (task 02 — the always-visible error card)**
- Verified the shipped half of the task (task 01's run had already written the `#ups-errors-card` markup, the second `Dash.eventsPager($('#events-errors'), …)` call, the single shared `eventRow` const, and `$('#ups-errors-card').hidden = errors.length === 0`); the prior task-02 run died on a provider 502 with pyright interrupted, so its gates were never closed.
- Wrote the missing real-browser verification: `data/logs/26-task02-layout.cjs` (+ `.out`, `.log`, 7 screenshots) — 33 checks, all pass: live feed visible **above** the still-shut Power events disclosure and not inside a `<details>`; rows exactly the non-power kinds of a direct `/api/events?source=ups&limit=200` split, rendered through the page's own `Dash.eventText`; the quoted `NutError: cannot reach upsd … (timed out after 4s)` readable without opening anything; `.85rem` gap in **both** states (13.59 px measured, no doubled gap when hidden); independent paging on a synthetic 60+60 feed (`51–60 of 60` moves only the list you clicked); stale-last-good on a 500 feed (both `<ul>`s hold their rows, card holds its visibility); hidden-while-empty arm with no `loading…` flash and the hidden→visible transition on the first error row; 360 px with no horizontal overflow.
- `dash.css` untouched (no new selector); power list's empty sentence and the disclosure CSS shape unchanged.
- Docs: AGENTS.md event-feed paragraph now states the error card, its shared row/pager, the inline `.85rem` gap and both pin names; README's `/ups` paragraph names the always-visible **Connection & errors** card.
**Tests / lint / coverage**
- `uv run pytest` → **1545 passed, 15 skipped** · `uv run pytest --cov --cov-fail-under=94` → **TOTAL 99%** (3495 stmts, 37 miss)
- `uv run ruff check src tests agent` → All checks passed · `uv run pyright` → 0 errors, 0 warnings · `node --check web/static/*.js` clean
- `bash .agents/validate.sh` → **exit 0** · `uv run pytest -m live --live` → 11 passed, exit 0 (read-only)
- browser: `node data/logs/26-task02-layout.cjs` → **ALL CHECKS PASS** (33/33)
**Decisions / deviations**
- Task 02's served-byte pins (already present in `tests/test_api.py` from task 01's run) were left in place rather than rewritten; I verified each claims what the task file asks and added the measured half it was missing. No new Python changed, so coverage was never at risk.
- Gap check confirmed the hidden card does not double the stack's gap, so the error card keeps its inline `margin-top:.85rem` (the task file's fallback was not needed).
**Next pending task:** `.agents/phases/todo/26_ups_event_split/03_repin_and_browser_verify.md`
@@ -0,0 +1,66 @@
== uv run pytest --cov (hermetic: no network, live tests skip) ==
........................................................................ [ 4%]
........................................................................ [ 9%]
........................................................................ [ 13%]
........................................................................ [ 18%]
........................................................................ [ 23%]
............................................................s........... [ 27%]
........................................................................ [ 32%]
........................................................................ [ 36%]
........................................................................ [ 41%]
........................................................................ [ 46%]
........................................................................ [ 50%]
........................................................................ [ 55%]
........................................................................ [ 60%]
........................................................................ [ 64%]
........................................................................ [ 69%]
...sssssssssss.......................................................... [ 73%]
........................................................................ [ 78%]
........................................................................ [ 83%]
........................................................................ [ 87%]
........................................................................ [ 92%]
..............................................................sss....... [ 96%]
................................................ [100%]
=============================== warnings summary ===============================
.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1
/var/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.4-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 176 0 100%
src/dashboards/api.py 440 0 100%
src/dashboards/app.py 186 0 100%
src/dashboards/auth.py 265 0 100%
src/dashboards/certs.py 292 0 100%
src/dashboards/collectors.py 205 5 98% 284-285, 289-290, 307
src/dashboards/config.py 120 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/host.py 209 0 100%
src/dashboards/sources/llm.py 178 1 99% 285
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 3495 37 99%
Required test coverage of 94% reached. Total coverage: 98.94%
1545 passed, 15 skipped, 1 warning in 165.97s (0:02:45)
== 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 ==
advisory: dependencies are out of date (AGENTS.md rule 8 — update on purpose):
fastapi 0.153.0 0.159.1 wheel
@@ -0,0 +1,20 @@
Everything is green. Final verification summary:
**Implemented (task 03 — `26_ups_event_split`)**
- `tests/test_api.py`: new helpers `_details_blocks()` and `_pager_call()`; `_power_event_kinds()` now *parses* the `POWER_EVENT_KINDS` literal and the pin asserts set **equality** with `UPS_POWER_EVENT_KINDS`.
- `test_ups_power_events_feed_sits_behind_a_collapsed_disclosure`: all phase-19 assertions kept, extended — `#events-errors` present, outside **every** `<details>`, and its card ships `hidden`; docstring rewritten off the old lazy-fetch rationale.
- Renamed the inverted lazy-gate pin to `test_ups_events_are_fetched_on_every_poll` (unconditional `await refreshEvents()`, no `state.events`, no `toggle` fetch, URL byte-identical, empty `catch` = stale-last-good).
- Row-shape pin now reads **each** pager call (`#events` + `#events-errors`: shared `row: eventRow`, label, empty sentence), forbids `event.kind`/one-template rule, and pins `hidden = errors.length === 0` set *after* both lists paint.
- Disclosure CSS pin extended with the no-`#ups-errors-card`/`#events-errors`-selector guard (original assertions untouched).
- `data/logs/26-task03-verify.cjs` + `26-task03-verify.out/.log` + screenshots `ups-event-split-{visible,expanded,hidden,appears,phone}.png`; mutation-checked the new pins (dropping a `row: eventRow`, wrapping the card in a `<details>`, adding a CSS id rule each fail).
- `AGENTS.md`: pin names/sentences re-pointed, kind-set parse described, phase browser pass recorded, suite count 1543→1545. README needed no change (already accurate).
**Tests / lint (exact)**
- `bash .agents/validate.sh` → exit 0: `pytest --cov --cov-fail-under=94` → **1545 passed, 15 skipped**, coverage **98.94%**; `ruff check src tests agent` → All checks passed; `pyright` → 0 errors; `node --check web/static/*.js` clean.
- `uv run pytest -m live --live` → 11 passed. Browser pass: **31 checks, 0 skipped, ALL CHECKS PASS** (feed: 200 events = 1 power + 199 error; error card visible above the shut disclosure with 50-of-199 rows matching a direct `/api/events?source=ups&limit=200` split).
**Deviations / notes**
- Kept `_pager_call`-per-list slicing instead of a whole-file `row:` count; the old long test name from task 01 (`…_and_split_by_kind`) was renamed to the task file's `test_ups_events_are_fetched_on_every_poll` and AGENTS.md re-pointed.
- validate.sh prints a pre-existing advisory (`fastapi 0.153.0 → 0.159.1`); dependencies were not touched by this task, so I left the lock alone.
**Next pending task:** none in phase 26 (this was the last); next is `27_mobile_tables_and_audit`.
@@ -0,0 +1,66 @@
== uv run pytest --cov (hermetic: no network, live tests skip) ==
........................................................................ [ 4%]
........................................................................ [ 9%]
........................................................................ [ 13%]
........................................................................ [ 18%]
........................................................................ [ 23%]
............................................................s........... [ 27%]
........................................................................ [ 32%]
........................................................................ [ 36%]
........................................................................ [ 41%]
........................................................................ [ 46%]
........................................................................ [ 50%]
........................................................................ [ 55%]
........................................................................ [ 60%]
........................................................................ [ 64%]
........................................................................ [ 69%]
...sssssssssss.......................................................... [ 73%]
........................................................................ [ 78%]
........................................................................ [ 83%]
........................................................................ [ 87%]
........................................................................ [ 92%]
..............................................................sss....... [ 96%]
................................................ [100%]
=============================== warnings summary ===============================
.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1
/var/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.4-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 176 0 100%
src/dashboards/api.py 440 0 100%
src/dashboards/app.py 186 0 100%
src/dashboards/auth.py 265 0 100%
src/dashboards/certs.py 292 0 100%
src/dashboards/collectors.py 205 5 98% 284-285, 289-290, 307
src/dashboards/config.py 120 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/host.py 209 0 100%
src/dashboards/sources/llm.py 178 1 99% 285
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 3495 37 99%
Required test coverage of 94% reached. Total coverage: 98.94%
1545 passed, 15 skipped, 1 warning in 166.36s (0:02:46)
== 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 ==
advisory: dependencies are out of date (AGENTS.md rule 8 — update on purpose):
fastapi 0.153.0 0.159.1 wheel