Skip to content

chore: release v0.8.0 - #868

Open
nh13 wants to merge 1 commit into
mainfrom
release-plz-2026-08-26T18-45-36Z
Open

nh13 wants to merge 1 commit into
mainfrom
release-plz-2026-08-26T18-45-36Z

Conversation

@nh13

@nh13 nh13 commented Aug 26, 2026 •

Copy link
Copy Markdown
Member

🤖 New release

  • fgumi-bgzf: 0.7.0 -> 0.8.0
  • fgumi-dna: 0.7.0 -> 0.8.0
  • fgumi-tag: 0.7.0 -> 0.8.0
  • fgumi-raw-bam: 0.7.0 -> 0.8.0
  • fgumi-bam-io: 0.7.0 -> 0.8.0
  • fgumi-cli-macros: 0.7.0 -> 0.8.0
  • fgumi-metrics: 0.7.0 -> 0.8.0
  • fgumi-sam: 0.7.0 -> 0.8.0
  • fgumi-consensus: 0.7.0 -> 0.8.0
  • fgumi-pipeline-core: 0.7.0 -> 0.8.0
  • fgumi-sort: 0.7.0 -> 0.8.0
  • fgumi-pipeline-io: 0.7.0 -> 0.8.0
  • fgumi-simd-fastq: 0.7.0 -> 0.8.0
  • fgumi-umi: 0.7.0 -> 0.8.0
  • fgumi: 0.7.0 -> 0.8.0
  • fgumi-fmt: 0.7.0 -> 0.8.0
  • fgumi-cli-common: 0.7.0 -> 0.8.0
Changelog

fgumi-bgzf

[0.8.0] - 2026-10-06

