from research import *
s=begin(876,'Evaluate the complete quarter-carrier image family','Which declared phase rows retain quarter resolution?',{},['File63 §§1.1–1.3','C872 packet'])
p=json.loads((ROOT/'model/operator_inputs.json').read_text())
out=[]
for row in p['file63_literal_quarter_ladder']:
 value=F(row['phase']);m=row['m']
 assert value==F(161,4)*m
 out.append({'m':m,'source':clean(value),'images':{n:clean(k*value) for n,k in [('E',E),('P',P),('J',J)]},'quarter_grid':{n:(4*k*value).denominator==1 for n,k in [('E',E),('P',P),('J',J)]}})
a=artifact('model/quarter_carrier_images.json',json.dumps(out,indent=2)+'\n')
finish(s,{'complete_images':a,'membership':[r['quarter_grid'] for r in out]},'Every source multiplier is evaluated exactly. E preserves all five quarter-grid rows; P preserves four; J preserves none. Non-quarter outputs remain valid rational diagnostics, with only source-licensed routes carrying chronology status.','Derive these profiles from multiplier divisibility rather than five separate matches.',{'five_rows':len(out)==5,'P_exception':[r['m'] for r in out if not r['quarter_grid']['P']]==[10],'E_all':all(r['quarter_grid']['E'] for r in out)})
