| name | bindy |
| description | 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"*. Use when this capability is needed. |
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:
kubectl get crd <crd-name>.bindy.firestoned.io -o yaml | grep -A 20 "<field-name>:"
rg -A 10 "pub struct <StructName>" src/crd.rs
cargo run --bin crdgen
kubectl replace --force -f deploy/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:
cargo run --bin crdgen
for file in deploy/crds/*.crd.yaml; do
echo "Checking $file"
kubectl apply --dry-run=client -f "$file"
done
kubectl replace --force -f deploy/crds/
kubectl create -f deploy/crds/
Verification: kubectl apply --dry-run=client -f deploy/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:
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
.rs file
- Before committing any Rust code changes
- At the end of EVERY task involving Rust code (NON-NEGOTIABLE)
Steps:
source ~/.zshrc
cargo fmt
cargo clippy --all-targets --all-features -- -D warnings -W clippy::pedantic -A clippy::module_name_repetitions
cargo test
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):
cargo test <test_name>
GREEN — Implement minimum code to pass tests:
cargo test <test_name>
REFACTOR — Improve while keeping tests green:
cargo test
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 (see update-changelog skill).
- Update affected pages in
docs/src/:
- User guides, quickstart guides, configuration references, troubleshooting guides
- Update
examples/*.yaml to reflect schema or behavior changes.
- Update architecture diagrams if structure changed (Mermaid in
docs/src/architecture/).
- If CRDs changed: run
regen-api-docs skill (LAST step).
- If README getting-started or features changed: update
README.md.
- Run
build-docs skill to confirm no broken references.
Verification checklist:
build-docs
When to use:
- After any documentation change
- Before any documentation release
- To verify docs are not broken
Steps:
make docs
What make docs does:
- Generates CRD API reference:
cargo run --bin crddoc > docs/src/reference/api.md
- Builds rustdoc:
cargo doc --no-deps --all-features
- Installs mermaid assets and builds mdBook:
cd docs && mdbook-mermaid install && mdbook build
- Copies rustdoc into output and creates index redirects
Verification: make docs exits 0 with no errors. Output site is viewable at docs/book/.
get-multiarch-digest
When to use:
- Before pinning a Docker base image digest in any Dockerfile
- When updating base image versions
Steps:
docker buildx imagetools inspect <image>:<tag> --raw | sha256sum | awk '{print "sha256:"$1}'
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/Dockerfile
docker/Dockerfile.chainguard
docker/Dockerfile.chef
docker/Dockerfile.fast
docker/Dockerfile.local (usually no digest)
Verification:
docker buildx imagetools inspect <image>@<digest>
validate-examples
When to use:
- After any CRD schema change
- Before committing changes to
examples/
- As part of the
pre-commit-checklist
Steps:
kubectl apply --dry-run=client -f examples/
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
CustomResource struct to src/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-crds skill.
- Add examples to
examples/.
- Run
validate-examples skill.
- Add documentation in
docs/src/.
- Run
regen-api-docs skill (LAST).
- Run
cargo-quality skill.
- Run
update-changelog skill.
Verification: kubectl apply --dry-run=client -f deploy/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:
If src/crd.rs was modified:
If src/reconcilers/ was modified:
Always:
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):
sed -i '' 's/^bindcar = ".*"/bindcar = "<NEW_VERSION>"/' Cargo.toml
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) |
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.rs and compare exported types against what bindy imports
- If types/fields were removed or renamed, update all usages in
src/
-
Run cargo-quality skill (compile + clippy + tests must all pass).
-
Run update-changelog skill.
Verification: rg 'firestoned/bindcar:v' . --glob '!target/' --glob '!.claude/CHANGELOG.md' shows only the new tag. cargo test passes.
Source: firestoned/bindy — distributed by TomeVault.