Features

  • Typed-step pipeline foundation (#870)
  • Add --check-crc / --no-check-crc with the file-vs-stdin default (#933)

Refactor

  • [breaking] Remove the legacy unified_pipeline engine (#947)

fgumi-dna

[0.8.0] - 2026-10-06

Performance

  • Use fixed-seed ahash on hot per-item maps to remove RandomState global-counter contention (#865)

fgumi-tag

[0.8.0] - 2026-10-06

Bug Fixes

  • [breaking] Give each methylation consensus caller one SEQ convention and make filters, simulate and docs follow it (#1010)
    • methylation::query_to_ref_positions takes the CIGAR as aligned (with its clips) and no longer takes the simplified CIGAR. * fix(consensus)!: emit observed bases from simplex methylation consensus Simplex EM-seq/TAPs consensus rewrote converted bases in the source reads (T->C / A->G at reference cytosines) before calling, so the emitted SEQ reported every site as unconverted. SEQ-based methylation callers and bisulfite-aware aligners read methylation from SEQ and saw every cytosine as methylated. The rewrite also hid real disagreements: all reads of a single-strand family copy one converted strand, so a C/T split is an error (or a UMI collision) and must lower quality like any other. Consensus is now always called on the observed bases, and simplex emits them as they are, with the evidence in cu/ct. MM/ML are no longer emitted for simplex: MM can only describe bases present in SEQ, and a converted cytosine is not one. A simplex consensus also cannot tell a converted cytosine from a C>T mutation, so restoring it would assert a base the molecule may not have. The shared MM builder now writes the SAM-spec '?' flag (unlisted bases are unknown), takes the conversion pattern from the read type (R1 C->T, R2 G->A) instead of the alignment strand, encodes each ML probability p as floor(256 p) capped at 255 (the SAM spec's [N/256, (N+1)/256) bins; it used floor(255 p), which put 1/2 and 3/4 in the bin below), and MN is available as a tag constant.
  • Never auto-clip RG, MI and other non-per-base tags (#1019)

fgumi-raw-bam

[0.8.0] - 2026-10-06

Bug Fixes

  • Replace deprecated wide swizzle_relaxed with shuffle (#992)
  • [breaking] Give each methylation consensus caller one SEQ convention and make filters, simulate and docs follow it (#1010)
    • methylation::query_to_ref_positions takes the CIGAR as aligned (with its clips) and no longer takes the simplified CIGAR. * fix(consensus)!: emit observed bases from simplex methylation consensus Simplex EM-seq/TAPs consensus rewrote converted bases in the source reads (T->C / A->G at reference cytosines) before calling, so the emitted SEQ reported every site as unconverted. SEQ-based methylation callers and bisulfite-aware aligners read methylation from SEQ and saw every cytosine as methylated. The rewrite also hid real disagreements: all reads of a single-strand family copy one converted strand, so a C/T split is an error (or a UMI collision) and must lower quality like any other. Consensus is now always called on the observed bases, and simplex emits them as they are, with the evidence in cu/ct. MM/ML are no longer emitted for simplex: MM can only describe bases present in SEQ, and a converted cytosine is not one. A simplex consensus also cannot tell a converted cytosine from a C>T mutation, so restoring it would assert a base the molecule may not have. The shared MM builder now writes the SAM-spec '?' flag (unlisted bases are unknown), takes the conversion pattern from the read type (R1 C->T, R2 G->A) instead of the alignment strand, encodes each ML probability p as floor(256 p) capped at 255 (the SAM spec's [N/256, (N+1)/256) bins; it used floor(255 p), which put 1/2 and 3/4 in the bin below), and MN is available as a tag constant.

Features

  • Typed-step pipeline foundation (#870)
  • Declarative chain-builder layer + group --threads pilot (#872)

Performance

  • Single-pass aux-tag rebuild (RawTagsEditor::rebuild_with) for zipper merge and NM/UQ/MD strip (#962)
  • Fold per-record PG/AS/XS aux scans into single-pass walks (#964)
  • Reduce serial-merge CPU and allocations at 1-2 threads (#971)

fgumi-bam-io

[0.8.0] - 2026-10-06

Bug Fixes

  • Point empty stdin/pipe input at the upstream stage (#866)
  • Return an error instead of panicking on >65,535 libraries (#956)

Features

  • Typed-step pipeline foundation (#870)
  • Inline BAI indexer on the arena sink (#883)
  • Restore --read-streams on the arena chain via a concurrent scatter reader (#889)
  • Add the bam-roundtrip subcommand (#936)

Performance

  • Drop the discarded decode key and add skippable input CRC (#960)
  • Fold UMI-position cache into the group-key aux scan (#976)

Refactor

  • [breaking] Remove the legacy unified_pipeline engine (#947)

fgumi-cli-macros

[0.8.0] - 2026-10-06

fgumi-metrics

[0.8.0] - 2026-10-06

Documentation

  • Stop calling the duplication ladder a saturation curve (#980)

Features

  • Produce --metrics on the multi-threaded chain path (#915)
  • Compute consensus QC metrics inline in fused runall and standalone consensus (#948)
  • [breaking] Publish metric column manifest; headered filter --stats (#979)
    • fgumi filter --stats now writes a headered fgbio-Metric TSV (a total_reads/passed_reads/failed_reads/pass_rate header row plus one data row) instead of the previous headerless two-column key/value layout. Column names and semantics are unchanged; downstream parsers of the old vertical format must be updated. * test(metrics): round-trip conformance tests for all emitters * feat(metrics): publish metric column manifest with contract tests Adds crates/fgumi-metrics/metric_columns.json, the ordered column contract for every metric file fgumi emits, keyed . because group, simplex, duplex and dedup each write a differently shaped *.family_sizes.txt. tests/integration/test_metric_contract.rs parses the workspace with syn and fails in three cases: the manifest drifts from the live structs; a struct deriving serde's Serialize is neither listed nor explicitly allowlisted; or a serialized f64 field lacks the fgbio float encoding (Infinity/NaN rather than inf). downsample's --histogram-kept/--histogram-rejected were hand-formatted with writeln!. They now serialize a DownsampleHistogramMetric through the shared writer, so they are covered by the contract. The output is byte-identical. * fix(metrics): write headers for empty group and dedup histogram outputs group (--family-size-histogram, and the --metrics family- and position-group-size histograms) and dedup (--metrics, --family-size-histogram, --duplication-ladder) wrote through a bare DelimFile, which emits the header lazily. An empty histogram or ladder was therefore a 0-byte file that fgbio's Metric.read rejects ("No header found"). Route them through the shared write_metrics, which always writes the header. * docs(changelog): note filter --stats format break and metrics fixes * fix(metrics): honor .gz, special-file and symlink destinations in write_metrics write_metrics wrote rows to an extension-less temp file and renamed it into place. That had three problems. A .gz destination received plain text under a .gz name, which the metrics reader then failed to decompress. A non-regular destination such as /dev/stdout, a FIFO or a >(...) process substitution failed at rename time, after the whole run. A symlinked destination was replaced by a regular file. The temp file now carries the destination's extension so compression follows it. Non-regular destinations are written in place. Symlinks are resolved before the atomic rename. Empty outputs derive their header from a plain scratch file, so the gzip path keeps its header too.

Testing

  • Fix inconsistent mate-strand flags in duplicate-group fixtures (#908)

fgumi-sam

[0.8.0] - 2026-10-06

Bug Fixes

  • [breaking] Give each methylation consensus caller one SEQ convention and make filters, simulate and docs follow it (#1010)
    • methylation::query_to_ref_positions takes the CIGAR as aligned (with its clips) and no longer takes the simplified CIGAR. * fix(consensus)!: emit observed bases from simplex methylation consensus Simplex EM-seq/TAPs consensus rewrote converted bases in the source reads (T->C / A->G at reference cytosines) before calling, so the emitted SEQ reported every site as unconverted. SEQ-based methylation callers and bisulfite-aware aligners read methylation from SEQ and saw every cytosine as methylated. The rewrite also hid real disagreements: all reads of a single-strand family copy one converted strand, so a C/T split is an error (or a UMI collision) and must lower quality like any other. Consensus is now always called on the observed bases, and simplex emits them as they are, with the evidence in cu/ct. MM/ML are no longer emitted for simplex: MM can only describe bases present in SEQ, and a converted cytosine is not one. A simplex consensus also cannot tell a converted cytosine from a C>T mutation, so restoring it would assert a base the molecule may not have. The shared MM builder now writes the SAM-spec '?' flag (unlisted bases are unknown), takes the conversion pattern from the read type (R1 C->T, R2 G->A) instead of the alignment strand, encodes each ML probability p as floor(256 p) capped at 255 (the SAM spec's [N/256, (N+1)/256) bins; it used floor(255 p), which put 1/2 and 3/4 in the bin below), and MN is available as a tag constant.
  • Keep MM/ML in step with hard-clipped and unmapped reads (#1012)
  • Upgrade soft clips only at the mate-facing end when clipping overlaps (#1015)
  • Never auto-clip RG, MI and other non-per-base tags (#1019)

Performance

  • Single-pass aux-tag rebuild (RawTagsEditor::rebuild_with) for zipper merge and NM/UQ/MD strip (#962)

Testing

  • Port missing fgbio SamRecordClipper and ClipBam tests (#1018)

fgumi-consensus

[0.8.0] - 2026-10-06

Bug Fixes

  • [breaking] Reject duplex/codec flags the callers never honor (#997)
    • fgumi duplex --min-consensus-base-quality, fgumi codec --min-consensus-base-quality, fgumi codec --trim and their runall forms are removed. ConsensusCallingOptions loses trim and min_consensus_base_quality (now in QualityTrimOptions / MinConsensusBaseQualityOptions); DuplexOptions loses min_consensus_base_quality; CodecOptions and
  • [breaking] Give each methylation consensus caller one SEQ convention and make filters, simulate and docs follow it (#1010)
    • methylation::query_to_ref_positions takes the CIGAR as aligned (with its clips) and no longer takes the simplified CIGAR. * fix(consensus)!: emit observed bases from simplex methylation consensus Simplex EM-seq/TAPs consensus rewrote converted bases in the source reads (T->C / A->G at reference cytosines) before calling, so the emitted SEQ reported every site as unconverted. SEQ-based methylation callers and bisulfite-aware aligners read methylation from SEQ and saw every cytosine as methylated. The rewrite also hid real disagreements: all reads of a single-strand family copy one converted strand, so a C/T split is an error (or a UMI collision) and must lower quality like any other. Consensus is now always called on the observed bases, and simplex emits them as they are, with the evidence in cu/ct. MM/ML are no longer emitted for simplex: MM can only describe bases present in SEQ, and a converted cytosine is not one. A simplex consensus also cannot tell a converted cytosine from a C>T mutation, so restoring it would assert a base the molecule may not have. The shared MM builder now writes the SAM-spec '?' flag (unlisted bases are unknown), takes the conversion pattern from the read type (R1 C->T, R2 G->A) instead of the alignment strand, encodes each ML probability p as floor(256 p) capped at 255 (the SAM spec's [N/256, (N+1)/256) bins; it used floor(255 p), which put 1/2 and 3/4 in the bin below), and MN is available as a tag constant.
  • Keep MM/ML in step with hard-clipped and unmapped reads (#1012)

Features

  • Typed-step pipeline foundation (#870)

Performance

  • Use fixed-seed ahash on hot per-item maps to remove RandomState global-counter contention (#865)
  • Single-pass scalar consensus-tag extraction (#969)
  • Gated multi-base fast path for simplex consensus (#973)

Testing

  • Speed up the slow-test tail without weakening invariants (#881)

fgumi-pipeline-core

[0.8.0] - 2026-10-06

Features

  • Wire --pipeline-trace through the chain builder (#937)
  • Thread-utilization and per-step bandwidth telemetry for the chain-builder engine (#951)
  • Park idle pool workers to fix the thread-oversubscription cliff (#955)
  • Add a refill-aware drain-first scheduler (#986)

Performance

  • Don't fuse single-thread chains that declare Detached steps (#884)

Refactor

  • [breaking] Remove the legacy unified_pipeline engine (#947)

Testing

  • Read drained state once in pair-summer test steps (#981)

fgumi-sort

[0.8.0] - 2026-10-06

Bug Fixes

  • [breaking] Enforce --max-temp-files on the arena spill path (#993)
    • fgumi-pipeline-io's SpillBlockEvent::Block gains a required key_kind field, and SpillWrite now emits SpillReady for its surviving runs at AllAnnounced (with slot_count set to their number) instead of as each run closes. RunMergerDyn::step takes a byte budget.
  • Accept bwa's mid-pair -K split; emit BAM from the bwa-mem3 preset; keep mimalloc from purging (#988)
  • Bound the mimalloc purge delay instead of never purging (#1017)

Documentation

  • Remove in-tree design docs and gitignore docs/design/ (#934)

Features

  • Typed-step pipeline foundation (#870)
  • Declarative chain-builder layer + group --threads pilot (#872)
  • Restore --read-streams on the arena chain via a concurrent scatter reader (#889)
  • Give stage option structs a clap::Args surface for runall (PR A) (#907)
  • Add the bam-roundtrip subcommand (#936)
  • Thread-utilization and per-step bandwidth telemetry for the chain-builder engine (#951)
  • Align in process with bwa-mem3 (--aligner::preset bwa-mem3-inproc) (#990)

Performance

  • Use fixed-seed ahash on hot per-item maps to remove RandomState global-counter contention (#865)
  • Extend runs in the arena spill path (t16 parity) (#886)
  • Parallel gather for the in-memory sort fast path (#966)

Refactor

  • [breaking] Remove the legacy unified_pipeline engine (#947)
  • Stop configuring the chain sort through RawExternalSorter (#999)

fgumi-pipeline-io

[0.8.0] - 2026-10-06

Bug Fixes

  • [breaking] Enforce --max-temp-files on the arena spill path (#993)
    • fgumi-pipeline-io's SpillBlockEvent::Block gains a required key_kind field, and SpillWrite now emits SpillReady for its surviving runs at AllAnnounced (with slot_count set to their number) instead of as each run closes. RunMergerDyn::step takes a byte budget.
  • Leave no output files behind when a chain fails to build (#1006)

Features

  • Typed-step pipeline foundation (#870)
  • Inline BAI indexer on the arena sink (#883)
  • Route the sort command onto the declarative chain builder (#885)
  • Restore --read-streams on the arena chain via a concurrent scatter reader (#889)
  • Thread --sort-stats diagnostics through the chain (#913)
  • Add --check-crc / --no-check-crc with the file-vs-stdin default (#933)
  • Expose --block-batch and --file-granularity as hidden flags (#943)
  • Thread-utilization and per-step bandwidth telemetry for the chain-builder engine (#951)

Performance

  • Don't fuse single-thread chains that declare Detached steps (#884)
  • Extend runs in the arena spill path (t16 parity) (#886)
  • Parallel gather for the in-memory sort fast path (#966)

Refactor

  • [breaking] Remove the legacy unified_pipeline engine (#947)
  • Stop configuring the chain sort through RawExternalSorter (#999)

Testing

  • Speed up the slow-test tail without weakening invariants (#881)

fgumi-simd-fastq

[0.8.0] - 2026-10-06

fgumi-umi

[0.8.0] - 2026-10-06

Bug Fixes

  • [breaking] Reverse the methylation counts with the Consensus tag set (#1011)
    • zipper --tags-to-reverse Consensus now also reverses cu, ct, au, at, bu and bt, and fgumi_umi::TagSets::CONSENSUS_REVERSE lists those six tags after fgbio's eight; a pipeline that reverses with both zipper Consensus and filter --reverse-per-base-tags now reverses those counts twice as well, so reverse in only one of the two.

Features

  • Typed-step pipeline foundation (#870)
  • Declarative chain-builder layer + group --threads pilot (#872)

Performance

  • Use fixed-seed ahash on hot per-item maps to remove RandomState global-counter contention (#865)

fgumi

[0.8.0] - 2026-10-06

Bug Fixes

  • Fall back to a name-only group key on an unreadable aux offset (#880)
  • Thread --max-memory into the pipeline queue budget (#888)
  • Resolve --max-temp-files once and bake it into the chain spec (#891)
  • Filter secondary/supplementary reads by flag, not UNKNOWN_REF (#903)
  • Group by molecule by default, add --per-strand opt-out (#904) (#906)
  • Restore chain-path diagnostic parity (dedup index-threshold banner, copy_umi unwired-flags warning, pair_fastq docstring) (#914)
  • Log the missing/wrong-length-UMI banner at error level on the chain path (#912)
  • Error on --min-corrected with empty input on the legacy paths (parity with the chain/fgbio) (#919)
  • Write --metrics only on success on the chain path (match clip/retag) (#921)
  • Consult the UMI-position cache by assigning UMI groups before clearing duplicate flags (#918)
  • Wire --methylation-mode/--ref into the fused filter stage (#944)
  • Restore the === Sort Phase Timing === per-phase diagnostic (#945)
  • Return an error instead of panicking on >65,535 libraries (#956)
  • Honor --check-crc/--no-check-crc on the BGZF FASTQ split decode (#959)
  • Replace deprecated wide swizzle_relaxed with shuffle (#992)
  • Honor --correct::rejects when correct is fused mid-chain (#995)
  • [breaking] Enforce --max-temp-files on the arena spill path (#993)
    • fgumi-pipeline-io's SpillBlockEvent::Block gains a required key_kind field, and SpillWrite now emits SpillReady for its surviving runs at AllAnnounced (with slot_count set to their number) instead of as each run closes. RunMergerDyn::step takes a byte budget.
  • Honor --extract::no-check-crc on BGZF FASTQ input (#996)
  • [breaking] Reject duplex/codec flags the callers never honor (#997)
    • fgumi duplex --min-consensus-base-quality, fgumi codec --min-consensus-base-quality, fgumi codec --trim and their runall forms are removed. ConsensusCallingOptions loses trim and min_consensus_base_quality (now in QualityTrimOptions / MinConsensusBaseQualityOptions); DuplexOptions loses min_consensus_base_quality; CodecOptions and
  • [breaking] Reject the zipper flags the chain never reads (#998)
    • fgumi runall --zipper::buffer and
  • [breaking] Enforce the shared consensus Phred bounds (#1001)
  • Honor both async-reader flags on both FASTQ paths (#1000)
  • [breaking] Reject --clipping-attribute, which extract never honors (#1004)
    • fgumi extract --clipping-attribute and fgumi runall --extract::clipping-attribute are removed. ExtractRunallOptions loses the public clipping_attribute field.
  • Honor the --zipper:: merge rules on fused align chains (#1005)
  • Leave no output files behind when a chain fails to build (#1006)
  • Accept bwa's mid-pair -K split; emit BAM from the bwa-mem3 preset; keep mimalloc from purging (#988)
  • [breaking] Store reverse-strand reads in reference orientation (#1008)
    • for a given seed, simulate mapped-reads, grouped-reads and consensus-reads now write reverse-strand SEQ and QUAL in reference orientation, soft-clip read-through padding when the insert is shorter than the read (changing CIGAR, MC and bin for those records), and consensus-reads writes reverse-strand per-base arrays reversed.
  • [breaking] Give each methylation consensus caller one SEQ convention and make filters, simulate and docs follow it (#1010)
    • methylation::query_to_ref_positions takes the CIGAR as aligned (with its clips) and no longer takes the simplified CIGAR. * fix(consensus)!: emit observed bases from simplex methylation consensus Simplex EM-seq/TAPs consensus rewrote converted bases in the source reads (T->C / A->G at reference cytosines) before calling, so the emitted SEQ reported every site as unconverted. SEQ-based methylation callers and bisulfite-aware aligners read methylation from SEQ and saw every cytosine as methylated. The rewrite also hid real disagreements: all reads of a single-strand family copy one converted strand, so a C/T split is an error (or a UMI collision) and must lower quality like any other. Consensus is now always called on the observed bases, and simplex emits them as they are, with the evidence in cu/ct. MM/ML are no longer emitted for simplex: MM can only describe bases present in SEQ, and a converted cytosine is not one. A simplex consensus also cannot tell a converted cytosine from a C>T mutation, so restoring it would assert a base the molecule may not have. The shared MM builder now writes the SAM-spec '?' flag (unlisted bases are unknown), takes the conversion pattern from the read type (R1 C->T, R2 G->A) instead of the alignment strand, encodes each ML probability p as floor(256 p) capped at 255 (the SAM spec's [N/256, (N+1)/256) bins; it used floor(255 p), which put 1/2 and 3/4 in the bin below), and MN is available as a tag constant.
  • [breaking] Reverse the methylation counts with the Consensus tag set (#1011)
    • zipper --tags-to-reverse Consensus now also reverses cu, ct, au, at, bu and bt, and fgumi_umi::TagSets::CONSENSUS_REVERSE lists those six tags after fgbio's eight; a pipeline that reverses with both zipper Consensus and filter --reverse-per-base-tags now reverses those counts twice as well, so reverse in only one of the two.
  • Keep MM/ML in step with hard-clipped and unmapped reads (#1012)
  • Label paired strands by read orientation in the parallel assigner (#1013)
  • Bound the mimalloc purge delay instead of never purging (#1017)
  • Never auto-clip RG, MI and other non-per-base tags (#1019)

Documentation

  • Add NanoSeq (Duplex-Seq) pipeline guide (#910)
  • Remove in-tree design docs and gitignore docs/design/ (#934)
  • Document fgumi runall and add Reference guide pages (#938)
  • Stop calling the duplication ladder a saturation curve (#980)
  • Leave CHANGELOG.md to release-plz (#1003)

Features

  • Add --threads and route through the unified pipeline (#871)
  • Accept interleaved FASTQ input via --interleaved (#874)
  • Typed-step pipeline foundation (#870)
  • Warn when an explicit memory budget crowds the host (#867)
  • Declarative chain-builder layer + group --threads pilot (#872)
  • Wire dedup --threads onto the declarative chain builder (#876)
  • Add command to copy the read-name UMI into the RX tag (#873)
  • Inline BAI indexer on the arena sink (#883)
  • Route the sort command onto the declarative chain builder (#885)
  • Restore --read-streams on the arena chain via a concurrent scatter reader (#889)
  • Route the correct command onto the declarative chain builder (#893)
  • Route the filter command onto the declarative chain builder (#892)
  • Route the simplex command onto the declarative chain builder (#894)
  • Route the clip command onto the declarative chain builder (#897)
  • Route the codec command onto the declarative chain builder (#895)
  • Route the duplex command onto the declarative chain builder (#896)
  • Route the retag command onto the declarative chain builder (#898)
  • Route the copy-umi command onto the declarative chain builder (#899)
  • Route the extract command onto the declarative chain builder (#900)
  • Add opt-in --verify for strict template-coordinate order (#909)
  • Thread --sort-stats diagnostics through the chain (#913)
  • Give stage option structs a clap::Args surface for runall (PR A) (#907)
  • Fused multi-stage fgumi runall command (#911)
  • Produce --metrics on the multi-threaded chain path (#915)
  • Add --check-crc / --no-check-crc with the file-vs-stdin default (#933)
  • Add the aligner replay subcommand (#935)
  • Add the bam-roundtrip subcommand (#936)
  • Wire --pipeline-trace through the chain builder (#937)
  • Add hidden --pool-scheduler override for A/B benchmarking (#942)
  • Run BAM→FASTQ on the typed-step chain and add paired split output (#939)
  • Expose --block-batch and --file-granularity as hidden flags (#943)
  • Compute consensus QC metrics inline in fused runall and standalone consensus (#948)
  • Thread-utilization and per-step bandwidth telemetry for the chain-builder engine (#951)
  • Park idle pool workers to fix the thread-oversubscription cliff (#955)
  • Add --threads to simplex-metrics and duplex-metrics (#968)
  • [breaking] Publish metric column manifest; headered filter --stats (#979)
    • fgumi filter --stats now writes a headered fgbio-Metric TSV (a total_reads/passed_reads/failed_reads/pass_rate header row plus one data row) instead of the previous headerless two-column key/value layout. Column names and semantics are unchanged; downstream parsers of the old vertical format must be updated. * test(metrics): round-trip conformance tests for all emitters * feat(metrics): publish metric column manifest with contract tests Adds crates/fgumi-metrics/metric_columns.json, the ordered column contract for every metric file fgumi emits, keyed . because group, simplex, duplex and dedup each write a differently shaped *.family_sizes.txt. tests/integration/test_metric_contract.rs parses the workspace with syn and fails in three cases: the manifest drifts from the live structs; a struct deriving serde's Serialize is neither listed nor explicitly allowlisted; or a serialized f64 field lacks the fgbio float encoding (Infinity/NaN rather than inf). downsample's --histogram-kept/--histogram-rejected were hand-formatted with writeln!. They now serialize a DownsampleHistogramMetric through the shared writer, so they are covered by the contract. The output is byte-identical. * fix(metrics): write headers for empty group and dedup histogram outputs group (--family-size-histogram, and the --metrics family- and position-group-size histograms) and dedup (--metrics, --family-size-histogram, --duplication-ladder) wrote through a bare DelimFile, which emits the header lazily. An empty histogram or ladder was therefore a 0-byte file that fgbio's Metric.read rejects ("No header found"). Route them through the shared write_metrics, which always writes the header. * docs(changelog): note filter --stats format break and metrics fixes * fix(metrics): honor .gz, special-file and symlink destinations in write_metrics write_metrics wrote rows to an extension-less temp file and renamed it into place. That had three problems. A .gz destination received plain text under a .gz name, which the metrics reader then failed to decompress. A non-regular destination such as /dev/stdout, a FIFO or a >(...) process substitution failed at rename time, after the whole run. A symlinked destination was replaced by a regular file. The temp file now carries the destination's extension so compression follows it. Non-regular destinations are written in place. Symlinks are resolved before the atomic rename. Empty outputs derive their header from a plain scratch file, so the gzip path keeps its header too.
  • [breaking] Add pair op to build a paired UMI from own/mate tags (#985)
    • RetagOp gains a Pair variant, and its public src() accessor is replaced by a crate-private sources().
  • Add the aligner-bwa-mem3 feature, cohort math and the AlignEngine abstraction (#989)
  • Align in process with bwa-mem3 (--aligner::preset bwa-mem3-inproc) (#990)
  • Align EM-seq bisulfite-aware under --methylation-mode; bump bwa-mem3-rs to 0.4.2 (#1016)

Miscellaneous Tasks

  • Mark the BGZF CRC verification policy as intentional (#932)
  • Publish only when a push bumps the workspace version (#983)
  • Bump codecov/codecov-action to v7.1.1 (#1020)

Performance

  • Use fixed-seed ahash on hot per-item maps to remove RandomState global-counter contention (#865)
  • Skip per-record group-key computation for key-agnostic groupers (#875)
  • Build the merge tag bitsets once per batch, not per template (#917)
  • Skip the discarded group key on the chain filter path (#916)
  • Use DrainFirstScheduler for terminal grouping chains (#941)
  • Single-pass aux-tag rebuild (RawTagsEditor::rebuild_with) for zipper merge and NM/UQ/MD strip (#962)
  • Parallel queryname grouping for the correct/align/filter chains (#957)
  • Resolve the template UMI from the primary read (#958)
  • Fold per-record PG/AS/XS aux scans into single-pass walks (#964)
  • Drop the discarded decode key and add skippable input CRC (#960)
  • Decode-free BAM fast path for single-record filter (#961)
  • Decode-free BAM fast path for copy-umi (#963)
  • Parallel gather for the in-memory sort fast path (#966)
  • Reduce per-record allocation (zero-copy segment views + reused Phred scratch) (#967)
  • Decode-free BAM fast path for retag (#965)
  • Single-pass scalar consensus-tag extraction (#969)
  • Reduce serial-merge CPU and allocations at 1-2 threads (#971)
  • Gated multi-base fast path for simplex consensus (#973)
  • Scale the per-template merge past ~4.5 cores at 4+ threads (#975)
  • Fold UMI-position cache into the group-key aux scan (#976)

Refactor

  • Delete the CLI's throwaway sorter construction (#890)
  • Retire the legacy single-threaded path; the chain is the only path (#920)
  • Retire the legacy single-threaded path; the chain is the only path (#922)
  • Retire the legacy single-threaded path; the chain is the only path (#923)
  • Retire the legacy single-threaded path; the chain is the only path (#924)
  • Retire the legacy single-threaded path; the chain is the only path (#925)
  • [breaking] Collapse simplex/duplex/codec into a single consensus feature and retire the legacy single-threaded paths (#926)
  • Retire the legacy single-threaded path; the chain is the only path (#927)
  • Retire the legacy single-threaded paths; the chain is the only path (#928)
  • Relocate reusable types out of unified_pipeline (R6a) (#929)
  • [breaking] Remove the legacy unified_pipeline engine (#947)
  • Split align+merge into a backend trait and a shared merge (#987)
  • Stop configuring the chain sort through RawExternalSorter (#999)

Testing

  • Speed up the slow-test tail without weakening invariants (#881)
  • Pin TLEN + pair orientation against htsjdk across a broad matrix (#905)
  • Fix inconsistent mate-strand flags in duplicate-group fixtures (#908)
  • Consolidate the byte-identity file-compare idiom into a shared helper (#950)
  • Close --all-metrics and group-metrics integration coverage gaps (#949)
  • Shrink the BGZF no-check-crc fixture below the slow timeout (#1007)
  • Port missing fgbio SamRecordClipper and ClipBam tests (#1018)

fgumi-fmt

[0.8.0] - 2026-10-06

fgumi-cli-common

[0.8.0] - 2026-10-06


This PR was generated with release-plz.

@nh13 nh13 added the release label Aug 26, 2026
@nh13
nh13 deployed to github-actions August 26, 2026 18:45 — with GitHub Actions Active
@coderabbitai

coderabbitai Bot commented Aug 26, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Ignore keyword(s) in the title.

⛔ Ignored keywords (2)
  • chore(deps
  • chore: release

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository: fulcrumgenomics/fgumi/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Essentials
  • Run ID: 057a606e-4b8f-438f-bce6-db745c812fb2

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Note

Reviews paused

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@nh13

nh13 commented Aug 26, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai pause

@coderabbitai

coderabbitai Bot commented Aug 26, 2026

Copy link
Copy Markdown
✅ Action performed

Reviews paused.

@codecov

codecov Bot commented Aug 26, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 96.45%. Comparing base (62b98c0) to head (8f479de).

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #868      +/-   ##
==========================================
- Coverage   96.47%   96.45%   -0.03%     
==========================================
  Files         299      299              
  Lines      152214   152214              
==========================================
- Hits       146854   146818      -36     
- Misses       5360     5396      +36     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 601d721 to ded3878 Compare August 28, 2026 01:10
@nh13
nh13 deployed to github-actions August 28, 2026 01:11 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from ded3878 to 144202b Compare August 28, 2026 01:12
@nh13
nh13 deployed to github-actions August 28, 2026 01:12 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 144202b to 07318ad Compare August 29, 2026 03:26
@nh13
nh13 deployed to github-actions August 29, 2026 03:26 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 07318ad to 500926f Compare August 29, 2026 05:51
@nh13
nh13 deployed to github-actions August 29, 2026 05:51 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 500926f to f9ce6a5 Compare August 29, 2026 15:00
@nh13
nh13 deployed to github-actions August 29, 2026 15:01 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from f9ce6a5 to e0bc304 Compare August 29, 2026 15:33
@nh13
nh13 deployed to github-actions August 29, 2026 15:33 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from e0bc304 to 16e5778 Compare August 29, 2026 17:06
@nh13
nh13 deployed to github-actions August 29, 2026 17:06 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 16e5778 to d4ad2da Compare August 30, 2026 05:31
@nh13
nh13 deployed to github-actions August 30, 2026 05:31 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from d4ad2da to b7dbf6f Compare August 30, 2026 06:09
@nh13
nh13 deployed to github-actions August 30, 2026 06:09 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from b7dbf6f to b4b7ca7 Compare August 30, 2026 08:15
@nh13
nh13 deployed to github-actions August 30, 2026 08:15 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from b4b7ca7 to 9e2f410 Compare August 31, 2026 06:26
@nh13
nh13 deployed to github-actions August 31, 2026 06:26 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 9e2f410 to d193ad6 Compare August 31, 2026 06:45
@nh13
nh13 deployed to github-actions August 31, 2026 06:45 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from ae0826f to 43b9172 Compare September 2, 2026 05:07
@nh13
nh13 deployed to github-actions September 2, 2026 05:07 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 43b9172 to 2614b1b Compare September 2, 2026 07:45
@nh13
nh13 deployed to github-actions September 2, 2026 07:45 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 2614b1b to 4c576fe Compare September 2, 2026 08:46
@nh13
nh13 deployed to github-actions September 2, 2026 08:46 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 4c576fe to 4172537 Compare September 2, 2026 18:41
@nh13
nh13 deployed to github-actions September 2, 2026 18:41 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 4172537 to a26b680 Compare September 2, 2026 22:26
@nh13
nh13 deployed to github-actions September 2, 2026 22:26 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from a26b680 to 705e4ef Compare September 3, 2026 17:19
@nh13
nh13 deployed to github-actions September 3, 2026 17:19 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 705e4ef to 35753ce Compare September 4, 2026 02:38
@nh13
nh13 deployed to github-actions September 4, 2026 02:38 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 35753ce to b743c18 Compare September 4, 2026 03:46
@nh13
nh13 deployed to github-actions September 4, 2026 03:47 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from b743c18 to 83dac58 Compare September 4, 2026 23:13
@nh13
nh13 deployed to github-actions September 4, 2026 23:13 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 83dac58 to c13c9e2 Compare September 4, 2026 23:14
@nh13
nh13 deployed to github-actions September 4, 2026 23:14 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from c13c9e2 to 9826f6e Compare September 4, 2026 23:15
@nh13
nh13 deployed to github-actions September 4, 2026 23:15 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from 9826f6e to d420861 Compare September 5, 2026 17:54
@nh13
nh13 deployed to github-actions September 5, 2026 17:54 — with GitHub Actions Active
@nh13
nh13 force-pushed the release-plz-2026-08-26T18-45-36Z branch from d420861 to 9a594d6 Compare September 5, 2026 18:18
@nh13
nh13 deployed to github-actions September 5, 2026 18:18 — with GitHub Actions Active

This branch was successfully deployed

1 active deployment
github-actions — 8f479def Deployed Oct 6, 2026 by nh13 via coverage #4839
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant