Flip §A LLAMA_SERVER probe to pending-live-QA (aaf896d), register the QA
gate in §F, and add docs/qa/QA-llama-health-probe.md with observable-evidence
checks (liveness up/down/restore, non-2xx, tps degrade, restart hysteresis,
replay independence).
4.0 KiB
QA Plan: LLAMA_SERVER health probe — aaf896d
Observability spec §4. Drafted from the diff (commit aaf896d) per the BACKLOG QA rule.
Status: DRAFT Run date / operator: BACKLOG item: §A "§4 LLAMA_SERVER health probe — liveness + tokens/sec degradation trend".
Preconditions
- server build/branch: master @
aaf896d(or later) — rebuild only with the server stopped - llama-server + model: a real llama.cpp server reachable at the configured base URL
(managed
[[models]]path →host:port; static path → first[[providers]].urlorCORREX_LLAMA_URL) - config:
[health].enabled = true; for the degradation check set[health].llama_tps_warn_below(default0.0= disabled). New fields:llama_liveness_timeout_ms(default 5000),llama_tps_warn_below(default 0.0). - interval:
[health].interval_ms(default 30_000) — note it so you know how long a status edge takes to surface. - how to read state:
correx healthCLI /GET /health/checks; raw events viacorrex events __system__(health events ride the reservedSessionId("__system__")).
Acceptance gate (one sentence)
The probe is correct iff a reachable llama-server reads HEALTHY, an unreachable/erroring one emits exactly one
HealthDegradedEvent(subject=LLAMA_SERVER)(visible incorrex healthand the__system__log), recovery emits exactly oneHealthRestoredEvent, and replay re-derives all of that from recorded events without touching the network.
Checks
| # | Action | Expected observable evidence | Result |
|---|---|---|---|
| 1 | Server + llama up, health.enabled=true, wait one interval |
correx health shows LLAMA_SERVER HEALTHY; no HealthDegradedEvent(LLAMA_SERVER) in correx events __system__; probe detail "llama-server live at " |
|
| 2 | Stop llama-server (or point base URL at a dead port), wait one interval | Exactly one HealthDegradedEvent with subject=LLAMA_SERVER, metric liveness, detail "GET /health failed: …"; correx health flips to DEGRADED |
|
| 3 | Restart llama-server, wait one interval | Exactly one HealthRestoredEvent(LLAMA_SERVER); correx health back to HEALTHY. No repeated Degraded/Restored on subsequent ticks (hysteresis = edge-only) |
|
| 4 | Point base URL at an endpoint returning non-2xx for /health |
HealthDegradedEvent metric liveness, detail "returned HTTP ", |
|
| 5 | Set llama_tps_warn_below above current throughput, run one inference, wait a tick |
HealthDegradedEvent metric tokens_per_second; observedValue = avg tps ×100 (fixed-point); detail "avg tokens/sec X below warn threshold Y (window=N)" |
|
| 6 | Set llama_tps_warn_below below current throughput (or default 0.0), run inferences |
No tokens_per_second DEGRADED; at 0.0 the dimension is fully disabled regardless of throughput |
|
| 7 | Restart the correx server while llama is HEALTHY | No spurious Degraded/Restored re-emission on boot (HealthMonitor seeds status from the projection) | |
| 8 | Kill llama-server, then correx replay __system__ |
Replay re-derives the same health timeline from recorded HealthObservation events; double-read digest stable; no network call to llama (invariants #8/#9) |
Evidence sources: correx events __system__ (the recorded truth), correx health / GET /health/checks,
server logs (look for the probe tick + emitted edge events), correx replay __system__ for determinism.
Out of scope (NOT covered this pass)
- EVENT_STORE health probe (separate BACKLOG item, §A).
- Live health TUI pane (separate BACKLOG item, §A).
- Prometheus/Grafana export (spec: do not build).
Disposition
- PASS → MOVE the §A "LLAMA_SERVER health probe" entry into
RETRO.md(citeaaf896d, run date, evidence). - FAIL → file each failure as a numbered finding back into
BACKLOG.md(action + exact repro + the wrong/missing signal), fix, re-run only the failed checks. Set Status: FAILED until green.