step_provider Server-Side Auto-Fill from RecipeStep#3377
Merged
Trecek merged 5 commits intoMay 31, 2026
Merged
Conversation
0ae1fa4 to
5ab7caa
Compare
…_provider_profile When run_skill is called with step_provider="" and a step_name that maps to a RecipeStep with provider="minimax", the server now resolves step_provider server-side BEFORE calling _resolve_provider_profile. This closes the 66-line ordering gap where the late auto-fill block ran after provider resolution and never included step_provider anyway. Defense-in-depth: also updated sous-chef SKILL.md to instruct the LLM to forward step_provider from recipe step provider: fields to run_skill. Tests: 3 new tests in test_tools_execution_step_resolution.py covering auto-fill, LLM-override precedence, and observability logging. 1 new contract test in test_sous_chef_parameter_forwarding.py. Closes #3366. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ep_provider test
The spy always returns a hardcoded ('minimax', ...) tuple, so the assertion
executor.calls[0].provider_name == 'minimax' cannot distinguish whether
auto-fill logic ran vs. the spy's hardcoded return. The meaningful check
captured_kwargs['step_provider'] == 'minimax' is already present and sufficient.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
step_provider was the only recipe-step parameter whose server-side auto-fill
was gated on is_feature_enabled('providers'). The analogous auto-fills for
output_dir, stale_threshold, and idle_output_timeout live in the unconditional
block at the bottom of run_skill. Move step_provider there for consistency,
reusing the already-fetched _recipe_step variable.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ntions_step_provider
Path("src/...").read_text() is cwd-relative and raises FileNotFoundError when
pytest is invoked from a non-root directory. Use Path(__file__).parents[2] to
anchor the path to the test file's location.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rs-gate The first fix placed the auto-fill in the post-gate unconditional block, but _resolve_provider_profile is called inside the gate, so step_provider must be filled before the gate check. Move it to the pre-gate position (after _cfg but before is_feature_enabled) so it runs unconditionally and the filled value reaches _resolve_provider_profile on the same execution path. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
5ab7caa to
77f693a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fix the
step_providerauto-fill gap intools_execution.pywhereRecipeStep.provideris parsed from YAML but never read server-side, causing the Minimax provider to silently bypass in agent-eval. The_resolve_provider_profilecall at line 374 receivesstep_provider=""because the auto-fill block at line 440+ runs 66 lines too late and doesn't includestep_provideranyway.The fix adds an early auto-fill block before
_resolve_provider_profilethat reads_recipe_step.providerwhen the caller passes an emptystep_provider. This maps to Tier 3 in the resolution cascade, correctly subordinate to all config-level overrides (Tiers 0-2). A secondary fix addsstep_providerforwarding instructions to the sous-chef SKILL.md for defense-in-depth.Audit finding (out of scope):
RecipeStep.modelhas the same auto-fill gap — it is declared on the schema but never server-side resolved. This should be tracked as a separate issue.Requirements
Conflict Resolution Decisions
The following files had merge conflicts that were automatically resolved.
Architecture Impact
No architecture lens diagrams were generated for this PR.
Implementation Plan
Plan file:
/home/talon/projects/autoskillit-runs/impl-20260530-183127-514496/.autoskillit/temp/make-plan/step_provider_auto_fill_plan_2026-05-30_183600.md🤖 Generated with Claude Code via AutoSkillIt
Token Usage Summary
* Step used a non-Anthropic provider; caching behavior may differ.
Token Efficiency
Model Usage Breakdown