{"record":{"id":"3df345e822e939c4","repo":"gastownhall/beads","slug":"configured-storage-backend-q-is-no-longer-support","errorCode":null,"errorMessage":"configured storage backend %q is no longer supported and cannot be opened as Dolt: %s","messagePattern":"configured storage backend %q is no longer supported and cannot be opened as Dolt: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"internal/storage/dolt/open.go","lineNumber":87,"sourceCode":"// So every hand-built dolt.Config that resolves its port this way goes through\n// here rather than reaching for .Port. Callers that want to resolve only when\n// unset keep their own `if cfg.ServerPort == 0` guard; this function is\n// unconditional.\nfunc ApplyResolvedServerPort(beadsDir string, cfg *Config) {\n\tresolved := doltserver.DefaultConfig(beadsDir)\n\tcfg.ServerPort = resolved.Port\n\tcfg.ServerPortSource = resolved.PortSource\n\tcfg.ServerPortSharedServer = resolved.PortSharedServer\n}\n\n// requireDoltBackend keeps metadata-driven callers from bypassing the storage\n// factory and interpreting another backend's workspace as Dolt. Removed backend\n// identifiers deliberately remain recognizable in metadata so this check can fail\n// closed instead of opening a new, empty Dolt database.\nfunc requireDoltBackend(fileCfg *configfile.Config) error {\n\tswitch fileCfg.Backend {\n\tcase configfile.BackendPostgres, configfile.BackendMySQL, configfile.BackendSQLite:\n\t\treturn fmt.Errorf(\"configured storage backend %q is no longer supported and cannot be opened as Dolt: %s\", fileCfg.Backend, configfile.RemovedBackendDetail(fileCfg.Backend))\n\t}\n\tif !configfile.IsSupportedBackend(fileCfg.Backend) {\n\t\treturn fmt.Errorf(\"configured storage backend %q in metadata.json is not recognized and cannot be opened as Dolt; %s\", fileCfg.Backend, configfile.BackendNotOpenedGuarantee)\n\t}\n\tbackend := fileCfg.GetBackend()\n\tif backend != configfile.BackendDolt {\n\t\treturn fmt.Errorf(\"configured storage backend %q cannot be opened as Dolt\", backend)\n\t}\n\treturn nil\n}\n\n// NewFromConfig creates a DoltStore based on the metadata.json configuration.\n// beadsDir is the path to the .beads directory.\nfunc NewFromConfig(ctx context.Context, beadsDir string) (*DoltStore, error) {\n\treturn NewFromConfigWithOptions(ctx, beadsDir, nil)\n}\n\n// NewFromConfigWithCLIOptions creates a DoltStore using the standalone CLI","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/dolt/open.go#L69-L105","documentation":"Opening a DoltStore was refused because metadata.json records a backend that has been removed from beads (Postgres, MySQL, SQLite). The check fails closed deliberately: beads will not interpret another backend's workspace as Dolt or silently create an empty Dolt database.","triggerScenarios":"Calling NewFromConfigWithOptions / NewFromConfigWithCLIOptions when fileCfg.Backend is BackendPostgres, BackendMySQL, or BackendSQLite.","commonSituations":"Upgrading from an older beads version that supported those backends; reusing a .beads directory created by a different tool or fork; hand-editing metadata.json backend field.","solutions":["Use the documented migration path to convert the legacy backend data to Dolt before opening","Restore the correct .beads directory (one with backend: dolt) if the wrong directory was pointed at","Correct metadata.json only if you are certain the directory is actually a Dolt workspace","Consult configfile.RemovedBackendDetail in the error text — it names the specific removal/migration guidance"],"exampleFix":"// before: metadata.json from legacy install\n{\"backend\": \"sqlite\"}\n\n// after: migrate data, then\n{\"backend\": \"dolt\"}","handlingStrategy":"validation","validationCode":"// Check backend before opening with the Dolt factory\ncfg, _ := configfile.Load(beadsDir)\nif cfg.Backend != \"dolt\" {\n    return fmt.Errorf(\"refusing Dolt open: backend is %q\", cfg.Backend)\n}","typeGuard":null,"tryCatchPattern":"store, err := dolt.NewFromConfigWithOptions(beadsDir, opts)\nif err != nil && strings.Contains(err.Error(), \"no longer supported\") {\n    // run the legacy-backend migration before retrying\n    return migrateLegacyBackend(beadsDir)\n}","preventionTips":["Read metadata.json's backend field before choosing an open path","Complete the documented migration from removed backends before upgrading","Never point tooling at a .beads directory from a different tool/fork without checking backend"],"tags":["storage","backend","configuration","migration"],"backgroundTag":"unsupported-storage-backend","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}