platform-cookbooklisted
Install: claude install-skill jardisTools/dev-skills
> **Layout context.** The aggregate tree `{BC}/Aggregate/{Agg}/` (abbreviated `{Agg}/` in this skill) is hermetic — ForceOverwrite, never edited (V1); developer code lands only in the BC-level Process scope `{BC}/Process/{Name}/`, reached via `$bc->process()`. `$bc->{agg}()` reaches only the read facade `{Agg}Read` (Außentür); the write facade `{Agg}` is family-internal via the Kernel-Naht `$this->handle({Agg}::class)`. Canonical layout + Vokabular-Glossar (Aggregat-Fassade / Lese-Fassade / Außentür / Kernel-Naht / Context-Familie): `platform-implementation` §1–§2.
### 1. Event transport — authored in a Process node
The generator emits the base router at `{Agg}/Event/<Agg>EventRouter.php` (namespace `<Domain>\<BC>\Aggregate\<Agg>\Event`, ForceOverwrite). It is a plain `class <Agg>EventRouter` carrying one **empty** `protected function on<Event>(EventListenerRegistryInterface $registry): void` stub per Domain Event (body `// configure transport`), each preceded by a channel-key comment (`{ChannelPrefix}.{ChannelSuffix}`) as a topic / routing-key suggestion. The Domain facade wires it directly into `eventDispatcher()`:
```php
protected function eventDispatcher(): EventDispatcherInterface|false|null
{
return (new EventDispatcherHandler())(
new CounterEventRouter()
);
}
```
**The router is hermetic** (ForceOverwrite) — you never fill its bodies; the next build truncates them (V1). Transport is therefore authored where developer code is allowed: a **Process nod