Skip to content

fix(merge): validate input sort order to prevent silent corruption (MERGE3-01) - #519

Merged
nh13 merged 1 commit into
mainfrom
nh/fix-merge-validate-input-sort-order
Jul 15, 2026
Merged

nh13 merged 1 commit into
mainfrom
nh/fix-merge-validate-input-sort-order

Conversation

@nh13

@nh13 nh13 commented Jul 9, 2026 •

Copy link
Copy Markdown
Member

What & why (MERGE3-01, S1)

fgumi merge is a k-way loser-tree merge that assumes every input is already monotonic in the --order key. A mis-sorted input silently produces out-of-order output stamped with the requested SO — an S1 silent corruption.

The audit's premise was that samtools/Picard reject this and fgumi should match them. Real-tool repro shows that's not true:

Tool --order coordinate, inputs = 1 coordinate-sorted + 1 queryname-sorted (differing record order)
fgumi (before) exit 0, SO:coordinate header, mis-ordered records — silent S1
samtools 1.23 merge exit 0, same mis-ordered records — identical to fgumi (docs only warn "may not be sorted")
Picard 3.4 MergeSamFiles exit 0, re-sorts to correct order (merge-and-sort, never rejects)

So fgumi already matches samtools merge (its true analog); Picard is a different operation (fgumi has a separate sort). fgumi therefore adds an explicit guard — converting silent corruption into a clear error — which is stricter than both reference tools but is the correctness-first choice. It also defuses the sharper fgumi-specific footgun: the --order template-coordinate default means fgumi merge a.bam b.bam on ordinary coordinate BAMs would otherwise corrupt.

Disposition was confirmed with the maintainer (tracker §2 decisions log).

The fix — hybrid guard

  1. Fast header check (merge.rs): reject an input whose header declares an order conflicting with --order, before any records are read. The error names both the input's order and how to fix it (--order <declared> to merge as-is, or sort to the requested order). Inputs that declare no usable order (bare / SO:unsorted) pass here and are verified below. Folded into merge_headers so it reuses the single header read.

  2. Streaming monotonicity verify (fgumi-sort run_merge_loop): the merge already extracts a key per record; each newly pulled key is compared against the just-emitted key from the same source (LoserTree::winner_key()), erroring if it goes backward. Reuses fgumi sort --verify semantics, catches actual disorder regardless of what the header claims (bare/lying headers), and costs ~one extra Ord comparison per record on an already comparison-heavy loop. The merge writes to a sibling temp and atomically renames on success, so a mid-merge rejection leaves no partial output (streamed stdout excepted, where rename is impossible).

The default --order is left unchanged (no CLI break).

Evidence (after)

  • coordinate BAM into default (template-coordinate) merge → errors instantly, no output written.
  • queryname BAM into --order coordinate → errors.
  • bare-header BAM with actually-descending positions into --order coordinate → passes the header check, then the streaming verify errors ("record 2 … sorts before a preceding record"), and no partial/temp file is left.
  • valid coordinate merge → succeeds, output globally coordinate-sorted.

Tests

test_check_input_declared_order (rstest, 11 cases: the full declared×requested matrix + undeclared pass-through) and tests/integration/test_merge_command.rs (declared-conflict reject, valid merge order, streaming-verify reject + no-partial-output assertion).

Main-based (non-overlapping merge.rs/external.rs; no in-flight merge PR). Tracker: reports/2026-07-09-fgumi-final-audit-burndown-tracker.md (W2b).

Summary by CodeRabbit

  • Bug Fixes
    • merge now validates each input BAM header’s declared sort order against the requested --order, failing fast on incompatible inputs.
    • Added per-input streaming monotonicity checks to stop immediately on ordering violations and prevent partial/corrupted output.
    • Improved Unix output safety: atomic temp+persist writing preserves destination permissions and follows symlinks correctly (including header-only merges).
  • Tests
    • Added end-to-end integration tests for declared-order enforcement, monotonicity failures, cleanup on failure, permission preservation, and symlink behavior.

