The always-on stage made long-run behavior real: the dogfood daemon now runs for days. Nothing currently guards slow failure modes — steady-state memory growth, per-tick latency drift as history accumulates, retention efficacy over thousands of ticks. The suite verifies correctness per-tick; nothing verifies the daemon stays healthy over a run.
Proposal
One named offline soak test (tests/test_soak.py): a compressed daemon lifetime via the fake clock — RunnerDaemon.tick() over 4,000 ticks (~13 simulated days at 300s cadence) against real SQLite, one watch with the full kit (--digest 24h --stale 2d --flaky, no required checks so it never completes), with a check-conclusion flip every 500 ticks and a new head SHA every 1,500 ticks so all three watch kinds and the statemachine transitions fire repeatedly.
Acceptance (each row asserted by the test; thresholds generous tripwires, not benchmarks)
If any budget trips, the finding is investigated before widening the budget — a budget change is a decision, not a fix.
The always-on stage made long-run behavior real: the dogfood daemon now runs for days. Nothing currently guards slow failure modes — steady-state memory growth, per-tick latency drift as history accumulates, retention efficacy over thousands of ticks. The suite verifies correctness per-tick; nothing verifies the daemon stays healthy over a run.
Proposal
One named offline soak test (
tests/test_soak.py): a compressed daemon lifetime via the fake clock —RunnerDaemon.tick()over 4,000 ticks (~13 simulated days at 300s cadence) against real SQLite, one watch with the full kit (--digest 24h --stale 2d --flaky, no required checks so it never completes), with a check-conclusion flip every 500 ticks and a new head SHA every 1,500 ticks so all three watch kinds and the statemachine transitions fire repeatedly.Acceptance (each row asserted by the test; thresholds generous tripwires, not benchmarks)
tracemallocstarted after warmup, peak and end-current traced memory stay within fixed budgets (e.g., end-current growth < 1 MB, peak < 10 MB)check-observedrows for the task ≤ OBSERVATION_RETENTION (20)If any budget trips, the finding is investigated before widening the budget — a budget change is a decision, not a fix.