AI Slop Code RIsk Monitor

Respect/Validation

The most awesome validation engine ever created for PHP

7.4 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for Respect/Validation, a PHP project with 6,031 GitHub stars. SynthScan examined 73,005 lines of code across 1252 source files, recording 481 pattern matches distributed across 3 syntactic categories. The legacy adjusted pattern signal is 7.4 (Moderate pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

7.4
Adjusted Signal
7.4
Raw Pattern Score
100%
Time Factor
2026-10-11
Last Push
6.0K
Stars
PHP
Language
73.0K
Lines of Code
1.3K
Files
481
Pattern Hits
2026-10-12
Scan Date
0.00
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 26.2/100 · MEDIUM

Can maintainers explain intent, assumptions, and trade-offs? 395 finding(s).

Hallucinated Dependency & Supply Chain Risk 6.4/100 · LOW

Are imports declared and package/API names verified? 86 finding(s).

Agent Over-Engineering Ratio 26.1/100 · MEDIUM

Are wrappers, guards, and repeated structures necessary? 393 finding(s).

PR Review Velocity Impact 28.1/100 · MEDIUM

Which changes need focused human review? 481 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 0HIGH 0MEDIUM 0LOW 481

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 481 distinct pattern matches across 3 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Hyper-Verbose Identifiers393 hits · 442 pts
SeverityFileLineSnippetContext
LOWtests/Pest.php89function expectMessageAndDeprecation(Closure $callback, string $message, string $error): ClosureCODE
LOWtests/benchmark/CompositeValidatorsBench.php67 public function provideGroupedValidatorBuilder(): GeneratorCODE
LOWtests/benchmark/CompositeValidatorsBench.php81 public function provideArrayBasedValidatorBuilder(): GeneratorCODE
LOW⚡tests/unit/AutowiringLookupTest.php39 public function itShouldCreateRuleByNameFromNamespace(): voidCODE
LOW⚡tests/unit/AutowiringLookupTest.php45 public function itShouldPrependNamespaceWithWithNamespace(): voidCODE
LOW⚡tests/unit/AutowiringLookupTest.php53 public function itShouldPassAllArgumentsToVariadicConstructors(): voidCODE
LOWtests/unit/AutowiringLookupTest.php64 public function itShouldAutowireConstructorDependenciesFromTheContainer(): voidCODE
LOWtests/unit/AutowiringLookupTest.php75 public function itShouldThrowWhenRuleNameCannotBeResolved(): voidCODE
LOWtests/unit/AutowiringLookupTest.php83 public function itShouldThrowWhenInstantiationFails(): voidCODE
LOWtests/unit/ResultTest.php26 public function itShouldUpdateInputWhenWithInputIsCalled(): voidCODE
LOWtests/unit/ResultTest.php41 public function itShouldUpdateAdjacentInputWhenWithInputIsCalled(): voidCODE
LOWtests/unit/ResultTest.php63 public function itShouldUpdateChildrenInputWhenWithInputIsCalledAndChildHasSameInputAndPath(): voidCODE
LOWtests/unit/ResultTest.php88 public function itShouldUpdateChildrenInputWhenWithInputIsCalledAndBothHaveNullPath(): voidCODE
LOWtests/unit/ResultTest.php109 public function itShouldNotUpdateChildrenInputWhenWithInputIsCalledAndChildHasDifferentInput(): voidCODE
LOWtests/unit/ResultTest.php133 public function itShouldUpdateOnlyMatchingChildrenInputWhenWithInputIsCalled(): voidCODE
LOWtests/unit/ResultTest.php164 public function itShouldNotUpdateChildrenInputWhenWithInputIsCalledAndChildHasDifferentPath(): voidCODE
LOWtests/unit/ResultTest.php187 public function itShouldUpdateInputAdjacentAndChildrenWithSameInputWhenWithInputIsCalled(): voidCODE
LOWtests/unit/ResultTest.php219 public function itShouldUpdateNestedChildrenInputWhenWithInputIsCalled(): voidCODE
LOWtests/unit/ResultTest.php250 public function itShouldNotUpdateNestedChildrenWhenWithInputIsCalledAndGrandchildHasDifferentPath(): voidCODE
LOWtests/unit/ResultTest.php281 public function itShouldUpdateNestedChildrenWhenWithInputIsCalledAndGrandchildHasSameInputAndPath(): voidCODE
LOWtests/unit/ResultTest.php311 public function shouldCreateIndeterminateResult(): voidCODE
LOW⚡tests/unit/ResultQueryTest.php30 public function itShouldReturnTrueWhenResultHasPassed(): voidCODE
LOW⚡tests/unit/ResultQueryTest.php40 public function itShouldReturnFalseWhenResultHasNotPassed(): voidCODE
LOW⚡tests/unit/ResultQueryTest.php50 public function itShouldReturnEmptyMessageWhenResultHasPassed(): voidCODE
LOW⚡tests/unit/ResultQueryTest.php60 public function itShouldReturnFormattedMessageWhenResultHasNotPassed(): voidCODE
LOWtests/unit/ResultQueryTest.php73 public function itShouldReturnEmptyFullMessageWhenResultHasPassed(): voidCODE
LOWtests/unit/ResultQueryTest.php83 public function itShouldReturnFormattedFullMessageWhenResultHasNotPassed(): voidCODE
LOWtests/unit/ResultQueryTest.php96 public function itShouldReturnEmptyArrayWhenResultHasPassed(): voidCODE
LOWtests/unit/ResultQueryTest.php106 public function itShouldReturnFormattedArrayWhenResultHasNotPassed(): voidCODE
LOWtests/unit/ResultQueryTest.php119 public function itShouldConvertToStringUsingMessage(): voidCODE
LOWtests/unit/ResultQueryTest.php132 public function itShouldConvertToEmptyStringWhenResultHasPassed(): voidCODE
LOWtests/unit/ResultQueryTest.php142 public function itShouldFindByIdWhenIdMatchesCurrentResult(): voidCODE
LOWtests/unit/ResultQueryTest.php162 public function itShouldFindByIdInDirectChildren(): voidCODE
LOWtests/unit/ResultQueryTest.php188 public function itShouldFindByIdInNestedChildren(): voidCODE
LOWtests/unit/ResultQueryTest.php220 public function itShouldReturnNullWhenIdNotFound(): voidCODE
LOWtests/unit/ResultQueryTest.php232 public function itShouldReturnNullWhenFindByIdOnResultWithNoChildren(): voidCODE
LOWtests/unit/ResultQueryTest.php244 public function itShouldFindByNameWhenNameMatchesCurrentResult(): voidCODE
LOWtests/unit/ResultQueryTest.php264 public function itShouldFindByNameInDirectChildren(): voidCODE
LOWtests/unit/ResultQueryTest.php290 public function itShouldFindByNameInNestedChildren(): voidCODE
LOWtests/unit/ResultQueryTest.php322 public function itShouldReturnNullWhenNameNotFound(): voidCODE
LOWtests/unit/ResultQueryTest.php334 public function itShouldReturnNullWhenFindByNameOnResultWithNoName(): voidCODE
LOWtests/unit/ResultQueryTest.php344 public function itShouldFindByPathWhenPathMatchesCurrentResult(): voidCODE
LOWtests/unit/ResultQueryTest.php364 public function itShouldFindByPathInDirectChildren(): voidCODE
LOWtests/unit/ResultQueryTest.php390 public function itShouldFindByDottedPathInNestedChildren(): voidCODE
LOWtests/unit/ResultQueryTest.php421 public function itShouldFindByIntegerPath(): voidCODE
LOWtests/unit/ResultQueryTest.php446 public function itShouldReturnNullWhenPathNotFound(): voidCODE
LOWtests/unit/ResultQueryTest.php458 public function itShouldReturnNullWhenFindByPathOnResultWithNoPath(): voidCODE
LOWtests/unit/ResultQueryTest.php468 public function itShouldReturnNullWhenDottedPathPartiallyMatches(): voidCODE
LOWtests/unit/ResultQueryTest.php487 public function itShouldReturnNullWhenChildPathDoesNotMatch(): voidCODE
LOWtests/unit/ResultQueryTest.php505 public function itShouldPreserveFormattingCapabilitiesAfterFindById(): voidCODE
LOWtests/unit/ResultQueryTest.php538 public function itShouldPreserveFormattingCapabilitiesAfterFindByName(): voidCODE
LOWtests/unit/ResultQueryTest.php568 public function itShouldPreserveFormattingCapabilitiesAfterFindByPath(): voidCODE
LOWtests/unit/ResultQueryTest.php593 public function itShouldFindByPathWithWildcard(): voidCODE
LOWtests/unit/ResultQueryTest.php620 public function itShouldFindByPathWithWildcardAtEnd(): voidCODE
LOWtests/unit/ResultQueryTest.php645 public function itShouldReturnNullWhenPathWithWildcardDoesNotMatch(): voidCODE
LOWtests/unit/ResultQueryTest.php662 public function itShouldReturnNullWhenPathLengthDoesNotMatch(): voidCODE
LOW⚡tests/unit/ValidatorBuilderTest.php32 public function invalidRuleClassShouldThrowComponentException(): voidCODE
LOW⚡tests/unit/ValidatorBuilderTest.php41 public function shouldReturnValidatorInstanceWhenTheNotRuleIsCalledWithArguments(): voidCODE
LOW⚡tests/unit/ValidatorBuilderTest.php50 public function itShouldProxyResultWithTheIsValidMethod(): voidCODE
LOW⚡tests/unit/ValidatorBuilderTest.php59 public function itShouldAssertAndNotThrowAnExceptionWhenValidatorPasses(): voidCODE
333 more matches not shown…
Fake / Example Data86 hits · 96 pts
SeverityFileLineSnippetContext
LOWtests/unit/Validators/ContainsAnyTest.php54 [new ContainsAny(['word', '@', '/']), 'lorem ipsum'],CODE
LOWtests/unit/Validators/EmailTest.php57 [$sut, 'test@test.com'],CODE
LOWtests/unit/Validators/PhoneTest.php101 ['555-5555'],CODE
LOW⚡tests/unit/Validators/AttributesTest.php88 'John Doe',CODE
LOW⚡tests/unit/Validators/AttributesTest.php95 'Only required' => [new WithAttributes('Jane Doe', '2017-11-30', 'janedoe@yahoo.com')],CODE
LOW⚡tests/unit/Validators/AttributesTest.php103 [new WithAttributes('Jane Doe', '2017-11-30')],CODE
LOW⚡tests/unit/Validators/AttributesTest.php106 [new WithAttributes('John Doe', '1912-06-23', 'not an email', '+1234567890')],CODE
LOW⚡tests/unit/Validators/AttributesTest.php107 [new WithAttributes('John Doe', 'not a date', 'john.doe@gmail.com', '+1234567890')],CODE
LOW⚡tests/unit/Validators/AttributesTest.php108 [new WithAttributes('John Doe', '1912-06-23', 'john.doe@gmail.com', 'not a phone number')],CODE
LOW⚡tests/unit/Validators/AttributesTest.php115 $validAddress = new NestedAddress('123 Main St', 'Springfield');CODE
LOW⚡tests/unit/Validators/AttributesTest.php116 $input = new WithNestedAttributes('John Doe', $validAddress);CODE
LOW⚡tests/unit/Validators/AttributesTest.php125 $input = new WithNestedAttributes('John Doe', $invalidAddress);CODE
LOW⚡tests/unit/Validators/AttributesTest.php133 $invalidAddress = new NestedAddress('123 Main St', '');CODE
LOW⚡tests/unit/Validators/AttributesTest.php134 $input = new WithNestedAttributes('John Doe', $invalidAddress);CODE
LOW⚡tests/unit/Validators/AttributesTest.php143 $input = new WithNestedWithoutAttributes('John Doe', $nested);CODE
LOW⚡tests/unit/Validators/AttributesTest.php151 $input = new WithNullableNestedAttributes('John Doe', null);CODE
LOW⚡tests/unit/Validators/AttributesTest.php159 $validAddress = new NestedAddress('123 Main St', 'Springfield');CODE
LOW⚡tests/unit/Validators/AttributesTest.php160 $input = new WithNullableNestedAttributes('John Doe', $validAddress);CODE
LOW⚡tests/unit/Validators/AttributesTest.php169 $input = new WithNullableNestedAttributes('John Doe', $invalidAddress);CODE
LOW⚡tests/unit/Validators/AttributesTest.php180 $input = new WithDeeplyNestedAttributes('John Doe', $top);CODE
LOW⚡tests/unit/Validators/AttributesTest.php191 $input = new WithDeeplyNestedAttributes('John Doe', $top);CODE
LOW⚡tests/unit/Validators/AttributesTest.php199 $input = new WithUnionTypeNested('John Doe', '123 Main St');CODE
LOW⚡tests/unit/Validators/AttributesTest.php199 $input = new WithUnionTypeNested('John Doe', '123 Main St');CODE
LOW⚡tests/unit/Validators/AttributesTest.php207 $validAddress = new NestedAddress('123 Main St', 'Springfield');CODE
LOW⚡tests/unit/Validators/AttributesTest.php208 $input = new WithUnionTypeNested('John Doe', $validAddress);CODE
LOW⚡tests/unit/Validators/AttributesTest.php217 $input = new WithUnionTypeNested('John Doe', $invalidAddress);CODE
LOW⚡tests/unit/Validators/AttributesTest.php225 $input = new WithDnfUnionTypeNested(new NestedAddress('123 Main St', 'Springfield'));CODE
LOW⚡tests/unit/Validators/AttributesTest.php267 $validAddress = new NestedWithAttributes('123 Main St', 'Springfield');CODE
LOW⚡tests/unit/Validators/AttributesTest.php268 $input = new WithIntersectionTypeNested('John Doe', $validAddress);CODE
LOW⚡tests/unit/Validators/AttributesTest.php277 $input = new WithIntersectionTypeNested('John Doe', $invalidAddress);CODE
LOW⚡tests/unit/Validators/AttributesTest.php285 $validAddress = new NestedAddress('123 Main St', 'Springfield');CODE
LOW⚡tests/unit/Validators/AttributesTest.php286 $input = new WithExplicitAttributesOnNested('John Doe', $validAddress);CODE
LOW⚡tests/unit/Validators/AttributesTest.php295 $input = new WithExplicitAttributesOnNested('John Doe', $invalidAddress);CODE
LOW⚡tests/unit/Validators/AttributesTest.php303 $input = new WithAttributesNotLastOnNested(new NestedAddress('123 Main St', 'Springfield'));CODE
LOW⚡tests/unit/Validators/AttributesTest.php311 $input = new WithWrappedAttributesOnNested(new NestedAddress('123 Main St', 'Springfield'));CODE
LOW⚡tests/unit/Validators/AttributesTest.php347 $input = new WithOverlappingUnionTypeNested(new NestedWithAttributes('123 Main St', 'Springfield'));CODE
LOW⚡tests/unit/Validators/AttributesTest.php355 $address = new NestedAddress('123 Main St', 'Springfield');CODE
LOW⚡tests/unit/Validators/AttributesTest.php364 $input = new WithNestedAttributes('John Doe', new NestedAddress('123 Main St', 'Springfield'));CODE
LOW⚡tests/unit/Validators/AttributesTest.php364 $input = new WithNestedAttributes('John Doe', new NestedAddress('123 Main St', 'Springfield'));CODE
LOW⚡tests/unit/Validators/AttributesTest.php387 $input = new WithCyclicAttributes('John Doe', $node);CODE
LOW⚡tests/unit/Validators/AttributesTest.php400 $input = new WithCyclicAttributes('John Doe', $nodeA);CODE
LOWtests/feature/Validators/StartsWithTest.php33 fn() => v::startsWith('Mr.', 'Dr.')->assert('John Doe'),CODE
LOWtests/feature/Validators/StartsWithTest.php34 fn(string $message) => expect($message)->toBe('"John Doe" must start with "Mr." or "Dr."'),CODE
LOWtests/feature/Validators/KeySetTest.php339 'name' => 'John Doe',CODE
LOWtests/feature/Validators/EndsWithTest.php35 fn() => v::endsWith('Mr.', 'Dr.')->assert('John Doe'),CODE
LOWtests/feature/Validators/EndsWithTest.php36 fn(string $message) => expect($message)->toBe('"John Doe" must end with "Mr." or "Dr."'),CODE
LOWtests/feature/Validators/AttributesTest.php31 fn() => v::attributes()->assert(new WithAttributes('John Doe', '2024-06-23', 'john.doe@gmail.com', '+1234567890')),CODE
LOWtests/feature/Validators/AttributesTest.php47 fn() => v::attributes()->assert(new WithAttributes('John Doe', '2024-06-23', 'john.doe@gmail.com', 'not a phone numbCODE
LOW⚡tests/feature/Validators/AttributesTest.php81 fn() => v::attributes()->assert(new WithAttributes('John Doe', '2024-06-23')),CODE
LOW⚡tests/feature/Validators/AttributesTest.php85 - `Respect\Validation\Test\Stubs\WithAttributes { +$name="John Doe" +$birthdate="2024-06-23" #$phone=null +$addrCODE
LOW⚡tests/feature/Validators/AttributesTest.php91 '__root__' => '`Respect\Validation\Test\Stubs\WithAttributes { +$name="John Doe" +$birthdate="2024-06-23CODE
LOW⚡tests/feature/Validators/AttributesTest.php99 fn() => v::attributes()->assert(new WithAttributes('John Doe', '22 years ago', 'john.doe@gmail.com')),CODE
LOW⚡tests/feature/Validators/AttributesTest.php107 fn() => v::attributes()->assert(new WithNestedAttributes('John Doe', new NestedAddress('', 'Springfield'))),CODE
LOW⚡tests/feature/Validators/AttributesTest.php115 fn() => v::attributes()->assert(new WithUnionTypeNested('John Doe', new NestedAddress('', 'Springfield'))),CODE
LOWtests/feature/Validators/AttributesTest.php131 fn() => v::attributes()->assert(new WithIntersectionTypeNested('John Doe', new NestedWithAttributes('', 'SpringfieldCODE
LOWtests/feature/Validators/AttributesTest.php142 v::attributes()->assert(new WithCyclicAttributes('John Doe', $node));CODE
LOWdocs/handling-results.md29$result = v::email()->validate('user@example.com');CODE
LOWdocs/migrating-from-v2-to-v3.md709v::keyExists('email')->assert(['email' => 'user@example.com']); // passesCODE
LOWdocs/migrating-from-v2-to-v3.md833v::nullOrEmail()->assert('user@example.com'); // passesCODE
LOWdocs/migrating-from-v2-to-v3.md844v::keyEmail('email')->assert(['email' => 'user@example.com']); // passesCODE
26 more matches not shown…
Over-Commented Block2 hits · 2 pts
SeverityFileLineSnippetContext
LOWtests/benchmark/ValidatorBench.php21 /** @param array<Validator, mixed> $params */COMMENT
LOWdocs/validators/Attributes.md61v::attributes()->assert(new Person('John Doe', '2020-06-23'));COMMENT