#!/usr/bin/env bash
# F1 runtime capture. Run from the checkout being measured after vp install.
# The devReplay todo-list argument selects a synthetic fixture, not a paid runtime model.
set -euo pipefail
: "${SCRATCH:?Set SCRATCH to a new timestamped directory under /tmp/lead-33752-r1/capture}"
: "${SIDE:?Set SIDE to before or after}"
: "${EXPECTED_SHA:?Set EXPECTED_SHA to the full checkout commit}"
SCRIPT_DIR=$(cd -- "$(dirname -- "$0")" && pwd)
CHECKOUT=$(pwd)
[[ "$SCRATCH" == /tmp/lead-33752-r1/capture/* && ! -e "$SCRATCH" ]]
mkdir -p "$SCRATCH"
exec > >(tee "$SCRATCH/transcript-$SIDE.txt") 2>&1
printf 'F1 runtime provenance (%s)\n' "$SIDE"
printf '$ git rev-parse HEAD\n'
git rev-parse HEAD
[[ "$(git rev-parse HEAD)" == "$EXPECTED_SHA" ]]
printf '$ git status --short\n'
STATUS=$(git status --short)
printf '%s\n' "${STATUS:-(empty; clean)}"
[[ -z "$STATUS" ]]
printf '$ date -u +%%Y-%%m-%%dT%%H:%%M:%%SZ\n'
date -u +%Y-%m-%dT%H:%M:%SZ
printf '$ uname -srm\n'; uname -srm
printf '$ node --version\n'; node --version
printf 'provider: devReplay; synthetic replay fixture: todo-list\n'
printf 'checkout: %s\n' "$CHECKOUT"
printf 'driver and summarizer SHA256:\n'
sha256sum "$SCRIPT_DIR/repro-33744.sh" "$SCRIPT_DIR/summarize-33744.py"
printf 'invocation: SCRATCH=%q SIDE=%q EXPECTED_SHA=%q bash %q\n' "$SCRATCH" "$SIDE" "$EXPECTED_SHA" "$SCRIPT_DIR/repro-33744.sh"
if [[ "$SIDE" == after ]]; then
  printf '$ git diff 1f5a47f677 1b4299410a -- apps/server/src/orchestration-v2/ThreadPullRequestService.ts\n'
  DIFF=$(git diff 1f5a47f677 1b4299410a -- apps/server/src/orchestration-v2/ThreadPullRequestService.ts)
  printf '%s\n' "${DIFF:-(empty)}"
  [[ -z "$DIFF" ]]
fi
printf 'Fresh home: %s/t3-home (absent before this run; created by this checkout server)\n' "$SCRATCH"
[[ ! -e "$SCRATCH/t3-home" ]]
printf 'Commands below are the executed fixture/server/CLI/capture commands. Raw server and CLI logs remain local.\n'
run() { printf '$'; printf ' %q' "$@"; printf '\n'; "$@"; }
mkdir -p "$SCRATCH/fixture-repo"
cd "$SCRATCH/fixture-repo"
run git init -q -b main
printf '$ echo hi > README.md\n'; echo hi > README.md
run git add .
run git -c user.email=r@example.com -c user.name=r commit -qm init
run git remote add origin https://github.com/pingdotgg/t3code.git
run git remote get-url origin
cd "$CHECKOUT"
printf '$ T3CODE_DEV_SEED=0 setsid vp run dev --home-dir %q > %q 2>&1 &\n' "$SCRATCH/t3-home" "$SCRATCH/dev.log"
T3CODE_DEV_SEED=0 setsid vp run dev --home-dir "$SCRATCH/t3-home" > "$SCRATCH/dev.log" 2>&1 & DEV=$!
printf 'Spawned dev process/session PID: %s\n' "$DEV"
cleanup() {
  if [[ -n "${DEV:-}" ]]; then
    printf '$ kill -- -%s (captured dev process group)\n' "$DEV"
    kill -- -"$DEV" 2>/dev/null || true
    wait "$DEV" 2>/dev/null || true
    DEV=
  fi
}
trap cleanup EXIT
PORT=
for ((i=0;i<180;i++)); do
  PORT=$(sed -nE 's/.*\[dev-runner\].*serverPort=([0-9]+).*/\1/p' "$SCRATCH/dev.log" | head -1)
  if [[ -n "$PORT" ]] && ss -H -ltn "sport = :$PORT" | grep -q .; then break; fi
  kill -0 "$DEV"
  sleep 1
done
[[ -n "$PORT" ]] && ss -H -ltn "sport = :$PORT" | grep -q .
sed -n 's/.*\(\[dev-runner\].*\)/\1/p' "$SCRATCH/dev.log" | head -1
printf 'Readiness: wait for server-published userdata/server-runtime.json before the live project CLI.\n'
for ((i=0;i<180;i++)); do
  if [[ -s "$SCRATCH/t3-home/userdata/server-runtime.json" ]]; then break; fi
  kill -0 "$DEV"
  sleep 1
done
[[ -s "$SCRATCH/t3-home/userdata/server-runtime.json" ]]
printf '$ curl --max-time 60 -s -o /dev/null http://127.0.0.1:%s/api/projects\n' "$PORT"
curl --max-time 60 -s -o /dev/null "http://127.0.0.1:$PORT/api/projects"
printf '$ node apps/server/src/bin.ts project add --base-dir %q %q > %q\n' "$SCRATCH/t3-home" "$SCRATCH/fixture-repo" "$SCRATCH/project-add.txt"
node apps/server/src/bin.ts project add --base-dir "$SCRATCH/t3-home" "$SCRATCH/fixture-repo" > "$SCRATCH/project-add.txt" 2>&1
PROJECT=$(grep -oE '[0-9a-f-]{36}' "$SCRATCH/project-add.txt" | head -1)
printf 'Created synthetic project: %s\n' "$PROJECT"
TRACE="$SCRATCH/t3-home/userdata/logs/server.trace.ndjson"
START=$(wc -l < "$TRACE")
BRANCH="t3/repro-33744-$(date +%s)"
printf '$ node apps/server/src/bin.ts thread start --base-dir %q --provider devReplay --model todo-list --worktree main --branch %q --wait --json %q go > %q\n' "$SCRATCH/t3-home" "$BRANCH" "$PROJECT" "$SCRATCH/thread-start.json"
node apps/server/src/bin.ts thread start --base-dir "$SCRATCH/t3-home" --provider devReplay --model todo-list --worktree main --branch "$BRANCH" --wait --json "$PROJECT" go > "$SCRATCH/thread-start.json" 2>&1
printf 'thread start --wait: exit 0 (terminal completion)\n'
python3 - "$SCRATCH/thread-start.json" <<'PY'
import json, sys
for line in open(sys.argv[1]):
    try: value = json.loads(line)
    except ValueError: continue
    if isinstance(value, dict):
        print('CLI result (identity/status fields only): ' + json.dumps({k: value[k] for k in ('threadId','projectId','runId','status') if k in value}))
PY
printf '$ sleep 15 # original driver post-turn observation window; not a worker-drain assertion\n'
sleep 15
printf '$ tail -n +%s %q > %q\n' "$((START + 1))" "$TRACE" "$SCRATCH/trace-turn.ndjson"
tail -n +$((START + 1)) "$TRACE" > "$SCRATCH/trace-turn.ndjson"
cleanup
printf '$ python3 %q %q\n' "$SCRIPT_DIR/summarize-33744.py" "$SCRATCH/trace-turn.ndjson"
python3 "$SCRIPT_DIR/summarize-33744.py" "$SCRATCH/trace-turn.ndjson"
printf '$ git rev-parse HEAD\n'; git rev-parse HEAD
printf '$ git status --short\n'
STATUS=$(git status --short)
printf '%s\n' "${STATUS:-(empty; clean)}"
[[ -z "$STATUS" ]]
printf 'F1 capture complete.\n'
