Repository navigation
Daily Model Inventory Checker: deterministic workflow model-pin check against the live Copilot catalogue - #70295
Conversation
…hecker Co-authored-by: SivaKesava1 <11771739+SivaKesava1@users.noreply.github.com>
|
End-to-end verification at
One change requested:
CI is green (JS shards 1–4, typecheck, lint, stale lock files). |
…nventory-checker Co-authored-by: SivaKesava1 <11771739+SivaKesava1@users.noreply.github.com>
Co-authored-by: SivaKesava1 <11771739+SivaKesava1@users.noreply.github.com>
There was a problem hiding this comment.
🟡 Changes recommended
Host execution of agent-writable code and incorrect model-pin classifications remain unresolved.
10 open issues
Post-step executes agent-modifiable checkout code on the host · New Imported aliases incorrectly override built-in aliases · New Preference-only engine incorrectly overrides imported engine ID · New Model precedence ignores imported defaults and execution model · New Detection scope ignores imported detection configuration · New Detection engine drops inherited BYOK configuration · New Detector provider uses sibling model over engine-specific model · New Detector provider ignores effective detection engine selection · New Eval model provider is not recomputed from eval override · New Expression-based model aliases falsely report unavailable models · New
What changed in this PR
Adds deterministic workflow model-pin validation to gh-aw’s daily inventory using the live Copilot catalogue.
Changes:
- Collect and classify workflow pins, producing JSON and Markdown reports.
- Add fixture-based coverage for collection and resolution.
- Integrate issue summaries, action-required titles, and report artifacts.
| File | Description |
|---|---|
actions/setup/js/model_pin_check.test.cjs |
Tests pin collection and classification. |
actions/setup/js/model_pin_check.cjs |
Implements deterministic checking and reporting. |
.github/workflows/daily-model-inventory.md |
Integrates checks and reporting instructions. |
.github/workflows/daily-model-inventory.lock.yml |
Regenerates executable workflow steps. |
Review effort: Max
Done in 64f48c4: "Check workflow model pins" now has |
|
@copilot address the following outstanding work in one pass:
Push the necessary fixes, reply to each listed review thread and resolve it when addressed. Ignore feedback already answered or resolved. Use the pr-finisher skill and stop when only human review or CI remains; do not trigger CI. Sous-chef head: 64f48c4
|
…nventory-checker Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
Merged the latest |
|
@copilot address the following outstanding work in one pass:
Push the necessary fixes, reply to each listed review thread and resolve it when addressed. Ignore feedback already answered or resolved. Use the pr-finisher skill and stop when only human review or CI remains; do not trigger CI. Sous-chef head: c4e2397
|
Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
Updated the fixture to expect |
Co-authored-by: SivaKesava1 <11771739+SivaKesava1@users.noreply.github.com>
|
End-to-end verification at
Ready for review. |
|
🎉 This pull request is included in a new release. Release: |


Nothing checked gh-aw's own workflow model pins against what Copilot still offers. When
claude-opus-5andclaude-opus-4.8were retired on 16 Oct, Design Decision Gate failed on every PR.daily-action-setup-security-auditwas silently downgraded to Haiku and lost its threat-detection verdict, yet still showed green. The Daily Model Inventory Checker reads the live catalogue every day but never looked at pins, and its findings were agent judgement, not a check.This PR adds a checked-in, unit-tested pin checker and wires it into that workflow.
Checker:
actions/setup/js/model_pin_check.cjsCollection. It collects every model name configured by
.github/workflows/*.mdand records the workflow, source file and field for each:model;engine.{model, fallback-models, provider.model, models.*, model-routing.allowed-models};safe-outputs.threat-detection.{model, engine.*, engine-config.*};safe-outputs.assign-to-agent.model;evals[].model,evals.modelandevals.questions[].model;enclaves[].agent.model..github/agents/*.mdfiles and inline## agent:blocks.models:alias definitions from the workflow and its imports.permissions.modelsandmodels.providers.*are excluded.determineNestedBaseDir). Remote and@builtin:imports are skipped and listed.Provider scope. A
copilot/(or other) prefix on the model wins. Otherwise the engine's provider applies:model-providerorprovider.providerof an imported engine definition.engine.env.COPILOT_PROVIDER_BASE_URLis set.Classification (in this order):
${{ … }}→ not checked, reasonexpression.inherited→ not checked, sentinel (the parent's pin has its own row).provider not in the Copilot catalogue.autowhere the gateway does the selection (every engine except copilot, andassign-to-agent) → not checked, sentinel.resolveConfiguredModelruns withprovider: "copilot":cause.exactresult is also tested withisLiveModelId(base, buildProviderCatalog(...)):model_unavailablecatalog_unavailableresolve_model_alias.cjsandmodel_aliases.jsonare unchanged.Output. The checker writes three files to
--out-dir:model-pins-summary.mdis the issue section: "Action required" first when any pin is unresolvable, then the catalogue size, counts and not-checked reasons. When the catalogue is unavailable it says so in one line instead of listing about 170catalog_unavailablerows.model-pins.mdlists every pin, about 38 KB today. That is too large to sit in the issue alongside the rest of the report, so it goes in the artifact.model-pins.jsonholds the same data with the counts.Workflow:
daily-model-inventory.md/reflectfetch. It pastesmodel-pins-summary.mdverbatim at the top of the issue and must not classify pins itself.counts.unresolvable > 0, the title isModel alias inventory - action required - YYYY-MM-DD, never "no changes needed".max: 1andclose-older-issuesare unchanged./tmp/gh-aw/agent/awf-reflect.json, thensandbox/firewall/awf-reflect.json) and falls back to Step 0's file. It appendsmodel-pins.mdto the step summary and uploads themodel-pinsartifact./reflectis reachable only from inside the sandbox, and the agent has to put the result in the issue. The post-step makes the artifact and step summary independent of the agent.Tests:
model_pin_check.test.cjsThey use the recorded
/reflectfrom Design Decision Gate run 38945917145 (fixtures/model_resolution_reflect.cjs) and small temporary fixture workflows. They cover the seven acceptance cases:copilot/claude-opus-5→ unresolvablemodel_unavailable, listed under "Action required" with its file and field.copilot/opus→ resolves tocopilot/claude-opus-5.5.gpt-5-mini→ exact.${{ vars.GH_AW_MODEL_AGENT_COPILOT }}→ not checked,expression.claude-sonnet-4-6→ not checked, provider not in the Copilot catalogue.models:alias whose every candidate is gone → unresolvable.They also cover multi-field and import collection, nested imports, BYOK,
inherited,copilot/prefix precedence, an unavailable catalogue and the CLI's three output files.Findings on
main(not fixed here)Against the recorded 40-model catalogue the checker finds 278 pins: 135 exact, 31 aliases that resolve, 4 unresolvable and 108 not checked.
daily-action-setup-security-audit.mdmodelclaude-opus-4.8model_unavailablesmoke-copilot-sub-agents.md## agent: 'nano-whoami' modelgpt-5-nanomodel_unavailablesmoke-github-claude.mdengine.fallback-models[1]copilot/claude-sonnet-4.6model_unavailablevideo-analyzer.mdmodelcopilot/gemini-3.7-flashmodel_unavailableThe two
o4-mini-awAzure pins are not checked (BYOK). Theinheritedpin independabot-burner.mdis not checked under the sentinel rule; it is still unconfirmed whether the Copilot CLI treats it as "use the parent model".Not yet done
The end-to-end run has not been dispatched. A maintainer needs to run
gh workflow run daily-model-inventory.lock.yml --ref <branch>and check the resulting issue and themodel-pinsartifact.