- Use official CircleCI orbs for common tasks: circleci/node, circleci/aws-cli, circleci/docker — avoid reinventing standard CI steps
- Pin orbs to exact versions (e.g., circleci/node@5.2.0) — never use volatile tags or @latest
- Define reusable commands for repeated step sequences and reusable executors for shared environments
- Parameterize commands and jobs with typed parameters (string, boolean, enum) for flexible reuse
- Use private orbs for organization-specific patterns shared across multiple repositories
- Use official orbs for common tools: circleci/node for Node.js setup + caching, circleci/aws-cli for AWS auth, circleci/docker for image building
- Pin orbs to exact semantic versions: `circleci/node@5.2.0` — minor/patch version floats introduce unpredictable changes
- Define reusable commands for repeated sequences: checkout + cache-restore + install + cache-save as a single `setup` command
- Define reusable executors to standardize runtime environments: Docker image, resource_class, and env vars in one definition
- Parameterize commands with typed inputs: `parameters: version: { type: string, default: "18" }` — enables callers to customize behavior
- Use job parameter pass-through: when a job uses a command or executor, expose those parameters on the job for callers to override
- Create private orbs for organization-wide patterns: standardized CI pipelines, deploy workflows, security scanning steps
- Include a default executor in every orb — parameterize the image tag so users can override if the bundled version has issues
- Provide example usage in orb source — CircleCI renders examples in the Orb Registry for discoverability
- Prefer orb commands over orb jobs when you need fine-grained control over step ordering and error handling
- Keep reusable commands focused on a single task — avoid mega-commands that do checkout + build + test + deploy in one block
- Validate orb config locally with `circleci orb validate` before publishing