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

  1. Read each wrapped %v error to identify the failing issue link and root cause.
  2. Grant the GitLab token the required api scope and at least Reporter role on the target project.
  3. Re-run `bd gitlab sync` (or push) after fixing the cause; remove or correct beads links pointing at deleted GitLab issues.
  4. 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

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


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/12f096a168426dad. Report an issue: GitHub.