{"record":{"id":"9c22969d316e7da5","repo":"gastownhall/beads","slug":"pull-from-s-w","errorCode":null,"errorMessage":"pull from %s: %w","messagePattern":"pull from (.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/embeddeddolt/version_control.go","lineNumber":653,"sourceCode":"\tif _, err := s.CommitPending(ctx, \"beads\"); err != nil {\n\t\treturn nil, fmt.Errorf(\"commit pending before pull: %w\", err)\n\t}\n\n\tpreHead := s.preMergeHead(ctx)\n\tvar conflicts []storage.Conflict\n\terr := s.withPeerAuth(ctx, peer, func(user string) error {\n\t\treturn s.withMutatingPinnedDBConn(ctx, func(db versioncontrolops.DBConn) error {\n\t\t\tif pullErr := versioncontrolops.Pull(ctx, db, peer, s.branch, user); pullErr != nil {\n\t\t\t\t// bd-578h9.15: the settle machinery aborts a merge it cannot\n\t\t\t\t// auto-resolve before returning, so dolt_conflicts is already\n\t\t\t\t// empty here; the conflicts arrive captured pre-abort inside\n\t\t\t\t// MergeConflictsError instead.\n\t\t\t\tvar mce *versioncontrolops.MergeConflictsError\n\t\t\t\tif errors.As(pullErr, &mce) {\n\t\t\t\t\tconflicts = mce.Conflicts\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn fmt.Errorf(\"pull from %s: %w\", peer, pullErr)\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\t})\n\tif err != nil || len(conflicts) > 0 {\n\t\t// Conflicted pulls skip the recompute: the operator resolves first,\n\t\t// and the next sync picks the rows up.\n\t\treturn conflicts, err\n\t}\n\tif err := s.recomputeBlockedAfterPull(ctx, preHead); err != nil {\n\t\treturn conflicts, fmt.Errorf(\"pull succeeded but is_blocked recompute failed: %w\", err)\n\t}\n\treturn conflicts, nil\n}\n\n// preMergeHead reads the pre-pull HEAD for the post-merge is_blocked\n// recompute (bd-6dnrw.3). Empty on failure, which degrades the recompute to a\n// full pass instead of skipping the hook.","sourceCodeStart":635,"sourceCodeEnd":671,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/embeddeddolt/version_control.go#L635-L671","documentation":"Returned when the actual Dolt pull/merge operation against a peer fails with an error that is NOT a MergeConflictsError. Conflicts are captured and returned as data; anything else (network failure to the peer remote, auth failure, missing remote, merge implementation error) is wrapped here with the peer name for context.","triggerScenarios":"PullFrom(ctx, peer) and the inner withPeerAuth/withMutatingPinnedDBConn pull returns a non-conflict error: peer remote unreachable, invalid credentials, unknown remote name, or an unexpected dolt merge failure.","commonSituations":"Peer URL misconfigured or peer offline during sync; revoked or expired peer credentials; database not registered as a remote; Dolt version mismatch producing merge engine errors.","solutions":["Verify the peer remote exists and its URL is correct before pulling","Check network connectivity and credentials for the peer","Run `bd doctor` / inspect the underlying wrapped error (%%w chain) for the root cause","Retry after the peer is back online; investigate if the wrapped error persists"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// verify peer connectivity/remote before pulling\nif _, err := os.Stat(peerPath); err != nil {\n    return fmt.Errorf(\"peer unreachable before pull: %%w\", err)\n}","typeGuard":null,"tryCatchPattern":"if err := store.PullFrom(ctx, peer); err != nil {\n    var mce *versioncontrolops.MergeConflictsError\n    if errors.As(err, &mce) { return handleConflicts(mce.Conflicts) }\n    return fmt.Errorf(\"transient pull failure, retry later: %%w\", err)\n}","preventionTips":["Verify peer remote URLs at setup time","Monitor peer availability before scheduled syncs","Check credentials/keys for peer auth regularly"],"tags":["go","dolt","pull","network","sync"],"backgroundTag":"peer-pull-failed","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}