#!/bin/bash
# pre_dispatch_divergence_guard.sh — task-2700 dispatch 전 pre-flight 게이트.
#
# 목적 (회장 verbatim 1,2,6): dispatch.py 코어를 변경하지 않고 dispatch 직전에
#   (1) local main ↔ origin/main divergence 측정 + fail-closed HOLD 판정
#   (2) main dirty snapshot 을 dispatch phase 로 registry JSONL 에 기록
# 을 수행하는 외부 pre-flight 진입점. dispatch wrapper / hook 이 이 스크립트를
# 호출하도록 연결한다(라이브 dispatch 경로 연결은 회장 승인 필요 — HOLD_FOR_CHAIR).
#
# 사용법:
#   pre_dispatch_divergence_guard.sh <task_id> [task_kind] [repo_root]
#   task_kind 기본 "coding"(게이트 대상). repo_root 기본 /home/jay/workspace.
#
# 종료 코드:
#   0 — PASS (dispatch 진행 가능)
#   3 — HOLD (divergence 또는 측정 실패 — fail-closed, dispatch 중단 권고)
#   2 — 사용법 오류
#
# ★ bypass flag 없음(fail-closed 불변). divergence 시 HOLD 우회 수단 미제공.

set -uo pipefail

if [ $# -lt 1 ]; then
    echo "[pre-dispatch] ERROR: 사용법: pre_dispatch_divergence_guard.sh <task_id> [task_kind] [repo_root]" >&2
    exit 2
fi

TASK_ID="$1"
TASK_KIND="${2:-coding}"
REPO_ROOT="${3:-/home/jay/workspace}"
EVENTS_DIR="${REPO_ROOT}/memory/events"
CAP_DIR="${REPO_ROOT}/memory/capabilities"
REGISTRY="${REPO_ROOT}/memory/logs/dirty-registry.jsonl"

# ── 1) dispatch 전 main dirty snapshot 기록 (요구 6,7) ──────────────────────
# 실패해도 게이트 자체는 계속(스냅샷은 관측용). registry 기록.
python3 "${REPO_ROOT}/utils/dirty_registry.py" \
    --repo-root "$REPO_ROOT" \
    --task-id "$TASK_ID" \
    --registry "$REGISTRY" \
    --phase dispatch \
    --capabilities-dir "$CAP_DIR" >/dev/null 2>&1 || \
    echo "[pre-dispatch] WARN: dirty snapshot 기록 실패(계속 진행)" >&2

# ── 2) divergence 측정 + fail-closed HOLD 판정 (요구 1,2) ───────────────────
# divergence_guard CLI: exit 0=PASS, exit 3=HOLD. events-dir 지정 시 HOLD 마커 기록.
python3 "${REPO_ROOT}/utils/divergence_guard.py" \
    --repo-root "$REPO_ROOT" \
    --task-id "$TASK_ID" \
    --task-kind "$TASK_KIND" \
    --remote-ref origin/main \
    --fetch \
    --events-dir "$EVENTS_DIR"
GUARD_EXIT=$?

if [ "$GUARD_EXIT" -eq 3 ]; then
    echo "[pre-dispatch] HOLD: $TASK_ID ($TASK_KIND) — local main divergence 또는 측정 실패(fail-closed). dispatch 중단 권고. 마커: $EVENTS_DIR/${TASK_ID}.divergence-hold.json" >&2
    exit 3
elif [ "$GUARD_EXIT" -ne 0 ]; then
    # 예기치 못한 종료도 fail-closed 로 처리
    echo "[pre-dispatch] HOLD: divergence_guard 비정상 종료(exit $GUARD_EXIT) — fail-closed." >&2
    exit 3
fi

echo "[pre-dispatch] PASS: $TASK_ID ($TASK_KIND) — main == origin/main. dispatch 진행 가능."
exit 0
