$issues */ public function __construct( private readonly array $issues, private readonly int $componentCount, ) {} public function hasIssues(): bool { return $this->issues !== []; } /** * @return array */ public function issues(): array { return $this->issues; } public function componentCount(): int { return $this->componentCount; } public function formatForAssertion(): string { if (! $this->hasIssues()) { return sprintf('Validated %d action-surface components with no issues.', $this->componentCount); } $lines = array_map( static fn (ActionSurfaceValidationIssue $issue): string => '- '.$issue->format(), $this->issues, ); return sprintf( "Action Surface Contract violations (%d/%d):\n%s", count($this->issues), $this->componentCount, implode("\n", $lines), ); } }