Repository navigation
feat: route selectivity_proxy into pilot_priority ranking formula (#48) - #48
Merged
Merged
Conversation
Previously selectivity_proxy was computed in compute_features() but
never reached the pipeline scores dict — so _pilot_priority() couldn't
use it. Low-selectivity candidates (e.g. temporin-like SEED-004) were
ranked identically to selective peers with equal ensemble scores.
Changes:
- pipeline.py: add selectivity_proxy to raw_scores dict (from features)
- pilot.py: add 0.05×selectivity_proxy term to _pilot_priority(); formula now:
ensemble − 0.30×disagreement + 0.05×serum_stability + 0.05×novelty
+ 0.05×selectivity_proxy
Weight 0.05 matches stability and novelty — keeps ensemble dominant.
- test_pilot_panel.py: update 2 existing tests for the new term;
add 5 new tests for selectivity behaviour (higher is better, max delta=0.05,
absent defaults to 1.0, SEED-004 temporin demoted vs selective peer)
- Makefile: update echo to 1086-test suite
- docs: discovery probability updated to ~25-46% (Stage 2: ~41-56%)
SEED-004 temporin demoted 0.035 relative to equivalent selective candidate
- pilot_panel.py: add selectivity_proxy to CSV (_CSV_FIELDS + _row()) so wet-lab teams can audit why candidates were demoted in the CSV handoff - pilot_panel.py: update write_pilot_markdown() formula string to include all three bonus terms (stability + novelty + selectivity_proxy); was two terms out of date — fix the HIGH issue flagged in code review - pilot_panel.py: add Sel.Px column to the Markdown candidate table - test_pilot_panel.py: _make() now accepts selectivity_proxy= kwarg - test_pilot_panel.py: add test_selectivity_proxy_breaks_tie_in_panel_ordering — first panel-level integration test for the selectivity ranking path - test_pilot_panel.py: add test_selection_method_describes_full_formula — guards against future formula-string staleness - test_pilot_panel.py: update test_correct_columns to include selectivity_proxy - test_pilot_panel.py: make all four defaults explicit in test_missing_disagreement_defaults_to_0_5 comment and assertion - Makefile: update test count to 1088
cschanhniem
added a commit
that referenced
this pull request
Jun 28, 2026
- Combined probability updated: ~25-46% (PR #48) → ~27-47% (PR #49) - Synthesis gate: ~89% → ~90% (aggregation propensity model) - Serum stability gate: ~28-42% → ~29-44% (3-protease elastase model) - Table: add PR #49 column across all criteria - Add rationale sections for both new features (aggregation + elastase) - Add Points 12 and 13 to "What the Pipeline Got Right" section - Update "breaking news" probability history in executive summary
4 tasks done
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
selectivity_proxy(added in PR feat: add selectivity_proxy — cytotoxicity risk detector for Stage 2 (#47) #47) was computed incompute_features()but never stored in the pipelinescoresdict — so_pilot_priority()could not use it. Low-selectivity candidates (e.g. temporin-like SEED-004, proxy=0.30) were ranked identically to selective peers with equal ensemble scores.pipeline.pynow storesselectivity_proxyinraw_scores(read fromfeatures["selectivity_proxy"]). Default 1.0 when key is absent (backward-compatible with pre-PR-47 records)._pilot_priority()gains+ 0.05×selectivity_proxyterm. Full formula:ensemble − 0.30×disagreement + 0.05×serum_stability + 0.05×novelty + 0.05×selectivity_proxy. Weight 0.05 is consistent with stability and novelty terms — keeps ensemble dominant (max selectivity contribution = 0.05).max_per_seedslots if they score well, but won't crowd out more selective candidates in tie situations.Test plan
test_pilot_panel.py: higher selectivity → higher priority; max delta = 0.05; absent key defaults to 1.0; SEED-004 temporin demoted vs selective peer of equal ensembleselectivity_proxyabsent in scores dict defaults safely to 1.0 (no regression for old records)🤖 Generated with Claude Code