gastownhall/beads · warning
GitLab dependency link sync: %v
Error message
GitLab dependency link sync: %v
What it means
During GitLab sync/push, dependency-link synchronization failures reported by the GitLab linker are emitted one per line as 'GitLab dependency link sync: %v' warnings via the warn callback. The comment above the loop notes this is a curated degradation: the per-link API error is surfaced compactly and kept distinct from genuine sync failures, which do not abort the overall run.
Source
Thrown at cmd/bd/gitlab.go:682
resolver := gitlab.NewLinkResolver(client)
res := resolver.PushLinks(ctx, linkData.DesiredLinks, gitlab.PushLinkOptions{
DryRun: dryRun,
OnPlan: func(link gitlab.DependencyLink) {
if !jsonOutput {
_, _ = fmt.Fprintf(out, " [dry-run] Would create GitLab dependency link: #%d %s #%d\n",
link.SourceIID, link.LinkType, link.TargetIID)
}
},
})
linksPushed = res.Created
linksLicenseSkipped = res.LicenseSkipped
// Curated, license-aware degradation: one actionable line instead of
// a raw per-link API error, kept distinct from genuine failures.
if res.LicenseSkipped > 0 {
warn(gitLabLicenseSkipMessage(res.LicenseSkipped))
}
for _, err := range res.Errors {
warn(fmt.Sprintf("GitLab dependency link sync: %v", err))
}
}
if len(linkData.ScopedIssues) > 0 {
count, errs := gt.PushEpicMilestones(ctx, linkData.ScopedIssues, gitlab.EpicMilestoneOptions{
DryRun: dryRun,
OnPlan: func(issueID string, issueIID int, milestoneID int) {
if !jsonOutput {
_, _ = fmt.Fprintf(out, " [dry-run] Would set GitLab milestone %d on %s (#%d)\n",
milestoneID, issueID, issueIID)
}
},
})
milestonesUpdated = count
for _, err := range errs {
warn(fmt.Sprintf("GitLab epic milestone sync: %v", err))
}
}View on GitHub (pinned to 71377f2769)
Solutions
- Read each wrapped %v error to identify the failing issue link and root cause.
- Grant the GitLab token the required api scope and at least Reporter role on the target project.
- Re-run `bd gitlab sync` (or push) after fixing the cause; remove or correct beads links pointing at deleted GitLab issues.
- If a license-skip message also appears, note those links were intentionally skipped, not failed.
Defensive patterns
Strategy: fallback
Try / catch
res := pushGitLabDependencyLinks(ctx, ...)
for _, e := range res.Errors {
log.Warn(fmt.Sprintf("GitLab dependency link sync: %v", e))
}
// treat as non-fatal; re-run sync after fixing permissions/stale links Prevention
- Use a GitLab token with api scope and Reporter+ access to target projects.
- Clean up beads links pointing at deleted GitLab issues before push.
- Check the license-skip notice to distinguish intentional skips from real failures.
When it happens
Trigger: res.Errors non-empty after pushing dependency links — GitLab API errors creating/updating issue links (403 insufficient permissions, 404 issue deleted, 409 conflict, Epic linkage unsupported on the instance/license tier).
Common situations: Token lacking api scope or reporter-level permissions on target issues; issues closed/deleted in GitLab between bead creation and push; self-managed GitLab instances without the license feature for the link type.
Related errors
- failed to fetch issues since %s: %w
- conflicts resolved but is_blocked recompute failed: %w
- Failed to fetch ADO #%d for link sync: %v
- Link sync ADO #%d: %v
- GitLab epic milestone sync: %v
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/12f096a168426dad.
Report an issue: GitHub.