v2026.8.8
Pre-releaseLungfish 2026.8.8
Channel: Preview
Previous versioned release: v2026.8.7
Stable baseline: v2026.8.7
Dependency set: 2026.2
Preview builds are under rapid iterative development. Features may be incomplete, change quickly, or require additional feedback.
Lungfish 2026.8.8 is a preview focused on three things a large Kraken2 batch
exposed this week: projects that grew by tens of gigabytes, BAM viewports that
hid reads and differences until you zoomed, and a memory blow-up that could
take the whole machine down while an import and a classification ran side by
side. The dependency set is unchanged at 2026.2.
Changes since 2026.8.7
Kraken2 results no longer duplicate your imports
A 55-sample Kraken2 run was copying every input FASTQ into
.lungfish-provenance/intermediates/classification-inputs/ inside the
analysis, adding 18.7 GB of byte-identical files to a project whose imports
already held the same data. The pipeline now references durable inputs in
place and only copies genuinely transient inputs (virtual subset, trim, and
demux bundles materialized into the project's scratch folder). Existing
analyses are left untouched because their recorded replay commands point at
the copies; you can delete those classification-inputs folders by hand once
you are satisfied.
Provenance for classification runs is also correct now:
- The raw
classification.krakenfile, which the pipeline compresses and
deletes, is no longer advertised as a run output. Step history still records
what each tool actually wrote at the time. - Bracken's re-estimated report is written to an explicit path
(classification.bracken.kreport) and declared; older auto-named
classification_bracken_species.kreportfiles are still read. - A sample whose Bracken profile degrades because the Kraken report has no
rows at the requested rank (the normal case for negative controls) is a
completed run with a warning, not a failure, and a batch with two degraded
controls and 53 good samples is no longer marked failed in its provenance.
Kraken2 viewport
- The taxon search field is back. Typing filters the tree to matching taxa
plus their ancestors and whole clades, composes with the column header
filters, and dims the sunburst to match. - When Bracken ran, a Bracken column shows its re-estimated read counts
next to the raw Kraken2 counts; it stays hidden for Kraken2-only results. - BLAST Verify on a multi-sample batch now verifies reads from the sample
that owns the selected taxon. Previously it looked in the first selected
sample and failed with "No sequences provided for BLAST verification". - Extract FASTQ writes its bundle to a top-level
Extractions/folder,
kept apart fromImports/, and FASTA-format extractions produce a bundle the
sidebar can open. A failed extraction no longer leaves a half-written bundle
behind, and samples skipped for missing inputs are reported instead of
silently dropped.
BAM viewers
- Alignment views (classifier evidence, mapping results, any bundle with
reads) open showing the whole contig, so reads mapped anywhere on the
reference are visible before you zoom in. - Differences from the reference are drawn at every zoom level that shows
individual reads, including classifier BAMs loaded without a reference
sequence; mismatch ticks now come from the aligner's MD tag when no
reference is available. - High-depth samples render smoothly. The read layout is packed once and
reused while panning, only the rows and reads inside the viewport are drawn,
and per-read mismatch positions are computed once when reads are loaded.
Stability
- Importing FASTQ files no longer lets the app's memory grow with the size of
the file. The gzip line reader and FASTQ record reader were producer tasks
feeding unbounded buffers, so a fast decompressor and a slower consumer
(read-length statistics) could buffer the whole decompressed file; both now
parse on demand. - The Java heap for bundled BBTools steps is sized so an import can run next
to a Kraken2 classification: about a third of physical memory, further
capped by what is actually free, instead of 60 to 80 percent of RAM. - Project folder watching is volume-aware. On exFAT, FAT, and network volumes
the app subscribes to directory-level file-system events with a longer
latency, handles events off the main thread, and collapses bursts of
thousands of changes into one refresh, so a running classification cannot
make the window unresponsive. - The managed micromamba bootstrap never replaces a working installed binary
with a bundled one that cannot run, compares versions by release rather than
build suffix, and restores the previous binary if a fresh copy fails. Its
error messages now state the command, exit status or signal, and a
code-signature hint instead of "Failed to install package: ".
Release and maintenance
- Debug test builds (
scripts/build-app.sh --debug) re-sign every bundled
tool after path sanitizing and refuse to finish unless the bundled micromamba
runs; the shared release skill documents how debug builds are produced and
that they are never signed, notarized, or uploaded. - Source-text test assertions across the app were converted to behavioral
ViewInspector and AppKit tests, and the attended XCUI diagnostic tier was
repaired and certified green.
Verification
- Unit tier gate: PASS at the release commit (541 tests; two load-sensitive
classes passed via the gate's isolated serial retry). - Integration tier gate and dependency sweep tiers 1 through 3: see the
release report for the PASS lines recorded at the release commit. - Focused release tests (CLI version, help text, managed tool lock, release
build configuration, app version) green.
Dependency versions
The following tables reproduce every current version identity in the bundled
dependency manifest and Package.resolved. Conda identities include their
exact channel, package version, and build string.
Core managed tools
| Manifest id | Exact package identity |
|---|---|
nextflow |
bioconda::nextflow=26.04.6=h2a3209d_1 |
snakemake |
bioconda::snakemake=9.25.2=hdfd78af_0 |
bbtools |
bioconda::bbmap=40.02=he046917_0 |
fastp |
bioconda::fastp=1.3.6=ha1d0559_0 |
deacon |
bioconda::deacon=0.16.0=h314a369_0 |
samtools |
bioconda::samtools=1.24=h36b3a25_1 |
bcftools |
bioconda::bcftools=1.24=h6bd33b9_2 |
htslib |
bioconda::htslib=1.24=hd3c6ec9_0 |
seqkit |
bioconda::seqkit=2.13.0=hd5f1084_0 |
cutadapt |
bioconda::cutadapt=5.2=py313hf513372_2 |
trim_galore |
bioconda::trim-galore=2.3.0=h48b4a6d_0 |
vsearch |
bioconda::vsearch=2.31.0=h0448ff9_0 |
pigz |
conda-forge::pigz=2.8=hfab5511_2 |
sra-tools |
bioconda::sra-tools=3.4.1=h4675bf2_1 |
ucsc-bedgraphtobigwig |
bioconda::ucsc-bedgraphtobigwig=482=h1643cc5_0 |
pysam |
bioconda::pysam=0.24.0=py310hf7cbfa5_1 |
openpyxl |
conda-forge::openpyxl=3.1.5=py312h2a925e6_3 |
Plugin-pack tools
| Pack | Manifest id | Exact package identity |
|---|---|---|
| Read Mapping | minimap2 |
bioconda::minimap2=2.31=h6bd33b9_0 |
| Read Mapping | bwa-mem2 |
bioconda::bwa-mem2=2.3=hda5e58c_0 |
| Read Mapping | bowtie2 |
bioconda::bowtie2=2.5.5=h9e91881_0 |
| Full-Length MHC Genotyping | savont |
bioconda::savont=0.6.3=ha819e4a_0 |
| Full-Length MHC Genotyping | blast |
bioconda::blast=2.16.0=hb260f6e_5 |
| Variant Calling | lofreq |
bioconda::lofreq=2.1.5=py310h9cf5bfa_16 |
| Variant Calling | ivar |
bioconda::ivar=1.4.4=hda5e58c_0 |
| Variant Calling | medaka |
bioconda::medaka=2.2.2=py312h3bb865a_0 |
| Variant Calling | clair3 |
bioconda::clair3=2.0.2=py311h9aa1f4a_0 |
| GATK Core | gatk4 |
bioconda::gatk4=4.6.2.0=py310hdfd78af_1 |
| Phasing | whatshap |
bioconda::whatshap=2.3=py311h1457a19_3 |
| Assembly | spades |
bioconda::spades=4.3.0=hd468e49_1 |
| Assembly | megahit |
bioconda::megahit=1.2.9=h96a01ab_8 |
| Assembly | skesa |
bioconda::skesa=2.5.1=hda5e58c_3 |
| Assembly | flye |
bioconda::flye=2.9.6=py310hba4535a_1 |
| Assembly | hifiasm |
bioconda::hifiasm=0.25.0=h697fd72_0 |
| Multiple Sequence Alignment | mafft |
conda-forge::mafft=7.526=h99b78c6_0 |
| Phylogenetics | iqtree |
bioconda::iqtree=3.1.3=h6cc7423_0 |
| Metagenomics | kraken2 |
bioconda::kraken2=2.17.1=pl5321h158e17b_0 |
| Metagenomics | bracken |
compatibility pin bioconda::bracken=1.0.0=1; fresh installs use source overlay 3.1 with Python 3.11.13, cxx-compiler 1.9.0, and llvm-openmp 21.1.8 |
| Metagenomics | esviritu |
bioconda::esviritu=1.3.3=pyhdfd78af_0 |
| Metagenomics | ribodetector |
bioconda::ribodetector=0.3.3=pyhdfd78af_0 |
| Wastewater Surveillance | freyja |
bioconda::freyja=2.0.3=pyhdfd78af_0 |
Pipelines
| Manifest id | Release | Immutable revision |
|---|---|---|
taxtriage |
v3.3.8 |
e10bfebda32a62711f38a4e23ab03b61725a9675 |
nf-core-viralrecon |
3.0.0 |
3.0.0 |
Databases and managed data
| Manifest id | Current identity |
|---|---|
kraken2-standard |
20260626 |
kraken2-standard-8 |
20260626 |
kraken2-standard-16 |
20260626 |
kraken2-pluspf |
20260626 |
kraken2-pluspf-8 |
20260626 |
kraken2-pluspf-16 |
20260626 |
kraken2-viral |
20260626 |
kraken2-minus-b |
20260626 |
kraken2-eupathdb46 |
20230407 |
esviritu-viral-v3 |
v3.2.4 |
ncbi-taxonomy |
2025-03 |
kraken2-special-silva |
kraken2-special-v1 |
kraken2-special-greengenes |
kraken2-special-v1 |
human-scrubber |
20260706v2 |
deacon-panhuman |
panhuman-1 |
deacon-ribokmers |
bbmap-ribokmers-k31w15 |
The bootstrap identity is micromamba 2.9.0-0; its Apple Silicon payload is
checksum-verified before use.
SwiftPM resolved packages
| Package identity | Version | Revision |
|---|---|---|
async-http-client |
1.36.0 |
9544287b9416c0bc71e58b9f3aead8dd14b16103 |
containerization |
0.24.5 |
c3fe889a2f739ee4a9b0faccedd9f36f3862dc29 |
grpc-swift |
1.27.5 |
6a8927df5a91710b414caba4f8a088dead4633db |
sparkle |
2.9.6 |
ac2def288cbff5cfc7df3ffef6abdf45b72bcb0a |
swift-algorithms |
1.2.1 |
87e50f483c54e6efd60e885f7f5aa946cee68023 |
swift-argument-parser |
1.8.2 |
6a52f3251125d74daf04fcbd5e6f08a75d074382 |
swift-asn1 |
1.7.1 |
a9a5efd40eaf558a2bcd48d64b1d1646be686008 |
swift-async-algorithms |
1.1.5 |
3da39bbc4e687d4192af7c9cf4eab805745a0b9c |
swift-atomics |
1.3.1 |
0442cb5a3f98ab802acb777929fdb446bda11a34 |
swift-certificates |
1.19.4 |
449dbbecd0f31e82b510ada227ca152caa8b5e98 |
swift-collections |
1.6.0 |
a0cb0954ecb21e4e31b0070e6ed5674e8556685a |
swift-configuration |
1.2.0 |
be76c4ad929eb6c4bcaf3351799f2adf9e6848a9 |
swift-crypto |
3.15.1 |
95ba0316a9b733e92bb6b071255ff46263bbe7dc |
swift-distributed-tracing |
1.4.1 |
dc4030184203ffafbb2ec614352487235d747fe0 |
swift-http-structured-headers |
1.7.0 |
933538faa42c432d385f02e07df0ace7c5ecfc47 |
swift-http-types |
1.6.0 |
db774a277f60063a32d854f2980299caf06da041 |
swift-log |
1.15.0 |
3ffafb9722d5d918c614feb496c8789a3b59d222 |
swift-nio |
2.101.3 |
0b18836bd8b0162e7e17a995a3fbee20ed8f3b2b |
swift-nio-extras |
1.34.3 |
88a51340f59cf181ebde888bd1b749296b3ec029 |
swift-nio-http2 |
1.45.0 |
45bdf670248be5f16ec0340e125dca285536f0fb |
swift-nio-ssl |
2.37.2 |
d930168b86f46ca51a4bc09c5ca45c1833db8067 |
swift-nio-transport-services |
1.28.0 |
67787bb645a5e67d2edcdfbe48a216cc549222d5 |
swift-numerics |
1.1.1 |
0c0290ff6b24942dadb83a929ffaaa1481df04a2 |
swift-protobuf |
1.35.0 |
9bbb079b69af9d66470ced85461bf13bb40becac |
swift-service-context |
1.3.0 |
d0997351b0c7779017f88e7a93bc30a1878d7f29 |
swift-service-lifecycle |
2.12.0 |
7f9326b0326ff86e3646295ea6e891f68c471c5e |
swift-system |
1.8.1 |
869129b7bf4ecc57b97d0193ad29690ca2134750 |
zstd |
1.5.7 |
f8745da6ff1ad1e7bab384bd1f9d742439278e99 |
viewinspector |
0.10.3 |
e9a06346499a3a889165647e3f23f8a7b2609a1c |
Known issues and compatibility notes
- Preview and Stable cannot be installed side by side; install the desired
channel's DMG to switch the one shared application installation. - The 20260626 Kraken2 indexes display species-level taxid 3418604 as
Betacoronavirus pandemicum. Classification identifiers are unchanged, but
searches or notes relying on the former SARS-CoV-2 display name should be
checked. - The Apple Silicon bioconda Bracken compatibility package has no real driver
and does not support domain-level profiling through its synthesized
launcher. Fresh installs receive the managed Bracken 3.1 source build;
existing working environments are preserved. bioconda::bwa-mem2=2.3=hda5e58c_0self-reports 2.2.1 because of an upstream
packaging defect. Lungfish verifies that pin from conda package metadata.