Files
Story Crater BotandClaude Opus 5 058f11cf2b
CI / Test (push) Canceled after 0s
CI / Vet (push) Canceled after 0s
CI / Build (push) Canceled after 0s
CI / Security (govulncheck) (push) Canceled after 0s
chore: initial commit of Go API gateway
Baseline for the Kong replacement on api.riotpiao.com. Brings the working
tree under version control for the first time: gateway source, the task
board that drives the agent runs, test fixtures, and K8s manifests.

Anchor the gateway ignore rule to the repo root. Unanchored, "gateway"
also matched the cmd/gateway/ source directory, so the program entrypoint
was excluded from every commit.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-08-19 20:54:34 -07:00

158 lines
6.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# Run a sequence of tasks through pi, verifying after each one.
#
# Usage:
# scripts/run-all.sh # run the default local-verifiable sequence
# scripts/run-all.sh 1.1 1.2 2.1 # run a specific list, in the order given
# scripts/run-all.sh --list # show the default sequence and exit
# scripts/run-all.sh --resume # rerun the default sequence, skipping tasks
# # already recorded in .task-runs/completed.txt
#
# Each task gets a fresh zero-context pi session. After each task the full gate runs:
#
# go test ./... -race
# CGO_ENABLED=0 go build ./...
# go vet ./...
#
# The loop HALTS on the first gate failure. That is deliberate. These tasks build on
# each other, so continuing past a broken foundation produces a pile of work that all
# has to be redone. A halted loop is cheap; a cascade is not.
set -uo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$REPO_ROOT"
# Default sequence: dependency-ordered, and limited to tasks that can be verified
# locally with no cluster and no credentials.
#
# Deliberately EXCLUDED from the default run:
# 0.6 CI pipeline -- needs a CI runner, not verifiable here
# 2.8 Kong parity -- requires the live Kong to diff against
# 3.x Authentication -- needs a real Authentik provider and tokens
# 5.3 ServiceMonitor -- needs Prometheus in-cluster
# 6.x Deploy and cutover -- touches live cluster state; run these by hand
# 7.x New prefixes -- deliberately after cutover
DEFAULT_TASKS=(
0.2 0.3 0.4 0.5
1.1 1.2 1.3 1.4 1.5 1.6 1.7
2.1 2.2 2.3 2.4 2.5 2.6 2.7
2.9 2.10 2.11 2.12 2.13 2.14 2.15
4.1 4.2 4.3
5.1 5.2
)
if [[ "${1:-}" == "--list" ]]; then
printf '%s\n' "${DEFAULT_TASKS[@]}"
exit 0
fi
LOG_DIR=".task-runs"
mkdir -p "$LOG_DIR"
# Tasks that have passed the gate, one id per line, appended as they finish and
# carried across invocations. This is what makes --resume possible after a halt.
DONE_FILE="$LOG_DIR/completed.txt"
touch "$DONE_FILE"
if [[ "${1:-}" == "--resume" ]]; then
shift
# Resume the default sequence minus everything already recorded as passing.
# Order is preserved: DEFAULT_TASKS drives the loop, DONE_FILE only filters.
TASKS=()
for t in "${DEFAULT_TASKS[@]}"; do
grep -qxF "$t" "$DONE_FILE" || TASKS+=("$t")
done
SKIPPED=$(( ${#DEFAULT_TASKS[@]} - ${#TASKS[@]} ))
echo "resuming : skipping $SKIPPED already-passed task(s) recorded in $DONE_FILE"
if [[ ${#TASKS[@]} -eq 0 ]]; then
echo "nothing left to run."
exit 0
fi
elif [[ $# -gt 0 ]]; then
TASKS=("$@")
else
TASKS=("${DEFAULT_TASKS[@]}")
fi
gate() {
# Returns 0 if the repository is in a good state, 1 otherwise.
#
# The gate is uniformly strict, including for RED tasks. `Stage: RED` in this board
# means "write the failing test first, then implement until it passes" -- the task
# ends green. Every RED task's Verify block says `expected: passes`. So a failing
# suite is a failure at any stage, and relaxing the gate for RED would let
# half-finished work through.
local task_id="$1"
local stage
stage=$(grep -m1 '^Stage:' tasks/"$task_id"-*.md 2>/dev/null | awk '{print $2}')
CGO_ENABLED=0 go build ./... >"$LOG_DIR/gate-build.log" 2>&1 || { echo " FAIL: go build"; tail -20 "$LOG_DIR/gate-build.log"; return 1; }
go vet ./... >"$LOG_DIR/gate-vet.log" 2>&1 || { echo " FAIL: go vet"; tail -20 "$LOG_DIR/gate-vet.log"; return 1; }
go clean -testcache >/dev/null 2>&1
if ! go test ./... -race >"$LOG_DIR/gate-test.log" 2>&1; then
echo " FAIL: go test -race (stage=${stage:-?})"
grep -E '^(---|\s+---) FAIL|^FAIL' "$LOG_DIR/gate-test.log" | head -8 | sed 's/^/ /'
return 1
fi
echo " build/vet/test all pass (stage=${stage:-?})"
return 0
}
echo "started : $(date '+%Y-%m-%d %H:%M:%S')"
echo "tasks : ${#TASKS[@]}"
echo "model : ${PI_PROVIDER:-homelab-ornith}/${PI_MODEL:-ornith:35b}"
echo "logs : $LOG_DIR/"
echo "gate : build + vet + full race suite after every task; halts on failure"
echo "pid : $$"
echo
COMPLETED=()
for TASK_ID in "${TASKS[@]}"; do
echo "════════════════════════════════════════════"
echo "TASK $TASK_ID"
echo "════════════════════════════════════════════"
if ! ./scripts/run-task.sh "$TASK_ID" >"$LOG_DIR/$TASK_ID.log" 2>&1; then
echo " pi exited non-zero. Last output:"
tail -25 "$LOG_DIR/$TASK_ID.log"
echo
echo "HALTED at $TASK_ID (pi failure). Completed: ${COMPLETED[*]:-none}"
echo "Fix, then: scripts/run-all.sh --resume"
exit 1
fi
tail -12 "$LOG_DIR/$TASK_ID.log" | sed 's/^/ | /'
echo
echo " verifying..."
if ! gate "$TASK_ID"; then
echo
echo "HALTED at $TASK_ID (gate failure). Completed: ${COMPLETED[*]:-none}"
echo "Full pi output: $LOG_DIR/$TASK_ID.log"
echo "Fix, then: scripts/run-all.sh --resume"
exit 1
fi
# grep -c prints 0 AND exits 1 when nothing matches, so a `|| echo 0` fallback
# would append a second line and make these two-line strings. Swallow the exit
# status instead and keep the single count grep already printed.
TICKED=$(grep -c '^- \[x\]' tasks/"$TASK_ID"-*.md 2>/dev/null) || true
TOTAL=$(grep -c '^- \[' tasks/"$TASK_ID"-*.md 2>/dev/null) || true
echo " gate OK checkboxes ticked: ${TICKED:-0}/${TOTAL:-0}"
[[ "$TICKED" != "$TOTAL" ]] && echo " NOTE: not all criteria ticked -- review before trusting this task"
COMPLETED+=("$TASK_ID")
grep -qxF "$TASK_ID" "$DONE_FILE" || echo "$TASK_ID" >>"$DONE_FILE"
echo
done
echo "════════════════════════════════════════════"
echo "All ${#COMPLETED[@]} tasks passed the gate."
echo "Completed: ${COMPLETED[*]}"
echo
echo "Not run by this script (need a cluster, credentials, or live Kong):"
echo " 0.6 CI, 2.8 Kong parity, 3.x auth, 5.3 ServiceMonitor, 6.x deploy, 7.x prefixes"