🌱 (api-lint-diff) Enhance CLAUDE command and shell to consider fixed scenarios by camilamacedo86 · Pull Request #2410 · operator-framework/operator-controller

Those changes were tested with the fix: #2409
See that now we are checking the current branch and identifying what are the errors fixed.
Example

$ ./hack/api-lint-diff/run.sh 
Using temporary directory: /var/folders/n4/j272tr6d7hq63mf7_skv6zr80000gn/T/tmp.EyZ0Fx7oFs
Building custom golangci-lint with kube-api-linter plugin...
Running golangci-lint custom build...
Custom linter build completed
Successfully built custom golangci-lint at /var/folders/n4/j272tr6d7hq63mf7_skv6zr80000gn/T/tmp.EyZ0Fx7oFs/bin/golangci-lint-kube-api
Preparing worktree (detached HEAD 578dc334)
HEAD is now at 578dc334 Add CLAUDE command and new check to review and lint the API changes (#2399)
API Lint Diff Results
=====================
Baseline (main): 47 issues
Current branch: 44 issues

FIXED: 3
NEW: 0
PRE-EXISTING: 44

=== FIXED ISSUES ===
api/v1/clusterextension_types.go:477:2:kubeapilinter:commentstart: godoc for field ClusterExtensionStatus.Conditions should start with 'conditions ...'
api/v1/clusterextension_types.go:540:2:kubeapilinter:commentstart: field ClusterExtension.metav1.ObjectMeta is missing godoc comment
api/v1/clusterextensionrevision_types.go:219:2:kubeapilinter:commentstart: field ClusterExtensionRevision.metav1.ObjectMeta is missing godoc comment

=== PRE-EXISTING ISSUES ===
api/v1/clustercatalog_types.go:61:2:kubeapilinter:optionalorrequired: embedded field ClusterCatalog.metav1.ObjectMeta must be marked as optional or required
api/v1/clustercatalog_types.go:66:2:kubeapilinter:optionalorrequired: field ClusterCatalog.Spec should use marker required instead of kubebuilder:validation:Required
api/v1/clustercatalog_types.go:73:2:kubeapilinter:optionalfields: field ClusterCatalog.Status has a valid zero value ({}), but the validation is not complete (e.g. min properties/adding required fields). The field should be a pointer to allow the zero value to be set. If the zero value is not a valid use case, complete the validation and remove the pointer.
api/v1/clustercatalog_types.go:109:2:kubeapilinter:optionalorrequired: field ClusterCatalogSpec.Source should use marker required instead of kubebuilder:validation:Required
api/v1/clustercatalog_types.go:131:2:kubeapilinter:optionalfields: field ClusterCatalogSpec.Priority has a valid zero value (0), but the validation is not complete (e.g. minimum/maximum). The field should be a pointer to allow the zero value to be set. If the zero value is not a valid use case, complete the validation and remove the pointer.
api/v1/clustercatalog_types.go:175:2:kubeapilinter:conditions: Conditions field in ClusterCatalogStatus is missing the following markers: patchStrategy=merge, patchMergeKey=type
api/v1/clustercatalog_types.go:178:2:kubeapilinter:optionalfields: field ClusterCatalogStatus.ResolvedSource does not allow the zero value. It must have the omitzero tag.
api/v1/clustercatalog_types.go:206:2:kubeapilinter:optionalorrequired: field ClusterCatalogURLs.Base should use marker required instead of kubebuilder:validation:Required
api/v1/clustercatalog_types.go:224:2:kubeapilinter:optionalorrequired: field CatalogSource.Type should use marker required instead of kubebuilder:validation:Required
api/v1/clustercatalog_types.go:245:2:kubeapilinter:optionalorrequired: field ResolvedCatalogSource.Type should use marker required instead of kubebuilder:validation:Required
api/v1/clustercatalog_types.go:248:2:kubeapilinter:optionalorrequired: field ResolvedCatalogSource.Image must be marked as optional or required
api/v1/clustercatalog_types.go:264:2:kubeapilinter:optionalorrequired: field ResolvedImageSource.Ref should use marker required instead of kubebuilder:validation:Required
api/v1/clustercatalog_types.go:320:2:kubeapilinter:optionalorrequired: field ImageSource.Ref should use marker required instead of kubebuilder:validation:Required
api/v1/clustercatalog_types.go:328:2:kubeapilinter:integers: field ImageSource.PollIntervalMinutes pointer should not use an int, int8 or int16. Use int32 or int64 depending on bounding requirements
api/v1/clusterextension_types.go:67:2:kubeapilinter:optionalorrequired: field ClusterExtensionSpec.Namespace should use marker required instead of kubebuilder:validation:Required
api/v1/clusterextension_types.go:76:2:kubeapilinter:optionalorrequired: field ClusterExtensionSpec.ServiceAccount should use marker required instead of kubebuilder:validation:Required
api/v1/clusterextension_types.go:92:2:kubeapilinter:optionalorrequired: field ClusterExtensionSpec.Source should use marker required instead of kubebuilder:validation:Required
api/v1/clusterextension_types.go:110:2:kubeapilinter:optionalfields: field ClusterExtensionSpec.Config does not allow the zero value. It must have the omitzero tag.
api/v1/clusterextension_types.go:131:2:kubeapilinter:optionalorrequired: field SourceConfig.SourceType should use marker required instead of kubebuilder:validation:Required
api/v1/clusterextension_types.go:171:2:kubeapilinter:optionalorrequired: field ClusterExtensionConfig.ConfigType should use marker required instead of kubebuilder:validation:Required
api/v1/clusterextension_types.go:214:2:kubeapilinter:optionalorrequired: field CatalogFilter.PackageName should use marker required instead of kubebuilder:validation:Required
api/v1/clusterextension_types.go:294:2:kubeapilinter:optionalfields: field CatalogFilter.Version has a valid zero value (""), but the validation is not complete (e.g. minimum length). The field should be a pointer to allow the zero value to be set. If the zero value is not a valid use case, complete the validation and remove the pointer.
api/v1/clusterextension_types.go:338:2:kubeapilinter:ssatags: CatalogFilter.Channels should have a listType marker for proper Server-Side Apply behavior (atomic, set, or map)
api/v1/clusterextension_types.go:397:2:kubeapilinter:optionalorrequired: field ServiceAccountReference.Name should use marker required instead of kubebuilder:validation:Required
api/v1/clusterextension_types.go:409:2:kubeapilinter:optionalorrequired: field PreflightConfig.CRDUpgradeSafety must be marked as optional or required
api/v1/clusterextension_types.go:425:2:kubeapilinter:optionalorrequired: field CRDUpgradeSafetyPreflightConfig.Enforcement should use marker required instead of kubebuilder:validation:Required
api/v1/clusterextension_types.go:450:2:kubeapilinter:optionalorrequired: field BundleMetadata.Name should use marker required instead of kubebuilder:validation:Required
api/v1/clusterextension_types.go:457:2:kubeapilinter:optionalorrequired: field BundleMetadata.Version should use marker required instead of kubebuilder:validation:Required
api/v1/clusterextension_types.go:463:2:kubeapilinter:optionalorrequired: field RevisionStatus.Name must be marked as optional or required
api/v1/clusterextension_types.go:472:2:kubeapilinter:conditions: Conditions field in RevisionStatus is missing the following markers: patchStrategy=merge, patchMergeKey=type
api/v1/clusterextension_types.go:503:2:kubeapilinter:conditions: Conditions field in ClusterExtensionStatus is missing the following markers: patchStrategy=merge, patchMergeKey=type
api/v1/clusterextension_types.go:516:2:kubeapilinter:arrayofstruct: ClusterExtensionStatus.ActiveRevisions is an array of structs, but the struct has no required fields. At least one field should be marked as required to prevent ambiguous YAML configurations
api/v1/clusterextension_types.go:527:2:kubeapilinter:optionalorrequired: field ClusterExtensionInstallStatus.Bundle should use marker required instead of kubebuilder:validation:Required
api/v1/clusterextension_types.go:550:2:kubeapilinter:nonpointerstructs: field ClusterExtension.Spec is a non-pointer struct with required fields. It must be marked as required.
api/v1/clusterextension_types.go:554:2:kubeapilinter:optionalfields: field ClusterExtension.Status has a valid zero value ({}), but the validation is not complete (e.g. min properties/adding required fields). The field should be a pointer to allow the zero value to be set. If the zero value is not a valid use case, complete the validation and remove the pointer.
api/v1/clusterextensionrevision_types.go:55:2:kubeapilinter:optionalorrequired: field ClusterExtensionRevisionSpec.LifecycleState must be marked as optional or required
api/v1/clusterextensionrevision_types.go:67:2:kubeapilinter:optionalorrequired: field ClusterExtensionRevisionSpec.Revision should use marker required instead of kubebuilder:validation:Required
api/v1/clusterextensionrevision_types.go:89:2:kubeapilinter:arrayofstruct: ClusterExtensionRevisionSpec.Phases is an array of structs, but the struct has no required fields. At least one field should be marked as required to prevent ambiguous YAML configurations
api/v1/clusterextensionrevision_types.go:119:2:kubeapilinter:optionalorrequired: field ClusterExtensionRevisionPhase.Name must be marked as optional or required
api/v1/clusterextensionrevision_types.go:124:2:kubeapilinter:arrayofstruct: ClusterExtensionRevisionPhase.Objects is an array of structs, but the struct has no required fields. At least one field should be marked as required to prevent ambiguous YAML configurations
api/v1/clusterextensionrevision_types.go:136:2:kubeapilinter:optionalorrequired: field ClusterExtensionRevisionObject.Object must be marked as optional or required
api/v1/clusterextensionrevision_types.go:201:2:kubeapilinter:conditions: Conditions field in ClusterExtensionRevisionStatus is missing the following markers: patchStrategy=merge, patchMergeKey=type
api/v1/clusterextensionrevision_types.go:227:2:kubeapilinter:nonpointerstructs: field ClusterExtensionRevision.Spec is a non-pointer struct with required fields. It must be marked as required.
api/v1/clusterextensionrevision_types.go:231:2:kubeapilinter:optionalfields: field ClusterExtensionRevision.Status has a valid zero value ({}), but the validation is not complete (e.g. min properties/adding required fields). The field should be a pointer to allow the zero value to be set. If the zero value is not a valid use case, complete the validation and remove the pointer.

SUCCESS: Fixed 3 issue(s), no new issues introduced.
WARNING: 44 pre-existing issue(s) remain. Please address them separately.
---
  API Lint Diff Analysis Report

  Generated: 2025-12-24
  Baseline: main branch (47 issues)
  Current: fix-go-docs-linter-api-check (44 issues)
  Status: ✅ PASSED - 0 new issues introduced

  Executive Summary

  - Baseline issues: 47
  - Current issues: 44
  - FIXED: 3 issues (Successfully resolved in this branch!)
  - NEW: 0 issues (No new problems introduced)
  - PRE-EXISTING: 44 issues (Existed before changes, can be addressed separately)
  - False positives (IGNORED): 6 issues

  Great work! This branch fixed 3 documentation issues without introducing any new API problems.

  ---
  FIXED ISSUES (3 issues)

  1. api/v1/clusterextension_types.go:477 - ClusterExtensionStatus.Conditions godoc formatting
     Fixed godoc comment to start with 'conditions' instead of custom text

  2. api/v1/clusterextension_types.go:540 - ClusterExtension.metav1.ObjectMeta missing godoc
     Added godoc comment for the embedded ObjectMeta field

  3. api/v1/clusterextensionrevision_types.go:219 - ClusterExtensionRevision.metav1.ObjectMeta missing godoc
     Added godoc comment for the embedded ObjectMeta field

  ---
  PRE-EXISTING ISSUES (44 issues)

  These issues existed before your changes. They can be addressed in separate PRs.

  ---
  FALSE POSITIVES FILTERED (6 issues)

  The following issues are IGNORED as they are standard Kubernetes CRD patterns incorrectly flagged by kube-api-linter:

  1. api/v1/clustercatalog_types.go:73 - ClusterCatalog.Status optionalfields
  Why ignored: Status is NEVER a pointer in Kubernetes APIs. Works correctly with omitempty tag.
  2. api/v1/clusterextension_types.go:554 - ClusterExtension.Status optionalfields
  Why ignored: Status is NEVER a pointer in Kubernetes APIs. Works correctly with omitempty tag.
  3. api/v1/clusterextensionrevision_types.go:231 - ClusterExtensionRevision.Status optionalfields
  Why ignored: Status is NEVER a pointer in Kubernetes APIs. Works correctly with omitempty tag.
  4. api/v1/clustercatalog_types.go:175 - ClusterCatalogStatus.Conditions missing patchStrategy markers
  Why ignored: metav1.Condition already handles patches correctly. Adding these markers is redundant.
  5. api/v1/clusterextension_types.go:503 - ClusterExtensionStatus.Conditions missing patchStrategy markers
  Why ignored: metav1.Condition already handles patches correctly. Adding these markers is redundant.
  6. api/v1/clusterextensionrevision_types.go:201 - ClusterExtensionRevisionStatus.Conditions missing patchStrategy markers
  Why ignored: metav1.Condition already handles patches correctly. Adding these markers is redundant.

  ---
  DETAILED ANALYSIS FOR PRE-EXISTING ISSUES

  Since there are no NEW issues requiring immediate fixes, below is the analysis of pre-existing issues grouped by category and fix complexity.

  Category 1: Deprecated Marker Replacements (NON-BREAKING) - 11 issues

  These are straightforward marker updates from deprecated syntax to modern syntax.

  File: api/v1/clustercatalog_types.go

  Issue 1. Line 66 - ClusterCatalog.Spec
  // CURRENT:
  // +kubebuilder:validation:Required
  Spec ClusterCatalogSpec `json:"spec"`

  // FIX:
  // +required
  Spec ClusterCatalogSpec `json:"spec"`
  Why: Replace deprecated +kubebuilder:validation:Required with modern +required marker
  Breaking: NO

  Issue 2. Line 109 - ClusterCatalogSpec.Source
  // CURRENT:
  // +kubebuilder:validation:Required
  Source CatalogSource `json:"source"`

  // FIX:
  // +required
  Source CatalogSource `json:"source"`
  Why: Replace deprecated +kubebuilder:validation:Required with modern +required marker
  Breaking: NO

  Issue 3. Line 206 - ClusterCatalogURLs.Base
  // CURRENT:
  // +kubebuilder:validation:Required
  Base string `json:"base"`

  // FIX:
  // +required
  Base string `json:"base"`
  Why: Replace deprecated +kubebuilder:validation:Required with modern +required marker
  Breaking: NO

  Issue 4. Line 224 - CatalogSource.Type
  // CURRENT:
  // +kubebuilder:validation:Required
  Type SourceType `json:"type"`

  // FIX:
  // +required
  Type SourceType `json:"type"`
  Why: Replace deprecated +kubebuilder:validation:Required with modern +required marker
  Breaking: NO

  Issue 5. Line 245 - ResolvedCatalogSource.Type
  // CURRENT:
  // +kubebuilder:validation:Required
  Type SourceType `json:"type"`

  // FIX:
  // +required
  Type SourceType `json:"type"`
  Why: Replace deprecated +kubebuilder:validation:Required with modern +required marker
  Breaking: NO

  Issue 6. Line 264 - ResolvedImageSource.Ref
  // CURRENT:
  // +kubebuilder:validation:Required
  Ref string `json:"ref"`

  // FIX:
  // +required
  Ref string `json:"ref"`
  Why: Replace deprecated +kubebuilder:validation:Required with modern +required marker
  Breaking: NO

  Issue 7. Line 320 - ImageSource.Ref
  // CURRENT:
  // +kubebuilder:validation:Required
  Ref string `json:"ref"`

  // FIX:
  // +required
  Ref string `json:"ref"`
  Why: Replace deprecated +kubebuilder:validation:Required with modern +required marker
  Breaking: NO

  File: api/v1/clusterextension_types.go

  Issue 8. Line 67 - ClusterExtensionSpec.Namespace
  // CURRENT:
  // +kubebuilder:validation:Required
  Namespace string `json:"namespace"`

  // FIX:
  // +required
  Namespace string `json:"namespace"`
  Why: Replace deprecated +kubebuilder:validation:Required with modern +required marker
  Breaking: NO

  Issue 9. Line 76 - ClusterExtensionSpec.ServiceAccount
  // CURRENT:
  // +kubebuilder:validation:Required
  ServiceAccount ServiceAccountReference `json:"serviceAccount"`

  // FIX:
  // +required
  ServiceAccount ServiceAccountReference `json:"serviceAccount"`
  Why: Replace deprecated +kubebuilder:validation:Required with modern +required marker
  Breaking: NO

  Issue 10. Line 92 - ClusterExtensionSpec.Source
  // CURRENT:
  // +kubebuilder:validation:Required
  Source SourceConfig `json:"source"`

  // FIX:
  // +required
  Source SourceConfig `json:"source"`
  Why: Replace deprecated +kubebuilder:validation:Required with modern +required marker
  Breaking: NO

  Issue 11. Line 131 - SourceConfig.SourceType
  // CURRENT:
  // +kubebuilder:validation:Required
  SourceType string `json:"sourceType"`

  // FIX:
  // +required
  SourceType string `json:"sourceType"`
  Why: Replace deprecated +kubebuilder:validation:Required with modern +required marker
  Breaking: NO

  Category 2: Missing Optional/Required Markers (NON-BREAKING) - 12 issues

  These fields need explicit +optional or +required markers.

  File: api/v1/clustercatalog_types.go

  Issue 12. Line 61 - ClusterCatalog.metav1.ObjectMeta
  // CURRENT:
  metav1.ObjectMeta `json:"metadata"`

  // FIX:
  // +required
  metav1.ObjectMeta `json:"metadata"`
  Why: ObjectMeta is always present in Kubernetes resources
  Breaking: NO (Already enforced by Kubernetes API server)

  Issue 13. Line 248 - ResolvedCatalogSource.Image
  // CURRENT:
  Image *ResolvedImageSource `json:"image"`

  // FIX:
  // +optional
  Image *ResolvedImageSource `json:"image"`
  Why: Field is a pointer, indicating it's optional
  Breaking: NO

  File: api/v1/clusterextension_types.go

  Issue 14. Line 171 - ClusterExtensionConfig.ConfigType
  // CURRENT:
  // +kubebuilder:validation:Required
  ConfigType ClusterExtensionConfigType `json:"configType"`

  // FIX:
  // +required
  ConfigType ClusterExtensionConfigType `json:"configType"`
  Why: Replace deprecated marker
  Breaking: NO

  Issue 15. Line 214 - CatalogFilter.PackageName
  // CURRENT:
  // +kubebuilder:validation.Required (note the dot instead of colon - this is a typo!)
  PackageName string `json:"packageName"`

  // FIX:
  // +required
  PackageName string `json:"packageName"`
  Why: Fix typo in deprecated marker and use modern syntax
  Breaking: NO

  Issue 16. Line 397 - ServiceAccountReference.Name
  // CURRENT:
  // +kubebuilder:validation:Required
  Name string `json:"name"`

  // FIX:
  // +required
  Name string `json:"name"`
  Why: Replace deprecated marker
  Breaking: NO

  Issue 17. Line 409 - PreflightConfig.CRDUpgradeSafety
  // CURRENT:
  CRDUpgradeSafety *CRDUpgradeSafetyPreflightConfig `json:"crdUpgradeSafety"`

  // FIX:
  // +required
  CRDUpgradeSafety *CRDUpgradeSafetyPreflightConfig `json:"crdUpgradeSafety"`
  Usage Analysis:
  - XValidation rule at line 402: rule="has(self.crdUpgradeSafety)" - requires field to be present
  - Field is validated as required through CEL expression

  Why: CEL validation requires this field, should be marked +required for consistency
  Breaking: NO (Already enforced by CEL validation)

  Issue 18. Line 425 - CRDUpgradeSafetyPreflightConfig.Enforcement
  // CURRENT:
  // +kubebuilder:validation:Required
  Enforcement CRDUpgradeSafetyEnforcement `json:"enforcement"`

  // FIX:
  // +required
  Enforcement CRDUpgradeSafetyEnforcement `json:"enforcement"`
  Why: Replace deprecated marker
  Breaking: NO

  Issue 19. Line 450 - BundleMetadata.Name
  // CURRENT:
  // +kubebuilder:validation:Required
  Name string `json:"name"`

  // FIX:
  // +required
  Name string `json:"name"`
  Why: Replace deprecated marker
  Breaking: NO

  Issue 20. Line 457 - BundleMetadata.Version
  // CURRENT:
  // +kubebuilder:validation:Required
  Version string `json:"version"`

  // FIX:
  // +required
  Version string `json:"version"`
  Why: Replace deprecated marker
  Breaking: NO

  Issue 21. Line 463 - RevisionStatus.Name
  // CURRENT:
  Name string `json:"name"`

  // FIX:
  // +required
  Name string `json:"name"`
  Usage Analysis:
  - Used in api/v1/clusterextension_types.go:516 as part of listMapKey=name
  - Map key fields must always be present

  Why: This field is a listMapKey, which requires it to always be present
  Breaking: NO (Already required by listMapKey constraint)

  Issue 22. Line 527 - ClusterExtensionInstallStatus.Bundle
  // CURRENT:
  // +kubebuilder:validation:Required
  Bundle BundleMetadata `json:"bundle"`

  // FIX:
  // +required
  Bundle BundleMetadata `json:"bundle"`
  Why: Replace deprecated marker
  Breaking: NO

  Issue 23. Line 550 - ClusterExtension.Spec
  // CURRENT:
  Spec ClusterExtensionSpec `json:"spec,omitempty"`

  // FIX:
  // +required
  Spec ClusterExtensionSpec `json:"spec"`
  Why: Spec has required fields and should not have omitempty
  Breaking: YES - Removing omitempty could affect API behavior

  File: api/v1/clusterextensionrevision_types.go

  Issue 24. Line 55 - ClusterExtensionRevisionSpec.LifecycleState
  // CURRENT:
  // +kubebuilder:default="Active"
  LifecycleState ClusterExtensionRevisionLifecycleState `json:"lifecycleState,omitempty"`

  // FIX:
  // +kubebuilder:default="Active"
  // +optional
  LifecycleState ClusterExtensionRevisionLifecycleState `json:"lifecycleState,omitempty"`
  Why: Field has omitempty and a default, indicating it's optional
  Breaking: NO

  Issue 25. Line 67 - ClusterExtensionRevisionSpec.Revision
  // CURRENT:
  // +kubebuilder:validation:Required
  Revision int64 `json:"revision"`

  // FIX:
  // +required
  Revision int64 `json:"revision"`
  Why: Replace deprecated marker
  Breaking: NO

  Issue 26. Line 119 - ClusterExtensionRevisionPhase.Name
  // CURRENT:
  Name string `json:"name"`

  // FIX:
  // +required
  Name string `json:"name"`
  Usage Analysis:
  - Used as listMapKey at line 87
  - Map key fields must always be present

  Why: This field is a listMapKey, which requires it to always be present
  Breaking: NO (Already required by listMapKey constraint)

  Issue 27. Line 136 - ClusterExtensionRevisionObject.Object
  // CURRENT:
  Object unstructured.Unstructured `json:"object"`

  // FIX:
  // +required
  Object unstructured.Unstructured `json:"object"`
  Why: The object field is the core content of this struct and is always needed
  Breaking: NO

  Issue 28. Line 227 - ClusterExtensionRevision.Spec
  // CURRENT:
  Spec ClusterExtensionRevisionSpec `json:"spec,omitempty"`

  // FIX:
  // +required
  Spec ClusterExtensionRevisionSpec `json:"spec"`
  Why: Spec has required fields (Revision) and should not have omitempty
  Breaking: YES - Removing omitempty could affect API behavior

  Category 3: Missing omitzero Tag (NON-BREAKING) - 2 issues

  File: api/v1/clustercatalog_types.go

  Issue 29. Line 178 - ClusterCatalogStatus.ResolvedSource
  // CURRENT:
  // +optional
  ResolvedSource *ResolvedCatalogSource `json:"resolvedSource,omitempty"`

  // FIX:
  // +optional
  ResolvedSource *ResolvedCatalogSource `json:"resolvedSource,omitzero"`
  Why: Pointer field that should not serialize when zero
  Breaking: NO (Changes serialization but semantically equivalent)

  File: api/v1/clusterextension_types.go

  Issue 30. Line 110 - ClusterExtensionSpec.Config
  // CURRENT:
  // +optional
  Config *ClusterExtensionConfig `json:"config,omitempty"`

  // FIX:
  // +optional
  Config *ClusterExtensionConfig `json:"config,omitzero"`
  Why: Pointer field that should not serialize when zero
  Breaking: NO (Changes serialization but semantically equivalent)

  Category 4: Optional Fields Without Complete Validation (ANALYSIS NEEDED) - 2 issues

  These fields may need to be converted to pointers OR have validation completed.

  File: api/v1/clustercatalog_types.go

  Issue 31. Line 131 - ClusterCatalogSpec.Priority
  // CURRENT:
  // +kubebuilder:default:=0
  // +kubebuilder:validation:minimum:=-2147483648
  // +kubebuilder:validation:maximum:=2147483647
  // +optional
  Priority int32 `json:"priority"`

  // FIX:
  // Keep as-is - validation IS complete with min/max
  Usage Analysis:
  - Used in internal/operator-controller/resolve/catalog.go:163 as direct cat.Spec.Priority
  - Used in tests with explicit values like Priority: 1, Priority: 0
  - Has default value of 0, min/max validation
  - Zero value (0) is semantically valid (documented as default priority)

  Why: This is a FALSE POSITIVE. The validation IS complete (min/max specified). Zero value is valid and documented. The field should remain as int32 with default=0.
  Breaking: N/A - No change needed

  File: api/v1/clusterextension_types.go

  Issue 32. Line 294 - CatalogFilter.Version
  // CURRENT:
  // +optional
  Version string `json:"version,omitempty"`

  // FIX:
  // Keep as-is - this is correct
  Usage Analysis:
  - Used in test/upgrade-e2e/post_upgrade_test.go:182: clusterExtension.Spec.Source.Catalog.Version = "1.0.1"
  - Empty string means "latest version" per documentation at line 217
  - Field is truly optional with semantic meaning for empty value
  - Has complex validation regex but empty is explicitly allowed

  Why: This is a FALSE POSITIVE. Empty string has semantic meaning ("latest version"). The field is correctly optional with omitempty.
  Breaking: N/A - No change needed

  Category 5: Integer Type Issues (BREAKING) - 1 issue

  File: api/v1/clustercatalog_types.go

  Issue 33. Line 328 - ImageSource.PollIntervalMinutes
  // CURRENT:
  // +optional
  PollIntervalMinutes *int `json:"pollIntervalMinutes,omitempty"`

  // FIX:
  // +optional
  PollIntervalMinutes *int32 `json:"pollIntervalMinutes,omitempty"`
  Usage Analysis:
  - Used in internal/catalogd/controllers/core/clustercatalog_controller.go:308-309: pointer nil check then dereference
  - Used in tests with ptr.To(1), ptr.To(5), etc. - all small positive integers
  - Converted to time.Duration by multiplying with time.Minute
  - Min validation is 1, practical max is far below int32 range

  Why: Kubernetes API guidelines recommend int32 or int64 over int for portability. Values are always small positive integers (minutes), so int32 is appropriate.
  Breaking: YES - Changes the type from platform-dependent int to int32. Could affect 32-bit vs 64-bit platforms differently, though in practice this field only holds small values.

  Category 6: Missing listType Marker for SSA (NON-BREAKING) - 1 issue

  File: api/v1/clusterextension_types.go

  Issue 34. Line 338 - CatalogFilter.Channels
  // CURRENT:
  // +optional
  Channels []string `json:"channels,omitempty"`

  // FIX:
  // +listType=set
  // +optional
  Channels []string `json:"channels,omitempty"`
  Why: Array of strings representing channel names. Duplicates don't make semantic sense (you wouldn't specify the same channel twice), so set is appropriate.
  Breaking: NO (Improves Server-Side Apply behavior but doesn't change validation)

  Category 7: Array of Struct Without Required Fields (NEEDS ANALYSIS) - 2 issues

  File: api/v1/clusterextension_types.go

  Issue 35. Line 516 - ClusterExtensionStatus.ActiveRevisions
  // CURRENT:
  // +listType=map
  // +listMapKey=name
  // +optional
  ActiveRevisions []RevisionStatus `json:"activeRevisions,omitempty"`

  // FIX - Option 1: Add +required to RevisionStatus.Name (recommended)
  // Already covered in Issue #21 above

  // FIX - Option 2: Mark Name as +required in RevisionStatus struct
  // See Issue #21
  Why: The warning is about RevisionStatus having no required fields. Since Name is already the listMapKey, marking it as +required (Issue #21) will resolve this.
  Breaking: NO (Issue #21 is already non-breaking)

  File: api/v1/clusterextensionrevision_types.go

  Issue 36. Line 89 - ClusterExtensionRevisionSpec.Phases
  // CURRENT:
  // +listType=map
  // +listMapKey=name
  // +optional
  Phases []ClusterExtensionRevisionPhase `json:"phases,omitempty"`

  // FIX: Mark ClusterExtensionRevisionPhase.Name as +required
  // Already covered in Issue #26 above
  Why: The warning is about ClusterExtensionRevisionPhase having no required fields. Since Name is the listMapKey, marking it as +required (Issue #26) will resolve this.
  Breaking: NO (Issue #26 is already non-breaking)

  Issue 37. Line 124 - ClusterExtensionRevisionPhase.Objects
  // CURRENT:
  Objects []ClusterExtensionRevisionObject `json:"objects"`

  // FIX: Mark ClusterExtensionRevisionObject.Object as +required
  // Already covered in Issue #27 above
  Why: The warning is about ClusterExtensionRevisionObject having no required fields. Marking Object as +required (Issue #27) will resolve this.
  Breaking: NO (Issue #27 is already non-breaking)

  ---
  Summary of Issues by Fix Complexity

  Non-Breaking Changes (36 issues):

  - 11 deprecated marker replacements
  - 12 missing optional/required markers
  - 2 missing omitzero tags
  - 2 false positives (Priority and Version - no change needed)
  - 1 missing listType marker
  - 3 array of struct issues (resolved by marking key fields as required)
  - 6 false positives already filtered (Status fields and Conditions markers)

  Breaking Changes (2 issues):

  1. ImageSource.PollIntervalMinutes (int → int32) - Type change for Kubernetes compatibility
  2. ClusterExtension.Spec and ClusterExtensionRevision.Spec - Remove omitempty from required Spec fields

  ---
  Recommendations

  1. Immediate action: None required for this PR. You successfully fixed 3 issues without introducing new ones.
  2. Future PRs to address pre-existing issues:
    - Quick win PR: Fix all 11 deprecated marker replacements (straightforward, non-breaking)
    - SSA improvements PR: Add listType markers and fix omitzero tags (non-breaking, improves UX)
    - Breaking changes PR: Address int→int32 type change and Spec omitempty removal (requires careful migration planning)