Skip to content

Analysis blocked by unfinished SV annotation run: UploadedVCF max-variant / lowest-unannotated are not pipeline-type aware #1656

Description

@davmlaw

🤖 Written by Claude

Symptom

Running an analysis on a VCF (250328BCRABLv2_3_HG38_reanalysis.vardict.vcf.gz) failed with:

VCF '250328BCRABLv2_3_HG38_reanalysis.vardict.vcf.gz' contains variants that have not finished annotation
(in variant annotation version=v91. (06 July 2026) VEP: 116 / RefSeq/GRCh38)
uv.max_variant_id=295967374 > lowest_unannotated_variant=284363487

The block came from AnnotationRun on range-lock 34628 (min_variant=284363487, max_variant=288093038): its standard run is FINISHED but its structural-variant (AnnotSV) run is not.

Root cause

The annotation-completeness check collapses the independent annotation pipelines (VariantAnnotationPipelineType.STANDARD / STRUCTURAL_VARIANT, plus future types) onto a single variant-pk axis:

  • get_lowest_unannotated_variant_id() (annotation/annotation_versions.py:204) excludes non-FINISHED AnnotationRuns with no pipeline_type filter, so a stuck/slow SV run drags the threshold down.
  • UploadedVCF.max_variant (upload/models/models.py:453) is the single highest variant pk in the VCF, regardless of type.

Net effect: a short-variant-caller VCF (vardict) whose short variants are fully annotated is blocked by an unfinished SV run — even when it contains no SVs at all. The counting query get_variants_qs_for_annotation() already supports a pipeline_type arg; only the lowest-unannotated helper and the per-VCF max are type-blind.

Proposed fix

Track max-variant per pipeline type in a normalized child model (UploadedVCFPipelineMaxVariant, keyed by the same VariantAnnotationPipelineType enum that AnnotationRun uses), and make get_lowest_unannotated_variant_id() pipeline-type aware.

A VCF is fully annotated when every per-type row is below that type's lowest-unannotated variant; the absence of a row means "no variants subject to that pipeline" → that pipeline is ignored. The child-model shape means adding a future pipeline type (e.g. SpliceAI, an alternate long-SV pipeline) is an enum value + a membership predicate, with no schema change, and correctly handles types that overlap rather than partition the variants.

Includes a backfill (via a ManualOperation migration) so the next annotation upgrade evaluates completeness correctly for existing VCFs.

Full plan is committed to the repo: claude/plans/split_uploaded_vcf_max_variant_short_sv_plan.md (permalink in a comment below).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions