{"record":{"id":"0ab0ac05ad0c0ce7","repo":"gastownhall/beads","slug":"create-issue-must-not-be-nil","errorCode":null,"errorMessage":"create: issue must not be nil","messagePattern":"create: issue must not be nil","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/uow/issue_operations.go","lineNumber":121,"sourceCode":"\t\tif useWisp {\n\t\t\tcreated, err = uw.IssueUseCase().CreateWisp(ctx, params, attempt.Actor)\n\t\t} else {\n\t\t\tcreated, err = uw.IssueUseCase().CreateIssue(ctx, params, attempt.Actor)\n\t\t}\n\t\tif err != nil {\n\t\t\treturn publicops.CreateResult{}, \"\", storageissueops.ClassifyPublicCreateError(err)\n\t\t}\n\t\tissue, err := hydrateIssueOperation(ctx, uw, created.Issue, true, false)\n\t\tif err != nil {\n\t\t\treturn publicops.CreateResult{}, \"\", err\n\t\t}\n\t\treturn publicops.CreateResult{Issue: issue}, \"create issue\", nil\n\t})\n}\n\nfunc createParams(request publicops.CreateRequest) (domain.CreateIssueParams, bool, error) {\n\tif request.Issue == nil {\n\t\treturn domain.CreateIssueParams{}, false, fmt.Errorf(\"create: issue must not be nil\")\n\t}\n\tissue := storageissueops.CloneCreateRequest(publicops.CreateRequest{Issue: request.Issue}).Issue\n\tparams := domain.CreateIssueParams{\n\t\tIssue:                   issue,\n\t\tExplicitID:              issue.ID,\n\t\tParentID:                request.ParentID,\n\t\tLabels:                  append([]string(nil), issue.Labels...),\n\t\tInheritLabelsFromParent: request.InheritLabelsFromParent,\n\t\tForcePrefix:             request.ForceIDPrefix,\n\t\tCreateOnly:              true,\n\t}\n\tfor _, dependency := range request.Dependencies {\n\t\tparams.Dependencies = append(params.Dependencies, domain.DependencySpec{\n\t\t\tType:          dependency.Type,\n\t\t\tTargetID:      dependency.TargetID,\n\t\t\tSwapDirection: dependency.Reverse,\n\t\t\tMetadata:      dependency.Metadata,\n\t\t\tThreadID:      dependency.ThreadID,","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/uow/issue_operations.go#L103-L139","documentation":"createParams rejects a CreateRequest whose Issue field is nil before doing any storage work. The request must carry the issue payload to create; a nil pointer would otherwise panic during cloning and parameter building. It is a validationError, so callers can distinguish bad input from storage failures.","triggerScenarios":"Calling Create (or batch-create paths applyCreate/createBatchItem) with publicops.CreateRequest{Issue: nil}.","commonSituations":"Zero-value CreateRequest passed by mistake; a builder that failed earlier and left Issue nil; JSON deserialization that produced a null issue object.","solutions":["Always populate CreateRequest.Issue with a non-nil *types.Issue.","Check the struct is fully initialized after deserialization before dispatching.","Add a nil check on Issue at the construction site if it can come from external input."],"exampleFix":"// before\nreq := publicops.CreateRequest{} // Issue nil\n// after\nreq := publicops.CreateRequest{Issue: &types.Issue{ID: id, Title: title, Status: \"open\"}}","handlingStrategy":"validation","validationCode":"if req.Issue == nil { return errors.New(\"create: issue is required\") }","typeGuard":"func validCreateRequest(r publicops.CreateRequest) bool { return r.Issue != nil }","tryCatchPattern":"if err != nil {\n    // validationError family: fix the request, do not retry\n    return fmt.Errorf(\"bad create request: %w\", err)\n}","preventionTips":["Never dispatch a zero-value CreateRequest.","Validate deserialized payloads for null issue objects.","Add a builder that guarantees a non-nil Issue."],"tags":["validation","nil-pointer","create"],"backgroundTag":"nil-required-field","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}