Final state verified. Report: **Verified (phase 12 — all 3 tasks already complete; this was the verification pass)** - Re-ran the wire capture live: `ups.test.result` = `No test initiated` (apc) / `Done and passed` (cyberpower) — matches `LIVE_SELF_TEST_WORDS` + both fixtures; `/api/summary` has **no** self-test row, `/api/ups/snapshot` reads `cyberpower ok | Done and passed`, `apc unknown | …run a battery test`; both screenshots read back correct. - Fixed a defect found in prior work while checking the "unrelated live noise" note: `NutMonitor.collect()` reused one upsd socket after a *partially-read* reply, so a 4 s stall produced bogus `expected 'BEGIN LIST VAR', got 'RW apc battery.charge.low "10"'` errors (same hazard on `INSTCMD`, where a late `OK` could be read as a different command's success). `NutClient` now marks a socket whose reply stopped early as `UNUSABLE`, naming the command that stalled; a complete `ERR …` line still leaves it usable (the per-UPS tolerance `collect()` depends on). +3 hermetic pins against the fake upsd; live re-check (09:33–09:44) now logs one line per stall, no cascade. **Tests / lint / coverage (all green)** - `bash .agents/validate.sh` → **exit 0**; `uv run pytest --cov --cov-fail-under=94` → **1172 passed, 11 skipped**, coverage **98.63 %** (floor 94); `uv run ruff check src tests agent` clean; `uv run pyright` 0 errors; `node --check` clean. Modified modules: `sources/nut.py` 95 %, `collectors.py` 97 % (no new line uncovered). - `uv run pytest -m live --live` → **8 passed / 3 failed**, all three the pre-existing `driveripper` agent-transport failures AGENTS.md records (verified still true: unit `inactive`, no installed file, nothing on `:9120`). - `./scripts/dev-server.sh status`: `nut ok`, `llm:* ok`, `host/disks:deskwork|gateway ok`; the two `driveripper` jobs DOWN. **Completion criteria** - Live capture recorded + asserts `ok` — met (re-confirmed from the wire today). - `/ups` renders `ok`, overview silent, screenshots present — met. - pytest / cov / ruff / pyright / validate — met (above). - No other `health.checks[]` behaviour changed — met (diff confined to the `test_result` branch; all prior nut/ups-contract tests unmodified). **Documentation**: README verified consistent (self-test wording, config table cross-checked against `config.py`, all documented commands/flags exist) — no changes needed beyond phase tasks' edit. AGENTS.md fixes: stale test count (1140 → 1172), `nvme0n1` power-on hours 19 158 → 19 160, gap 4 store-error claim corrected (last stored `store-error` 2026-10-18 06:33, none in the previous 24 h), new `collectors.py`/`sources/nut.py` socket-hygiene note, new gap-1 bullet on the upsd stall, plus live evidence appended to `data/logs/NOTES-self-test.md`. **Deviations**: made no live *changes* (read-only probes only) — `driveripper`'s agent install needs root (`ops` has no installer/visudo grant) and a battery test stays the operator's call; the upsd 4 s stall itself is upstream-side. `uv pip list --outdated` still advisory (certifi/fastapi/starlette) — dependencies untouched this phase. **Next pending phase**: `13_llm_page_and_decode_rate`.
80 lines
3.1 KiB
Plaintext
80 lines
3.1 KiB
Plaintext
# Verbatim upsd reply (LIST UPS / LIST VAR / LIST CMD), recorded by
|
|
# ./scripts/capture-fixtures.sh — one `VAR`/`CMD` line per protocol line.
|
|
# Volatile values (ups.load, battery.runtime, the voltages) move every poll,
|
|
# so a diff here on re-capture is expected; the contract asserts shape, units
|
|
# and which variables the drivers omit, never those numbers.
|
|
UPS cyberpower "CyberPower PR1500LCDRT2U (USB)"
|
|
VAR cyberpower battery.charge "100"
|
|
VAR cyberpower battery.charge.low "10"
|
|
VAR cyberpower battery.charge.warning "20"
|
|
VAR cyberpower battery.mfr.date "CPS"
|
|
VAR cyberpower battery.runtime "3350"
|
|
VAR cyberpower battery.runtime.low "300"
|
|
VAR cyberpower battery.status "100%"
|
|
VAR cyberpower battery.type "PbAcid"
|
|
VAR cyberpower battery.voltage "27.2"
|
|
VAR cyberpower battery.voltage.nominal "24"
|
|
VAR cyberpower device.mfr "CPS"
|
|
VAR cyberpower device.model "GX1500U"
|
|
VAR cyberpower device.serial "SCRUBBEDSERIAL1"
|
|
VAR cyberpower device.type "ups"
|
|
VAR cyberpower driver.debug "0"
|
|
VAR cyberpower driver.flag.allow_killpower "0"
|
|
VAR cyberpower driver.name "usbhid-ups"
|
|
VAR cyberpower driver.parameter.interrupt_pipe_no_events_tolerance "-1"
|
|
VAR cyberpower driver.parameter.pollfreq "12"
|
|
VAR cyberpower driver.parameter.pollinterval "2"
|
|
VAR cyberpower driver.parameter.port "auto"
|
|
VAR cyberpower driver.parameter.productid "0601"
|
|
VAR cyberpower driver.parameter.synchronous "auto"
|
|
VAR cyberpower driver.parameter.vendorid "0764"
|
|
VAR cyberpower driver.state "quiet"
|
|
VAR cyberpower driver.version "2.8.5"
|
|
VAR cyberpower driver.version.data "CyberPower HID 0.85"
|
|
VAR cyberpower driver.version.internal "0.71"
|
|
VAR cyberpower driver.version.usb "libusb-1.0.30 (API: 0x0100010C)"
|
|
VAR cyberpower input.sensitivity "normal"
|
|
VAR cyberpower input.transfer.high "139"
|
|
VAR cyberpower input.transfer.low "100"
|
|
VAR cyberpower input.voltage "122.0"
|
|
VAR cyberpower input.voltage.nominal "120"
|
|
VAR cyberpower output.voltage "122.0"
|
|
VAR cyberpower ups.beeper.status "disabled"
|
|
VAR cyberpower ups.delay.shutdown "60"
|
|
VAR cyberpower ups.delay.start "120"
|
|
VAR cyberpower ups.firmware "CR01906AC911"
|
|
VAR cyberpower ups.load "14"
|
|
VAR cyberpower ups.mfr "CPS"
|
|
VAR cyberpower ups.model "GX1500U"
|
|
VAR cyberpower ups.power "132"
|
|
VAR cyberpower ups.power.nominal "1500"
|
|
VAR cyberpower ups.productid "0601"
|
|
VAR cyberpower ups.realpower "126"
|
|
VAR cyberpower ups.realpower.nominal "900"
|
|
VAR cyberpower ups.serial "SCRUBBEDSERIAL1"
|
|
VAR cyberpower ups.status "OL"
|
|
VAR cyberpower ups.test.result "Done and passed"
|
|
VAR cyberpower ups.timer.shutdown "-60"
|
|
VAR cyberpower ups.timer.start "-60"
|
|
VAR cyberpower ups.vendorid "0764"
|
|
CMD cyberpower beeper.disable
|
|
CMD cyberpower beeper.enable
|
|
CMD cyberpower beeper.mute
|
|
CMD cyberpower beeper.off
|
|
CMD cyberpower beeper.on
|
|
CMD cyberpower driver.killpower
|
|
CMD cyberpower driver.reload
|
|
CMD cyberpower driver.reload-or-error
|
|
CMD cyberpower driver.reload-or-exit
|
|
CMD cyberpower load.off
|
|
CMD cyberpower load.off.delay
|
|
CMD cyberpower load.on
|
|
CMD cyberpower load.on.delay
|
|
CMD cyberpower shutdown.default
|
|
CMD cyberpower shutdown.return
|
|
CMD cyberpower shutdown.stayoff
|
|
CMD cyberpower shutdown.stop
|
|
CMD cyberpower test.battery.start.deep
|
|
CMD cyberpower test.battery.start.quick
|
|
CMD cyberpower test.battery.stop
|