AI Slop Code RIsk Monitor

sebastianbergmann/comparator

Provides the functionality to compare PHP values for equality.

12.9 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for sebastianbergmann/comparator, a PHP project with 7,045 GitHub stars. SynthScan examined 7,392 lines of code across 69 source files, recording 91 pattern matches distributed across 1 syntactic category. The legacy adjusted pattern signal is 12.9 (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.

12.9
Adjusted Signal
12.9
Raw Pattern Score
100%
Time Factor
2026-10-09
Last Push
7.0K
Stars
PHP
Language
7.4K
Lines of Code
69
Files
91
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 47.4/100 · MEDIUM

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

Hallucinated Dependency & Supply Chain Risk 0.0/100 · LOW

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

Agent Over-Engineering Ratio 47.4/100 · MEDIUM

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

PR Review Velocity Impact 46.0/100 · MEDIUM

Which changes need focused human review? 91 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 91

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 91 distinct pattern matches across 1 syntactic category. 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 Identifiers91 hits · 95 pts
SeverityFileLineSnippetContext
LOWtests/unit/DateTimeComparatorTest.php46 public static function assertEqualsSucceedsProvider(): arrayCODE
LOWtests/unit/DateTimeComparatorTest.php105 public static function assertEqualsFailsProvider(): arrayCODE
LOWtests/unit/DateTimeComparatorTest.php195 public function testAcceptsDateTimeInterface(): voidCODE
LOWtests/unit/DateTimeComparatorTest.php200 public function testAssertEqualsSkipsAlreadyProcessedPair(): voidCODE
LOWtests/unit/DateTimeComparatorTest.php220 public function testAssertEqualsSkipsAlreadyProcessedPairInReverseOrder(): voidCODE
LOWtests/unit/DateTimeComparatorTest.php240 public function testAssertEqualsRecordsProcessedPair(): voidCODE
LOWtests/unit/ComparisonFailureTest.php89 public function testCanBeSerializedAndUnserialized(): voidCODE
LOWtests/unit/ComparisonFailureTest.php112 public function testCanBeSerializedWhenStackTraceContainsNonSerializableObject(): voidCODE
LOWtests/unit/ComparisonFailureTest.php133 private function createFailureWithNonSerializableTraceArgument(NonSerializableClass $instance): ComparisonFailureCODE
LOWtests/unit/NumericComparatorTest.php71 public static function assertEqualsSucceedsProvider(): arrayCODE
LOWtests/unit/NumericComparatorTest.php104 public static function assertEqualsFailsProvider(): arrayCODE
LOWtests/unit/SplObjectStorageComparatorTest.php43 public static function assertEqualsSucceedsProvider(): arrayCODE
LOWtests/unit/SplObjectStorageComparatorTest.php70 public static function assertEqualsFailsProvider(): arrayCODE
LOWtests/unit/ClosureComparatorTest.php73 public static function assertEqualsSucceedsProvider(): arrayCODE
LOWtests/unit/ClosureComparatorTest.php107 public static function assertEqualsFailsProvider(): arrayCODE
LOWtests/unit/ClosureComparatorTest.php198 public function testRecordsClosureComparisonInFactory(): voidCODE
LOWtests/unit/ClosureComparatorTest.php213 public function testAsStringComparisonFormat(): voidCODE
LOWtests/unit/ObjectComparatorTest.php57 public static function assertEqualsSucceedsProvider(): arrayCODE
LOWtests/unit/ObjectComparatorTest.php86 public static function assertEqualsFailsProvider(): arrayCODE
LOWtests/unit/ObjectComparatorTest.php169 public function testRepresentationProvidedByObjectExporterIsUsedWhenComparisonFails(): voidCODE
LOWtests/unit/ObjectComparatorTest.php183 public function testDefaultRepresentationIsUsedWhenObjectExporterDoesNotHandleObjects(): voidCODE
LOWtests/unit/ObjectComparatorTest.php197 private function comparatorWithObjectExporter(): ObjectComparatorCODE
LOWtests/unit/DOMNodeComparatorTest.php61 public static function assertEqualsSucceedsProvider(): arrayCODE
LOWtests/unit/DOMNodeComparatorTest.php107 public static function assertEqualsFailsProvider(): arrayCODE
LOWtests/unit/DOMNodeComparatorTest.php152 public static function assertEqualsSucceedsWhenCanonicalizationFailsProvider(): arrayCODE
LOWtests/unit/DOMNodeComparatorTest.php178 public static function assertEqualsFailsWhenCanonicalizationFailsProvider(): arrayCODE
LOWtests/unit/DOMNodeComparatorTest.php238 public function testAssertEqualsSucceedsWhenCanonicalizationFails(DOMDocument|DOMNode $expected, DOMDocument|DOMNodeCODE
LOWtests/unit/DOMNodeComparatorTest.php251 public function testAssertEqualsFailsWhenCanonicalizationFails(DOMDocument|DOMNode $expected, DOMDocument|DOMNode $aCODE
LOWtests/unit/DOMNodeComparatorTest.php259 public function testFailingComparisonOfNonAsciiContentProducesReadableDiff(): voidCODE
LOWtests/unit/EnumerationComparatorTest.php61 public static function assertEqualsSucceedsProvider(): arrayCODE
LOWtests/unit/EnumerationComparatorTest.php73 public static function assertEqualsFailsProvider(): arrayCODE
LOWtests/unit/ExceptionComparatorTest.php58 public static function assertEqualsSucceedsProvider(): arrayCODE
LOWtests/unit/ExceptionComparatorTest.php77 public static function assertEqualsFailsProvider(): arrayCODE
LOWtests/unit/DateIntervalComparatorTest.php46 public static function assertEqualsSucceedsProvider(): arrayCODE
LOWtests/unit/DateIntervalComparatorTest.php81 public static function assertEqualsFailsProvider(): arrayCODE
LOWtests/unit/DateIntervalComparatorTest.php135 public function testAssertEqualsSkipsAlreadyProcessedPair(): voidCODE
LOWtests/unit/DateIntervalComparatorTest.php155 public function testAssertEqualsSkipsAlreadyProcessedPairInReverseOrder(): voidCODE
LOWtests/unit/DateIntervalComparatorTest.php175 public function testAssertEqualsRecordsProcessedPair(): voidCODE
LOW⚡tests/unit/MockObjectComparatorTest.php37 public function testAcceptsMockOfSameInstance(): voidCODE
LOW⚡tests/unit/MockObjectComparatorTest.php44 public function testAcceptsMockOfStdClass(): voidCODE
LOW⚡tests/unit/MockObjectComparatorTest.php51 public function testAcceptsMocksOfDifferentClasses(): voidCODE
LOW⚡tests/unit/MockObjectComparatorTest.php61 public function testDoesNotAcceptMockAndNull(): voidCODE
LOW⚡tests/unit/MockObjectComparatorTest.php71 public function testDoesNotAcceptNullAndMock(): voidCODE
LOW⚡tests/unit/MockObjectComparatorTest.php81 public function testDoesNotAcceptTwoNullValues(): voidCODE
LOW⚡tests/unit/MockObjectComparatorTest.php86 public function testAssertEqualsSucceedsForSameMockInstance(): voidCODE
LOW⚡tests/unit/MockObjectComparatorTest.php96 public function testAssertEqualsSucceedsForEqualMockInstances(): voidCODE
LOWtests/unit/MockObjectComparatorTest.php111 public function testAssertEqualsSucceedsForSameCyclicMock(): voidCODE
LOWtests/unit/MockObjectComparatorTest.php125 public function testAssertEqualsSucceedsForEqualCyclicMocks(): voidCODE
LOWtests/unit/MockObjectComparatorTest.php148 public function testAssertEqualsSucceedsForStructValuesWithinDelta(): voidCODE
LOWtests/unit/MockObjectComparatorTest.php163 public function testAssertEqualsFailsForDifferentMockInstances(): voidCODE
LOWtests/unit/MockObjectComparatorTest.php181 public function testAssertEqualsFailsForUnequalCyclicMocks(): voidCODE
LOWtests/unit/MockObjectComparatorTest.php207 public function testAssertEqualsFailsForMocksOfDifferentClasses(): voidCODE
LOWtests/unit/MockObjectComparatorTest.php221 public function testAssertEqualsFailsForStructValuesOutsideDelta(): voidCODE
LOWtests/unit/ScalarComparatorTest.php69 public static function assertEqualsSucceedsProvider(): arrayCODE
LOWtests/unit/ScalarComparatorTest.php98 public static function assertEqualsFailsProvider(): arrayCODE
LOWtests/unit/ScalarComparatorTest.php135 public static function assertEqualsFailsWithDiffProvider(): arrayCODE
LOWtests/unit/ScalarComparatorTest.php235 public function testAssertEqualsFailsWithDiff(string $expectedDiff, string $expected, string $actual): voidCODE
LOWtests/unit/TypeComparatorTest.php44 public static function assertEqualsSucceedsProvider(): arrayCODE
LOWtests/unit/TypeComparatorTest.php63 public static function assertEqualsFailsProvider(): arrayCODE
LOWtests/unit/ResourceComparatorTest.php59 public static function assertEqualsSucceedsProvider(): arrayCODE
31 more matches not shown…