[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71F7XM2BV1TR1GTK4NJ239D":3,"skill-same:01M71F7XM2BV1TR1GTK4NJ239D":136},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":72,"commitSha":73,"skillDirectory":74,"forksCount":14,"repositoryHtmlUrl":75,"repositoryHomepageUrl":6,"ownerHtmlUrl":76,"ownerBlogUrl":77,"ownerDescription":78,"updatedAt":79,"install":80,"resources":93},"01M71F7XM2BV1TR1GTK4NJ239D","kubernetes-operator",null,"Use when building a Kubernetes Operator — custom controllers that reconcile CRD state. Triggers on \"build an operator\", \"CRD design\", \"reconcile loop\", \"controller-runtime\", \"kubebuilder\", \"operator-sdk\", \"metacontroller\", \"KOPF\", \"operator capability levels\", or \"custom resource\". Ships CRD validator, reconcile-loop linter, and OperatorHub capability auditor (all stdlib Python), 4 references on the operator pattern + CRD design + reconcile patterns + tooling landscape, and a \u002Foperator-audit slash command. NOT a generic k8s skill — specifically the Operator pattern.","agency-black\u002FSkills","agency-black","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F234862658?v=4","01M6HWVFPNGNR5N2CX9ECSAD57","agencia.black","01M719WF77BF3HN0N9FK1APEFY",0,"MIT","https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fengineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"kubernetes","kubernetes operator","operator","command","when","validator","pattern","landscape","references","opencode","kubebuilder","controller-runtime","crd","design","linter","loop","controller","audit","code","cli","2026-11-10 10:12:30",false,"---\nname: kubernetes-operator\ndescription: Use when building a Kubernetes Operator — custom controllers that reconcile CRD state. Triggers on \"build an operator\", \"CRD design\", \"reconcile loop\", \"controller-runtime\", \"kubebuilder\", \"operator-sdk\", \"metacontroller\", \"KOPF\", \"operator capability levels\", or \"custom resource\". Ships CRD validator, reconcile-loop linter, and OperatorHub capability auditor (all stdlib Python), 4 references on the operator pattern + CRD design + reconcile patterns + tooling landscape, and a \u002Foperator-audit slash command. NOT a generic k8s skill — specifically the Operator pattern.\ncontext: fork\nversion: 2.9.0\nauthor: claude-code-skills\nlicense: MIT\ntags: [kubernetes, operator, crd, controller-runtime, kubebuilder, operator-sdk, metacontroller, kopf, reconcile, devops]\ncompatible_tools: [claude-code, codex-cli, cursor, antigravity, opencode, gemini-cli]\n---\n\n# Kubernetes Operator\n\nBuild operators that reconcile correctly. Most operator bugs are not Kubernetes bugs — they are reconcile-loop bugs: missing finalizers, blocking calls, no requeue on transient errors, status drift, RBAC over-grants. This skill catches them deterministically before they reach a cluster.\n\n## When to use\n\n- Building a new Kubernetes Operator (controller for a CRD)\n- Reviewing an existing operator for capability-level gaps\n- Auditing a CRD spec for status\u002Fconditions\u002Ffinalizer correctness\n- Choosing a framework (controller-runtime \u002F kubebuilder \u002F operator-sdk \u002F metacontroller \u002F KOPF)\n- Designing the API surface of a Custom Resource\n- Hardening RBAC, leader election, or webhook validation\n\n## When NOT to use\n\n- Plain Helm chart packaging → use `helm-chart-builder`\n- Standard kubectl operations \u002F blue-green deploys → use `senior-devops`\n- General k8s security posture → use `cloud-security`\n- \"I want to run a workload\" — that's a Deployment \u002F Job, not an operator\n\n## Core principle: an operator is a reconcile loop, not a script\n\n```\nobserve(actual) → desired = read(spec) → diff(actual, desired) → act → update(status)\n                                                                          ↓\n                                                                   requeue \u002F done\n```\n\nOperators that fail are the ones that:\n1. Treat reconcile as imperative (do this, then this, then this) instead of declarative (make actual=desired, idempotently)\n2. Don't requeue transient failures\n3. Don't use finalizers, leaving orphan resources\n4. Mutate spec instead of status\n5. Don't use the status subresource (status updates trigger spec reconciles → loop)\n6. Block in reconcile (long HTTP calls, locks)\n7. Forget leader election → split-brain on multi-replica deploys\n\nThe 3 tools below catch each of these.\n\n## Quick start\n\n```bash\nSKILL=engineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator\n\n# Validate a CRD design\npython \"$SKILL\u002Fscripts\u002Fcrd_validator.py\" --crd config\u002Fcrd\u002Fmyapp.yaml\n\n# Lint a Go reconcile function\npython \"$SKILL\u002Fscripts\u002Freconcile_lint.py\" --controller controllers\u002Fmyapp_controller.go\n\n# Score against OperatorHub Capability Levels (1-5)\npython \"$SKILL\u002Fscripts\u002Foperator_capability_audit.py\" --operator-dir .\n```\n\n## The 3 Python tools\n\nAll stdlib-only. Run with `--help`.\n\n### `crd_validator.py`\n\nValidates a CRD YAML against operator-pattern best practices.\n\n```bash\npython scripts\u002Fcrd_validator.py --crd config\u002Fcrd\u002Fmyapp.yaml\npython scripts\u002Fcrd_validator.py --crd config\u002Fcrd\u002F --format json\n```\n\n**Checks:**\n- `spec.versions[*].subresources.status` is set (status subresource)\n- `spec.scope` is `Namespaced` (not `Cluster`) unless explicitly justified\n- Singular and listKind defined\n- `spec.versions[*].schema.openAPIV3Schema` has type definitions (no `x-kubernetes-preserve-unknown-fields: true` at top level)\n- A version is marked `served: true` AND `storage: true`\n- Conditions array is in the schema (allows `metav1.Conditions`)\n- Printer columns include `Age` and `Status`\u002F`Phase`\n\n### `reconcile_lint.py`\n\nLints a Go controller reconcile function for anti-patterns.\n\n```bash\npython scripts\u002Freconcile_lint.py --controller controllers\u002Fmyapp_controller.go\n```\n\n**Checks (regex-based heuristics):**\n- Returns are `(ctrl.Result, error)` shape\n- Errors trigger a non-zero requeue (`return ctrl.Result{Requeue: true}, err`)\n- `client.Update()` on the spec object is flagged (controllers should update only status)\n- `time.Sleep` inside reconcile is flagged (use `RequeueAfter`)\n- HTTP calls without context cancellation are flagged\n- Missing `defer` after a finalizer add\n- No `IsConditionTrue` \u002F `SetCondition` calls when conditions present in CRD\n- Reconcile function exceeds 80 lines (extract subroutines)\n\n### `operator_capability_audit.py`\n\nScores an operator against OperatorHub's 5 Capability Levels.\n\n```bash\npython scripts\u002Foperator_capability_audit.py --operator-dir .\n```\n\n**Levels:**\n- **L1 — Basic Install:** CRD defined, controller deploys it\n- **L2 — Seamless Upgrades:** PDBs, conversion webhooks, version skew strategy\n- **L3 — Full Lifecycle:** backups, restores, failure recovery\n- **L4 — Deep Insights:** metrics endpoint, Prometheus rules, alerts\n- **L5 — Auto Pilot:** auto-scaling, auto-tuning, anomaly detection\n\nReports current level + concrete next steps to advance one level.\n\n## Tooling landscape\n\nPick a framework based on language and complexity. See `references\u002Ftooling_landscape.md`.\n\n| Framework | Language | Best for | Maintenance |\n|---|---|---|---|\n| **controller-runtime** | Go | Production-grade, low-level control | Active (sig-api-machinery) |\n| **kubebuilder** | Go | Standard scaffolding, opinionated | Active (Kubernetes SIGs) |\n| **operator-sdk** | Go \u002F Helm \u002F Ansible | OpenShift \u002F mixed-paradigm teams | Active (Red Hat) |\n| **metacontroller** | Any (webhook-based) | Polyglot teams, avoiding Go | Less active |\n| **KOPF** | Python | Python shops, async-first | Active (community) |\n| **java-operator-sdk** | Java | JVM shops | Active (Red Hat \u002F Java SIG) |\n\nDecision rules:\n- New operator + Go shop → kubebuilder\n- New operator + Python shop → KOPF\n- New operator + can't pick a language → metacontroller\n- OpenShift target → operator-sdk\n\n## CRD design principles\n\nSee `references\u002Fcrd_design.md` for full detail. Quick rules:\n\n1. **status is the source of truth for the controller's view of the world.** Spec is what the user wants; status is what the controller observed.\n2. **Use the status subresource.** Without it, status updates re-trigger reconcile (loop).\n3. **Use Conditions.** `Ready`, `Reconciling`, `Degraded`. Each carries a reason and message.\n4. **Add finalizers.** Without finalizers, deletion races the controller and orphans external resources.\n5. **Version your CRD from day 1.** `v1alpha1` → `v1beta1` → `v1`. Plan a conversion webhook.\n6. **Validate via OpenAPI v3 schema.** Don't rely on the controller for validation that should fail at admission.\n7. **Use `additionalPrinterColumns` for `kubectl get`.** Show `Age`, `Phase`, `Ready` at minimum.\n8. **Namespace your CRDs unless they manage cluster-scoped resources.**\n\n## Reconcile loop principles\n\nSee `references\u002Freconcile_loop.md` for full detail. Quick rules:\n\n1. **Idempotent.** Reconciling the same state twice → same result, zero side effects.\n2. **Read once, decide, act.** Don't observe the world repeatedly during reconcile.\n3. **Update status, not spec.** Spec belongs to the user.\n4. **Return errors that requeue.** Use `ctrl.Result{RequeueAfter: ...}` for known transient cases.\n5. **Never block.** No `time.Sleep`. No long HTTP calls without context.\n6. **Use the cache.** Read via the controller's cached client; only escape the cache for a specific reason.\n7. **Leader-elect when running >1 replica.** Otherwise enable single-replica mode.\n8. **Set OwnerReferences.** Cascading deletion is the operator pattern's free gift.\n\n## Workflows\n\n### Workflow 1: Bootstrap a new operator (Go + kubebuilder)\n\n```\n1. Pick a Group\u002FVersion\u002FKind: e.g., apps.example.com\u002Fv1alpha1, kind=MyApp\n2. kubebuilder init --domain example.com --repo github.com\u002Forg\u002Fmyapp-operator\n3. kubebuilder create api --group apps --version v1alpha1 --kind MyApp\n4. Run crd_validator.py on config\u002Fcrd\u002Fbases\u002Fapps.example.com_myapps.yaml\n   → Fix every WARN before writing controller code\n5. Implement the reconcile function (Karpathy principle 2: simplest correct version first)\n6. Run reconcile_lint.py on controllers\u002Fmyapp_controller.go\n7. Run operator_capability_audit.py --operator-dir . — confirm L1\n8. Test in a kind cluster: kubectl apply -f config\u002Fsamples\u002F\n9. Add status conditions; aim for L2 in the same PR\n```\n\n### Workflow 2: Audit an existing operator\n\n```\n1. Run operator_capability_audit.py --operator-dir \u003Cpath>\n2. Run crd_validator.py --crd config\u002Fcrd\u002F\n3. Run reconcile_lint.py --controller controllers\u002F\n4. Triage findings:\n   - FAIL → block release; fix before next deploy\n   - WARN → file an issue; fix in next 30 days\n5. Document current capability level in README; commit\n6. Plan one capability level advancement per quarter\n```\n\n### Workflow 3: Choose a framework\n\n```\n1. Identify primary language constraint (team skill)\n2. Identify deployment target (vanilla k8s vs OpenShift)\n3. Identify operator complexity (single CRD vs multi-CRD vs cluster-wide)\n4. Cross-reference with references\u002Ftooling_landscape.md\n5. Build a 1-week proof-of-concept before committing\n```\n\n## References\n\n- `references\u002Foperator_pattern.md` — what an operator IS, when to use vs alternatives\n- `references\u002Fcrd_design.md` — CRD design principles, versioning, conversion webhooks\n- `references\u002Freconcile_loop.md` — reconcile patterns, error handling, idempotency\n- `references\u002Ftooling_landscape.md` — framework comparison + decision tree\n\n## Slash command\n\n`\u002Foperator-audit` — Run all 3 tools on an operator repo and produce a markdown report.\n\n## Asset templates\n\n- `assets\u002Fcrd_template.yaml` — CRD with status subresource, conditions, finalizer hint, printer columns\n- `assets\u002Freconcile_skeleton.go` — Go controller reconcile function with idempotency, conditions, finalizers, requeue patterns\n\n## Anti-patterns\n\n- **`time.Sleep(30 * time.Second)` inside reconcile** — block other reconciles. Use `RequeueAfter`.\n- **`r.Client.Update(ctx, obj)` to set status** — use `r.Status().Update(ctx, obj)` instead.\n- **No leader election + 2+ replicas** — split-brain.\n- **No finalizer** — external resources orphan on deletion.\n- **CRD without status subresource** — status updates trigger spec reconciles (infinite loop).\n- **Reconcile function > 200 lines** — extract reconcileXxx subroutines per condition.\n- **`x-kubernetes-preserve-unknown-fields: true` on spec root** — defeats validation.\n- **Imperative reconcile** — \"if creating, do A; if updating, do B; if deleting, do C\". Wrong shape. Reconcile = make actual=desired, regardless of how we got here.\n\n## Verifiable success\n\nA team using this skill should achieve:\n\n- 100% of new CRDs pass `crd_validator.py` before merge\n- All reconcile functions pass `reconcile_lint.py` strict mode\n- Operators reach OperatorHub Capability Level 3 (Full Lifecycle) before public release\n- Mean time to fix a reconcile bug: \u003C1 day (no infinite loops in production)\n","# Kubernetes Operator\n\nBuild operators that reconcile correctly. Most operator bugs are not Kubernetes bugs — they are reconcile-loop bugs: missing finalizers, blocking calls, no requeue on transient errors, status drift, RBAC over-grants. This skill catches them deterministically before they reach a cluster.\n\n## When to use\n\n- Building a new Kubernetes Operator (controller for a CRD)\n- Reviewing an existing operator for capability-level gaps\n- Auditing a CRD spec for status\u002Fconditions\u002Ffinalizer correctness\n- Choosing a framework (controller-runtime \u002F kubebuilder \u002F operator-sdk \u002F metacontroller \u002F KOPF)\n- Designing the API surface of a Custom Resource\n- Hardening RBAC, leader election, or webhook validation\n\n## When NOT to use\n\n- Plain Helm chart packaging → use `helm-chart-builder`\n- Standard kubectl operations \u002F blue-green deploys → use `senior-devops`\n- General k8s security posture → use `cloud-security`\n- \"I want to run a workload\" — that's a Deployment \u002F Job, not an operator\n\n## Core principle: an operator is a reconcile loop, not a script\n\n```\nobserve(actual) → desired = read(spec) → diff(actual, desired) → act → update(status)\n                                                                          ↓\n                                                                   requeue \u002F done\n```\n\nOperators that fail are the ones that:\n1. Treat reconcile as imperative (do this, then this, then this) instead of declarative (make actual=desired, idempotently)\n2. Don't requeue transient failures\n3. Don't use finalizers, leaving orphan resources\n4. Mutate spec instead of status\n5. Don't use the status subresource (status updates trigger spec reconciles → loop)\n6. Block in reconcile (long HTTP calls, locks)\n7. Forget leader election → split-brain on multi-replica deploys\n\nThe 3 tools below catch each of these.\n\n## Quick start\n\n```bash\nSKILL=engineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator\n\n# Validate a CRD design\npython \"$SKILL\u002Fscripts\u002Fcrd_validator.py\" --crd config\u002Fcrd\u002Fmyapp.yaml\n\n# Lint a Go reconcile function\npython \"$SKILL\u002Fscripts\u002Freconcile_lint.py\" --controller controllers\u002Fmyapp_controller.go\n\n# Score against OperatorHub Capability Levels (1-5)\npython \"$SKILL\u002Fscripts\u002Foperator_capability_audit.py\" --operator-dir .\n```\n\n## The 3 Python tools\n\nAll stdlib-only. Run with `--help`.\n\n### `crd_validator.py`\n\nValidates a CRD YAML against operator-pattern best practices.\n\n```bash\npython scripts\u002Fcrd_validator.py --crd config\u002Fcrd\u002Fmyapp.yaml\npython scripts\u002Fcrd_validator.py --crd config\u002Fcrd\u002F --format json\n```\n\n**Checks:**\n- `spec.versions[*].subresources.status` is set (status subresource)\n- `spec.scope` is `Namespaced` (not `Cluster`) unless explicitly justified\n- Singular and listKind defined\n- `spec.versions[*].schema.openAPIV3Schema` has type definitions (no `x-kubernetes-preserve-unknown-fields: true` at top level)\n- A version is marked `served: true` AND `storage: true`\n- Conditions array is in the schema (allows `metav1.Conditions`)\n- Printer columns include `Age` and `Status`\u002F`Phase`\n\n### `reconcile_lint.py`\n\nLints a Go controller reconcile function for anti-patterns.\n\n```bash\npython scripts\u002Freconcile_lint.py --controller controllers\u002Fmyapp_controller.go\n```\n\n**Checks (regex-based heuristics):**\n- Returns are `(ctrl.Result, error)` shape\n- Errors trigger a non-zero requeue (`return ctrl.Result{Requeue: true}, err`)\n- `client.Update()` on the spec object is flagged (controllers should update only status)\n- `time.Sleep` inside reconcile is flagged (use `RequeueAfter`)\n- HTTP calls without context cancellation are flagged\n- Missing `defer` after a finalizer add\n- No `IsConditionTrue` \u002F `SetCondition` calls when conditions present in CRD\n- Reconcile function exceeds 80 lines (extract subroutines)\n\n### `operator_capability_audit.py`\n\nScores an operator against OperatorHub's 5 Capability Levels.\n\n```bash\npython scripts\u002Foperator_capability_audit.py --operator-dir .\n```\n\n**Levels:**\n- **L1 — Basic Install:** CRD defined, controller deploys it\n- **L2 — Seamless Upgrades:** PDBs, conversion webhooks, version skew strategy\n- **L3 — Full Lifecycle:** backups, restores, failure recovery\n- **L4 — Deep Insights:** metrics endpoint, Prometheus rules, alerts\n- **L5 — Auto Pilot:** auto-scaling, auto-tuning, anomaly detection\n\nReports current level + concrete next steps to advance one level.\n\n## Tooling landscape\n\nPick a framework based on language and complexity. See `references\u002Ftooling_landscape.md`.\n\n| Framework | Language | Best for | Maintenance |\n|---|---|---|---|\n| **controller-runtime** | Go | Production-grade, low-level control | Active (sig-api-machinery) |\n| **kubebuilder** | Go | Standard scaffolding, opinionated | Active (Kubernetes SIGs) |\n| **operator-sdk** | Go \u002F Helm \u002F Ansible | OpenShift \u002F mixed-paradigm teams | Active (Red Hat) |\n| **metacontroller** | Any (webhook-based) | Polyglot teams, avoiding Go | Less active |\n| **KOPF** | Python | Python shops, async-first | Active (community) |\n| **java-operator-sdk** | Java | JVM shops | Active (Red Hat \u002F Java SIG) |\n\nDecision rules:\n- New operator + Go shop → kubebuilder\n- New operator + Python shop → KOPF\n- New operator + can't pick a language → metacontroller\n- OpenShift target → operator-sdk\n\n## CRD design principles\n\nSee `references\u002Fcrd_design.md` for full detail. Quick rules:\n\n1. **status is the source of truth for the controller's view of the world.** Spec is what the user wants; status is what the controller observed.\n2. **Use the status subresource.** Without it, status updates re-trigger reconcile (loop).\n3. **Use Conditions.** `Ready`, `Reconciling`, `Degraded`. Each carries a reason and message.\n4. **Add finalizers.** Without finalizers, deletion races the controller and orphans external resources.\n5. **Version your CRD from day 1.** `v1alpha1` → `v1beta1` → `v1`. Plan a conversion webhook.\n6. **Validate via OpenAPI v3 schema.** Don't rely on the controller for validation that should fail at admission.\n7. **Use `additionalPrinterColumns` for `kubectl get`.** Show `Age`, `Phase`, `Ready` at minimum.\n8. **Namespace your CRDs unless they manage cluster-scoped resources.**\n\n## Reconcile loop principles\n\nSee `references\u002Freconcile_loop.md` for full detail. Quick rules:\n\n1. **Idempotent.** Reconciling the same state twice → same result, zero side effects.\n2. **Read once, decide, act.** Don't observe the world repeatedly during reconcile.\n3. **Update status, not spec.** Spec belongs to the user.\n4. **Return errors that requeue.** Use `ctrl.Result{RequeueAfter: ...}` for known transient cases.\n5. **Never block.** No `time.Sleep`. No long HTTP calls without context.\n6. **Use the cache.** Read via the controller's cached client; only escape the cache for a specific reason.\n7. **Leader-elect when running >1 replica.** Otherwise enable single-replica mode.\n8. **Set OwnerReferences.** Cascading deletion is the operator pattern's free gift.\n\n## Workflows\n\n### Workflow 1: Bootstrap a new operator (Go + kubebuilder)\n\n```\n1. Pick a Group\u002FVersion\u002FKind: e.g., apps.example.com\u002Fv1alpha1, kind=MyApp\n2. kubebuilder init --domain example.com --repo github.com\u002Forg\u002Fmyapp-operator\n3. kubebuilder create api --group apps --version v1alpha1 --kind MyApp\n4. Run crd_validator.py on config\u002Fcrd\u002Fbases\u002Fapps.example.com_myapps.yaml\n   → Fix every WARN before writing controller code\n5. Implement the reconcile function (Karpathy principle 2: simplest correct version first)\n6. Run reconcile_lint.py on controllers\u002Fmyapp_controller.go\n7. Run operator_capability_audit.py --operator-dir . — confirm L1\n8. Test in a kind cluster: kubectl apply -f config\u002Fsamples\u002F\n9. Add status conditions; aim for L2 in the same PR\n```\n\n### Workflow 2: Audit an existing operator\n\n```\n1. Run operator_capability_audit.py --operator-dir \u003Cpath>\n2. Run crd_validator.py --crd config\u002Fcrd\u002F\n3. Run reconcile_lint.py --controller controllers\u002F\n4. Triage findings:\n   - FAIL → block release; fix before next deploy\n   - WARN → file an issue; fix in next 30 days\n5. Document current capability level in README; commit\n6. Plan one capability level advancement per quarter\n```\n\n### Workflow 3: Choose a framework\n\n```\n1. Identify primary language constraint (team skill)\n2. Identify deployment target (vanilla k8s vs OpenShift)\n3. Identify operator complexity (single CRD vs multi-CRD vs cluster-wide)\n4. Cross-reference with references\u002Ftooling_landscape.md\n5. Build a 1-week proof-of-concept before committing\n```\n\n## References\n\n- `references\u002Foperator_pattern.md` — what an operator IS, when to use vs alternatives\n- `references\u002Fcrd_design.md` — CRD design principles, versioning, conversion webhooks\n- `references\u002Freconcile_loop.md` — reconcile patterns, error handling, idempotency\n- `references\u002Ftooling_landscape.md` — framework comparison + decision tree\n\n## Slash command\n\n`\u002Foperator-audit` — Run all 3 tools on an operator repo and produce a markdown report.\n\n## Asset templates\n\n- `assets\u002Fcrd_template.yaml` — CRD with status subresource, conditions, finalizer hint, printer columns\n- `assets\u002Freconcile_skeleton.go` — Go controller reconcile function with idempotency, conditions, finalizers, requeue patterns\n\n## Anti-patterns\n\n- **`time.Sleep(30 * time.Second)` inside reconcile** — block other reconciles. Use `RequeueAfter`.\n- **`r.Client.Update(ctx, obj)` to set status** — use `r.Status().Update(ctx, obj)` instead.\n- **No leader election + 2+ replicas** — split-brain.\n- **No finalizer** — external resources orphan on deletion.\n- **CRD without status subresource** — status updates trigger spec reconciles (infinite loop).\n- **Reconcile function > 200 lines** — extract reconcileXxx subroutines per condition.\n- **`x-kubernetes-preserve-unknown-fields: true` on spec root** — defeats validation.\n- **Imperative reconcile** — \"if creating, do A; if updating, do B; if deleting, do C\". Wrong shape. Reconcile = make actual=desired, regardless of how we got here.\n\n## Verifiable success\n\nA team using this skill should achieve:\n\n- 100% of new CRDs pass `crd_validator.py` before merge\n- All reconcile functions pass `reconcile_lint.py` strict mode\n- Operators reach OperatorHub Capability Level 3 (Full Lifecycle) before public release\n- Mean time to fix a reconcile bug: \u003C1 day (no infinite loops in production)\n",{"name":5,"tags":57,"author":63,"context":64,"license":15,"version":65,"description":7,"compatible_tools":66},[32,34,44,43,42,58,59,60,61,62],"operator-sdk","metacontroller","kopf","reconcile","devops","claude-code-skills","fork","2.9.0",[67,68,69,70,41,71],"claude-code","codex-cli","cursor","antigravity","gemini-cli","main","681496e0662f4c45c4758fae9d4510ae87311bf2","engineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator","https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills","https:\u002F\u002Fgithub.com\u002Fagency-black","http:\u002F\u002Fwww.dogma.black","Las grandes ideas merecen una ejecución impecable. Construimos plataformas web, aplicaciones y ecosistemas digitales completos. Esta Trinidad es nuestro dogma.","2026-05-29 16:13:55",{"source":8,"skillName":5,"commands":81,"prompt":91,"zipAvailable":92},[82,85,88],{"tool":83,"command":84},"npx","npx skills add agency-black\u002FSkills --skill kubernetes-operator",{"tool":86,"command":87},"bunx","bunx skills add agency-black\u002FSkills --skill kubernetes-operator",{"tool":89,"command":90},"pnpm","pnpm dlx skills add agency-black\u002FSkills --skill kubernetes-operator","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fengineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator\u002FSKILL.md",true,[94,100,106,112,116,120,124,128,132],{"path":95,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":98,"sourceHtmlUrl":99},"assets\u002Fcrd_template.yaml","ASSET","资产文件",2620,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fengineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator\u002Fassets\u002Fcrd_template.yaml",{"path":101,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":104,"sourceHtmlUrl":105},"assets\u002Freconcile_skeleton.go","SCRIPT","脚本",4052,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fengineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator\u002Fassets\u002Freconcile_skeleton.go",{"path":107,"resourceType":108,"resourceTypeDesc":109,"sizeBytes":110,"sourceHtmlUrl":111},"references\u002Fcrd_design.md","REFERENCE","参考文档",6998,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fengineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator\u002Freferences\u002Fcrd_design.md",{"path":113,"resourceType":108,"resourceTypeDesc":109,"sizeBytes":114,"sourceHtmlUrl":115},"references\u002Foperator_pattern.md",7157,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fengineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator\u002Freferences\u002Foperator_pattern.md",{"path":117,"resourceType":108,"resourceTypeDesc":109,"sizeBytes":118,"sourceHtmlUrl":119},"references\u002Freconcile_loop.md",7275,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fengineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator\u002Freferences\u002Freconcile_loop.md",{"path":121,"resourceType":108,"resourceTypeDesc":109,"sizeBytes":122,"sourceHtmlUrl":123},"references\u002Ftooling_landscape.md",7642,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fengineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator\u002Freferences\u002Ftooling_landscape.md",{"path":125,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":126,"sourceHtmlUrl":127},"scripts\u002Fcrd_validator.py",5939,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fengineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator\u002Fscripts\u002Fcrd_validator.py",{"path":129,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":130,"sourceHtmlUrl":131},"scripts\u002Foperator_capability_audit.py",5916,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fengineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator\u002Fscripts\u002Foperator_capability_audit.py",{"path":133,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":134,"sourceHtmlUrl":135},"scripts\u002Freconcile_lint.py",6495,"https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fengineering\u002Fkubernetes-operator\u002Fskills\u002Fkubernetes-operator\u002Fscripts\u002Freconcile_lint.py",[137,164,191,221,246,270],{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":52},"01M71JZVZ0TVW7Z5DQBRWSBG8A","zarr-python","Chunked N-D arrays for cloud storage (Zarr-Python 3). Compressed arrays, parallel I\u002FO, S3\u002FGCS via fsspec, NumPy\u002FDask\u002FXarray compatible, for large-scale scientific computing pipelines.","https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fzarr-python\u002FSKILL.md",[],[144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163],"zarr python","python","zarr","arrays","Cloud Storage","remote","workflows","scientific","read","write","edit","parallel","dask","for","s3fs","use","numpy","s3","scientific computing","scale",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":168,"sourceHtmlUrl":169,"categories":170,"keywords":174,"publishedAt":52},"01M71JYXC5VAEJT8KXN5GRK32S","xvary-stock-research","Thesis-driven equity analysis from public SEC EDGAR and market data; \u002Fanalyze, \u002Fscore, \u002Fcompare workflows with bundled Python tools (Claude Code, Cursor, Codex).","https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fxvary-stock-research\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fxvary-stock-research\u002FSKILL.md",[171],{"categoryNo":172,"categoryName":173,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",[175,176,177,178,179,180,181,145,182,150,183,50,184,185,186,187,188,189,69,190],"xvary","stock","research","xvary stock research","sec edgar","community","equity","thesis","analysis","Market","compare","market data","analyze","with","codex","2026",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":195,"licenseFileUrl":196,"sourceHtmlUrl":197,"categories":198,"keywords":205,"publishedAt":52},"01M71JVSDPDQ5040YBN6J1ASKY","webapp-testing","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fwebapp-testing\u002FSKILL.md",[199,202],{"categoryNo":200,"categoryName":201,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":203,"categoryName":204,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[206,207,208,157,209,210,211,212,213,214,215,188,216,217,218,219,220],"webapp","testing","webapp testing","applications","local","frontend","debugging","toolkit","logs","browser","playwright","web","behavior","ui","screenshots",{"skillNo":222,"name":223,"nameZh":6,"description":224,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":195,"licenseFileUrl":225,"sourceHtmlUrl":226,"categories":227,"keywords":229,"publishedAt":52},"01M71JV64CW7R6FYYK9JWWGW0X","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fweb-artifacts-builder\u002FSKILL.md",[228],{"categoryNo":203,"categoryName":204,"taxonomyType":21,"taxonomyTypeDesc":22},[230,231,232,217,233,234,235,157,236,237,211,238,159,239,240,241,242,243,244,245],"builder","artifacts builder","artifacts","web artifacts builder","single-file","css","Tailwind","ui components","single","file","components","react","multi","state","routing","state management",{"skillNo":247,"name":248,"nameZh":6,"description":249,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":250,"categories":251,"keywords":253,"publishedAt":52},"01M71JS4X2FRY41DE84DEP06MN","vercel-react-view-transitions","Guide for implementing smooth, native-feeling animations using React's View Transition API (`\u003CViewTransition>` component, `addTransitionType`, and CSS view transition pseudo-elements). Use this skill whenever the user wants to add page transitions, animate route changes, create shared element animations, animate enter\u002Fexit of components, animate list reorder, implement directional (forward\u002Fback) navigation animations, or integrate view transitions in Next.js. Also use when the user mentions view transitions, `startViewTransition`, `ViewTransition`, transition types, or asks about animating between UI states in React without third-party animation libraries.","https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fvercel-react-view-transitions\u002FSKILL.md",[252],{"categoryNo":203,"categoryName":204,"taxonomyType":21,"taxonomyTypeDesc":22},[241,254,255,256,257,258,259,260,261,235,262,263,264,265,36,240,266,267,268,269],"vercel react view transitions","view","react view transitions","vercel","transitions","shared","back","Animation","types","states","element","implementing","api","route","create","libraries",{"skillNo":271,"name":272,"nameZh":6,"description":273,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":274,"categories":275,"keywords":277,"publishedAt":52},"01M71JS1WZ1J4F9YVC2203JBJW","vercel-react-native-skills","React Native and Expo best practices for building performant mobile apps. Use when building React Native components, optimizing list performance, implementing animations, or working with native modules. Triggers on tasks involving React Native, Expo, mobile performance, or native platform APIs.","https:\u002F\u002Fgithub.com\u002Fagency-black\u002FSkills\u002Fblob\u002Fmain\u002Fvercel-react-native-skills\u002FSKILL.md",[276],{"categoryNo":203,"categoryName":204,"taxonomyType":21,"taxonomyTypeDesc":22},[257,278,241,279,280,281,282,283,284,157,285,265,286,159,287,288,36,289,290,240],"vercel react native skills","react native","native","react native skills","modules","platform","animations","performance","triggers","react native components","apps","best practices","tasks"]