@nh13
nh13 temporarily deployed to github-actions July 9, 2026 20:59 — with GitHub Actions Inactive
@coderabbitai

coderabbitai Bot commented Jul 9, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

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

Walkthrough

Changes

Merge now validates BAM header declarations and streamed per-source ordering before exposing output. Regular-file destinations use staged atomic persistence with Unix mode and symlink handling. Tests cover failures, cleanup, ties, permissions, and successful interleaving.

Merge order enforcement and output finalization

Layer / File(s) Summary
Declared sort-order validation
src/lib/commands/merge.rs
Headers are classified against the requested --order; incompatible declarations produce remediation errors, with unit coverage for compatibility and command-hint safety.
Streaming validation and atomic output
crates/fgumi-sort/src/external.rs, crates/fgumi-sort/Cargo.toml, CLAUDE.md
The merge loop validates source monotonicity, removes partial staging on failure, and atomically persists regular-file output with mode, umask, stdout, and symlink handling.
End-to-end merge verification
tests/integration/main.rs, tests/integration/test_merge_command.rs
Integration tests cover header rejection, coordinate interleaving, streamed violations, ties, cleanup, destination preservation, permissions, and symlink targets.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant MergeCommand
  participant HeaderValidation
  participant MergeLoop
  participant MergeOutputTarget
  MergeCommand->>HeaderValidation: validate input declarations against --order
  HeaderValidation-->>MergeCommand: compatible headers or error
  MergeCommand->>MergeLoop: merge records with input paths and key extractor
  MergeLoop->>MergeOutputTarget: write staged output
  MergeLoop->>MergeLoop: verify source monotonicity
  MergeLoop->>MergeOutputTarget: persist on success
  MergeLoop-->>MergeCommand: error without output on violation
Loading
🚥 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 change: merge input sort-order validation to prevent silent corruption.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch nh/fix-merge-validate-input-sort-order

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

@codecov

codecov Bot commented Jul 9, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 95.81395% with 9 lines in your changes missing coverage. Please review.
✅ Project coverage is 92.73%. Comparing base (f638abc) to head (d1b9167).
⚠️ Report is 38 commits behind head on main.

Files with missing lines Patch % Lines
crates/fgumi-sort/src/external.rs 94.66% 8 Missing ⚠️
src/lib/commands/merge.rs 98.46% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #519      +/-   ##
==========================================
+ Coverage   91.12%   92.73%   +1.61%     
==========================================
  Files          78      166      +88     
  Lines       51540   101260   +49720     
==========================================
+ Hits        46964    93905   +46941     
- Misses       4576     7355    +2779     

☔ 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 nh/fix-merge-validate-input-sort-order branch from 2612f62 to 67435d3 Compare July 9, 2026 22:06
@nh13
nh13 temporarily deployed to github-actions July 9, 2026 22:06 — with GitHub Actions Inactive
@nh13
nh13 force-pushed the nh/fix-merge-validate-input-sort-order branch from 67435d3 to a65340f Compare July 10, 2026 04:13
@nh13
nh13 temporarily deployed to github-actions July 10, 2026 04:13 — with GitHub Actions Inactive
@nh13

nh13 commented Jul 13, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 13, 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 Jul 13, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 13, 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 Jul 13, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 13, 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 Jul 13, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 13, 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 Jul 13, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 13, 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: 4

