Hardening the Amplifier recipe engine for production
The engine lives in microsoft/amplifier-bundle-recipes as one Python module, executor.py — its module docstring reads "Recipe execution engine." It runs multi-step recipes end-to-end.
The change wasn't a rewrite. It was a handful of verifiable commits.
In the week of Jan 25-31, 2026, amplifier-bundle-recipes had 5 commits on main. The keystone they depend on — the ProviderPreference dataclass — landed in microsoft/amplifier-foundation.
Small burst, two repos. But first: what already worked?
By mid-January the executor already ran recipes with bounded parallelism, rate limiting, cancellation, and a first cut of provider/model selection — good enough for single-provider, local runs.
A capable baseline. So what was still missing for production?
A single provider outage broke a run: there was no ordered fallback. And running as a backend web service, Path.cwd() returned the server's directory instead of the user's project.
Two concrete failures. The week's work closed both — starting with paths.
Path.cwd() pointed at the server, not the user's project.Commit 0e014938 (PR #15, merged Jan 26) has the engine query the session.working_dir capability, falling back to Path.cwd() for backward compatibility — so web deployments resolve the user's project directory.
One gap closed. Now the harder one: provider resilience.
On Jan 26 the engine refactored to use foundation's ProviderPreference for provider/model selection (f2c0ff4f, +22/-13) and deleted its own model_resolver.py (5fbd284e, -173 lines) to prevent context poisoning.
The engine now leans on a shared primitive — which is where the keystone comes in.
On Jan 25 foundation gained a ProviderPreference dataclass with an ordered fallback chain (984812bd, by Brian Krabach). By Jan 28 the engine added explicit provider_preferences lists with fallback order (d79e57c2, by momuno, via PR #17).
The engine tries each provider until one is available. That is production resilience.
Correct web-deployment paths and ordered provider fallback made the engine safe to run as a backend service. The very next week — Feb 7 — convergence loops (while_condition / break_when) built on that hardened base.
The convergence work (53089b12) landed after the Jan 25 week, not within it.
while_condition/break_when) on the hardened base 53089b12Data as of: Independently re-derived from microsoft/amplifier-bundle-recipes and microsoft/amplifier-foundation for the week of Jan 25-31, 2026.
Feature status: Provider resilience — VERIFIED. Correct web-deployment paths — VERIFIED. Convergence loops — VERIFIED but dated Feb 7, 2026 (after the week).
Commands run:
gh api 'repos/microsoft/amplifier-bundle-recipes/commits?sha=main&since=2026-01-25T00:00:00Z&until=2026-02-01T00:00:00Z&per_page=100' — 5 commitsgh api --paginate 'repos/microsoft/amplifier-foundation/commits?sha=main&since=...&until=...' | jq '.[].sha' | wc -l — 34 commitsgh api repos/microsoft/amplifier-bundle-recipes/commits/{0e014938,f2c0ff4f,5fbd284e,d79e57c2} — per-commit stats and messagesgit show -s --format='%ai' 984812bd — foundation ProviderPreference date (2026-01-25 20:03:20 -0800)git show origin/main:.../executor.py | grep -n 'from amplifier_foundation import ProviderPreference' — engine dependencygit show 5fbd284e~1:.../model_resolver.py | wc -l — deleted file was 173 linesCorrections applied: executor.py line count is snapshot-dependent (not asserted here). The legacy "51 commits" figure was not reproducible and is omitted. Convergence loops honestly dated Feb 7, 2026.
Primary contributors: Brian Krabach (984812bd, 0e014938, f2c0ff4f, 5fbd284e); Mollie Munoz / momuno (d79e57c2, PR #17).