#!/usr/bin/env bash
# 5.2f L3 Codex 본체. 에이전트가 Bash 도구의 run_in_background 로 띄운다 (nohup·& 금지, 메모 mccp-l3-detached).
# 초점문: $MCCP_TMP/l3-focus.txt 가 있으면 그것, 없으면 기본 문장. 발사 직후 exec 로 node 가 이 프로세스를 대체한다.
# l3-pid 는 node 의 pid 다. 결과 판정은 l3-poll.sh 가 한다.
# exit 12 = mode.json 해석 불가 (5.2f Step 0)
set -euo pipefail
source "$(dirname "$0")/env.sh" "${1:-}"

FIRES_L3="$(jread "$STATE/mode.json" 'j.fires&&j.fires.l3?1:0' -1)"
if [ "$FIRES_L3" = -1 ]; then
  record_stop 5.2f
  echo "HALT_STAGE=5.2f"; echo "mode.json 해석 불가: L3 발사 여부를 알 수 없다. 5.2 를 다시 돈다."; exit 12
fi
if [ "$FIRES_L3" != 1 ]; then
  printf '{"invoked":false,"reason":"MCCP_PLAN_REVIEW_L3=0 — L3 disabled by policy"}\n' > "$STATE/l3.json"
  echo "L3_LAUNCH=skipped"; exit 0
fi

FOCUS_FILE="$MCCP_TMP/l3-focus.txt"
if [ -s "$FOCUS_FILE" ]; then
  L3_FOCUS="$(cat "$FOCUS_FILE")"
else
  L3_FOCUS="challenge the following plan decisions: $PLAN_REL 의 핵심 결정 1-3개"
fi

IMP=()
if node -e '
  const honored = require(process.argv[1] + "/scripts/lib/env-contract/value").parseBool(process.env, "MCCP_CODEX_DESIGN_SCOPE_HONOR");
  const detect = require(process.argv[1] + "/scripts/lib/impeccable-detect");
  process.exit(honored && detect.probeSkillAvailable({}) ? 0 : 1);
' "$PLUGIN" 2>/dev/null; then
  IMP=(--impeccable-available)
fi

# 논스·마감은 파일에 쓴다. 이 블록이 끝나도 poll 이 같은 값을 읽도록 (메모 mccp-hybrid-plan-gate-run-gotchas 2).
RUN_NONCE="$(node -e 'process.stdout.write(require("crypto").randomUUID())')"
printf '%s' "$RUN_NONCE" > "$STATE/l3-run-nonce"
node -e 'process.stdout.write(String(Math.floor(Date.now()/1000)+1000))' > "$STATE/l3-deadline"
rm -f "$STATE/l3.json" "$STATE/l3-findings.json"
printf '%s' "$$" > "$STATE/l3-pid"
echo "L3_LAUNCH=started nonce=$RUN_NONCE deadline_in=1000s"

exec node "$PLAN_NODE_CLI" l3 \
  --review-dir "$STATE" \
  --plan "$PLAN_REL" \
  --focus "$L3_FOCUS" \
  --run-nonce "$RUN_NONCE" \
  ${IMP[@]+"${IMP[@]}"} \
  > "$MCCP_TMP/l3-call.out" 2> "$MCCP_TMP/l3-call.err"
