phase: 23_llm_rate_responsiveness
Phase 23 final verification complete — all green.
```
VERIFIED (criteria)
1 /api/llm/snapshot windows ≈2 s live (1.98–2.00), /api/system window_seconds ≈10 s (9.996–10.005);
/api/config llm.rate_window_seconds=2=LLM_INTERVAL_SECONDS; browser re-check ALL CHECKS PASSED
(data/logs/23-window-{llm,system}.png — /llm prints Δ2.0s, /system footnote Δ10.0s)
2 Phase-13 pins unchanged: floor, 2×span ceiling, 8× jump gate + independent anchor — all pass
(only import/span-line diffs in tests/; git diff confirms no assertion rewritten)
3 Live proof re-derived from artifacts: 780 rows, 0 unlabelled, windows 0.61–3.38 s, 5 starts +
5 ends settled by poll 2 (0 unsettled), 1 m rollups max 42.3 vs raw 201.6, 0 over 300 tok/s;
counterfactual 10 s window: median settle poll 3, |ln| 0.924 vs 0.037
4 uv run pytest: 1494 passed / 15 skipped · coverage 98.94% (floor 94) · ruff clean · pyright 0
errors · node --check clean · bash .agents/validate.sh exit 0 · live 11 passed · store_perf 4 passed
Dev server up, all nine sources ok. No git add/commit run; everything left in the working tree.
DOCS PASS — 4 inconsistencies fixed in AGENTS.md (last two runs above include them)
- UI conventions hero example still said the `.sub` footnote reads `Δ10.0s`; the only hero that
prints a Δ is /llm's → now `Δ2.0s` on /llm, "at the current load" on /ups
- gap 9: "found 10 busy-edges" contradicted its own artifact (17 edges, 10 judged, 7 reported-not-
judged) → 17; and the poll-2 ratios were a 3-of-5 cherry-pick → full five values both windows
- gap 12: the responsive-table fix is now scheduled — names 27_mobile_tables_and_audit
README, config table, .env.example, rates/prom docstrings, app/api bullets and the testing-policy
pins all re-checked against code and found consistent (store pragmas, budgets, throttle, fleet).
NOTES
- Advisory only, not phase 23: fastapi 0.153.0 → 0.156.8 available; dependencies untouched here,
so rule 8's "update on purpose" is left to the operator.
- NOTES.md is empty in the working tree (its items became phases 24–27); left as-is, untracked-file
rules forbid me removing it.
- Next phase: 24_dev_mtls_rollout (25–27 follow).
```
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
Phase 23 final verification complete — all green.
|
||||
|
||||
```
|
||||
VERIFIED (criteria)
|
||||
1 /api/llm/snapshot windows ≈2 s live (1.98–2.00), /api/system window_seconds ≈10 s (9.996–10.005);
|
||||
/api/config llm.rate_window_seconds=2=LLM_INTERVAL_SECONDS; browser re-check ALL CHECKS PASSED
|
||||
(data/logs/23-window-{llm,system}.png — /llm prints Δ2.0s, /system footnote Δ10.0s)
|
||||
2 Phase-13 pins unchanged: floor, 2×span ceiling, 8× jump gate + independent anchor — all pass
|
||||
(only import/span-line diffs in tests/; git diff confirms no assertion rewritten)
|
||||
3 Live proof re-derived from artifacts: 780 rows, 0 unlabelled, windows 0.61–3.38 s, 5 starts +
|
||||
5 ends settled by poll 2 (0 unsettled), 1 m rollups max 42.3 vs raw 201.6, 0 over 300 tok/s;
|
||||
counterfactual 10 s window: median settle poll 3, |ln| 0.924 vs 0.037
|
||||
4 uv run pytest: 1494 passed / 15 skipped · coverage 98.94% (floor 94) · ruff clean · pyright 0
|
||||
errors · node --check clean · bash .agents/validate.sh exit 0 · live 11 passed · store_perf 4 passed
|
||||
Dev server up, all nine sources ok. No git add/commit run; everything left in the working tree.
|
||||
|
||||
DOCS PASS — 4 inconsistencies fixed in AGENTS.md (last two runs above include them)
|
||||
- UI conventions hero example still said the `.sub` footnote reads `Δ10.0s`; the only hero that
|
||||
prints a Δ is /llm's → now `Δ2.0s` on /llm, "at the current load" on /ups
|
||||
- gap 9: "found 10 busy-edges" contradicted its own artifact (17 edges, 10 judged, 7 reported-not-
|
||||
judged) → 17; and the poll-2 ratios were a 3-of-5 cherry-pick → full five values both windows
|
||||
- gap 12: the responsive-table fix is now scheduled — names 27_mobile_tables_and_audit
|
||||
README, config table, .env.example, rates/prom docstrings, app/api bullets and the testing-policy
|
||||
pins all re-checked against code and found consistent (store pragmas, budgets, throttle, fleet).
|
||||
|
||||
NOTES
|
||||
- Advisory only, not phase 23: fastapi 0.153.0 → 0.156.8 available; dependencies untouched here,
|
||||
so rule 8's "update on purpose" is left to the operator.
|
||||
- NOTES.md is empty in the working tree (its items became phases 24–27); left as-is, untracked-file
|
||||
rules forbid me removing it.
|
||||
- Next phase: 24_dev_mtls_rollout (25–27 follow).
|
||||
```
|
||||
+1
@@ -0,0 +1 @@
|
||||
ok
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
== uv run pytest --cov (hermetic: no network, live tests skip) ==
|
||||
........................................................................ [ 4%]
|
||||
........................................................................ [ 9%]
|
||||
........................................................................ [ 14%]
|
||||
........................................................................ [ 19%]
|
||||
........................................................................ [ 23%]
|
||||
.........................................................s.............. [ 28%]
|
||||
........................................................................ [ 33%]
|
||||
........................................................................ [ 38%]
|
||||
........................................................................ [ 42%]
|
||||
........................................................................ [ 47%]
|
||||
........................................................................ [ 52%]
|
||||
........................................................................ [ 57%]
|
||||
........................................................................ [ 62%]
|
||||
........................................................................ [ 66%]
|
||||
........................sssssssssss..................................... [ 71%]
|
||||
........................................................................ [ 76%]
|
||||
........................................................................ [ 81%]
|
||||
........................................................................ [ 85%]
|
||||
........................................................................ [ 90%]
|
||||
........................................................................ [ 95%]
|
||||
...........sss....................................................... [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%
|
||||
1494 passed, 15 skipped, 1 warning in 155.69s (0:02:35)
|
||||
== 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.156.8 wheel
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
**Implemented (phase 23 task 01 — the LLM source gets its own Δ window)**
|
||||
|
||||
- `app.py::build_hub` now builds **two** estimators: `host_rates = RateEstimator(span=settings.rate_window)` (10 s) for `HostCollector`, `llm_rates = RateEstimator(span=settings.llm_interval)` (2 s) for `llm_jobs`; docstring rewritten to the two-estimator rule (no new env var — the LLM window *is* `LLM_INTERVAL_SECONDS`).
|
||||
- `api.py`: `/api/config`'s `llm.rate_window_seconds` now reports the LLM's actual span (it echoed the host's 10 s window, which would have been a config fact reading as a measurement).
|
||||
- `config.py` / `rates.py` / `page-llm.js` comments corrected to the per-cadence span; `.env.example` comments say `RATE_WINDOW_SECONDS` is the host's knob and the LLM window tracks `LLM_INTERVAL_SECONDS`.
|
||||
- Tests: `test_api.py::test_build_hub_gives_each_source_the_estimator_its_own_cadence_fills` (spies the two estimator objects at 2/10 and 4/20 — distinct objects, LLM span tracks the cadence knob, `MIN_WINDOW_SECONDS` floor intact) + `test_config_reports_the_window_the_llm_rates_are_actually_measured_over`; `test_llm_source.py::test_gufo_the_window_the_llm_jobs_are_spanned_by_is_one_that_fills` (2 s span reads a steady 50 tok/s on the first poll after a slot starts, labelled `Δ2.0s`, while the 10 s span ramps 12.5 → 20 → 30); `test_live_fleet.py` estimators re-spanned to `llm_interval`.
|
||||
- `bash .agents/validate.sh` → **1481 passed, 15 skipped**, coverage **98.94 %** (floor 94), `ruff` clean, `pyright` 0 errors, `node --check` clean (only the pre-existing fastapi-outdated advisory).
|
||||
- Docs: README (`RATE_WINDOW_SECONDS` row rewritten, new `LLM_INTERVAL_SECONDS` row, both `Δ10.0s` → `Δ2.0s`/`Δ<window>` mentions) and AGENTS.md (`app.py` and `rates.py` bullets gain the two-estimator fact, gap 9 gains the "phase 23 changed the window, not the gates" paragraph, the `Δ<window>` UI convention notes each page's own window).
|
||||
- Extra evidence (read-only, no fleet writes): dev server restarted — all nine sources `ok`; `/api/llm/snapshot` windows 2.01/2.007 s, `/api/system/snapshot` 9.97/10.00/10.01 s, `/api/config` `llm.rate_window_seconds=2`; headless browser pass `data/logs/23-task01-window.cjs` shows `/llm` printing `Δ2.0s` four times and `/system` still `Δ10.0s` (screenshots `data/logs/23-window-{llm,system}.png`, note `data/logs/NOTES-23-window.md`).
|
||||
- Decision: pre-existing working-tree change to `NOTES.md` (cleared TODO) left as-is; fastapi not upgraded (dependencies untouched this task).
|
||||
|
||||
Next pending task: `23_llm_rate_responsiveness/02_window_pins.md`.
|
||||
+1
@@ -0,0 +1 @@
|
||||
ok
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
== uv run pytest --cov (hermetic: no network, live tests skip) ==
|
||||
........................................................................ [ 4%]
|
||||
........................................................................ [ 9%]
|
||||
........................................................................ [ 14%]
|
||||
........................................................................ [ 19%]
|
||||
........................................................................ [ 24%]
|
||||
........................................................s............... [ 28%]
|
||||
........................................................................ [ 33%]
|
||||
........................................................................ [ 38%]
|
||||
........................................................................ [ 43%]
|
||||
........................................................................ [ 48%]
|
||||
........................................................................ [ 52%]
|
||||
........................................................................ [ 57%]
|
||||
........................................................................ [ 62%]
|
||||
........................................................................ [ 67%]
|
||||
.....................sssssssssss........................................ [ 72%]
|
||||
........................................................................ [ 77%]
|
||||
........................................................................ [ 81%]
|
||||
........................................................................ [ 86%]
|
||||
........................................................................ [ 91%]
|
||||
......................................................................ss [ 96%]
|
||||
s....................................................... [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%
|
||||
1481 passed, 15 skipped, 1 warning in 154.51s (0:02:34)
|
||||
== 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.156.6 wheel
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
**Implemented (phase 23 task 02 — the window pins)**
|
||||
|
||||
- New `tests/rate_window_contract.py`: the two Δ windows (`HOST_WINDOW` = `RATE_WINDOW_SECONDS` 10 s, `LLM_WINDOW` = `LLM_INTERVAL_SECONDS` 2 s), `delta_label()` (the pages' `toFixed(1)` tag) and `assert_window()` (estimator floor → `2 × span` ceiling **plus** the printed label).
|
||||
- `tests/test_llm_source.py`: `poll_engine()` capture-replay helper + pins for **both** throughput cells of **both** engines at the 2 s shape (`window`, `Δ2.0s`, `computed:Δ<series>/Δt`); the phase-13 floor refusal through the production parse path at that span (`n/a`, honest `Δ0.2s`, re-base to 50 tok/s); a jittered-cadence leg proving a real 2.03 s gap still labels `Δ2.0s`.
|
||||
- `tests/test_host_source.py`: host `window_seconds` pinned at 10 s / `Δ10.0s`, and the same 10 s cadence starved to `n/a` by a 2 s span (why one estimator cannot serve both sources).
|
||||
- `tests/test_rates.py`: floor / `2 × span` ceiling / 8× jump gate parametrized at 2.0 **and** 10.0; the phase-13 tests themselves untouched (verified in the diff).
|
||||
- `tests/test_api.py`: served `page-llm.js` pin — the provenance tag is built from `cell.window`, no config echo, no literal `Δ10.0s`. `tests/test_config.py`: the previously-missing `rate_window` 10 s default pin + "exactly one `*window*` knob" (the LLM window *is* `LLM_INTERVAL_SECONDS`).
|
||||
- Tests/lint: `bash .agents/validate.sh` → **1494 passed, 15 skipped**, coverage **98.94 %** (floor 94, unchanged from task 01), `ruff` clean, `pyright` 0 errors, `node --check` clean, **EXIT=0**; `uv run pytest -m live --live` → **11 passed** (read-only).
|
||||
- Docs: README (a paragraph on the contract module beside the other `_contract` files), AGENTS.md (new testing-policy bullet for the two-window pin; invariant 2's example now `computed:Δtokens/Δt` labelled `Δ2.0s`), `prom.field` docstring names both windows.
|
||||
- Notable decision: a signed-in read of the running dev server showed real LLM windows **2.009–2.026 s** (span == cadence ⇒ the base comes from the window-empty fallback) and host `window_seconds` 9.978–10.002 s, so `assert_window`'s ceiling is the estimator's `2 × span`, not the span — a literal `window == span` pin would fail against working software; the tight half of the pin is the label. No runtime behaviour changed (test files + docstrings/docs only); the `fastapi 0.153 → 0.156` advisory is pre-existing and dependencies were not touched.
|
||||
|
||||
Next pending task: `23_llm_rate_responsiveness/03_live_verification.md`.
|
||||
+1
@@ -0,0 +1 @@
|
||||
ok
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
== uv run pytest --cov (hermetic: no network, live tests skip) ==
|
||||
........................................................................ [ 4%]
|
||||
........................................................................ [ 9%]
|
||||
........................................................................ [ 14%]
|
||||
........................................................................ [ 19%]
|
||||
........................................................................ [ 23%]
|
||||
.........................................................s.............. [ 28%]
|
||||
........................................................................ [ 33%]
|
||||
........................................................................ [ 38%]
|
||||
........................................................................ [ 42%]
|
||||
........................................................................ [ 47%]
|
||||
........................................................................ [ 52%]
|
||||
........................................................................ [ 57%]
|
||||
........................................................................ [ 62%]
|
||||
........................................................................ [ 66%]
|
||||
........................sssssssssss..................................... [ 71%]
|
||||
........................................................................ [ 76%]
|
||||
........................................................................ [ 81%]
|
||||
........................................................................ [ 85%]
|
||||
........................................................................ [ 90%]
|
||||
........................................................................ [ 95%]
|
||||
...........sss....................................................... [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%
|
||||
1494 passed, 15 skipped, 1 warning in 153.57s (0:02:33)
|
||||
== 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.156.8 wheel
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
**Phase 23 task 03 — live verification: DONE, PASS.**
|
||||
|
||||
**Implementation.** `scripts/watch-llm-window.py` (new, read-only): signs in, samples `/api/llm/snapshot` at the app's own `LLM_INTERVAL_SECONDS`, records per poll the decode/prompt value **with the `Δ` window that produced it**, the engine's own busy signal and lifetime counters; judges zero-untagged values, window shape (never the host's 10 s), edge settle/decay, and the stored 1 m rollups; re-diffs the *same* samples over 2 s and the pre-phase 10 s span, and `DASH_LLM_WATCH_REPLAY=<tsv>` re-derives the verdict from captured evidence without sending traffic. `data/logs/23-live-window.cjs` is the browser half (hero `.sub` + strip `.prov` vs the API).
|
||||
|
||||
**Live results** (operator workload only; no engine called, no load generated). Pass A 780 s + pass B 460 s: 390 / 229 polls per engine, **0 poll errors**, gufo max **201.6 tok/s**, windows **0.61–3.38 s**, **0 untagged**, 1 m rollups **42.3** and **24.7** (gap-9 ceiling 300). **8 slot starts + 8 ends, 0 unsettled by poll 2** on the ungated Δ. Counterfactual on the same samples: median `|ln(value/steady)|` at poll 2 **0.037** (2 s) vs **0.924** (10 s), with the pre-phase leg printed as `13.4 → 28.3 → 45.1 → 52.5` up and `53.3 → 37.9 → 28.9 → 13.9` down — the ramp the phase removed. Browser pass: **866** rendered decode figures, **0** untagged, every tag inside the estimator's bounds, modal `Δ2.0s` on page and API (833 of 866), no `Δ10s`; screenshots `data/logs/23-live-llm-{midburst (50.9 tok/s, Δ2.0s), post-free (0.0, Δ2.0s), burst-settled, gufo-idle, vllm-idle, opening, final}.png`, transcripts `23-live-window.out` / `llm-window-watch{,-pass2}.log`.
|
||||
|
||||
**Checks.** `uv run pytest` → **1494 passed, 15 skipped**; `bash .agents/validate.sh` → **exit 0**, coverage **98.94 %** (floor 94), ruff clean, pyright 0 errors, `node --check` clean (advisory only: fastapi 0.153.0→0.156.8; deps untouched); `uv run pytest -m live --live` → **11 passed**; dev server restarted, all nine sources `ok`.
|
||||
|
||||
**Docs.** `AGENTS.md`: gap 9's phase-23 paragraph rewritten from "hermetic half is pinned; task 03 is the live proof" to what the watch measured; new testing-policy bullet (live measurement re-derivable from its capture; pass line on the ungated Δ, because phase-13 holds are correct behaviour; isolated edges only — a following request is not a slot ending, and prefill makes a slot's first polls read ~0); Commands gains the watch + replay; hermetic count corrected 1477→1494. `README.md`: Testing gains both invocations.
|
||||
|
||||
**Next task:** phase 23 is complete — `.agents/phases/todo/24_dev_mtls_rollout/01_dev_bundle_export.md`.
|
||||
+1
@@ -0,0 +1 @@
|
||||
ok
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
== uv run pytest --cov (hermetic: no network, live tests skip) ==
|
||||
........................................................................ [ 4%]
|
||||
........................................................................ [ 9%]
|
||||
........................................................................ [ 14%]
|
||||
........................................................................ [ 19%]
|
||||
........................................................................ [ 23%]
|
||||
.........................................................s.............. [ 28%]
|
||||
........................................................................ [ 33%]
|
||||
........................................................................ [ 38%]
|
||||
........................................................................ [ 42%]
|
||||
........................................................................ [ 47%]
|
||||
........................................................................ [ 52%]
|
||||
........................................................................ [ 57%]
|
||||
........................................................................ [ 62%]
|
||||
........................................................................ [ 66%]
|
||||
........................sssssssssss..................................... [ 71%]
|
||||
........................................................................ [ 76%]
|
||||
........................................................................ [ 81%]
|
||||
........................................................................ [ 85%]
|
||||
........................................................................ [ 90%]
|
||||
........................................................................ [ 95%]
|
||||
...........sss....................................................... [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%
|
||||
1494 passed, 15 skipped, 1 warning in 155.17s (0:02:35)
|
||||
== 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.156.8 wheel
|
||||
Reference in New Issue
Block a user