{"record":{"id":"e5b5b86b78fc3fa4","repo":"gastownhall/beads","slug":"failed-to-add-dolt-remote-w","errorCode":null,"errorMessage":"failed to add dolt remote: %w","messagePattern":"failed to add dolt remote: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/dolt/credentials.go","lineNumber":311,"sourceCode":"\t\tINSERT INTO federation_peers (name, remote_url, username, password_encrypted, sovereignty)\n\t\tVALUES (?, ?, ?, ?, ?)\n\t\tON DUPLICATE KEY UPDATE\n\t\t\tremote_url = VALUES(remote_url),\n\t\t\tusername = VALUES(username),\n\t\t\tpassword_encrypted = VALUES(password_encrypted),\n\t\t\tsovereignty = VALUES(sovereignty),\n\t\t\tupdated_at = CURRENT_TIMESTAMP\n\t`, peer.Name, peer.RemoteURL, peer.Username, encryptedPwd, peer.Sovereignty)\n\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to add federation peer: %w\", err)\n\t}\n\n\t// Also add the Dolt remote.\n\tif err := s.AddRemote(ctx, peer.Name, peer.RemoteURL); err != nil {\n\t\t// Ignore \"remote already exists\" errors\n\t\tif !strings.Contains(err.Error(), \"already exists\") {\n\t\t\treturn fmt.Errorf(\"failed to add dolt remote: %w\", err)\n\t\t}\n\t}\n\n\tif err := s.doltAddAndCommit(ctx, []string{\"federation_peers\"}, \"federation: add peer \"+peer.Name); err != nil {\n\t\treturn fmt.Errorf(\"failed to commit federation peer: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// GetFederationPeer retrieves a federation peer by name.\n// Returns storage.ErrNotFound (wrapped) if the peer does not exist.\nfunc (s *DoltStore) GetFederationPeer(ctx context.Context, name string) (*storage.FederationPeer, error) {\n\tvar peer storage.FederationPeer\n\tvar encryptedPwd []byte\n\tvar lastSync sql.NullTime\n\tvar username sql.NullString\n","sourceCodeStart":293,"sourceCodeEnd":329,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/dolt/credentials.go#L293-L329","documentation":"After storing the credentials row, addFederationPeer registers the peer as a Dolt remote via s.AddRemote. This wraps any AddRemote failure that is not an 'already exists' error (duplicates are deliberately tolerated). It means the credentials were stored but the remote was not created, leaving the peer only partially configured.","triggerScenarios":"AddRemote fails for a non-duplicate reason: the remote URL is malformed or uses an unsupported scheme, the dolt CLI subprocess fails, the remote name is reserved, or network/filesystem errors occur during remote registration.","commonSituations":"Typo in peer.RemoteURL (e.g. 'htps://'); URL scheme not supported by the installed dolt version; filesystem permission problems in the Dolt CLI directory during server-mode remote materialization.","solutions":["Check the wrapped inner error for the actual AddRemote failure reason.","Validate peer.RemoteURL (scheme, host) before calling AddFederationPeer.","Verify the installed dolt CLI supports the remote URL scheme and works manually (`dolt remote add <name> <url>`).","Since credentials were already stored, fix the URL/remote issue and re-run AddFederationPeer — the upsert makes it idempotent."],"exampleFix":"// before\npeer.RemoteURL = \"htps://dolthub.com/org/repo\"\n// after\npeer.RemoteURL = \"https://dolthub.com/org/repo\"","handlingStrategy":"validation","validationCode":"u, err := url.Parse(peer.RemoteURL)\nif err != nil || u.Scheme == \"\" || u.Host == \"\" {\n    return fmt.Errorf(\"invalid remote URL %q\", peer.RemoteURL)\n}","typeGuard":null,"tryCatchPattern":"if err := store.AddFederationPeer(ctx, peer); err != nil && strings.Contains(err.Error(), \"failed to add dolt remote\") {\n    // credentials were stored; fix URL/remote and re-run (upsert is idempotent)\n}","preventionTips":["Validate remote URLs (scheme + host) before adding peers","Test `dolt remote add` manually with the same URL first","Re-run AddFederationPeer after fixing — the upsert makes it safe"],"tags":["go","dolt","remote","federation"],"backgroundTag":"remote-add-failed","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}