AI Slop Code Risk Monitor

FreshRSS/FreshRSS

SlopCodeMonitor badge for FreshRSS/FreshRSS Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

A free, self-hostable news aggregator…

1.5 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for FreshRSS/FreshRSS, a PHP project with 16,469 GitHub stars. SynthScan examined 192,718 lines of code across 932 source files, recording 243 pattern matches distributed across 7 syntactic categories. The legacy adjusted pattern signal is 1.5 (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.

1.5
Adjusted Signal
1.5
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
16.5K
Stars
PHP
Language
192.7K
Lines of Code
932
Files
243
Pattern Hits
2026-10-31
Scan Date
0.00
HC Hit Rate

Risk Review · Payload v1

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

Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.

Cognitive Ownership Risk 6.8/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.2/100 · LOW

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

Agent Over-Engineering Ratio 5.9/100 · LOW

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

PR Review Velocity Impact 6.4/100 · LOW

Which changes need focused human review? 243 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 1MEDIUM 3LOW 239

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 243 distinct pattern matches across 7 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 Identifiers214 hits · 235 pts
SeverityFileLineSnippetContext
LOWapp/Models/Feed.php425 public function newestArticleReceivedDate(): int {CODE
LOWapp/Models/Feed.php435 public function newestArticlePublicationDate(): int {CODE
LOWapp/Models/Feed.php974 private function dotNotationForStandardJsonFeed(): array {CODE
LOWapp/Models/StatsDAOSQLite.php29 protected function calculateEntryRepartitionPerFeedPerPeriod(string $period, ?int $feed = null): array {CODE
LOWapp/Models/Search.php1323 private function parseNotModifiedDateSearch(string $input): string {CODE
LOWapp/Models/CategoryDAO.php361 public function listCategoriesOrderUpdate(int $defaultCacheDuration = 86400, int $limit = 0): array {CODE
LOWapp/Models/CategoryDAO.php488 private static function daoToCategoriesPrepopulated(array $listDAO): array {CODE
LOW⚡app/Models/StatsDAOPGSQL.php27 public function calculateEntryRepartitionPerFeedPerHour(?int $feed = null): array {CODE
LOW⚡app/Models/StatsDAOPGSQL.php36 public function calculateEntryRepartitionPerFeedPerDayOfWeek(?int $feed = null): array {CODE
LOW⚡app/Models/StatsDAOPGSQL.php45 public function calculateEntryRepartitionPerFeedPerMonth(?int $feed = null): array {CODE
LOW⚡app/Models/StatsDAOPGSQL.php55 protected function calculateEntryRepartitionPerFeedPerPeriod(string $period, ?int $feed = null): array {CODE
LOWapp/Models/StatsDAO.php41 public function calculateEntryRepartition(): array {CODE
LOWapp/Models/StatsDAO.php58 public function calculateEntryRepartitionPerFeed(?int $feed = null, bool $only_main = false): array|false {CODE
LOW⚡app/Models/StatsDAO.php126 public function calculateEntryRepartitionPerFeedPerHour(?int $feed = null): array {CODE
LOW⚡app/Models/StatsDAO.php134 public function calculateEntryRepartitionPerFeedPerDayOfWeek(?int $feed = null): array {CODE
LOW⚡app/Models/StatsDAO.php142 public function calculateEntryRepartitionPerFeedPerMonth(?int $feed = null): array {CODE
LOWapp/Models/StatsDAO.php154 protected function calculateEntryRepartitionPerFeedPerPeriod(string $period, ?int $feed = null): array {CODE
LOW⚡app/Models/StatsDAO.php190 public function calculateEntryAveragePerFeedPerHour(?int $feed = null): float {CODE
LOW⚡app/Models/StatsDAO.php197 public function calculateEntryAveragePerFeedPerDayOfWeek(?int $feed = null): float {CODE
LOW⚡app/Models/StatsDAO.php204 public function calculateEntryAveragePerFeedPerMonth(?int $feed = null): float {CODE
LOW⚡app/Models/StatsDAO.php212 public static function calculateEntryAverageFromRepartition(array $repartition): float {CODE
LOW⚡app/Models/StatsDAO.php220 protected function calculateEntryAveragePerFeedPerPeriod(float $period, ?int $feed = null): float {CODE
LOWapp/Models/FeedDAO.php541 public function newestArticleReceivedDate(int $feedId): int {CODE
LOWapp/Models/FeedDAO.php549 public function newestArticlePublicationDate(int $feedId): int {CODE
LOWapp/Controllers/userController.php658 public function sendValidationEmailAction(): void {CODE
LOWapp/Controllers/feedController.php1309 public function contentSelectorPreviewAction(): void {CODE
LOWapp/Controllers/extensionController.php47 protected function getAvailableExtensionList(): array {CODE
LOWtests/app/Utils/dotNotationUtilTest.php50 public static function testConvertJsonToRssEscapesCategories(): void {CODE
LOWtests/app/Utils/dotNotationUtilTest.php76 public static function testConvertJsonToRssKeepsAttachments(): void {CODE
LOWtests/app/Models/SimplePieCustomTest.php93 public static function provideIncompleteTagsOrEntities(): Traversable {CODE
LOWtests/app/Models/BooleanSearchTest.php50 public static function provideTooLongOrTooDeepSearches(): array {CODE
LOWtests/app/Models/FeedTest.php38 public static function provideStoredAndRequestedUrls(): array {CODE
LOWtests/app/Models/ContextTest.php37 public static function testAutomaticStateSurvivesUrlEncoding(): void {CODE
LOWtests/app/Models/SearchTest.php220 public static function provideModifiedDateSearch(): array {CODE
LOWtests/app/Models/SearchTest.php297 public static function provideSavedQueriesExpansion(): array {CODE
LOWtests/app/Models/SearchTest.php504 public static function provideconsistentOrParentheses(): array {CODE
LOWtests/app/Models/SearchTest.php1156 public static function testBooleanSearchToString(string $input, string $expected): void {CODE
LOWtests/app/Models/SearchTest.php1164 public static function provideBooleanSearchToString(): array {CODE
LOWtests/app/Models/SearchTest.php1213 public static function testBooleanSearchToStringExpansion(array $queries, string $input,CODE
LOWtests/app/Models/SearchTest.php1232 public static function provideBooleanSearchToStringExpansion(): array {CODE
LOWtests/app/Models/SearchTest.php1303 public static function provideBooleanSearchEnforce(): array {CODE
LOWtests/app/Models/SearchTest.php1337 public static function provideBooleanSearchRemove(): array {CODE
LOWtests/app/Models/FormAuthTest.php11 public function testReqsCheckReturnsFalseIfEmpty(): void {CODE
LOWtests/app/Models/FormAuthTest.php67 public function testReqsCheckAcceptsOtherMultibyteBoundary(): void {CODE
LOWtests/app/Models/FormAuthTest.php91 public function testAuthWithInvalidUsernameAndCorrectCredentialsFail(): void {CODE
LOWtests/app/Models/FormAuthTest.php102 public function testAuthWithValidUsernameAndWrongCredentialsFail(): void {CODE
LOWtests/app/Models/FormAuthTest.php113 public function testAuthWithValidUsernameAndCorrectCredentialsOk(): void {CODE
LOWtests/app/Models/FormAuthTest.php255 public function testAuthWithValidUsernameAndCorrectCredentialsAndEmptyPasswordFail(): void {CODE
LOWtests/app/Models/FormAuthTest.php266 public function testAuthWithValidUsernameAndCorrectCredentialsAndTooLongPasswordFail(): void {CODE
LOWtests/app/Models/FormAuthTest.php296 public function testAuthWithValidUsernameAndCorrectCredentialsAndWrongPassAlgorithmFail(): void {CODE
LOWtests/app/Models/FormAuthTest.php307 public function testAuthWithValidUsernameAndAnyCredentialsAndMalformedBcryptHashFail(): void {CODE
LOWtests/app/Models/FormAuthTest.php318 public function testAuthWithValidUsernameAndAnyCredentialsAndEmptyHashFail(): void {CODE
LOWtests/app/Models/FormAuthTest.php329 public function testAuthWithValidUsernameAndCorrectHashAsPasswordFail(): void {CODE
LOW⚡tests/app/Models/StatsDAOTest.php7 public static function testCalculateEntryAverageFromRepartition(): void {CODE
LOW⚡tests/app/Models/StatsDAOTest.php11 public static function testCalculateEntryAverageFromEmptyRepartition(): void {CODE
LOW⚡tests/app/Models/StatsDAOTest.php15 public static function testCalculateEntryAverageFromZeroRepartition(): void {CODE
LOWtests/app/Models/DatabaseDAOTest.php46 public static function provideStrilikeAccentsCasing(): array {CODE
LOWtests/app/Models/DatabaseDAOTest.php56 public static function provideStrilikeUnicodeCasing(): array {CODE
LOWtests/app/Models/DatabaseDAOTest.php83 public static function provideStrilikeNoUnicodeCasing(): array {CODE
LOW⚡tests/app/Models/UserDAOTest.php10 public function testExistsRejectsPathTraversal(string $payload): void {CODE
154 more matches not shown…
Over-Commented Block16 hits · 16 pts
SeverityFileLineSnippetContext
LOWconfig.default.php61 # `none` is without password and shows only the default user;COMMENT
LOWconfig.default.php81COMMENT
LOWconfig.default.php161COMMENT
LOWconfig.default.php261 # - 10.0.0.0/8COMMENT
LOWDocker/README.md361 LISTEN: 0.0.0.0:80COMMENT
LOWDocker/freshrss/docker-compose.yml21 - extensions:/var/www/FreshRSS/extensionsCOMMENT
LOWapp/Models/Search.php181COMMENT
LOWcli/README.md41# --base-url should be a public (routable) URL if possible, and is used for push (WebSub), for some API functions (e.g. COMMENT
LOWcli/README.md61### UserCOMMENT
LOWcli/README.md161COMMENT
LOWcli/README.md181# -o, --origin-language selects the origin language (only used with add language action).COMMENT
LOWlib/phpmailer/phpmailer/src/PHPMailer.php1901 //A space after `-f` is optional, but there is a long history of its presenceCOMMENT
LOWlib/phpmailer/phpmailer/src/PHPMailer.php5261 //Unfold header linesCOMMENT
LOWlib/Minz/FrontController.php1<?phpCOMMENT
LOWlib/simplepie/simplepie/src/Parse/Date.php181 'août' => 8,COMMENT
LOWp/i/index.php1<?phpCOMMENT
Fake / Example Data7 hits · 10 pts
SeverityFileLineSnippetContext
LOWapp/Models/SimplePieCustom.php183 'textarea' => ['cols', 'disabled', 'maxlength', 'minlength', 'placeholder', 'readonly', 'rows', 'wrap'],CODE
LOWlib/phpmailer/phpmailer/README.md111 $mail->Username = 'user@example.com'; //SMTP usernameCODE
LOWlib/phpmailer/phpmailer/src/PHPMailer.php1498 * PHPMailer::validateAddress('user@example.com', function($address) {COMMENT
LOWlib/phpmailer/phpmailer/src/PHPMailer.php1532 * * quoted elements: `'"test blah"@example.org'`COMMENT
LOW⚡data/tos.example.html3<h2>Article 1: Lorem ipsum</h2>CODE
LOW⚡data/tos.example.html6 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed fringilla,CODE
LOW⚡data/tos.example.html6 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed fringilla,CODE
Synthetic Comment Markers1 hit · 8 pts
SeverityFileLineSnippetContext
HIGHapp/Models/Feed.php623 // Retry-After is stored for the URL as requested, not as stored for the feedCOMMENT
AI Slop Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMconfig.default.php250 # Will be checked against CONN_REMOTE_ADDR (if available, to be robust even when using Apache mod_remoteip)COMMENT
MEDIUMapp/Controllers/feedController.php1340 //Get first entry (syntax robust for Generator or Array)COMMENT
Slop Phrases1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMconfig.default.php265 # Here you can add overrides for particular IP/domain:port combinationsCOMMENT
Redundant / Tautological Comments2 hits · 3 pts
SeverityFileLineSnippetContext
LOWcli/access-permissions.sh40# Read files, and directory traversalCOMMENT
LOWcli/translation-update.sh15# Check if po4a is installedCOMMENT