#!/bin/sh
# Generated by tautline install-claude-launcher.
# tautline-launcher-template: 2
set -u
_tl_sunset_suppressed() {
  case "${TAUTLINE_SUPPRESS_SUNSET_WARNINGS:-${MINERVIT_SUPPRESS_SUNSET_WARNINGS:-}}" in
    ''|0) return 1 ;;
    *) return 0 ;;
  esac
}
_tl_sunset_warn() {
  # $1 legacy env, $2 tautline replacement, $3 pre-encoded family:legacy token
  _tl_sunset_suppressed && return 0
  case ",${TAUTLINE_SUNSET_SHELL_WARNED:-}," in
    *",$3,"*) return 0 ;;
  esac
  _tl_msg="deprecation_warning: $1 is deprecated and will be removed in 1.0; use $2"
  printf '%s\n' "$_tl_msg" >&2
  if [ -n "${TAUTLINE_SUNSET_SHELL_WARNED:-}" ]; then
    TAUTLINE_SUNSET_SHELL_WARNED="${TAUTLINE_SUNSET_SHELL_WARNED},$3"
  else
    TAUTLINE_SUNSET_SHELL_WARNED="$3"
  fi
  export TAUTLINE_SUNSET_SHELL_WARNED
}
MINERVIT_METHODOLOGY_REPO_PRESET="${TAUTLINE_METHODOLOGY_REPO:-${MINERVIT_METHODOLOGY_REPO:-}}"
if [ -z "${TAUTLINE_METHODOLOGY_REPO:-}" ] && [ -n "${MINERVIT_METHODOLOGY_REPO:-}" ]; then
  _tl_sunset_warn MINERVIT_METHODOLOGY_REPO TAUTLINE_METHODOLOGY_REPO 'env:MINERVIT_METHODOLOGY_REPO'
fi
MINERVIT_METHODOLOGY_REPO_ENV=""
LIVE_SNAPSHOT_STORE="${TAUTLINE_METHODOLOGY_SNAPSHOT_STORE:-${MINERVIT_METHODOLOGY_SNAPSHOT_STORE:-}}"
if [ -z "${TAUTLINE_METHODOLOGY_SNAPSHOT_STORE:-}" ] && [ -n "${MINERVIT_METHODOLOGY_SNAPSHOT_STORE:-}" ]; then
  _tl_sunset_warn MINERVIT_METHODOLOGY_SNAPSHOT_STORE TAUTLINE_METHODOLOGY_SNAPSHOT_STORE 'env:MINERVIT_METHODOLOGY_SNAPSHOT_STORE'
fi
LIVE_SNAPSHOT_DISABLED="${TAUTLINE_METHODOLOGY_DISABLE_SNAPSHOT_EXEC:-${MINERVIT_METHODOLOGY_DISABLE_SNAPSHOT_EXEC:-}}"
if [ -z "${TAUTLINE_METHODOLOGY_DISABLE_SNAPSHOT_EXEC:-}" ] && [ -n "${MINERVIT_METHODOLOGY_DISABLE_SNAPSHOT_EXEC:-}" ]; then
  _tl_sunset_warn MINERVIT_METHODOLOGY_DISABLE_SNAPSHOT_EXEC TAUTLINE_METHODOLOGY_DISABLE_SNAPSHOT_EXEC 'env:MINERVIT_METHODOLOGY_DISABLE_SNAPSHOT_EXEC'
fi
MAINTAINER_MODE_CONFIG="$HOME/.config/tautline/tautline.env"
[ -f "$MAINTAINER_MODE_CONFIG" ] || MAINTAINER_MODE_CONFIG="$HOME/.config/minervit/methodology.env"
launcher_maintainer_mode_value() {
  sed -n "s/^[[:space:]]*\(export[[:space:]]\{1,\}\)\{0,1\}$1=//p" \
    "$MAINTAINER_MODE_CONFIG" 2>/dev/null | tail -n 1 \
    | sed -e 's/#.*$//' -e 's/[[:space:]]*$//' \
      -e "s/^\([\"']\)\(.*\)\1\$/\2/" \
      -e 's/[[:space:]]*$//' -e 's/^[[:space:]]*//'
}
LAUNCHER_MAINTAINER_MODE="$(launcher_maintainer_mode_value TAUTLINE_METHODOLOGY_MAINTAINER_MODE)"
[ -n "$LAUNCHER_MAINTAINER_MODE" ] || LAUNCHER_MAINTAINER_MODE="$(launcher_maintainer_mode_value MINERVIT_METHODOLOGY_MAINTAINER_MODE)"
if [ -f "$HOME/.config/tautline/tautline.env" ]; then
  set +u
  . "$HOME/.config/tautline/tautline.env"
  set -u
  MINERVIT_METHODOLOGY_REPO_ENV="${TAUTLINE_METHODOLOGY_REPO:-${MINERVIT_METHODOLOGY_REPO:-}}"
