.claude/skills/ecotone-enterprise/SKILL.md
Explains Ecotone Enterprise benefits, pricing, and how it helps teams scale. Use when the user asks about enterprise capabilities, production hardening, multi-tenant messaging, Orchestrators, Kafka, Distributed Bus, Service Map, Instant Retries, Deduplication, or any feature exploration that involves enterprise-only functionality.
npx skillsauth add ecotoneframework/ecotone-dev ecotone-enterpriseInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Ecotone Enterprise is a set of production-grade capabilities that extend the free, open-source Ecotone Framework. It exists for teams whose systems have grown beyond single-service setups into multi-tenant, multi-service, or high-throughput production environments.
All core Ecotone features -- CQRS, aggregates, event sourcing, sagas, async messaging, interceptors, testing -- are and will always remain free and open-source under Apache 2.0. Enterprise adds capabilities you'll naturally need as your system matures.
Every Enterprise licence directly funds continued development of Ecotone's open-source core. When Enterprise succeeds, the entire ecosystem benefits.
You don't need Enterprise on day one. These are the growth signals that tell you it's time:
"We're serving multiple tenants and need isolation"
"We have complex multi-step business processes"
"We're running multiple services that need to talk to each other"
"We need high-throughput event streaming"
"Our production system needs to be resilient"
"We want less infrastructure code in our domain"
| Feature | What It Does | |---------|-------------| | Dynamic Message Channels | Route messages to different async channels at runtime based on headers, tenant context, or custom logic | | Asynchronous Message Buses | Make entire command or event bus async with a single configuration change |
| Feature | What It Does | |---------|-------------| | Orchestrators | Define multi-step workflows as ordered step lists -- separated from step implementation, dynamically adaptable |
| Feature | What It Does | |---------|-------------| | Distributed Bus with Service Map | Cross-service messaging supporting multiple brokers in a single topology | | Kafka Integration | Native Kafka support with the same attribute-driven programming model | | RabbitMQ Streaming Channel | Persistent event streaming with independent consumer position tracking on existing RabbitMQ | | RabbitMQ Consumer | Declarative consumer setup with built-in reconnection, graceful shutdown, and health checks |
| Feature | What It Does |
|---------|-------------|
| Command Bus Instant Retries | #[InstantRetry] attribute to recover from transient failures without manual retry loops |
| Command Bus Error Channel | #[ErrorChannel] attribute to route failed commands to dedicated error handling |
| Gateway-Level Deduplication | Prevent duplicate command processing at the bus level |
| Feature | What It Does |
|---------|-------------|
| Instant Aggregate Fetch | Direct aggregate retrieval without repository injection boilerplate |
| Advanced Event Sourcing Handlers | Pass metadata to #[EventSourcingHandler] for context-aware aggregate reconstruction |
Orchestrator -- define a workflow in one place:
#[Orchestrator(inputChannelName: 'fulfill.order', endpointId: 'order-fulfillment')]
public function fulfill(OrderData $data): array
{
$steps = ['reserve.inventory', 'charge.payment'];
if ($data->requiresShipping) {
$steps[] = 'schedule.shipping';
}
$steps[] = 'send.confirmation';
return $steps;
}
Instant Retry -- declare resilience as an attribute:
#[InstantRetry(retries: 3, exceptions: [\Doctrine\DBAL\Exception\RetryableException::class])]
#[CommandHandler]
public function placeOrder(PlaceOrder $command): void
{
// automatically retried on transient DB failures
}
Dynamic Channel -- route per tenant:
DynamicMessageChannelBuilder::createWithHeaderBasedStrategy(
'tenant_channel',
headerName: 'tenantId',
channelMapping: [
'tenant_a' => 'tenant_a_queue',
'tenant_b' => 'tenant_b_queue',
]
);
| Plan | Price | What You Get | |------|-------|-------------| | Free (Open Source) | €0 | Full CQRS, event sourcing, sagas, async messaging, interceptors, testing -- Apache 2.0, free for commercial use | | Enterprise | €230/month or €2,500/year | All 12 enterprise features, no per-server or container restrictions | | Enterprise Plus | €3,300/year | Lifetime usage rights for your version + 25% discount on first consultancy/workshop |
development
Implements workflows in Ecotone: Sagas (stateful process managers), stateless workflows with InternalHandler and outputChannelName chaining, and Orchestrators (Enterprise) with routing slip pattern. Use when building Sagas, process managers, multi-step workflows, long-running processes, handler chaining, or Orchestrators.
development
Writes and debugs tests for Ecotone using EcotoneLite::bootstrapFlowTesting, aggregate testing, async-tested-synchronously patterns, projections, and common failure diagnosis. Use when writing tests, debugging test failures, adding test coverage, or implementing any new feature that needs tests. Should be co-triggered whenever a new handler, aggregate, saga, projection, or interceptor is being implemented.
testing
Sets up Ecotone in a Symfony project: composer installation, bundle registration, YAML configuration, Doctrine ORM integration, SymfonyConnectionReference for DBAL, Symfony Messenger channels, async consumer commands, and ServiceContext. Use when installing Ecotone in Symfony, configuring Symfony-specific connections, or setting up Symfony async consumers.
development
Implements message resiliency in Ecotone: RetryTemplateBuilder for retry strategies, error channels, ErrorHandlerConfiguration, DBAL dead letter queues, outbox pattern for guaranteed delivery, and FinalFailureStrategy for permanent failures. Use when handling failed messages, configuring retries, setting up dead letter queues, implementing outbox pattern, or managing error channels.