@@ -4,8 +4,8 @@ import { resolveModelFamilyPolicy } from "./model-family-policy.js";
44describe ( "resolveModelFamilyPolicy" , ( ) => {
55 test ( "defaults are permissive for an unrecognized provider" , ( ) => {
66 const policy = resolveModelFamilyPolicy ( {
7- providerName : "anthropic " ,
8- model : "claude-sonnet-4 " ,
7+ providerName : "openai " ,
8+ model : "gpt-4.1 " ,
99 } ) ;
1010 expect ( policy . family ) . toBe ( "default" ) ;
1111 expect ( policy . applyGrokFinishBias ) . toBe ( false ) ;
@@ -55,8 +55,8 @@ describe("resolveModelFamilyPolicy", () => {
5555
5656 test ( "advertisedToolDeny is empty by default and never contains use_skill" , ( ) => {
5757 const leaf = resolveModelFamilyPolicy ( {
58- providerName : "anthropic " ,
59- model : "claude-opus-4-6 " ,
58+ providerName : "openai " ,
59+ model : "gpt-4.1 " ,
6060 orchestrator : false ,
6161 } ) ;
6262 expect ( leaf . advertisedToolDeny ) . toEqual ( [ ] ) ;
@@ -124,11 +124,58 @@ describe("resolveModelFamilyPolicy", () => {
124124 orchestrator : true ,
125125 } ) ;
126126 expect ( orchestrator . promptResidual ) . toBeUndefined ( ) ;
127+ // Default-family probe: anthropic/claude-sonnet-4 would hit the claude
128+ // row now, and the gpt row has NOT landed yet (#1135), so openai/gpt-4.1
129+ // is the probe that still resolves to the default family.
127130 const base = resolveModelFamilyPolicy ( {
128- providerName : "anthropic " ,
129- model : "claude-sonnet-4 " ,
131+ providerName : "openai " ,
132+ model : "gpt-4.1 " ,
130133 } ) ;
134+ expect ( base . family ) . toBe ( "default" ) ;
131135 expect ( base . promptResidual ) . toBeUndefined ( ) ;
132136 } ) ;
133137 } ) ;
138+
139+ test ( "claude leaves carry the XML task_guidance residual; orchestrators do not" , ( ) => {
140+ const leaf = resolveModelFamilyPolicy ( {
141+ providerName : "anthropic" ,
142+ model : "claude-sonnet-4" ,
143+ orchestrator : false ,
144+ } ) ;
145+ expect ( leaf . family ) . toBe ( "claude" ) ;
146+ expect ( leaf . promptResidual ) . toContain ( "<task_guidance>" ) ;
147+ expect ( leaf . promptResidual ) . toContain ( "</task_guidance>" ) ;
148+ expect ( leaf . advertisedToolDeny ) . toEqual ( [ ] ) ;
149+ const orchestrator = resolveModelFamilyPolicy ( {
150+ providerName : "anthropic" ,
151+ model : "claude-sonnet-4" ,
152+ orchestrator : true ,
153+ } ) ;
154+ expect ( orchestrator . promptResidual ) . toBeUndefined ( ) ;
155+ } ) ;
156+
157+ // The gpt family row has NOT landed yet (#1135): openai/gpt-4.1 and
158+ // codex/gpt-5.1 are default-family probes here, asserting they resolve to
159+ // the default family with no residual. Grok keeps its CL-8297 tool-budget
160+ // residual — the "no residual" claim below is default-family-only.
161+ test ( "gpt probes resolve to default with no residual; grok keeps its tool budget" , ( ) => {
162+ for ( const input of [
163+ { providerName : "openai" , model : "gpt-4.1" } ,
164+ { providerName : "codex" , model : "gpt-5.1" } ,
165+ ] as const ) {
166+ const policy = resolveModelFamilyPolicy ( {
167+ ...input ,
168+ orchestrator : false ,
169+ } ) ;
170+ expect ( policy . family ) . toBe ( "default" ) ;
171+ expect ( policy . promptResidual ) . toBeUndefined ( ) ;
172+ }
173+ const grok = resolveModelFamilyPolicy ( {
174+ providerName : "xai/default" ,
175+ model : "grok-4.6" ,
176+ orchestrator : false ,
177+ } ) ;
178+ expect ( grok . family ) . toBe ( "grok" ) ;
179+ expect ( grok . promptResidual ) . toContain ( "Tool budget:" ) ;
180+ } ) ;
134181} ) ;
0 commit comments