elif [ -f "$HOME/.config/minervit/methodology.env" ]; then
  set +u
  . "$HOME/.config/minervit/methodology.env"
  set -u
  MINERVIT_METHODOLOGY_REPO_ENV="${TAUTLINE_METHODOLOGY_REPO:-${MINERVIT_METHODOLOGY_REPO:-}}"
  if [ -z "${TAUTLINE_METHODOLOGY_REPO:-}" ] && [ -n "${MINERVIT_METHODOLOGY_REPO:-}" ]; then
    _tl_sunset_warn MINERVIT_METHODOLOGY_REPO TAUTLINE_METHODOLOGY_REPO 'env:MINERVIT_METHODOLOGY_REPO'
  fi
fi
TL_METHODOLOGY_CLI="${TAUTLINE_METHODOLOGY_CLI:-}"
if [ -z "$TL_METHODOLOGY_CLI" ] && [ -n "${MINERVIT_METHODOLOGY_CLI:-}" ]; then
  TL_METHODOLOGY_CLI="$MINERVIT_METHODOLOGY_CLI"
  _tl_sunset_warn MINERVIT_METHODOLOGY_CLI TAUTLINE_METHODOLOGY_CLI 'env:MINERVIT_METHODOLOGY_CLI'
fi
TL_UPDATE_POLICY="${TAUTLINE_METHODOLOGY_UPDATE_POLICY:-}"
if [ -z "$TL_UPDATE_POLICY" ] && [ -n "${MINERVIT_METHODOLOGY_UPDATE_POLICY:-}" ]; then
  TL_UPDATE_POLICY="$MINERVIT_METHODOLOGY_UPDATE_POLICY"
  _tl_sunset_warn MINERVIT_METHODOLOGY_UPDATE_POLICY TAUTLINE_METHODOLOGY_UPDATE_POLICY 'env:MINERVIT_METHODOLOGY_UPDATE_POLICY'
fi
TL_DISABLE_AUTO_RESCUE="${TAUTLINE_METHODOLOGY_DISABLE_AUTO_RESCUE:-}"
if [ -z "$TL_DISABLE_AUTO_RESCUE" ] && [ -n "${MINERVIT_METHODOLOGY_DISABLE_AUTO_RESCUE:-}" ]; then
  TL_DISABLE_AUTO_RESCUE="$MINERVIT_METHODOLOGY_DISABLE_AUTO_RESCUE"
  _tl_sunset_warn MINERVIT_METHODOLOGY_DISABLE_AUTO_RESCUE TAUTLINE_METHODOLOGY_DISABLE_AUTO_RESCUE 'env:MINERVIT_METHODOLOGY_DISABLE_AUTO_RESCUE'
fi
TL_RESCUE_STATE_DIR="${TAUTLINE_METHODOLOGY_RESCUE_STATE_DIR:-}"
if [ -z "$TL_RESCUE_STATE_DIR" ] && [ -n "${MINERVIT_METHODOLOGY_RESCUE_STATE_DIR:-}" ]; then
  TL_RESCUE_STATE_DIR="$MINERVIT_METHODOLOGY_RESCUE_STATE_DIR"
  _tl_sunset_warn MINERVIT_METHODOLOGY_RESCUE_STATE_DIR TAUTLINE_METHODOLOGY_RESCUE_STATE_DIR 'env:MINERVIT_METHODOLOGY_RESCUE_STATE_DIR'
fi
TL_SHOW_GOAL_PROMPT="${TAUTLINE_SHOW_GOAL_PROMPT:-}"
if [ -z "$TL_SHOW_GOAL_PROMPT" ] && [ -n "${MINERVIT_SHOW_GOAL_PROMPT:-}" ]; then
  TL_SHOW_GOAL_PROMPT="$MINERVIT_SHOW_GOAL_PROMPT"
  _tl_sunset_warn MINERVIT_SHOW_GOAL_PROMPT TAUTLINE_SHOW_GOAL_PROMPT 'env:MINERVIT_SHOW_GOAL_PROMPT'
