From acc
Generates Saga pattern components for PHP 8.4: Saga interfaces, steps, orchestrator, state enums, context, compensation logic, Doctrine persistence, migrations, and unit tests. For distributed transactions and multi-step workflows.
How this skill is triggered — by the user, by Claude, or both
Slash command
/acc:create-saga-patternThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Creates Saga pattern infrastructure for distributed transaction coordination.
Creates Saga pattern infrastructure for distributed transaction coordination.
Determine:
Create in this order:
Domain Layer (src/Domain/Shared/Saga/)
SagaState.php — State enum with transitionsStepResult.php — Step result value objectSagaStepInterface.php — Step contractSagaContext.php — Execution contextSagaResult.php — Saga resultApplication Layer (src/Application/Shared/Saga/)
SagaPersistenceInterface.php — Persistence portSagaRecord.php — Persisted recordAbstractSagaStep.php — Base step classSagaOrchestrator.php — OrchestratorInfrastructure Layer
DoctrineSagaPersistence.php — Doctrine implementationTests
SagaStateTest.phpSagaOrchestratorTest.phpFor each saga step (e.g., Order saga):
src/Application/{Context}/Saga/Step/
├── ReserveInventoryStep.php
├── ChargePaymentStep.php
└── CreateShipmentStep.php
src/Application/{Context}/Saga/
└── {Context}SagaFactory.php
| Layer | Path |
|---|---|
| Domain Types | src/Domain/Shared/Saga/ |
| Application Saga | src/Application/Shared/Saga/ |
| Context Steps | src/Application/{Context}/Saga/Step/ |
| Saga Factory | src/Application/{Context}/Saga/ |
| Infrastructure | src/Infrastructure/Persistence/Doctrine/Repository/ |
| Unit Tests | tests/Unit/{Layer}/{Path}/ |
Pending → Running → Completed
↓
Compensating → Failed
↓
CompensationFailed
| Component | Pattern | Example |
|---|---|---|
| State Enum | SagaState | SagaState |
| Step Interface | SagaStepInterface | SagaStepInterface |
| Abstract Step | AbstractSagaStep | AbstractSagaStep |
| Concrete Step | {Action}Step | ReserveInventoryStep |
| Orchestrator | SagaOrchestrator | SagaOrchestrator |
| Factory | {Name}SagaFactory | OrderSagaFactory |
| Test | {ClassName}Test | SagaOrchestratorTest |
interface SagaStepInterface
{
public function name(): string;
public function execute(SagaContext $context): StepResult;
public function compensate(SagaContext $context): StepResult;
public function isIdempotent(): bool;
public function timeout(): int;
}
final readonly class StepResult
{
public static function success(array $data = []): self;
public static function failure(string $error): self;
public function isSuccess(): bool;
public function isFailure(): bool;
}
final readonly class {Action}Step extends AbstractSagaStep
{
public function name(): string
{
return '{action_name}';
}
public function execute(SagaContext $context): StepResult
{
$idempotencyKey = $this->idempotencyKey($context);
// Check for existing result (idempotency)
// Execute action
// Return StepResult::success([...data...]) or failure
}
public function compensate(SagaContext $context): StepResult
{
// Get data from context
// Undo action
// Handle "already undone" gracefully
return StepResult::success();
}
}
// Create saga
$saga = $orderSagaFactory->create($command);
// Execute
$result = $saga->execute();
if ($result->isCompleted()) {
// Success
} elseif ($result->isFailed()) {
// Failed but compensated
$error = $result->error;
} elseif ($result->isCompensationFailed()) {
// Needs manual intervention
$originalError = $result->error;
$compensationError = $result->compensationError;
}
# Symfony services.yaml
Domain\Shared\Saga\SagaStepInterface:
tags: ['saga.step']
Application\Shared\Saga\SagaPersistenceInterface:
alias: Infrastructure\Persistence\Doctrine\Repository\DoctrineSagaPersistence
Application\Order\Saga\OrderSagaFactory:
arguments:
$reserveStep: '@Application\Order\Saga\Step\ReserveInventoryStep'
$chargeStep: '@Application\Order\Saga\Step\ChargePaymentStep'
$shipStep: '@Application\Order\Saga\Step\CreateShipmentStep'
CREATE TABLE sagas (
id VARCHAR(255) PRIMARY KEY,
type VARCHAR(255) NOT NULL,
state VARCHAR(50) NOT NULL,
completed_steps JSONB NOT NULL DEFAULT '[]',
context JSONB NOT NULL,
error TEXT,
created_at TIMESTAMP(6) NOT NULL,
updated_at TIMESTAMP(6) NOT NULL,
completed_at TIMESTAMP(6)
);
CREATE INDEX idx_sagas_state ON sagas (state);
CREATE INDEX idx_sagas_type_state ON sagas (type, state);
For complete PHP templates and test examples, see:
references/templates.md — All component templatesreferences/examples.md — Order saga example and unit testsnpx claudepluginhub dykyi-roman/awesome-claude-code --plugin accProvides Saga pattern knowledge base with patterns, antipatterns, and PHP-specific guidelines for orchestration, choreography, and distributed transaction audits. Useful for PHP microservices.
Implements saga patterns for distributed transactions and cross-aggregate workflows. Covers choreography vs orchestration, execution states, and compensating transactions for multi-step business processes.
Designs saga patterns using orchestration and choreography for distributed transactions in microservices. Covers fundamentals, event-driven choreography, central orchestration, and compensating actions.