{"record":{"id":"519cf150de265a2f","repo":"Tencent/WeKnora","slug":"unsupported-sandbox-binding-provider-q","errorCode":null,"errorMessage":"unsupported sandbox binding provider %q","messagePattern":"unsupported sandbox binding provider %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/sandbox/session_binding.go","lineNumber":77,"sourceCode":"\t// since replaced. The sandbox keeps serving until the session's next\n\t// resolve, which destroys and recreates it; see InvalidateByConfig.\n\tStaleAt *time.Time `json:\"stale_at,omitempty\"`\n}\n\n// Validate checks a binding against the current schema and authoritative key.\nfunc (b SessionSandboxBinding) Validate(key SessionSandboxKey) error {\n\tif err := key.Validate(); err != nil {\n\t\treturn err\n\t}\n\tif b.Version != SessionSandboxBindingVersion {\n\t\treturn fmt.Errorf(\n\t\t\t\"sandbox binding version must be %d, got %d\",\n\t\t\tSessionSandboxBindingVersion,\n\t\t\tb.Version,\n\t\t)\n\t}\n\tif !isRemoteProvider(b.Provider) {\n\t\treturn fmt.Errorf(\"unsupported sandbox binding provider %q\", b.Provider)\n\t}\n\tif b.TenantID != key.TenantID || b.SessionID != key.SessionID {\n\t\treturn errors.New(\"sandbox binding identity does not match its key\")\n\t}\n\tif strings.TrimSpace(b.SandboxID) == \"\" {\n\t\treturn errors.New(\"sandbox binding requires sandbox ID\")\n\t}\n\tif strings.TrimSpace(b.TemplateID) == \"\" {\n\t\treturn errors.New(\"sandbox binding requires template ID\")\n\t}\n\tif b.CreatedAt.IsZero() {\n\t\treturn errors.New(\"sandbox binding requires creation time\")\n\t}\n\treturn nil\n}\n\n// SessionSandboxBindingStore persists bindings and serializes lifecycle\n// transitions. Implementations must use create-if-absent and compare-delete","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/Tencent/WeKnora/blob/988cbb03305e055d8ebb7d46d9ac6cc0803cd074/internal/sandbox/session_binding.go#L59-L95","documentation":"SessionSandboxBinding.Validate only accepts providers for which isRemoteProvider returns true. A binding carrying an unknown/unsupported provider string is rejected with this %q-quoted error. It guards against bindings written by other tooling or with typo'd provider names.","triggerScenarios":"Persisting or loading a SessionSandboxBinding whose Provider field is empty, renamed, or from a provider the library build does not support (e.g. \"local\", \"firecracker\", typo like \"docke\").","commonSituations":"Config file with a provider name not compiled into the build; cross-team tooling writing bindings with its own provider enum; upgrades that removed a provider; hand-edited Redis values.","solutions":["Set Provider to one of the library's supported remote providers (see isRemoteProvider)","Migrate or delete bindings written with an unsupported provider so the session rebinds","Validate provider names from config against the library's supported list at startup","Rebuild with the provider enabled if a supported provider was excluded via build tags"],"exampleFix":"// before\nb.Provider = cfg.SandboxProvider // e.g. \"custom-local\"\n// after\nif !supportedProviders[cfg.SandboxProvider] {\n    return fmt.Errorf(\"provider %q unsupported\", cfg.SandboxProvider)\n}\nb.Provider = cfg.SandboxProvider","handlingStrategy":"validation","validationCode":"known := map[string]bool{\"docker\": true /* + other supported providers */}\nif !known[cfg.Provider] {\n    return fmt.Errorf(\"provider %q not supported\", cfg.Provider)\n}","typeGuard":"func providerSupported(p string) bool {\n    switch p { case \"docker\", \"kubernetes\": return true }\n    return false\n}","tryCatchPattern":"if err := b.Validate(key); err != nil {\n    if strings.Contains(err.Error(), \"unsupported sandbox binding provider\") {\n        return recreateBindingWithSupportedProvider(ctx, key)\n    }\n    return err\n}","preventionTips":["Restrict provider config to an allowlist parsed at startup","Migrate away from providers removed in library upgrades","Never hand-edit binding records in storage"],"tags":["go","sandbox","provider","binding-validation"],"backgroundTag":"unsupported-provider","analyzedSha":"988cbb03305e055d8ebb7d46d9ac6cc0803cd074","analyzedAt":"2026-09-02T14:41:08.344Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}