fi
TL_AUTOCOMPACT_PCT="${TAUTLINE_CLAUDE_AUTOCOMPACT_PCT:-}"
if [ -z "$TL_AUTOCOMPACT_PCT" ] && [ -n "${MINERVIT_CLAUDE_AUTOCOMPACT_PCT:-}" ]; then
  TL_AUTOCOMPACT_PCT="$MINERVIT_CLAUDE_AUTOCOMPACT_PCT"
  _tl_sunset_warn MINERVIT_CLAUDE_AUTOCOMPACT_PCT TAUTLINE_CLAUDE_AUTOCOMPACT_PCT 'env:MINERVIT_CLAUDE_AUTOCOMPACT_PCT'
fi
SNAPSHOT_STORE="${LIVE_SNAPSHOT_STORE:-${TAUTLINE_METHODOLOGY_SNAPSHOT_STORE:-${MINERVIT_METHODOLOGY_SNAPSHOT_STORE:-}}}"
SNAPSHOT_DISABLED="${LIVE_SNAPSHOT_DISABLED:-${TAUTLINE_METHODOLOGY_DISABLE_SNAPSHOT_EXEC:-${MINERVIT_METHODOLOGY_DISABLE_SNAPSHOT_EXEC:-0}}}"
if [ "$SNAPSHOT_DISABLED" = "1" ]; then
  SNAPSHOT_STORE=""
fi
unset MINERVIT_METHODOLOGY_EXEC_ROOT || true
MINERVIT_METHODOLOGY_UPDATE_POLICY_EFFECTIVE="${TL_UPDATE_POLICY:-warn}"
case "$MINERVIT_METHODOLOGY_UPDATE_POLICY_EFFECTIVE" in
  pinned|signed) ;;
  *)
    printf "%s\n" "minervit-claude: refusing --dangerously-skip-permissions while methodology update policy is $MINERVIT_METHODOLOGY_UPDATE_POLICY_EFFECTIVE (need pinned or signed; see SECURITY.md)" >&2
    exit 1
    ;;
esac
launcher_resolve_methodology_repo() {
  # sec-trust-exec-3: operator-controlled sources beat hijackable cwd discovery.
  if [ -n "$MINERVIT_METHODOLOGY_REPO_PRESET" ] && { [ -x "$MINERVIT_METHODOLOGY_REPO_PRESET/bin/tautline" ] || [ -x "$MINERVIT_METHODOLOGY_REPO_PRESET/bin/minervit-methodology" ]; }; then
    printf "%s\n" "$MINERVIT_METHODOLOGY_REPO_PRESET"
    return 0
  fi
  if [ -n "$MINERVIT_METHODOLOGY_REPO_ENV" ] && { [ -x "$MINERVIT_METHODOLOGY_REPO_ENV/bin/tautline" ] || [ -x "$MINERVIT_METHODOLOGY_REPO_ENV/bin/minervit-methodology" ]; }; then
    printf "%s\n" "$MINERVIT_METHODOLOGY_REPO_ENV"
    return 0
  fi
  search_dir="$(pwd -P 2>/dev/null || pwd)"
  while [ -n "$search_dir" ]; do
    candidate="$search_dir/tautline"
    if [ ! -x "$candidate/bin/tautline" ] && [ ! -x "$candidate/bin/minervit-methodology" ]; then
      candidate="$search_dir/minervit-ai-delivery-methodology"
    fi
    if [ -x "$candidate/bin/tautline" ] || [ -x "$candidate/bin/minervit-methodology" ]; then
      printf "%s\n" "minervit-methodology: WARNING resolved via cwd discovery ($candidate); set MINERVIT_METHODOLOGY_REPO to a trusted checkout." >&2
      printf "%s\n" "$candidate"
      return 0
    fi
    [ "$search_dir" != "/" ] || break
    next_dir="$(dirname "$search_dir")"
    [ "$next_dir" != "$search_dir" ] || break
    search_dir="$next_dir"
  done
  printf '%s\n' ''
}
MINERVIT_METHODOLOGY_REPO="$(launcher_resolve_methodology_repo)"
export MINERVIT_METHODOLOGY_REPO
# Normalize BOTH families to the gated checkout (Codex 0.9.2 R1 P1): the sourced env file
# exported its own TAUTLINE_METHODOLOGY_REPO; children prefer TAUTLINE_*, so a stale value
# here would gate one checkout and execute another.
TAUTLINE_METHODOLOGY_REPO="$MINERVIT_METHODOLOGY_REPO"
export TAUTLINE_METHODOLOGY_REPO
MINERVIT_CLAUDE_AUTOCOMPACT_PCT="${TL_AUTOCOMPACT_PCT:-85}"
case "$MINERVIT_CLAUDE_AUTOCOMPACT_PCT" in
  ''|*[!0-9]*)
    MINERVIT_CLAUDE_AUTOCOMPACT_PCT=85
    ;;
