Skip to content

refactor(pipeline): extract pipeline::core into fgumi-pipeline-core crate (120s → 6s compile-fail test) - #440

Merged
nh13 merged 2 commits into
feat-runallfrom
nh/extract-pipeline-core
Jun 19, 2026
Merged

nh13 merged 2 commits into
feat-runallfrom
nh/extract-pipeline-core

Conversation

@nh13

@nh13 nh13 commented Jun 19, 2026 •

Copy link
Copy Markdown
Member

Summary

Extracts the pipeline::core typed-step engine from the fgumi crate into a new crates/fgumi-pipeline-core crate, re-exported as pipeline::core so every existing crate::pipeline::core::… path is unchanged.

Why

The trybuild compile-fail test (pipeline_core_compile_fail) runs >120s in CI (flagged SLOW [>120.000s]). The cases only exercise pipeline::core trait/type bounds, but trybuild compiles each in an isolated sandbox that links the entire fgumi dependency graph — noodles-bam, fgumi-sort, fgumi-consensus, mimalloc, etc. — from scratch, none of which the cases need.

pipeline::core is actually dependency-light: ahash, crossbeam-queue, parking_lot, log, and a single noodles::sam::Header type. Moving it to its own crate lets the compile-fail tests build against just that small crate.

Result: pipeline_core_compile_fail drops from ~120s to ~6s.

