php-laravel — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited php-laravel (Agent Skill) and scored it 91/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} is the classic direct prompt-injection phrasing. Placed in a skill body that the agent reads as trusted instructions, it tries to make the agent abandon its prior rules and follow whatever comes next — a full system-prompt override.
ignore/disregard/forget … previous instructions sentence.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.
declare(strict_types=1) in every fileelse.$exception not $e, $request not $r?string not string|null. Always specify void. Import classnames everywhere, never inline FQN.['required', 'email'] for easier custom rule classesUse these when applicable — do not explain them in comments (Claude and developers know them):
$fn = $obj->method(...)(Stringable&Countable)|null for complex constraints__construct(private readonly PaymentService $payments)Model::preventLazyLoading(!app()->isProduction()) — catch N+1 during developmentPost::with(['user:id,name'])->select(['id', 'title', 'user_id'])Post::where('status', 'draft')->update([...]) — do not load into memory to updateincrement()/decrement() for counters in a single querychunk(1000)), lazy collections for memory-constrained processing$guarded = [] is a mass assignment vulnerability — always use explicit $fillablewhenLoaded() for relationships — prevents N+1 in responseswhen() / mergeWhen() for permission-based field inclusionwhenPivotLoaded() for pivot datawithResponse() for custom headers, with() for metadata (version, pagination)Bus::batch([...])->then()->catch()->finally()->dispatch()Bus::chain([new Step1, new Step2])->dispatch()Redis::throttle('api')->allow(10)->every(60)->then(fn() => ...)ShouldBeUnique interface to prevent duplicate processingfailed() method on jobstest() / it() syntax with RefreshDatabase traitSanctum::actingAs($user, ['ability']) for API auth testingwhereIn() insteadprotected $guarded = [] — use $fillable instead~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.