{"record":{"id":"fcc458214520f542","repo":"vxcontrol/pentagi","slug":"invalid-taskstatus-s","errorCode":null,"errorMessage":"invalid TaskStatus: %s","messagePattern":"invalid TaskStatus: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/pkg/server/models/tasks.go","lineNumber":34,"sourceCode":"\tTaskStatusFinished TaskStatus = \"finished\"\n\tTaskStatusFailed   TaskStatus = \"failed\"\n)\n\nfunc (s TaskStatus) String() string {\n\treturn string(s)\n}\n\n// Valid is function to control input/output data\nfunc (s TaskStatus) Valid() error {\n\tswitch s {\n\tcase TaskStatusCreated,\n\t\tTaskStatusRunning,\n\t\tTaskStatusWaiting,\n\t\tTaskStatusFinished,\n\t\tTaskStatusFailed:\n\t\treturn nil\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid TaskStatus: %s\", s)\n\t}\n}\n\n// Validate is function to use callback to control input/output data\nfunc (s TaskStatus) Validate(db *gorm.DB) {\n\tif err := s.Valid(); err != nil {\n\t\tdb.AddError(err)\n\t}\n}\n\n// Task is model to contain task information\n// nolint:lll\ntype Task struct {\n\tID        uint64     `form:\"id\" json:\"id\" validate:\"min=0,numeric\" gorm:\"type:BIGINT;NOT NULL;PRIMARY_KEY;AUTO_INCREMENT\"`\n\tStatus    TaskStatus `form:\"status\" json:\"status\" validate:\"valid,required\" gorm:\"type:TASK_STATUS;NOT NULL;default:'created'\"`\n\tTitle     string     `form:\"title\" json:\"title\" validate:\"required\" gorm:\"type:TEXT;NOT NULL;default:'untitled'\"`\n\tInput     string     `form:\"input\" json:\"input\" validate:\"required\" gorm:\"type:TEXT;NOT NULL\"`\n\tResult    string     `form:\"result\" json:\"result\" validate:\"omitempty\" gorm:\"type:TEXT;NOT NULL;default:''\"`","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/vxcontrol/pentagi/blob/ea665308baaff015b226f308438a68d929d0f29b/backend/pkg/server/models/tasks.go#L16-L52","documentation":"TaskStatus is the lifecycle enum for a flow task: created, running, waiting, finished, failed. TaskStatus.Valid() rejects any other string with this error, and the GORM Validate callback enforces it whenever a Task row is saved.","triggerScenarios":"Assigning Task.Status an out-of-whitelist value like 'completed', 'cancelled', or '' during a task state transition; REST/GraphQL updates passing a client-defined status; scanning legacy DB rows whose TASK_STATUS value predates the current enum.","commonSituations":"Terminology mismatch between callers ('done'/'complete') and the enum's 'finished'; orchestrator code that mutates statuses via string formatting; manual DB edits or migration scripts using foreign status vocabularies.","solutions":["Use exactly created, running, waiting, finished, or failed — preferably via the models.TaskStatus* constants from backend/pkg/server/models/tasks.go.","Normalize/validate status strings at the API boundary before constructing the model (call Valid() and return a clear 400).","Audit transition code for string-built statuses (fmt.Sprintf) and replace with constant references.","Repair bad existing rows via migration so subsequent updates no longer trip Valid()."],"exampleFix":"// before\ntask := models.Task{Status: models.TaskStatus(\"done\")}\n// after\ntask := models.Task{Status: models.TaskStatusFinished} // \"finished\"","handlingStrategy":"validation","validationCode":"func isValidTaskStatus(v string) bool {\n\tswitch models.TaskStatus(v) {\n\tcase models.TaskStatusCreated, models.TaskStatusRunning,\n\t\tmodels.TaskStatusWaiting, models.TaskStatusFinished,\n\t\tmodels.TaskStatusFailed:\n\t\treturn true\n\t}\n\treturn false\n}","typeGuard":"func asTaskStatus(v string) (models.TaskStatus, bool) {\n\ts := models.TaskStatus(v)\n\treturn s, s.Valid() == nil\n}","tryCatchPattern":"if err := status.Valid(); err != nil {\n\treturn fmt.Errorf(\"illegal task status %q: %w\", status, err)\n}","preventionTips":["Use models.TaskStatus* constants in every transition; ban fmt.Sprintf-built statuses via lint/review.","Reject unknown statuses in API handlers with 400 before touching the model.","Migrate any legacy status values ('done', 'cancelled') to the canonical five with a data migration.","Mirror the whitelist in the frontend zod schemas for task updates."],"tags":["go","enum-validation","state-machine","gorm"],"backgroundTag":"invalid-enum-value","analyzedSha":"ea665308baaff015b226f308438a68d929d0f29b","analyzedAt":"2026-09-01T14:16:31.421Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}