evaluate_pyro_annotator in eval/dvc.yaml declares fewer ../core deps than evaluate@train/@val, but reaches the missing ones transitively at runtime: inference.py imports .tubes/.types/.logistic_calibrator, and model.py imports .package/.tubes/.types. Missing from the dep list: tubes.py, types.py, logistic_calibrator.py, sequences.py, package.py, temporal_classifier.py.
Consequence: a change that touches only e.g. core/tubes.py (tube linking — exactly what the pyro-annotator scoring exercises) leaves the stage's lock untouched and dvc repro declares it up to date, so the stage the retrain runbook designates as the acceptance gate can report metrics produced by different code than reviewed. The v4.1.0 run wasn't affected only because model.zip changed too.
Fix: align the dep list with evaluate@train/@val (or factor the shared list). Noticed in the PR #65 review; kept out of that PR to avoid scope creep.
evaluate_pyro_annotatorineval/dvc.yamldeclares fewer../coredeps thanevaluate@train/@val, but reaches the missing ones transitively at runtime:inference.pyimports.tubes/.types/.logistic_calibrator, andmodel.pyimports.package/.tubes/.types. Missing from the dep list:tubes.py,types.py,logistic_calibrator.py,sequences.py,package.py,temporal_classifier.py.Consequence: a change that touches only e.g.
core/tubes.py(tube linking — exactly what the pyro-annotator scoring exercises) leaves the stage's lock untouched anddvc reprodeclares it up to date, so the stage the retrain runbook designates as the acceptance gate can report metrics produced by different code than reviewed. The v4.1.0 run wasn't affected only becausemodel.zipchanged too.Fix: align the dep list with
evaluate@train/@val(or factor the shared list). Noticed in the PR #65 review; kept out of that PR to avoid scope creep.