#!/usr/bin/env bash
# v1.4.2 check14 判据载体 (r28-P1-1 ②合规: scripts/tests/ 为 AC11 合法锚位):
# 结构收尾线第四版结构守卫——断言函数即 check14 登记标识的真载体。
#
# 承接 v140/v141 先例: 每个断言函数含实际守卫逻辑, 可独立运行, 非名字壳
# (v1.3.7 教训: 真语义载体非名壳)。登记: ar 1a 固定项随 M3 批登记
# (载体就位时点=1d S1 注记判例承继; 本件随 M3 合入批落库)。
# 注: kernel 钉值参数化(见下)——S6.1 收口步升钉后填 v1.2.0 实名; 当前 v1.0.2
# 绿态下守卫以当前实况断言(workspace 1.4.2/退役面缺席为 M3 终态目标)。
#
# 用法: bash scripts/tests/v142_structural_guards.sh
# 退出码: 0=四守卫全过 / 1=任一守卫失守(结构面漂移)

set -uo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
FAIL=0

note() { echo "[v142-guards] $*"; }
die()  { echo "[v142-guards] FAIL: $*" >&2; FAIL=1; }

# S6.1 收口步参数(v1.4.3 AC6 kernel v1.2.2 合入同步: 钉升 v1.2.1→v1.2.2, 守卫钉值语义载体同步防死标识)
#
# ★★ v1.9.12 `M3-b`(承 `ar` 裁25 裁3 **取甲** · 治 `F-GT-16` 余项): 字面常量 ⇒ **动态取钉**。
#   修前形 `KERNEL_TAG="v1.2.4"` —— 系 **v1.4.2 时点之值**,与现钉(`v1.4.23`)差 19 档
#   ⇒ 属【守卫常量滞后 = 假绿】族(`F-GT-16` 本体已由 `v1.9.12` 批一 4736c9c37 于 `v143`
#   档治 ∧ 该档已由批四 d0f38bd16 删除; 本笔治**余项**)。
#   ★ 潜伏性(照实): 本档**不在跑线**(`verify_release.sh` 检查14b 唯执行**现役**世代档 =
#     `v154`)⇒ 该常量**不参与判绿** ⇒ 现无假绿; 然世代解析退化(现役档缺失)即**复活**。
#   ★ 形 = **与现役 `v154` 同形**(`pin_tag()` 自 `Cargo.toml` 首条 `tag=` 声明派生; 空值即
#     `exit 1` fail-fast, 禁静默空串放行)。
#   ★ 射程(照实): 本笔唯动 `KERNEL_TAG` 一行(承裁25 裁3「4 档改动态取钉」之射程);
#     同档之其它字面常量(`XWWASM_TAG`/`XWCORE_TAG`)系**同类余项**,未在本裁射程内 ⇒ 另报候裁。
pin_tag() {
    local tag
    tag="$(grep -m1 "$1.*tag = " "$REPO_ROOT/Cargo.toml" | sed -E 's/.*tag = "([^"]+)".*/\1/')"
    [[ -z "$tag" ]] && { echo "[v142-guards] FAIL: 守卫常量派生失败(Cargo.toml 无 $1 tag 钉面)" >&2; exit 1; }
    echo "$tag"
}
KERNEL_TAG="$(pin_tag 'xwkernel.git')"

# 守卫一: kernel 三件钉同钉 KERNEL_TAG(Cargo.toml [workspace.dependencies] 声明面,
# S6.1 收口判据)。[patch] 段条目排除——patch 是重定向面, 声明面三钉为判据本体。
# 红侧: 声明面任一钉偏离 KERNEL_TAG → 失守。
assert_v142_kernel_triple_pin() {
    local n
    n="$(awk -v tag="$KERNEL_TAG" '/^\[workspace\.dependencies\]/{inp=1;next} /^\[/{inp=0} inp && /^(kernel|kernel-macros|kernel-loader) = \{ git = .*tag = "/ && $0 ~ ("\"" tag "\"") {c++} END{print c+0}' "$REPO_ROOT/Cargo.toml")"
    if [[ "$n" == "3" ]]; then
        note "v142_kernel_triple_pin: kernel 声明面三钉同钉 $KERNEL_TAG ✓"
    else
        die "kernel 声明面三钉同钉 $KERNEL_TAG 计数=$n, 期望 3"
    fi
}

# 守卫二: 退役面物理缺席——xw-cli 全 crate + xw-runtime seam 桥面不回流。
# (M3 退役执行后断言; 版本字段断言不含——沿 v141 纪律"版本面归 3d 终批后 3f 核",
# 避免脚手架期 workspace 1.4.1→1.4.2 bump 前假红)。
# 红侧: crates/xw-cli 全 crate 存在 或 m3_seam_adapter/diagnostic_seam 在主线树 → 失守。
assert_v142_retired_surface_absent() {
    local leak=0
    [[ -d "$REPO_ROOT/crates/xw-cli" ]] && leak=1
    [[ -f "$REPO_ROOT/crates/xw-runtime/src/m3_seam_adapter.rs" ]] && leak=1
    [[ -f "$REPO_ROOT/crates/xw-runtime/src/diagnostic_seam.rs" ]] && leak=1
    if [[ "$leak" == "0" ]]; then
        note "v142_retired_surface_absent: xw-cli 全 crate + seam 桥迁出面主线缺席 ✓"
    else
        die "退役面主线残留(xw-cli 目录存在 / m3_seam_adapter / diagnostic_seam)——全 crate 退役语义破坏"
    fi
}

# 守卫三: 锥锁反查脚本存活可执行(AC8 机制化载体承继; 禁死标识)。
assert_v142_cone_lock_alive() {
    local f="$REPO_ROOT/scripts/tests/cone_lock_reverse_lookup.sh"
    if [[ -x "$f" ]] && grep -q '\[cone-lookup\]' "$f"; then
        note "v142_cone_lock_alive: cone_lock_reverse_lookup.sh 存活可执行 ✓"
    else
        die "scripts/tests/cone_lock_reverse_lookup.sh 缺失/不可执行/失去 [cone-lookup] 代码标识"
    fi
}

assert_v142_kernel_triple_pin
assert_v142_retired_surface_absent
assert_v142_cone_lock_alive

if [[ "$FAIL" -eq 0 ]]; then
    note "三守卫全过 ✓"
fi
exit "$FAIL"