{"record":{"id":"2ac6ef696c54c677","repo":"gastownhall/beads","slug":"get-federation-peer-w","errorCode":null,"errorMessage":"get federation peer: %w","messagePattern":"get federation peer: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/issueops/federation.go","lineNumber":80,"sourceCode":"// Returns storage.ErrNotFound (wrapped) if the peer does not exist.\nfunc GetFederationPeerInTx(ctx context.Context, tx *sql.Tx, name string) (*FederationPeerRow, error) {\n\tvar row FederationPeerRow\n\tvar lastSync sql.NullTime\n\tvar username sql.NullString\n\n\terr := tx.QueryRowContext(ctx, `\n\t\tSELECT name, remote_url, username, password_encrypted, sovereignty, last_sync, created_at, updated_at\n\t\tFROM federation_peers WHERE name = ?\n\t`, name).Scan(\n\t\t&row.Peer.Name, &row.Peer.RemoteURL, &username, &row.EncryptedPwd,\n\t\t&row.Peer.Sovereignty, &lastSync, &row.Peer.CreatedAt, &row.Peer.UpdatedAt,\n\t)\n\n\tif err == sql.ErrNoRows {\n\t\treturn nil, fmt.Errorf(\"%w: federation peer %s\", storage.ErrNotFound, name)\n\t}\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"get federation peer: %w\", err)\n\t}\n\n\tif username.Valid {\n\t\trow.Peer.Username = username.String\n\t}\n\tif lastSync.Valid {\n\t\trow.Peer.LastSync = &lastSync.Time\n\t}\n\n\treturn &row, nil\n}\n\n// ListFederationPeersInTx returns all configured federation peer rows.\nfunc ListFederationPeersInTx(ctx context.Context, tx *sql.Tx) ([]*FederationPeerRow, error) {\n\trows, err := tx.QueryContext(ctx, `\n\t\tSELECT name, remote_url, username, password_encrypted, sovereignty, last_sync, created_at, updated_at\n\t\tFROM federation_peers ORDER BY name\n\t`)","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/issueops/federation.go#L62-L98","documentation":"The SELECT of the federation peer row failed at the SQL level (not ErrNoRows); the driver error is wrapped as \"get federation peer\". This signals a database-side problem such as a missing table, schema mismatch, or connection failure, not an absent peer. Check the wrapped driver error.","triggerScenarios":"tx.QueryContext/Scan on federation_peers returns a driver error: table missing, column mismatch, connection dropped, or transaction aborted.","commonSituations":"Older database without federation_peers (migration not run); Dolt server restarted mid-transaction; column added/renamed in a version change.","solutions":["Read the wrapped driver error to identify the root cause","Run pending schema migrations so federation_peers has the expected columns","Retry the transaction if the error was transient","Verify the transaction is still active and not rolled back"],"exampleFix":"// before\npeer, err := issueops.GetFederationPeerInTx(ctx, tx, name) // fails: unknown column sovereignty\n// after\nif err := migrate(ctx, db); err != nil { // bring schema current\n    return err\n}\npeer, err := issueops.GetFederationPeerInTx(ctx, tx, name)","handlingStrategy":"try-catch","validationCode":"// ensure schema is current before reading\nif err := migrate(ctx, db); err != nil {\n    return err\n}","typeGuard":null,"tryCatchPattern":"peer, err := issueops.GetFederationPeerInTx(ctx, tx, name)\nif err != nil && !errors.Is(err, storage.ErrNotFound) {\n    log.Printf(\"get federation peer %s failed: %v\", name, err)\n    return fmt.Errorf(\"lookup peer %s: %w\", name, err)\n}","preventionTips":["Keep schema migrations bundled with deployments","Verify DB connectivity before opening transactions","Use errors.Is to separate not-found from real failures"],"tags":["database","sql","federation","go"],"backgroundTag":"database-query-failed","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}