Repository navigation
feat(bench): strict triage benchmark with composition-matched decoys - #128
Merged
Merged
Conversation
The standard triage benchmark uses random background peptides as decoys, which are trivially distinguishable from AMPs due to protein-like composition. This inflates selective_vs_decoy and hemolytic_vs_decoy AUROCs, making scorers appear to triage well when they are really only solving the easy AMP vs random problem. The strict triage benchmark replaces random decoys with composition-matched scrambled versions of selective AMPs (same amino acids, permuted order). This destroys amphipathic helical phase, hydrophobic moment, and charge distribution while preserving all composition-based features. Key honest finding: NO scorer triages correctly with composition-matched decoys. The standard triage success of selectivity_proxy (0.782 sel_vs_dec) and expert_composite (0.757) was inflated by trivially distinguishable decoys. - selectivity_proxy collapses to exactly 0.5000 on selective_vs_decoy (purely composition-driven: charge and GRAVY are identical between a sequence and its scrambled version) - ensemble drops from 0.848 to 0.572 - selective_vs_hemolytic is identical between standard and strict (expected: both classes are real AMPs, only the decoy class changes) - ensemble admits 7 scrambled decoys into top-20 (vs 0 with random decoys) Changes: - benchmark/triage.py: run_strict_triage_benchmark() + scramble helpers - benchmark/metrics_snapshot.py: strict_triage section in snapshot - tests/test_triage_benchmark.py: 12 new tests (structure + findings) - outputs/metrics_snapshot.json: regenerated with full 2000-iteration bootstrap - docs/METRICS_CURRENT.md: strict triage results table and interpretation - docs/ROADMAP.md: v0.5.14 entry + v1.1 triage item updated 1516 passed, 7 skipped. Tested: uv run pytest -q (1516 passed, 7 skipped), git diff --check (clean) Confidence: high — composition-matched decoy AUROCs are deterministic (seed=42) Co-authored-by: OmX <omx@oh-my-codex.dev>
cschanhniem
force-pushed
the
agent/oamp-loop-20260702-6
branch
from
July 2, 2026 17:16
6521ab5 to
1025b22
Compare
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.
Summary
The standard triage benchmark (v0.5.12) uses random background peptides as decoys, which are trivially distinguishable from AMPs due to protein-like composition. This inflates selective_vs_decoy and hemolytic_vs_decoy AUROCs, making scorers appear to triage well when they are really only solving the easy AMP vs random problem.
This PR adds a strict triage benchmark that replaces random decoys with composition-matched scrambled versions of selective AMPs (same amino acids, permuted order). This destroys amphipathic helical phase, hydrophobic moment, and charge distribution while preserving all composition-based features.
Key Honest Finding
No scorer triages correctly with composition-matched decoys. The standard triage success of selectivity_proxy and expert_composite was an artifact of trivially distinguishable decoys.
Implication
The pipeline triage signal is almost entirely composition-driven. The real bottleneck (selective-vs-hemolytic discrimination) requires structural or contextual features beyond what current 1D physicochemical scorers can capture. Any future virtual assay layer must demonstrate order-dependent triage signal on this strict benchmark before claiming to improve candidate selection.
Changes
Verification
Tested: uv run pytest -q (1516 passed, 7 skipped), git diff --check (clean)
Confidence: high - composition-matched decoy AUROCs are deterministic (seed=42)
Co-authored-by: OmX omx@oh-my-codex.dev