🤖 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-sort/src/external.rs`:
- Around line 306-308: Update the output finalization flow around temp.persist
in the external sort implementation to preserve symlink destinations: detect
when output is a symlink and resolve it to the linked target before staging or
persisting, or explicitly reject symlink outputs. Ensure normal non-symlink
output handling and existing error context remain unchanged.

In `@tests/integration/test_merge_command.rs`:
- Around line 141-169: Add an integration test alongside
test_merge_streaming_verify_rejects_missorted_bare_header_no_partial_output that
supplies consecutive records with equal coordinates and verifies
coordinate-sorted merge succeeds. Keep the existing strictly decreasing-position
rejection test unchanged, and assert that equal adjacent positions are accepted
rather than treated as mis-sorted.
- Around line 79-94: Strengthen the assertions in
test_merge_rejects_coordinate_input_into_template_coordinate_default so the
error message must identify the first offending input, a.bam, in addition to
containing the existing coordinate-order text. Match the sibling streaming-check
test’s file-name assertion pattern and retain the no-output assertion.
- Around line 99-135: Extend test_merge_valid_coordinate_succeeds after the
successful merge and output-content assertions to independently scan the output
directory for entries matching the .fgumi-merge-*.tmp temporary-file pattern,
and assert that none remain after the atomic rename.
🪄 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: 9464aa92-8600-43d6-99ec-9bb15cad0299

📥 Commits

Reviewing files that changed from the base of the PR and between cbc7d72 and a65340f.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock, !**/*.lock
📒 Files selected for processing (6)
  • CLAUDE.md
  • crates/fgumi-sort/Cargo.toml
  • crates/fgumi-sort/src/external.rs
  • src/lib/commands/merge.rs
  • tests/integration/main.rs
  • tests/integration/test_merge_command.rs

Comment thread crates/fgumi-sort/src/external.rs Outdated
Comment thread tests/integration/test_merge_command.rs
Comment thread tests/integration/test_merge_command.rs
Comment thread tests/integration/test_merge_command.rs
@nh13
nh13 force-pushed the nh/fix-merge-validate-input-sort-order branch from a65340f to 8b55ec4 Compare July 13, 2026 03:20
@nh13
nh13 temporarily deployed to github-actions July 13, 2026 03:20 — with GitHub Actions Inactive
@nh13

nh13 commented Jul 13, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 13, 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 Jul 13, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 13, 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 Jul 13, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 13, 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 Jul 13, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 13, 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 Jul 13, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 13, 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 commented Jul 14, 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 Jul 14, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 14, 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 Jul 14, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 14, 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 Jul 14, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 14, 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-sort/src/external.rs`:
- Around line 354-411: Update process_umask in crates/fgumi-sort/src/external.rs
to use nix::sys::stat::umask with Mode::empty() while retaining UMASK_LOCK
serialization, and remove the unsafe block, safety note, and unsafe allow.
Remove the unix-target libc dependency from crates/fgumi-sort/Cargo.toml and
delete the corresponding libc::umask approved-FFI exception from CLAUDE.md.

In `@tests/integration/test_merge_command.rs`:
- Around line 270-297: Add a Unix test alongside
test_merge_output_preserves_existing_destination_mode that merges into a
destination path that does not already exist, then compares its permission bits
with a control file created via File::create under the same conditions. Assert
the new merged output matches the control file’s mode, covering regressions
where the staging NamedTempFile’s 0600 permissions leak into new outputs.
🪄 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: 52a7bc75-c879-4a06-b70c-1f66bc615dde

📥 Commits

