{"record":{"id":"07b548909ef96b38","repo":"vxcontrol/pentagi","slug":"unsupported-subtask-status-s","errorCode":null,"errorMessage":"unsupported subtask status: %s","messagePattern":"unsupported subtask status: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/pkg/controller/subtask.go","lineNumber":230,"sourceCode":"\tstw.mx.Lock()\n\tdefer stw.mx.Unlock()\n\n\tswitch status {\n\tcase database.SubtaskStatusRunning:\n\t\tstw.completed = false\n\t\tstw.waiting = false\n\t\terr = stw.updater.SetStatus(ctx, database.TaskStatusRunning)\n\tcase database.SubtaskStatusWaiting:\n\t\tstw.completed = false\n\t\tstw.waiting = true\n\t\terr = stw.updater.SetStatus(ctx, database.TaskStatusWaiting)\n\tcase database.SubtaskStatusFinished, database.SubtaskStatusFailed:\n\t\tstw.completed = true\n\t\tstw.waiting = false\n\t\t// statuses Finished and Failed will be produced by stack from Run function call\n\tdefault:\n\t\t// status Created is not possible to set by this call\n\t\treturn fmt.Errorf(\"unsupported subtask status: %s\", status)\n\t}\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to set task status in back propagation: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc (stw *subtaskWorker) GetResult(ctx context.Context) (string, error) {\n\tsubtask, err := stw.subtaskCtx.DB.GetSubtask(ctx, stw.subtaskCtx.SubtaskID)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn subtask.Result, nil\n}\n\nfunc (stw *subtaskWorker) SetResult(ctx context.Context, result string) error {","sourceCodeStart":212,"sourceCodeEnd":248,"githubUrl":"https://github.com/vxcontrol/pentagi/blob/ea665308baaff015b226f308438a68d929d0f29b/backend/pkg/controller/subtask.go#L212-L248","documentation":"SetStatus rejects status values it does not support setting: the switch handles only the in-progress/interrupting/finished/failed family, and the default branch returns this error. The comment notes that Created cannot be set through this call — it is a guard against invalid lifecycle transitions from the worker API.","triggerScenarios":"Calling SetStatus with database.SubtaskStatusCreated or any non-lifecycle status value — e.g. trying to 'reset' a subtask via SetStatus instead of the load path, or passing an invalid/typo'd status constant.","commonSituations":"Custom automation trying to re-run a subtask by resetting its status to created; refactoring introduced a new status constant not added to the switch; direct API misuse attempting terminal->created transitions.","solutions":["Only pass lifecycle statuses the API supports (e.g. processing, interrupting, finished, failed); never SubtaskStatusCreated.","To reset a subtask, use the load/recovery path (LoadSubtaskWorker) instead of SetStatus.","If a new status was added to database.SubtaskStatus*, extend the switch in SetStatus to handle it.","Validate the status argument against a whitelist before calling SetStatus in orchestration code."],"exampleFix":"// before\nerr := stw.SetStatus(ctx, database.SubtaskStatusCreated) // unsupported\n// after\n// reset via the recovery path instead of SetStatus:\nworker, err := controller.LoadSubtaskWorker(ctx, taskCtx, subtask) // handles created/reset states\n","handlingStrategy":"validation","validationCode":"// validate the desired status before calling SetStatus\nfunc canSetStatus(s database.SubtaskStatus) bool {\n    switch s {\n    case database.SubtaskStatusProcessed, database.SubtaskStatusProcessing,\n        database.SubtaskStatusInterrupting, database.SubtaskStatusFinished,\n        database.SubtaskStatusFailed:\n        return true\n    }\n    return false // SubtaskStatusCreated is NOT settable here\n}","typeGuard":"func IsUnsupportedStatusError(err error) bool {\n    return strings.Contains(err.Error(), \"unsupported subtask status\")\n}","tryCatchPattern":"if !canSetStatus(desired) {\n    return fmt.Errorf(\"status %q cannot be set via SetStatus; use the load/recovery path\", desired)\n}\nif err := stw.SetStatus(ctx, desired); err != nil {\n    return fmt.Errorf(\"set subtask status: %w\", err)\n}","preventionTips":["Never attempt to reset a subtask to 'created' through SetStatus.","Centralize allowed transitions in one whitelist function.","When adding a SubtaskStatus constant, extend SetStatus's switch in the same change.","Use the LoadSubtaskWorker recovery path for state resets instead."],"tags":["state-machine","invalid-argument","subtask"],"backgroundTag":"invalid-state-transition","analyzedSha":"ea665308baaff015b226f308438a68d929d0f29b","analyzedAt":"2026-09-01T14:16:31.421Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}