AI Slop Code RIsk Monitor

PHPOffice/PhpSpreadsheet

A pure PHP library for reading and writing spreadsheet files

4.4 Low pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for PHPOffice/PhpSpreadsheet, a PHP project with 13,995 GitHub stars. SynthScan examined 341,893 lines of code across 2795 source files, recording 1441 pattern matches distributed across 5 syntactic categories. The legacy adjusted pattern signal is 4.4 (Low 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.

4.4
Adjusted Signal
4.4
Raw Pattern Score
100%
Time Factor
2026-10-09
Last Push
14.0K
Stars
PHP
Language
341.9K
Lines of Code
2.8K
Files
1.4K
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 19.5/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.5/100 · LOW

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

Agent Over-Engineering Ratio 18.6/100 · LOW

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

PR Review Velocity Impact 19.1/100 · LOW

Which changes need focused human review? 1441 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 1HIGH 0MEDIUM 1LOW 1439

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 1441 distinct pattern matches across 5 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 Identifiers1351 hits · 1410 pts
SeverityFileLineSnippetContext
LOWinfra/LocaleGenerator.php129 protected function writeConfigArgumentSeparator($configFile, string $column): voidCODE
LOWinfra/LocaleGenerator.php145 protected function writeConfigCurrencySymbol($configFile, string $column): voidCODE
LOWinfra/LocaleGenerator.php163 protected function buildFunctionsFileForLocale(string $column, string $locale): voidCODE
LOWinfra/DocumentGenerator.php22 public static function generateFunctionListByCategory($phpSpreadsheetFunctions): stringCODE
LOWinfra/DocumentGenerator.php74 private static function getPhpSpreadsheetFunctionText(mixed $functionCall): stringCODE
LOWinfra/DocumentGenerator.php94 public static function generateFunctionListByName(array $phpSpreadsheetFunctions, bool $compact = false): stringCODE
LOWtests/Benchmark/CsvStreamingEncodingTest.php65 public static function providerExistingEncodings(): arrayCODE
LOWtests/Benchmark/CsvStreamingEncodingTest.php290 public function testLargeFileProducesCorrectResults(): voidCODE
LOWtests/Benchmark/CsvStreamingEncodingTest.php572 public function testLoadFromStringWithConvertedEncoding(): voidCODE
LOWtests/Benchmark/CsvStreamingEncodingTest.php591 public function testGuessEncodingWithStreaming(string $filename): voidCODE
LOWtests/Benchmark/CsvStreamingEncodingTest.php602 public static function providerGuessEncodingStreaming(): arrayCODE
LOWtests/Benchmark/SpreadsheetCopyBenchmarkTest.php31 private function createPopulatedSpreadsheet(): SpreadsheetCODE
LOWtests/Benchmark/SpreadsheetCopyBenchmarkTest.php114 public function testCloneVsSerializeBenchmark(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php80 public function testStreamingLoadsIdenticalToSimpleXml(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php113 public function testStreamingNumericCells(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php127 public function testStreamingSharedStrings(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php141 public function testStreamingBooleanCells(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php153 public function testStreamingFormulaCells(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php171 public function testStreamingBooleanFormulaCalculatedValue(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php184 public function testStreamingWithExistingXlsxFile(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php228 public function testStreamingInlineString(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php292 public function testStreamingMultipleSheets(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php330 public function testStreamingLargeCoordinates(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php359 public function testStreamingDateFormattedCells(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php399 public function testStreamingStyleIndexHandling(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php446 public function testStreamingSharedFormulas(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php505 public function testStreamingReadDataOnlyFalseWithFormulas(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php536 public function testStreamingEmptyValueCells(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php571 public function testStreamingCalculatedValuePreserved(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php597 public function testStreamingStringFormula(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php623 public function testStreamingRealSharedFormulae(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadTest.php686 public function testStreamingFullComparisonWithStyles(): voidCODE
LOWtests/Benchmark/XlsxStreamingReaderBenchmarkTest.php89 public function testStreamingReaderPerformanceAndCorrectness(): voidCODE
LOWtests/Benchmark/FormulaTokenCacheBenchmarkTest.php41 public function testParseFormulaCacheEnabledVsDisabled(): voidCODE
LOWtests/Benchmark/FormulaTokenCacheBenchmarkTest.php108 public function testParseFormulaCacheVsNocache(): voidCODE
LOWtests/Benchmark/LargeXlsxWriteBenchmarkTest.php24 public function testPopulateAndSaveLargeSheet(): voidCODE
LOWtests/Benchmark/CsvStreamingEncodingBenchmarkTest.php175 public function testMemoryScalingWithFileSize(): voidCODE
LOWtests/Benchmark/XlsxStreamingReadClass.php353 private function storeStreamingFormulaAttributes(SimpleXMLElement $f, Worksheet $docSheet, string $r): voidCODE
LOWtests/PhpSpreadsheetTests/IOFactoryRegisterTest.php36 public function testRegisterInvalidWriter(): voidCODE
LOWtests/PhpSpreadsheetTests/IOFactoryRegisterTest.php43 public function testRegisterInvalidReader(): voidCODE
LOWtests/PhpSpreadsheetTests/DefinedNameTest.php41 public function testAddDuplicateDefinedName(): voidCODE
LOWtests/PhpSpreadsheetTests/DefinedNameTest.php56 public function testAddScopedDefinedNameWithSameName(): voidCODE
LOWtests/PhpSpreadsheetTests/DefinedNameTest.php89 public function testRemoveGlobalDefinedName(): voidCODE
LOWtests/PhpSpreadsheetTests/DefinedNameTest.php101 public function testRemoveGlobalDefinedNameWhenDuplicateNames(): voidCODE
LOWtests/PhpSpreadsheetTests/DefinedNameTest.php118 public function testRemoveScopedDefinedNameWhenDuplicateNames(): voidCODE
LOWtests/PhpSpreadsheetTests/DefinedNameTest.php135 public function testDefinedNameNoWorksheetNoScope(): voidCODE
LOWtests/PhpSpreadsheetTests/NamedFormulaTest.php42 public function testAddDuplicateNamedRange(): voidCODE
LOWtests/PhpSpreadsheetTests/NamedFormulaTest.php60 public function testAddScopedNamedFormulaWithSameName(): voidCODE
LOWtests/PhpSpreadsheetTests/NamedFormulaTest.php98 public function testRemoveGlobalNamedFormulaWhenDuplicateNames(): voidCODE
LOWtests/PhpSpreadsheetTests/NamedFormulaTest.php118 public function testRemoveScopedNamedFormulaWhenDuplicateNames(): voidCODE
LOWtests/PhpSpreadsheetTests/NamedFormulaTest.php138 public function testRemoveNonExistentNamedFormula(): voidCODE
LOWtests/PhpSpreadsheetTests/SpreadsheetCopyCloneTest.php216 public function testCopySheetCountMatches(string $type): voidCODE
LOWtests/PhpSpreadsheetTests/SpreadsheetCopyCloneTest.php268 public function testCopyNamedRangesReferenceNewSpreadsheet(string $type): voidCODE
LOWtests/PhpSpreadsheetTests/SpreadsheetCopyCloneTest.php294 public function testCopyCanBeSavedWithoutErrors(string $type): voidCODE
LOWtests/PhpSpreadsheetTests/SpreadsheetCopyCloneTest.php333 public function testCopyWorksheetsAreIndependent(string $type): voidCODE
LOWtests/PhpSpreadsheetTests/RichTextTest.php15 public function testConstructorSpecifyingCell(): voidCODE
LOW⚡tests/PhpSpreadsheetTests/ReferenceHelperTest.php121 public function testUpdateFormulaForMultipleWorksheets(string $formula, int $insertRows, int $insertColumns, string CODE
LOW⚡tests/PhpSpreadsheetTests/ReferenceHelperTest.php130 public static function providerMultipleWorksheetFormulaUpdates(): arrayCODE
LOW⚡tests/PhpSpreadsheetTests/ReferenceHelperTest.php135 public function testInsertNewBeforeRetainDataType(): voidCODE
LOWtests/PhpSpreadsheetTests/ReferenceHelperTest.php154 public function testRemoveColumnShiftsCorrectColumnValueIntoRemovedColumnCoordinates(): voidCODE
1291 more matches not shown…
Over-Commented Block71 hits · 71 pts
SeverityFileLineSnippetContext
LOWmkdocs.mkdocs.yml21 # These are used on features-cross-reference page.COMMENT
LOWtests/PhpSpreadsheetTests/Chart/ChartCloneTest.php201 ), // 2011COMMENT
LOWtests/PhpSpreadsheetTests/Chart/ChartMethodTest.php41 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1', null, 1), // 2010COMMENT
LOW…/PhpSpreadsheetTests/Chart/GridlinesShadowGlowTest.php61 // Cell reference for dataCOMMENT
LOWtests/PhpSpreadsheetTests/Chart/AxisGlowTest.php41 ['Q4', 30, 32, 0],COMMENT
LOWtests/PhpSpreadsheetTests/Chart/AxisGlowTest.php61 // Number of datapoints in seriesCOMMENT
LOWtests/PhpSpreadsheetTests/Chart/AxisGlowTest.php181 ];COMMENT
LOWtests/PhpSpreadsheetTests/Chart/DataTableTest.php81 ];COMMENT
LOWtests/PhpSpreadsheetTests/Chart/LegendColorTest.php61 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1', null, 1), //Max / OpenCOMMENT
LOWtests/PhpSpreadsheetTests/Chart/AxisPropertiesTest.php61 // Format CodeCOMMENT
LOWtests/PhpSpreadsheetTests/Chart/MultiplierTest.php41 $dataSeriesLabels = [COMMENT
LOWtests/PhpSpreadsheetTests/Chart/PR3163Test.php61 // DatatypeCOMMENT
LOWtests/PhpSpreadsheetTests/Chart/PieFillTest.php61 DataSeriesValues::DATASERIES_TYPE_STRING,COMMENT
LOW…s/PhpSpreadsheetTests/Chart/GridlinesLineStyleTest.php61 // Cell reference for dataCOMMENT
LOW…s/PhpSpreadsheetTests/Chart/GridlinesLineStyleTest.php241 );COMMENT
LOWtests/PhpSpreadsheetTests/Chart/DataSeriesColorTest.php61 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1', null, 1), // was 2010COMMENT
LOW…ts/PhpSpreadsheetTests/Chart/DataSeriesValues2Test.php41 ]COMMENT
LOWtests/PhpSpreadsheetTests/Chart/AxisShadowTest.php41 ['Q4', 30, 32, 0],COMMENT
LOWtests/PhpSpreadsheetTests/Chart/AxisShadowTest.php61 // Number of datapoints in seriesCOMMENT
LOWtests/data/Calculation/Statistical/LINEST.php81 ],COMMENT
LOWtests/data/Calculation/Statistical/LINEST.php101 // [2517, 4, 4, 55],COMMENT
LOWtests/data/Calculation/Statistical/COUNTIFS.php21 ['C', 'B', 'A', 'B', 'B'],COMMENT
LOWtests/data/Calculation/Statistical/LOGEST.php41 [COMMENT
LOWtests/data/Calculation/Statistical/LOGEST.php61 // [COMMENT
LOWsamples/Chart33a/33_Chart_create_area.php21 ['Q4', 30, 32, 0],COMMENT
LOWsamples/Chart33a/33_Chart_create_area.php41// Number of datapoints in seriesCOMMENT
LOWsamples/Chart33a/33_Chart_create_column.php21 ['Q4', 30, 32, 0],COMMENT
LOWsamples/Chart33a/33_Chart_create_column.php41// Number of datapoints in seriesCOMMENT
LOWsamples/Chart33a/33_Chart_create_bar_stacked.php21 ['Q4', 30, 32, 0],COMMENT
LOWsamples/Chart33a/33_Chart_create_bar_stacked.php41// Number of datapoints in seriesCOMMENT
LOWsamples/Chart33a/33_Chart_create_bar_custom_colors.php41// Set the X-Axis LabelsCOMMENT
LOWsamples/Chart33a/33_Chart_create_bar_custom_colors.php101// Add the chart to the worksheetCOMMENT
LOWsamples/Chart33a/33_Chart_create_bar_custom_colors.php121// Data valuesCOMMENT
LOWsamples/Chart33a/33_Chart_create_line.php41// Cell reference for dataCOMMENT
LOWsamples/Chart33a/33_Chart_create_column_2.php41 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$C$1', null, 1), // 'Budget'COMMENT
LOWsamples/Chart33a/33_Chart_create_bubble.php41COMMENT
LOWsamples/Chart33a/33_Chart_create_area_2.php41// DatatypeCOMMENT
LOWsamples/Chart33a/33_Chart_create_area_3.php41 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$D$1', null, 1), // 2012COMMENT
LOWsamples/Chart33a/33_Chart_create_bar_labels_lines.php41$dataSeriesLabels1 = [COMMENT
LOWsamples/Chart33a/33_Chart_create_bar_labels_lines.php141// Set the X-Axis LabelsCOMMENT
LOWsamples/Chart33b/33_Chart_create_multiple_charts.php21 ['Q4', 30, 32, 0],COMMENT
LOWsamples/Chart33b/33_Chart_create_multiple_charts.php41// Number of datapoints in seriesCOMMENT
LOWsamples/Chart33b/33_Chart_create_multiple_charts.php101// Cell reference for dataCOMMENT
LOWsamples/Chart33b/33_Chart_create_pie_custom_colors.php41// Set the X-Axis LabelsCOMMENT
LOWsamples/Chart33b/33_Chart_create_pie_custom_colors.php101// Add the chart to the worksheetCOMMENT
LOWsamples/Chart33b/33_Chart_create_pie_custom_colors.php121// Data valuesCOMMENT
LOW…mples/Chart33b/33_Chart_create_scatter5_trendlines.php61// DatatypeCOMMENT
LOWsamples/Chart33b/33_Chart_create_scatter3.php41 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$C$1', null, 1), // was 2011COMMENT
LOWsamples/Chart33b/33_Chart_create_scatter2.php41 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1', null, 1), // was 2010COMMENT
LOWsamples/Chart33b/33_Chart_create_stock2.php41 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1', null, 1), //Max / OpenCOMMENT
LOWsamples/Chart33b/33_Chart_create_pie.php21 ['Q3', 52, 61, 69],COMMENT
LOWsamples/Chart33b/33_Chart_create_pie.php101// DatatypeCOMMENT
LOWsamples/Chart33b/33_Chart_create_radar.php41$dataSeriesLabels = [COMMENT
LOWsamples/Chart33b/33_Chart_create_stock.php41 new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1', null, 1), //Max / OpenCOMMENT
LOWsamples/templates/chartSpreadsheet.php21);COMMENT
LOWsrc/PhpSpreadsheet/Reader/Xls.php41// Modelled moreso after Perl Excel Parse/Write modulesCOMMENT
LOWsrc/PhpSpreadsheet/Reader/Xls.php401 if (!isset($this->summaryInformation)) {COMMENT
LOWsrc/PhpSpreadsheet/Reader/Xls/Escher.php221COMMENT
LOWsrc/PhpSpreadsheet/Reader/Xls/LoadSpreadsheet.php621COMMENT
LOWsrc/PhpSpreadsheet/Worksheet/AutoFilter/Column/Rule.php161 // Unimplemented Rule Operators (Numeric, Boolean etc)COMMENT
11 more matches not shown…
Fake / Example Data17 hits · 22 pts
SeverityFileLineSnippetContext
LOWtests/PhpSpreadsheetTests/Writer/Ods/ContentTest.php66 $worksheet1->setCellValue('E1', 'Lorem ipsum'); // StringCODE
LOWtests/PhpSpreadsheetTests/Writer/Ods/ContentTest.php88 $worksheet1->setCellValueExplicit('G1', 'Lorem ipsum', DataType::TYPE_INLINE);CODE
LOW…s/PhpSpreadsheetTests/Writer/Html/TextRotationTest.php19 $sheet->setCellValue('A7', 'Lorem Ipsum');CODE
LOW…s/PhpSpreadsheetTests/Writer/Mpdf/TextRotationTest.php19 $sheet->setCellValue('A7', 'Lorem Ipsum');CODE
LOW…PhpSpreadsheetTests/Writer/Dompdf/TextRotationTest.php19 $sheet->setCellValue('A7', 'Lorem Ipsum');CODE
LOW…pSpreadsheetTests/Writer/Dompdf/PaperSizeArrayTest.php36 $sheet->setCellValue('A7', 'Lorem Ipsum');CODE
LOW…pSpreadsheetTests/Writer/Dompdf/PaperSizeArrayTest.php56 $sheet->setCellValue('A7', 'Lorem Ipsum');CODE
LOWtests/data/Writer/Ods/content-with-data.xml87 <text:p>Lorem ipsum</text:p>CODE
LOWtests/data/Writer/Ods/content-with-data.xml93 <text:p>Lorem ipsum</text:p>CODE
LOWsamples/Pdf/21b_Pdf.php12 $lorem = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolCODE
LOWsamples/Pdf/21b_Pdf.php12 $lorem = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolCODE
LOW⚡samples/templates/sampleSpreadsheet2.php322// Llorem ipsum...COMMENT
LOW⚡samples/templates/sampleSpreadsheet2.php323$sLloremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus eget ante. Sed cursus nunc semper torCODE
LOW⚡samples/templates/sampleSpreadsheet2.php323$sLloremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus eget ante. Sed cursus nunc semper torCODE
LOW⚡samples/templates/sampleSpreadsheet.php322// Llorem ipsum...COMMENT
LOW⚡samples/templates/sampleSpreadsheet.php323$sLloremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus eget ante. Sed cursus nunc semper torCODE
LOW⚡samples/templates/sampleSpreadsheet.php323$sLloremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus eget ante. Sed cursus nunc semper torCODE
Hallucination Indicators1 hit · 10 pts
SeverityFileLineSnippetContext
CRITICALsamples/bootstrap/js/jquery.min.js2!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):fCODE
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMsrc/PhpSpreadsheet/Reader/Xlsx.php2121 // But in some cases, this attribute isn't set; so we need to delve a level deeper and look atCOMMENT