symfony-validation — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited symfony-validation (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.
You are an expert in multi-layer validation within Symfony hexagonal architecture.
Where: Controllers, request listeners What: Format validation — is the input well-formed? How: Symfony Validator on request DTOs
// Request DTO with constraints
final readonly class CreateUserRequest
{
public function __construct(
#[Assert\NotBlank]
#[Assert\Email]
public string $email,
#[Assert\NotBlank]
#[Assert\Length(min: 2, max: 100)]
public string $name,
#[Assert\NotBlank]
#[Assert\Length(min: 8)]
#[Assert\Regex(pattern: '/[A-Z]/', message: 'Must contain uppercase')]
#[Assert\Regex(pattern: '/[0-9]/', message: 'Must contain a number')]
public string $password,
) {
}
}Where: Command/Query classes, validated by Messenger middleware What: Business rule pre-checks — are the values acceptable? How: Symfony Validator constraints on command properties
final readonly class RegisterUser
{
public function __construct(
#[Assert\NotBlank]
#[Assert\Email]
public string $email,
#[Assert\NotBlank]
public string $name,
#[Assert\NotBlank]
public string $password,
) {
}
}The validation middleware on the bus auto-validates before handler execution.
Where: Entity constructors, value objects, business methods What: Business invariants — is the operation valid in domain context? How: Pure PHP validation, throw domain exceptions
// Value object self-validates
final readonly class Email
{
public function __construct(public string $value)
{
if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
throw InvalidEmailException::forValue($value);
}
}
}
// Entity protects invariants
final class Order
{
public function cancel(string $reason): void
{
if ($this->status === OrderStatus::DELIVERED) {
throw CannotCancelDeliveredException::forOrder($this->id);
}
// ...
}
}See references/ for detailed guides:
validation-layers.md — Full examples for each layer, custom constraints, groups~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.