#!/usr/bin/env bash
set -uo pipefail
umask 077
E="/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-gate20-corrected-harness-4e9962be49b72951c3b9ed7e1a4fe36d0ca03e757872ae03364c1ab7a790f32b-st_01a0080c";OLD="/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-gates18-20-clarification-normalized-4e9962be49b72951c3b9ed7e1a4fe36d0ca03e757872ae03364c1ab7a790f32b-st_01a0080c";C="/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-clarification-normalized-successor-4e9962be49b72951c3b9ed7e1a4fe36d0ca03e757872ae03364c1ab7a790f32b";R="/home/cube/projects/richard/hermes-agent";PY="$R/.venv/bin/python";W="$C/artifacts/hermes_agent-0.17.0-py3-none-any.whl";D="4e9962be49b72951c3b9ed7e1a4fe36d0ca03e757872ae03364c1ab7a790f32b"
record(){ local n="$1";shift;local d="$E/artifacts/$n";mkdir -p "$d";printf '%q ' "$@">"$d/command.txt";printf '\n'>>"$d/command.txt";env -0|sort -z>"$d/launcher-environment.nul";date -u +%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 -u +%Y-%m-%dT%H:%M:%S.%NZ>"$d/ended-at-utc.txt";echo "$rc">"$d/exit-code.txt";echo "$(((e-s)/1000000))">"$d/duration-ms.txt";(cd "$d"&&sha256sum command.txt launcher-environment.nul started-at-utc.txt ended-at-utc.txt exit-code.txt duration-ms.txt stdout.txt stderr.txt>files.sha256);chmod 600 "$d"/*;return 0;}
cd "$R";record candidate-reverify "$PY" "$C/verify_candidate.py" "$C"
record source-wheel-parity "$PY" -c '
import hashlib,json,sys,zipfile
from pathlib import Path
r=Path(sys.argv[1]);ps=["gateway/platforms/nutrition_onboarding_reconciliation.py","gateway/platforms/telegram_nutrition_onboarding_copy.py","gateway/platforms/telegram_nutrition_onboarding_runtime.py","gateway/platforms/telegram_nutrition_onboarding_runtime_publication.py"];rows=[]
with zipfile.ZipFile(sys.argv[2]) as z:
 for p in ps:
  a=(r/p).read_bytes();b=z.read(p);rows.append({"path":p,"source_sha256":hashlib.sha256(a).hexdigest(),"wheel_sha256":hashlib.sha256(b).hexdigest(),"byte_identical":a==b})
o={"candidate_digest":sys.argv[3],"modules":rows,"status":"PASS" if all(x["byte_identical"] for x in rows) else "FAIL"};print(json.dumps(o,sort_keys=True,separators=(",",":")));raise SystemExit(o["status"]!="PASS")
' "$R" "$W" "$D"
record ruff "$R/.venv/bin/ruff" check --no-cache gateway/platforms/telegram_nutrition_onboarding_copy.py gateway/platforms/telegram_nutrition_onboarding_runtime.py tests/gateway/test_telegram_nutrition_onboarding.py tests/gateway/test_telegram_nutrition_onboarding_copy.py
record compile "$PY" -B -c 'import sys;from pathlib import Path;[compile(Path(p).read_bytes(),p,"exec",dont_inherit=True) for p in sys.argv[1:]]' gateway/platforms/telegram_nutrition_onboarding_copy.py gateway/platforms/telegram_nutrition_onboarding_runtime.py tests/gateway/test_telegram_nutrition_onboarding.py tests/gateway/test_telegram_nutrition_onboarding_copy.py
BUILD="$E/artifacts/reproducible-build-output";mkdir -p "$BUILD";record reproducible-build bwrap --die-with-parent --unshare-net --ro-bind / / --tmpfs /tmp --bind /home/cube/.cache/uv /home/cube/.cache/uv --bind "$BUILD" /tmp/wheel-out --dev /dev --proc /proc --setenv HOME /home/cube --setenv TMPDIR /tmp --setenv UV_CACHE_DIR /home/cube/.cache/uv --chdir "$R" /bin/bash -c 'umask 0002;exec scripts/reproducible-wheel-build "$PWD" /tmp/wheel-out';sha256sum "$BUILD"/*.whl >"$E/artifacts/reproducible-build.sha256"
INSTALL="$E/artifacts/installed-wheel-root";mkdir -p "$INSTALL";record wheel-install "$PY" -m pip install --no-deps --no-compile --target "$INSTALL" "$W";T="$E/artifacts/wheel-tests";mkdir -p "$T";cp tests/gateway/test_telegram_nutrition_onboarding.py tests/gateway/test_telegram_nutrition_onboarding_copy.py tests/gateway/test_nutrition_onboarding_reconciliation.py tests/gateway/test_telegram_nutrition_onboarding_callback_observability.py tests/gateway/test_telegram_nutrition_onboarding_direct_entry.py tests/gateway/test_telegram_nutrition_onboarding_preview.py tests/gateway/test_telegram_nutrition_onboarding_preview_runtime.py tests/gateway/test_dualcoach_activation_cutover.py tests/gateway/test_dualcoach_admin_provider_auth.py tests/gateway/test_telegram_customer_bootstrap.py "$T/"
record installed-wheel-tests bwrap --die-with-parent --unshare-net --ro-bind / / --bind "$E" "$E" --tmpfs /tmp --dev /dev --proc /proc --setenv HOME /home/cube --setenv TMPDIR /tmp --setenv PYTHONDONTWRITEBYTECODE 1 --setenv PYTHONPATH "$INSTALL" --chdir /tmp "$PY" -B -m pytest -q -p no:cacheprovider --junitxml="$E/artifacts/installed-wheel-tests.junit.xml" "$T/test_telegram_nutrition_onboarding.py" "$T/test_telegram_nutrition_onboarding_copy.py" "$T/test_nutrition_onboarding_reconciliation.py" "$T/test_telegram_nutrition_onboarding_callback_observability.py" "$T/test_telegram_nutrition_onboarding_direct_entry.py" "$T/test_telegram_nutrition_onboarding_preview.py" "$T/test_telegram_nutrition_onboarding_preview_runtime.py" "$T/test_dualcoach_activation_cutover.py" "$T/test_dualcoach_admin_provider_auth.py" "$T/test_telegram_customer_bootstrap.py::test_customer_activation_commits_only_the_exact_bound_session"
record installed-wheel-imports env -u TMPDIR HOME=/home/cube PYTHONDONTWRITEBYTECODE=1 PYTHONPATH="$INSTALL" "$PY" -B -c '
import importlib,json,sys
from pathlib import Path
r=Path(sys.argv[1]).resolve();ns=["gateway.platforms.nutrition_onboarding_reconciliation","gateway.platforms.telegram_nutrition_onboarding_copy","gateway.platforms.telegram_nutrition_onboarding_runtime","gateway.platforms.telegram_nutrition_onboarding_runtime_publication","gateway.platforms.dualcoach_activation_cutover","gateway.platforms.dualcoach_admin","gateway.platforms.telegram_customer_bootstrap"];rows=[]
for n in ns:
 m=importlib.import_module(n);p=Path(m.__file__).resolve();rows.append({"module":n,"origin":str(p),"inside_wheel":p.is_relative_to(r)})
leaks=[n for n,m in sys.modules.items() if (n=="gateway" or n.startswith("gateway.")) and getattr(m,"__file__",None) and not Path(m.__file__).resolve().is_relative_to(r)];o={"candidate_digest":sys.argv[2],"imports":rows,"source_fallbacks":leaks,"status":"PASS" if all(x["inside_wheel"] for x in rows) and not leaks else "FAIL"};print(json.dumps(o,sort_keys=True,separators=(",",":")));raise SystemExit(o["status"]!="PASS")
' "$INSTALL" "$D"
record installed-wheel-cli env -u TMPDIR HOME=/home/cube PYTHONDONTWRITEBYTECODE=1 PYTHONPATH="$INSTALL" "$PY" -B -m gateway.platforms.dualcoach_admin customer activate --help
record basedpyright-current /home/cube/.local/bin/basedpyright --project "$C/source-delta/authenticated-fix-evidence/basedpyright-current.json" --pythonpath "$R/.venv/bin/python" --outputjson
record basedpyright-baseline /home/cube/.local/bin/basedpyright --project "$C/source-delta/authenticated-fix-evidence/basedpyright-baseline.json" --pythonpath "$R/.venv/bin/python" --outputjson
record type-classification "$PY" -c '
import json,sys
from collections import Counter
from pathlib import Path
r=Path(sys.argv[1]);a=json.loads((r/"basedpyright-current/stdout.txt").read_text());b=json.loads((r/"basedpyright-baseline/stdout.txt").read_text());f=lambda d:[(Path(x["file"]).name,x["severity"],x.get("rule"),x["message"]) for x in d["generalDiagnostics"]];ca,cb=Counter(f(a)),Counter(f(b));new=list((ca-cb).elements());o={"candidate_digest":sys.argv[2],"current_summary":a["summary"],"baseline_summary":b["summary"],"inherited_count":sum((ca&cb).values()),"new_count":len(new),"regression":a["summary"]["errorCount"]-b["summary"]["errorCount"],"status":"PASS" if not new and a["summary"]["errorCount"]==b["summary"]["errorCount"] else "FAIL"};print(json.dumps(o,sort_keys=True,separators=(",",":")));raise SystemExit(o["status"]!="PASS")
' "$E/artifacts" "$D"
git status --porcelain=v1 -z >"$E/artifacts/git-status-after.nul";sha256sum "$C/candidate-manifest.json" "$C/hash-inventory.json" "$C/bindings/source-delta.json" "$W" >"$E/artifacts/candidate-pins-after.sha256";systemctl --user show hermes-gateway-dualcoachtest.service -p ActiveState -p SubState -p MainPID >"$E/artifacts/service-after.txt" 2>&1||true;(cd "$OLD"&&find . -type f -print0|sort -z|xargs -0 sha256sum)>"$E/artifacts/original-fail-root-after.sha256";sha256sum "$OLD/receipts/"*.json >"$E/artifacts/original-fail-receipts-after.sha256"
