Skip to content

Commit f98d1fe

Browse files
committed
fix: drop unreachable low_relevance_threshold gate and its false eval metadata
1 parent fa5ecc3 commit f98d1fe

6 files changed

Lines changed: 16 additions & 49 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4141
exercise git's real rename path instead of silently degrading to adds
4242
(#176).
4343

44+
### Removed
45+
46+
- The dead `low_relevance_threshold` gate.
47+
`PipelineConfig.low_relevance_filter` was `false` for every scoring mode, so
48+
`filter_low_relevance` — and with it `FILTERING.low_relevance_threshold`
49+
(0.015) and its `size_penalty_*` scaling — could never execute;
50+
`filter_positive_relevance` was always the gate that ran. ContextBench result
51+
rows nevertheless stamped `low_relevance_threshold: 0.015` into their `config`
52+
block, so every recorded run attributed its selections to a threshold that
53+
never fired. Removed on both sides. Bit-equivalent: identical output across
54+
four scoring modes × three diff ranges, plus the full 2725-case corpus.
55+
4456
## [1.12.3] - 2026-07-27
4557

4658
### Added

‎crates/diffctx-native/src/config/filtering.rs‎

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@ pub struct FilteringConfig {
88
pub definition_proximity_half_decay: f64,
99
pub hub_reverse_threshold: usize,
1010
pub max_context_fragments_per_file: usize,
11-
pub low_relevance_threshold: f64,
12-
pub size_penalty_base_tokens: f64,
13-
pub size_penalty_exponent: f64,
1411
}
1512

1613
impl Default for FilteringConfig {
@@ -21,9 +18,6 @@ impl Default for FilteringConfig {
2118
definition_proximity_half_decay: 5.0,
2219
hub_reverse_threshold: 2,
2320
max_context_fragments_per_file: 30,
24-
low_relevance_threshold: 0.015,
25-
size_penalty_base_tokens: 100.0,
26-
size_penalty_exponent: 0.5,
2721
}
2822
}
2923
}

‎crates/diffctx-native/src/filtering.rs‎

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,6 @@ fn proximity_score(frag: &Fragment, file_hunks: &[(u32, u32)]) -> f64 {
3535
FILTERING.proximity_floor_max / (1.0 + min_gap as f64 / half_decay)
3636
}
3737

