Map Ribo-TISH's colon-qualified ORF types on their location - #12613
Map Ribo-TISH's colon-qualified ORF types on their location#12613FelixKrueger wants to merge 3 commits into
Conversation
Ribo-TISH qualifies a positional label after a colon rather than replacing it: Novel:CDSFrameOverlap, 3'UTR:CDSFrameOverlap, Internal:CDSFrameOverlap, Novel:Known. CLASS_TOKENS holds only the bare locations and classify() matched the whole token, so every one of those fell through unmatched. Since nf-core#12498 made an unmatched token fatal, real Ribo-TISH output now aborts the process — four nf-core/riboseq pipeline tests failed this way on chr20 data, with 3 to 33 offending rows each. Match on the part before the first colon. orf_class is positional, and CDSFrameOverlap describes a frame relationship rather than a position, so the qualifier does not belong in the class; orf_type_native already carries the full token verbatim, so nothing is lost and the harmonisation stays auditable. No CLASS_TOKENS key contains a colon, so this cannot shorten a token meant to match whole, and no new vocabulary entries are needed: the four tokens resolve to novel_u, dORF and intORF through the existing table. The module tests missed this because their fixtures use bare tokens; only real Ribo-TISH output produces the composite form. The added test uses the four observed tokens and fails without this change with the same message the pipeline produced.
The workflow is registered (id 328515623) from its 08-06 run, so the dispatch API resolves it by numeric ID and workflow_dispatch is enough to start it on demand. Dispatch by filename would not work: that lookup requires the file to be on the default branch, and this one deliberately never reaches master. The push trigger is dropped rather than kept alongside. Pushing this commit would otherwise have had a chance of starting the four 45-minute jobs, and they cannot pass until nf-core/modules#12613 has merged and the SHAs are re-bumped.
The original checks for this head wedged during the 2026-08-06 Actions incident:
queued with zero jobs created, and refusing both cancel ("already completed")
and rerun ("already running"). No API path revives them, so a new head is the
only way to get CI. The tree is unchanged, so the local 11/11 verification still
describes exactly this content.
|
CI is red here but none of it belongs to this PR: all four failures are Evidence (AI-assisted)The four failing checks, out of 72 check runs across 7 suites:
PIRATE's diff shows the tool deciding it failed, not snapshot drift — expected outputs absent, failure marker present: This module's tests. Why the head moved. The five original checks on Local verification, unchanged from the PR description: 11/11 including a negative control — reverting only |
|
Merging |
Ribo-TISH qualifies a positional ORF-type label after a colon rather than replacing it —
Novel:CDSFrameOverlap,3'UTR:CDSFrameOverlap,Internal:CDSFrameOverlap,Novel:Known.CLASS_TOKENSholds only the bare locations andclassify()matched the whole token, so all of those fell through unmatched; since #12498 made an unmatched token fatal, real Ribo-TISH output now aborts the process. This matches on the part before the first colon instead.orf_classis positional andCDSFrameOverlapdescribes a frame relationship rather than a position, so the qualifier does not belong in the class — andorf_type_nativealready carries the full token verbatim, so nothing is lost. No new vocabulary entries are needed.Found by four nf-core/riboseq pipeline tests failing on real chr20 data, with 3–33 offending rows each.
Verification notes (AI-assisted)
Why the existing tests didn't catch it. The module fixtures use bare tokens; only genuine Ribo-TISH output produces the composite form, so #12498 was 63/63 green while this was already broken for real data. The added test uses the four tokens observed in production and fails without this change with the same message the pipeline produced:
Why location-only, rather than enumerating the composites. Taking the location keeps
orf_classpurely positional, which is the invariant #12498 established when it split length out intois_smorf. Enumerating<location>:<qualifier>pairs would need a decision per combination and would reintroduce the brittleness that exact-token matching removed. The four observed tokens resolve through the existing table with no additions:orf_classNovel:CDSFrameOverlapNovelnovel_uNovel:KnownNovelnovel_u3'UTR:CDSFrameOverlap3'UTRdORFInternal:CDSFrameOverlapInternalintORFWhy the split is safe for every caller. Checked all 52
CLASS_TOKENSkeys across the five callers: none contains a colon, so splitting cannot shorten a token that was meant to match whole. A comment on the table records that constraint for anyone adding keys later.A location that matches nothing still fails, so the guard #12498 added keeps its value — only the qualifier is permitted to be unknown, which is what makes this robust to Ribo-TISH adding qualifiers.
nf-test test modules/nf-core/custom/orfnormalise— 11/11 pass locally (10 pre-existing plus the new one).