The engine picker only constrained the UI; the router never gated on the chosen engine, so a job pinned to e.g. engine:codex could be claimed by a factory that doesn't run codex (the runner's resolve_engine honors an explicit engine with no availability check, so it would then fail at execution time). Add a pure engineEligible(job, caps) hard gate to the section-7 scheduler filter (and preemption): a concrete-engine job runs only on a factory advertising the matching engine:<e> cap. Gated only against engine-aware factories (those that advertise any engine:* token); engine-agnostic/legacy factories stay eligible, mirroring the picker's "engine set unknown => offer all" fallback. explainJob now surfaces the mismatch reason. No DB migration; behavior-preserving for legacy. Generated with [Devin](https://cli.devin.ai/docs) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> |
||
|---|---|---|
| .. | ||
| cowork-service | ||
| extraction-service | ||
| mcp-server | ||
| monitoring | ||
| platform-service | ||