T-ENG05: parameterize eval targets, surface thresholds, add run-evidence runbook - #38
Open
emmanuelgjr wants to merge 2 commits into
Open
T-ENG05: parameterize eval targets, surface thresholds, add run-evidence runbook#38emmanuelgjr wants to merge 2 commits into
emmanuelgjr wants to merge 2 commits into
Conversation
…nce runbook The evals/ tracks shipped as configuration with no proof any profile had ever run — and every runner had a vendor and model baked in, so an unconfigured run would silently hit gpt-4o-mini instead of failing. Targets — no default ships anywhere: - garak/*.yaml (13): model_type/model_name removed; usage shows the required --model_type/--model_name flags. - pyrit/*.py (6): OpenAIChatTarget now reads EVAL_MODEL_NAME / EVAL_ENDPOINT / OPENAI_API_KEY through a _required_env() helper that exits if unset; OPENAI_MODEL/OPENAI_API_BASE and api.openai.com defaults gone. - run_all.sh, run_laaf.sh: exit 2 unless the target env vars are set (LAAF_TARGET=mock still needs no model/key). run_all.sh now globs every *.yaml instead of a hand-list that had drifted to 7 of 13. - ci/github-action.yml: target comes from repository variables (EVAL_MODEL_TYPE/NAME/ENDPOINT); a guard step fails each job early if unset. Thresholds: - New evals/THRESHOLDS.md tabulates all 25 (garak+pyrit+laaf) in one place, each quoting the author's in-file reasoning and marked "DRAFT — SME review required" (C4 — no threshold is our judgment to bless). - Overridable per run: garak --eval_threshold, PyRIT EVAL_FAIL_THRESHOLD, LAAF LAAF_THRESHOLD_S1..S6. No committed default changed. Run evidence: - evals/samples/README.md: the runbook — how to produce one sanitised run per track, a sanitisation checklist, and a RUN.md provenance template. No run is committed; producing one needs a credential, authorisation and budget (the needs-human-run issue). Never fabricated. Tests: - scripts/evals.test.mjs (11 tests): no file names a default target, the runners guard, and THRESHOLDS.md matches the values actually in the files. Also fixed while making the LAAF reporter runnable: laaf_crosswalk.py had an escaped-quote f-string that was a SyntaxError on every Python — it had never executed. Repaired, and its output forced to UTF-8 so it does not crash a Windows console on the ✅/❌ glyphs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147wBugcuzLkswKPqgofcke
5 tasks
The provenance-template fence had no language; markdownlint-cli2 (MD040) requires one. Marked it `text`. No content change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0147wBugcuzLkswKPqgofcke
Contributor
Author
CI note — two failures are the T-ENG03 bug on
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The problem
evals/shipped as configuration with no evidence any profile had ever run, and every runner had a concrete target compiled in —model_type: openai/model_name: gpt-4o-miniin all 13 Garak profiles,OpenAIChatTarget(deployment_name=…"gpt-4o-mini", endpoint=…"api.openai.com")in all 6 PyRIT scripts,gpt-4o-minidefaults in both runners and the CI template. An unconfigured invocation didn't fail — it silently tested OpenAI'sgpt-4o-mini.Targets — nothing baked in, and the runners refuse to guess
model_type/model_namein the YAML--model_type <type> --model_name <name>os.environ.get("OPENAI_MODEL", "gpt-4o-mini"),…"api.openai.com/v1"_required_env("EVAL_MODEL_NAME"/"EVAL_ENDPOINT"/"OPENAI_API_KEY")— exits if unsetrun_all.sh${GARAK_MODEL_NAME:-gpt-4o-mini}, hand-listed 7 of 13 profilesexit 2unless both vars set; globs every*.yamlrun_laaf.sh${LAAF_MODEL:-gpt-4o-mini}exit 2unless target set (LAAF_TARGET=mockneeds no model/key)ci/github-action.ymlscripts/evals.test.mjsfences it: a regex forgpt-4o|api.openai.com|OPENAI_MODEL|…over every file inevals/must find nothing.Thresholds — surfaced, not authored (C4)
New
evals/THRESHOLDS.mdtabulates all 25 thresholds (13 Garak + 6 PyRIT + 6 LAAF) in one place. Each row quotes the reasoning the profile author already wrote and is markedDRAFT — SME review required; I set no value and changed no committed default. Each is overridable per run (Garak--eval_threshold, PyRITEVAL_FAIL_THRESHOLD, LAAFLAAF_THRESHOLD_S1..S6). The test asserts the table equals the values actually in the files, so it can't drift, and that every row carries the DRAFT marker. An "Open questions for the reviewer" section records what I noticed but must not decide (e.g. the S2 reasoning anchors to an AIVSS score that T-ACC04 already flagged as itself unreviewed;LLM05records no reasoning at all).Run evidence — runbook, not fabrication
Per the hard rule "never fabricate results", no run is committed.
evals/samples/README.mdis the runbook: how to produce one sanitised run per track, a sanitisation checklist (strip credentials, endpoints, raw attack completions, PII), and aRUN.mdprovenance template. Producing a real run needs a credential, written authorisation, and budget — the needs-human-run issue #39.Fixed in passing — the LAAF reporter had never run
Making
laaf_crosswalk.pyactually invokable surfaced that it carried an escaped-quote f-string (f"…{f\"…\"}…") that is a SyntaxError on every Python version — the reporter had never executed. Repaired, and its output forced to UTF-8 (write_text(..., encoding="utf-8")+ a UTF-8 stdout write) so it doesn't crash a Windows console on the ✅/❌ status glyphs. Smoke-tested both to stdout and--out.Observed, not changed (same as #37)
npm testruns suite files in parallel;generate.test.mjsrewritesdata/entries/whileexports.test.mjsreads it, soOSCAL component definition carries at least one implemented requirementfails ~1 run in 3 and passes in isolation and onmain. Pre-existing, unrelated to this ticket (myevals.test.mjsreads only static files and passed every run). Worth a follow-up to serialize those two suites.🤖 Generated with Claude Code
https://claude.ai/code/session_0147wBugcuzLkswKPqgofcke