@@ -247,6 +247,63 @@ describe("custom worker efforts", () => {
247247 expect ( worker ?. provider . explicitReasoningEffort ) . toBeUndefined ( ) ;
248248 } ) ;
249249
250+ test ( "explicit parent pin survives the applyResolvedProvider rebuild (CL-10227)" , async ( ) => {
251+ // A profile/director spawn with a resolving inference rebuilds `provider`
252+ // from settings via applyResolvedProvider. That rebuild must not drop the
253+ // operator-explicit parent-effort marker — otherwise the operator pin is
254+ // demoted to a derived parent and the leaf role default (medium) wins,
255+ // violating the CL-10227 fleet-pin contract. Here the model ladder supports
256+ // both the parent ("none") and the role default ("medium"), so only the
257+ // surviving explicit flag can pick "none".
258+ let worker : RunSubAgentParams | undefined ;
259+ const pinProvider : ProviderCatalogEntry = {
260+ ...provider ,
261+ reasoningEfforts : [ "none" , "medium" , "max" ] ,
262+ } ;
263+ const deps = createFleetDeps (
264+ async ( params ) => {
265+ worker = params ;
266+ return { report : "done" } ;
267+ } ,
268+ {
269+ settings : { providers : { custom : pinProvider } } ,
270+ catalog : [ pinProvider ] ,
271+ profiles : [
272+ {
273+ id : "custom-leaf" ,
274+ inference : {
275+ mode : "pin" ,
276+ order : [
277+ {
278+ provider : pinProvider . name ,
279+ model : "custom-model" ,
280+ } ,
281+ ] ,
282+ } ,
283+ } ,
284+ ] ,
285+ } ,
286+ ) ;
287+ deps . provider = {
288+ providerName : pinProvider . name ,
289+ baseURL : pinProvider . baseURL ,
290+ model : "custom-model" ,
291+ reasoningEffort : "none" ,
292+ explicitReasoningEffort : true ,
293+ } ;
294+ const result = await callFleetToolRaw ( createSpawnAgentTool ( deps ) , {
295+ description : "inspect" ,
296+ prompt : "inspect" ,
297+ agent : "custom-leaf" ,
298+ } ) ;
299+ expect ( result . isError ) . not . toBe ( true ) ;
300+ await callFleetToolRaw ( fleetTools ( deps ) . wait , { timeout_ms : 2000 } ) ;
301+ // The operator-explicit parent pin ("none") survives the rebuild and beats
302+ // the leaf role default ("medium").
303+ expect ( worker ?. provider . reasoningEffort ) . toBe ( "none" ) ;
304+ expect ( worker ?. provider . explicitReasoningEffort ) . toBe ( true ) ;
305+ } ) ;
306+
250307 test ( "explicit effortPin still wins over an explicit parent" , async ( ) => {
251308 // An explicit parent is a fleet pin, but the cascade still lets an explicit
252309 // effortPin outrank it — the legacy pin-max case stays.
0 commit comments