"""Outcome-blind training identities with protected question/text exclusions."""
import json,random,collections,pathlib,re,hashlib
from run_baseline import Qwen3Tokenizer,render_prompt
ROOT=pathlib.Path(__file__).resolve().parents[1]
def norm(s):return ' '.join(s.split())
data=json.loads((ROOT/'code/data/math_train.json').read_text());ei=json.loads((ROOT/'notes/ei_transfer_split.json').read_text());rec=json.loads((ROOT/'notes/recurrence_acquisition_provenance_draft.json').read_text())
hold=[json.loads(s)['index'] for s in (ROOT/'notes/latent_feature_source_development_1958/holdout/targets.jsonl').read_text().splitlines()]
protected=set(ei['development_indices']+ei['existing_validation_indices']+ei['untouched_confirmation_indices']+rec['development_indices']+hold+list(range(50)))
protectedtext={norm(data[i]['problem']) for i in protected};tok=Qwen3Tokenizer(tokenizer_file_path=ROOT/'code/data/tokenizer-base.json')
order=list(range(len(data)));random.Random(16641202).shuffle(order);chosen=[];excluded=collections.Counter();seen=set(protectedtext)
for i in order:
 text=norm(data[i]['problem'])
 if i in protected or text in seen:excluded['protected_or_duplicate']+=1;continue
 p=tok.encode(render_prompt(data[i]['problem']))
 if len(p)>960:excluded['long_prompt']+=1;continue
 chosen.append(i);seen.add(text)
 if len(chosen)==256:break
assert len(chosen)==256
result={'status':'OUTCOME_BLIND_FIXED_CONTEXTUAL_SPLIT','seed':16641202,'train_indices':chosen,'development_indices':rec['development_indices'],'confirmation_indices':ei['untouched_confirmation_indices'],'protected_indices':sorted(protected),'selection':'Seeded shuffle of all supplied training identities; exclude prior protected panels/source-holdout/warmfirst50 and normalized exact duplicate text; no grades inspected','train_subjects':dict(collections.Counter(data[i].get('type','unknown') for i in chosen)),'exclusions':dict(excluded),'data_sha256':hashlib.sha256((ROOT/'code/data/math_train.json').read_bytes()).hexdigest()}
p=ROOT/'notes/contextual_rl_split.json';assert not p.exists();p.write_text(json.dumps(result,indent=2));print(json.dumps({k:v for k,v in result.items() if not k.endswith('indices')},indent=2))
