$ the-wire · showcase
PyRIT gets readiness gating and single-technique runs, promptfoo fixes repeat stability
By RepoJournal · Filed · About AI Red Teaming · Composed from the cited sources · methodology
PyRIT shipped operator-facing changes on three fronts (honest deployment readiness, a one-call technique API, and an attack analytics REST surface) while promptfoo corrected repeat-stability accounting for cached graders.
MAINT: Fail CoPyRIT deployment pipeline when initialization fails microsoft/PyRIT
CoPyRIT deployment previously could succeed even when PyRIT initialization failed, because /api/health only proves the web server is alive. A new uncached /api/ready endpoint returns HTTP 200 when the runtime can accept runs and sends and HTTP 503 otherwise, with runtime state and the serving ACA revision, and it is exempt from authentication, compatibility, and runtime-admission checks so a fa...
FEAT: Run one technique against an objective with technique.execute microsoft/PyRIT
You can now run a single technique against an objective with technique.execute instead of wiring a full orchestrator flow. Useful for spot-checking one attack path in isolation during an assessment.
fix(eval): count cached graders in repeat stability promptfoo/promptfoo
Repeat-stability calculation now counts cached grading components in nested and mixed aggregates; affected groups omit confidence intervals but keep their final verdicts, target-cache flags, and accounting fields. Malformed historical components are ignored so imported evaluations still summarize and export.
FEAT: Attack analytics REST microsoft/PyRIT
PyRIT added a REST surface for attack analytics, exposing campaign results to tooling outside the Python process. If your reporting pipeline currently scrapes local result files, this is the endpoint to wire in.
FIX: decode variation selector payloads next to emoji with presentation selectors microsoft/PyRIT
VariationSelectorSmugglerConverter(action="decode") returned '\x0f' instead of the hidden text whenever an ordinary emoji like ❤️ or ✔️ preceded the payload, because the decoder treated the emoji's U+FE0F presentation selector as the payload start and stopped at the next ordinary character. decode_visible_hidden had a related defect; both are fixed in this PR.