gastownhall/beads · error
delete: count wisp labels: %w
Error message
delete: count wisp labels: %w
What it means
deleteMany wraps errors from labelRepo.CountAllForIDs on the wisps table (UseWispsTable: true) while gathering pre-delete label stats. The 'delete: count wisp labels:' prefix identifies this specific counting step. Deletion has not begun.
Source
Thrown at internal/storage/domain/issue_delete.go:129
wispIDs, regularIDs, err := u.issueRepo.PartitionWispIDs(ctx, allIDs)
if err != nil {
return DeleteIssuesResult{}, fmt.Errorf("delete: partition: %w", err)
}
depCount, err := u.countDeletedDependencies(ctx, allIDs)
if err != nil {
return DeleteIssuesResult{}, err
}
result.DependenciesCount = depCount
labelIssue, err := u.labelRepo.CountAllForIDs(ctx, regularIDs, LabelOpts{})
if err != nil {
return DeleteIssuesResult{}, fmt.Errorf("delete: count labels: %w", err)
}
labelWisp, err := u.labelRepo.CountAllForIDs(ctx, wispIDs, LabelOpts{UseWispsTable: true})
if err != nil {
return DeleteIssuesResult{}, fmt.Errorf("delete: count wisp labels: %w", err)
}
result.LabelsCount = labelIssue + labelWisp
evIssue, err := u.eventsRepo.CountAllForIDs(ctx, regularIDs, RecordEventOpts{})
if err != nil {
return DeleteIssuesResult{}, fmt.Errorf("delete: count events: %w", err)
}
evWisp, err := u.eventsRepo.CountAllForIDs(ctx, wispIDs, RecordEventOpts{UseWispsTable: true})
if err != nil {
return DeleteIssuesResult{}, fmt.Errorf("delete: count wisp events: %w", err)
}
result.EventsCount = evIssue + evWisp
if params.DryRun {
result.DeletedCount = len(regularIDs) + len(wispIDs)
return result, nil
}
View on GitHub (pinned to 71377f2769)
Solutions
- Unwrap to find the wisp-table CountAllForIDs failure
- Confirm the wisps table exists with the expected schema (run beads upgrade if versions drifted)
- Retry the delete — safe, nothing deleted yet
- Check Dolt connection health
Example fix
// before
res, err := uc.DeleteWisps(ctx, wispIDs, actor)
if err != nil { return err }
// after
if err != nil && strings.Contains(err.Error(), "count wisp labels") {
// wisps table read failed before any deletion — verify schema, then retry
return err
} Defensive patterns
Strategy: retry
Validate before calling
if err := pingDolt(ctx); err != nil {
return fmt.Errorf("storage unavailable: %w", err)
}
// ensure wisps table present before wisp deletes Try / catch
res, err := uc.DeleteWisps(ctx, ids, actor)
if err != nil && strings.Contains(err.Error(), "count wisp labels") {
// wisp-table read failed before any deletion — upgrade schema if drifted, then retry
return err
} Prevention
- Run beads upgrade after version changes so wisp tables match expectations
- Schedule wisp cleanup jobs when Dolt is stable
- Retry — this failure happens before any data is modified
When it happens
Trigger: Any deleteMany path where CountAllForIDs(ctx, wispIDs, LabelOpts{UseWispsTable: true}) fails — wisps table missing/inaccessible, SQL error, or DB connection failure.
Common situations: Deletes that include wisps in newer beads versions where the wisps table schema changed; Dolt migration mid-flight; wisp table permissions issues.
Related errors
- delete: count labels: %w
- delete: count wisp events: %w
- delete: partition: %w
- delete: count events: %w
- determining wisp status for %s: %w
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/f251305ac15f6c82.
Report an issue: GitHub.