136 lines
3.7 KiB
Bash
Executable File
136 lines
3.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
||
TS="$(date +%F_%H%M%S)"
|
||
OUT_DIR="${ROOT_DIR}/reports/gates"
|
||
mkdir -p "${OUT_DIR}"
|
||
|
||
REPORT_FILE="${OUT_DIR}/final_decision_consistency_${TS}.md"
|
||
LOG_FILE="${OUT_DIR}/final_decision_consistency_${TS}.log"
|
||
|
||
latest_file_or_empty() {
|
||
local pattern="$1"
|
||
local latest
|
||
latest="$(ls -1t ${pattern} 2>/dev/null | head -n 1 || true)"
|
||
echo "${latest}"
|
||
}
|
||
|
||
parse_checkbox_decision() {
|
||
local file="$1"
|
||
local go="0"
|
||
local cgo="0"
|
||
local nogo="0"
|
||
|
||
if [[ ! -f "${file}" ]]; then
|
||
echo "UNKNOWN"
|
||
return
|
||
fi
|
||
|
||
grep -Eq '^- \[x\] (GO|通过)' "${file}" && go="1" || true
|
||
grep -Eq '^- \[x\] (CONDITIONAL GO|有条件通过)' "${file}" && cgo="1" || true
|
||
grep -Eq '^- \[x\] (NO-GO|不通过)' "${file}" && nogo="1" || true
|
||
|
||
if [[ "${go}" == "1" ]]; then
|
||
echo "GO"
|
||
return
|
||
fi
|
||
if [[ "${cgo}" == "1" ]]; then
|
||
echo "CONDITIONAL_GO"
|
||
return
|
||
fi
|
||
if [[ "${nogo}" == "1" ]]; then
|
||
echo "NO_GO"
|
||
return
|
||
fi
|
||
echo "UNKNOWN"
|
||
}
|
||
|
||
parse_machine_decision() {
|
||
local file="$1"
|
||
if [[ ! -f "${file}" ]]; then
|
||
echo "UNKNOWN"
|
||
return
|
||
fi
|
||
local row
|
||
row="$(grep -E '^\- (机判结论|决策):\*\*' "${file}" | head -n 1 || true)"
|
||
if [[ -z "${row}" ]]; then
|
||
echo "UNKNOWN"
|
||
return
|
||
fi
|
||
if echo "${row}" | grep -q 'NO_GO'; then
|
||
echo "NO_GO"
|
||
return
|
||
fi
|
||
if echo "${row}" | grep -q 'CONDITIONAL_GO'; then
|
||
echo "CONDITIONAL_GO"
|
||
return
|
||
fi
|
||
if echo "${row}" | grep -q 'GO'; then
|
||
echo "GO"
|
||
return
|
||
fi
|
||
echo "UNKNOWN"
|
||
}
|
||
|
||
FINAL_DECISION_FILE="${ROOT_DIR}/review/final_decision_2026-03-31.md"
|
||
TOK007_FILE="$(latest_file_or_empty "${ROOT_DIR}/review/outputs/tok007_release_recheck_*.md")"
|
||
SP_FILE="$(latest_file_or_empty "${ROOT_DIR}/reports/gates/superpowers_stage_validation_*.md")"
|
||
|
||
FINAL_DECISION="$(parse_checkbox_decision "${FINAL_DECISION_FILE}")"
|
||
TOK007_DECISION="$(parse_machine_decision "${TOK007_FILE}")"
|
||
SP_DECISION="$(parse_machine_decision "${SP_FILE}")"
|
||
|
||
CONSISTENCY_STATUS="PASS"
|
||
CONSISTENCY_NOTE="final decision is aligned with latest machine recheck"
|
||
|
||
if [[ "${FINAL_DECISION}" == "UNKNOWN" || "${TOK007_DECISION}" == "UNKNOWN" || "${SP_DECISION}" == "UNKNOWN" ]]; then
|
||
CONSISTENCY_STATUS="FAIL"
|
||
CONSISTENCY_NOTE="cannot parse one or more decision sources"
|
||
elif [[ "${FINAL_DECISION}" != "${TOK007_DECISION}" ]]; then
|
||
CONSISTENCY_STATUS="WARN"
|
||
CONSISTENCY_NOTE="final signed decision lags latest machine recheck; requires manual review update"
|
||
fi
|
||
|
||
cat > "${REPORT_FILE}" <<EOF
|
||
# Final Decision Consistency Check
|
||
|
||
- 时间戳:${TS}
|
||
- 执行脚本:\`scripts/ci/final_decision_consistency_check.sh\`
|
||
|
||
## 1. 输入源
|
||
|
||
| 来源 | 路径 | 解析结论 |
|
||
|---|---|---|
|
||
| final_decision | ${FINAL_DECISION_FILE} | ${FINAL_DECISION} |
|
||
| tok007_recheck | ${TOK007_FILE:-N/A} | ${TOK007_DECISION} |
|
||
| superpowers_stage_validation | ${SP_FILE:-N/A} | ${SP_DECISION} |
|
||
|
||
## 2. 一致性结果
|
||
|
||
- 状态:**${CONSISTENCY_STATUS}**
|
||
- 说明:${CONSISTENCY_NOTE}
|
||
|
||
## 3. 建议动作
|
||
|
||
1. 若状态为 WARN:人工确认是否需要更新 \`review/final_decision_2026-03-31.md\` 的勾选与签署记录。
|
||
2. 若状态为 FAIL:先修复报告来源或解析格式,再重新执行本检查。
|
||
3. staging 真值就绪后,按顺序重跑:
|
||
1. \`scripts/ci/superpowers_stage_validate.sh\`
|
||
2. \`scripts/ci/tok007_release_recheck.sh\`
|
||
3. \`scripts/ci/final_decision_consistency_check.sh\`
|
||
EOF
|
||
|
||
{
|
||
echo "[INFO] FINAL_DECISION=${FINAL_DECISION}"
|
||
echo "[INFO] TOK007_DECISION=${TOK007_DECISION}"
|
||
echo "[INFO] SP_DECISION=${SP_DECISION}"
|
||
echo "[RESULT] ${CONSISTENCY_STATUS}"
|
||
echo "[INFO] REPORT=${REPORT_FILE}"
|
||
} | tee "${LOG_FILE}"
|
||
|
||
if [[ "${CONSISTENCY_STATUS}" == "FAIL" ]]; then
|
||
exit 1
|
||
fi
|
||
|