fix(qa): load ANTHROPIC_AUTH_TOKEN as ANTHROPIC_API_KEY for interactive E2E (#2894)

* chore: update agent GitHub star counts

* fix(qa): load ANTHROPIC_AUTH_TOKEN as ANTHROPIC_API_KEY for interactive E2E

QA VMs store the Anthropic key as ANTHROPIC_AUTH_TOKEN in
/etc/spawn-qa-auth.env, but the e2e-interactive handler only looked for
ANTHROPIC_API_KEY — causing the 6am cron to fail immediately with
"ANTHROPIC_API_KEY not set". Accept either name when loading from the
auth env file.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(e2e): bump interactive harness timeout to 20min, fix zombie VM teardown

- SESSION_TIMEOUT_MS: 10min → 20min — provisioning a VM takes 3-4 min
  before onboarding even starts; 10min wasn't enough headroom
- interactive.sh: call cloud_provision_verify even on harness failure so
  teardown can find and delete any VM that was partially created (e.g.
  on timeout mid-provision) — previously left zombie VMs with no .meta file

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: spawn-qa-bot <qa@openrouter.ai>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: L <6723574+louisgv@users.noreply.github.com>
This commit is contained in:
A 2026-03-22 21:24:26 -07:00 committed by GitHub
parent 6aeb9ba142
commit 9280489ada
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 22 additions and 17 deletions

View file

@ -460,6 +460,8 @@ elif [[ "${RUN_MODE}" == "e2e-interactive" ]]; then
_ekey="${_ekey#"${_ekey%%[! ]*}"}"
case "${_ekey}" in
ANTHROPIC_API_KEY) export ANTHROPIC_API_KEY="${_eval}" ;;
# QA VMs store this as ANTHROPIC_AUTH_TOKEN — accept either
ANTHROPIC_AUTH_TOKEN) export ANTHROPIC_API_KEY="${_eval}" ;;
esac
done < /etc/spawn-qa-auth.env
fi

View file

@ -37,8 +37,8 @@
"license": "Proprietary",
"created": "2025-02",
"added": "2025-06",
"github_stars": 79093,
"stars_updated": "2026-03-17",
"github_stars": 81306,
"stars_updated": "2026-03-23",
"language": "Shell",
"runtime": "node",
"category": "cli",
@ -77,8 +77,8 @@
"license": "MIT",
"created": "2025-11",
"added": "2025-11",
"github_stars": 319742,
"stars_updated": "2026-03-17",
"github_stars": 330264,
"stars_updated": "2026-03-23",
"language": "TypeScript",
"runtime": "bun",
"category": "tui",
@ -122,8 +122,8 @@
"license": "Apache-2.0",
"created": "2026-02",
"added": "2025-12",
"github_stars": 27636,
"stars_updated": "2026-03-17",
"github_stars": 28407,
"stars_updated": "2026-03-23",
"language": "Rust",
"runtime": "binary",
"category": "cli",
@ -157,8 +157,8 @@
"license": "Apache-2.0",
"created": "2025-04",
"added": "2025-07",
"github_stars": 65879,
"stars_updated": "2026-03-17",
"github_stars": 66895,
"stars_updated": "2026-03-23",
"language": "Rust",
"runtime": "binary",
"category": "cli",
@ -189,8 +189,8 @@
"license": "MIT",
"created": "2025-04",
"added": "2025-08",
"github_stars": 123981,
"stars_updated": "2026-03-17",
"github_stars": 128054,
"stars_updated": "2026-03-23",
"language": "TypeScript",
"runtime": "go",
"category": "tui",
@ -223,8 +223,8 @@
"license": "MIT",
"created": "2025-03",
"added": "2025-09",
"github_stars": 16813,
"stars_updated": "2026-03-17",
"github_stars": 17063,
"stars_updated": "2026-03-23",
"language": "TypeScript",
"runtime": "node",
"category": "cli",
@ -258,8 +258,8 @@
"license": "MIT",
"created": "2025-06",
"added": "2026-02",
"github_stars": 8365,
"stars_updated": "2026-03-17",
"github_stars": 10286,
"stars_updated": "2026-03-23",
"language": "Python",
"runtime": "python",
"category": "cli",
@ -292,8 +292,8 @@
"license": "Proprietary",
"created": "2026-03",
"added": "2026-03",
"github_stars": 107,
"stars_updated": "2026-03-17",
"github_stars": 112,
"stars_updated": "2026-03-23",
"language": "TypeScript",
"runtime": "node",
"category": "cli",

View file

@ -14,7 +14,7 @@
// Outputs JSON to stdout: { success: boolean, duration: number, transcript: string }
const IDLE_MS = 2000; // Wait 2s of silence before asking AI
const SESSION_TIMEOUT_MS = 10 * 60 * 1000; // 10 minute overall timeout
const SESSION_TIMEOUT_MS = 20 * 60 * 1000; // 20 minute overall timeout (provision takes 3-4 min + onboarding)
const AI_MODEL = "claude-haiku-4-5-20251001";
// ─── Args & validation ──────────────────────────────────────────────────

View file

@ -98,6 +98,9 @@ interactive_provision() {
printf ' %s\n' "${line}"
done
fi
# Even on failure, try to write the .meta file so teardown can clean up
# any VM that was partially created (e.g. on timeout mid-provision).
cloud_provision_verify "${app_name}" "${log_dir}" 2>/dev/null || true
return 1
fi
else