{"record":{"id":"1c2b3973d3003732","repo":"gastownhall/beads","slug":"pull-w","errorCode":null,"errorMessage":"pull: %w","messagePattern":"pull: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/bd/sync.go","lineNumber":318,"sourceCode":"\t\t}\n\t\tif pullErr != nil {\n\t\t\t// A pull that merged nothing only because the branch is a strict\n\t\t\t// ancestor of a remote tip that moved after our fetch is the pull-side\n\t\t\t// twin of a push race: a peer advanced the remote, and the next pull\n\t\t\t// fast-forwards it. Re-enter the loop instead of hard-failing the tick;\n\t\t\t// if the budget runs out, the retries-exhausted exit tells the timer to\n\t\t\t// try again next tick (same as a push race or a dirty working set). It\n\t\t\t// is classified from the typed sentinel, never the message, so a\n\t\t\t// genuine divergence — which verifyPullLanded leaves unwrapped — falls\n\t\t\t// through to the hard error below.\n\t\t\tif isPullBehindFastForwardableErr(pullErr) {\n\t\t\t\tout.Transients = append(out.Transients, syncTransient{\n\t\t\t\t\tAttempt: attempt, Kind: syncTransientPullBehind, Error: pullErr.Error(),\n\t\t\t\t})\n\t\t\t\tops.report(\"pull behind a fast-forwardable remote tip (peer pushed after our fetch) — re-pulling and retrying\")\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn out, fmt.Errorf(\"pull: %w\", pullErr)\n\t\t}\n\t\tif conflictErr != nil {\n\t\t\treturn out, fmt.Errorf(\"conflict check: %w\", conflictErr)\n\t\t}\n\n\t\tops.report(\"recompute-blocked\")\n\t\tcorrected, err := ops.recompute(ctx)\n\t\tif err != nil {\n\t\t\tif !isRecomputeDirtyGraphErr(err) {\n\t\t\t\treturn out, fmt.Errorf(\"recompute-blocked: %w\", err)\n\t\t\t}\n\t\t\t// Not our failure and not a durable one: someone else's\n\t\t\t// uncommitted edit to issues/dependencies landed between our pull\n\t\t\t// and our repair. Treat it exactly like a push race — re-enter the\n\t\t\t// attempt loop, and if the budget runs out report the transient\n\t\t\t// exit so the next tick tries again. Classifying it as a hard\n\t\t\t// error instead left local commits unpublished until a tick\n\t\t\t// happened to catch a clean working set, which on a shared","sourceCodeStart":300,"sourceCodeEnd":336,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/cmd/bd/sync.go#L300-L336","documentation":"The pull step of the sync loop failed with an error that was not a fast-forwardable 'behind remote' race (those are retried as transients). Any other pull error aborts the sync loop immediately.","triggerScenarios":"ops.pull returns a non-race error: remote unreachable/auth failure, Dolt merge refused for reasons other than fast-forward, corrupted refs, or network timeout during fetch.","commonSituations":"Bad or expired git/Dolt remote credentials; remote URL misconfigured; repository history diverged non-fast-forwardably; network outage or VPN down while syncing with teammates.","solutions":["Read the wrapped pullErr for the concrete cause (auth, network, merge)","Verify remote credentials and connectivity (test the remote URL directly)","If the remote diverged, reconcile manually (dolt pull/merge, resolve, then retry bd sync)","Check for pre-existing live conflicts that block the merge"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// verify remote reachability and credentials before syncing\nif err := checkRemoteAuth(remoteURL); err != nil {\n    return fmt.Errorf(\"remote auth invalid; refresh credentials before bd sync\")\n}","typeGuard":null,"tryCatchPattern":"out, err := runSyncCommand(ctx, opts)\nif err != nil {\n    var pullErr *PullError\n    if errors.As(err, &pullErr) && isNetworkErr(pullErr.Unwrap()) {\n        // check network/VPN, then retry with backoff\n    }\n    return err\n}","preventionTips":["Refresh remote tokens before they expire","Verify remote URL and network/VPN before long sync operations","Don't force-push remote history that replicas rely on","Ensure conflicts from a previous run are cleared so pull can merge"],"tags":["go","sync","network","dolt"],"backgroundTag":"dolt-pull-failed","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}