#!/usr/bin/env bash
set -uo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
SRC="$REPO_ROOT/scripts/verify_release.sh"
TMP="$(mktemp -d "${TMPDIR:-/tmp}/skip20.XXXXXX")"
trap 'rm -rf "$TMP"' EXIT
PASS=0
_note() { :; }
_fail() { :; }
FUNC="$(sed -n '/^selfaudit_skip_paths() {/,/^}$/p' "$SRC")"
if [[ -z "$FUNC" ]]; then
echo "[skip20-selftest] FAIL: 自 $SRC 提取 selfaudit_skip_paths() 失败(内容锚未命中)" >&2
exit 1
fi
NULLABLE="$(sed -n 's/^SKIP20_NULLABLE_SOURCES=(\(.*\))$/\1/p' "$SRC")"
EXEMPT_RAW="$(awk '/^SKIP20_EXEMPT=\(/{f=1;next} f&&/^\)/{f=0} f{print}' "$SRC")"
if [[ -z "$NULLABLE" || -z "$EXEMPT_RAW" ]]; then
echo "[skip20-selftest] FAIL: 自 $SRC 提取 SKIP20_NULLABLE_SOURCES / SKIP20_EXEMPT 失败" >&2
exit 1
fi
HARNESS="$TMP/harness.sh"
cat > "$HARNESS" <<'HEOF'
fail() { echo "FAIL: $*"; }
note() { echo "NOTE: $*"; }
HEOF
printf 'SKIP20_NULLABLE_SOURCES=(%s)\n' "$NULLABLE" >> "$HARNESS"
{
echo 'SKIP20_EXEMPT=('
printf '%s\n' "$EXEMPT_RAW"
echo ')'
} >> "$HARNESS"
printf '%s\n' "$FUNC" >> "$HARNESS"
echo 'selfaudit_skip_paths' >> "$HARNESS"
run_on() {
XW_SKIP20_FILES="$*" bash "$HARNESS"
}
check() {
local name="$1" want="$2"; shift 2
local out; out="$(run_on "$@")"
local got="不报"
[[ "$out" == *"FAIL: 检查20"* ]] && got="报"
if [[ "$got" == "$want" ]]; then
echo "[skip20-selftest] 对照 $name ✓($got)"
else
echo "[skip20-selftest] FAIL: 对照 $name 期望【$want】实得【$got】——输出: $(printf '%s' "$out" | head -c 200)" >&2
PASS=1
fi
}
F1="$TMP/f1.sh"
cat > "$F1" <<'EOF'
check_demo_one() {
if [[ -n "$roadmap_ver" && "$(normalize_ver "$cargo_ver")" != "$(normalize_ver "$roadmap_ver")" ]]; then
fail "检查2: 不一致"
fi
}
EOF
check "①形①(守卫 · 无登记)" 报 "$F1"
F2="$TMP/f2.sh"
cat > "$F2" <<'EOF'
check_demo_two() {
if [[ -z "$in_progress_all" ]]; then
note "检查5: ROADMAP 无 🚧 进行中条目(跳过)"
fi
}
EOF
check "②形②(note-only · 无登记)" 报 "$F2"
F3="$TMP/f3.sh"
cat > "$F3" <<'EOF'
check_demo_three() {
note "检查9: 未判定"
return 0
}
EOF
check "③形③(裸 return 0 · 无登记)" 报 "$F3"
F4="$TMP/f4.sh"
cat > "$F4" <<'EOF'
check_demo_four() {
[[ -n "$roadmap_ver" ]] || skip_gap "检查2: ROADMAP 当前实施版本缺席 ⇒ 该项未判定"
if [[ -n "$roadmap_ver" && "$(normalize_ver "$cargo_ver")" != "$(normalize_ver "$roadmap_ver")" ]]; then
fail "检查2: 不一致"
fi
if [[ -z "$in_progress_all" ]]; then
note "检查5: ROADMAP 无 🚧 进行中条目(跳过)"
skip_gap "检查5: ROADMAP 无 🚧 进行中条目 ⇒ 本检查未判定"
fi
note "检查9: 未判定"
skip_gap "检查9: 未判定"
return 0
}
EOF
check "④合规(三形皆登记)" 不报 "$F4"
F5="$TMP/f5.sh"
cat > "$F5" <<'EOF'
check_demo_five() {
if [[ -z "$claimed" ]]; then
note "检查1: ROADMAP.md 无 '已发布' 宣称(跳过)"
fi
}
EOF
check "⑤具名豁免(空真)" 不报 "$F5"
F6="$TMP/release_gates_v1210_fixture.sh"
cat > "$F6" <<'EOF'
check_demo_six() {
if [[ -z "$in_progress_all" ]]; then
note "检查26: ROADMAP 无 🚧 进行中条目(跳过)"
fi
}
EOF
check "⑥域扩(第二档之 skip 出口)" 报 "$F1" "$F6"
echo
if [[ "$PASS" -eq 0 ]]; then
echo "[skip20-selftest] 检查20 阳性对照六组全符 ✓(谓词承证力 ∧ 域已扩至第二档)"
exit 0
else
echo "[skip20-selftest] 检查20 阳性对照【未全符】⇒ 谓词不承证力(rc=1)" >&2
exit 1
fi