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]>
106 lines
3.6 KiB
Bash
Executable File
106 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Run one task through pi in a brand-new, zero-context session.
|
|
#
|
|
# Usage:
|
|
# scripts/run-task.sh 0.1
|
|
# scripts/run-task.sh 0.1 --dry-run # print the prompt, run nothing
|
|
#
|
|
# Each invocation is a fresh pi session (--no-session). Nothing carries over between
|
|
# tasks; that is the point. See tasks/AGENT-PROMPT.md.
|
|
|
|
set -euo pipefail
|
|
|
|
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
cd "$REPO_ROOT"
|
|
|
|
TASK_ID="${1:-}"
|
|
DRY_RUN="${2:-}"
|
|
|
|
if [[ -z "$TASK_ID" ]]; then
|
|
echo "usage: scripts/run-task.sh <task-id> [--dry-run]" >&2
|
|
echo "example: scripts/run-task.sh 0.1" >&2
|
|
exit 2
|
|
fi
|
|
|
|
# Resolve the task file from its id prefix.
|
|
shopt -s nullglob
|
|
matches=(tasks/"$TASK_ID"-*.md)
|
|
shopt -u nullglob
|
|
|
|
if [[ ${#matches[@]} -eq 0 ]]; then
|
|
echo "no task file found for id '$TASK_ID'" >&2
|
|
echo "available:" >&2
|
|
ls tasks/[0-9]*.md | sed 's|tasks/| |' >&2
|
|
exit 1
|
|
fi
|
|
if [[ ${#matches[@]} -gt 1 ]]; then
|
|
echo "ambiguous task id '$TASK_ID' matches:" >&2
|
|
printf ' %s\n' "${matches[@]}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
TASK_FILE="$(basename "${matches[0]}")"
|
|
|
|
# Extract the prompt body from the fenced block in AGENT-PROMPT.md, then substitute.
|
|
PROMPT="$(
|
|
awk '/^```$/{f=!f; next} f' tasks/AGENT-PROMPT.md \
|
|
| sed -e "s|{{TASK_ID}}|$TASK_ID|g" -e "s|{{TASK_FILE}}|$TASK_FILE|g"
|
|
)"
|
|
|
|
if [[ -z "${PROMPT// }" ]]; then
|
|
echo "failed to extract prompt template from tasks/AGENT-PROMPT.md" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$DRY_RUN" == "--dry-run" ]]; then
|
|
printf '%s\n' "$PROMPT"
|
|
exit 0
|
|
fi
|
|
|
|
# Default: claude-haiku-4-5. 200K context, reliable tool calling, needs
|
|
# ANTHROPIC_API_KEY in the environment.
|
|
#
|
|
# The two homelab models were both evaluated and rejected as defaults on 2026-08-19:
|
|
#
|
|
# reasoning 16384 context, and pi's compaction.reserveTokens defaults to 16384,
|
|
# so the compaction threshold computes to zero. pi also only evaluates
|
|
# auto-compaction at run boundaries, never mid-turn (earendil-works/pi
|
|
# issues 6339, 5512, 2871), so a tool loop grows unchecked until the
|
|
# provider rejects it. Separately, under tool_choice "auto" it returns
|
|
# tool_calls: [] and reasons in prose, which stalls an agent loop.
|
|
#
|
|
# ornith:35b 131K context and correct auto tool calling -- viable, and the right
|
|
# local choice. Occupied by other work at time of writing.
|
|
#
|
|
# Switch with env vars:
|
|
# PI_PROVIDER=homelab-ornith PI_MODEL=ornith:35b scripts/run-task.sh 0.1
|
|
#
|
|
PROVIDER="${PI_PROVIDER:-homelab-ornith}"
|
|
MODEL="${PI_MODEL:-ornith:35b}"
|
|
|
|
# One fresh session file per task. This still guarantees zero context -- each task gets
|
|
# its own new file and never reads another's -- while leaving the run inspectable:
|
|
#
|
|
# pi --session .task-runs/sessions/<task>.jsonl # open it
|
|
# pi --export .task-runs/sessions/<task>.jsonl out.html # render it
|
|
#
|
|
# --no-session would also give zero context, but persists nothing to look at afterwards.
|
|
SESSION_DIR=".task-runs/sessions"
|
|
mkdir -p "$SESSION_DIR"
|
|
SESSION_FILE="$SESSION_DIR/$TASK_ID.jsonl"
|
|
rm -f "$SESSION_FILE"
|
|
|
|
echo "task : $TASK_ID ($TASK_FILE)"
|
|
echo "model : $PROVIDER/$MODEL"
|
|
echo "session : $SESSION_FILE (fresh)"
|
|
echo
|
|
|
|
# --print is required, not cosmetic. Without it pi starts its interactive TUI;
|
|
# under run-all.sh stdout is a file and stdin may be /dev/null, so the TUI renders
|
|
# nothing until exit and can sit waiting for input that never comes. --approve
|
|
# trusts project-local files (AGENTS.md and friends) for this run, which would
|
|
# otherwise raise a prompt no one is there to answer.
|
|
exec pi --provider "$PROVIDER" --model "$MODEL" \
|
|
--print --approve \
|
|
--session "$SESSION_FILE" "$PROMPT"
|