@@ -267,11 +267,69 @@ describe("discoverAuthStorage", () => {
267267
268268 expect ( credentials . openrouter ) . toBeUndefined ( ) ;
269269 expect ( credentials . anthropic ) . toBeUndefined ( ) ;
270- expect ( discoveryCredentials . openrouter ?. type ) . toBe ( "api_key" ) ;
271- expect ( discoveryCredentials . anthropic ?. type ) . toBe ( "api_key" ) ;
270+ // Read-only discovery must keep configured SecretRef markers, not drop the
271+ // provider when resolveAuthProfileOrder runs in readinessMode "read-only".
272+ expect ( discoveryCredentials . openrouter ) . toEqual ( {
273+ type : "api_key" ,
274+ key : "openclaw-secret-ref-configured" ,
275+ } ) ;
276+ expect ( discoveryCredentials . anthropic ) . toEqual ( {
277+ type : "api_key" ,
278+ key : "openclaw-secret-ref-configured" ,
279+ } ) ;
272280 expect ( discoveryCredentials . expired ) . toBeUndefined ( ) ;
273281 } ) ;
274282
283+ it ( "keeps keyRef-only profiles through ordered read-only discovery" , ( ) => {
284+ // Regression for SecretRef-backed providers: ordering must not filter
285+ // unresolved_ref profiles when discovery requests placeholders.
286+ const store = {
287+ version : 1 as const ,
288+ profiles : {
289+ "openai:ref-only" : {
290+ type : "api_key" as const ,
291+ provider : "openai" ,
292+ keyRef : { source : "env" as const , provider : "default" , id : "OPENAI_API_KEY" } ,
293+ } ,
294+ "openai:literal-second" : {
295+ type : "api_key" as const ,
296+ provider : "openai" ,
297+ key : "sk-literal-fallback" ,
298+ } ,
299+ } ,
300+ } ;
301+ const executionMap = resolveAgentCredentialMapFromStore ( store , {
302+ config : {
303+ auth : {
304+ order : {
305+ openai : [ "openai:ref-only" , "openai:literal-second" ] ,
306+ } ,
307+ } ,
308+ } as never ,
309+ } ) ;
310+ const readOnlyMap = resolveAgentCredentialMapFromStore ( store , {
311+ includeSecretRefPlaceholders : true ,
312+ config : {
313+ auth : {
314+ order : {
315+ openai : [ "openai:ref-only" , "openai:literal-second" ] ,
316+ } ,
317+ } ,
318+ } as never ,
319+ } ) ;
320+
321+ // Execution mode cannot resolve the SecretRef, so it falls through.
322+ expect ( executionMap . openai ) . toEqual ( {
323+ type : "api_key" ,
324+ key : "sk-literal-fallback" ,
325+ } ) ;
326+ // Read-only discovery keeps the ordered keyRef profile as the configured marker.
327+ expect ( readOnlyMap . openai ) . toEqual ( {
328+ type : "api_key" ,
329+ key : "openclaw-secret-ref-configured" ,
330+ } ) ;
331+ } ) ;
332+
275333 it ( "marks keyRef-only auth profiles configured for read-only model discovery" , async ( ) => {
276334 await withAgentDir ( async ( agentDir ) => {
277335 writeAuthProfilesSqlite ( agentDir , {
0 commit comments