gastownhall/beads · error
CountIssues: %w
Error message
CountIssues: %w
What it means
Pass-through wrapper from CountIssues in the issue use-case: wraps errors from issueRepo.CountIssues(ctx, query, filter), which counts issues matching a free-text query plus structured filter. The count query failing in storage surfaces as 'CountIssues: <root cause>'.
Source
Thrown at internal/storage/domain/issue.go:1833
out, err := u.issueRepo.GetBlockedIssues(ctx, filter)
if err != nil {
return nil, fmt.Errorf("GetBlockedIssues: %w", err)
}
return out, nil
}
func (u *issueUseCaseImpl) GetStatistics(ctx context.Context) (*types.Statistics, error) {
out, err := u.issueRepo.GetStatistics(ctx)
if err != nil {
return nil, fmt.Errorf("GetStatistics: %w", err)
}
return out, nil
}
func (u *issueUseCaseImpl) CountIssues(ctx context.Context, query string, filter types.IssueFilter) (int64, error) {
out, err := u.issueRepo.CountIssues(ctx, query, filter)
if err != nil {
return 0, fmt.Errorf("CountIssues: %w", err)
}
return out, nil
}
func (u *issueUseCaseImpl) CountIssuesByGroup(ctx context.Context, filter types.IssueFilter, groupBy string) (map[string]int, error) {
out, err := u.issueRepo.CountIssuesByGroup(ctx, filter, groupBy)
if err != nil {
return nil, fmt.Errorf("CountIssuesByGroup: %w", err)
}
return out, nil
}
func (u *issueUseCaseImpl) History(ctx context.Context, id string) ([]*storage.HistoryEntry, error) {
out, err := u.issueRepo.History(ctx, id)
if err != nil {
return nil, fmt.Errorf("History: %w", err)
}
return out, nilView on GitHub (pinned to 71377f2769)
Solutions
- Inspect the wrapped error after 'CountIssues:' for the root cause
- Validate the query string syntax and IssueFilter values before calling
- Sanitize/escape user-supplied query input
- Retry on transient storage errors
Example fix
// before
count, err := uc.CountIssues(ctx, userQuery, filter)
// after
count, err := uc.CountIssues(ctx, userQuery, filter)
if err != nil {
return fmt.Errorf("counting issues for query %q: %w", userQuery, err)
} Defensive patterns
Strategy: validation
Validate before calling
if query == "" && filter == (types.IssueFilter{}) {
return fmt.Errorf("empty query and filter")
}
// validate query syntax against supported operators before calling Try / catch
count, err := uc.CountIssues(ctx, query, filter)
if err != nil {
return fmt.Errorf("count failed for query %q: %w", query, err)
} Prevention
- Validate/sanitize free-text query syntax before passing to CountIssues
- Validate IssueFilter enum values (status, priority, type)
- Escape user-supplied input in query construction
- Retry transient storage errors in batch jobs
When it happens
Trigger: Calling CountIssues(ctx, query, filter) when the repository count query errors — malformed free-text query syntax, invalid filter, or storage failure while executing the count SQL.
Common situations: Scripts passing user-supplied search strings with bad query syntax; filters with invalid status/priority values; database outage during batch reporting jobs.
Related errors
- not found
- load wisp labels: %w
- edge %d %s->%s: checking planned blocking cycle: %w
- reading existing dependencies for %s: %w
- CountOpenChildren %s: %w
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/5ae7a784a3facd5d.
Report an issue: GitHub.