#!/usr/bin/env python3
"""Exploratory ablation added after initial baseline observation, no tuning.
Adds the available tool identifier to its description; same BM25 parameters.
"""
import json,pathlib,sys
from baselines import rank_bm25
r=pathlib.Path(sys.argv[1]);rows=[json.loads(x) for x in (r/'track_b_applied.jsonl').read_text().splitlines()];data={x['id']:x for x in rows if x['task']=='skills_unseen_catalogs'};pred=json.load(open(r/'evidence/routing-predictions.json'));out=[]
for p in pred:
 x=data[p['id']];choices=x['question']['criteria'];keys=list(choices);rank=rank_bm25(x['state'],[k+' '+choices[k] for k in keys]);q=dict(p);q['bm25_name_description']=keys[rank[0]] if rank else 'none';out.append(q)
s=json.load(open(r/'evidence/routing-summary.json'));method='bm25_name_description';s['accuracy'][method]=sum(p[method]==p['gold'] for p in out)/len(out);s['counts'][method]={'correct':sum(p[method]==p['gold'] for p in out),'unnecessary_selection_on_none':sum(p['gold']=='none' and p[method]!='none' for p in out),'missed_required_selection':sum(p['gold']!='none' and p[method]=='none' for p in out),'wrong_non_none_selection':sum(p['gold']!='none' and p[method]!='none' and p[method]!=p['gold'] for p in out)};s['exploratory_ablation']='name+description variant was added after initial outcomes, no parameter or threshold tuning; no significance/equivalence claim';(r/'evidence/routing-predictions-final.json').write_text(json.dumps(out,ensure_ascii=False,indent=2));(r/'evidence/routing-summary-final.json').write_text(json.dumps(s,ensure_ascii=False,indent=2));print(json.dumps(s['accuracy']));print(json.dumps(s['counts'][method]))
