What's New
Six new top-level commands close axis 1 + 11 of the roadmap: pick the right base, lock the env, refuse OOMs before launch, ship license-clean deploys.
soup tunability— probe-train 8 candidate bases (Qwen3-0.6/1.7B, Llama-3.2-1/3B, Gemma-3-E2B, Phi-4-mini, SmolLM3, Qwen2.5-1.5B) → Pareto frontier over (delta × cost × license). Live LoRA probe deferred to v0.64.1; v0.64.0 ships the schema, Pareto math, and aprobe_fn=injection point.soup plan/soup apply— Terraform-shape lock-and-execute.planwritessoup.tfstatewith the run's config SHA, dataset SHA, estimated cost, ETA, peak VRAM.applyrefuses on drift (exit 3) so you never silently re-spend on a mutated config.soup env lock/status/check— hermetic env lockfile viaimportlib.metadataacross 15 ABI-sensitive packages + Python + CUDA.env checkexits 3 on ABI-sensitive drift.- Hardware-fit calculator — static analytical 5-bucket VRAM predictor with 10% safety margin + actionable hint (
--batch-size halve/--quantization 4bit/--gradient-checkpointing auto). soup completions bash | zsh | fish— sourceable shell completion scripts; recipe names auto-complete from the 115-recipe catalogue.soup license-advisor— per-deploy-target license matrix (b2c / defense / embedded) + Llama community + 700M MAU gate (exit 3). Composes with v0.60adapters mergelicense-conflict gate.
Install / Upgrade
pip install -U soup-cli==0.64.0Security
0 CRITICAL + 6 HIGH + 8 MEDIUM + 4 LOW review fixes landed across a consolidated code+security+TDD review wave:
- HIGH TOCTOU symlink rejection on every new read path (plan YAML / tunability load_report / env read_lock / terraform read_state);
compute_dataset_shacwd-containment + symlink-reject; narrowexcept Exception→(OSError, ValueError)in env probe - MEDIUM strict-JSON config SHA (no
default=strsilent collision); strict-boolapplied;_activation_bytesoverflow clamp at 1e18; PEP 604 →Optional[str]for Typer Py3.9 compat; tight Llama-family allowlist replaces.startswith; Windowsv12.1CUDA path-parse; containment-before-existence ordering (defeats distinguish-attack via exception type) - LOW source-grep regression for
atomic_write_textusage in all 3 writers; MAU upper cap at 1e13;Sequenceimported fromcollections.abcnottyping; end-to-end drift-refusal exit-3 regression test
Full security-fix notes: SECURITY.md.
Known Limitations
- Live LoRA probe deferred to v0.64.1 —
_default_probeis a heuristic stub returning constantdelta=0.0. Operators wanting real Pareto-frontier data today must inject aprobe_fn=...callable. soup applydoes NOT executesoup trainin-process — prints the canonicalsoup train --config <yaml>command for the operator to run (Typer commands aren't safe to re-enter).soup envdoes NOT recreate a venv — schema + drift detection ship now; the--fixaction lands in v0.64.1.- Hardware-fit calculator is analytical only; composes with v0.40.3 live CUDA probe but does NOT replace it.
complete_target_modulesreturns canonical Llama-shape defaults regardless ofbase— live HF-config introspection is v0.64.1.- Deploy targets are a 3-entry allowlist (b2c / defense / embedded); more targets tracked as v0.64.x follow-up if operator demand emerges.
compute_dataset_shareturns zero-hash for outside-cwd paths rather than raising — design choice sosoup planruns before the dataset exists.
Tests: 10035 → 10306 (+271 net in 7 new test files).