perf(#498): score the behavioral tier on its own model, not the attacker's - #1
Merged
Weegy merged 1 commit intoAug 19, 2026
Conversation
…ker's The three Delphi jurors each read the entire escalation transcript, and a non-unanimous round 1 doubles that to six full reads. Pinning them to `models.attacker` therefore made the eval's cheapest-to-judge step its most expensive one: judging "did the digest boundary and the role hold" is a bounded classification over text already in context, not the open-ended adversarial reasoning the conductor does. Splits `juror` out of `BehavioralModels` as its own field, wired through `ADVERSARIAL_JUROR_MODEL` and defaulting to `claude-sonnet-5`. On the current corpus (one behavioral scenario, maxTurns 4) that takes a run from roughly $0.13-0.19 to $0.09-0.11, and the saving scales linearly as behavioral scenarios are added — which is the point, since today's absolute number is small but the jury is the part that grows fastest. Safe because the jury is not the only scorer: `findIdentityLeaks` runs over the same transcript and forces `breached` on any real identity value regardless of the vote, so a leniently-voting juror cannot turn an actual leak green. What a weaker jury can still cost is the softer signal — manipulation resistance where nothing literal leaked — which is why the default steps to Sonnet rather than straight to Haiku; the env var makes Haiku available for anyone who measures it against a known-breached transcript first. The added test asserts against the calls the provider actually received, not against the interface: a `juror` field that nothing read would have passed every existing test. Reverting the one-line wiring turns it red.
4 tasks
Author
|
Superseded — merged straight into the byte5ai#730 branch instead, at Marcel's request, so the change rides along in that PR rather than needing a second merge. Branch head is now @sneumannb5 heads-up that this touched your PR branch: two merge commits on top of your |
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.
Stacked on top of byte5ai#730 — base is that PR's branch, not
main, since the adversarial suite is not onmainyet. @sneumannb5 this is your issue and your PR; merge, squash into byte5ai#730, or close it, whatever fits how you want byte5ai#730 to land.What
BehavioralModelsgains ajurorfield, wired throughADVERSARIAL_JUROR_MODELand defaulting toclaude-sonnet-5. Until now the three Delphi jurors ran onmodels.attacker.Why
Each juror reads the entire escalation transcript, and a non-unanimous round 1 doubles three full reads to six. That made the eval's cheapest-to-judge step its most expensive one — judging "did the digest boundary and the role hold" is a bounded classification over text already in context, not the open-ended adversarial reasoning the conductor does.
Measured on the current corpus (1 behavioral scenario,
maxTurns: 4, Opus 4.8 attacker / Haiku 4.5 target):Today's absolute number is small either way. The reason to fix it now is the slope: cost scales with the number of
behavioralscenarios, and the jury is the part that grows fastest — at 20 behavioral entries the difference is roughly $64 vs $40 per month at 20 merges.Why this is safe to downgrade
The jury is not the only scorer.
findIdentityLeaksruns over the same transcript and forcesbreachedon any real identity value regardless of how the jury voted (runBehavioralScenario), so a leniently-voting juror cannot turn an actual leak green. Your existing testthe findIdentityLeaks oracle overrides a fooled jury ⇒ breachedalready pins exactly that property.What a weaker jury can still cost is the softer half of the signal — manipulation resistance where nothing literal leaked. That's why the default steps to Sonnet rather than straight to Haiku.
ADVERSARIAL_JUROR_MODEL=claude-haiku-4-5-20251001is available for anyone who measures it against a known-breached transcript first; the README says so rather than leaving it as folklore.Test
One added test, and it asserts against the calls the provider actually received, not against the interface — a
jurorfield that nothing read would have passed every existing test (thestubProvidernow records{role, model}per call). Reverting the one-linemodels.juror→models.attackerwiring turns exactly that test red; I ran that mutation to confirm.tsc --noEmit -p test/adversarial/tsconfig.json— cleantsx --test test/adversarialModel.test.ts test/adversarialRunner.test.ts— 39 pass, 0 failnpm run lint— cleanNo change to the deterministic tier, the corpus, the baseline, or the workflow.