Preserve detector-result alignment when reverse translations are unavailable
Attempt.outputs_for(lang) can return zero items for a translated prompt even when attempt.outputs contains generated outputs.
reverse_translation_outputs defaults to an empty collection, and outputs_for() returns it whenever the prompt language differs from the detector language. String detectors therefore iterate zero outputs in that state and can produce an empty detector_results list.
This conflicts with the documented/result-consumer contract:
Attempt.detector_resultsis documented as scores corresponding to each item inoutputs;Evaluator._evaluate_one_detector()indexes failures back intoattempt.outputs[idx], explicitly assuming positional alignment.
The result is that translated attempts without attached reverse translations can silently disappear from detector/evaluator accounting rather than being represented as unscoreable.
Suggested direction: preserve one detector-result slot per attempt.outputs when reverse translations are unavailable. Whether that means falling back to the original outputs or explicitly returning one unscoreable result per output should follow the intended translation semantics, but the cardinality invariant should remain intact. A regression should cover a translated prompt with N outputs and no reverse_translation_outputs.
Found while reviewing #2140; that PR correctly pads against the sequence each detector actually consumes, so this is better fixed at the translation/output boundary rather than by making its guard disagree with its normal path.
Source: NVIDIA/garak