Repository navigation
Fix stale Copilot workflow pins exposed by fail-closed sub-agent resolution #70649
Description
Problem
Follow up #70342, #70389 and #70385, using the Daily Model Inventory Checker report #70398: 18 configured model pins in the 17 workflows below still do not resolve against the Copilot catalogue available to gh-aw's agentic-workflows integration. They include the production daily-model-resolution sub-agent, not just smokes.
#70342 documents the catalogue change around 18:00 UTC on October 19, 2026: gpt-5-mini, gpt-5.4, gpt-5.4-mini, gpt-5.5 and grok-4.5 disappeared. It moved 15 top-level pins to aliases, but left other fields and assertions for follow-up. The current artifacts confirm the missing IDs; this is not evidence that those models disappeared from every provider or integration.
#70389, merged October 20, 2026 at 22:26 UTC, resolves Copilot sub-agent models before starting Copilot and fails closed for unavailable workflow-declared sub-agents. The two branch runs below demonstrate the resulting startup failure. The fix belongs in the workflow pins, not in weakening the fail-closed behavior or restoring fallback to the main model.
Observed evidence
Inspected main at 70e15c7ff659c05c2f4466aa172bb910d28847a2. Built the CLI from that clean checkout as dev-main-70e15c7ff6 and used that dev binary for all three supplied gh aw audit investigations; the installed stable Windows extension was not used for auditing. Audits used --no-baseline --timeout 2m --json and separate evidence directories. No new workflow runs were dispatched.
| Existing run | What the artifacts establish |
|---|---|
| 39499460077: smoke-copilot-sub-agents, October 20, 21:19 UTC | On the #70389 branch at b9f7f48, mini-whoami / gpt-5-mini and mini54-whoami / gpt-5.4-mini both have model.resolution with status: failed, cause: model_unavailable, resolved_model: null. The harness refuses to start Copilot. Its same-run reflection has complete discovery and 36 Copilot IDs; neither pin is available. The agent proxy token-usage file is empty. This run selected single_agent_control, but declaration validation fails before that experiment variant can run. |
| 39499464895: smoke-copilot-sdk-routed-claude, October 20, 21:19 UTC | Also on b9f7f48: mini-whoami / gpt-5.4-mini has the same failed resolution and startup refusal. The complete same-run catalogue excludes the pin. There is one successful Claude request, but its purpose is routing_classification, not Copilot/sub-agent execution. The subsequent execution/assertion failures are downstream of startup rejection. |
| 39506475007: smoke-copilot, October 20, 22:13 UTC | sandbox/firewall/awf-reflect.json is the supplied current catalogue snapshot: models_fetch_complete: true, one configured Copilot endpoint, 36 IDs. Use this snapshot to validate replacements. This run is not a successful fix-verification run: it also has an unrelated file-summarizer request-translation 400 involving frequency_penalty, and a missing safe-output artifact. Do not fold those failures into this pin-only fix. |
| 39375534368: daily-model-resolution, October 20, 05:33 UTC | Successful before #70389 merged, but agent-stdio.log:181 explicitly warns that run-analyzer's gpt-5.4-mini is not in the configured provider models and substitutes copilot-responses/gpt-5.6-luna. The log also emits subagent.model_unavailable; the unified session records 24 run-analyzer starts on that main/session model. Green Actions did not establish that the declared sub-agent model worked. |
Both supplied sub-agent startup failures have the same confirmed missing-model boundary, not a prompt failure, inference retry problem, or evidence of missing credentials.
Pi distinction: #70385 corrected Pi's failed sub-agent resolution records; Pi already rejected unavailable sub-agent models at startup. It did not newly introduce Pi alias support or startup rejection.
Endpoint constraints from run 39506475007
No advertised GPT model lists /chat/completions. The available GPT-5.x / GPT-6.x inference models advertise /responses and ws:/responses; older GPT entries such as gpt-4.1 and gpt-4o advertise no supported endpoints. Their presence in models does not make them usable Chat Completions replacements.
All six advertised Claude IDs support /chat/completions (and /v1/messages), including claude-sonnet-5.5 and claude-haiku-5.5. An engine/path that requires Chat Completions therefore needs a compatible general-purpose Claude model from this catalogue, not another GPT ID. The internal trajectory-compaction entry also advertises Chat Completions; it is not a general-purpose engine-model replacement.
Confirmed pins and dependent assertions/prompts
All links below are immutable source locations at the inspected main commit. Paths are under .github/workflows/.
Copilot and Pi sub-agents
| Workflow | Configured pin | Assertion / prompt locations to keep consistent |
|---|---|---|
smoke-copilot-sub-agents.md:176 |
mini-whoami: gpt-5-mini |
Expected model/endpoint list at 91-92; expected-response lists at 138-139 and 148-149; description/reply at 175/180. |
smoke-copilot-sub-agents.md:187 |
mini54-whoami: gpt-5.4-mini |
Same assertion and expected-response lists; description/reply at 186/191. |
smoke-copilot-sdk-routed-claude.md:92 |
mini-whoami: gpt-5.4-mini |
subAgents assertion at 61; retain the GPT /responses sub-agent under a Claude main model. Its fixed reply mini-whoami is not a model ID. |
daily-model-resolution.md:230 |
run-analyzer: gpt-5.4-mini |
Production SDK workflow; change the sub-agent pin, not just its already-migrated top-level model: gpt-5. |
smoke-pi-routed.md:115 |
mini-whoami: copilot/gpt-5.4-mini |
subAgents assertion at 72; preserve GPT /responses coverage. |
Legacy top-level copilot/gpt-5.4 pins
| Workflow and line | Configured value |
|---|---|
engine-conformance-aider.md:15 |
model: copilot/gpt-5.4 |
engine-conformance-crush.md:15 |
model: copilot/gpt-5.4 |
engine-conformance-deepseek-harness.md:16 |
model: copilot/gpt-5.4 |
engine-conformance-goose.md:16 |
model: copilot/gpt-5.4 |
engine-conformance-opencode.md:16 |
model: copilot/gpt-5.4 |
engine-conformance-pi.md:17 |
model: copilot/gpt-5.4 |
engine-conformance-pydantic-ai.md:15 |
model: copilot/gpt-5.4 |
smoke-aider.md:23 |
model: copilot/gpt-5.4 |
smoke-goose.md:23 |
model: copilot/gpt-5.4 |
Do not assume all seven conformance engines are Chat Completions-only or lack alias resolution. Built-in Pi already resolves main-model aliases and supports Responses and Chat Completions. Crush also chooses its provider type using wire-API inference. Their dead pins still need changing, but select replacements based on the actual engine path rather than asserting a uniform protocol limitation.
Concrete-only fallback and routing candidates
| Workflow | Dead field/value | Dependent assertions |
|---|---|---|
smoke-copilot.md:29 |
engine.fallback-models[0]: copilot/gpt-5.4 |
Keep the fallback list valid and distinct from the resolved main model. |
smoke-copilot-arm.md:27 |
engine.fallback-models[0]: copilot/gpt-5.4 |
Same. |
smoke-copilot-sdk.md:24 |
engine.fallback-models[1]: copilot/gpt-5.4-mini |
Main copilot/gpt-5 currently resolves to copilot/gpt-5.6-luna; do not select that same concrete ID as its fallback. |
smoke-copilot-routed.md:30 |
engine.model-routing.allowed-models[0]: gpt-5.4-mini |
Synchronize both allowedModels arrays: detection assertion at 60 and main assertion at 80. |
Possible solution
Prefer aliases where the field and engine already resolve them. Copilot sub-agent models now resolve aliases through #70389; Pi sub-agent models already use the shared resolver, with #70385 correcting failed liveness records. Against this snapshot, the existing gpt-5 alias resolves to gpt-5.6-luna. Preserve provider prefixes where appropriate.
The GPT sub-agent smokes deliberately test a GPT child on /responses, including the cross-family SDK case. Do not make them green by replacing every child with Claude. One option for smoke-copilot-sub-agents is gpt-5 for one child, testing alias resolution end to end, and exact gpt-5.6-luna for the other, testing exact-ID resolution. Update the identity descriptions/replies, parent expected-response lists, and post-step model/endpoint assertions together. Assert the model actually resolved and served by the harness, not a literal alias or an assumed parent fallback.
For Chat Completions engine paths and engines that do not resolve aliases, use a concrete live Claude ID such as copilot/claude-sonnet-5.5 or copilot/claude-haiku-5.5. Maintainers should choose conformance fidelity versus cost. Do not add alias-resolution support to an engine in this PR. For Pi, prefer an existing supported alias if retaining its GPT/Responses coverage is intended; a concrete live Claude ID is also possible, but not required by a Pi-wide Chat Completions limitation.
For fallback-models, use concrete live IDs, not aliases, and ensure each replacement differs from the workflow's resolved main model and does not duplicate another fallback. Preserve provider and request compatibility.
For smoke-copilot-routed, replace or drop the dead candidate, keep both GPT and Claude families in the pool, and synchronize the main and detection assertion arrays.
The built-in gpt-5-mini alias currently has no match in this Copilot catalogue. Run 39499460077 explicitly logs known alias 'gpt-5-mini' did not resolve against catalog. Record this limitation, but do not change alias definitions here; unified-catalogue/alias work is separate.
Not affected and existing baseline
daily-arxiv-researcher.md uses Codex with the OpenAI provider, not the Copilot catalogue. Its three openai/gpt-5.4-mini sub-agent pins are at 263, 280, and 309. Run 39394965127, October 20, 08:39 UTC, succeeded; its complete OpenAI inventory contains gpt-5.4-mini among 135 IDs. This confirms provider availability, not that every declared child was invoked in that run. Recent October 16-20 runs also succeeded. Leave these pins alone.
Running the existing actions/setup/js/model_pin_check.cjs from #70295 over current repository workflows against run 39506475007's reflection reproduces 25 unresolvable pins, matching #70398: the 18 scoped above plus seven existing out-of-scope pins. Those seven are smoke-pi-sub-agents.md (copilot/gpt-5-mini), smoke-pi.md (one copilot/gpt-5.4 fallback), smoke-service-ports.md and smoke-work-queue.md (two fallbacks each), and video-analyzer.md (copilot/gemini-3.7-flash). Do not silently expand this PR to fix them or claim this targeted fix makes the entire repository pin-clean.
Pure example/documentation mentions, such as daily-model-inventory.md's family table and illustrative JSON in daily-model-resolution.md, are not executable pins and are optional; avoid unrelated churn.
Acceptance checks
-
workflow-pins-live-catalogue: Runmake recompile. Runmodel_pin_check.cjsover repository workflows against the savedsandbox/firewall/awf-reflect.jsonfrom 39506475007. None of the 17 scoped workflows has anunresolvablepin. Include the report. The original reflection's SHA-256 is3d9fa7af7e07e93100bb614e45eb85abafbd16a3bbb2cb62a687a04cb5fff9b3. -
repository-pins-reflection-regression: Add or extend a named test inactions/setup/js/model_pin_check.test.cjs, using that saved reflection as a fixture and scanning the repository's actual workflows. Assert the report's classifications, not merely the CLI exit code: the existing CLI can exit successfully while reporting dead pins. Require zero unresolved pins in the scoped workflows and fail on any additional dead pin across the repository. If the seven out-of-scope baseline failures persist, enumerate their exact workflow/field/configured-value identities explicitly as known main failures; do not use a count-only or broad file exemption. Do not change the checker's implementation. -
copilot-subagent-resolution-and-endpoints: Dispatchsmoke-copilot-sub-agentsandsmoke-copilot-sdk-routed-claudeon the PR branch. Every declared sub-agent'smodel.resolution.statusisexactorresolved, neverfailed; served-model and endpoint assertions pass. For the first smoke, verify a delegating variant (inline_strictordelegated_sequential), not the intentionally negativesingle_agent_controlvariant. Keep GPT/responsesand Claude coverage. -
pi-subagent-resolution-and-endpoints: Dispatchsmoke-pi-routedon the PR branch. Each declared sub-agent hasexactorresolved, neverfailed; its served-model and endpoint assertions pass, including the GPT child's/responsesrequest. -
chat-completions-model-selection: Dispatch one relevant engine-conformance workflow andsmoke-aideron the PR branch, using their existing required inputs/context. Both get past model selection: nomodel_unavailableand no AWF 400 caused by selecting a model that does not support the requested endpoint. Choose a conformance engine/path that actually exercises Chat Completions, rather than treating Pi/Responses alone as evidence for this check. -
routed-candidate-consistency: Dispatchsmoke-copilot-routedon the PR branch. Routing selects from the updated live candidate list; both assertion arrays are synchronized and the routing assertions pass. -
pr-run-evidence-and-main-baseline: List all verification run URLs in the PR, identify the tested branch/commit and named check outcomes, and document any check that also fails onmain. The historical runs in this issue are diagnosis evidence, not verification of the future patch.
Scope
- Keep the PR to this one fix. Do not change files or behavior unrelated to it.
- Change workflow pins and their associated assertion and prompt text only, and regenerate their compiled
.lock.ymlfiles. The explicitly requested pin-check regression test and its saved-reflection fixture are the sole supporting non-workflow changes. - Do not change alias definitions, the resolver, the harnesses, AWF configuration generation, or the pin checker's logic. Do not disable fail-closed checks, weaken endpoint assertions, or remove the GPT sub-agent coverage to hide a failure.
- Before fixing a failing check, compare it with the same check on
main. If it also fails onmain, do not fix it in this PR; mergemainoncemainis fixed, and note in the PR which checks are known failures onmain. - This applies even if a bot comment, including PR Sous Chef, asks to fix a failing check: fix only failures caused by this PR's changes.
Activity
SivaKesava1 commentedon Oct 20, 2026
Scope update (maintainer decision): the fix also covers the six same-kind dead pins listed above as out of scope (
smoke-pi-sub-agents.mdcopilot/gpt-5-mini; thecopilot/gpt-5.4fallback insmoke-pi.md; the two fallbacks each insmoke-service-ports.mdandsmoke-work-queue.md).video-analyzer.md(copilot/gemini-3.7-flash) stays out as an owner decision. The pin-check regression test therefore expects zero unresolvable pins apart from that onevideo-analyzerentry. Addsmoke-pi-sub-agentsto the dispatch list.