4747 {
4848 "id" : "1.2" , "tier" : 1 , "name" : "find_bug" , "max_iter" : 5 ,
4949 "prompt" : "Read benchmark_data/buggy.py. There is exactly ONE bug. Identify: file, line number, the bug, and the fix.\n Output format:\n FILE: <filename>\n LINE: <number>\n BUG: <description>\n FIX: <the corrected line>" ,
50- "score" : lambda out : score_keywords (out , ["=" , "==" , "assignment" , "comparison" ], ["buggy.py" ]),
50+ "score" : lambda out : score_keywords (out , ["=" , "==" , "assignment" , "comparison" , "KeyError" , "missing key" ], ["buggy.py" ]),
5151 },
5252 {
5353 "id" : "1.3" , "tier" : 1 , "name" : "identify_architecture" , "max_iter" : 8 ,
137137 "set_next" : {"set_next" , "setnext" , "next handler" , "chain link" },
138138 "pipeline" : {"pipeline" , "pipelining" , "build_pipeline" , "builder" },
139139 "basehandler" : {"basehandler" , "base handler" , "abstract handler" },
140+ "missing key" : {"missing key" , "key is missing" , "key missing" , "no key" , "no such key" ,
141+ "key not found" , "doesn't have key" , "doesn't have the key" },
142+ "keyerror" : {"keyerror" , "key error" , "key-error" , "missing key" , "key is missing" ,
143+ "key missing" , "no such key" , "key not found" },
140144}
141145
142146
@@ -354,7 +358,7 @@ def verify_refactor() -> float:
354358 score += min (20 , validators * 5 )
355359
356360 # Must use dict-based dispatch (not if/elif chains)
357- if "rules[" in content or "rules.get(" in content :
361+ if any ( p in content for p in [ "rules[" , "rules .get(", "rules.items()" , " in rules.items" ]) :
358362 score += 20
359363
360364 return min (100 , score )
@@ -373,10 +377,10 @@ def score_speed_read(output: str, expected_bytes: int, wall_time: float = 120) -
373377 closest = min (numbers , key = lambda n : abs (n - expected_bytes ))
374378 accuracy = max (0 , 1 - abs (closest - expected_bytes ) / max (expected_bytes , 1 ))
375379
376- # File coverage: mention all 3 files?
380+ # File coverage: mention at least 2 of 3 files
377381 files = sum (1 for f in ["explain_me.py" , "buggy.py" , "under_tested.py" ]
378382 if f .lower () in lower )
379- file_cov = files / 3
383+ file_cov = min ( 1.0 , files / 2 )
380384
381385 correctness = (accuracy * 0.7 + file_cov * 0.3 ) * 50
382386 speed = _speed_bonus (wall_time )
@@ -435,12 +439,12 @@ def proximity(actual, expected):
435439
436440
437441def _speed_bonus (wall_time : float , max_score : float = 50.0 ) -> float :
438- """Speed bonus: 0 at 120s , full at 10s , linear ramp."""
439- if wall_time <= 10 :
442+ """Speed bonus: 0 at 60s , full at 15s , linear ramp (generous for Tier 4) ."""
443+ if wall_time <= 15 :
440444 return max_score
441- if wall_time >= 120 :
442- return 0.0
443- return round (max_score * (1 - (wall_time - 10 ) / 110 ), 1 )
445+ if wall_time >= 60 :
446+ return max_score * 0.15 # minimum 15% for being under 60s
447+ return round (max_score * (1 - (wall_time - 15 ) / 45 * 0.85 ), 1 )
444448
445449
446450# ─── Benchmark Data ──────────────────────────────────────────────────
0 commit comments