What
Add a minimal behaviour scenario that exercises Grok on Vertex through the xai-vertex provider,
modelled on the existing e2e/behaviour/features/runtime/pi.feature, and gated on its own capability
so it never blocks CI.
Why unit tests are not enough here
internal/runtime covers the model-spec normalisation and the rendered command line well, and
#6572 added tests for both. What no unit test can reach is the handoff:
- the extension actually loading from
/usr/local/share/pi-extensions/xai-vertex in the built
image — pi drops a failed extension silently, so this fails as a generic "model not found";
- ambient ADC resolving inside the sandbox, against the rewritten
external_account config
from prepare-sandbox-credentials.sh rather than a developer's gcloud login;
- the three-segment spec surviving runner → pi → Vertex intact.
All three broke at least once while landing #6572, and none produced a failure that named its cause.
(2) in particular shipped as a bug in the plugin's v0.1.0 and was only caught by running it in a real
sandbox — every developer machine passed, because they had a stale credential that a fresh sandbox
does not.
Why it must not gate CI
Grok availability is outside fullsend's control: Model Garden enablement is per-project, and xAI
quota on Vertex is separate from the Anthropic quota the suite already depends on. A quota or
availability hiccup must not red the whole behaviour suite. Gate it the way runtime-pi already is:
@requires:capability:runtime-pi-xai
Skipped unless the runner declares BEHAVIOUR_CAPABILITIES=runtime-pi-xai, so it is opt-in, run
deliberately, and cannot become a blocker.
What it should cost and reuse
Almost nothing new. It reuses the same leased per-repo install, the same E2E_GCP_PROJECT_ID, and
the same WIF credential path the Claude-on-Vertex runs already use — the xai-vertex extension
authenticates through the same ADC, only the project variable differs, and it defaults to the
fleet's Vertex project.
One small Grok call. Grok 4.6 is $2/$6 per million tokens, so a smoke-sized run is cents — comparable
to the haiku run runtime-pi already costs.
Prerequisite — confirmed. A single GCP project can serve all three providers: Claude, Grok and
Gemini were each run through the pi runtime against one project that has all three enabled in Vertex
Model Garden, on the same ADC credentials, with only the model spec changing. So this scenario needs
no separate project or extra credential plumbing — it needs the E2E project to have xai/grok-4.6
enabled in Model Garden, which is a Model Garden setting rather than a fullsend change.
If for any reason the E2E project cannot have Grok enabled, XAI_VERTEX_PROJECT_ID can point just
this scenario at one that does — #6572 deliberately leaves an explicitly-set value alone rather than
overriding it. Note that if the model is not enabled, the run fails 403 PERMISSION_DENIED and the
extension does not warn, because it did resolve a project — just one without the model.
Suggested assertions
Reuse the pi.feature shape — minimal agent, deliberate tool use — and assert:
metrics.json has runtime: pi and model xai/grok-4.6 (the publisher segment is retained
on purpose; a bare grok-4.6 would mean piBareModelID regressed)
- the agent completed with a real response and non-zero token usage, i.e. the provider resolved and
ADC worked in-sandbox
- a
toolCall in the pi session transcript, so the hook adapter is exercised on this provider too
XAI_API_KEY is unset in the run, so the built-in xai provider cannot shadow the Vertex one
Worth covering both spec forms, since they take different paths through translatePiModel:
harness model: grok-4.6 plus FULLSEND_PI_PROVIDER=xai-vertex (the only form a harness can express,
since validModelName forbids /), and the fully-qualified --model xai-vertex/xai/grok-4.6.
Out of scope
Not proposing xai coverage in the default CI path, nor a second provider in the existing
runtime-pi scenario — that one should keep testing the Claude path it tests today.
What
Add a minimal behaviour scenario that exercises Grok on Vertex through the
xai-vertexprovider,modelled on the existing
e2e/behaviour/features/runtime/pi.feature, and gated on its own capabilityso it never blocks CI.
Why unit tests are not enough here
internal/runtimecovers the model-spec normalisation and the rendered command line well, and#6572 added tests for both. What no unit test can reach is the handoff:
/usr/local/share/pi-extensions/xai-vertexin the builtimage — pi drops a failed extension silently, so this fails as a generic "model not found";
external_accountconfigfrom
prepare-sandbox-credentials.shrather than a developer'sgcloudlogin;All three broke at least once while landing #6572, and none produced a failure that named its cause.
(2) in particular shipped as a bug in the plugin's v0.1.0 and was only caught by running it in a real
sandbox — every developer machine passed, because they had a stale credential that a fresh sandbox
does not.
Why it must not gate CI
Grok availability is outside fullsend's control: Model Garden enablement is per-project, and xAI
quota on Vertex is separate from the Anthropic quota the suite already depends on. A quota or
availability hiccup must not red the whole behaviour suite. Gate it the way
runtime-pialready is:Skipped unless the runner declares
BEHAVIOUR_CAPABILITIES=runtime-pi-xai, so it is opt-in, rundeliberately, and cannot become a blocker.
What it should cost and reuse
Almost nothing new. It reuses the same leased per-repo install, the same
E2E_GCP_PROJECT_ID, andthe same WIF credential path the Claude-on-Vertex runs already use — the xai-vertex extension
authenticates through the same ADC, only the project variable differs, and it defaults to the
fleet's Vertex project.
One small Grok call. Grok 4.6 is $2/$6 per million tokens, so a smoke-sized run is cents — comparable
to the haiku run
runtime-pialready costs.Prerequisite — confirmed. A single GCP project can serve all three providers: Claude, Grok and
Gemini were each run through the pi runtime against one project that has all three enabled in Vertex
Model Garden, on the same ADC credentials, with only the model spec changing. So this scenario needs
no separate project or extra credential plumbing — it needs the E2E project to have
xai/grok-4.6enabled in Model Garden, which is a Model Garden setting rather than a fullsend change.
If for any reason the E2E project cannot have Grok enabled,
XAI_VERTEX_PROJECT_IDcan point justthis scenario at one that does — #6572 deliberately leaves an explicitly-set value alone rather than
overriding it. Note that if the model is not enabled, the run fails
403 PERMISSION_DENIEDand theextension does not warn, because it did resolve a project — just one without the model.
Suggested assertions
Reuse the
pi.featureshape — minimal agent, deliberate tool use — and assert:metrics.jsonhasruntime: piand modelxai/grok-4.6(the publisher segment is retainedon purpose; a bare
grok-4.6would meanpiBareModelIDregressed)ADC worked in-sandbox
toolCallin the pi session transcript, so the hook adapter is exercised on this provider tooXAI_API_KEYis unset in the run, so the built-inxaiprovider cannot shadow the Vertex oneWorth covering both spec forms, since they take different paths through
translatePiModel:harness
model: grok-4.6plusFULLSEND_PI_PROVIDER=xai-vertex(the only form a harness can express,since
validModelNameforbids/), and the fully-qualified--model xai-vertex/xai/grok-4.6.Out of scope
Not proposing xai coverage in the default CI path, nor a second provider in the existing
runtime-piscenario — that one should keep testing the Claude path it tests today.