Generated from
CHANGELOG.md 15 min read View source
On this page7
Changelog
User-visible changes to nf-claw, newest first, by pull request. Each release is a tag vX.Y.Z on
main with release notes.
Pipeline releases the maintenance workflows pin, bump or add are recorded in sources.tsv, the
generated skill.md files and the git history, not here. Audit records, with the evidence behind
each change, are in docs/audit/.
Unreleased
Changed
- The documentation is rewritten in plain language. The README,
AGENTS.md,CONTRIBUTING.md,llms.txt, the website README and the guides indocs/lose promotional wording, title-case labels, box diagrams and repetition; every fact, command and limit is kept. The README's quickstart links toAGENTS.mdinstead of repeating it, and its workflow diagram is now a table of each workflow's real triggers. On the website, "Pipeline universe" is now "Pipelines by domain" (#265).
[1.0.0] — 2026-11-08
The first release: the runner and the 95 pipeline pins at tag v1.0.0. Its
release notes describe the library as a
whole; the entries below are what changed after those notes were first drafted, on 2026-10-22.
Added
nfclaw status --jsonandnfclaw chain status --jsonprint one machine-readable object (state, outcome, times, pids, logs, caveats, recorded error, last output, and the human report) with the same exit codes; the MCPrun_statustool returns it asrun(#227).docs/replay.md: what a provenance bundle carries, the replay guard, dependency stability, resume of changed local inputs, and whatnfclaw verifyandnfclaw assessestablish (#227).- The website's search palette finds documentation sections by their headings, not only documents by title, and opens the page at the section; below the widest layout, a document opens with a folded table of contents (#227).
nfclaw --version,nfclaw list <keywords>, run manifests that record which nfclaw ran them, and a security policy (SECURITY.md) (#218).- An accessibility check of every website page in the browser tests (#219).
- MCP
read_doc(guide, search): an nf-claw guide, or only its sections that hold every word searched. Agents checking a warning againstknown-issues(about 120 KB) get its section (under 1 KB); the server's instructions now say so (#234). nfclaw jobs list,nfclaw jobs statusandnfclaw jobs cancelmanage MCP's persisted jobs from a shell, with shared reports, bounded output tails and versioned--jsonresponses (#238).
Changed
- The documentation was checked against the code and reorganized for release: the README leads with
what nf-claw does and groups its guides by purpose,
docs/known-issues.mdanddocs/mcp.mdare arranged by topic,docs/audit/has an index, and contributors have documentation conventions. Corrected: the verdict an unexpected preview timeout gets, releases still called pinned after a bump, the validation dates, and the generation matrix's evidence for five bumped pins. Tests now check every relative link and anchor, the guide listings and the MCP tool table (#258). AGENTS.md, which every agent session loads, is half its size (45 KB → 24 KB): it keeps every operating instruction and links the guarantees behind them to focused guides (#227).- Inputs and outputs are hashed several files at once (up to eight threads): one core hashed 314 MB/s on the validation server, eight threads 7.7× faster on cached data (#227).
nfclaw runandnfclaw chain runrefuse a Python without POSIX file locks (native Windows) instead of running without their writer locks; use WSL 2 there (#227).- Both maintenance bots hand their frozen candidate to one shared gate and publisher
(
maintenance-gate.yml) instead of repeating its jobs (#235). - Generated parameter tables write patterns, defaults and allowed values as code spans, so they render as the values nf-schema enforces (#219).
- Each CI test lane runs the complete suite on all of its runner's cores (
pytest -n auto --dist worksteal, pytest-xdist in thedevextra) and still reports every case; the suite ran one test at a time for 16–34 minutes a lane. On the validation server, four workers took 9 minutes instead of 29 (#234). - A new push to a pull request cancels that pull request's previous, now superseded CI run; it had stayed queued for hours behind the macOS runners. Runs for main, schedules, dispatches and the maintenance gate are never cancelled (#234).
- The smoke workflow checks each pin's demo on the engine its
skill.mdadvises, which now also has that engine parse the configuration, and reports beside it — without failing — which pins the launcher's default Nextflow refuses when no--nxf-veris given (#248).
Fixed
- A built wheel lists
runner.output_contractsas a package, so it keeps the two output contracts without relying on a setuptools fallback that warned they "would be ignored" (#260). - A failed run's error, and
nfclaw status, quote an exception Nextflow printed withoutERROR ~(hgtseq 1.1.0's intermittentCannot invoke "java.util.Map.get(Object)" because "self" is null); they used to quote only nf-core'sPipeline completed with errorsbanner below it. (#259) --resumeafter a nfclaw that vanished (SIGKILL, out of memory, a host restart) or could not write its bundle (a full disk) reuses the finished tasks. A launch now records what it consumes before Nextflow starts; it used to recompute every task, whilenfclaw statusand the full-disk error promised otherwise. A killed replay is no longer told to--resume. (#257)- A documented
--outdir resultsrun leaves the checkout clean: its writer lock, replay and the previous run--resumepreserves are ignored by Git. (#257) --check, or a run, with a large existing directory as--outdirno longer walks all of it looking for links into the inputs (--outdir /never finished): a run refuses a non-empty directory without--resumeanyway. (#257)--checknames a profile the release does not define, instead of suggesting another engine. (#257)- A run whose task records are gone, because a config set
cleanup = true, now warns that no container was identified or pinned for its replay, instead of recording no gap. (#257) --checkon a host that cannot fetch a release's remote configuration says so and names the network remedies, instead of suggesting another engine and parser. (#257)- A Fast5 directory in a bacass 2.7.0 samplesheet is part of the run's input identity again: the bump had changed the schema its audited roles are keyed by. (#257)
python3 -m runneron a Python older than 3.11 names the Python it needs instead of anImportError; a~naming no user, or a report a terminal's encoding cannot show, is no traceback. (#257)provenance:warnings about gaps in a run's recorded environment reached only stderr, which a background run usually loses. They are now also in the run log, andnfclaw statuslists them underprovenance gaps(provenance_gapswith--json), andnfclaw chain statusbeside each stage. A task that ran with no container now counts as such a gap. (#257)- A stop while the container engine is still creating a task container removes it once it appears, instead of leaving it behind, never started. nfclaw waits up to 30 s; one that takes longer is named on stderr and in the run log, with how to find and remove it. The group is looked through throughout the stop, so a client that started as the stop began is covered too. A container its task wrapper is already removing is no longer reported as one that could not be removed. (#257)
- Python bytecode caches that tasks write into the pipeline source (
bin/__pycache__in circdna, reportho and viralmetagenome) no longer fail a successful run or its archived replay as a source change, and symlink modes are recorded portably so a macOS bundle replays from its archive on Linux. A previous run whose live Nextflow, nfclaw or replay process cannot be identified is no longer moved aside by--resume. A slow process inventory no longer stops a foreground MCP command; foreground output redacts inheritedNXF_*secrets as job views do (#252). - A stop that arrives while a metadata probe is being launched no longer leaves its helpers running: the probe's process group is cleaned up however early the signal lands (#256).
- New ordinary runs authenticate source permissions, links, empty directories and untracked/ignored source files as well as bytes. Source archives preserve that identity. Resume preserves the old run and recomputes when complete source identity changed or was never recorded; unchanged source keeps normal cache reuse. Legacy bundles retain their original evidence scope (#249).
- Redact sensitive environment values from shell/MCP job reports and keep execution records private. Stop foreground MCP descendants on timeout or cancellation; recover and safely cancel commands that survive a killed job supervisor. Reserve MCP control workers and bound slow-work admission. Offline release listings retain and label the committed pipeline pin (#249).
- Apply supported scalar, required-field, relationship and uniqueness checks to flat JSON/YAML samplesheets as well as CSV/TSV. Report unreadable process identities as unknown, and unreadable task-container inventories as unconfirmed cleanup (#249).
- Distinguish macOS zombie-only process groups from genuine signal permission failures during replay and metadata cleanup; retain failure when live members or unreadable inventory remain (#249).
- Foreground MCP work reports unconfirmed cleanup if process inspection becomes unreadable after launch or an authenticated descendant survives; a successful command cannot hide that outcome (#249).
- Resolve verified current-product audit findings in process cancellation, completion caveats, environment attribution/deadlines, scientific validity/reference handoffs, private frozen-stage identity, website navigation/guidance/static counts, manifest parsing and MCP/job error handling (#247). Evidence and limitations: follow-through audit.
- A run whose pinned release Nextflow 26.04+'s strict parser rejects (methylseq 4.2.0, atacseq 2.1.2,
viralrecon 3.0.0 among the pins) fails with the fix that works — the legacy parser,
--nxf-env NXF_SYNTAX_PARSER=v1, or--nxf-ver 25.10.4— instead of "re-run the same command with --resume", which cannot get past a configuration that does not compile;nfclaw chain runnames the legacy parser too (#246). nfclaw run --check(and MCPrun_pipeline(check=true)) asks the run's engine to parse the release's configuration, asnfclaw chain run --checkalready did for each stage: a pin the engine rejects is refused with its remedy before anything launches, instead of passing the check and failing at launch; itspreflightlines reportprofile_configas checked (#248).- Samplesheet
integerandnumbercells written with digit separators (1_000) are refused before launch: the check accepted them, and nf-schema's Groovy casts then rejected the sheet at launch (#248). nfclaw chain statusreports a chain still running on another host as unknown here, naming that host, asnfclaw statusdoes for a run, instead ofrunningwith exit status 1 (#248).- A run closes the container-events pipe it follows, a replay its console pipe, and
nfclaw assessits record database; Python reported each as an unclosed resource (#248). - The website renders a link in a parameter description (upstream schema text) only to a relative, web or mail target; any other scheme is shown as its label (#248).
- The website's search palette finds a long heading by words near its end (
major version 61finds its Java 17 known issue); such a match ranked below zero and was dropped (#248). - The website words a workflow schedule only when it can word it correctly (a step, range or list is shown as written), groups the release timeline by UTC month as it labels it, and steps back to the last pipeline in the constellation from no selection (#248).
- The package metadata declares its MIT licence and ships
LICENSEandNOTICE; building it needs setuptools 77 or newer (#248). --limit-memoryand--limit-time(and a chain'slimits) accept only spellings Nextflow parses.1.5.TB,100.B,15.gb,5.secs,5.minsor1.Hpassed the check and the run then died at its first task (Caused by: multiple points), in a chain after every earlier stage had run (#246).- A job refused before launch into a fresh
--outdir(an invalid parameter, a missing samplesheet) no longer reports "could not freeze this job's run status: FileNotFoundError" beside the real refusal inget_jobandnfclaw jobs status;nfclaw jobs statusnames shell commands (nfclaw status <outdir>,--resume) instead of MCP tools and fields (#246). show_pipeline(grep=…)reads a#comment inside a code block as code: everyskill.md's# raw equivalent …line can be found, and no longer relabels the lines after it (#246).- Release tags are read whole from
git ls-remotebynfclaw versions,--pipeline-versionand the update bot: a tag such asrelease/9.9.9is no longer mistaken for the release9.9.9(#246). - Job records live in one absolute place: a relative
XDG_STATE_HOMEis ignored, as the XDG specification requires, and a relativeNFCLAW_STATE_DIRis resolved where it is read (#246). docs/replay.mdstates the replay host's real requirement, Python 3.9 or newer aspython3; a test keeps the bundled scripts within it (#246).- A
--resumethat preserves the previous run in a sibling archive no longer leaves the new run directory private to the user who resumed it (0700): it keeps the permissions of the run it replaces (#235). - Provenance bundle files are created like the rest of a run's files (
0666less the umask) instead of0600, so the group a run's results are shared with can verify and replay it (#235). - MCP refuses a tool or prompt call whose
argumentsis given but is not an object (null,false, a list) instead of running it without arguments, answers a request id that JSON-RPC does not allow (a boolean, an object,NaN) with an error, and no longer queues apingbehind long-running tool calls (#237). nfclaw verifyand a replay's own environment check report an empty, damaged or incomplete environment record asunverifiedinstead ofidentical, and compare image identities in both directions, so two names for one recorded image cannot hide a different image in the replay. A bundle from before environment records is still compared by its files. Reproductions and limits: the boundary-integrity audit (#237).- A chain spec's
configentries must be non-empty paths, and anullnxf_envkeeps the default, as anullnxf_ver,limitsorconfigalready did (#237). - A stopped run (Ctrl-C,
kill,--timeout, MCPcancel_job) and a stopped replay remove the Docker/Podman task containers their processes started. Task wrappers killed whiledocker stopwaited on a container's PID 1 had left every container behind, exited, and with a shorter shutdown grace still running (#227). nfclaw verifyno longer fails every replay of a resumed run: the run metadata that a stopped or failed earlier attempt left in the original'spipeline_info/is listed asearlier attemptsinstead of as missing results (#227).nfclaw verifypairs the random nameskraken2-buildgives library files when they contain_(createtaxdb's Kraken2 and Bracken databases): such a replay had been reported as missing them (#226).- The createtaxdb, bamtofastq and funcscan demos stage their sample sheets from immutable
test-datasets commits, recorded in provenance, instead of the moving branches their test profiles
validate, so
nfclaw verify --require-environmentaccepts their replays (#226). - On the website, a tap on the menu or on Search right after a page loaded was undone or reached no listener, and did nothing (#221).
- Handoffs no longer drop samples silently (bamtofastq → rnaseq single-end files, detaxizer → mag single-end sheets), and resuming a chain stage keeps its unchanged handoff and Nextflow cache (#218, #219).
- The daily pipeline update gives each changed pipeline's bundled analysis 90 minutes instead of
30. ampliseq 3.1.0's test, still running at 30 minutes, had failed the update since
2026-10-29 and held back every other release with it (variantbenchmarking 1.6.0). A release
that cannot pass the gate can be set to the
holdpolicy insources.tsvso that the others publish (maintenance.md) (#228). - The acceptance gate and the maintenance publisher run their Python helpers on
$PYTHON(defaultpython3, as in the Makefile) and refuse an interpreter older than 3.11 with a message naming it. On macOS, whosepython3is 3.9, every preview had failed with anImportErrorreported as a rejected pipeline. Without GNUtimeoutorgtimeout, the gate bounds each preview with the bundledscripts/run_with_timeout.pyinstead of refusing to run (#233). - A params file path given to
parameters.mergethat does not exist is an error, not an empty set of parameters (nfclaw runalready refused it) (#233). nfclaw mcpanswers a message nested too deeply to parse instead of stopping (#219).nfclaw chain edges <name>refuses a pipeline the library lacks (exit 1) instead of printing nothing, which read as "no handoff exists"; for a pipeline without rules it says so (#234).nfclaw chain status --jsongives a missing chain the same keys as a found one, witherrora list as innfclaw status --json(#234).- On Linux, Nextflow is launched without Python code between fork and exec (
preexec_fn), which can deadlock a parent running threads, as nfclaw's container watch does: a single-threaded launcher requests the parent-death signal and execs Nextflow in place (#234). - Stopping a run or replay whose process group has already ended no longer searches or signals that group's number, which another process group may hold by then (#234).
CITATION.cffno longer gives 1.0.0 a release date (2026-06-15) that no release had (#234).- Robustness of
nfclaw statuswith unreadable logs and damaged records, the job supervisor and the container watcher (#218). - A replay runs with the Nextflow settings its run recorded:
NXF_*variables that the replaying shell sets but the run did not see are removed, and a recorded secret, kept only as<redacted>, must be exported again. A bundle with an incomplete pipeline identity or checksum record is refused (#229). --pipeline-versionno longer deletes a partly materialized checkout underpipelines/<name>/.versions/to start again: it may hold local work, so nfclaw refuses and names the directory to move aside (#229).- A run refused before launch redacts secret
NXF_*values from the command and error it prints and logs (#229). - A chain spec whose
nxf_env,nxf_verorlimitsvalue has the wrong type (a number for a memory value, a list for an object) is refused with an error that names the field (#229). nfclaw statusfinds the latest attempt in a run log from an index the log's writer keeps (in older logs, by searching backward from the end) instead of reading the whole log (#229).- The pipeline updater takes the lock runs take to fetch or initialize a pipeline and, when an update fails or is interrupted, restores only the checkout, pin and generated files it changed; the drift check refuses a pin whose source or checkout does not match its record (#229).
- On the website, arrow keys in the skills list move from the row that has focus, not from the selected one (#229).
Earlier pull requests, in brief
- #217 Post-merge fixes: palette race, kraken2 verify pairing, sarek 3.11.0 re-audit, docker probe limit.
- #216 Audit remediation: verified defect fixes, scientific output contracts (
nfclaw assess),verify --require-environment, structured MCP parameters,replay_runandread_artifact, gated maintenance publication. - #215 Stop repeating checks that Nextflow and nf-core already make.
- #213 fastqrepair: run the recorded corrections under the legacy config parser.
- #212 Remove duplicated files, code and documentation.
- #209, #211 MCP verified end to end in Claude Code, Codex and Antigravity; Antigravity loads every tool up front.
- #205 Report runs stubbed by a
--config; stub-run seqsubmit's test without ENA. - #203 Review of the whole codebase: three bug fixes, dead code removed, 100-column lint.
- #202 Next.js 15.5.28 for the website (GHSA-2464-fhr4-w9xw, GHSA-p3m5-59mp-jv5r).
- #200, #206, #207 Maintenance publication without organization PR permissions.
- #195 Name the release a failed chain stage ran; correct engine and network notes.
- Pipelines added or validated since: bacmodel, plasmodiumdrugres, provenancereport, stableexpression, magmap 1.3.1, rnasplice 2.0.0, rnastructurome 1.1.0, genomeassembler 2.0.1 (#197, #198, #204, #208, #214).