{"record":{"id":"fa0622dd0353d8fb","repo":"aaif-goose/goose","slug":"the-connected-goose-server-does-not-support-secure","errorCode":null,"errorMessage":"The connected Goose server does not support securely scoped deeplink recipe parameters. Update the server and try again.","messagePattern":"The connected Goose server does not support securely scoped deeplink recipe parameters\\. Update the server and try again\\.","errorType":"exception","errorClass":"RecipeParameterScopesUnsupportedError","httpStatus":null,"severity":"error","filePath":"ui/desktop/src/sessions.ts","lineNumber":55,"sourceCode":"        const { enabled: _enabled, ...config } = extension;\n        return config as ExtensionConfig;\n      });\n  }\n  return [];\n}\n\nasync function createAcpSession(\n  workingDir: string,\n  options?: CreateSessionOptions\n): Promise<Session> {\n  const configuredParameterScope = options?.recipeDeeplink\n    ? beginConfiguredRecipeParameterScope()\n    : undefined;\n  try {\n    if (configuredParameterScope) {\n      const capabilities = await getAcpFeatureCapabilities();\n      if (!capabilities.recipeParameterScopes) {\n        throw new RecipeParameterScopesUnsupportedError();\n      }\n    }\n    const selectedNames = new Set(selectedExtensionConfigs(options).map((config) => config.name));\n    const gooseExtensions =\n      selectedNames.size > 0\n        ? (await getConfiguredGooseExtensions())\n            .filter((entry) => selectedNames.has(gooseExtensionName(entry.extension)))\n            .map((entry) => entry.extension)\n        : [];\n    return await acpChatSessionController.createSession(workingDir, gooseExtensions, {\n      recipeId: options?.recipeId,\n      recipeDeeplink: options?.recipeDeeplink,\n      recipeParameterScopeId: configuredParameterScope?.id,\n    });\n  } finally {\n    configuredParameterScope?.finish();\n  }\n}","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/aaif-goose/goose/blob/3810898a7447ec3299be72e223d3570a7aabf0ab/ui/desktop/src/sessions.ts#L37-L73","documentation":"When a session is created with a recipe deeplink (options.recipeDeeplink), the desktop opens a securely scoped parameter scope so the deeplink's recipe arguments cannot be injected into unrelated config. That scope requires the connected Goose server to advertise the recipeParameterScopes capability; getAcpFeatureCapabilities() is queried first and RecipeParameterScopesUnsupportedError is thrown when the server doesn't list it.","triggerScenarios":"Calling createAcpSession with recipeDeeplink while connected via GOOSE_EXTERNAL_BACKEND to an older goose server; server upgraded partially or capability probing fails and returns an empty capability set; protocol version negotiated below the scopes feature.","commonSituations":"Users on new desktop + old centrally-hosted backend opening goose:// deeplinks; mixed-version clusters; dev pointing GOOSE_EXTERNAL_BACKEND at a stale local build.","solutions":["Update the connected Goose server to a version that supports recipe parameter scopes, then retry the deeplink","If the server cannot be updated, open the recipe without deeplink parameters (avoid passing options.recipeDeeplink) so the capability check is skipped","Verify getAcpFeatureCapabilities() is reaching the right backend (check GOOSE_EXTERNAL_BACKEND URL) and not silently probing a stale one","Catch RecipeParameterScopesUnsupportedError specifically and show the update-server message instead of a generic failure"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const capabilities = await getAcpFeatureCapabilities();\nif (deeplinkParams && !capabilities.recipeParameterScopes) {\n  // show 'update server' message or drop the deeplink params — skip createAcpSession(recipeDeeplink)\n}","typeGuard":"const supportsRecipeParameterScopes = async (): Promise<boolean> =>\n  (await getAcpFeatureCapabilities()).recipeParameterScopes === true;","tryCatchPattern":"try {\n  session = await createAcpSession(dir, { recipeDeeplink });\n} catch (e) {\n  if (e instanceof RecipeParameterScopesUnsupportedError) {\n    // retry once WITHOUT recipeDeeplink so the session still opens\n    session = await createAcpSession(dir, { recipeId });\n  } else throw e;\n}","preventionTips":["Gate deeplink-parameter UI on the advertised capability before the user clicks","Version-capability matrix test: old server + new client must degrade, not crash","Distinguish RecipeParameterScopesUnsupportedError by type, not message text"],"tags":["capabilities","deeplink","recipes","version-skew","external-backend"],"backgroundTag":null,"analyzedSha":"3810898a7447ec3299be72e223d3570a7aabf0ab","analyzedAt":"2026-08-16T10:14:26.282Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}