gastownhall/beads · error · publicCreateValidationError
create: issue comments and dependencies must be supplied thr
Error message
create: issue comments and dependencies must be supplied through request fields
What it means
ValidatePublicCreateRequest rejects a create request whose embedded Issue carries Comments or Dependencies. These must be supplied through the dedicated request fields (request.Comments / request.Dependencies), not nested inside the issue payload, so the store can write them with correct provenance and ordering.
Source
Thrown at internal/storage/issueops/public_create.go:35
// create request for the domain create use case.
type PublicCreateContext struct {
IssuePrefix string
AllowedPrefixes string
CustomStatuses []string
CustomTypes []string
}
// ValidatePublicCreateRequest checks public-create invariants independent of
// database configuration.
func ValidatePublicCreateRequest(request publicops.CreateRequest) error {
if request.Actor == "" || request.Issue == nil {
return publicCreateValidationError(fmt.Errorf("create: actor and issue are required"))
}
if err := types.CheckFieldLen("actor", request.Actor); err != nil {
return publicCreateValidationError(fmt.Errorf("create: %w", err))
}
if len(request.Issue.Comments) > 0 || len(request.Issue.Dependencies) > 0 {
return publicCreateValidationError(fmt.Errorf("create: issue comments and dependencies must be supplied through request fields"))
}
for _, field := range []struct{ name, value string }{{"assignee", request.Issue.Assignee}, {"owner", request.Issue.Owner}} {
if err := types.CheckFieldLen(field.name, field.value); err != nil {
return publicCreateValidationError(err)
}
}
for _, label := range request.Issue.Labels {
if err := types.CheckFieldLen("label", label); err != nil {
return publicCreateValidationError(err)
}
}
if err := types.CheckFieldLen("parent ID", request.ParentID); err != nil {
return publicCreateValidationError(fmt.Errorf("create: %w", err))
}
return validatePublicCreateDependencies(request)
}
// PreparePublicCreateRequest snapshots, normalizes, and validates a publicView on GitHub (pinned to 71377f2769)
Solutions
- Clear request.Issue.Comments and request.Issue.Dependencies and pass them via the CreateRequest's dedicated Comments/Dependencies fields instead
- Strip nested comments/dependencies when converting a loaded issue into a create request
- Only pass these fields when you actually intend to create them alongside the issue
Example fix
// before
issue.Comments = loadedComments
req := publicops.CreateRequest{Actor: actor, Issue: issue}
// after
issue.Comments = nil
issue.Dependencies = nil
req := publicops.CreateRequest{Actor: actor, Issue: issue, Comments: loadedComments} Defensive patterns
Strategy: validation
Validate before calling
func issuePayloadClean(i *types.Issue) bool { return len(i.Comments) == 0 && len(i.Dependencies) == 0 } Prevention
- Never reuse a loaded issue struct (with comments/deps) directly as a create payload
- Always move comments/dependencies to the top-level request fields
- Add a normalize step that nils nested collections before building the request
When it happens
Trigger: Calling ExecuteCreate with a CreateRequest whose request.Issue.Comments or request.Issue.Dependencies slices are non-empty.
Common situations: Constructing a types.Issue struct copied from an existing issue (which often carries comments/deps) and reusing it in a create request; API migration from an older nested style.
Related errors
- proxy.ForceStopUnverified: at most one options value is allo
- config storage-class.%s: %w
- proxy.ForceStopUnverified: timeout must be positive, got %s
- issue must not be nil
- add dep: dep must not be nil
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/165ecb28c9e5b350.
Report an issue: GitHub.