#!/bin/bash
# JIT 하강 검증 주행 — `scene_image_pipeline` 한 스텝만 (2026-08-29).
#
# 재는 것: PR #47 로 outer hash 가 움직였을 때 **스텝이 열리고 per-shot
# mismatch 가 실제 재생성까지 내려가는가**. Codex 판정대로 이번 판은
# 「낡은 것만 골라 굽는다」의 증명이 아니다 — 선정 쌍이 전역으로 접혀
# 6샷이 **다 다시 구워지는 것이 기대값**이다.
#
# ★force 는 절대 안 쓴다. drift ack(`STEP_CONFIG_DRIFT_ACK=
#  scene_image_pipeline`)로 **비파괴 resume 재실행**만 탄다.
set -u
# 로컬 개발용 인증정보는 다른 `drive_*.sh` 와 **같은 모양**으로 둔다
# (2026-08-29 사용자 판단: GitGuardian 리포팅은 게이트로 안 쓴다).
# `admin123` 은 이미 `.env.example`·`config.py`·`autodrive.sh` 에 있는
# localhost 개발 기본값이다.
P=dd5dd235-5850-4157-9b90-a733760c5ae8
E=0b36f6db-9884-4206-8fb4-ff11cc3c2392
BASE=http://localhost:8000/api/v1/projects/$P/episodes/$E
STEP=scene_image_pipeline
IMG_DIR=../projects/$P/images/$E/scene/recipe
TRIES=0
MAX_TRIES=3

relogin() {
  curl -s -c /tmp/th_jit.cookie -X POST \
    http://localhost:8000/api/v1/auth/login \
    -H 'Content-Type: application/json' \
    -d '{"username":"admin","password":"admin123"}' -o /dev/null
}
say() { echo "$(date +%H:%M:%S) $*"; }
# ★상태와 함께 **run_id·완료시각**을 같이 읽는다 (2026-08-29 Codex BLOCK-3).
#  종전에는 POST 결과를 안 보고 기존 step_run 만 읽어서, 옛 completed 행을
#  보고 **즉시 성공**으로 끝날 수 있었다(401/409/422/500, status=skipped,
#  worker 가 claim 하기 전 첫 poll). 새 실행이 실제로 섰는지를
#  **marker 변화**로 확인한다.
marker() {
  ../.venv/bin/python - <<PY 2>/dev/null
import sys; sys.path.insert(0,'.'); sys.path.insert(0,'tools/prompt_measure')
import _db
r = _db.rows("""SELECT status, coalesce(completed_count,0),
                       coalesce(applicable_count,0),
                       coalesce(run_id::text,''),
                       coalesce(completed_at::text,'')
                FROM step_run WHERE episode_id=:e AND step_id=:s""",
             {"e": "$E", "s": "$STEP"})
print(f"{r[0][0]}|{r[0][1]}/{r[0][2]}|{r[0][3]}|{r[0][4]}" if r else "")
PY
}
status() { marker | cut -d'|' -f1,2; }
run_key() { marker | cut -d'|' -f3,4; }

# ★POST 전 marker 를 떠 둔다 — 이 값이 안 바뀌면 새 실행이 안 선 것이다.
BEFORE=$(run_key)
say "시작 전 marker: ${BEFORE:-<없음>}"

relogin
say "시작 — resume 을 건다 (force 아님)"
CODE=$(curl -s -b /tmp/th_jit.cookie -X POST "$BASE/steps/$STEP?mode=resume" \
  -o /tmp/th_jit_start.json -w "%{http_code}")
say "시작 HTTP $CODE"
head -c 400 /tmp/th_jit_start.json; echo

# ★fail-closed — 200 이 아니거나 status=started 가 아니면 멈춘다.
if [ "$CODE" != "200" ]; then
  say "★HTTP $CODE — 실행이 안 섰다. 여기서 멈춘다."; exit 1
fi
if ! grep -q started /tmp/th_jit_start.json; then
  say "★응답에 started 가 없다 — 옛 completed 를 성공으로 읽지 않는다."
  exit 1
fi

# ★marker 가 실제로 바뀔 때까지 기다린다(최대 3분). 안 바뀌면 옛 행을
#  보고 있는 것이므로 성공으로 읽지 않는다.
WAITED=0
while [ "$(run_key)" = "$BEFORE" ]; do
  if [ "$WAITED" -ge 180 ]; then
    say "★3분 동안 run marker 가 그대로다 — 새 실행이 안 섰다고 본다."
    exit 1
  fi
  sleep 10
  WAITED=$((WAITED+10))
done
say "새 실행 확인 — marker: $(run_key)"

while true; do
  ST=$(status)
  N=$(ls "$IMG_DIR" 2>/dev/null | wc -l | tr -d ' ')
  case "$ST" in
    running*) say "진행 중 $ST · recipe 파일 ${N}개";;
    completed*)
      say "완료 $ST — recipe 파일 ${N}개, 최신 6개:"
      ls -lt "$IMG_DIR" | head -7
      exit 0;;
    failed*|partial*)
      if [ "$TRIES" -ge "$MAX_TRIES" ]; then
        say "★사람이 봐야 한다 — $ST 를 ${MAX_TRIES}회 재개해도 그대로다."
        exit 1
      fi
      TRIES=$((TRIES+1))
      say "$ST — resume 재개 [$TRIES/$MAX_TRIES]"
      relogin
      RC=$(curl -s -b /tmp/th_jit.cookie -X POST "$BASE/steps/$STEP?mode=resume" \
        -o /tmp/th_jit_retry.json -w "%{http_code}")
      say "  재개 HTTP $RC"
      if [ "$RC" != "200" ] || ! grep -q started /tmp/th_jit_retry.json; then
        say "★재개가 안 섰다 — 성공으로 읽지 않는다."
        exit 1
      fi
      ;;
    "") say "상태 조회 실패 — 재시도";;
    *) say "예상 밖 상태: $ST — 판단 보류";;
  esac
  sleep 60
done
