{"record":{"id":"127a3716011cc6b4","repo":"gastownhall/beads","slug":"claimreadyissue-w","errorCode":null,"errorMessage":"ClaimReadyIssue: %w","messagePattern":"ClaimReadyIssue: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/domain/issue.go","lineNumber":1809,"sourceCode":"func (u *issueUseCaseImpl) ClaimReadyWisp(ctx context.Context, filter types.WorkFilter, actor string) (ClaimReadyResult, error) {\n\treturn u.claimReady(ctx, filter, actor, true)\n}\n\nfunc (u *issueUseCaseImpl) claimReady(ctx context.Context, filter types.WorkFilter, actor string, useWisp bool) (ClaimReadyResult, error) {\n\tvar (\n\t\tissue *types.Issue\n\t\terr   error\n\t)\n\tif useWisp {\n\t\tissue, err = u.issueRepo.ClaimReadyWisp(ctx, filter, actor)\n\t} else {\n\t\tissue, err = u.issueRepo.ClaimReadyIssue(ctx, filter, actor)\n\t}\n\tif err != nil {\n\t\tif useWisp {\n\t\t\treturn ClaimReadyResult{}, fmt.Errorf(\"ClaimReadyWisp: %w\", err)\n\t\t}\n\t\treturn ClaimReadyResult{}, fmt.Errorf(\"ClaimReadyIssue: %w\", err)\n\t}\n\treturn ClaimReadyResult{Issue: issue, Claimed: issue != nil}, nil\n}\n\nfunc (u *issueUseCaseImpl) GetBlockedIssues(ctx context.Context, filter types.WorkFilter) ([]*types.BlockedIssue, error) {\n\tout, err := u.issueRepo.GetBlockedIssues(ctx, filter)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"GetBlockedIssues: %w\", err)\n\t}\n\treturn out, nil\n}\n\nfunc (u *issueUseCaseImpl) GetStatistics(ctx context.Context) (*types.Statistics, error) {\n\tout, err := u.issueRepo.GetStatistics(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"GetStatistics: %w\", err)\n\t}\n\treturn out, nil","sourceCodeStart":1791,"sourceCodeEnd":1827,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/domain/issue.go#L1791-L1827","documentation":"Wrapped error from the claimReady flow when the standard (non-wisp) repository method ClaimReadyIssue fails. Mirrors the ClaimReadyWisp error at line 1807 but for the regular issues table path. The repository error is preserved via %w for diagnosis.","triggerScenarios":"Calling ClaimReadyIssue / ClaimReadyIssueWisp with useWisp=false when issueRepo.ClaimReadyIssue(ctx, filter, actor) errors — invalid filter combination, storage failure during the claim transaction, or the ready-issues query fails.","commonSituations":"Claiming work with a WorkFilter containing unsupported fields (e.g. bad label syntax); database locked or unreachable; concurrent agents racing to claim the same issue causing constraint violations.","solutions":["Inspect the wrapped error after 'ClaimReadyIssue:' for the root cause","Validate the WorkFilter (priority range, status, labels) before claiming","Retry on transient storage/lock errors","Check that another process did not corrupt the claim state; re-run bd ready to refresh"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"if filter == (types.WorkFilter{}) {\n    return fmt.Errorf(\"empty WorkFilter for claim\")\n}","typeGuard":null,"tryCatchPattern":"res, err := uc.ClaimReadyIssue(ctx, filter, actor)\nif err != nil {\n    if isTransient(err) {\n        return retryClaim(ctx, filter, actor)\n    }\n    return fmt.Errorf(\"claim failed: %w\", err)\n}","preventionTips":["Validate WorkFilter values (status, priority, labels) before claiming","Use bounded retries for concurrent-claim races","Check DB connectivity before batch claim loops","Treat Claimed=false (nil issue) as a normal outcome, not an error"],"tags":["go","storage","error-wrapping","claim-ready"],"backgroundTag":"repository-query-failed","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}