gastownhall/beads · error
determining blocked wisps for age GC: %w
Error message
determining blocked wisps for age GC: %w
What it means
Wisp age GC must exclude blocked wisps from abandonment detection. If querying the blocked-issue set via r.GetBlockedIssues fails, findAbandonedWisps aborts with this wrapped error instead of proceeding with an incomplete picture that could GC live, blocked wisps.
Source
Thrown at cmd/bd/wisp.go:838
}
return nil
}
func findAbandonedWisps(ctx context.Context, r molReader, cleanAll bool, ageThreshold time.Duration, excludeTypes []types.IssueType) ([]*types.Issue, error) {
ephemeralFlag := true
filter := types.IssueFilter{
Ephemeral: &ephemeralFlag,
ExcludeTypes: excludeTypes,
Limit: 5000,
}
issues, err := r.SearchIssues(ctx, "", filter)
if err != nil {
return nil, err
}
blocked, err := r.GetBlockedIssues(ctx, types.WorkFilter{})
if err != nil {
return nil, fmt.Errorf("determining blocked wisps for age GC: %w", err)
}
blockedSet := make(map[string]bool, len(blocked))
for _, b := range blocked {
blockedSet[b.ID] = true
}
protectedStatuses, err := protectedWispStatuses(ctx, r)
if err != nil {
return nil, err
}
now := time.Now()
var abandoned []*types.Issue
for _, issue := range issues {
if r.IsInfraTypeCtx(ctx, issue.IssueType) {
continue
}
if issue.Status == types.StatusClosed && !cleanAll {View on GitHub (pinned to 71377f2769)
Solutions
- Check database connectivity and retry `bd wisp gc`
- Investigate the wrapped inner error for the storage/driver root cause
- Run GC when the database is not under heavy write load
Defensive patterns
Strategy: retry
Validate before calling
if err := ctx.Err(); err != nil { return err }
if _, err := r.GetBlockedIssues(ctx, types.WorkFilter{}); err != nil {
return fmt.Errorf("cannot determine blocked set; aborting GC: %w", err)
} Try / catch
if err := runWispGC(ctx); err != nil {
if strings.Contains(err.Error(), "determining blocked wisps for age GC") {
// back off and retry; do not GC with an incomplete blocked set
}
} Prevention
- Schedule GC during low database load
- Retry the blocked-issues query with backoff before aborting
- Never proceed with abandonment detection when the blocked set is unavailable
When it happens
Trigger: runWispGC or runWispGCProxiedServer → findAbandonedWisps → r.GetBlockedIssues(ctx, types.WorkFilter{}) returns a driver/store error.
Common situations: Database unavailable or locked during scheduled GC; large dependency graphs timing out the blocked-issues query; proxied-server storage errors.
Related errors
- no store is open for this workspace
- load dependency records: %w
- failed to load dependencies: %w
- failed to get dependency records: %w
- failed to get all dependency records: %w
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/9de215ea146712ec.
Report an issue: GitHub.