From 064dbf3d8fc551474443c313cc0c519612155845 Mon Sep 17 00:00:00 2001 From: saravanakumardb1 Date: Fri, 29 May 2026 22:43:21 -0700 Subject: [PATCH] test(agent-queue): fleet integration selftest cases (P2-S3) Adds 7 stub-driven fleet cases (AQ_FLEET_API_CMD stub, no live coordinator); never weakens the prior 53 (full suite now 60 green): - flag OFF (default): zero coordinator calls; offline job completes unchanged - register(heartbeat)+claim -> coordinator job materialized + executed to review/ - report+checkpoint: PATCH carries stage+leaseEpoch (+ wipBranch on building) - FENCING: stale-epoch 409 -> self-abort + quarantine (never shipped) - lease renew (unit): POST .../lease/renew with current leaseEpoch - offline-degrade: coordinator 5xx -> job completes locally (degraded), not quarantined - no-leak: bodyMd/token never appear in report payloads --- agent-queue/selftest.sh | 138 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) diff --git a/agent-queue/selftest.sh b/agent-queue/selftest.sh index 29a663f..f0f9fbe 100755 --- a/agent-queue/selftest.sh +++ b/agent-queue/selftest.sh @@ -688,4 +688,142 @@ else fi unset AQ_TRACKER_API_CMD AQ_TRACKER_CWD AQ_STUB_CALLS AQ_STUB_ITEM AQ_STUB_CODE AQ_STUB_GET_CODE +# ───────────────────────────────────────────────────────────────────── +# Phase 2 — Slice 3 cases (fleet coordinator integration). A stub replaces +# fleet_api via AQ_FLEET_API_CMD (no live coordinator), records calls + returns +# canned JSON. The flag-off cases prove the offline path is unchanged. +# ───────────────────────────────────────────────────────────────────── +fstub="$tmp/fleet-stub.sh" +cat > "$fstub" <<'STUBEOF' +#!/usr/bin/env bash +# fleet API stub: record " :: "; canned responses by route. +[ -n "${AQ_FSTUB_CALLS:-}" ] && printf '%s %s :: %s\n' "$1" "$2" "$3" >> "$AQ_FSTUB_CALLS" +case "$1 $2" in + "POST /fleet/factories/heartbeat") printf '%s\n200\n' '{"ok":true}' ;; + "POST /fleet/claim") + if [ -n "${AQ_FSTUB_CLAIM_FLAG:-}" ] && [ -f "$AQ_FSTUB_CLAIM_FLAG" ]; then + printf '%s\n200\n' '{"claimed":false}' + else + [ -n "${AQ_FSTUB_CLAIM_FLAG:-}" ] && : > "$AQ_FSTUB_CLAIM_FLAG" + printf '{"claimed":true,"job":{"id":"%s","bodyMd":"%s","leaseEpoch":1},"lease":{"leaseEpoch":1}}\n200\n' \ + "${AQ_FSTUB_JOB_ID:-fjob_1}" "${AQ_FSTUB_BODY:-do the work}" + fi ;; + PATCH\ /fleet/jobs/*) printf '%s\n%s\n' '{}' "${AQ_FSTUB_PATCH_CODE:-200}" ;; + *) printf '%s\n200\n' '{}' ;; +esac +STUBEOF +chmod +x "$fstub" + +# 33. flag OFF (default): a recording stub is configured but AQ_FLEET is unset → +# ZERO fleet calls, and a local job runs through the offline path unchanged. +export AGENT_QUEUE_ROOT="$tmp/queue-floff" +"$AQ" init >/dev/null +export AQ_FLEET_API_CMD="$fstub"; export AQ_FSTUB_CALLS="$tmp/floff-calls.log"; : > "$AQ_FSTUB_CALLS" +printf '%s\n' '---' 'engine: devin' "cwd: $work" 'yolo: true' '---' '' '# local task' \ + > "$AGENT_QUEUE_ROOT/inbox/localjob.md" +DEVIN_BIN="$stub" "$AQ" run --once >/dev/null 2>&1 +if [ ! -s "$AQ_FSTUB_CALLS" ] && ls "$AGENT_QUEUE_ROOT"/review/localjob.md >/dev/null 2>&1; then + pass "fleet flag OFF: zero coordinator calls; offline job completes to review/" +else + cat "$AQ_FSTUB_CALLS" >&2; fail "flag-off made fleet calls or offline job did not complete" +fi +unset AQ_FLEET_API_CMD AQ_FSTUB_CALLS + +# 34. AQ_FLEET=1: loop start registers (heartbeat with caps) + claim executes a +# coordinator job to review/, with fleet_job_id + leaseEpoch persisted in meta. +export AGENT_QUEUE_ROOT="$tmp/queue-fl1"; export AQ_FLEET_CWD="$work" +"$AQ" init >/dev/null +export AQ_FLEET_API_CMD="$fstub" AQ_FSTUB_CALLS="$tmp/fl1-calls.log" AQ_FSTUB_CLAIM_FLAG="$tmp/fl1-claimed" \ + AQ_FSTUB_JOB_ID="fjob_1" AQ_FSTUB_BODY="FLEET-BODY-SENTINEL do work" +: > "$AQ_FSTUB_CALLS"; rm -f "$AQ_FSTUB_CLAIM_FLAG" +AQ_FLEET=1 AGENT_QUEUE_POLL=1 DEVIN_BIN="$stub" "$AQ" run --once >/dev/null 2>&1 +fmeta=$(find "$AGENT_QUEUE_ROOT/.state" -name '*fleet-fjob_1.meta' | head -1) +if grep -q 'POST /fleet/factories/heartbeat :: .*capabilities' "$AQ_FSTUB_CALLS" \ + && grep -q 'POST /fleet/claim' "$AQ_FSTUB_CALLS" \ + && ls "$AGENT_QUEUE_ROOT"/review/*fleet-fjob_1.md >/dev/null 2>&1 \ + && [ "$(metaval "$fmeta" fleet_job_id)" = "fjob_1" ] && [ "$(metaval "$fmeta" fleet_lease_epoch)" = "1" ]; then + pass "fleet: register(heartbeat)+claim -> coordinator job materialized + executed to review/" +else + cat "$AQ_FSTUB_CALLS" >&2; fail "fleet claim/execute did not work as expected" +fi + +# 35. report + checkpoint: PATCH /fleet/jobs/:id carries stage + leaseEpoch, and a +# checkpoint (wipBranch) on building when cwd is a git repo. +export AGENT_QUEUE_ROOT="$tmp/queue-fl2"; repo=$tmp/repo-fl2; mkrepo "$repo"; export AQ_FLEET_CWD="$repo" +"$AQ" init >/dev/null +export AQ_FSTUB_CALLS="$tmp/fl2-calls.log" AQ_FSTUB_CLAIM_FLAG="$tmp/fl2-claimed" AQ_FSTUB_JOB_ID="fjob_2" AQ_FSTUB_BODY="work two" +: > "$AQ_FSTUB_CALLS"; rm -f "$AQ_FSTUB_CLAIM_FLAG" +AQ_FLEET=1 AGENT_QUEUE_POLL=1 DEVIN_BIN="$stub" "$AQ" run --once >/dev/null 2>&1 +if grep -q 'PATCH /fleet/jobs/fjob_2 :: .*"stage":"building".*"leaseEpoch":1' "$AQ_FSTUB_CALLS" \ + && grep -q 'PATCH /fleet/jobs/fjob_2 :: .*"stage":"building".*"wipBranch"' "$AQ_FSTUB_CALLS" \ + && grep -q 'PATCH /fleet/jobs/fjob_2 :: .*"stage":"review"' "$AQ_FSTUB_CALLS"; then + pass "fleet: PATCH stage transitions carry leaseEpoch + checkpoint(wipBranch) on building" +else + cat "$AQ_FSTUB_CALLS" >&2; fail "fleet report/checkpoint payload incorrect" +fi + +# 36. FENCING: PATCH returns conflict (stale epoch) → worker self-aborts, job is +# quarantined to failed/ (NOT review/testing/shipped), fenced is recorded. +export AGENT_QUEUE_ROOT="$tmp/queue-fl3" +"$AQ" init >/dev/null +export AQ_FSTUB_CALLS="$tmp/fl3-calls.log" AQ_FSTUB_CLAIM_FLAG="$tmp/fl3-claimed" AQ_FSTUB_JOB_ID="fjob_3" AQ_FSTUB_BODY="work three" AQ_FSTUB_PATCH_CODE=409 +: > "$AQ_FSTUB_CALLS"; rm -f "$AQ_FSTUB_CLAIM_FLAG" +AQ_FLEET=1 AGENT_QUEUE_POLL=1 DEVIN_BIN="$stub" "$AQ" run --once >/dev/null 2>&1 +fmeta3=$(find "$AGENT_QUEUE_ROOT/.state" -name '*fleet-fjob_3.meta' | head -1) +rcount=$(find "$AGENT_QUEUE_ROOT/review" "$AGENT_QUEUE_ROOT/testing" "$AGENT_QUEUE_ROOT/shipped" -maxdepth 1 -name '*.md' 2>/dev/null | wc -l | tr -d ' ') +if [ "$rcount" = "0" ] && ls "$AGENT_QUEUE_ROOT"/failed/*fleet-fjob_3.md >/dev/null 2>&1 \ + && [ "$(metaval "$fmeta3" result)" = "fenced_quarantine" ] && [ "$(metaval "$fmeta3" fleet_fenced)" = "1" ]; then + pass "fleet FENCING: stale-epoch PATCH -> self-abort + quarantine (never shipped)" +else + cat "$AQ_FSTUB_CALLS" >&2; fail "fleet fencing did not quarantine correctly (review/testing/shipped=$rcount)" +fi +unset AQ_FSTUB_PATCH_CODE + +# 37. lease renew (unit): fleet_lease_renew issues POST .../lease/renew with epoch. +funcs="$tmp/aq-funcs-fl.sh"; sed '/^main "\$@"/d' "$AQ" > "$funcs" +renew_calls="$tmp/renew-calls.log"; : > "$renew_calls" +if bash -c ' + set -uo pipefail + export AGENT_QUEUE_ROOT="'"$tmp"'/queue-renew" AQ_FLEET=1 + export AQ_FLEET_API_CMD="'"$fstub"'" AQ_FSTUB_CALLS="'"$renew_calls"'" + source "'"$funcs"'" # agent-queue helpers (main stripped; SCRIPT_DIR=/tmp here) + source "'"$HERE"'/lib/fleet-client.sh" # source the lib explicitly (relative source is skipped) + ensure_dirs + printf "%s\n" "job=jr" "fleet_job_id=fjob_r" "fleet_lease_epoch=7" > "$STATE/jr.meta" + fleet_lease_renew jr +'; then + grep -q 'POST /fleet/jobs/fjob_r/lease/renew :: .*"leaseEpoch":7' "$renew_calls" \ + && pass "fleet: lease renew issues POST .../lease/renew with current leaseEpoch" \ + || { cat "$renew_calls" >&2; fail "fleet lease renew payload missing/incorrect"; } +else + fail "fleet_lease_renew invocation errored" +fi + +# 38. offline-degrade: a 5xx on PATCH does NOT quarantine — the job finishes locally +# (degraded), reaching review/ with fleet_degraded recorded. +export AGENT_QUEUE_ROOT="$tmp/queue-fl4" +"$AQ" init >/dev/null +export AQ_FSTUB_CALLS="$tmp/fl4-calls.log" AQ_FSTUB_CLAIM_FLAG="$tmp/fl4-claimed" AQ_FSTUB_JOB_ID="fjob_4" AQ_FSTUB_BODY="work four" AQ_FSTUB_PATCH_CODE=500 +: > "$AQ_FSTUB_CALLS"; rm -f "$AQ_FSTUB_CLAIM_FLAG" +AQ_FLEET=1 AGENT_QUEUE_POLL=1 DEVIN_BIN="$stub" "$AQ" run --once >/dev/null 2>&1 +fmeta4=$(find "$AGENT_QUEUE_ROOT/.state" -name '*fleet-fjob_4.meta' | head -1) +if ls "$AGENT_QUEUE_ROOT"/review/*fleet-fjob_4.md >/dev/null 2>&1 \ + && [ "$(metaval "$fmeta4" fleet_degraded)" = "1" ] \ + && [ "$(metaval "$fmeta4" result)" != "fenced_quarantine" ]; then + pass "fleet offline-degrade: coordinator 5xx -> job completes locally (degraded), not quarantined" +else + cat "$AQ_FSTUB_CALLS" >&2; fail "fleet offline-degrade behaved incorrectly" +fi +unset AQ_FSTUB_PATCH_CODE + +# 39. no-leak: the claimed bodyMd is never sent in any report payload, and the +# bearer token never appears in a recorded call (it is a header, not a body). +if ! grep -q 'FLEET-BODY-SENTINEL' "$tmp/fl1-calls.log" 2>/dev/null \ + && ! grep -q 'SENTINEL-TOKEN' "$tmp/fl1-calls.log" 2>/dev/null; then + pass "fleet no-leak: bodyMd/token never appear in coordinator report payloads" +else + fail "fleet leaked bodyMd or token into a report payload" +fi +unset AQ_FLEET_API_CMD AQ_FLEET_CWD AQ_FSTUB_CALLS AQ_FSTUB_CLAIM_FLAG AQ_FSTUB_JOB_ID AQ_FSTUB_BODY + echo "self-test PASS"