Reviewing files that changed from the base of the PR and between 3ddfa8b and 9f60916.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock, !**/*.lock
📒 Files selected for processing (6)
  • CLAUDE.md
  • crates/fgumi-sort/Cargo.toml
  • crates/fgumi-sort/src/external.rs
  • src/lib/commands/merge.rs
  • tests/integration/main.rs
  • tests/integration/test_merge_command.rs

Comment thread crates/fgumi-sort/src/external.rs
Comment thread tests/integration/test_merge_command.rs
@nh13
nh13 force-pushed the nh/fix-merge-validate-input-sort-order branch from 9f60916 to 56ba829 Compare July 15, 2026 00:08
@nh13
nh13 temporarily deployed to github-actions July 15, 2026 00:08 — with GitHub Actions Inactive
@nh13

nh13 commented Jul 15, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 15, 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 Jul 15, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 15, 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 Jul 15, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 15, 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 Jul 15, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 15, 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-sort/src/external.rs`:
- Around line 266-288: Update `OutputFile::create` to inspect the resolved
destination before staging: permit only missing paths or existing regular files,
and for FIFOs, devices, sockets, or other non-regular destinations either reject
them or use the direct-write path. Ensure `persist` cannot rename a regular
temporary file over a special output destination, while preserving stdout and
symlink-resolution behavior.

In `@tests/integration/test_merge_command.rs`:
- Around line 174-200: Extend the streaming merge validation tests beyond
test_merge_streaming_verify_rejects_missorted_bare_header_no_partial_output by
adding rstest cases for queryname, queryname-natural, and template-coordinate.
Generate records in both valid and invalid orders, validate expected ordering
with an independent comparator/baseline, and assert merged record identities and
ordering rather than only counts; retain rejection and no-partial-output
assertions for invalid inputs.
🪄 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: 47e3db30-4a79-459e-b121-8ddaa2228f33

📥 Commits

Reviewing files that changed from the base of the PR and between 3ddfa8b and 56ba829.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock, !**/*.lock
📒 Files selected for processing (6)
  • CLAUDE.md
  • crates/fgumi-sort/Cargo.toml
  • crates/fgumi-sort/src/external.rs
  • src/lib/commands/merge.rs
  • tests/integration/main.rs
  • tests/integration/test_merge_command.rs

Comment thread crates/fgumi-sort/src/external.rs
Comment thread tests/integration/test_merge_command.rs
…ERGE3-01)

fgumi merge is a k-way loser-tree merge that assumes each input is already
monotonic in the --order key; a mis-sorted input silently produces
out-of-order output stamped with the requested SO. Neither reference tool
guards this the way the audit assumed: samtools merge trusts the caller
identically (its docs only warn output "may not be sorted"), and Picard
MergeSamFiles re-sorts rather than rejecting. fgumi is a merge (not a
sorter), so it adds an explicit guard, converting silent S1 corruption into
a clear error. This also defuses the sharper fgumi-specific footgun: the
--order template-coordinate default means `fgumi merge a.bam b.bam` on
ordinary coordinate-sorted BAMs would otherwise corrupt.

Two complementary mechanisms (hybrid):
- Fast header check (merge.rs): reject an input whose header declares an
  order conflicting with --order, before any records are read. Inputs that
  declare no usable order (bare/unsorted) pass here and are verified below.
- Streaming monotonicity verify (fgumi-sort run_merge_loop): the merge
  already extracts a key per record; compare each newly pulled key against
  the just-emitted key from the same source (tree.winner_key()), erroring if
  it goes backward. Reuses `fgumi sort --verify` semantics, ~one extra Ord
  comparison per record on an already comparison-heavy loop, and catches
  actual disorder regardless of what the header claims. The merge writes to a
  sibling temp and atomically renames on success, so a mid-merge rejection
  leaves no partial output (streamed stdout excepted).

Real-tool evidence (--order coordinate; coordinate BAM + a queryname-sorted
BAM whose record order differs): before, fgumi/samtools both emit mis-ordered
records with a success exit and an SO:coordinate header; after, fgumi errors
naming the offending input and record. Valid merges are unaffected.

Tracker: reports/2026-07-09-fgumi-final-audit-burndown-tracker.md (W2b);
audit premise corrected in the decisions log.
@nh13
nh13 force-pushed the nh/fix-merge-validate-input-sort-order branch from 56ba829 to d1b9167 Compare July 15, 2026 14:14
@nh13
nh13 temporarily deployed to github-actions July 15, 2026 14:14 — with GitHub Actions Inactive
@nh13
nh13 merged commit a12988e into main Jul 15, 2026
8 checks passed
@nh13
nh13 deleted the nh/fix-merge-validate-input-sort-order branch July 15, 2026 14:19
@nh13 nh13 mentioned this pull request Jul 15, 2026

This branch was previously deployed

1 inactive deployment
github-actions — d1b91679 Deployed Jul 15, 2026 by nh13 via coverage #2575
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