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. Generates a comprehensive report under reports/YYYY-MM-DD/argocd-audit.md. (project)
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, .ymlSearch for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer