implement-cqrs-handlers — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited implement-cqrs-handlers (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Handlers live in src/Adapter/{Domain}/CommandHandler/ and QueryHandler/. See CQRS/CONTEXT.md for conventions (#[AsCommandHandler]/#[AsQueryHandler] attributes, no cross-handler calls, return types).
Add{Domain}Handler.php implementing Add{Domain}HandlerInterface:
{Domain}Repositoryhandle(Add{Domain}Command $command): {Domain}Id:$command->getLocalizedNames() to the lang array$this->repository->create(...){Domain}IdReference: src/Adapter/Tax/CommandHandler/AddTaxHandler.php (simple), src/Adapter/Manufacturer/CommandHandler/AddManufacturerHandler.php (with image)
Edit{Domain}Handler.php implementing Edit{Domain}HandlerInterface:
$entity = $this->repository->get{Domain}($command->getId())if ($command->getName() !== null) { $entity->name = $command->getName(); }$this->repository->update($entity)Reference: src/Adapter/Tax/CommandHandler/EditTaxHandler.php (simple), src/Adapter/Carrier/CommandHandler/EditCarrierHandler.php (many fields)
Delete{Domain}Handler.php implementing Delete{Domain}HandlerInterface:
{Domain}NotFoundException)CannotDelete{Domain}Exception$this->repository->delete($command->getId())Toggle{Domain}StatusHandler.php:
$entity->active = !$entity->activeSet{Domain}{SubResource}sHandler.php:
Two strategies depending on complexity:
Used when sub-resources have no identity of their own or when maintaining existing rows isn't important:
$command->getItems()Reference: src/Adapter/Carrier/CommandHandler/SetCarrierRangesHandler.php
Preferred when sub-resources have their own identity or when preserving existing rows matters (e.g., to keep audit trails, auto-increment IDs, or related data):
Choose Strategy B when possible for cleaner data management. Use Strategy A when sub-resources are simple value-like collections without individual identity.
Get{Domain}ForEditingHandler.php in QueryHandler/:
Editable{Domain} DTO (with scalar types only — no VOs in the DTO)Reference: src/Adapter/Tax/QueryHandler/GetTaxForEditingHandler.php (simple)
Most domains use the grid QueryBuilder pattern — no handler needed. Only create if the domain uses an explicit Get{Domain}sForListing query class.
Conventions (attributes, no SQL, no cross-handler calls, return types) are in CQRS/CONTEXT.md. Skill-specific reminders:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.