v0.34.0 — the tasks envelope, honestly windowed
[0.34.0] — 2026-08-12
pve_tasks_list returns a windowed outcome envelope, and the repo now has exactly one
task-outcome classifier. The first deliberate brick of the domain layer: classify, don't
mirror. Named in public on the forum thread before it was built; every commit in this
release passed an independent adversarial review before tagging, three rounds, two of
which held the release back.
Added
pve_tasks_listwindowed envelope:{returned, by_outcome, tasks}with the lean
field set (upid/type/id/user/status/starttime/endtime) andfieldsas the
escape hatch (all= raw rows).by_outcomeclassifies each raw row server-side —
running/ok/warnings/failed/unknown— by deterministic string matching
onendtime+ exitstatus text, never inference. Measured through the SDK's own
call_toolon a live node: 6,676 → 5,589 wire tokens for 50 all-OK rows (16%; an
all-OK window is the envelope's most favorable case — failed rows carry their full
error text).- There is deliberately NO
totalin this envelope. PVE truncates to the newest
limittasks before the server sees a row, so a full-history population count does not
exist here — a count that only describes the fetched window must not wear the
population's name. The tool description states this negatively (an all-okby_outcome
is never "no task ever failed") and routes "did anything fail" toerrors=True, which
live-provenly filters PVE's whole task history server-side and includes WARNINGS rows. - Release gate regenerates
lhm.plugin.jsonand fails on drift (before TOOLS.md,
which derives from it): a skipped manual manifest regen could previously let both
surfaces go stale together while the TOOLS.md drift check passed green.
Changed
- One task classifier repo-wide:
pve_diagnose'sfailed_tasksnow uses the same
classify_task_outcomeas the envelope. An error message that merely begins with the
word "WARNINGS" now counts as failed on both surfaces (the exitstatus shape is
WARNINGS: n); a statusless finished row classesunknownrather than failed; a
garbage row fails closed intounknown, never open into a healthy-looking class. statusfilterdescriptions teach the live vocabulary:ok/error/warning
(each live-proven), and state negatively thatby_outcomewords (warnings,
failed) and task-status words (running,stopped) are rejected by PVE with a 400.
The old examples taught two values every call would 400 on.- The health-check runbook prompt uses
pve_tasks_list(errors=True)instead of "flag
any that failed" over a 50-row window.
Fixed
- Three test fixtures modeled finished task rows without
endtime— a shape live PVE
does not produce (live-probed: 0 of 179 errored rows lacked it) — and one modeled
errors=1as a failures-only filter when live PVE includes WARNINGS rows. All are
now live-faithful, and the tasks fixture honorslimit/errors, so truncation can
interact with the counts under test instead of being structurally invisible.