Audits ArgoCD Application manifests and raw K8s resources for anti-patterns, security issues, and best practice violations. Use when asked to audit, review, or check ArgoCD/GitOps quality...
Enforce ArgoCD and Kubernetes manifest quality and security standards across flux/apps/ and raw-manifests/ directories through automated checks.
What it checks (11 checks):
Full audit (all checks):
node .claude/skills/argocd-audit/scripts/run_all_checks.mjs
Generate report (all checks + markdown report):
node .claude/skills/argocd-audit/scripts/generate_report.mjs
Report saved to: reports/YYYY-MM-DD/argocd-audit.md
Individual checks:
node .claude/skills/argocd-audit/scripts/check_application_source.mjs
node .claude/skills/argocd-audit/scripts/check_sync_policy.mjs
node .claude/skills/argocd-audit/scripts/check_hardcoded_secrets.mjs
node .claude/skills/argocd-audit/scripts/check_rbac_wildcards.mjs
node .claude/skills/argocd-audit/scripts/check_istio_gateway_tls.mjs
node .claude/skills/argocd-audit/scripts/check_application_project.mjs
node .claude/skills/argocd-audit/scripts/check_applicationset.mjs
node .claude/skills/argocd-audit/scripts/check_virtualservice.mjs
node .claude/skills/argocd-audit/scripts/check_deprecated_apis.mjs
node .claude/skills/argocd-audit/scripts/check_namespace_spec.mjs
node .claude/skills/argocd-audit/scripts/check_metadata.mjs
RULE: Pin source references for reproducibility. HEAD/floating refs = unpredictable deployments.
Violations:
targetRevision: HEAD - can change without noticerepoURL: http://... - insecure, use HTTPStargetRevision - defaults to HEADtargetRevisionFix: Use targetRevision: main or targetRevision: v1.0.0.
RULE: Configure automated sync properly. Manual sync = drift accumulation.
Violations:
syncPolicy.automated block - manual sync requiredprune: false - orphaned resources accumulateselfHeal: false - manual drift correction requiredretry configuration - transient failures not handledFix: Add automated: { prune: true, selfHeal: true } with retry config.
RULE: Never store secrets in Git. Base64 encoding is NOT encryption.
Violations:
kind: Secret with data: field - secrets exposed in Gitkind: Secret with stringData: field - plaintext secretsFix: Use External Secrets, Sealed Secrets, or HashiCorp Vault.
RULE: Follow least-privilege principle. Wildcard permissions = cluster takeover risk.
Violations:
verbs: ["*"] - grants all actionsresources: ["*"] - access to all resource typesapiGroups: ["*"] - access across all API groupsroleRef.name: cluster-admin - full cluster accessverbs: [impersonate] - can act as other usersFix: Use explicit verbs like [get, list, watch], explicit resources like [pods, services].
RULE: Enable TLS for production traffic. No TLS = unencrypted traffic.
Violations:
credentialName for HTTPS - certificate not specifiedtls.mode - TLS not configuredhosts: ["*"] - overly broad, security riskFix: Add HTTPS server with tls.mode: SIMPLE and credentialName: secret-name.
RULE: Use dedicated projects for isolation. default project = no restrictions.
Violations:
project: default - no source/destination restrictionssourceNamespaces unrestricteddestinations allowing all clustersFix: Create dedicated AppProject with proper sourceRepos and destinations restrictions.
RULE: Use goTemplate with error handling. Silent template failures = hidden bugs.
Violations:
goTemplate: true - using legacy template enginegoTemplateOptions: ["missingkey=error"] - silent failuresFix: Enable goTemplate: true with goTemplateOptions: ["missingkey=error"].
RULE: Validate gateway associations. Orphan VirtualService = unreachable services.
Violations:
gateways field specified - orphan VirtualServicehosts: ["*"] - overly broad matchinghost or portFix: Associate with valid Gateway, use specific hosts like ["app.example.com"].
RULE: Use stable Kubernetes APIs. Deprecated APIs = upgrade failures.
Violations:
extensions/v1beta1 - removed in K8s 1.22networking.k8s.io/v1beta1 Ingress - removed in K8s 1.22apps/v1beta1, apps/v1beta2 - removed in K8s 1.16batch/v1beta1 CronJob - removed in K8s 1.25policy/v1beta1 PodSecurityPolicy - removed in K8s 1.25Fix: Update to stable APIs: apps/v1, networking.k8s.io/v1, batch/v1.
RULE: Explicitly specify namespaces. Implicit namespace = deployment confusion.
Violations:
metadata.namespace - relies on kubectl contextFix: Add explicit namespace field to all namespaced resources.
RULE: Add labels for observability and management. No labels = hard to query/manage.
Violations:
app or app.kubernetes.io/name labelcomponent or app.kubernetes.io/component labelpart-of for application groupingFix: Add standard labels: app.kubernetes.io/name, app.kubernetes.io/component, app.kubernetes.io/part-of.
This skill uses VALUE-BASED detection:
--- separators.yaml, .yml