gitops
Skill71 starsChanged 8 days agoApache-2.0View on GitHub
Flux CD and Argo CD — two modes. debug: five structured debug workflows for live clusters (installation, source, HelmRelease, Kustomization, ResourceSet) producing a five-section report. audit: six-phase read-only repo analysis (discovery, validation, API compliance, best practices, security) producing a prioritised Critical/Warning/Info report.
- Commits and pushes
We split this skill into the rules it gives an agent
11 rules. About 0 are common, 8 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈8
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 14
When invoked with no arguments, ask before proceeding:
- Distinctive: line 46
If the mode is ambiguous, ask:
- Distinctive: line 76
Verify controllers are healthy before debugging individual resources.
- Distinctive: line 100
Check sources separately when controllers are healthy but resources are not reconciling.
- Very specific: line 212
Template issue: If inputs are not rendering, verify template delimiters are << inputs.field >> — not {{ inputs.field }}.
- Distinctive: line 293
Use before merging, before a release, or when onboarding an unfamiliar repo.
- Very specific: line 297
Use examples/fluxcd/repo-audit from the loaded installation.
- Distinctive: line 306
Verify versions before proceeding:
- Very specific: line 338
Check for gotk-sync.yaml — if present, flag for Flux Operator migration.
- Distinctive: line 436
Treat credential matches as candidates.
- Distinctive: line 466
Add Cosign verification to OCIRepository sources
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Interactive Wizard (fires when $ARGUMENTS is empty)
When invoked with no arguments, ask before proceeding:
Q1 — Mode?
Are you debugging a live cluster issue or auditing a GitOps repository?
1. debug — live cluster troubleshooting (Flux/Argo error, not reconciling, pod failure)
2. audit — read-only repository health check (before merge, before release, onboarding)
Enter 1 or 2:Q2 — Context (after mode selected, one at a time):
- debug:
Describe the symptom or paste the flux get / kubectl output (error message, resource name, namespace): - audit:
Provide the repo path or paste the directory listing (or run: bash "$SCRIPTS/discover.sh" -d . if tooling is set up):
Then proceed with the relevant mode below.
You are a senior platform engineer specialising in GitOps with Flux CD and Argo CD.
The input is: $ARGUMENTS
Step 1 — Identify the mode
| If the input starts with or describes… | Use |
debug, an error message, flux get output, pod logs, "not reconciling" | Debug mode → work through the debug workflows below |
audit, a repo path, "before merge", "is this correct", directory listing | Audit mode → work through the 6-phase audit below |
If the mode is ambiguous, ask:
"Are you debugging a live cluster issue or auditing a GitOps repository?"
Debug mode — live cluster troubleshooting
1. Identify the tool and layer
Flux CD layers:
- Source — GitRepository, OCIRepository, HelmRepository, Bucket
- Artifact — Kustomization build, HelmChart render
- Reconciliation — Kustomization apply, HelmRelease install/upgrade
- Runtime — pod health, hook failures, dependency ordering
- Operator — FluxInstance, ResourceSet, ResourceSetInputProvider
Argo CD layers:
- Source — repo connection, credentials, branch/path
- Diff — ignoreDifferences, server-side apply drift
- Sync — sync waves, resource hooks, namespace creation
- Health — custom health checks, resource status
2. Flux debug workflows
Work through the relevant workflow. Follow the dependency chain top-down — do not skip layers.
Workflow 1 — Installation check
Verify controllers are healthy before debugging individual resources.
flux get all -A
kubectl get fluxinstance flux -n flux-system -o yaml
kubectl get fluxreport flux -n flux-system -o yaml
kubectl get pods -n flux-system
kubectl logs -n flux-system deploy/source-controller | tail -50
kubectl logs -n flux-system deploy/kustomize-controller | tail -50
kubectl logs -n flux-system deploy/helm-controller | tail -50Controller failure modes:
| Symptom | Cause | Fix |
| Controller pod not running | Resource pressure, image pull failure, missing CRDs | Check kubectl describe pod, node conditions, image pull secrets |
Controller OOMKilled / crashlooping | Insufficient memory limits | Increase limits via FluxInstance spec.kustomize.patches or delete pod to reset |
spec.suspend: true on FluxInstance | Intentional pause | Do not flag as error — resume with kubectl patch fluxinstance flux --type=merge -p '{"spec":{"suspend":false}}' |
Ready: Unknown / Progressing | Reconciliation in flight | Wait; check lastTransitionTime relative to interval |
| Missing CRDs after upgrade | Flux component not upgraded | Re-run bootstrap or update FluxInstance.spec.distribution.version |
Workflow 1b — Source failures
Check sources separately when controllers are healthy but resources are not reconciling.
flux get sources all -A
kubectl describe gitrepository <name> -n flux-system
kubectl describe ocirepository <name> -n flux-systemSource failure modes:
| Source | Symptom | Cause | Fix |
GitRepository | FetchFailed | Wrong credentials, expired token, wrong SSH key | Check secretRef; verify identity/known_hosts keys; SSH scp-style URLs (git@host:repo) are NOT supported — use ssh://git@host/repo |
OCIRepository | FetchFailed | Cloud registry auth misconfigured | Check spec.provider for ECR/GCR/ACR; verify workload identity annotation on controller SA |
OCIRepository | Cosign verify failure | Signature missing or OIDC issuer/subject mismatch | Check spec.verify.matchOIDCIdentity; verify signature was pushed by CI |
HelmChart | Not ready | Referenced HelmRepository not ready | Fix the source first — HelmChart inherits source failures |
HelmRepository (OCI type) | No status conditions | OCI HelmRepositories show no status | Migrate to OCIRepository with spec.chartRef |
Workflow 2 — HelmRelease trace
Trace: HelmRelease spec/status → managing object → valuesFrom references → chart source → managed inventory → pod logs.
# Step 1: Check HelmRelease status
flux get helmrelease <name> -n <namespace>
kubectl describe helmrelease <name> -n <namespace>
flux logs --kind=HelmRelease --name=<name> --namespace=<namespace>
# Step 2: Trace the managing object via labels — don't guess, read the labels
kubectl get helmrelease <name> -n <namespace> \
-o jsonpath='{.metadata.labels}' | jq
# Look for:
# kustomize.toolkit.fluxcd.io/name → parent Kustomization
# resourceset.fluxcd.io/name → parent ResourceSet
# Step 3: Check valuesFrom ConfigMaps / Secrets
kubectl get configmap,secret -n <namespace>
# Step 4: Check chart source
flux get sources oci -A
flux get sources helm -A
# Step 5: Check managed inventory resources
kubectl get all -n <namespace>
# Step 6: Check pod logs if workload exists
kubectl logs -n <namespace> deploy/<name> | tail -50Common failures:
| Symptom | Cause | Fix |
install retries exhausted | Hook timeout, resource conflict, or values type mismatch | Check helm-controller logs; validate values against chart schema |
Remediation exhausted | Max retries reached — manual intervention needed | Switch to install.strategy.name: RetryOnFailure; suspend + manually fix release |
chart not found | OCIRepository missing layerSelector.mediaType | Add layerSelector.mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip |
valuesFrom key missing | ConfigMap lacks reconcile.fluxcd.io/watch: Enabled or wrong key | Verify key name and add watch label |
spec.chart.spec and spec.chartRef both set | Mutually exclusive fields | Remove spec.chart.spec; use spec.chartRef for OCI sources |
HelmRelease stuck after spec.force: true | Force recreates but hooks fail | Disable force after the immutable field change is resolved |
Workflow 3 — Kustomization trace
Trace: Kustomization spec/status → parent object → substituteFrom references → source → managed resources → pod logs.
# Step 1: Check Kustomization status
flux get kustomization <name> -n flux-system
kubectl describe kustomization <name> -n flux-system
flux logs --kind=Kustomization --name=<name>
# Step 2: Find resources managed by this Kustomization (label-based)
kubectl get all -A -l kustomize.toolkit.fluxcd.io/name=<name>
# Step 3: Check parent object if this Kustomization is itself managed
kubectl get kustomization -A \
-o jsonpath='{range .items[*]}{.metadata.name}{" dependsOn: "}{.spec.dependsOn}{"\n"}{end}'
# Step 4: Check substituteFrom references
kubectl get configmap,secret -n flux-system \
-l reconcile.fluxcd.io/watch=Enabled
# Step 5: Check source
flux get sources git -A
flux get sources oci -A
# Step 6: Check managed resources
kubectl get all -n <target-namespace>Common failures:
| Symptom | Cause | Fix |
kustomize build failed | Missing resource, invalid overlay patch, or wrong path | Run kustomize build ./path locally to reproduce |
health check timeout | dependsOn not ready, or workload stuck | Check dependsOn chain; inspect dependent resource status |
| Variable substitution not applied | ConfigMap not watched or substituteFrom on wrong Kustomization | Add reconcile.fluxcd.io/watch: Enabled; ensure substituteFrom is on the Kustomization that owns the manifest, not a sibling |
| Immutable field conflict | Field cannot be patched in place | Set spec.force: true temporarily to recreate; remove after |
| Missing ConfigMap/Secret | substituteFrom references an object that doesn't exist | Create the missing object in the Kustomization's namespace |
Workflow 4 — ResourceSet trace
Trace: ResourceSet status → inputsFrom providers → dependsOn chain → generated Kustomizations/HelmReleases.
kubectl get resourceset -A
kubectl describe resourceset <name> -n flux-system
kubectl get resourcesetinputprovider -A
kubectl describe resourcesetinputprovider <name> -n flux-system
kubectl get kustomization,helmrelease -l resourceset.fluxcd.io/name=<name> -A
kubectl get resourceset <name> -n flux-system -o jsonpath='{.spec.dependsOn}'Template issue: If inputs are not rendering, verify template delimiters are << inputs.field >> — not {{ inputs.field }}.
Workflow 5 — Log analysis
kubectl get deployment <name> -n <namespace> \
-o jsonpath='{.spec.selector.matchLabels}'
kubectl get pods -n <namespace> -l <key>=<value>
kubectl logs -n <namespace> <pod-name> --previous
kubectl logs -n <namespace> <pod-name> --tail=100Edge cases:
- Flux-managed resources: warn before manual changes — Flux will revert them on next reconciliation.
- Stale status: if
lastReconcileTimeis old relative tointerval, check controller logs for backpressure.
For a scannable symptom → cause → fix cheat-sheet across all failure categories, see references/fluxcd-troubleshooting.md.
3. Argo CD debug workflows
argocd app get <name> --show-operation
argocd app diff <name>
argocd app logs <name>
kubectl describe application <name> -n argocdCommon failures:
| Symptom | Cause | Fix |
| OutOfSync: managedFields drift | Server-side apply divergence | Add ignoreDifferences for the conflicting field |
| Sync stuck on namespace creation | App-of-apps ordering | Use sync waves (argocd.argoproj.io/sync-wave) |
| Health check never passes | Custom resource without health check | Add a custom Lua health check or use IgnoreExtraneous |
| Sync loop | Resource mutated by another controller | Add the field to ignoreDifferences |
4. Fix
Provide the exact configuration change, annotation, or command. Show before/after for manifest changes.
5. Report
1. Summary — cluster context, Flux/Argo version, resource investigated, current status
2. Resource analysis — spec fields in scope, status conditions, recent events
3. Dependency chain — e.g. GitRepository → Kustomization → HelmRelease → Deployment
4. Root cause — evidence-backed from conditions, events, and logs
5. Recommendations — ordered: Critical → Warning → Info
6. Validation
flux get all -A | grep -v "True"
flux reconcile kustomization <name> --with-source
kubectl get events -n flux-system --sort-by='.lastTimestamp' | tail -207. Rollback
flux suspend kustomization <name>
flux suspend helmrelease <name> -n <namespace>
git revert <commit> && git push
flux resume kustomization <name>Audit mode — GitOps repository health check
Use before merging, before a release, or when onboarding an unfamiliar repo. Read-only — do not apply any changes.
Bundled tooling
Use examples/fluxcd/repo-audit from the loaded installation. Set audit_dir to that directory's absolute path: it is under the repository or Claude plugin root, or inside this skill's directory in a portable install. No script is downloaded during an audit.
audit_dir='<absolute path to bundled examples/fluxcd/repo-audit>'
SCRIPTS="$audit_dir/scripts"Prerequisites: installed flux-schema >= 0.10.0 (standalone CLI or Flux schema plugin), kustomize or kubectl (validate), and flux >= 2.9.0 (check-deprecated). See the bundled audit README for provenance and tool setup.
Verify versions before proceeding:
flux-schema version # or: flux schema version, if installed as a plugin
kubectl version --client # or: kustomize version
flux version --clientScripts copyright The Flux authors, Apache-2.0, vendored from
fluxcd/agent-skillsv0.2.0 at9b05787530a3e200a9ac031fc8a477566e0b7adc. The bundled deprecated-API helper also preserves migration failures.
Phase 1 — Discovery
bash "$SCRIPTS/discover.sh" -d .
bash "$SCRIPTS/discover.sh" -d . -e terraform # exclude dirs if neededOutputs an Inventory JSON document with inventory.summary, inventory.directories, inventory.resources and inventory.flux.
Classify the repo pattern:
| Signal | Pattern |
apps/base/ + apps/<env>/ overlays | basic-monorepo |
ArtifactGenerator resources | Monorepo with source decomposition |
tenants/ + per-tenant GitRepository/Kustomization | multi-repo fleet |
ResourceSet + ResourceSetInputProvider | fleet-with-resourcesets |
FluxInstance + OCIRepository sync | gitless |
postBuild.substituteFrom across clusters | Multi-cluster with per-cluster variables |
update/ or update-policies/ directory | Repo with image automation |
Check for gotk-sync.yaml — if present, flag for Flux Operator migration.
Phase 2 — Manifest Validation
bash "$SCRIPTS/validate.sh" -d .
bash "$SCRIPTS/validate.sh" -d . -e terraform -e helm-chartsWhat it checks: Kubernetes manifests and rendered kustomize overlays through flux-schema, using .fluxschema.yml when present or its ecosystem schema catalog otherwise.
The default flags strip SOPS metadata and skip resources whose schemas are missing. Report skipped resources as coverage gaps. A repository config or flags after -- can change that behavior; do not treat a successful exit as validation of skipped resources.
Phase 3 — API Compliance
bash "$SCRIPTS/check-deprecated.sh" -d . # fails for deprecated APIs or CLI errors
grep -rn "fluxcd.controlplane.io" . --include="*.yaml" | grep "apiVersion"
grep -rn "type: oci" . --include="*.yaml"Current stable API versions:
| Kind | Required apiVersion |
| GitRepository, OCIRepository, HelmRepository, HelmChart, Bucket | source.toolkit.fluxcd.io/v1 |
| Kustomization | kustomize.toolkit.fluxcd.io/v1 |
| HelmRelease | helm.toolkit.fluxcd.io/v2 |
| Provider, Alert | notification.toolkit.fluxcd.io/v1beta3 |
| Receiver | notification.toolkit.fluxcd.io/v1 |
| FluxInstance, ResourceSet, ResourceSetInputProvider | fluxcd.controlplane.io/v1 |
Phase 4 — Best Practices
Kustomization:
spec.prune: true— prevents orphaned resourcesspec.wait: true— blocks dependent resources until health checks passspec.timeoutsetspec.dependsOnchains match actual dependency order
HelmRelease:
spec.chartRef(OCI) notspec.chart.specspec.install.strategy.name: RetryOnFailure— retries the install without uninstalling between attempts (replaces the olderinstall.remediationuninstall-between-retries pattern)- Drift detection:
spec.driftDetection.mode: enabled - Chart version is a pinned exact version (e.g.
1.2.3) — not:latest, not a semver range
Reactivity:
- Every ConfigMap/Secret in
valuesFromorsubstituteFromhasreconcile.fluxcd.io/watch: Enabled
ResourceSet (if present):
- Template delimiters are
<< inputs.field >>— not{{ inputs.field }} layerSelector.mediaTypeset on OCIRepository used for Helm
Repository structure:
clusters/,apps/,infrastructure/clearly separatedflux-system/lives underclusters/<cluster>/- No overlapping Kustomization paths
- Error-severity Alert + Provider configured for production
- Receiver configured for immediate reconciliation on Git push
Phase 5 — Security Review
# Unencrypted Secrets
grep -rn "kind: Secret" . --include="*.yaml" | while read m; do
f=$(echo "$m" | cut -d: -f1)
grep -q "sops:" "$f" || grep -q "ENC\[" "$f" || echo "UNENCRYPTED: $f"
done
# Potential hardcoded credentials: report file names, never matching values
grep -rl -e "password:" -e "token:" -e "apiKey:" -e "_SECRET=" -e "ACCESS_KEY=" --include="*.yaml" .
# Insecure sources
grep -rn "insecure: true" . --include="*.yaml"
# Cloud registries without Workload Identity
grep -rn "ecr\.\|\.gcr\.io\|\.azurecr\.io" . --include="*.yaml" -B5 | grep -v "provider:"
# OCIRepository without Cosign verification
grep -rn "kind: OCIRepository" . --include="*.yaml" -A20 | grep -v "verify:"
# cluster-admin bindings
grep -rn "cluster-admin" . --include="*.yaml"
# Image automation pushing to main
grep -rn "kind: ImageUpdateAutomation" . --include="*.yaml" -A20 | grep "branch: main\|branch: master"Checklist: no plain Secrets in Git, SOPS/ESO in use, Workload Identity for cloud registries, Cosign on OCIRepository, per-tenant serviceAccountName, image automation pushes to staging branch not main.
Treat credential matches as candidates. Determine whether each is a literal, a reference or encrypted data locally; report only the file, key and line number with the value redacted. Never copy matching credential values into tool output or the report.
Phase 6 — Report
Produce a markdown report:
- Summary — repo pattern, Flux API versions detected, resource counts,
gotk-sync.yamlpresent (flag if yes) - Directory structure — tree of key directories
- Validation results — YAML syntax, kustomize build, schema validation
- API compliance — deprecated versions found with replacements
- Best practices — per-category pass/fail/warning
- Security — per-category findings
Recommendations grouped by severity:
Critical (must fix before production)
- Plain secrets in Git
- Deprecated API versions that will stop working on next Flux upgrade
Warning (should fix)
- Missing
prune: trueon Kustomizations - HelmRelease using legacy remediation strategy
- Missing
reconcile.fluxcd.io/watchlabel onvaluesFromConfigMaps - Static registry credentials where Workload Identity is available
Info (improvement opportunities)
- Migrate from
flux bootstrapto Flux Operator - Enable drift detection on HelmReleases
- Add Cosign verification to OCIRepository sources
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 2
- kcns008/cluster-agent-swarm-skills★ 25same name
- BrendenKennedy/claude-for-ai-platforms★ 1same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository59 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- .github/copilot-instructions.mdCopilot instructions
- .cursor/rules/keda.mdcCursor rule
- .cursor/rules/kubernetes.mdcCursor rule
- .cursor/rules/platform-skills.mdcCursor rule
- .cursor/rules/terraform.mdcCursor rule
- code-reviewSkill
- platform-skillsSkill
- ai-governanceSkill
- awesome-docsSkill
- aws-profileSkill
- awsSkill
- azureSkill
- backup-drSkill
- chaosSkill
- checkovSkill
- cluster-upgradeSkill
- commitSkill
- complianceSkill
- composite-actionsSkill
- datadogSkill
- debugSkill
- documentSkill
- doraSkill
- dynatraceSkill
- finopsSkill
- fluxcdSkill
- gateway-apiSkill
- github-actionsSkill
- helmchartSkill
- karpenterSkill
- kedaSkill
- kingfisherSkill
- kubernetesSkill
- kubescape-operatorSkill
- kubescapeSkill
- kyvernoSkill
- linkerdSkill
- linuxSkill
- mcpSkill
- observabilitySkill
- opaSkill
- openshiftSkill
- platform-skillsSkill
- preflightSkill
- productSkill
- progressive-deliverySkill
- pr-reviewSkill
- renovateSkill
- runtime-securitySkill
- secretsSkill
- self-improveSkill
- setup-agentsSkill
- supply-chainSkill
- terraformSkill
- token-optimizerSkill
- triageSkill
- trivySkill
- zizmorSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

