{"record":{"id":"3f0bf4382335e5a1","repo":"gastownhall/beads","slug":"db-listremotes-query-w","errorCode":null,"errorMessage":"db: ListRemotes: query: %w","messagePattern":"db: ListRemotes: query: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/domain/db/remote.go","lineNumber":41,"sourceCode":"\nfunc (r *remoteSQLRepositoryImpl) AddRemote(ctx context.Context, name, url string) error {\n\tif err := r.vc.Remote(ctx, \"add\", name, url); err != nil {\n\t\treturn fmt.Errorf(\"db: AddRemote %s: %w\", name, err)\n\t}\n\treturn nil\n}\n\nfunc (r *remoteSQLRepositoryImpl) RemoveRemote(ctx context.Context, name string) error {\n\tif err := r.vc.Remote(ctx, \"remove\", name); err != nil {\n\t\treturn fmt.Errorf(\"db: RemoveRemote %s: %w\", name, err)\n\t}\n\treturn nil\n}\n\nfunc (r *remoteSQLRepositoryImpl) ListRemotes(ctx context.Context) ([]domain.Remote, error) {\n\trows, err := r.runner.QueryContext(ctx, \"SELECT name, url FROM dolt_remotes\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"db: ListRemotes: query: %w\", err)\n\t}\n\tdefer rows.Close()\n\n\tvar remotes []domain.Remote\n\tfor rows.Next() {\n\t\tvar rem domain.Remote\n\t\tif err := rows.Scan(&rem.Name, &rem.URL); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"db: ListRemotes: scan: %w\", err)\n\t\t}\n\t\tremotes = append(remotes, rem)\n\t}\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, fmt.Errorf(\"db: ListRemotes: rows: %w\", err)\n\t}\n\treturn remotes, nil\n}\n","sourceCodeStart":23,"sourceCodeEnd":58,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/domain/db/remote.go#L23-L58","documentation":"This error indicates the SQL query 'SELECT name, url FROM dolt_remotes' itself failed while listing remotes. It wraps the database driver error; rows were never returned, so the failure is at query execution, not row parsing.","triggerScenarios":"Calling ListRemotes when QueryContext fails: dolt_remotes table missing (uninitialized repo), database connection refused/closed, permissions denied, or context cancelled before query completion.","commonSituations":"Running remote listing against a database that was never Dolt-initialized; Dolt SQL server down or restarted; network interruption to the SQL server; calling too early during startup before schema creation.","solutions":["Read the wrapped cause after 'query:' for the driver error","Verify the database is initialized and dolt_remotes exists (bd doctor / dolt schema check)","Check SQL server connectivity and credentials","Retry on transient connection errors; fail fast on missing-schema errors by running initialization"],"exampleFix":"// before\nremotes, err := store.ListRemotes(ctx)\n// after\nremotes, err := store.ListRemotes(ctx)\nif err != nil && dberrors.IsTableNotExist(err) {\n    return nil, nil // no remotes yet — uninitialized repo\n}","handlingStrategy":"try-catch","validationCode":"// ensure repo is initialized and reachable first\nif err := ensureInitialized(ctx); err != nil { return err }\nctx, cancel := context.WithTimeout(ctx, 10*time.Second)\ndefer cancel()","typeGuard":"func isQueryErr(err error) bool {\n    return err != nil && strings.Contains(err.Error(), \"ListRemotes: query:\")\n}","tryCatchPattern":"remotes, err := store.ListRemotes(ctx)\nif err != nil {\n    if dberrors.IsTableNotExist(err) { return nil, nil } // uninitialized repo\n    if isTransient(err) { return retry(ctx, store.ListRemotes) }\n    return nil, err\n}","preventionTips":["Initialize the Dolt database before querying remotes","Use bounded contexts with sane timeouts","Verify SQL server connectivity during startup health checks"],"tags":["database","sql","dolt","query"],"backgroundTag":"sql-query-failed","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}