Claude Skills Reference
Reusable procedural skills extracted from CLAUDE.md. Each skill has a canonical name (kebab-case), trigger conditions, ordered steps, and a verification check. Invoke a skill by name: "run the cargo-quality skill" or "do a verify-crd-sync".
verify-crd-sync
When to use:
- Before investigating reconciliation loops or infinite loops
- Before debugging "field not appearing in kubectl output" issues
- After ANY modification to structs in
src/crd.rs - When status patches succeed but data doesn't persist
- When user reports unexpected controller behavior
Steps:
# 1. Check deployed CRD schema in cluster
kubectl get crd <crd-name>.bindy.firestoned.io -o yaml | grep -A 20 "<field-name>:"
# 2. Check Rust struct definition
rg -A 10 "pub struct <StructName>" src/crd.rs
# 3. If mismatch detected, regenerate CRDs
cargo run --bin crdgen
# 4. Apply updated CRDs (use replace --force to avoid annotation size limits)
kubectl replace --force -f deploy/operator/crds/<crd-name>.crd.yaml
Verification: Field appears in kubectl get output after patch; no infinite reconciliation loop.
regen-crds
When to use:
- After ANY edit to Rust types in
src/crd.rs - Before deploying CRD changes to a cluster
Steps:
# 1. Regenerate all CRD YAML files from Rust types
cargo run --bin crdgen
# 2. Verify generated YAMLs
for file in deploy/operator/crds/*.crd.yaml; do
echo "Checking $file"
kubectl apply --dry-run=client -f "$file"
done
# 3. Update examples to match new schema (see validate-examples skill)
# 4. Deploy
kubectl replace --force -f deploy/operator/crds/
# Or for first install:
kubectl create -f deploy/operator/crds/
Verification: kubectl apply --dry-run=client -f deploy/operator/crds/ succeeds for all files.
regen-api-docs
When to use:
- After all CRD changes, example updates, and validations are complete (run this LAST)
- Before any documentation release
Steps:
# Regenerate API reference from CRD types
cargo run --bin crddoc > docs/src/reference/api.md
Verification: docs/src/reference/api.md reflects the current CRD schema. Run make docs to confirm the full docs build succeeds.
cargo-quality
When to use:
- After adding or modifying ANY
.rsfile - Before committing any Rust code changes
- At the end of EVERY task involving Rust code (NON-NEGOTIABLE)
Steps:
# 0. Ensure cargo is in PATH
source ~/.zshrc
# 1. Format
cargo fmt
# 2. Lint with strict warnings (fix ALL warnings)
cargo clippy --all-targets --all-features -- -D warnings -W clippy::pedantic -A clippy::module_name_repetitions
# 3. Test (ALL tests must pass)
cargo test
# 4. Security audit (optional, if installed)
cargo audit 2>/dev/null || true
Verification: All three commands exit with code 0. No warnings, no test failures.
tdd-workflow
When to use:
- Adding any new feature or function
- Fixing a bug
- Refactoring existing code
Steps:
RED — Write failing tests first (before any implementation):
# Edit src/<module>_tests.rs — add test(s) that define expected behavior
cargo test <test_name> # Must FAIL at this point
GREEN — Implement minimum code to pass tests:
# Edit src/<module>.rs — write simplest code that makes tests pass
cargo test <test_name> # Must PASS now
REFACTOR — Improve while keeping tests green:
# Extract constants, add docs, improve error handling
cargo test # Must still PASS
cargo clippy --all-targets --all-features -- -D warnings -W clippy::pedantic -A clippy::module_name_repetitions
Test file pattern:
- Source:
src/foo.rs→ declare#[cfg(test)] mod foo_tests;at the bottom - Tests:
src/foo_tests.rs→ wrap in#[cfg(test)] mod tests { use super::super::*; ... }
Verification: All tests pass, clippy is clean, test covers success path + error paths + edge cases.
update-changelog
When to use:
- After ANY code modification (mandatory for auditing in a regulated environment)
Steps:
Open .claude/CHANGELOG.md and prepend an entry in this exact format:
## [YYYY-MM-DD HH:MM] - Brief Title
**Author:** <Name of requester or approver>
### Changed
- `path/to/file.rs`: Description of the change
### Why
Brief explanation of the business or technical reason.
### Impact
- [ ] Breaking change
- [ ] Requires cluster rollout
- [ ] Config change only
- [ ] Documentation only
Verification: Entry has **Author:** line (MANDATORY — no exceptions), timestamp, and at least one ### Changed item.
update-docs
When to use:
- After any code change in
src/ - After CRD changes, API changes, configuration changes, or new features
Steps:
- Identify what changed (feature, CRD field, behavior, error condition).
- Update
.claude/CHANGELOG.md(seeupdate-changelogskill). - Update affected pages in
docs/src/:- User guides, quickstart guides, configuration references, troubleshooting guides
- Update
examples/*.yamlto reflect schema or behavior changes. - Update architecture diagrams if structure changed (Mermaid in
docs/src/architecture/). - If CRDs changed: run
regen-api-docsskill (LAST step). - If README getting-started or features changed: update
README.md. - Run
build-docsskill to confirm no broken references.
Verification checklist:
- [ ]
.claude/CHANGELOG.mdupdated with author - [ ] All affected
docs/src/pages updated - [ ] All YAML examples validate:
kubectl apply --dry-run=client -f examples/ - [ ] API docs regenerated if CRDs changed
- [ ] Architecture diagrams match current implementation
- [ ]
make docssucceeds
build-docs
When to use:
- After any documentation change
- Before any documentation release
- To verify docs are not broken
Steps:
# Build all documentation components in the correct order
make docs
What make docs does:
- Installs docs dependencies via Poetry:
cd docs && poetry install - Generates CRD API reference:
cargo run --bin crddoc > docs/src/reference/api.md - Builds rustdoc:
cargo doc --no-deps --all-features - Builds the MkDocs site:
cd docs && poetry run mkdocs build - Copies rustdoc into
docs/site/rustdoc/and creates an index redirect
Verification: make docs exits 0 with no errors. Output site is viewable at docs/site/index.html.
docs-sync-check
Verify that documentation is in sync with the code changes on the current branch,
with special attention to new features and breaking changes. Where
update-docs is the procedure to update docs, this skill is the gate that
detects drift — run it to prove nothing user-facing shipped undocumented.
When to use:
- After implementing a new feature, or any change to CRDs, config/env vars, RBAC, admission policies, defaults, or validation
- Whenever the latest change alters user-facing behavior (a new flag, a new default-deny, a renamed field, a stricter validation)
- As a final gate before
pre-commit-checklist/ before telling the user a task is complete
Steps:
-
Scope the change. Enumerate exactly what changed on this branch:
BASE=$(git merge-base HEAD main) git diff --stat "$BASE"..HEAD # committed changes git status --porcelain && git diff --stat # uncommitted working tree -
Classify each changed path → the docs it obligates. Any row that matches MUST have a corresponding doc update in the same change:
| Changed path / signal | Required documentation | |---|---| |
src/crd.rs(fields/structs) |regen-api-docs(docs/src/reference/api.md),examples/*.yaml, config reference indocs/src/| | NewBINDY_*/ other env var |docs/src/config/deployment reference +deploy/operator/deployment.yamlif applicable | |src/reconcilers/behavior |docs/src/architecture/flow diagrams, user guide, troubleshooting | | New CRD |add-new-crdskill (guide + api docs + examples) | |deploy/admission-policies/NN-*.yaml(new) |deploy/admission-policies/README.mdtable + regenerate combined file:make admission-policies-yaml| |deploy/**/rbac/,src/bootstrap.rs|deploy/operator/rbac/README.md, RBAC guide, keep bootstrap↔YAML in sync (see.claude/CLAUDE.md) | |src/scout.rsbehavior |docs/src/guide/scout.md,docs/src/installation/scout.md| | New public module / feature |docs/src/features/or relevant guide +README.mdfeatures section | -
Flag BREAKING changes explicitly. Treat as breaking (each needs the full breaking-change treatment below): a removed/renamed CRD field; a new required field; a changed default; validation that now rejects previously-valid input (e.g. a new name-prefix requirement); a new default-deny gate; a removed/renamed env var or flag; an RBAC scope reduction; a changed API/route/annotation contract. Quick signals:
# Deletions/renames in CRD types and public signatures git diff "$BASE"..HEAD -- src/crd.rs | rg '^-\s*pub ' # New rejections / default-deny / required prefixes introduced git diff "$BASE"..HEAD -- src/ | rg -i '^\+.*(reject|deny|must (start|be)|required|Err\()'For every breaking change require ALL of:
.claude/CHANGELOG.md:- [x] Breaking changechecked (seeupdate-changelog).- A migration note for users in
docs/src/operations/migration-guide.md(what breaks, how to detect, the exact remediation — e.g. annotate the resource, rename the secret). - Updated
examples/*.yamlso shipped examples still validate under the new rule.
-
Confirm NEW FEATURES are documented. For each new feature/flag/policy: a user-facing doc page or guide section, a
README.mdmention if it changes getting-started/features, at least oneexample, and a CHANGELOG entry. -
Greppable-sync checks (each new symbol must appear in docs):
# Every new BINDY_* env var must be documented somewhere under docs/ for v in $(git diff "$BASE"..HEAD -- src/ | rg -o 'BINDY_[A-Z_]+' | sort -u); do rg -q "$v" docs/ .claude/CHANGELOG.md || echo "UNDOCUMENTED env var: $v" done # Every new admission policy must be in the README table for p in $(git diff --name-only --diff-filter=A "$BASE"..HEAD -- 'deploy/admission-policies/[0-9][0-9]-*.yaml'); do name=$(rg -m1 '^\s*name:\s*(\S+)' "$p" -or '$1'); rg -q "$name" deploy/admission-policies/README.md || echo "UNDOCUMENTED policy: $p" done -
Build. Run the
build-docsskill (make docs). It MUST exit 0 and MUST NOT introduce any newWARNING - ... not foundbroken-link lines versus the pre-change baseline. -
Emit a drift report. One line per changed path:
✅ doc updated,⚠️ breaking — migration note added, or❌ MISSING <what>. Do not report the task complete while any❌remains; if a change genuinely needs no docs, say so explicitly with a one-line justification.
Verification:
- [ ] Every changed path maps to an updated doc, or a stated "no doc needed" reason.
- [ ] Every breaking change has: CHANGELOG breaking flag + a
migration-guide.mdentry + validated examples. - [ ] Every new
BINDY_*env var, admission policy, and CRD field is greppable indocs/. - [ ]
regen-api-docswas run ifsrc/crd.rschanged. - [ ]
make docsexits 0 with no new broken-link warnings.
get-multiarch-digest
When to use:
- Before pinning a Docker base image digest in any Dockerfile
- When updating base image versions
Steps:
# Get the multi-arch manifest list digest (NOT platform-specific)
docker buildx imagetools inspect <image>:<tag> --raw | sha256sum | awk '{print "sha256:"$1}'
# Examples:
docker buildx imagetools inspect debian:13-slim --raw | sha256sum | awk '{print "sha256:"$1}'
docker buildx imagetools inspect rust:1.94.0 --raw | sha256sum | awk '{print "sha256:"$1}'
docker buildx imagetools inspect gcr.io/distroless/cc-debian13:nonroot --raw | sha256sum | awk '{print "sha256:"$1}'
Use the digest in Dockerfiles as:
# NOTE: This digest points to the multi-arch manifest list (supports both AMD64 and ARM64)
FROM debian:13-slim@sha256:<digest> AS builder
Update ALL Dockerfiles that use the same base image:
docker/Dockerfiledocker/Dockerfile.chainguarddocker/Dockerfile.chefdocker/Dockerfile.fastdocker/Dockerfile.local(usually no digest)
Verification:
docker buildx imagetools inspect <image>@<digest>
# Output must show BOTH: Platform: linux/amd64 AND Platform: linux/arm64
validate-examples
When to use:
- After any CRD schema change
- Before committing changes to
examples/ - As part of the
pre-commit-checklist
Steps:
# Validate all example YAML files
kubectl apply --dry-run=client -f examples/
# Or validate individually
for file in examples/*.yaml; do
echo "Validating $file"
kubectl apply --dry-run=client -f "$file"
done
Verification: All files pass dry-run with no errors. No unknown field or required field missing errors.
add-new-crd
When to use:
- When adding a new Custom Resource Definition to the operator
Steps:
- Add the new
CustomResourcestruct tosrc/crd.rs:#[derive(CustomResource, Clone, Debug, Serialize, Deserialize, JsonSchema)] #[kube( group = "bindy.firestoned.io", version = "v1beta1", kind = "MyNewResource", namespaced )] #[serde(rename_all = "camelCase")] pub struct MyNewResourceSpec { pub field_name: String, } - Register it in
src/bin/crdgen.rs:generate_crd::<MyNewResource>("mynewresources.crd.yaml", output_dir)?; - Run
regen-crdsskill. - Add examples to
examples/. - Run
validate-examplesskill. - Add documentation in
docs/src/. - Run
regen-api-docsskill (LAST). - Run
cargo-qualityskill. - Run
update-changelogskill.
Verification: kubectl apply --dry-run=client -f deploy/operator/crds/mynewresources.crd.yaml succeeds; API docs include the new resource.
pre-commit-checklist
When to use:
- Before committing any change (mandatory gate)
Checklist:
If ANY .rs file was modified:
- [ ] Tests updated/added/deleted to match changes (TDD — see
tdd-workflow) - [ ] All new public functions have tests
- [ ] All deleted functions have tests removed
- [ ]
cargo fmtpasses - [ ]
cargo clippy --all-targets --all-features -- -D warningspasses (fix ALL warnings) - [ ]
cargo testpasses (ALL tests green) - [ ] Rustdoc comments on all public items, accurate to actual behavior
- [ ]
docs/src/updated for user-facing changes
If src/crd.rs was modified:
- [ ]
cargo run --bin crdgenrun - [ ]
examples/*.yamlupdated to match new schema - [ ]
docs/src/documentation updated - [ ]
kubectl apply --dry-run=client -f examples/passes - [ ]
cargo run --bin crddoc > docs/src/reference/api.mdrun (LAST)
If src/reconcilers/ was modified:
- [ ] Reconciliation flow diagrams updated in
docs/src/architecture/ - [ ] New behaviors documented in user guides
- [ ] Troubleshooting guides updated for new error conditions
Always:
- [ ]
.claude/CHANGELOG.mdupdated with Author: line (MANDATORY) - [ ]
make docssucceeds - [ ] All YAML examples validate:
kubectl apply --dry-run=client -f examples/ - [ ]
kubectl apply --dry-run=client -f deploy/operator/crds/succeeds - [ ] No secrets, tokens, credentials, internal hostnames, or IP addresses committed
- [ ] No
.unwrap()in production code
Verification: Every checked box above passes. A task is NOT complete until the full checklist is green.
upgrade-bindcar
When to use:
- When the user asks to upgrade bindcar to a new version (e.g., "upgrade to bindcar v0.7.0")
Steps:
Given NEW_VERSION (e.g., 0.7.0) and NEW_TAG (e.g., v0.7.0):
# 1. Update Cargo dependency
# In Cargo.toml: bindcar = "<NEW_VERSION>"
sed -i '' 's/^bindcar = ".*"/bindcar = "<NEW_VERSION>"/' Cargo.toml
# 2. Resolve the new version in Cargo.lock
cargo update bindcar
Then update ALL of the following files (use rg to verify nothing is missed):
| File | What to change |
|------|----------------|
| Cargo.toml | bindcar = "<NEW_VERSION>" |
| src/constants.rs | DEFAULT_BINDCAR_IMAGE → ghcr.io/firestoned/bindcar:<NEW_TAG> |
| src/crd.rs | rustdoc example /// Example: "ghcr.io/firestoned/bindcar:<NEW_TAG>" |
| src/bootstrap.rs | Any hardcoded image references (check with rg) |
| examples/*.yaml | All image: "ghcr.io/firestoned/bindcar:*" lines |
| deploy/operator/crds/*.crd.yaml | All Example: "ghcr.io/firestoned/bindcar:*" lines |
| tests/integration_test.sh | All image: "ghcr.io/firestoned/bindcar:*" lines |
| docs/src/**/*.md | Any ghcr.io/firestoned/bindcar:v* references (skip placeholder examples using other registries) |
# Verify no old version strings remain (replace OLD with the prior version tag)
rg 'firestoned/bindcar:v' . --glob '!target/' --glob '!.claude/CHANGELOG.md'
-
Check for API breaking changes between old and new bindcar versions:
- Read
/Users/erick/dev/bindcar/src/lib.rsand compare exported types against what bindy imports - If types/fields were removed or renamed, update all usages in
src/
- Read
-
Run
cargo-qualityskill (compile + clippy + tests must all pass). -
Run
update-changelogskill.
Verification: rg 'firestoned/bindcar:v' . --glob '!target/' --glob '!.claude/CHANGELOG.md' shows only the new tag. cargo test passes.
Next.js App Router Expert
Development
A skill that turns Claude into a Next.js App Router expert.
README Generator
Development
Creates professional and comprehensive README.md files for your projects.
API Documentation Writer
Development
Generates comprehensive API documentation in OpenAPI/Swagger format.