38-
fn effective_relevance_threshold(token_count: u32) -> f64 {
39-
let size_factor = (token_count as f64 / FILTERING.size_penalty_base_tokens)
40-
.max(1.0)
41-
.powf(FILTERING.size_penalty_exponent);
42-
FILTERING.low_relevance_threshold * size_factor
43-
}
44-
4538
pub fn apply_hunk_proximity_bonus(
4639
rel: &mut FxHashMap<FragmentId, f64>,
4740
core_ids: &FxHashSet<FragmentId>,
@@ -243,21 +236,6 @@ pub fn filter_unrelated_fragments(
243236
.collect()
244237
}
245238

246-
pub fn filter_low_relevance(
247-
fragments: Vec<Fragment>,
248-
core_ids: &FxHashSet<FragmentId>,
249-
rel: &FxHashMap<FragmentId, f64>,
250-
) -> Vec<Fragment> {
251-
fragments
252-
.into_iter()
253-
.filter(|f| {
254-
core_ids.contains(&f.id)
255-
|| rel.get(&f.id).copied().unwrap_or(0.0)
256-
>= effective_relevance_threshold(f.token_count)
257-
})
258-
.collect()
259-
}
260-
261239
pub fn filter_positive_relevance(
262240
fragments: Vec<Fragment>,
263241
core_ids: &FxHashSet<FragmentId>,

‎crates/diffctx-native/src/mode.rs‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ pub struct PipelineConfig {
5757
pub discovery: DiscoveryKind,
5858
pub scoring: ScoringKind,
5959
pub objective: ObjectiveMode,
60-
pub low_relevance_filter: bool,
6160
pub bm25_top_k: usize,
6261
pub ego_depth: usize,
6362
pub ppr_alpha: f64,
@@ -70,7 +69,6 @@ impl PipelineConfig {
7069
ScoringMode::Ppr => Self {
7170
discovery: DiscoveryKind::Ensemble,
7271
scoring: ScoringKind::Ppr,
73-
low_relevance_filter: false,
7472
bm25_top_k: m.bm25_top_k_primary,
7573
ego_depth: m.ego_depth_default,
7674
ppr_alpha: PPR.alpha,
@@ -79,7 +77,6 @@ impl PipelineConfig {
7977
ScoringMode::Ego => Self {
8078
discovery: DiscoveryKind::Ensemble,
8179
scoring: ScoringKind::Ego,
82-
low_relevance_filter: false,
8380
bm25_top_k: m.bm25_top_k_primary,
8481
ego_depth: m.ego_depth_extended,
8582
ppr_alpha: PPR.alpha,
@@ -88,7 +85,6 @@ impl PipelineConfig {
8885
ScoringMode::Bm25 => Self {
8986
discovery: DiscoveryKind::Ensemble,
9087
scoring: ScoringKind::Bm25,
91-
low_relevance_filter: false,
9288
bm25_top_k: m.bm25_top_k_off,
9389
ego_depth: m.ego_depth_default,
9490
ppr_alpha: PPR.alpha,
@@ -100,7 +96,6 @@ impl PipelineConfig {
10096
ScoringMode::Rrf => Self {
10197
discovery: DiscoveryKind::Ensemble,
10298
scoring: ScoringKind::Rrf,
103-
low_relevance_filter: false,
10499
bm25_top_k: m.bm25_top_k_primary,
105100
ego_depth: m.ego_depth_extended,
106101
ppr_alpha: PPR.alpha,

‎crates/diffctx-native/src/scoring.rs‎

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,7 @@ pub struct ScoringResult {
3434
pub fn create_scoring_strategy(config: &PipelineConfig) -> Box<dyn ScoringStrategy> {
3535
match config.scoring {
3636
ScoringKind::Ego => Box::new(EgoGraphScoring::new(config.ego_depth)),
37-
ScoringKind::Ppr => Box::new(PPRScoring::new(
38-
config.ppr_alpha,
39-
config.low_relevance_filter,
40-
)),
37+
ScoringKind::Ppr => Box::new(PPRScoring::new(config.ppr_alpha)),
4138
ScoringKind::Bm25 => Box::new(BM25Scoring),
4239
ScoringKind::Rrf => Box::new(RrfFusionScoring::new(config.ego_depth)),
4340
}
@@ -57,15 +54,11 @@ pub trait ScoringStrategy: Send + Sync {
5754

5855
pub struct PPRScoring {
5956
pub alpha: f64,
60-
pub low_relevance_filter: bool,
6157
}
6258

6359
impl PPRScoring {
64-
pub fn new(alpha: f64, low_relevance_filter: bool) -> Self {
65-
Self {
66-
alpha,
67-
low_relevance_filter,
68-
}
60+
pub fn new(alpha: f64) -> Self {
61+
Self { alpha }
6962
}
7063
}
7164

@@ -104,11 +97,7 @@ impl ScoringStrategy for PPRScoring {
10497
filtering::apply_hunk_proximity_bonus(&mut rel_scores, core_ids, all_fragments, hunks);
10598

10699
let filtered = filtering::filter_unrelated_fragments(all_fragments, core_ids, &g);
107-
let filtered = if self.low_relevance_filter {
108-
filtering::filter_low_relevance(filtered, core_ids, &rel_scores)
109-
} else {
110-
filtering::filter_positive_relevance(filtered, core_ids, &rel_scores)
111-
};
100+
let filtered = filtering::filter_positive_relevance(filtered, core_ids, &rel_scores);
112101
let filtered = filtering::cap_context_fragments(filtered, core_ids, &rel_scores);
113102

114103
ScoringResult {

‎eval/workflows/contextbench.py‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,6 @@ def run_baseline_bm25(repo_dir: Path, budget: int = 8000) -> dict | None:
170170

171171
def _get_diffctx_config() -> dict:
172172
return {
173-
"low_relevance_threshold": 0.015,
174173
"proximity_decay": 0.30,
175174
"peripheral_cap": 0.15,
176175
"max_context_frags_per_file": 30,

0 commit comments

Comments
 (0)