acture-php
acture php — command dispatch for PHP projects
Most "command bus" tooling in the PHP world (Tactician, Prooph, Messenger, Broadway, Laravel's job bus) solves one of the journal's three primitives — handler dispatch — and is metadata-poor. A bus routes a message by class. The journal's registry routes by id and carries {title, params schema, when, category, icon, hotkey, description} next to the dispatch primitive so a palette, an LLM tool list, an MCP server, a CLI, and a test runner can all read from one source.
This skill is the PHP entry point. It maps the three primitives to the language, surfaces the two trade-offs every PHP project faces (framework + agent-written vs package-reuse), and hands off to the path skill (greenfield or strangler-fig).
Load
acture-architecture-primerfirst if you have not — the three primitives and the eight consumer surfaces are the conceptual baseline this skill specializes for PHP. Loadacture-hard-dontsbefore merging anything.
The companion research note lives at docs/research/acture_research_7 -- PHP Tooling for a Command-Dispatch Architecture- A Reference Stack and Migration Guide.md. When in doubt about a library choice or version, that is the source of truth.
The one rule you cannot break
Command metadata is data, not code — and that includes in PHP.
#[Command(id, title, category, icon, hotkey, when)] is an attribute whose arguments are scalars and const-expressions. The PHP attribute grammar enforces this structurally — do not invent a runtime DSL on top. when is a string predicate name resolved by the host; conditional logic that the registry would have to interpret belongs in the handler, not in metadata. This is the same guardrail that rejects nested registries and "command inheritance" in the TS core.
The corollary: classic PHP buses are dispatchers, not registries. Symfony Messenger / Laravel Bus / Tactician all route by class. They are perfectly good dispatchers — the registry is the metadata side-car you put next to them.