Automated summary
Operational ArgoCD guide for a K3s cluster: branch repointing through Ansible, OCI Helm chart wiring pitfalls, and InvalidSpecError cache issues.
Strengths
- Documents the sanctioned way to point the root app at a PR branch without hand-editing the Application
- Pinpoints why the oci:// prefix breaks chart-name resolution, including the exact log line to grep for
- Gives concrete remediation commands: refresh annotation, application-controller bounce, helm pull verification
- Flags the unpublished chart-pin trap and the fact that ConfigMap-only changes don't restart pods
Limitations
- Heavily tied to this specific repo and cluster (root app name, group_vars/all.yml, pb_all.yml)
- Doesn't cover multi-cluster sync or advanced sync features like waves and sync windows
- Assumes working familiarity with kubectl, Helm and Ansible
Use it while smoke-testing a PR branch through ArgoCD or when debugging a sync failure caused by an OCI chart or an edited AppProject.
Avoid it on a vanilla ArgoCD setup where the app-of-apps layout, file paths and internal rules described here don't apply.
Security analysis
CautionNo malicious intent: no curl|sh, no credential/token exfiltration, no obfuscated payloads, no safety-disabling. However, the skill is an operational runbook that intentionally directs privileged cluster-mutating actions (ansible apply, pod deletions) and assumes live kubeconfig access, so it warrants caution rather than 'safe' — a user should run it against the intended cluster only and be aware pod deletions are disruptive.
- •Instructs running `uv run ansible-playbook pb_all.yml --tags cluster` which mutates the live cluster (re-templates and applies the root Application)
- •Instructs `kubectl delete pod` on argocd-application-controller-0 and on workload pods — disruptive but recoverable operations against a production cluster
- •Commands reference concrete namespaces/resources (`argo-cd`, `all-cluster-services`) and assume kubectl/helm/ansible credentials already exist in the environment
- •No tool allowlist declared, so the agent may run arbitrary bash/network commands implied by the runbook
Examples
I set repo_branch to my feature branch and ran the cluster playbook, but the child Applications still show the old revision after a minute. What should I do?My ArgoCD app fails with a 403 denied from ghcr.io on an OCI Helm chart, and the log shows it pulling /charts/manifests/<ver> without the chart name. How do I fix the repoURL and sourceRepos?I fixed sourceRepos in the AppProject but the app is still Unknown/Unknown with the same InvalidSpecError and the annotation refresh doesn't help. How do I clear it?name: argocd description: ArgoCD operations on the K3s cluster — branch repointing via ansible, OCI Helm chart wiring foot-guns (oci:// prefix breaks chart-name resolution), and the InvalidSpecError cache bounce.
ArgoCD
The cluster runs an app-of-apps. The root Application is
all-cluster-services in namespace argo-cd; it templates the child
Applications under kubernetes-services/templates/ from this repo.
Branch repointing (smoke-testing a PR branch)
Don't kubectl edit the root Application. The sanctioned path:
- Edit
group_vars/all.yml→ setrepo_branch: <branch>. Do NOT commit this — it's a local-only smoke pointer. uv run ansible-playbook pb_all.yml --tags cluster— re-templates the root app and applies it. This is one of the few commands in the hard rules that's allowed to mutate the live cluster.- If child apps don't pick up the new revision within a minute, force a
re-fetch on the root:
kubectl -n argo-cd annotate application all-cluster-services \ argocd.argoproj.io/refresh=hard --overwrite - Reset
repo_branch: mainwhen done.
Don't push an unpublished chart pin while ArgoCD watches that branch
While repo_branch points at a PR/dev branch for a smoke test, ArgoCD
syncs from the pushed tip of that branch. So bumping an OCI chart pin
(e.g. chart_version/image_tag in kubernetes-services/values.yaml)
to a tag that isn't on the registry yet and pushing it makes ArgoCD
fail the next sync with the ComparisonError: ... 403/404 from the OCI
trap below — the chart genuinely doesn't exist at that version.
When prepping a version bump ahead of the upstream release: keep the
edit out of the pushed branch — park it (a .parked.md diff under
_plans/, or just leave values.yaml untouched and stage the bump
later). Verify the tag is live before applying:
helm pull oci://ghcr.io/<org>/charts/<chart> --version <ver> # 200 = safe to pin
Doc edits that merely mention the new version are fine to commit early
(they don't deploy); only the values.yaml pin is load-bearing.
OCI Helm charts — oci:// prefix is a trap
For an OCI-hosted Helm chart (e.g. ghcr.io/<org>/charts/<chart>):
- Application
repoURL: bareghcr.io/<org>/charts(nooci://prefix) - Application
chart:<chart>(the sub-path) - AppProject
sourceRepos: must match exactly — also bareghcr.io/<org>/charts
If you use oci://ghcr.io/<org>/charts in repoURL, ArgoCD's URL
construction drops the chart name and tries to pull
https://ghcr.io/v2/<org>/charts/manifests/<ver> instead of
.../charts/<chart>/manifests/<ver> — producing a baffling 403 from
ghcr (denied access to the wrong path). The error log line to look for
in argocd-repo-server:
HEAD "https://ghcr.io/v2/<org>/charts/manifests/<ver>":
GET "https://ghcr.io/token?scope=repository:<org>/charts:pull&...": 403: denied
If you see that, the fix is to drop oci:// from both the Application
and the matching sourceRepos entry in argo-cd/argo-project.yaml.
InvalidSpecError sticks after AppProject edits
ArgoCD caches the InvalidSpecError condition with the original
lastTransitionTime — even after you fix the AppProject's
sourceRepos, the child app stays Unknown/Unknown with the same
stale error. Annotations / refreshes don't clear it.
Bounce the application controller to force re-validation:
kubectl -n argo-cd delete pod argocd-application-controller-0
It's a StatefulSet, recreates cleanly within seconds. Allowed under the hard rules — pod lifecycle, not config drift.
ConfigMap-only changes don't roll the pod (envFrom + no checksum)
If a workload consumes a chart-rendered ConfigMap/Secret via envFrom
(or env valueFrom), changing only the ConfigMap data does not
restart the pod. Env vars are injected at pod start, and unless the
chart's Deployment pod template carries a checksum/config (and
checksum/secret) annotation, the Deployment spec is unchanged — so
ArgoCD shows the app Synced/Healthy while the running pod keeps the
stale values. Easy to miss: the ConfigMap in the cluster is correct,
but the config is not actually enforced.
Diagnose by comparing the ConfigMap to what the pod actually has:
kubectl get cm -n <ns> <cm> -o jsonpath='{.data.<KEY>}' # new value
kubectl exec -n <ns> <pod> -- printenv <KEY> # stale value
Enforce it by restarting the pod (the Deployment recreates it identically — pods aren't ArgoCD-tracked, so this is no git drift and allowed under the hard rules, same as the app-controller bounce above):
kubectl delete pod -n <ns> <pod>
The real fix is upstream: the chart should add
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
to the pod template so data changes roll the workload automatically.
Spotting which validator is failing
Three distinct conditions, three distinct fixes:
| Condition | Where it fires | What to fix |
|---|---|---|
| InvalidSpecError: application repo X is not permitted in project Y | App-controller, against AppProject | Add X to sourceRepos in argo-cd/argo-project.yaml, re-apply with --tags cluster, bounce app-controller |
| ComparisonError: failed to resolve revision ...: 403/404 | Repo-server, against the remote registry | OCI URL wrong (see oci:// trap above) or chart genuinely missing/private |
| ComparisonError: values don't meet the specifications of the schema(s) | Repo-server, helm template | Chart's values.schema.json rejects your valuesObject — check additionalProperties: false, key casing, etc. |
The first two often appear together when the project allowlist and URL form are both wrong; fixing only one leaves the app still Unknown.
From the file to a first result
The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.
View the source and supporting filesThis download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.
1. Download the file
Download SKILL.mdFrom the root of a test project, save the file as .skill-downloads/argocd-mrx3xwd0/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.
Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.
mkdir -p '.skill-downloads/argocd-mrx3xwd0' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/argocd-mrx3xwd0/download' --output '.skill-downloads/argocd-mrx3xwd0/SKILL.md.part' && mv '.skill-downloads/argocd-mrx3xwd0/SKILL.md.part' '.skill-downloads/argocd-mrx3xwd0/SKILL.md'2. Check prerequisites
Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.
No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.
The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.
3. Load the skill
After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.
Claude Code
test -f '.skill-downloads/argocd-mrx3xwd0/SKILL.md' && test -s '.skill-downloads/argocd-mrx3xwd0/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/argocd' && cp -R '.skill-downloads/argocd-mrx3xwd0' '.claude/skills/argocd'OpenSkills
OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.
Official OpenSkills installationopenskills install './.skill-downloads/argocd-mrx3xwd0'openskills read 'argocd-mrx3xwd0'Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.
For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.
openskills syncManual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.
4. Try a first task
Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:
Read .skill-downloads/argocd-mrx3xwd0/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.
Configure a Chat Channel with SecretRefs
DevOps
Set up chat channels using non-interactive commands, with secrets only as SecretRefs. Covers gather, mutate, repair, and prove steps for reliable delivery.
Investigate ClickHouse CI Failures
DevOps
Investigate a ClickHouse CI failure end-to-end from a PR or S3 report URL. Fetches failed tests, classifies flaky vs real regression, and checks for existing issues/fixes.
Ansible PR Review
DevOps
Reviews an Ansible PR following the project's standardized process, including changelog checks, test coverage validation, and feedback tracking.