esac
TAUTLINE_CLAUDE_AUTOCOMPACT_PCT="$MINERVIT_CLAUDE_AUTOCOMPACT_PCT"
export TAUTLINE_CLAUDE_AUTOCOMPACT_PCT
if [ "$MINERVIT_CLAUDE_AUTOCOMPACT_PCT" -lt 1 ] || [ "$MINERVIT_CLAUDE_AUTOCOMPACT_PCT" -gt 100 ]; then
  MINERVIT_CLAUDE_AUTOCOMPACT_PCT=85
fi
CLAUDE_AUTOCOMPACT_PCT_OVERRIDE="$MINERVIT_CLAUDE_AUTOCOMPACT_PCT"
export CLAUDE_AUTOCOMPACT_PCT_OVERRIDE
MINERVIT_CLAUDE_AUTOCOMPACT_REQUIRED=1
export MINERVIT_CLAUDE_AUTOCOMPACT_REQUIRED
TAUTLINE_CLAUDE_AUTOCOMPACT_REQUIRED="$MINERVIT_CLAUDE_AUTOCOMPACT_REQUIRED"
export TAUTLINE_CLAUDE_AUTOCOMPACT_REQUIRED
printf '%s\n' "claude_autocompact_pct_override: $CLAUDE_AUTOCOMPACT_PCT_OVERRIDE"
METHODOLOGY_CLI_PRESET="${TL_METHODOLOGY_CLI:-}"
METHODOLOGY_CLI="$METHODOLOGY_CLI_PRESET"
if [ -z "$METHODOLOGY_CLI" ] && [ -n "$SNAPSHOT_STORE" ] && [ -x "$SNAPSHOT_STORE/current/bin/tautline" ]; then
  METHODOLOGY_CLI="$SNAPSHOT_STORE/current/bin/tautline"
fi
if [ -z "$METHODOLOGY_CLI" ]; then
  if command -v tautline >/dev/null 2>&1; then
    METHODOLOGY_CLI="$(command -v tautline)"
  elif command -v minervit-methodology >/dev/null 2>&1; then
    METHODOLOGY_CLI="$(command -v minervit-methodology)"
  elif [ -n "${MINERVIT_METHODOLOGY_REPO:-}" ]; then
    if [ ! -x "$MINERVIT_METHODOLOGY_REPO/bin/tautline" ] && [ ! -x "$MINERVIT_METHODOLOGY_REPO/bin/minervit-methodology" ]; then
      printf '%s\n' 'methodology env is missing MINERVIT_METHODOLOGY_REPO; rerun <methodology_repo>/bin/tautline install-cli' >&2
      exit 1
    fi
    if [ -x "$MINERVIT_METHODOLOGY_REPO/bin/tautline" ]; then
      METHODOLOGY_CLI="$MINERVIT_METHODOLOGY_REPO/bin/tautline"
    else
      METHODOLOGY_CLI="$MINERVIT_METHODOLOGY_REPO/bin/minervit-methodology"
    fi
  else
    printf '%s\n' 'methodology CLI not installed; run <methodology_repo>/bin/minervit-methodology install-cli' >&2
    exit 1
  fi
