#!/usr/bin/env python3
import json
from pathlib import Path
R=Path(__file__).resolve().parent
P=json.loads((R.parent/"primary-source-derivation-20261011/half-tie-probe-proposal.json").read_bytes())
out={"status":"ACTUAL_ISOLATED_HALF_TIES_AND_AGGREGATES_NOT_BUSINESS_FIX","lanes":{}}
for lane in ["B","C"]:
 es=[json.loads(x) for x in (R/"private-evidence"/(lane+"-run.jsonl")).read_bytes().splitlines()]
 s=P["lanes"][lane];bycase={};current=None
 for e in es:
  d=e["data"]
  if e["event"]=="case-start":
   current=d["case_id"];bycase[current]={"kind":d["kind"],"reads":{},"statement_warnings":[]}
  elif e["event"]=="warnings" and current:
   bycase[current]["statement_warnings"].append(d["rows"])
  elif e["event"]=="read-success" and current:
   for name,sql in s["templates"].items():
    if sql is not None and d["sql"]==sql and name not in ["count","warnings"]:
     bycase[current]["reads"][name]={"rows":d["rows"],"typed_rows":d["typed_rows"],"column_metadata":d["column_metadata"]}
 points=[]
 for c in s["point_cases"]:
  d=bycase[c["case_id"]]
  points.append({"case_id":c["case_id"],"original_lexeme":c["DML"]["bindings"][2]["original_value"],
    "mode":c["case_id"].split("-")[0],"reads":d["reads"],
    "statement_warnings":d["statement_warnings"] if lane=="B" else None})
 aggregates=[]
 for c in s["aggregate_cases"]:
  d=bycase[c["case_id"]]
  aggregates.append({"case_id":c["case_id"],"original_pair":[x["bindings"][2]["original_value"] for x in c["DML"]],
    "reads":d["reads"],"statement_warnings":d["statement_warnings"] if lane=="B" else None})
 out["lanes"][lane]={"points":points,"aggregates":aggregates,
  "warning_status":"collected_all56" if lane=="B" else "unknown",
  "warning_rows":sum(len(w) for d in bycase.values() for w in d["statement_warnings"]) if lane=="B" else None}
b={x["case_id"]:x for x in out["lanes"]["B"]["points"]}
c={x["case_id"]:x for x in out["lanes"]["C"]["points"]}
candidate_keys=["real_candidate","round2","round2_real","real_first_round","floor_fraction_round_real"]
stats={k:{"matches_B_stored_computed_double":0,"matches_B_physical_getter":0,"total_points":48} for k in candidate_keys}
pairs=[]
for key,B in b.items():
 C=c[key];assert B["original_lexeme"]==C["original_lexeme"]
 getter=B["reads"]["native_point"]["rows"][0]["power"]
 stored=B["reads"]["computed_point"]["rows"][0]["power"]
 candidate=C["reads"]["computed_point"]["rows"][0]
 for k in candidate_keys:
  stats[k]["matches_B_stored_computed_double"]+=candidate[k]==stored
  stats[k]["matches_B_physical_getter"]+=candidate[k]==getter
 pairs.append({"case_id":key,"original_lexeme":B["original_lexeme"],
  "B_MD_getter":getter,"B_MD_computed":stored,
  "B_RAW32_getter":B["reads"]["native_point"]["rows"][0]["raw_value"],
  "B_RAW32_computed":B["reads"]["computed_point"]["rows"][0]["raw_computed"],
  "C_REAL_getter":C["reads"]["native_point"]["rows"][0]["power"],
  "C_RAW64_getter":C["reads"]["native_point"]["rows"][0]["raw_value"],
  "C_candidates":candidate})
invariance={}
for lane in ["B","C"]:
 ps=out["lanes"][lane]["points"];div=[]
 for i in range(24):
  S=ps[i];OS=ps[i+24]
  for view in ["native_point","text_point","decimal30_point","computed_point"]:
   if S["reads"][view]["rows"]!=OS["reads"][view]["rows"] or S["reads"][view]["typed_rows"]!=OS["reads"][view]["typed_rows"]:
    div.append({"input":S["original_lexeme"],"view":view})
 invariance[lane]={"comparisons":96,"differences":div}
out["candidate_comparison"]={"results":stats,"pairs":pairs,"warning":"Finite isolated observations only. Getter match and stored-computed match are different contracts; no candidate selected as fix."}
out["S_OS_invariance"]=invariance
print(json.dumps(out,ensure_ascii=False,separators=(",",":")))
