Problem. attacks/orchestrator.py flattens heterogeneous returns by trying .evaluated, .rows, .results, .data, .items in turn. Any new technique that names a field differently will silently mis-normalize.
Actions.
Acceptance: _normalize_attack_results removed; mypy/pyright clean on the orchestrator path.
Problem. attacks/orchestrator.py flattens heterogeneous returns by trying
.evaluated,.rows,.results,.data,.itemsin turn. Any new technique that names a field differently will silently mis-normalize.Actions.
AttackResult(Pydantic v2, frozen) inattacks/types.pywith fields:goal,prompt,response,evaluations: list[Evaluation],metadata: dict, etc.BaseAttack.run()declare a return type oflist[AttackResult]._normalize_attack_results().Acceptance:
_normalize_attack_resultsremoved; mypy/pyright clean on the orchestrator path.