feat(orchestrator): wire turn-decision endpoint and QuotaReported producer
Closes Phase 2 items 1-2 (AUDIT.md): Coordinator.TurnDecision evaluates occupancy/turn-boundary/handoff state synchronously per turn and returns continue/prepare_handoff/rotate_now/refuse, exposed via POST /v1/harness/turn. The Claude Stop hook now calls it on ordinary turn boundaries instead of no-op'ing, and exits 2 on refuse. Also closes B7's post-hoc producer: /v1/harness/complete now appends a QuotaReported event from the completing lease's harness usage, so the router's quota-availability filter and the brief's quota_consumed stop evaluating against a permanent zero. Live per-harness push producers (Claude statusline, Codex rollout tail) remain unbuilt — investigation recorded in AUDIT.md. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W1rkJ2hBMybnJctPbcy4tT
This commit is contained in:
@@ -2,8 +2,9 @@
|
||||
# Claude Code Stop hook — fires on every turn boundary, not just completion.
|
||||
# Convention: the agent signals "this task is done" by writing a report file
|
||||
# named .orchestra-report.md at the worktree root before stopping. If that
|
||||
# marker is absent, this is an ordinary turn boundary and the hook is a
|
||||
# no-op — do not treat every stop as completion (AUDIT.md B3).
|
||||
# marker is present, report completion. If it is absent, this is an ordinary
|
||||
# turn boundary — ask the unified turn-decision endpoint (AUDIT.md B3, Phase
|
||||
# 2 items 1-2) what to do instead of no-op'ing.
|
||||
#
|
||||
# Requires: ORCHESTRA_TASK_ID and ORCHESTRA_URL set in the pane's env.
|
||||
# Optional: ORCHESTRA_HARNESS_TOKEN if the server requires one.
|
||||
@@ -21,28 +22,49 @@ cwd="$(printf '%s' "$payload" | jq -r '.cwd // empty')"
|
||||
[ -z "${ORCHESTRA_TASK_ID:-}" ] && exit 0
|
||||
[ -z "${ORCHESTRA_URL:-}" ] && exit 0
|
||||
|
||||
report_file="${cwd:-.}/.orchestra-report.md"
|
||||
[ -f "$report_file" ] || exit 0
|
||||
|
||||
report="$(cat "$report_file")"
|
||||
|
||||
auth_header=""
|
||||
if [ -n "${ORCHESTRA_HARNESS_TOKEN:-}" ]; then
|
||||
auth_header="Authorization: Bearer ${ORCHESTRA_HARNESS_TOKEN}"
|
||||
fi
|
||||
|
||||
body="$(jq -n \
|
||||
--arg task_id "$ORCHESTRA_TASK_ID" \
|
||||
--arg transcript_path "$transcript_path" \
|
||||
--arg report "$report" \
|
||||
'{task_id: $task_id, transcript_path: $transcript_path, report: $report}')"
|
||||
report_file="${cwd:-.}/.orchestra-report.md"
|
||||
|
||||
if curl -fsS -X POST "${ORCHESTRA_URL%/}/v1/harness/complete" \
|
||||
if [ -f "$report_file" ]; then
|
||||
report="$(cat "$report_file")"
|
||||
|
||||
body="$(jq -n \
|
||||
--arg task_id "$ORCHESTRA_TASK_ID" \
|
||||
--arg transcript_path "$transcript_path" \
|
||||
--arg report "$report" \
|
||||
'{task_id: $task_id, transcript_path: $transcript_path, report: $report}')"
|
||||
|
||||
if curl -fsS -X POST "${ORCHESTRA_URL%/}/v1/harness/complete" \
|
||||
-H "Content-Type: application/json" \
|
||||
${auth_header:+-H "$auth_header"} \
|
||||
-d "$body" >/dev/null 2>&1; then
|
||||
rm -f "$report_file"
|
||||
else
|
||||
echo "orchestra-stop: failed to report completion" >&2
|
||||
exit 2
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
body="$(jq -n --arg task_id "$ORCHESTRA_TASK_ID" '{task_id: $task_id}')"
|
||||
|
||||
response="$(curl -fsS -X POST "${ORCHESTRA_URL%/}/v1/harness/turn" \
|
||||
-H "Content-Type: application/json" \
|
||||
${auth_header:+-H "$auth_header"} \
|
||||
-d "$body" >/dev/null 2>&1; then
|
||||
rm -f "$report_file"
|
||||
else
|
||||
echo "orchestra-stop: failed to report completion" >&2
|
||||
-d "$body" 2>/dev/null)" || {
|
||||
echo "orchestra-stop: failed to reach turn-decision endpoint" >&2
|
||||
exit 0
|
||||
}
|
||||
|
||||
decision="$(printf '%s' "$response" | jq -r '.decision // empty')"
|
||||
|
||||
if [ "$decision" = "refuse" ]; then
|
||||
echo "orchestra-stop: turn decision is refuse — this turn boundary is not safe to stop at" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
Reference in New Issue
Block a user