gastownhall/beads · error
delete: drop issue rows: %w
Error message
delete: drop issue rows: %w
What it means
This error means the final row-level delete of the regular issues themselves failed: issueRepo.DeleteByIDs on the main issues table. This is the step that actually removes issue rows after all child data has been dropped; failure aborts the delete.
Source
Thrown at internal/storage/domain/issue_delete.go:198
if _, err := u.depRepo.DeleteAllForIDs(ctx, wispIDs, DepInsertOpts{}); err != nil {
return result, fmt.Errorf("delete: drop sync-plane edges into deleted wisps: %w", err)
}
if _, err := u.labelRepo.DeleteAllForIDs(ctx, regularIDs, LabelOpts{}); err != nil {
return result, fmt.Errorf("delete: drop labels: %w", err)
}
if _, err := u.labelRepo.DeleteAllForIDs(ctx, wispIDs, LabelOpts{UseWispsTable: true}); err != nil {
return result, fmt.Errorf("delete: drop wisp labels: %w", err)
}
if _, err := u.eventsRepo.DeleteAllForIDs(ctx, regularIDs, RecordEventOpts{}); err != nil {
return result, fmt.Errorf("delete: drop events: %w", err)
}
if _, err := u.eventsRepo.DeleteAllForIDs(ctx, wispIDs, RecordEventOpts{UseWispsTable: true}); err != nil {
return result, fmt.Errorf("delete: drop wisp events: %w", err)
}
issuesDeleted, err := u.issueRepo.DeleteByIDs(ctx, regularIDs, IssueTableOpts{})
if err != nil {
return result, fmt.Errorf("delete: drop issue rows: %w", err)
}
wispsDeleted, err := u.issueRepo.DeleteByIDs(ctx, wispIDs, IssueTableOpts{UseWispsTable: true})
if err != nil {
return result, fmt.Errorf("delete: drop wisp rows: %w", err)
}
result.DeletedCount = issuesDeleted + wispsDeleted
if params.UpdateTextReferences && len(connected) > 0 {
refs, err := u.rewriteTextReferences(ctx, allIDs, connected, connectedIsWisp, actor)
if err != nil {
return result, fmt.Errorf("delete: rewrite text references: %w", err)
}
result.ReferencesUpdated = refs
}
if err := u.issueRepo.RecomputeIsBlocked(ctx, affectedIssues, affectedWisps); err != nil {
return result, fmt.Errorf("delete: recompute is_blocked: %w", err)
}View on GitHub (pinned to 71377f2769)
Solutions
- Inspect the wrapped cause for FK violations and find the child table blocking the row delete.
- Retry the delete; earlier cascade steps are transactional so state is intact.
- Verify DELETE privileges on the issues table.
- Run migrations / bd doctor if the schema may be stale.
Defensive patterns
Strategy: validation
Validate before calling
if err := ctx.Err(); err != nil { return err }
// prefer the dry run to surface blockers before real deletion
res, err := store.DeleteIssues(ctx, ids, DeleteIssuesParams{DryRun: true})
if err != nil { return err } Type guard
var blocked *domain.DeleteBlockedError
if errors.As(err, &blocked) { /* blocked by external dependents: handle or use Force */ } Try / catch
if err := store.DeleteIssues(ctx, ids, opts); err != nil {
var blocked *domain.DeleteBlockedError
if errors.As(err, &blocked) { /* resolve dependents */ }
if strings.Contains(err.Error(), "delete: drop issue rows:") { /* check FK/perm cause */ }
} Prevention
- Use DryRun first to preview cascade counts and blockers.
- Resolve external dependents (or set Force/Cascade deliberately) before deleting.
- Grant DELETE privileges on the issues table.
- Keep schema migrations current.
When it happens
Trigger: DeleteIssue/DeleteIssues calls where the issues table cannot be written (FK constraint from an un-deleted child table, permissions, lock contention) or the connection/context fails before the DELETE completes.
Common situations: Foreign-key constraint due to a child table not covered by the cascade; DB user lacking DELETE privilege; deadlock with a concurrent writer; stale schema missing expected structure.
Related errors
- delete: drop deps: %w
- delete: drop wisp deps: %w
- delete: drop labels: %w
- delete: drop events: %w
- delete: drop wisp rows: %w
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/ef4e8dc93d038d7c.
Report an issue: GitHub.