Files
whetstone_DSL/tools/mcp/run_spec_hardening_gate.sh

84 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
SPEC_INPUT="${1:?usage: run_spec_hardening_gate.sh <spec.md> [out_dir]}"
OUT_DIR="${2:-$ROOT_DIR/logs/taskitem_runs/spec_hardening_gate_$(date +%Y%m%d_%H%M%S)}"
MIN_SCORE="${WSTONE_SPEC_READINESS_MIN_SCORE:-65}"
RUN_PIPELINE="${WSTONE_SPEC_HARDENING_RUN_PIPELINE:-1}"
if [[ "$SPEC_INPUT" = /* ]]; then
SPEC_PATH="$SPEC_INPUT"
else
SPEC_PATH="$ROOT_DIR/$SPEC_INPUT"
fi
if [[ ! -f "$SPEC_PATH" ]]; then
echo "error: spec not found: $SPEC_PATH" >&2
exit 2
fi
mkdir -p "$OUT_DIR"
BEFORE_JSON="$OUT_DIR/before_readiness.json"
HARDENED_MD="$OUT_DIR/hardened_spec.md"
AFTER_JSON="$OUT_DIR/after_readiness.json"
REPORT_JSON="$OUT_DIR/report.json"
python3 "$ROOT_DIR/tools/mcp/spec_planning_readiness.py" --spec "$SPEC_PATH" --out "$BEFORE_JSON" >/dev/null
python3 "$ROOT_DIR/tools/mcp/spec_planning_hardener.py" --spec "$SPEC_PATH" --readiness "$BEFORE_JSON" --out "$HARDENED_MD" > "$OUT_DIR/hardener_report.json"
python3 "$ROOT_DIR/tools/mcp/spec_planning_readiness.py" --spec "$HARDENED_MD" --out "$AFTER_JSON" >/dev/null
ORIG_RC=null
HARD_RC=null
ORIG_LOG=""
HARD_LOG=""
if [[ "$RUN_PIPELINE" == "1" ]]; then
ORIG_LOG="$OUT_DIR/original_pipeline.log"
HARD_LOG="$OUT_DIR/hardened_pipeline.log"
set +e
WSTONE_RUN_READINESS_SUITE=0 WSTONE_SPEC_READINESS_PRECHECK=1 WSTONE_SPEC_READINESS_HARD_GATE=1 WSTONE_SPEC_READINESS_MIN_SCORE="$MIN_SCORE" \
"$ROOT_DIR/tools/mcp/run_sprint_taskitem_pipeline.sh" "$SPEC_PATH" >"$ORIG_LOG" 2>&1
ORIG_RC=$?
WSTONE_RUN_READINESS_SUITE=0 WSTONE_SPEC_READINESS_PRECHECK=1 WSTONE_SPEC_READINESS_HARD_GATE=1 WSTONE_SPEC_READINESS_MIN_SCORE="$MIN_SCORE" \
"$ROOT_DIR/tools/mcp/run_sprint_taskitem_pipeline.sh" "$HARDENED_MD" >"$HARD_LOG" 2>&1
HARD_RC=$?
set -e
fi
jq -nc \
--arg spec "$SPEC_PATH" \
--arg out_dir "$OUT_DIR" \
--argjson before "$(cat "$BEFORE_JSON")" \
--argjson after "$(cat "$AFTER_JSON")" \
--argjson min_score "$MIN_SCORE" \
--argjson run_pipeline "$RUN_PIPELINE" \
--argjson original_rc "$ORIG_RC" \
--argjson hardened_rc "$HARD_RC" \
--arg original_log "$ORIG_LOG" \
--arg hardened_log "$HARD_LOG" \
'{
spec:$spec,
out_dir:$out_dir,
readiness:{
before:{score:$before.scores.total,verdict:$before.verdict,missing_count:($before.missing_actions|length)},
after:{score:$after.scores.total,verdict:$after.verdict,missing_count:($after.missing_actions|length)},
delta_score:($after.scores.total-$before.scores.total)
},
hard_gate:{
min_score:$min_score,
run_pipeline:($run_pipeline==1),
original_rc:$original_rc,
hardened_rc:$hardened_rc,
original_log:$original_log,
hardened_log:$hardened_log
}
}' > "$REPORT_JSON"
echo "Spec hardening gate complete."
echo "Output dir: $OUT_DIR"
cat "$REPORT_JSON"