fi
METHODOLOGY_REPO="${MINERVIT_METHODOLOGY_REPO:-}"
METHODOLOGY_INSIDE_REPO=0
if [ -n "$METHODOLOGY_REPO" ] && [ -d "$METHODOLOGY_REPO/.git" ]; then
  repo_real_for_guard="$(cd "$METHODOLOGY_REPO" 2>/dev/null && pwd -P || true)"
  cwd_real_for_guard="$(pwd -P 2>/dev/null || pwd)"
  if [ -n "$repo_real_for_guard" ]; then
    case "$cwd_real_for_guard/" in "$repo_real_for_guard"/*) METHODOLOGY_INSIDE_REPO=1 ;; esac
  fi
fi
launcher_auto_rescue_methodology_repo() {
  repo=$1
  [ -n "$repo" ] || return 0
  [ -d "$repo/.git" ] || return 0
  [ "${TL_DISABLE_AUTO_RESCUE:-0}" != "1" ] || return 0
  [ "$LAUNCHER_MAINTAINER_MODE" != "1" ] || return 0
  repo_real="$(cd "$repo" 2>/dev/null && pwd -P || true)"
  [ -n "$repo_real" ] || return 0
  [ "${METHODOLOGY_INSIDE_REPO:-0}" != "1" ] || return 0
  launcher_update_policy="${TL_UPDATE_POLICY:-warn}"
  case "$launcher_update_policy" in
    pinned|signed)
      launcher_dirty_probe="$(git -C "$repo_real" status --porcelain 2>/dev/null || true)"
      launcher_branch_probe="$(git -C "$repo_real" rev-parse --abbrev-ref HEAD 2>/dev/null || true)"
      if [ -n "$launcher_dirty_probe" ] || [ "$launcher_branch_probe" != "main" ]; then
        printf '%s\n' "methodology_update: launcher shell auto-rescue skipped under update policy $launcher_update_policy; sync-methodology performs the trust-gated rescue (verify-before-advance). If sync fails, review upstream and run update-repin, or run repair-methodology-main manually." >&2
      fi
      return 0
      ;;
  esac
  git -C "$repo_real" fetch origin main --quiet >/dev/null 2>&1 || return 0
  remote_head="$(git -C "$repo_real" rev-parse origin/main 2>/dev/null || true)"
  current_head="$(git -C "$repo_real" rev-parse HEAD 2>/dev/null || true)"
  [ -n "$remote_head" ] && [ -n "$current_head" ] || return 0
  dirty="$(git -C "$repo_real" status --porcelain 2>/dev/null || true)"
  current_branch="$(git -C "$repo_real" rev-parse --abbrev-ref HEAD 2>/dev/null || true)"
  LAUNCHER_MAIN_PRESERVE_DETAIL=
  LAUNCHER_PRIVATE_ADAPTER_DETAIL=
  LAUNCHER_PRIVATE_ADAPTER_DIR=
  launcher_preserve_main_before_reset() {
    main_head="$(git -C "$repo_real" rev-parse refs/heads/main 2>/dev/null || true)"
    [ -n "$main_head" ] || return 0
    [ "$main_head" != "$remote_head" ] || return 0
    # Preserve only when local main has commits origin/main does not. A main merely behind
    # (an ancestor of origin/main) has nothing to rescue, so creating a rescue ref is pure
    # pollution that trips rescue-ref drift detection (RCA: non-main auto-rescue phantom ref).
    if git -C "$repo_real" merge-base --is-ancestor refs/heads/main "$remote_head" >/dev/null 2>&1; then
      return 0
    fi
    main_short="$(git -C "$repo_real" rev-parse --short refs/heads/main 2>/dev/null || printf main)"
    main_stamp="$(date -u +%Y%m%dT%H%M%SZ)"
    main_rescue_branch="tautline-local-rescue/${main_stamp}-$$-launcher-main-${main_short}"
    git -C "$repo_real" branch "$main_rescue_branch" refs/heads/main >/dev/null 2>&1 || {
      printf '%s\n' "methodology_update: failed - launcher could not preserve prior methodology main in $repo_real" >&2
      return 1
    }
    LAUNCHER_MAIN_PRESERVE_DETAIL="; preserved prior main at $main_rescue_branch"
  }
  launcher_preserve_private_adapters_before_reset() {
    public_example_adapter="example""-saas"
    private_paths="$(git -C "$repo_real" ls-files adapters/projects/*.json 2>/dev/null | grep -Ev "^adapters/projects/(${public_example_adapter}|\.bootstrap-legacy-allowlist)\.json$" || true)"
    [ -n "$private_paths" ] || return 0
    rescue_root="${TL_RESCUE_STATE_DIR:-$HOME/.local/state/tautline/methodology-rescue}"
    adapter_stamp="$(date -u +%Y%m%dT%H%M%SZ)"
    LAUNCHER_PRIVATE_ADAPTER_DIR="$rescue_root/private-adapters/${adapter_stamp}-$$-launcher"
    printf "%s\n" "$private_paths" | while IFS= read -r rel; do
      [ -n "$rel" ] || continue
      [ -f "$repo_real/$rel" ] || continue
      mkdir -p "$LAUNCHER_PRIVATE_ADAPTER_DIR/$(dirname "$rel")" || exit 1
      cp -p "$repo_real/$rel" "$LAUNCHER_PRIVATE_ADAPTER_DIR/$rel" || exit 1
    done || {
      printf '%s\n' "methodology_update: failed - launcher could not preserve private source adapters in $repo_real" >&2
      return 1
    }
    LAUNCHER_PRIVATE_ADAPTER_DETAIL="; preserved private source adapters at $LAUNCHER_PRIVATE_ADAPTER_DIR"
  }
  launcher_restore_private_adapters_after_reset() {
    [ -n "$LAUNCHER_PRIVATE_ADAPTER_DIR" ] || return 0
    [ -d "$LAUNCHER_PRIVATE_ADAPTER_DIR/adapters/projects" ] || return 0
    find "$LAUNCHER_PRIVATE_ADAPTER_DIR/adapters/projects" -type f -name "*.json" | while IFS= read -r source; do
      rel="${source#$LAUNCHER_PRIVATE_ADAPTER_DIR/}"
      [ -n "$rel" ] || continue
      [ ! -e "$repo_real/$rel" ] || continue
      mkdir -p "$repo_real/$(dirname "$rel")" || exit 1
      cp -p "$source" "$repo_real/$rel" || exit 1
    done || {
      printf '%s\n' "methodology_update: failed - launcher could not restore private source adapters in $repo_real from $LAUNCHER_PRIVATE_ADAPTER_DIR" >&2
      return 1
    }
  }
  if [ -z "$dirty" ] && [ "$current_branch" != "main" ] && [ "$current_branch" != "HEAD" ]; then
    launcher_preserve_main_before_reset || return 1
    launcher_preserve_private_adapters_before_reset || return 1
    git -C "$repo_real" checkout main >/dev/null 2>&1 || git -C "$repo_real" checkout -b main origin/main >/dev/null 2>&1 || {
      printf '%s\n' "methodology_update: failed - launcher could not switch methodology checkout to main in $repo_real" >&2
      return 1
    }
    git -C "$repo_real" reset --hard origin/main >/dev/null 2>&1 || {
      printf '%s\n' "methodology_update: failed - launcher could not reset methodology main to origin/main in $repo_real" >&2
      return 1
    }
    launcher_restore_private_adapters_after_reset || return 1
    printf '%s\n' "methodology_update: launcher_auto_rescue - switched clean methodology checkout from non-release branch $current_branch to main at origin/main$LAUNCHER_MAIN_PRESERVE_DETAIL$LAUNCHER_PRIVATE_ADAPTER_DETAIL"
    return 0
  fi
  [ "$current_head" != "$remote_head" ] || return 0
  needs_rescue=0
  [ -n "$dirty" ] && needs_rescue=1
  [ "$current_branch" != "main" ] && needs_rescue=1
  if ! git -C "$repo_real" merge-base --is-ancestor "$current_head" "$remote_head" >/dev/null 2>&1; then
    needs_rescue=1
  fi
  [ "$needs_rescue" = "1" ] || return 0
  stamp="$(date -u +%Y%m%dT%H%M%SZ)"
  rescue_branch="tautline-local-rescue/${stamp}-$$-launcher"
  if ! git -C "$repo_real" checkout -b "$rescue_branch" >/dev/null 2>&1; then
    printf '%s\n' "methodology_update: failed - launcher could not create rescue branch in $repo_real" >&2
    return 1
  fi
  git -C "$repo_real" add -A >/dev/null 2>&1 || {
    printf '%s\n' "methodology_update: failed - launcher could not stage local methodology changes in $repo_real" >&2
    return 1
  }
  if ! git -C "$repo_real" diff --cached --quiet --exit-code >/dev/null 2>&1; then
    git -C "$repo_real" -c user.name="Minervit Launcher" -c user.email="launcher@minervit.invalid" commit -m "rescue local methodology changes before launcher sync" >/dev/null 2>&1 || {
      printf '%s\n' "methodology_update: failed - launcher could not commit rescued local methodology changes in $repo_real; changes are staged on $rescue_branch" >&2
      return 1
    }
  fi
  launcher_preserve_main_before_reset || return 1
  launcher_preserve_private_adapters_before_reset || return 1
  git -C "$repo_real" checkout main >/dev/null 2>&1 || git -C "$repo_real" checkout -b main origin/main >/dev/null 2>&1 || {
    printf '%s\n' "methodology_update: failed - launcher could not switch methodology checkout to main in $repo_real" >&2
    return 1
  }
  git -C "$repo_real" reset --hard origin/main >/dev/null 2>&1 || {
    printf '%s\n' "methodology_update: failed - launcher could not reset methodology main to origin/main in $repo_real" >&2
    return 1
  }
  launcher_restore_private_adapters_after_reset || return 1
  printf '%s\n' "methodology_update: launcher_auto_rescue - preserved local methodology checkout on $rescue_branch and reset main to origin/main$LAUNCHER_MAIN_PRESERVE_DETAIL$LAUNCHER_PRIVATE_ADAPTER_DETAIL"
}
# No dead ends (operator directive 2026-07-11): every gate failure prints its exact
# remedy, and an interactive launch starts a Claude repair session instead of stranding
# the operator. Set TAUTLINE_NO_REPAIR_SESSION=1 (or MINERVIT_NO_REPAIR_SESSION=1) to
# print the remedy and exit 1 without the repair session.
launcher_gate_repair() {
  stage="$1"
  remedy="$2"
  printf '%s\n' "launch gate failed: $stage" >&2
  printf '%s\n' "remedy: $remedy" >&2
  no_repair="${TAUTLINE_NO_REPAIR_SESSION:-${MINERVIT_NO_REPAIR_SESSION:-0}}"
  if [ -z "${TAUTLINE_NO_REPAIR_SESSION:-}" ] && [ -n "${MINERVIT_NO_REPAIR_SESSION:-}" ]; then
    _tl_sunset_warn MINERVIT_NO_REPAIR_SESSION TAUTLINE_NO_REPAIR_SESSION 'env:MINERVIT_NO_REPAIR_SESSION'
  fi
  if [ -t 0 ] && [ -t 1 ] && [ "$no_repair" != "1" ]; then
    printf '%s\n' 'starting a Claude repair session (set TAUTLINE_NO_REPAIR_SESSION=1 to disable)...' >&2
    exec claude --dangerously-skip-permissions "Launch gate '$stage' failed on this machine. Fix it now: $remedy Re-run the failed command until it exits 0, then tell the operator to relaunch. Do not bypass gates: --no-verify pushes and gate relaxation are operator break-glass decisions - if one is genuinely required, declare a blocker (blocker-declare) and stop with a report."
  fi
  exit 1
}
# The remedy defers to sync-methodology's own failure-specific guidance (pin holds name
# update-repin, signed-policy rejections name signature repair per SECURITY.md, rescue
# failures name the wedged state) -- a static repin hint would mislead non-pin failures
# and could loop the repair session (Codex 0.9.1 R1 P2).
SYNC_REMEDY="in $METHODOLOGY_REPO run 'tautline sync-methodology --auto-rescue-local-changes' and follow the failure-specific remedy it prints alongside the error; if the same remedy fails twice, stop and declare a blocker with the exact output instead of retrying."
if [ -z "$METHODOLOGY_CLI_PRESET" ]; then
launcher_auto_rescue_methodology_repo "$METHODOLOGY_REPO" || launcher_gate_repair "methodology auto-rescue" "$SYNC_REMEDY"
fi
if [ "${METHODOLOGY_INSIDE_REPO:-0}" = "1" ]; then
  "$METHODOLOGY_CLI" sync-methodology --launcher-gate || launcher_gate_repair "methodology sync" "$SYNC_REMEDY"
elif [ "${TL_DISABLE_AUTO_RESCUE:-0}" = "1" ]; then
  "$METHODOLOGY_CLI" sync-methodology --no-auto-rescue-local-changes --launcher-gate || launcher_gate_repair "methodology sync" "$SYNC_REMEDY"
else
  "$METHODOLOGY_CLI" sync-methodology --auto-rescue-local-changes --launcher-gate || launcher_gate_repair "methodology sync" "$SYNC_REMEDY"
fi
SNAPSHOT_EXEC_ROOT=""
if [ -n "$SNAPSHOT_STORE" ] && [ -x "$SNAPSHOT_STORE/current/bin/tautline" ]; then
  SNAPSHOT_EXEC_ROOT="$(cd "$SNAPSHOT_STORE/current" 2>/dev/null && pwd -P || true)"
fi
SNAPSHOT_STALE_WARNED=0
if [ -n "$SNAPSHOT_EXEC_ROOT" ] && [ -n "$METHODOLOGY_REPO" ] && [ -e "$METHODOLOGY_REPO/.git" ]; then
  CANONICAL_HEAD12="$(git -C "$METHODOLOGY_REPO" rev-parse HEAD 2>/dev/null | cut -c1-12)"
  SNAPSHOT_CURRENT12="$(basename "$SNAPSHOT_EXEC_ROOT")"
  if [ -n "$CANONICAL_HEAD12" ] && [ "$SNAPSHOT_CURRENT12" != "$CANONICAL_HEAD12" ]; then
    SNAPSHOT_WARN='methodology_snapshot: current'
    SNAPSHOT_WARN="$SNAPSHOT_WARN $SNAPSHOT_CURRENT12 does not match canonical"
    SNAPSHOT_WARN="$SNAPSHOT_WARN HEAD $CANONICAL_HEAD12; snapshot store is stale -"
    SNAPSHOT_WARN="$SNAPSHOT_WARN executing canonical checkout $METHODOLOGY_REPO"
    SNAPSHOT_WARN="$SNAPSHOT_WARN (run 'tautline sync-methodology' to repair)"
    printf '%s\n' "$SNAPSHOT_WARN" >&2
    SNAPSHOT_EXEC_ROOT=""
    SNAPSHOT_STALE_WARNED=1
    if [ -z "$METHODOLOGY_CLI_PRESET" ]; then
      if [ -x "$METHODOLOGY_REPO/bin/tautline" ]; then
        METHODOLOGY_CLI="$METHODOLOGY_REPO/bin/tautline"
      elif [ -x "$METHODOLOGY_REPO/bin/minervit-methodology" ]; then
        METHODOLOGY_CLI="$METHODOLOGY_REPO/bin/minervit-methodology"
      elif command -v tautline >/dev/null 2>&1; then
        METHODOLOGY_CLI="$(command -v tautline)"
      fi
    fi
  fi
fi
if [ -n "$SNAPSHOT_EXEC_ROOT" ]; then
  MINERVIT_METHODOLOGY_EXEC_ROOT="$SNAPSHOT_EXEC_ROOT"
  export MINERVIT_METHODOLOGY_EXEC_ROOT
  if [ -z "$METHODOLOGY_CLI_PRESET" ]; then
    METHODOLOGY_CLI="$MINERVIT_METHODOLOGY_EXEC_ROOT/bin/tautline"
  fi
elif [ -n "$SNAPSHOT_STORE" ] && [ "$SNAPSHOT_STALE_WARNED" != "1" ]; then
  SNAPSHOT_WARN='methodology_snapshot: store missing or broken; executing from'
  SNAPSHOT_WARN="$SNAPSHOT_WARN canonical checkout $METHODOLOGY_REPO"
  SNAPSHOT_WARN="$SNAPSHOT_WARN (run 'tautline sync-methodology' to rebuild)"
  printf '%s\n' "$SNAPSHOT_WARN" >&2
fi
LANE_TARGET=""
SEARCH_DIR="$(pwd -P 2>/dev/null || pwd)"
while [ -n "$SEARCH_DIR" ]; do
  if [ -f "$SEARCH_DIR/.tautline.json" ] || [ -f "$SEARCH_DIR/.minervit-ai-delivery.json" ]; then
    LANE_TARGET="$SEARCH_DIR"
    break
  fi
  if [ "$SEARCH_DIR" = "/" ]; then
    break
  fi
  NEXT_DIR="$(dirname "$SEARCH_DIR")"
  if [ "$NEXT_DIR" = "$SEARCH_DIR" ]; then
    break
  fi
  SEARCH_DIR="$NEXT_DIR"
done
"$METHODOLOGY_CLI" snapshot-pin --target "${LANE_TARGET:-$PWD}" || true
if [ -n "$LANE_TARGET" ]; then
  "$METHODOLOGY_CLI" lane-start --target "$LANE_TARGET" --defer-debt-preflights || launcher_gate_repair "lane-start" "run 'tautline lane-start --target $LANE_TARGET --defer-debt-preflights', read the printed failure, and fix exactly what it names."
  "$METHODOLOGY_CLI" methodology-status --target "$LANE_TARGET" --fail-on-drift --enter-remediation-on-debt
  METHODOLOGY_STATUS_EXIT=$?
  if [ "$METHODOLOGY_STATUS_EXIT" = "2" ]; then
    REMEDIATION_PROMPT="Startup remediation required for this lane. Run 'tautline methodology-status --target $LANE_TARGET --fail-on-drift', fix every printed issue, and rerun until it exits 0 before any project work. Do not bypass gates: --no-verify pushes and gate relaxation are operator break-glass decisions - if one is genuinely required, declare a blocker (blocker-declare) and stop with a report."
    exec claude --dangerously-skip-permissions "$REMEDIATION_PROMPT"
  elif [ "$METHODOLOGY_STATUS_EXIT" != "0" ]; then
    launcher_gate_repair "methodology-status integrity" "run 'tautline methodology-status --target $LANE_TARGET --fail-on-drift', read the methodology_status_blocking line, and fix exactly what it names."
  fi
fi
GOAL_TARGET="${LANE_TARGET:-.}"
if [ "${TL_SHOW_GOAL_PROMPT:-1}" != "0" ] && [ -t 0 ] && [ -t 1 ]; then
  printf '\n'
  if "$METHODOLOGY_CLI" goal-kickoff-prompt --target "$GOAL_TARGET"; then
    if [ -n "$LANE_TARGET" ]; then
      printf '\n%s' 'Copy the prompt above if you want goal-led startup, then press Return to start Claude...'
    else
      printf '\n%s' 'Copy the onboarding offer above if you want to adopt Tautline in this repo, then press Return to start Claude...'
    fi
    IFS= read -r _
  else
    printf '%s\n' 'goal kickoff prompt failed; starting Claude anyway after sync' >&2
  fi
  printf '\n'
fi
exec claude --dangerously-skip-permissions "$@"
