#!/usr/bin/env bash # p2-67 Phase 5 — Real-apricot Claude-vs-AI demo driver, 25 EndTurns. # # Spawns player-api-server.sh, sends CP_TURNS act:end_turn requests # (default 25) followed by shutdown. Streams the FULL JSON-Lines # response stream verbatim to stdout — caller redirects to transcript.jsonl. # # On unexpected termination (game over, panic, protocol_error), the # server's stdout is preserved up to the abort point. A synthetic # {"type":"protocol_error", ...} line is appended if the harness exits # non-zero before consuming the full request stream. # # Env: # CP_TURNS (default 25) — number of EndTurns to issue # CP_SEED (default 42) # CP_PLAYERS (default 3) # CP_PLAYER_SLOT (default 0) # CP_MAP_SIZE (default duel) # CP_TIMEOUT_SEC (default 600) — harness wallclock budget # # Exit 0 always — termination details land in the transcript itself. set -uo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" : "${CP_TURNS:=25}" : "${CP_SEED:=42}" : "${CP_PLAYERS:=3}" : "${CP_PLAYER_SLOT:=0}" : "${CP_MAP_SIZE:=duel}" : "${CP_TIMEOUT_SEC:=600}" export CP_SEED CP_PLAYERS CP_PLAYER_SLOT CP_MAP_SIZE CP_TIMEOUT_SEC TMP=$(mktemp -d -t mc-demo25-XXXXXX) trap "rm -rf '$TMP'" EXIT # Build the request stream. { for i in $(seq 1 "$CP_TURNS"); do printf '{"type":"act","id":%d,"action":{"type":"end_turn"}}\n' "$i" done printf '{"type":"shutdown","id":999}\n' } > "$TMP/in.jsonl" # Drive the harness. timeout is a hard ceiling; CP_TIMEOUT_SEC drives the # in-process Godot watchdog inside the harness. HARNESS_RC=0 timeout "$((CP_TIMEOUT_SEC + 60))" "$SCRIPT_DIR/player-api-server.sh" \ < "$TMP/in.jsonl" > "$TMP/out.jsonl" 2>"$TMP/err.log" \ || HARNESS_RC=$? # Emit transcript verbatim. cat "$TMP/out.jsonl" # If the harness aborted before issuing a shutdown_ok, append a protocol_error # synthetic line so downstream tooling can detect the abort. Mirror the mock # transcript's pattern. if [[ $HARNESS_RC -ne 0 ]]; then LAST_TURN=$(grep -c '"type":"act_response"' "$TMP/out.jsonl" 2>/dev/null || echo 0) STDERR_TAIL=$(tail -20 "$TMP/err.log" 2>/dev/null | tr '\n' '|' | sed 's/"/\\"/g') printf '{"type":"protocol_error","harness_rc":%d,"last_act_response_count":%d,"stderr_tail":"%s"}\n' \ "$HARNESS_RC" "$LAST_TURN" "$STDERR_TAIL" fi # Always exit clean — termination data is in the transcript. exit 0