Install any skill in seconds. Free to start, no credit card required.
Get Started Free →PHP development: code quality, PSR standards, testing with PHPUnit.
.claude/skills/notque-php/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 14% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 160% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 413% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 81% | 0% |
| case-15 | ✗→✓ | ▲ Improved | -17% | 0% |
PHP code quality and testing: strict types, PSR-12 compliance, modern language features, framework idioms, static analysis tooling, and PHPUnit testing patterns.
| Signal | Reference | Size | |--------|-----------|------| | union types, intersection types, DNF, enums, readonly, named arguments, match expression, null-safe operator, PHP 8.0, PHP 8.1, PHP 8.2 | references/modern-php-features.md | ~160 lines | | Laravel, Eloquent, Collections, Service Container, Symfony, DI attributes, Event Dispatcher, framework | references/framework-idioms.md | ~70 lines | | PHP-CS-Fixer, PHPStan, Psalm, Rector, static analysis, CI, linting, code style, taint analysis | references/quality-tools.md | ~60 lines | | PHPUnit tests, data providers, mocks, stubs, database testing, HTTP testing, coverage | references/testing-patterns.md | ~120 lines | | quality review process, phases, PSR-12 enforcement | references/php-quality.md | ~60 lines | | test writing process, test doubles, Prophecy, database fixtures | references/php-testing.md | ~50 lines |
Loading rule. Read the references whose signals match the task before responding.
Every PHP file must begin with declare(strict_types=1). This enforces scalar type coercion rules, catching type errors at call time instead of silently converting values. Omitting it is a code quality defect.
PSR-12 extends PSR-1 and PSR-2 as the accepted PHP coding style:
use statements after namespace with a blank line before and afterDetermine what kind of PHP work is needed:
| Request type | Load references | Action | |-------------|----------------|--------| | Code review | quality refs + quality-tools | Full quality pass | | Type system question | modern-php-features | Feature-specific guidance | | Framework patterns | framework-idioms | Idiomatic pattern review | | Tooling setup | quality-tools | Config and CI guidance | | Write tests | testing-patterns + php-testing | PHPUnit test authoring | | Test review | testing-patterns | Test quality review |
Gate: Request classified and relevant references loaded.
Apply loaded reference knowledge to the user's code or question.
For quality reviews, check:
declare(strict_types=1) presentFor testing work:
TestCase with test prefix or @test annotation@dataProvider for table-driven casescreateStub() for return values, createMock() for interaction assertionsDatabaseTransactions (Laravel) or KernelTestCase (Symfony) for database testsparent::setUp() first in every setUp() methodGate: Specific, reference-backed feedback or code provided.
Run the test suite and confirm:
bash./vendor/bin/phpunit # For coverage enforcement: XDEBUG_MODE=coverage ./vendor/bin/phpunit --coverage-text --coverage-min=80
Gate: All tests pass. Coverage threshold met if configured.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 6,525 | 2,964 | -55% | 1 | 1 | 0% | 1,124 | 1,281 | +14% | 0 | 0 | — |
case-02 | fail→fail | 8,134 | 9,031 | +11% | 1 | 1 | 0% | 1,655 | 2,594 | +57% | 0 | 0 | — |
case-03 | fail→pass | 4,590 | 8,168 | +78% | 1 | 1 | 0% | 856 | 2,224 | +160% | 0 | 0 | — |
case-04 | fail→pass | 2,828 | 7,137 | +152% | 1 | 1 | 0% | 391 | 2,007 | +413% | 0 | 0 | — |
case-05 | fail→fail | 6,638 | 6,906 | +4% | 1 | 1 | 0% | 1,124 | 2,126 | +89% | 0 | 0 | — |
case-06 | pass→pass | 4,965 | 5,799 | +17% | 1 | 1 | 0% | 944 | 1,883 | +99% | 0 | 0 | — |
case-07 | pass→pass | 7,960 | 6,797 | -15% | 1 | 1 | 0% | 1,439 | 2,004 | +39% | 0 | 0 | — |
case-08 | fail→fail | 3,034 | 5,987 | +97% | 1 | 1 | 0% | 580 | 1,961 | +238% | 0 | 0 | — |
case-09 | pass→pass | 7,170 | 5,718 | -20% | 1 | 1 | 0% | 1,276 | 1,886 | +48% | 0 | 0 | — |
case-10 | pass→pass | 6,359 | 7,348 | +16% | 1 | 1 | 0% | 1,083 | 2,087 | +93% | 0 | 0 | — |
case-11 | fail→pass | 7,434 | 9,680 | +30% | 1 | 1 | 0% | 1,421 | 2,576 | +81% | 0 | 0 | — |
case-12 | fail→fail | 2,877 | 2,845 | -1% | 1 | 1 | 0% | 453 | 1,307 | +189% | 0 | 0 | — |
case-13 | fail→fail | 7,691 | 6,125 | -20% | 1 | 1 | 0% | 1,466 | 1,980 | +35% | 0 | 0 | — |
case-14 | fail→fail | 5,882 | 8,459 | +44% | 1 | 1 | 0% | 1,005 | 2,261 | +125% | 0 | 0 | — |
case-15 | fail→pass | 12,542 | 4,400 | -65% | 1 | 1 | 0% | 1,965 | 1,622 | -17% | 0 | 0 | — |
case-16 | fail→fail | 2,701 | 3,774 | +40% | 1 | 1 | 0% | 474 | 1,541 | +225% | 0 | 0 | — |
case-17 | fail→fail | 13,064 | 9,577 | -27% | 1 | 1 | 0% | 2,446 | 2,626 | +7% | 0 | 0 | — |
case-18 | pass→pass | 5,365 | 4,917 | -8% | 1 | 1 | 0% | 908 | 1,766 | +94% | 0 | 0 | — |
case-19 | fail→fail | 1,706 | 3,323 | +95% | 1 | 1 | 0% | 251 | 1,421 | +466% | 0 | 0 | — |
case-20 | pass→pass | 7,450 | 7,966 | +7% | 1 | 1 | 0% | 1,391 | 2,295 | +65% | 0 | 0 | — |
case-21 | pass→pass | 5,059 | 4,387 | -13% | 1 | 1 | 0% | 778 | 1,512 | +94% | 0 | 0 | — |
case-22 | pass→pass | 3,860 | 3,802 | -2% | 1 | 1 | 0% | 631 | 1,454 | +130% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +23 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.