{"record":{"id":"d2cf55490254723e","repo":"gastownhall/beads","slug":"delete-drop-wisp-events-w","errorCode":null,"errorMessage":"delete: drop wisp events: %w","messagePattern":"delete: drop wisp events: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/domain/issue_delete.go","lineNumber":193,"sourceCode":"\t// survive their target unless they are deleted explicitly. Without this a\n\t// forced delete of a wisp left its durable dependent holding an edge into\n\t// a row that no longer exists — dangling, not orphaned, which is not what\n\t// issueops.DeleteRequest.Force promises. The store body has always done\n\t// this (issueops.deleteIssueRowInTx -> DeleteWispFromDependenciesInTx).\n\tif _, err := u.depRepo.DeleteAllForIDs(ctx, wispIDs, DepInsertOpts{}); err != nil {\n\t\treturn result, fmt.Errorf(\"delete: drop sync-plane edges into deleted wisps: %w\", err)\n\t}\n\tif _, err := u.labelRepo.DeleteAllForIDs(ctx, regularIDs, LabelOpts{}); err != nil {\n\t\treturn result, fmt.Errorf(\"delete: drop labels: %w\", err)\n\t}\n\tif _, err := u.labelRepo.DeleteAllForIDs(ctx, wispIDs, LabelOpts{UseWispsTable: true}); err != nil {\n\t\treturn result, fmt.Errorf(\"delete: drop wisp labels: %w\", err)\n\t}\n\tif _, err := u.eventsRepo.DeleteAllForIDs(ctx, regularIDs, RecordEventOpts{}); err != nil {\n\t\treturn result, fmt.Errorf(\"delete: drop events: %w\", err)\n\t}\n\tif _, err := u.eventsRepo.DeleteAllForIDs(ctx, wispIDs, RecordEventOpts{UseWispsTable: true}); err != nil {\n\t\treturn result, fmt.Errorf(\"delete: drop wisp events: %w\", err)\n\t}\n\n\tissuesDeleted, err := u.issueRepo.DeleteByIDs(ctx, regularIDs, IssueTableOpts{})\n\tif err != nil {\n\t\treturn result, fmt.Errorf(\"delete: drop issue rows: %w\", err)\n\t}\n\twispsDeleted, err := u.issueRepo.DeleteByIDs(ctx, wispIDs, IssueTableOpts{UseWispsTable: true})\n\tif err != nil {\n\t\treturn result, fmt.Errorf(\"delete: drop wisp rows: %w\", err)\n\t}\n\tresult.DeletedCount = issuesDeleted + wispsDeleted\n\n\tif params.UpdateTextReferences && len(connected) > 0 {\n\t\trefs, err := u.rewriteTextReferences(ctx, allIDs, connected, connectedIsWisp, actor)\n\t\tif err != nil {\n\t\t\treturn result, fmt.Errorf(\"delete: rewrite text references: %w\", err)\n\t\t}\n\t\tresult.ReferencesUpdated = refs","sourceCodeStart":175,"sourceCodeEnd":211,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/domain/issue_delete.go#L175-L211","documentation":"Same event cascade step as 'drop events' but for wisps: eventsRepo.DeleteAllForIDs with UseWispsTable:true deletes wisp event rows. A wrapped error here means wisp event cleanup failed and the entire deleteMany aborts to keep events consistent with deleted wisps.","triggerScenarios":"Deleting wisps when the wisps events table is missing/locked, the driver returns an SQL error, or the context/connection drops mid-cascade.","commonSituations":"Older embedded schema lacking the wisps events table; heavy event volume on wisps causing lock timeouts; concurrent bd process contention.","solutions":["Verify the wisps events table exists; migrate the embedded schema.","Retry the delete — no partial event rows remain.","Inspect the wrapped driver error for the root cause.","Delete wisps in smaller batches to reduce lock pressure."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if err := ctx.Err(); err != nil { return err }\nexists, err := tableExists(ctx, \"wisps_events\"); if err != nil || !exists { return fmt.Errorf(\"wisp events table missing — run migrations\") }","typeGuard":"var dbe *storage.DBError\nif errors.As(err, &dbe) { /* inspect driver cause */ }","tryCatchPattern":"if err := store.DeleteWisps(ctx, ids, opts); err != nil {\n    if strings.Contains(err.Error(), \"delete: drop wisp events:\") { /* retry after health check */ }\n}","preventionTips":["Migrate old embedded databases to current schema.","Use single-writer access to avoid lock contention.","Batch wisp deletions.","Monitor embedded store disk usage."],"tags":["storage","database","wisps","events"],"backgroundTag":"event-delete-failed","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}