What changed

  • New crates/fgumi-pipeline-core (24 files, the former src/lib/pipeline/core subtree). git tracks the moves as renames.
  • fgumi re-exports it: pub use fgumi_pipeline_core as core; in pipeline/mod.rs. No call sites change.
  • PipelineBuilder::{append_source, append_step, append_step2} change pub(crate) → pub — the chains layer (still in fgumi) drives them across the new crate boundary. No other visibility changes were needed.
  • Two process2 pipeline-run tests that reached into pipeline::steps move from the builder test module to steps/process.rs (their natural home — the core crate can't depend on the steps layer).
  • The compile-fail test + cases move into the new crate; .stderr snapshots regenerated; case imports rewritten to fgumi_pipeline_core::….
  • New crate carries #![deny(unsafe_code)]; the documented erased.rs #[allow(unsafe_code)] sites and the CLAUDE.md unsafe-allowlist paths / framework reference are updated to the new location.

Verification

  • 157 fgumi-pipeline-core unit tests pass; the 2 relocated process2 tests pass.
  • All workspace test targets compile (cargo test --workspace --no-run).
  • cargo fmt --check and cargo ci-lint (clippy pedantic, -D warnings) clean.
  • pipeline_core_compile_fail: ~6s (was >120s).

Follow-up (out of scope)

The crate still pulls noodles for one sam::Header type in header.rs. Abstracting that single touch-point would let the crate drop noodles entirely and bring the compile-fail test to true single-digit-second cold builds.

Note

Targets feat-runall because pipeline::core exists only there (the chains pipeline rewrite); it is not on main.

Summary by CodeRabbit

  • Bug Fixes

    • Fixed a concurrency issue in pipeline cancellation that could leave error/cancel results inconsistent.
    • Strengthened slot handling so attempting to overwrite an occupied slot now panics in both debug and release builds (avoids silent record loss).
  • New Features

    • Exposed incremental pipeline-building helpers for broader reuse in pipeline construction workflows.
  • Tests

    • Added end-to-end coverage for multi-branch process2 fan-out and drop behavior, with deterministic value checking.

@nh13
nh13 had a problem deploying to github-actions June 19, 2026 18:17 — with GitHub Actions Failure
@coderabbitai

coderabbitai Bot commented Jun 19, 2026 •

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 768a86f8-6cad-4adb-9ea6-ca0e9f0d601e

📥 Commits

Reviewing files that changed from the base of the PR and between 9e62c27 and eff004f.

📒 Files selected for processing (6)
  • crates/fgumi-pipeline-core/src/builder.rs
  • crates/fgumi-pipeline-core/src/held.rs
  • crates/fgumi-pipeline-core/src/runtime/fused.rs
  • crates/fgumi-pipeline-core/src/signal.rs
  • crates/fgumi-pipeline-core/src/tests.rs
  • src/lib/pipeline/steps/process.rs

Walkthrough

Extracts the typed-step pipeline execution engine from src/lib/pipeline/core into a new crates/fgumi-pipeline-core workspace crate, re-exporting it at the original path. Widens three PipelineBuilder assembly methods to pub, fixes a cancel/record_error race in PipelineSignal::cancel via atomic compare_exchange, promotes a debug_assert to assert in HeldSlot::put, rewrites all internal crate::pipeline::core::* import paths, and relocates process2 end-to-end tests with improved multiset-based assertions.

Changes

fgumi-pipeline-core crate extraction

Layer / File(s) Summary
Workspace and crate manifest wiring
Cargo.toml, crates/fgumi-pipeline-core/Cargo.toml
Registers crates/fgumi-pipeline-core as a workspace member, wires it into [workspace.dependencies] and root [dependencies], and defines the new crate manifest with runtime/dev dependencies and pedantic Clippy config.
Re-export, public API surface, and crate-level attributes
src/lib/pipeline/mod.rs, crates/fgumi-pipeline-core/src/lib.rs, crates/fgumi-pipeline-core/src/builder.rs
pipeline/mod.rs switches pub mod core to pub use fgumi_pipeline_core as core. lib.rs adds #![deny(unsafe_code)]. PipelineBuilder::append_source/append_step/append_step2 are widened from pub(crate) to pub. Helper signatures referencing ChainContexts, RegisteredQueue, and DEFAULT_REORDER_OVERFLOW_BYTES are updated to new module paths.
Concurrency fix in PipelineSignal::cancel, release-build assert, and end-of-run result plumbing
crates/fgumi-pipeline-core/src/signal.rs, crates/fgumi-pipeline-core/src/held.rs, crates/fgumi-pipeline-core/src/builder.rs, crates/fgumi-pipeline-core/src/runtime/fused.rs
PipelineSignal::cancel guards payload.set(PipelineError::Cancelled) behind a successful compare_exchange, eliminating the (state==ERROR, payload==Cancelled) inconsistency when cancel and record_error race. HeldSlot::put replaces debug_assert! with assert! to panic in release builds. Pipeline::run and run_fused_single_thread simplify end-of-run plumbing to call signal.to_result() instead of manual outcome() reconstruction.
Internal import path migration
crates/fgumi-pipeline-core/src/{erased,handles,reorder,step,topology,runtime/*}.rs
All crate::pipeline::core::* paths rewritten to top-level crate::* equivalents across every module in the new crate. RegisteredQueue field types and OutputHandles impl headers updated. No logic changes.
Multiset test assertions and process2 test relocation
crates/fgumi-pipeline-core/src/{builder,tests}.rs, src/lib/pipeline/steps/process.rs
tests.rs refactors DrainReproSink to record every received value and replaces count/sum assertions with sorted multiset equality. Two process2 tests are removed from builder.rs and re-added in process.rs with new SharedCountingSource and ParallelCollectingSink step fixtures.
Compile-fail tests and docs updated for new crate paths
crates/fgumi-pipeline-core/tests/compile-fail/*, CLAUDE.md
All four compile-fail test files and .stderr snapshots updated to import from fgumi_pipeline_core; expected diagnostic paths and HeapSize/Ordered implementor lists updated. CLAUDE.md references updated to new crate name and file paths.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • fulcrumgenomics/fgumi#416: Introduces PipelineError::reconstruct for end-of-run error mapping; this PR switches the same call sites to use signal.to_result() for the final conversion.

Suggested labels

fgumi runall

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main refactoring: extracting pipeline::core into a new crate with a concrete performance improvement (120s → 6s compile-fail tests).
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch nh/extract-pipeline-core

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

@nh13
nh13 force-pushed the nh/extract-pipeline-core branch from 2b9a50a to 30e751c Compare June 19, 2026 18:31
@nh13
nh13 temporarily deployed to github-actions June 19, 2026 18:31 — with GitHub Actions Inactive
@codecov

codecov Bot commented Jun 19, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 97.24771% with 3 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (feat-runall@0c4f1ef). Learn more about missing BASE report.

Files with missing lines Patch % Lines
src/lib/pipeline/steps/process.rs 97.24% 3 Missing ⚠️
Additional details and impacted files
@@              Coverage Diff               @@
##             feat-runall     #440   +/-   ##
==============================================
  Coverage               ?   93.80%           
==============================================
  Files                  ?      119           
  Lines                  ?    50555           
  Branches               ?        0           
==============================================
  Hits                   ?    47425           
  Misses                 ?     3130           
  Partials               ?        0           

☔ 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.

…rate

The `pipeline::core` typed-step engine is dependency-light (ahash,
crossbeam-queue, parking_lot, log, and a single noodles::sam type) but lived in
the `fgumi` crate, so the trybuild compile-fail tests — which only exercise
`pipeline::core` trait/type bounds — recompiled the entire fgumi dependency
graph (noodles-bam, sort, consensus, mimalloc, …) in trybuild's isolated
sandbox. That made `pipeline_core_compile_fail` take >120s in CI.

Move the 24-file `src/lib/pipeline/core` subtree into a new
`crates/fgumi-pipeline-core` crate and re-export it as `pipeline::core`, so
every existing `crate::pipeline::core::…` path is unchanged. The compile-fail
test + cases move with it and now build against just this crate:
`pipeline_core_compile_fail` drops from ~120s to ~6s.

- Re-export: `pub use fgumi_pipeline_core as core;` in `pipeline/mod.rs`.
- Visibility: `PipelineBuilder::{append_source,append_step,append_step2}` go
  `pub(crate)` -> `pub` (the `chains` layer in `fgumi` drives them across the
  new crate boundary).
- Two `process2` pipeline-run tests that reached into `pipeline::steps` move
  from the builder test module to `steps/process.rs` (their natural home).
- New crate carries `#![deny(unsafe_code)]`; the documented erased.rs
  `#[allow(unsafe_code)]` sites and CLAUDE.md paths are updated.

157 core unit tests pass; all workspace test targets compile; fmt + clippy
(pedantic) clean.
@nh13
nh13 force-pushed the nh/extract-pipeline-core branch from 30e751c to 687e3b2 Compare June 19, 2026 18:44
@nh13
nh13 temporarily deployed to github-actions June 19, 2026 18:44 — with GitHub Actions Inactive
@nh13

nh13 commented Jun 19, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 19, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@nh13

nh13 commented Jun 19, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 19, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@nh13

nh13 commented Jun 19, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 19, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/fgumi-pipeline-core/src/signal.rs`:
- Around line 147-158: The cancel() method has a race condition where the state
transitions to STATE_CANCELLED before payload.set() completes, allowing
outcome() to return None while is_done() is true. Instead of directly
transitioning to STATE_CANCELLED in the compare_exchange call, first use a CAS
to transition to an intermediate non-terminal blocking state (to claim exclusive
writer access), then call payload.set(), then perform a second CAS to transition
to the terminal STATE_CANCELLED state. This ordering ensures is_done() observers
cannot observe the done state before the payload is actually set. Apply the same
two-phase transition pattern to the record_error method as well.

In `@src/lib/pipeline/steps/process.rs`:
- Around line 1187-1189: The assertions checking evens_received and
odds_received using load with AtomicOrd::Relaxed only validate item counts, not
the actual values routed to each sink. This allows bugs that misroute, drop,
duplicate, or swap values while preserving counts to pass silently. Modify the
test to collect the actual values received in each branch (not just counts) and
assert that the sorted exact expected sets match for each sink. Apply this fix
to both assertion blocks at lines 1187-1189 and 1220-1222 to validate complete
record identity rather than just totals.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 460c1917-6b06-4b8b-b6d0-330276090372

📥 Commits

Reviewing files that changed from the base of the PR and between 9f11d3a and 9e62c27.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock, !**/*.lock
📒 Files selected for processing (36)
  • CLAUDE.md
  • Cargo.toml
  • crates/fgumi-pipeline-core/Cargo.toml
  • crates/fgumi-pipeline-core/src/builder.rs
  • crates/fgumi-pipeline-core/src/erased.rs
  • crates/fgumi-pipeline-core/src/handles.rs
  • crates/fgumi-pipeline-core/src/header.rs
  • crates/fgumi-pipeline-core/src/held.rs
  • crates/fgumi-pipeline-core/src/item.rs
  • crates/fgumi-pipeline-core/src/lib.rs
  • crates/fgumi-pipeline-core/src/outputs.rs
  • crates/fgumi-pipeline-core/src/queues.rs
  • crates/fgumi-pipeline-core/src/reorder.rs
  • crates/fgumi-pipeline-core/src/runtime/contexts.rs
  • crates/fgumi-pipeline-core/src/runtime/drain.rs
  • crates/fgumi-pipeline-core/src/runtime/driver.rs
  • crates/fgumi-pipeline-core/src/runtime/fused.rs
  • crates/fgumi-pipeline-core/src/runtime/live.rs
  • crates/fgumi-pipeline-core/src/runtime/mod.rs
  • crates/fgumi-pipeline-core/src/runtime/pool.rs
  • crates/fgumi-pipeline-core/src/runtime/stats.rs
  • crates/fgumi-pipeline-core/src/runtime/storage.rs
  • crates/fgumi-pipeline-core/src/runtime/worker_core.rs
  • crates/fgumi-pipeline-core/src/signal.rs
  • crates/fgumi-pipeline-core/src/step.rs
  • crates/fgumi-pipeline-core/src/tests.rs
  • crates/fgumi-pipeline-core/src/topology.rs
  • crates/fgumi-pipeline-core/tests/compile-fail/chain_input_type_mismatch.rs
  • crates/fgumi-pipeline-core/tests/compile-fail/chain_input_type_mismatch.stderr
  • crates/fgumi-pipeline-core/tests/compile-fail/ordered_bytes_single_requires_heapsize.rs
  • crates/fgumi-pipeline-core/tests/compile-fail/ordered_bytes_single_requires_heapsize.stderr
  • crates/fgumi-pipeline-core/tests/compile-fail/ordered_bytes_single_requires_ordered.rs
  • crates/fgumi-pipeline-core/tests/compile-fail/ordered_bytes_single_requires_ordered.stderr
  • crates/fgumi-pipeline-core/tests/compile_fail.rs
  • src/lib/pipeline/mod.rs
  • src/lib/pipeline/steps/process.rs

Comment thread crates/fgumi-pipeline-core/src/signal.rs
Comment thread src/lib/pipeline/steps/process.rs Outdated
…quality issues

Follow-up commit (kept separate from the verbatim move so that move stays a
clean, reviewable rename) fixing issues surfaced by review of the moved code:

- signal.rs: `PipelineSignal::cancel` set the payload unconditionally even when
  it lost the state CAS to a concurrent `record_error`. If `record_error` won
  the CAS (state -> ERROR) but had not yet published its payload, an
  unconditional `payload.set(Cancelled)` could win the OnceLock and leave
  state==ERROR while outcome()==Cancelled. Guard the set behind the CAS, exactly
  as `record_error` already does, so the state-transition winner is the payload
  writer. (Not unit-tested: OnceLock masks the inconsistency in every sequential
  ordering; deterministically forcing the interleaving needs loom — see the
  inline note.)

- held.rs: `HeldSlot::put` guarded the already-occupied invariant with
  `debug_assert!`, so a contract violation in a release build would silently
  OVERWRITE (drop) the held record. Promote to `assert!` — the check is one
  predictable branch on the back-pressure path; silent record loss must not pass.

- tests.rs: three pipeline tests asserted only the SUM of collected values, which
  passes for any multiset with the same total (missing mis-paired/corrupted
  values). Assert the sorted multiset instead; switch DrainReproSink from a
  bare count to collecting values so drop/dup/corruption is caught, not just an
  off-by-N total.

All 157 fgumi-pipeline-core tests pass; fmt + clippy (pedantic) clean.
@nh13
nh13 force-pushed the nh/extract-pipeline-core branch from 9e62c27 to eff004f Compare June 19, 2026 21:38
@nh13
nh13 temporarily deployed to github-actions June 19, 2026 21:38 — with GitHub Actions Inactive
@nh13

nh13 commented Jun 19, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 19, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

nh13 added a commit that referenced this pull request Jun 19, 2026
A review of `TypedStep2::build_output_set` asked why it doesn't apply the
Serial/Exclusive reorder-collapse that `TypedStep::build_output_set` has.
Document that the asymmetry is intentional and add a test that pins it.

The single-input collapse is sound because of a universal property: a Serial
single-input step consumes one already-ordered stream, so any input ordinal it
propagates onto an output is emitted in push order, making the reorder stage
redundant. A two-input MERGE has no such guarantee — it interleaves two branches
and can push a `ByItemOrdinal` output out of ordinal order even under serial
execution, so its reorder stage is load-bearing. Collapsing it would silently
deliver records out of order. Today's production Step2s happen not to need it
(`PairRawFastq` uses `BranchOrdering::None`; `ZipperMergeStep` assigns fresh
sequential ordinals), but the framework cannot assume that for an arbitrary
merge.

Adds `step2_serial_byitemordinal_output_is_reordered_not_collapsed`, which
pushes a Serial Step2's ordered output out of ordinal order and asserts the
consumer receives it in ordinal order — it fails if the single-input collapse is
ever added to the Step2 path (verified).

Stacked on the fgumi-pipeline-core extraction (#440); rebases onto feat-runall
once that merges.
@nh13

nh13 commented Jun 19, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 19, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@nh13

nh13 commented Jun 19, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 19, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@nh13
nh13 merged commit a5c77b3 into feat-runall Jun 19, 2026
10 checks passed
@nh13
nh13 deleted the nh/extract-pipeline-core branch June 19, 2026 22:50
nh13 added a commit that referenced this pull request Jun 19, 2026
A review of `TypedStep2::build_output_set` asked why it doesn't apply the
Serial/Exclusive reorder-collapse that `TypedStep::build_output_set` has.
Document that the asymmetry is intentional and add a test that pins it.

The single-input collapse is sound because of a universal property: a Serial
single-input step consumes one already-ordered stream, so any input ordinal it
propagates onto an output is emitted in push order, making the reorder stage
redundant. A two-input MERGE has no such guarantee — it interleaves two branches
and can push a `ByItemOrdinal` output out of ordinal order even under serial
execution, so its reorder stage is load-bearing. Collapsing it would silently
deliver records out of order. Today's production Step2s happen not to need it
(`PairRawFastq` uses `BranchOrdering::None`; `ZipperMergeStep` assigns fresh
sequential ordinals), but the framework cannot assume that for an arbitrary
merge.

Adds `step2_serial_byitemordinal_output_is_reordered_not_collapsed`, which
pushes a Serial Step2's ordered output out of ordinal order and asserts the
consumer receives it in ordinal order — it fails if the single-input collapse is
ever added to the Step2 path (verified).

Stacked on the fgumi-pipeline-core extraction (#440); rebases onto feat-runall
once that merges.
nh13 added a commit that referenced this pull request Jun 20, 2026
A review of `TypedStep2::build_output_set` asked why it doesn't apply the
Serial/Exclusive reorder-collapse that `TypedStep::build_output_set` has.
Document that the asymmetry is intentional and add a test that pins it.

The single-input collapse is sound because of a universal property: a Serial
single-input step consumes one already-ordered stream, so any input ordinal it
propagates onto an output is emitted in push order, making the reorder stage
redundant. A two-input MERGE has no such guarantee — it interleaves two branches
and can push a `ByItemOrdinal` output out of ordinal order even under serial
execution, so its reorder stage is load-bearing. Collapsing it would silently
deliver records out of order. Today's production Step2s happen not to need it
(`PairRawFastq` uses `BranchOrdering::None`; `ZipperMergeStep` assigns fresh
sequential ordinals), but the framework cannot assume that for an arbitrary
merge.

Adds `step2_serial_byitemordinal_output_is_reordered_not_collapsed`, which
pushes a Serial Step2's ordered output out of ordinal order and asserts the
consumer receives it in ordinal order — it fails if the single-input collapse is
ever added to the Step2 path (verified).

Stacked on the fgumi-pipeline-core extraction (#440); rebases onto feat-runall
once that merges.
nh13 added a commit that referenced this pull request Jul 10, 2026
The incremental `pipeline::core → fgumi-pipeline-core` extraction (#440) and the
AAM wiring left `#[allow(dead_code)]` attributes and "wired up by Phase 1/2" /
"exercised only by tests" comments on items that are, in fact, called from
production now. The allows silence nothing and the comments misdescribe the
code, hiding whether a genuinely-dead item exists.

Verified each against `cargo clippy -D warnings` (the removals are only safe
because the compiler agrees the items are live):

- `CancelHandle::from_signal` (signal.rs) — called by `PipelineBuilder`
  (builder.rs); drop the allow, point the doc at the real caller.
- `build_branch_byte_aware` (handles.rs) — called by production
  `build_single_queues`; drop the allow, correct the "tests only" doc.
- `OutputHandles::new` (step.rs) — called by `TypedStep::wrap_outputs_view`
  (erased.rs); drop the allow, correct the "Phase 1 Task 15" doc.
- `ResolvedAligner` (aligner.rs) — every field is read when the AAM stage is
  wired (builder.rs); drop the struct-level allow and the stale rationale.

`ResolvedAlignerMode` keeps its `allow(dead_code)`, but with an accurate comment:
its `Preset` payload is consumed only through the derived `Debug` (info-logged),
which the never-read lint flags — so the allow is legitimate, not stale.

The remaining findings/{04,06,07,16} F items (retry_held / try_run dedup,
CompressSpill↔SpillCompress rename, SortPhase1Event/SortPhase2Event structural
merge, SpillReady.path removal) are churny type/rename refactors that would
conflict with the in-flight feat-runall→main reconcile for little gain; they are
deferred to the reconcile. The decompress_into_slice ISIZE cross-check
(findings/07 Q1) is already covered by the exact-fill + CRC32 verification
(findings/16), so no change is needed there.
nh13 added a commit that referenced this pull request Jul 11, 2026
The incremental `pipeline::core → fgumi-pipeline-core` extraction (#440) and the
AAM wiring left `#[allow(dead_code)]` attributes and "wired up by Phase 1/2" /
"exercised only by tests" comments on items that are, in fact, called from
production now. The allows silence nothing and the comments misdescribe the
code, hiding whether a genuinely-dead item exists.

Verified each against `cargo clippy -D warnings` (the removals are only safe
because the compiler agrees the items are live):

- `CancelHandle::from_signal` (signal.rs) — called by `PipelineBuilder`
  (builder.rs); drop the allow, point the doc at the real caller.
- `build_branch_byte_aware` (handles.rs) — called by production
  `build_single_queues`; drop the allow, correct the "tests only" doc.
- `OutputHandles::new` (step.rs) — called by `TypedStep::wrap_outputs_view`
  (erased.rs); drop the allow, correct the "Phase 1 Task 15" doc.
- `ResolvedAligner` (aligner.rs) — every field is read when the AAM stage is
  wired (builder.rs); drop the struct-level allow and the stale rationale.

`ResolvedAlignerMode` keeps its `allow(dead_code)`, but with an accurate comment:
its `Preset` payload is consumed only through the derived `Debug` (info-logged),
which the never-read lint flags — so the allow is legitimate, not stale.

The remaining findings/{04,06,07,16} F items (retry_held / try_run dedup,
CompressSpill↔SpillCompress rename, SortPhase1Event/SortPhase2Event structural
merge, SpillReady.path removal) are churny type/rename refactors that would
conflict with the in-flight feat-runall→main reconcile for little gain; they are
deferred to the reconcile. The decompress_into_slice ISIZE cross-check
(findings/07 Q1) is already covered by the exact-fill + CRC32 verification
(findings/16), so no change is needed there.
nh13 added a commit that referenced this pull request Jul 11, 2026
The incremental `pipeline::core → fgumi-pipeline-core` extraction (#440) and the
AAM wiring left `#[allow(dead_code)]` attributes and "wired up by Phase 1/2" /
"exercised only by tests" comments on items that are, in fact, called from
production now. The allows silence nothing and the comments misdescribe the
code, hiding whether a genuinely-dead item exists.

Verified each against `cargo clippy -D warnings` (the removals are only safe
because the compiler agrees the items are live):

- `CancelHandle::from_signal` (signal.rs) — called by `PipelineBuilder`
  (builder.rs); drop the allow, point the doc at the real caller.
- `build_branch_byte_aware` (handles.rs) — called by production
  `build_single_queues`; drop the allow, correct the "tests only" doc.
- `OutputHandles::new` (step.rs) — called by `TypedStep::wrap_outputs_view`
  (erased.rs); drop the allow, correct the "Phase 1 Task 15" doc.
- `ResolvedAligner` (aligner.rs) — every field is read when the AAM stage is
  wired (builder.rs); drop the struct-level allow and the stale rationale.

`ResolvedAlignerMode` keeps its `allow(dead_code)`, but with an accurate comment:
its `Preset` payload is consumed only through the derived `Debug` (info-logged),
which the never-read lint flags — so the allow is legitimate, not stale.

The remaining findings/{04,06,07,16} F items (retry_held / try_run dedup,
CompressSpill↔SpillCompress rename, SortPhase1Event/SortPhase2Event structural
merge, SpillReady.path removal) are churny type/rename refactors that would
conflict with the in-flight feat-runall→main reconcile for little gain; they are
deferred to the reconcile. The decompress_into_slice ISIZE cross-check
(findings/07 Q1) is already covered by the exact-fill + CRC32 verification
(findings/16), so no change is needed there.
nh13 added a commit that referenced this pull request Jul 12, 2026
The incremental `pipeline::core → fgumi-pipeline-core` extraction (#440) and the
AAM wiring left `#[allow(dead_code)]` attributes and "wired up by Phase 1/2" /
"exercised only by tests" comments on items that are, in fact, called from
production now. The allows silence nothing and the comments misdescribe the
code, hiding whether a genuinely-dead item exists.

Verified each against `cargo clippy -D warnings` (the removals are only safe
because the compiler agrees the items are live):

- `CancelHandle::from_signal` (signal.rs) — called by `PipelineBuilder`
  (builder.rs); drop the allow, point the doc at the real caller.
- `build_branch_byte_aware` (handles.rs) — called by production
  `build_single_queues`; drop the allow, correct the "tests only" doc.
- `OutputHandles::new` (step.rs) — called by `TypedStep::wrap_outputs_view`
  (erased.rs); drop the allow, correct the "Phase 1 Task 15" doc.
- `ResolvedAligner` (aligner.rs) — every field is read when the AAM stage is
  wired (builder.rs); drop the struct-level allow and the stale rationale.

`ResolvedAlignerMode` keeps its `allow(dead_code)`, but with an accurate comment:
its `Preset` payload is consumed only through the derived `Debug` (info-logged),
which the never-read lint flags — so the allow is legitimate, not stale.

The remaining findings/{04,06,07,16} F items (retry_held / try_run dedup,
CompressSpill↔SpillCompress rename, SortPhase1Event/SortPhase2Event structural
merge, SpillReady.path removal) are churny type/rename refactors that would
conflict with the in-flight feat-runall→main reconcile for little gain; they are
deferred to the reconcile. The decompress_into_slice ISIZE cross-check
(findings/07 Q1) is already covered by the exact-fill + CRC32 verification
(findings/16), so no change is needed there.
nh13 added a commit that referenced this pull request Jul 12, 2026
The incremental `pipeline::core → fgumi-pipeline-core` extraction (#440) and the
AAM wiring left `#[allow(dead_code)]` attributes and "wired up by Phase 1/2" /
"exercised only by tests" comments on items that are, in fact, called from
production now. The allows silence nothing and the comments misdescribe the
code, hiding whether a genuinely-dead item exists.

Verified each against `cargo clippy -D warnings` (the removals are only safe
because the compiler agrees the items are live):

- `CancelHandle::from_signal` (signal.rs) — called by `PipelineBuilder`
  (builder.rs); drop the allow, point the doc at the real caller.
- `build_branch_byte_aware` (handles.rs) — called by production
  `build_single_queues`; drop the allow, correct the "tests only" doc.
- `OutputHandles::new` (step.rs) — called by `TypedStep::wrap_outputs_view`
  (erased.rs); drop the allow, correct the "Phase 1 Task 15" doc.
- `ResolvedAligner` (aligner.rs) — every field is read when the AAM stage is
  wired (builder.rs); drop the struct-level allow and the stale rationale.

`ResolvedAlignerMode` keeps its `allow(dead_code)`, but with an accurate comment:
its `Preset` payload is consumed only through the derived `Debug` (info-logged),
which the never-read lint flags — so the allow is legitimate, not stale.

The remaining findings/{04,06,07,16} F items (retry_held / try_run dedup,
CompressSpill↔SpillCompress rename, SortPhase1Event/SortPhase2Event structural
merge, SpillReady.path removal) are churny type/rename refactors that would
conflict with the in-flight feat-runall→main reconcile for little gain; they are
deferred to the reconcile. The decompress_into_slice ISIZE cross-check
(findings/07 Q1) is already covered by the exact-fill + CRC32 verification
(findings/16), so no change is needed there.
nh13 added a commit that referenced this pull request Jul 12, 2026
The incremental `pipeline::core → fgumi-pipeline-core` extraction (#440) and the
AAM wiring left `#[allow(dead_code)]` attributes and "wired up by Phase 1/2" /
"exercised only by tests" comments on items that are, in fact, called from
production now. The allows silence nothing and the comments misdescribe the
code, hiding whether a genuinely-dead item exists.

Verified each against `cargo clippy -D warnings` (the removals are only safe
because the compiler agrees the items are live):

- `CancelHandle::from_signal` (signal.rs) — called by `PipelineBuilder`
  (builder.rs); drop the allow, point the doc at the real caller.
- `build_branch_byte_aware` (handles.rs) — called by production
  `build_single_queues`; drop the allow, correct the "tests only" doc.
- `OutputHandles::new` (step.rs) — called by `TypedStep::wrap_outputs_view`
  (erased.rs); drop the allow, correct the "Phase 1 Task 15" doc.
- `ResolvedAligner` (aligner.rs) — every field is read when the AAM stage is
  wired (builder.rs); drop the struct-level allow and the stale rationale.

`ResolvedAlignerMode` keeps its `allow(dead_code)`, but with an accurate comment:
its `Preset` payload is consumed only through the derived `Debug` (info-logged),
which the never-read lint flags — so the allow is legitimate, not stale.

The remaining findings/{04,06,07,16} F items (retry_held / try_run dedup,
CompressSpill↔SpillCompress rename, SortPhase1Event/SortPhase2Event structural
merge, SpillReady.path removal) are churny type/rename refactors that would
conflict with the in-flight feat-runall→main reconcile for little gain; they are
deferred to the reconcile. The decompress_into_slice ISIZE cross-check
(findings/07 Q1) is already covered by the exact-fill + CRC32 verification
(findings/16), so no change is needed there.
nh13 added a commit that referenced this pull request Jul 12, 2026
The incremental `pipeline::core → fgumi-pipeline-core` extraction (#440) and the
AAM wiring left `#[allow(dead_code)]` attributes and "wired up by Phase 1/2" /
"exercised only by tests" comments on items that are, in fact, called from
production now. The allows silence nothing and the comments misdescribe the
code, hiding whether a genuinely-dead item exists.

Verified each against `cargo clippy -D warnings` (the removals are only safe
because the compiler agrees the items are live):

- `CancelHandle::from_signal` (signal.rs) — called by `PipelineBuilder`
  (builder.rs); drop the allow, point the doc at the real caller.
- `build_branch_byte_aware` (handles.rs) — called by production
  `build_single_queues`; drop the allow, correct the "tests only" doc.
- `OutputHandles::new` (step.rs) — called by `TypedStep::wrap_outputs_view`
  (erased.rs); drop the allow, correct the "Phase 1 Task 15" doc.
- `ResolvedAligner` (aligner.rs) — every field is read when the AAM stage is
  wired (builder.rs); drop the struct-level allow and the stale rationale.

`ResolvedAlignerMode` keeps its `allow(dead_code)`, but with an accurate comment:
its `Preset` payload is consumed only through the derived `Debug` (info-logged),
which the never-read lint flags — so the allow is legitimate, not stale.

The remaining findings/{04,06,07,16} F items (retry_held / try_run dedup,
CompressSpill↔SpillCompress rename, SortPhase1Event/SortPhase2Event structural
merge, SpillReady.path removal) are churny type/rename refactors that would
conflict with the in-flight feat-runall→main reconcile for little gain; they are
deferred to the reconcile. The decompress_into_slice ISIZE cross-check
(findings/07 Q1) is already covered by the exact-fill + CRC32 verification
(findings/16), so no change is needed there.
nh13 added a commit that referenced this pull request Jul 13, 2026
The incremental `pipeline::core → fgumi-pipeline-core` extraction (#440) and the
AAM wiring left `#[allow(dead_code)]` attributes and "wired up by Phase 1/2" /
"exercised only by tests" comments on items that are, in fact, called from
production now. The allows silence nothing and the comments misdescribe the
code, hiding whether a genuinely-dead item exists.

Verified each against `cargo clippy -D warnings` (the removals are only safe
because the compiler agrees the items are live):

- `CancelHandle::from_signal` (signal.rs) — called by `PipelineBuilder`
  (builder.rs); drop the allow, point the doc at the real caller.
- `build_branch_byte_aware` (handles.rs) — called by production
  `build_single_queues`; drop the allow, correct the "tests only" doc.
- `OutputHandles::new` (step.rs) — called by `TypedStep::wrap_outputs_view`
  (erased.rs); drop the allow, correct the "Phase 1 Task 15" doc.
- `ResolvedAligner` (aligner.rs) — every field is read when the AAM stage is
  wired (builder.rs); drop the struct-level allow and the stale rationale.

`ResolvedAlignerMode` keeps its `allow(dead_code)`, but with an accurate comment:
its `Preset` payload is consumed only through the derived `Debug` (info-logged),
which the never-read lint flags — so the allow is legitimate, not stale.

The remaining findings/{04,06,07,16} F items (retry_held / try_run dedup,
CompressSpill↔SpillCompress rename, SortPhase1Event/SortPhase2Event structural
merge, SpillReady.path removal) are churny type/rename refactors that would
conflict with the in-flight feat-runall→main reconcile for little gain; they are
deferred to the reconcile. The decompress_into_slice ISIZE cross-check
(findings/07 Q1) is already covered by the exact-fill + CRC32 verification
(findings/16), so no change is needed there.
nh13 added a commit that referenced this pull request Jul 20, 2026
The incremental `pipeline::core → fgumi-pipeline-core` extraction (#440) and the
AAM wiring left `#[allow(dead_code)]` attributes and "wired up by Phase 1/2" /
"exercised only by tests" comments on items that are, in fact, called from
production now. The allows silence nothing and the comments misdescribe the
code, hiding whether a genuinely-dead item exists.

Verified each against `cargo clippy -D warnings` (the removals are only safe
because the compiler agrees the items are live):

- `CancelHandle::from_signal` (signal.rs) — called by `Pipeline::cancel_handle`
  (builder.rs); drop the allow, point the doc at the real caller.
- `build_branch_byte_aware` (handles.rs) — called by production
  `build_single_queues`; drop the allow, correct the "tests only" doc.
- `OutputHandles::new` (step.rs) — called by `TypedStep::wrap_outputs_view`
  (erased.rs); drop the allow, correct the "Phase 1 Task 15" doc.
- `ResolvedAligner` (aligner.rs) — every field is read when the AAM stage is
  wired (chains/builder.rs); drop the struct-level allow and the stale rationale.
  `chunk_size` feeds `in_flight_unmapped_budget` (not batch sizing), so the
  field doc making that stale claim is corrected alongside it.

`ResolvedAlignerMode` keeps its `allow(dead_code)`, but with an accurate comment:
its `Preset` payload is consumed only through the derived `Debug` (info-logged),
which the never-read lint flags — so the allow is legitimate, not stale.

The remaining findings/{04,06,07,16} F items (retry_held / try_run dedup,
CompressSpill↔SpillCompress rename, SortPhase1Event/SortPhase2Event structural
merge, SpillReady.path removal) are churny type/rename refactors that would
conflict with the in-flight feat-runall→main reconcile for little gain; they are
deferred to the reconcile. The decompress_into_slice ISIZE cross-check
(findings/07 Q1) is already covered by the exact-fill + CRC32 verification
(findings/16), so no change is needed there.
nh13 added a commit that referenced this pull request Jul 26, 2026
The incremental `pipeline::core → fgumi-pipeline-core` extraction (#440) and the
AAM wiring left `#[allow(dead_code)]` attributes and "wired up by Phase 1/2" /
"exercised only by tests" comments on items that are, in fact, called from
production now. The allows silence nothing and the comments misdescribe the
code, hiding whether a genuinely-dead item exists.

Verified each against `cargo clippy -D warnings` (the removals are only safe
because the compiler agrees the items are live):

- `CancelHandle::from_signal` (signal.rs) — called by `Pipeline::cancel_handle`
  (builder.rs); drop the allow, point the doc at the real caller.
- `build_branch_byte_aware` (handles.rs) — called by production
  `build_single_queues`; drop the allow, correct the "tests only" doc.
- `OutputHandles::new` (step.rs) — called by `TypedStep::wrap_outputs_view`
  (erased.rs); drop the allow, correct the "Phase 1 Task 15" doc.
- `ResolvedAligner` (aligner.rs) — every field is read when the AAM stage is
  wired (chains/builder.rs); drop the struct-level allow and the stale rationale.
  `chunk_size` feeds `in_flight_unmapped_budget` (not batch sizing), so the
  field doc making that stale claim is corrected alongside it.

`ResolvedAlignerMode` keeps its `allow(dead_code)`, but with an accurate comment:
its `Preset` payload is consumed only through the derived `Debug` (info-logged),
which the never-read lint flags — so the allow is legitimate, not stale.

The remaining findings/{04,06,07,16} F items (retry_held / try_run dedup,
CompressSpill↔SpillCompress rename, SortPhase1Event/SortPhase2Event structural
merge, SpillReady.path removal) are churny type/rename refactors that would
conflict with the in-flight feat-runall→main reconcile for little gain; they are
deferred to the reconcile. The decompress_into_slice ISIZE cross-check
(findings/07 Q1) is already covered by the exact-fill + CRC32 verification
(findings/16), so no change is needed there.
nh13 added a commit that referenced this pull request Jul 26, 2026
The incremental `pipeline::core → fgumi-pipeline-core` extraction (#440) and the
AAM wiring left `#[allow(dead_code)]` attributes and "wired up by Phase 1/2" /
"exercised only by tests" comments on items that are, in fact, called from
production now. The allows silence nothing and the comments misdescribe the
code, hiding whether a genuinely-dead item exists.

Verified each against `cargo clippy -D warnings` (the removals are only safe
because the compiler agrees the items are live):

- `CancelHandle::from_signal` (signal.rs) — called by `Pipeline::cancel_handle`
  (builder.rs); drop the allow, point the doc at the real caller.
- `build_branch_byte_aware` (handles.rs) — called by production
  `build_single_queues`; drop the allow, correct the "tests only" doc.
- `OutputHandles::new` (step.rs) — called by `TypedStep::wrap_outputs_view`
  (erased.rs); drop the allow, correct the "Phase 1 Task 15" doc.
- `ResolvedAligner` (aligner.rs) — every field is read when the AAM stage is
  wired (chains/builder.rs); drop the struct-level allow and the stale rationale.
  `chunk_size` feeds `in_flight_unmapped_budget` (not batch sizing), so the
  field doc making that stale claim is corrected alongside it.

`ResolvedAlignerMode` keeps its `allow(dead_code)`, but with an accurate comment:
its `Preset` payload is consumed only through the derived `Debug` (info-logged),
which the never-read lint flags — so the allow is legitimate, not stale.

The remaining findings/{04,06,07,16} F items (retry_held / try_run dedup,
CompressSpill↔SpillCompress rename, SortPhase1Event/SortPhase2Event structural
merge, SpillReady.path removal) are churny type/rename refactors that would
conflict with the in-flight feat-runall→main reconcile for little gain; they are
deferred to the reconcile. The decompress_into_slice ISIZE cross-check
(findings/07 Q1) is already covered by the exact-fill + CRC32 verification
(findings/16), so no change is needed there.
nh13 added a commit that referenced this pull request Jul 27, 2026
…#544)

The incremental `pipeline::core → fgumi-pipeline-core` extraction (#440) and the
AAM wiring left `#[allow(dead_code)]` attributes and "wired up by Phase 1/2" /
"exercised only by tests" comments on items that are, in fact, called from
production now. The allows silence nothing and the comments misdescribe the
code, hiding whether a genuinely-dead item exists.

Verified each against `cargo clippy -D warnings` (the removals are only safe
because the compiler agrees the items are live):

- `CancelHandle::from_signal` (signal.rs) — called by `Pipeline::cancel_handle`
  (builder.rs); drop the allow, point the doc at the real caller.
- `build_branch_byte_aware` (handles.rs) — called by production
  `build_single_queues`; drop the allow, correct the "tests only" doc.
- `OutputHandles::new` (step.rs) — called by `TypedStep::wrap_outputs_view`
  (erased.rs); drop the allow, correct the "Phase 1 Task 15" doc.
- `ResolvedAligner` (aligner.rs) — every field is read when the AAM stage is
  wired (chains/builder.rs); drop the struct-level allow and the stale rationale.
  `chunk_size` feeds `in_flight_unmapped_budget` (not batch sizing), so the
  field doc making that stale claim is corrected alongside it.

`ResolvedAlignerMode` keeps its `allow(dead_code)`, but with an accurate comment:
its `Preset` payload is consumed only through the derived `Debug` (info-logged),
which the never-read lint flags — so the allow is legitimate, not stale.

The remaining findings/{04,06,07,16} F items (retry_held / try_run dedup,
CompressSpill↔SpillCompress rename, SortPhase1Event/SortPhase2Event structural
merge, SpillReady.path removal) are churny type/rename refactors that would
conflict with the in-flight feat-runall→main reconcile for little gain; they are
deferred to the reconcile. The decompress_into_slice ISIZE cross-check
(findings/07 Q1) is already covered by the exact-fill + CRC32 verification
(findings/16), so no change is needed there.

This branch was previously deployed

1 inactive deployment
github-actions — eff004f2 Deployed Jun 19, 2026 by nh13 via coverage #1705
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant