{"record":{"id":"151c444f3eb9c5cc","repo":"GoogleContainerTools/skaffold","slug":"unknown-artifact","errorCode":null,"errorMessage":"Unknown artifact","messagePattern":"Unknown artifact","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/diagnose/diagnose.go","lineNumber":124,"sourceCode":"\nfunc typeOfArtifact(a *latest.Artifact) string {\n\tswitch {\n\tcase a.DockerArtifact != nil:\n\t\treturn \"Docker artifact\"\n\tcase a.BazelArtifact != nil:\n\t\treturn \"Bazel artifact\"\n\tcase a.JibArtifact != nil:\n\t\treturn \"Jib artifact\"\n\tcase a.KanikoArtifact != nil:\n\t\treturn \"Kaniko artifact\"\n\tcase a.CustomArtifact != nil:\n\t\treturn \"Custom artifact\"\n\tcase a.BuildpackArtifact != nil:\n\t\treturn \"Buildpack artifact\"\n\tcase a.KoArtifact != nil:\n\t\treturn \"Ko artifact\"\n\tdefault:\n\t\tpanic(\"Unknown artifact\")\n\t}\n}\n\nfunc timeToListDependencies(ctx context.Context, a *latest.Artifact, tag string, cfg Config) (string, []string, error) {\n\tstart := time.Now()\n\tg := graph.ToArtifactGraph(cfg.Artifacts())\n\tsourceDependencies := graph.NewSourceDependenciesCache(cfg, nil, g)\n\tpaths, err := sourceDependencies.SingleArtifactDependencies(ctx, a, tag)\n\treturn timeutil.Humanize(time.Since(start)), paths, err\n}\n\nfunc timeToConstructSyncMap(ctx context.Context, a *latest.Artifact, cfg docker.Config) (string, error) {\n\tstart := time.Now()\n\t_, err := sync.SyncMap(ctx, a, cfg)\n\treturn timeutil.Humanize(time.Since(start)), err\n}\n\nfunc timeToComputeMTimes(deps []string) (string, error) {","sourceCodeStart":106,"sourceCodeEnd":142,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/diagnose/diagnose.go#L106-L142","documentation":"diagnose.typeOfArtifact panics \"Unknown artifact\" when an *latest.Artifact has none of the known artifact-type fields set (custom, buildpack, ko, etc.). The skaffold config schema guarantees exactly one artifact type, so a nil-everything artifact indicates a deserialization or schema bug rather than expected user input.","triggerScenarios":"CheckArtifacts calls typeOfArtifact with an Artifact produced from config where the ArtifactType union discriminated field was never set — e.g. hand-constructed structs in tests/code, or a new artifact type added to the schema but not to typeOfArtifact's switch.","commonSituations":"Running `skaffold diagnose` on a skaffold.yaml parsed with a newer/older schema version where a type field is dropped; a newly added builder (e.g. a new artifact kind) missing from the switch; programmatic config building that left ArtifactType nil.","solutions":["Ensure every artifact in skaffold.yaml sets exactly one builder type (docker, custom, buildpacks, ko, ...)","Validate config with `skaffold diagnose` or `skaffold config` / schema validation before building","If you added a new artifact type, add a case for it in typeOfArtifact","Check skaffold version compatibility with the skaffold.yaml apiVersion"],"exampleFix":"// before (skaffold.yaml)\nartifacts:\n  - image: myimg\n// after\nartifacts:\n  - image: myimg\n    docker:\n      dockerfile: Dockerfile","handlingStrategy":"validation","validationCode":"func artifactTypeSet(a *latest.Artifact) error {\n  t := a.ArtifactType\n  if t == nil || (t.CustomArtifact == nil && t.BuildpackArtifact == nil && t.KoArtifact == nil && t.DockerArtifact == nil) {\n    return fmt.Errorf(\"artifact %q has no builder type set\", a.ImageName)\n  }\n  return nil\n}","typeGuard":"func hasKnownType(a *latest.Artifact) bool {\n  return a != nil && a.ArtifactType != nil &&\n    (a.ArtifactType.CustomArtifact != nil || a.ArtifactType.BuildpackArtifact != nil ||\n     a.ArtifactType.KoArtifact != nil || a.ArtifactType.DockerArtifact != nil)\n}","tryCatchPattern":"func safeTypeOf(a *latest.Artifact) (s string) {\n  defer func() { if recover() != nil { s = \"unknown artifact\" } }()\n  return typeOfArtifact(a)\n}","preventionTips":["Always set exactly one builder per artifact in skaffold.yaml","Run `skaffold diagnose` / schema validation in CI","When adding a new artifact type, update every exhaustive switch (typeOfArtifact included)"],"tags":["config","artifact","schema","panic"],"backgroundTag":"unknown-artifact-type","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"}