fix(routing): encode a zero-length band-hop seam leg as turn-less, not a bare assert - #1944
Open
pinin4fjords wants to merge 8 commits into
Open
fix(routing): encode a zero-length band-hop seam leg as turn-less, not a bare assert#1944pinin4fjords wants to merge 8 commits into
pinin4fjords wants to merge 8 commits into
Conversation
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…n column A boxed-in fan-out junction feeding a LEFT entry via a two-band hop leads out into a cell-mate gap before turning down; when no such gap resolves the branch drops straight down the junction column, coinciding the seam's run leg with the source column. Reading a heading off that zero-length leg fired a bare, message-less AssertionError. Build a turn-less _SourceSeam for the coincident-column case, stating only the drop the centreline opens on, matching the bottom-exit precedent. The exit-turn planner already classifies a turn-less requirement as a straight continuation. Convert the residual _leg_direction assert into a typed ExitTurnInvariantError naming the coincident endpoints and, where supplied, the source station and line, so a genuinely-degenerate leg fails loud. Closes #1808. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…skip ci] The turn-less-seam branch and the typed leg-direction guard each add a routing if-gate whose un-exercised arm no shipped corpus fixture reaches: the guard is defensive, and the drop-at-junction branch only fires on a map that aborts downstream on an unrelated curve defect. Acknowledge both in the baseline and regenerate the matrix. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…call site [skip ci] Keep _leg_direction's shared two-endpoint signature, and augment the ExitTurnInvariantError with the source and line only where the entry-wrap drop reads a heading, by catching and re-raising at that one call site. The context now formats on the error path alone rather than on every leg read. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…kip ci] Move the ~150-line near-shipped riboseq partition out of the test module into tests/fixtures/curve_invariant_repros/, the directory the sibling curve-repro locks load from, and read it the same way. The fixture joins the globbed corpus, so reconcile the two corpus consumers it feeds: refresh the route-topology resolved-graph digest, and record the fixture in the reserved-claim KNOWN_NOT_RENDERING allow-list (it aborts downstream on the unrelated fan-overlay curve defect #1806/#1809). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…loses The on-disk band-hop corpus fixture is swept into the gate-coverage corpus and exercises 18 previously-uncovered gate arms before its known downstream fan-overlay abort. Regenerate the baseline to record those as covered and remove the seven now-stale triage sidecar entries whose gates are no longer open gaps. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Member
Author
|
Nudging CI: no GitHub Actions check-suite registered for the head commit after 30+ minutes. Closing and reopening to re-fire the pull_request webhook. |
Resolve the corpus-digest conflict in tests/test_route_topology.py by recomputing the hash fresh against the merged corpus, which now carries both this branch's band-hop fixture and the fixtures main added since the branch point, rather than keeping either side's stale literal. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Contributor
|
Render preview: no visual changes detected. All renders match |
pinin4fjords
marked this pull request as ready for review
September 6, 2026 07:24
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
_entry_wrap_record(layout/routing/inter_section_handlers.py) built azero-length run leg whenever a left-entry band-hop's lead-out column
coincided with its source station's X (the deliberate "drop at the junction
column" fallback in
_band_hop_geometrywhen no cell-mate gap resolves)._leg_directionthen raised a bare, message-lessAssertionError.through an invisible fan-out junction with no station marker), so it is now
encoded as a turn-less
_SourceSeam(run direction stated, turn/launch/axisunstated), matching the existing
_tb_bottom_exit_geometryprecedent forcoincident source/target X.
ExitTurnInvariantErrornaming the source station and line, instead of abare assert.
tests/test_band_hop_zero_length_seam_1808.py)backed by an on-disk fixture
(
tests/fixtures/curve_invariant_repros/riboseq_band_hop_zero_length_seam.mmd)reproducing the failing edge from the nf-core/riboseq map.
entries for gaps the fix and the new fixture close.
reconciliations:
tests/test_route_topology.py's hardcoded resolved-graphdigest was recomputed against the merged corpus (this branch merged in
main, which had independently touched the same digest via other PRs), andthe fixture was recorded in
tests/test_reserved_claim_consumption.py'sKNOWN_NOT_RENDERINGallow-list, since it still aborts on a separate,already-tracked defect (see Scope note below).
Fixes #1808
Scope note
This fixture still aborts downstream on an unrelated, already-tracked defect
(a fan-overlay
CurveInvariantError, #1806/#1809) - that is expected and outof scope here; #1808 is specifically about the message-less assert.
Test plan
tests/test_topology_validation.pyfull glob sweep: 966 passed, 1 xfailed (pre-existing Live strict xfails with no open tracker (variant_calling, variantbenchmarking, packed-cell bypass) #1863)tests/test_routing_gate_coverage.py(NF_METRO_REQUIRE_GATE_COVERAGE=1): 28 passedruff check+ruff format --checkclean