Quick wins + wiring — seven small-but-sharp closures plus a consolidated review-fix pass (0 CRITICAL / 0 HIGH).
What's New
soup env fix— render a reproducible install plan straight fromsoup-env.lock. Emits copy/pasteuv pip installcommands (--format uv-pip, default) or arequirements.txtbody (--format requirements);--outputoptionally writes a cwd-containedrequirements.txt. Non-pip conda/system/wheel entries are surfaced as# <source>: <name>==<version>comments. Print-only by design — it never shells out to a package manager. (#209)soup lock write --env-lock— auto-derive--env-hashfromsoup-env.lock(via the newcompute_env_hash, which excludescreated_atso a re-snapshot of the same env is hash-stable). No more hand-copying a 64-hex string aftersoup env lock; an explicit--env-hashstill wins. (#224)soup serve --record-thumbs <db>— capture 👍/👎 feedback into a local-RL SQLite at startup, plus a newPOST /v1/thumbsendpoint (transformers backend). The start of an on-box feedback flywheel. (#230)- Judge-calibration persistence —
JudgeCalibrationReport.to_dict,write_judge_calibration, andload_judge_calibration, backed by a newjudge_calibrationregistry artifact kind. Loading re-validates the report, so a corrupt on-disk field is rejected. (#214) - Bundled MUSE + WMDP unlearning eval fixtures —
soup eval unlearning --benchmark muse|wmdpnow runs out of the box. WMDP forget-set probes ship redacted (placeholder prompts +REFUSEDresponses) — Soup never bundles verbatim hazardous-knowledge content. (#195) soup completionsnow introspects a cached base model's actual LoRA target modules (config-onlyAutoConfig,local_files_only, never networks or raises), falling back to the canonical default shape when the base isn't cached. (#210)build_dag.validate_build_source— cwd-containment + symlink rejection for build-manifest source paths. (#233)
Install / Upgrade
pip install -U soup-cli # light: CLI + config + data tools (no PyTorch)
pip install -U 'soup-cli[train]' # add the training stack (torch, transformers, peft, trl, …)Security
- WMDP forget-set fixtures ship redacted — no verbatim hazardous-knowledge content in the repo.
load_judge_calibrationroutes throughenforce_under_cwd_and_no_symlinkbefore reading (cwd-containment + symlink rejection, matching every other read path).POST /v1/thumbsuses reject-then-act ordering (auth → 404-state → dict-type → field-types → record);--record-thumbspaths are validated viavalidate_db_path(cwd-containment + symlink) at startup.- The
soup serve --record-thumbsstartup print Rich-escapes the operator-supplied path.
Known Limitations
soup env fixis print-only — it renders an install plan for copy/paste or scripting, not a venv-recreating--fix. Recreating a venv is environment-dependent (venv path, interpreter location, index config), so the operator (or CI) runs the rendered commands. Thename==versionpins assume the PEP 440 versionsimportlib.metadatareported at lock time.soup serve --record-thumbsis wired on the transformers backend only.soup completionsarch introspection requires the base model to be cached locally (config-only, never networks); it falls back to the canonical default LoRA shape otherwise.- MUSE / WMDP fixtures are mini-fixtures — out-of-the-box demos, not the full upstream benchmark corpora.
Full history: CHANGELOG.md.