#!/usr/bin/env bash
set -uo pipefail
umask 077
readonly E="/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-gates18-20-summary-production-e2f1699e8586ed3f835eaa2a3eaeaecaf5e52a4ad82aa931caade0ed377077ce-st_01a0080c"
readonly R="/home/cube/projects/richard/hermes-agent"
readonly P="$E/artifacts/predecessor-type-input"
run_recorded() { local name="$1"; shift; local d="$E/artifacts/$name"; mkdir -p "$d"; chmod 700 "$d"; printf '%q ' "$@" >"$d/command.txt"; printf '\n' >>"$d/command.txt"; date --utc +%Y-%m-%dT%H:%M:%S.%NZ >"$d/started-at-utc.txt"; local s e rc pid; s=$(date +%s%N); "$@" >"$d/stdout.txt" 2>"$d/stderr.txt" & pid=$!; wait "$pid"; rc=$?; e=$(date +%s%N); date --utc +%Y-%m-%dT%H:%M:%S.%NZ >"$d/ended-at-utc.txt"; printf '%s\n' "$rc" >"$d/exit-code.txt"; printf '%s\n' "$(((e-s)/1000000))" >"$d/duration-ms.txt"; (cd "$d" && sha256sum command.txt started-at-utc.txt ended-at-utc.txt exit-code.txt duration-ms.txt stdout.txt stderr.txt >files.sha256); chmod 600 "$d"/*; chmod 700 "$d"; return 0; }
run_recorded basedpyright-predecessor-rerun bwrap --die-with-parent --ro-bind / / --bind /home/cube/.cache/uv /home/cube/.cache/uv --ro-bind "$P/gateway/platforms/nutrition_onboarding_reconciliation.py" "$R/gateway/platforms/nutrition_onboarding_reconciliation.py" --ro-bind "$P/gateway/platforms/telegram_nutrition_onboarding_runtime_publication.py" "$R/gateway/platforms/telegram_nutrition_onboarding_runtime_publication.py" --ro-bind "$P/tests/gateway/test_nutrition_onboarding_reconciliation.py" "$R/tests/gateway/test_nutrition_onboarding_reconciliation.py" --tmpfs /tmp --dev /dev --proc /proc --setenv HOME /tmp --setenv TMPDIR /tmp --chdir "$R" uvx --offline basedpyright --outputjson gateway/platforms/nutrition_onboarding_reconciliation.py gateway/platforms/telegram_nutrition_onboarding_runtime_publication.py tests/gateway/test_nutrition_onboarding_reconciliation.py
run_recorded type-classification "$R/.venv/bin/python" -c '
import json,sys
from pathlib import Path
root=Path(sys.argv[1]); cur=json.loads((root/"basedpyright-changed/stdout.txt").read_text()); old=json.loads((root/"basedpyright-predecessor-rerun/stdout.txt").read_text())
def rows(d):
 out=[]
 for x in d["generalDiagnostics"]:
  if x["severity"]!="error": continue
  out.append({"file":Path(x["file"]).name,"line":x["range"]["start"]["line"]+1,"rule":x.get("rule"),"message":x["message"]})
 return out
# Compare stable diagnostic identity; line shifts are expected from inserted tests.
def key(x): return (x["file"],x["rule"],x["message"])
a,b=rows(cur),rows(old); inherited=[]; new=[]; pool={}
for x in b: pool.setdefault(key(x),[]).append(x)
for x in a:
 q=pool.get(key(x),[])
 if q: inherited.append({"successor":x,"predecessor":q.pop(0)})
 else: new.append(x)
removed=[x for q in pool.values() for x in q]
r={"successor_summary":cur["summary"],"predecessor_summary":old["summary"],"successor_errors":a,"predecessor_errors":b,"inherited_errors":inherited,"new_errors":new,"removed_errors":removed,"status":"PASS" if not new else "FAIL"}; print(json.dumps(r,ensure_ascii=False,sort_keys=True,separators=(",",":"))); raise SystemExit(r["status"]!="PASS")
' "$E/artifacts"
