{"record":{"id":"b915584a1b490427","repo":"vxcontrol/pentagi","slug":"failed-to-create-subtask-worker-w","errorCode":null,"errorMessage":"failed to create subtask worker: %w","messagePattern":"failed to create subtask worker: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/pkg/controller/subtasks.go","lineNumber":62,"sourceCode":"\tdefer stc.mx.Unlock()\n\n\tsubtasks, err := stc.taskCtx.DB.GetTaskSubtasks(ctx, taskID)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to get subtasks for task %d: %w\", taskID, err)\n\t}\n\n\tif len(subtasks) == 0 {\n\t\treturn fmt.Errorf(\"no subtasks found for task %d: %w\", taskID, ErrNothingToLoad)\n\t}\n\n\tfor _, subtask := range subtasks {\n\t\tst, err := LoadSubtaskWorker(ctx, subtask, stc.taskCtx, updater)\n\t\tif err != nil {\n\t\t\tif errors.Is(err, ErrNothingToLoad) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\treturn fmt.Errorf(\"failed to create subtask worker: %w\", err)\n\t\t}\n\n\t\tstc.subtasks[subtask.ID] = st\n\t}\n\n\treturn nil\n}\n\nfunc (stc *subtaskController) GenerateSubtasks(ctx context.Context) error {\n\tplan, err := stc.taskCtx.Provider.GenerateSubtasks(ctx, stc.taskCtx.TaskID)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to generate subtasks for task %d: %w\", stc.taskCtx.TaskID, err)\n\t}\n\n\tif len(plan) == 0 {\n\t\treturn fmt.Errorf(\"no subtasks generated for task %d\", stc.taskCtx.TaskID)\n\t}\n","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/vxcontrol/pentagi/blob/ea665308baaff015b226f308438a68d929d0f29b/backend/pkg/controller/subtasks.go#L44-L80","documentation":"Wraps any error from LoadSubtaskWorker while restoring individual subtask workers during LoadSubtasks, excluding ErrNothingToLoad which is skipped (continue). It means a persisted subtask could not be reconstructed into a runnable worker — e.g. its provider/chain state is invalid.","triggerScenarios":"Inside LoadSubtasks' loop over fetched subtasks, LoadSubtaskWorker(ctx, subtask, taskCtx, updater) returns a non-ErrNothingToLoad error for some subtask.ID — bad message-chain reference, provider initialization failure, or missing updater state.","commonSituations":"DB rows referencing deleted message chains or providers after config/provider changes between restarts; a corrupted subtask row from an interrupted write; custom provider no longer configured so its worker can't be built.","solutions":["Unwrap the error to find which subtask failed; inspect that subtask row's msg_chain_id/provider references for dangling data.","Ensure all providers referenced by existing subtasks are still configured (env vars / settings) after config changes.","If only one subtask is corrupt, delete or reset that row to 'created' and reload instead of failing the whole task load.","Run pending DB migrations — schema drift between restarts breaks worker reconstruction."],"exampleFix":"// before: fail entire load on first bad subtask\nif err := st.LoadSubtasks(ctx, taskID, updater); err != nil {\n    return err\n}\n// after: log and continue with healthy subtasks\nif err := stc.LoadSubtasks(ctx, taskID, updater); err != nil {\n    if errors.Is(err, ErrNothingToLoad) { /* handled inside */ }\n    logrus.WithError(err).WithField(\"task_id\", taskID).Warn(\"partial subtask load failure\")\n}","handlingStrategy":"try-catch","validationCode":"// before loading, ensure every subtask's provider is still configured\ncfg, err := settings.GetProviderConfig(ctx)\nif err != nil || !cfg.Valid() {\n    return fmt.Errorf(\"provider config missing, cannot load subtask workers\")\n}","typeGuard":"func isWorkerInitError(err error) bool {\n    return err != nil && !errors.Is(err, ErrNothingToLoad) &&\n        strings.Contains(err.Error(), \"failed to create subtask worker\")\n}","tryCatchPattern":"if err := stc.LoadSubtasks(ctx, taskID, updater); err != nil {\n    logrus.WithError(err).WithField(\"task_id\", taskID).\n        Error(\"subtask worker load failed — inspect dangling subtask rows\")\n    return err\n}","preventionTips":["Keep provider env/config stable across restarts, or migrate subtask rows when providers change.","Validate message-chain and provider references when deleting providers or chains.","Run DB migrations before resume operations.","Isolate the failing subtask (reset/delete its row) rather than failing the whole task load."],"tags":["subtask","worker","initialization","persistence"],"backgroundTag":"worker-initialization-failed","analyzedSha":"ea665308baaff015b226f308438a68d929d0f29b","analyzedAt":"2026-09-01T14:16:31.421Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}