Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Design, build, and operate Kubernetes operators. Use when extending Kubernetes with a custom controller, choosing a framework, designing CRDs, implementing reconciliation loops, or auditing an operator for anti-patterns.
.claude/skills/borghei-kubernetes-operator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 21% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -24% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 18% | 0% |
| case-20 | ✓→✓ | = Same ✓ | 132% | 0% |
End-to-end Kubernetes operator design and construction. Covers the operator pattern (control loops for stateful workloads), CRD design (schema, validation, conversion, status), the reconciliation loop (idempotency, convergence, level- vs edge-triggered), framework selection (controller-runtime / Kubebuilder / operator-SDK / metacontroller), and operational concerns (finalizers, leader election, RBAC scoping, status subresource, observability). Targets Go-based operators (the dominant ecosystem) with notes on alternatives (KOPF, JOSDK, kube-rs).
| Situation | Skill applies | |-----------|---------------| | Building a new operator for an internal platform primitive | Yes — start with the operator pattern decision | | Auditing an existing operator for production-readiness | Yes — use anti-patterns + scripts/reconciliation_audit.py | | Designing CRDs for a custom resource | Yes — use CRD design + scripts/crd_validator.py | | Deciding "operator vs Helm chart vs plain manifests" | Yes — use the decision matrix | | Scaffolding a new operator project | Yes — scripts/operator_scaffold.py | | Debugging a controller that "isn't reconciling" | Yes — use reconciliation troubleshooting | | Just running someone else's operator (Postgres, Kafka, etc.) | Partially — useful for understanding what it does and how to monitor it |
Before scaffolding or auditing, confirm these inputs. If any is unknown or vague, ASK — do not assume:
operator_scaffold.py vs crd_validator.py vs reconciliation_audit.py)--name/--group/--kind); for validation/audit: the CRD YAML or controller path (the input the scripts read)Stop rule: ask only the 2-3 that most change the output. If the user says "just draft it," proceed and list your assumptions at the top of the artifact.
| Tool | Purpose | Command | |------|---------|---------| | crd_validator.py | Validate CRD YAML against design best practices (preserve-unknown, missing descriptions/enums/printer-columns, status subresource, cluster-scope) | python3 scripts/crd_validator.py --schema my-crd.yaml --format markdown | | operator_scaffold.py | Generate a production-ready operator project skeleton with stricter RBAC, observability, and finalizer scaffolding | python3 scripts/operator_scaffold.py --name db-operator --group example.com --kind Database | | reconciliation_audit.py | Audit Go controller source + CRDs for static-detectable anti-patterns (missing finalizers, no leader election, tight loops, no ownerRef, wide RBAC) | python3 scripts/reconciliation_audit.py --controller-path ./internal/controllers --crd ./config/crd/bases/*.yaml |
All scripts: stdlib only, argparse CLI, JSON or markdown output.
Load the reference that matches the task — keep this file lean and pull detail on demand:
Covers: operator pattern decisions; CRD design (schema/validation/versioning/conversion/subresources); idempotent reconciliation loops; Go controller-runtime / Kubebuilder / operator-SDK patterns; finalizers, leader election, RBAC scoping, observability; anti-pattern auditing. Primary target is Go operators, with notes on KOPF (Python), JOSDK (Java), kube-rs (Rust).
Does NOT cover: operating third-party community operators beyond understanding/monitoring them; cloud-provider-specific resource provisioning (see Crossplane); general Kubernetes cluster administration.
| Skill | Integration | |-------|------------| | engineering/chaos-engineering | Chaos-test operators (kill the controller, partition from API server) | | engineering/observability-designer | Wire metrics + logging for operators | | engineering/incident-commander | Operators amplify blast radius; incident response matters more | | engineering/feature-flags-architect | Operators with spec.feature.<x>.enabled fields effectively become flag systems; consider the trade-off |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | pass→pass | 8,880 | 10,045 | +13% | 1 | 1 | 0% | 1,418 | 3,289 | +132% | 0 | 0 | — |
case-01 | fail→pass | 28,794 | 29,753 | +3% | 1 | 1 | 0% | 5,321 | 6,426 | +21% | 0 | 0 | — |
case-02 | pass→pass | 21,514 | 33,283 | +55% | 1 | 1 | 0% | 2,524 | 5,909 | +134% | 0 | 0 | — |
case-03 | pass→pass | 10,909 | 11,426 | +5% | 1 | 1 | 0% | 2,106 | 3,847 | +83% | 0 | 0 | — |
case-04 | pass→pass | 11,750 | 10,567 | -10% | 1 | 1 | 0% | 2,268 | 3,562 | +57% | 0 | 0 | — |
case-05 | pass→pass | 8,239 | 5,873 | -29% | 1 | 1 | 0% | 1,515 | 2,630 | +74% | 0 | 0 | — |
case-06 | pass→pass | 12,716 | 11,039 | -13% | 1 | 1 | 0% | 1,999 | 3,289 | +65% | 0 | 0 | — |
case-07 | fail→pass | 16,745 | 2,551 | -85% | 1 | 1 | 0% | 2,686 | 2,032 | -24% | 0 | 0 | — |
case-08 | fail→pass | 10,489 | 2,471 | -76% | 1 | 1 | 0% | 1,813 | 1,982 | +9% | 0 | 0 | — |
case-09 | fail→pass | 10,387 | 2,559 | -75% | 1 | 1 | 0% | 1,719 | 2,033 | +18% | 0 | 0 | — |
case-10 | pass→pass | 13,459 | 12,954 | -4% | 1 | 1 | 0% | 2,150 | 3,770 | +75% | 0 | 0 | — |
case-11 | pass→pass | 5,128 | 5,462 | +7% | 1 | 1 | 0% | 897 | 2,490 | +178% | 0 | 0 | — |
case-12 | pass→pass | 4,771 | 6,445 | +35% | 1 | 1 | 0% | 813 | 2,766 | +240% | 0 | 0 | — |
case-13 | pass→pass | 11,624 | 13,115 | +13% | 1 | 1 | 0% | 1,714 | 3,458 | +102% | 0 | 0 | — |
case-14 | pass→pass | 14,418 | 12,713 | -12% | 1 | 1 | 0% | 2,112 | 3,510 | +66% | 0 | 0 | — |
case-15 | pass→pass | 13,936 | 12,551 | -10% | 1 | 1 | 0% | 2,406 | 3,782 | +57% | 0 | 0 | — |
case-16 | pass→pass | 14,610 | 14,884 | +2% | 1 | 1 | 0% | 2,339 | 4,179 | +79% | 0 | 0 | — |
case-17 | pass→pass | 11,286 | 10,418 | -8% | 1 | 1 | 0% | 1,677 | 3,091 | +84% | 0 | 0 | — |
case-18 | pass→pass | 13,034 | 10,908 | -16% | 1 | 1 | 0% | 2,369 | 3,532 | +49% | 0 | 0 | — |
case-19 | pass→pass | 13,431 | 13,861 | +3% | 1 | 1 | 0% | 2,208 | 3,961 | +79% | 0 | 0 | — |
case-21 | pass→pass | 5,240 | 5,285 | +1% | 1 | 1 | 0% | 900 | 2,560 | +184% | 0 | 0 | — |
case-22 | pass→pass | 5,555 | 5,763 | +4% | 1 | 1 | 0% | 868 | 2,614 | +201% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.