How To: Prove Axis Drive OpenRouter Chat
Axis Drive OpenRouter e2e
Section titled “Axis Drive OpenRouter e2e”This proof exercises the live Axis Drive path: it starts a dedicated Drive
session, loads the model catalog, selects a selectable OpenRouter model, sends
a short prompt, and waits for reply_ok. It exits non-zero if the catalog is
missing, the reply is an error, or the Drive event trail lacks submit_ok.
Run it
Section titled “Run it”Build vox first, then run:
vox run scripts/axis-drive-openrouter-e2e.voxThe script prefers openrouter/auto, then other openrouter/* rows, and
finally a selectable row whose provider_type is OpenRouter. It rejects
mens/ models and bare tier identifiers. It does not read an OpenRouter key
from the environment; configure the canonical
SecretId::OpenRouterApiKey and inspect it with:
vox secrets doctorThe script prints a summary JSON object only after reply_ok succeeds. A
successful result also requires a live plane, no last_error, a non-empty
non-error assistant bubble, and a submit_ok event for the final turn.
Troubleshooting
Section titled “Troubleshooting”- A missing selectable model means the OpenRouter secret is unavailable or
provider status could not be loaded. Run
vox secrets doctor. - Step 0 stops a prior Drive session and best-effort kills a foreign
vox-orchestrator-dso the GUI refuses adopt and spawns underVOX_GUI_DRIVE=1with the vault path + cloud keys. Iforch_freshis false after start, a keyless foreign daemon is still holding the port. sendexits non-zero when the JSON body haslast_erroreven if HTTP is 200. Preferwait --until reply_ok(requiressubmit_okforlast_turn_id) over barereply.- Drive HTTP hop timeout is
D_180S(seedocs/superpowers/specs/2026-09-10-axis-chat-surface-audit-design.md§9). - Catalog fetch uses
MODEL_LIST_LIMIT(2000), same as Loquela. reply_okis intentional: barereplymeans only that a turn settled and can also match an error response.- Stop an orphaned session with
vox gui drive stop.