Eight non-negotiable rules enforced on every generated route. All other design guidance (error handling strategy, retry policy, throttling, resilience patterns, idempotency, transactions, data format choices, deployment) lives in
/camel-brainstormand/camel-migrate, where it is applied context-specifically during flow design.
| Property | Value |
|---|---|
| Version | 2.2 |
| Last Updated | 2026-07-07 |
These 8 rules define what makes a good Camel route. They are enforced by Iron Law 2 (Constitution Compliance) across all pipeline phases. See
skills/shared/iron-laws.mdfor the full set of six iron laws.
Every route MUST have a source (from:) and a sink (final to:).
direct: and seda: sub-routes are exempt — they may omit an external sink.One route = one clear purpose, explainable in one sentence.
Decompose complex integrations into discrete, composable routes.
direct: for synchronous internal routing, seda: for asynchronous.Use consistent, meaningful names throughout.
Route IDs: <domain>-<action>[-<qualifier>]
order-ingestion customer-enrichment inventory-lookup
Internal endpoints: direct:<route-id> · seda:<domain>-<purpose>
Headers/Properties: CamelCase for Camel built-ins · kebab-case for custom (order-id, correlation-id)
Every route MUST declare a routeId and a description.
X-Correlation-ID) to trace requests across routes.routeId fail validation.Never hardcode connection strings, credentials, or environment-specific values.
{{PLACEHOLDER}} syntax for all configurable values.application.properties → bundled defaults.Every component used in a route MUST be verified as available in the target Camel version.
camel_catalog_component_doc (via Camel MCP) to check whether the component exists in the Apache Camel catalog for the target version./camel-execute dispatches internal runtime verification to check component availability at build and startup time, catching missing components that passed design-time validation.Declare infrastructure beans with forage.* properties when Forage covers them; follow the configuration ladder (Forage → component properties → hand-rolled bean with a stated reason). Hand-rolled bean definitions (camel.beans.* or YAML beans) require a one-line reason comment.
forage.* key, or a hand-rolled bean (camel.beans.* or YAML beans) with a Forage (rung-1) equivalent and no reason comment, fails validation. A hand-rolled bean where only a rung-2 scalar alternative exists triggers a WARNING.Extend or override the rules above for project-specific needs.
# allowedComponents: # - kafka # - http # - jpa
# routeIdPattern: "myteam-{domain}-{action}"
# deadLetterPatterns: # order: kafka:order-dlq # default: kafka:integration-dlq
# security: # requireTLS: true # sensitiveHeaders: [Authorization, X-API-Key, Cookie]