Releases: dmmdea/offload-harness
Release list
v0.22.0 — fleet-node server
The harness can now join a Fleet Dispatcher fleet as a first-class node.
fleet-serve— implements the dispatcher's CONTRACT v2 node endpoints: health with live GiB VRAM and measured model footprints, ack-then-poll dispatch (202 + exact echo, idempotent duplicates, failures always non-2xx), and per-job status with ~1h terminal retention. Loopback by default; production binds your tailnet address behind an explicit--listen-trusted-network.- Measured footprints, passively — every image/video/audio/run-graph render records its observed VRAM peak per (model family, quant, task) — via the Windows PDH per-process counter set (the only per-process VRAM source under WDDM; nvidia-smi global-delta as fallback) — so the dispatcher routes on what jobs actually cost on this box, offload strategy included, not on full-residency formulas.
fleet-measureprimes an empty store in one command. - Full task surface — image-gen, video-gen, stt, audio-gen, and run-graph (arbitrary ComfyUI graph + self-provisioned node manifest) over the fleet wire.
- Operator guide —
docs/FLEET-NODE.md, including the recommended MSI Afterburner companion setup for per-process VRAM validation and monitoring.
Live-validated cross-box over a tailnet: dispatch → running → duplicate re-ack (exactly one render) → done with results; measured wan2.2 footprint within 0.3 GiB of the dispatcher contract's own worked example.
v0.21.1 — run-graph, warm batch, inpaint, edit ops
First tagged release since v0.6.2 (closing the stale-release gap — thanks @afelopez for flagging it).
Highlights (0.18 → 0.21.1)
offload_run_graph/run-graph— execute any ComfyUI API-format graph under the GPU-lock/zero-warm lifecycle. Self-provisions a per-workflow node manifest: custom node packs at pinned commits, ONE unifieduvdependency resolve under host-torch constraints (provisioning never replaces your CUDA torch — it defers instead), models downloaded and sha-verified. Node-addressed outputs, typed defers, never cloud.generate-image --batch— N prompts through one warm ComfyUI session: the checkpoint loads once (measured 22.4s warm floor). Zero-warm remains the single-render default; full teardown at the batch boundary.offload_inpaint_image+mask_boxes— SDXL masked re-denoise inpainting with a per-machine dual model binding, plus--auto-textvision-grounded text removal (3/3 grounding eval).- Edit op pack —
grade(compose-once LUT discipline),lut_cube,perspective_composite(pure-Python homography),finish(delivery sharpen),renditionsexport matrix, GIMPinstantiate_designtemplate factory. - Trust-path tests + manifest drift guard — characterization tests for validator/verifier/cache and a
.printing-press.json-vs-registered-tools drift test (community contribution by @afelopez, PR #1).
Full details in CHANGELOG.md. Every feature shipped with live hardware acceptance on 8GB and 16GB boxes.
v0.6.2 — GPU-contention fix: vision calls wait for generation jobs instead of failing
v0.6.2
Fixes the worst production failure mode on single-GPU machines: vision calls (vqa/ocr/assess_image/video_describe) mass-failed with 5xx whenever an image/video generation job occupied the GPU — every failure fell back to your cloud model, burning exactly the tokens this harness exists to save (in one observed incident: 295 defers in a single hour).
- Vision calls now detect the generation GPU lock and wait (bounded, configurable
vision_gpu_wait_sec, default 90s) instead of failing - Distinct defer reason + ledger class
gpu_busyso contention is visible inledgerreports - One automatic retry after 3s on transient 5xx
- New config:
gpu_lock_path,vision_gpu_wait_sec(see regenerated config.example.json)
Upgrade: go install github.com/dmmdea/offload-harness@v0.6.2 or grab the Windows binary below.
v0.6.1 — full cascade, vision/STT/generation tools, self-tuning flywheel, go-install fixed
local-offload v0.6.1
The first public release since the initial drop — this tag brings the public repo up to the current private mainline (everything from the 0.4.x/0.5.x/0.6.0 internal cycles, plus the 2026-07-03 packaging & robustness patch).
Breaking / Upgrade
- Module path fixed. The module is now
github.com/dmmdea/local-offload, matching this repository, sogo installfinally works:If you previously installed under any older module path (go install github.com/dmmdea/local-offload@latest
local-offload-pp-cli,offload-harness), delete the old binary and reinstall with the command above. Import paths in forks must be updated togithub.com/dmmdea/local-offload/.... - Config search order is now:
--config <path>>$LOCAL_OFFLOAD_CONFIG>./config.json>~/.local-offload/config.json> built-in defaults. If you relied on defaults being used despite aconfig.jsonsitting in the working directory, that file is now picked up.
Highlights
- Full self-learning cascade — confidence-gated escalation (logprob class-mass margin + self-reported confidence), per-task conformal thresholds (
calibrate), a logistic entry-tier router (train-router), health monitoring + circuit breakers (EWMA / Page-Hinkley / CUSUM, P95 timeouts), few-shot exemplars (optimize), and a kNN entry-tier prefilter — all trained offline and inference-free over the token ledger. - Shadow-labeling flywheel — optional capture of live calls, counterfactual replay through other tiers to manufacture training labels, and a rigorous adoption gate (paired-bootstrap CI) that only promotes a retrained artifact when it provably lowers error. The long-running MCP server hot-reloads nightly-retrained weights without a restart.
- Vision tools —
vqa,ocr,extract-image,assess-imageon a local VLM tier (grammar-constrained, grounded). - Speech-to-text —
transcribe(whisper.cpp; turbo +--hqhigh-quality model, VAD, SRT output) and video understanding —video-describe(frame sampling). - Local media generation (opt-in, single 8 GB GPU, one cross-process GPU slot): image (SDXL via ComfyUI), voice (Chatterbox TTS, zero-shot cloning), music (ACE-Step), video (Hunyuan 1.5 I2V — wired; quality renders want a bigger card), plus a dependency-free SVG data-viz kit (gauge / comparison-bar / chromatogram / icons).
- Opt-in NVIDIA NIM remote tool (
nim/offload_nim) — reach NVIDIA's hosted free-model catalog or a self-hosted NIM for the rare frontier-model task. Key from$NVIDIA_API_KEYenv only (never a config field), never counted in the savings ledger; the local cascade is untouched. - 15 MCP tools over stdio + the same surface as a single-binary Go CLI.
- Agent runtime library (
internal/agent) — the sandboxed local-agent building blocks (policy cage, write cage, egress control, memory layer) used by the MCP server's agent path.
2026-07-03 packaging & robustness patch (ships in this tag)
- Relative render-script paths resolve against the executable's directory, so generation tools work from any working directory.
- Tilde expansion in all path-typed config fields;
./config.jsonjoined the config search order. - Bad MCP tool arguments surface as a structured defer carrying the argument error (instead of a generic failure).
doctordiffs the live/v1/modelsroster against every configured model alias;modelsoutput is data-driven.- The ledger records each defer reason;
ledgerreports the top defer reasons. - The llama client's request budget is split from tier timeouts, and cold-model-swap timeouts no longer trip the circuit breaker.
- Rune-safe context trimming (no more mid-UTF-8 cut points).
- The savings ledger labels its estimate honestly:
est_value_kept_local.
System requirements
| OS | Linux, macOS, Windows (agent sandbox cages are Linux-only; everything else is cross-platform) |
| Go | 1.26+ (to build) |
| GPU | NVIDIA, ~8 GB VRAM for the text + vision cascade |
| RAM / disk | 32 GB+ system RAM and a fast SSD recommended (model weights, MoE CPU offload) |
| Serving | a local llama.cpp server, ideally behind a model-swapper (llama-swap) on http://127.0.0.1:11436 with the Gemma-4 QAT family (E2B / E4B / 26B-A4B) — skill/scripts/detect.sh checks your box and skill/scripts/setup.sh installs the whole stack (both env-var driven) |
| Optional per feature | ffmpeg on PATH (audio/video), a whisper.cpp server (STT), ComfyUI (image/music/video generation), Node.js (render scripts), $NVIDIA_API_KEY (hosted NIM tool only) |
A defer ({"deferred": true, "reason": ...}) is a normal result, not an error — it means "do this one yourself."