{"record":{"id":"09866c24b442eabb","repo":"GoogleContainerTools/skaffold","slug":"rs-ae-message-actionable-error-message-from-statu","errorCode":null,"errorMessage":"rs.ae.Message (actionable error message from status check)","messagePattern":"rs\\.ae\\.Message \\(actionable error message from status check\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/kubernetes/status/resource/status.go","lineNumber":35,"sourceCode":"package resource\n\nimport (\n\t\"errors\"\n\n\t\"github.com/GoogleContainerTools/skaffold/v2/proto/v1\"\n)\n\ntype Status struct {\n\tae       *proto.ActionableErr\n\tchanged  bool\n\treported bool\n}\n\nfunc (rs Status) Error() error {\n\tif rs.ae.ErrCode == proto.StatusCode_STATUSCHECK_SUCCESS {\n\t\treturn nil\n\t}\n\treturn errors.New(rs.ae.Message)\n}\n\nfunc (rs Status) ActionableError() *proto.ActionableErr {\n\treturn rs.ae\n}\n\nfunc (rs Status) String() string {\n\treturn rs.ae.Message\n}\n\nfunc (rs Status) Equal(other Status) bool {\n\treturn rs.ae.Message == other.ae.Message && rs.ae.ErrCode == other.ae.ErrCode\n}\n\nfunc newStatus(ae *proto.ActionableErr) Status {\n\treturn Status{\n\t\tae:      ae,\n\t\tchanged: true,","sourceCodeStart":17,"sourceCodeEnd":53,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/kubernetes/status/resource/status.go#L17-L53","documentation":"Status.Error converts a status-check result into a plain Go error: if the stored ActionableErr has a code other than STATUSCHECK_SUCCESS, its Message (e.g. a pod/backoff failure description) is returned as the error. This is the standard way skaffold surfaces deployment status-check failures from resource status tracking.","triggerScenarios":"Calling Status.Error() after a Kubernetes status check recorded a non-success ActionableErr (container crash, backoff, deadline exceeded, etc.).","commonSituations":"`skaffold dev/run/deploy` failing during the pod status-check loop; pods stuck in CrashLoopBackOff or ImagePullBackOff until the status deadline is hit.","solutions":["Inspect the ActionableErr via Status.ActionableError() to get the structured code and suggestions","Run `kubectl describe pod <pod>` / `kubectl logs` in the target namespace to find the root cause (bad image, failing probe, missing config)","Fix the underlying workload issue, then re-run the deploy/status check"],"exampleFix":"// before\nif err := status.Error(); err != nil { return err }\n// after\nif err := status.Error(); err != nil {\n  ae := status.ActionableError()\n  log.Printf(\"status check failed [%v]: %s\", ae.ErrCode, ae.Message)\n  return err\n}","handlingStrategy":"type-guard","validationCode":"if st.ae != nil && st.ae.ErrCode == proto.StatusCode_STATUSCHECK_SUCCESS { return nil } // success check before Error()","typeGuard":"func isStatusSuccess(rs Status) bool { return rs.ActionableError().ErrCode == proto.StatusCode_STATUSCHECK_SUCCESS }","tryCatchPattern":"if err := status.Error(); err != nil {\n  ae := status.ActionableError()\n  switch ae.ErrCode {\n  case proto.StatusCode_STATUSCHECK_POD_FAILED, proto.StatusCode_STATUSCHECK_IMAGE_PULL_ERR:\n    return fmt.Errorf(\"status %v: %w\", ae.ErrCode, err)\n  }\n  return err\n}","preventionTips":["Inspect ActionableError() for structured codes instead of parsing strings","Watch pod events (kubectl get events) during deploys","Set sensible status-check deadlines for slow-starting pods"],"tags":["kubernetes","status-check","skaffold"],"backgroundTag":"pod-status-check-failed","analyzedSha":"a1189de023efc32d4b8e11f395acc678aa555011","analyzedAt":"2026-09-05T12:09:27.064Z","contentChangedAt":"2026-09-05T12:09:27.064Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}