Changelog
0.9.0 (2026-10-02)
Added
Composite pipelines across sweeps, local/HPC workers, and enqueue/dequeue.
Full per-stage run records in directories or the task DB, including upstream references, code provenance, and code-drift detection.
Environment lockfiles in run fingerprints.
Preset tracking and
flexlock runs/flexlock presets.${run:...}references to completed preset runs andkey=@nameconfig swaps.
Fixed
Composite task snapshots retain every executed stage instead of overwriting earlier stage records. Exports include each stage’s inherited code and environment.
Release infrastructure
CI on Python 3.11–3.13, wheel/sdist checks, tag-driven PyPI and conda publishing, and GitHub Pages documentation.
The unreleased 0.8.3 fixes below are included in this release.
0.8.3 (unreleased)
Fixed
Single HPC /
isolated=Trueruns now get a fullrun.lock. They used to keep the submit-time placeholder (config=save_dir+_snapshot_only) because the worker stored the real snapshot only inrun.lock.tasks.db. That broke${run_lock:...}(KeyError), madeflexlock-run -c run.locka silent no-op, showed empty configs inshow/diff/ls, linked no commits ontag, and letgcdelete the upstreams of a tagged run. The worker now writes the full snapshot (config, fingerprint, git state,note) atomically when its task owns the master dir. Sweep roots keep their placeholder.Readers (
${run_lock:...},show/graph/why/report,flexlock-diff,ls/gc/tag,load_stage, lineage,flexlock-run -c run.lock) fall back to the task-DB snapshot for placeholderrun.locks written by older versions.The worker refreshes
run.lock.taskswhen its queue drains, so it is no longer left at[]after await=Falsesubmit.force=Trueon a single HPC / isolated submission deletedrun.completebut ran nothing: the olddonerow in the task DB was kept byINSERT OR IGNORE. The task DB is now reset and the task re-executes. The reset also drops the cached sqlite connection, which kept writing to the deleted DB file.Slurm backend: forkserver compatibility fix.
docs/hpc_integration.md: the task DB lives insidesave_dir, not in its parent. The overview section, clobbered by an earlier edit, is restored.
Added
flexlock.run_record.load_lock_data(run_dir): side-effect-free effectiverun.lock(placeholder → task-DB snapshot).flexlock.run_record.materialize_lock(run_dir): one-off rewrite of a placeholderrun.lock(keepsrun.lock.placeholder.bak).flexlock repair-locks <root> [-n]: runsmaterialize_lockover a results tree.flexlock.taskdb.reset_db(db_path).