AI Slop Code RIsk Monitor

koel/koel

Music streaming solution that works.

7.4 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for koel/koel, a PHP project with 17,275 GitHub stars. SynthScan examined 176,378 lines of code across 2532 source files, recording 1232 pattern matches distributed across 5 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-10
Last Push
17.3K
Stars
PHP
Language
176.4K
Lines of Code
2.5K
Files
1.2K
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 29.9/100 · MEDIUM

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

Hallucinated Dependency & Supply Chain Risk 1.3/100 · LOW

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

Agent Over-Engineering Ratio 29.8/100 · MEDIUM

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

PR Review Velocity Impact 29.5/100 · MEDIUM

Which changes need focused human review? 1232 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 1LOW 1231

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 1232 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 Identifiers1192 hits · 1248 pts
SeverityFileLineSnippetContext
LOWapp/Builders/AlbumBuilder.php64 public static function limitToAlbumsAccessibleByUser(Builder|QueryBuilder $query, User $user): voidCODE
LOWapp/Builders/ArtistBuilder.php49 public function withAlbumCountIncludingAppearances(): selfCODE
LOWapp/Providers/AppServiceProvider.php129 private static function enableOnDeleteCascadeForSqliteConnections(DatabaseManager $db): voidCODE
LOWapp/Providers/AppServiceProvider.php136 private static function grantAllPermissionsToSuperAdminRole(): voidCODE
LOWapp/Enums/SongStorageType.php21 public function supportsFolderStructureExtraction(): boolCODE
LOWapp/Values/User/UserPreferences.php179 private function requirePreferenceByProperty(string $property): PreferenceCODE
LOWapp/Values/SmartPlaylist/SmartPlaylistQueryModifier.php105 private static function generateEloquentParameters(string $column, Operator $operator, array $value): array|ClosureCODE
LOWapp/Repositories/SongRepository.php361 public function getManyInCollaborativeContext(array $ids, ?User $scopedUser = null): CollectionCODE
LOWapp/Repositories/SettingRepository.php11 public function getInstallWideAsKeyValueArray(): arrayCODE
LOWapp/Repositories/PlayRepository.php65 public function getMostListenedAlbumCovers(User $user, ?Carbon $since, array $artistIds): arrayCODE
LOWapp/Repositories/PlayRepository.php140 public function countSongsFirstPlayedSince(User $user, Carbon $since): intCODE
LOWapp/Repositories/PlayRepository.php145 public function countArtistsFirstPlayedSince(User $user, Carbon $since): intCODE
LOWapp/Repositories/AlbumRepository.php27 public function lazyGetWithIncompleteMbids(): LazyCollectionCODE
LOWapp/Repositories/UserRepository.php18 public function getOrCreateFirstAdmin(): UserCODE
LOWapp/Repositories/UserRepository.php44 public function findOneBySubsonicApiKeyHash(#[SensitiveParameter] string $hash): ?UserCODE
LOWapp/Models/User.php169 private static function whereDemoAccountIsInactive(Builder $query): voidCODE
LOWapp/Models/Album.php98 public static function getOrCreate(Artist $artist, ?string $name = null): staticCODE
LOWapp/Models/Artist.php120 public static function getOrCreate(User $user, ?string $name = null): selfCODE
LOW…ttp/Middleware/Concerns/ChecksControllerAttributes.php13 private static function getAttributeUsageFromRequest(Request $request, string $attributeClass): ?arrayCODE
LOWapp/Http/Resources/EmbedResource.php54 private function transformEmbeddableToResource(): JsonResourceCODE
LOWapp/Ai/Services/AiProviderRegistrar.php26 public function registerOrganizationProvider(Organization $organization, AiSettings $settings): stringCODE
LOWapp/Listeners/DeleteNonExistingRecordsPostScan.php69 private function wouldDeleteEverythingOnAnEmptyScan(MediaScanCompleted $event, array $paths): boolCODE
LOWapp/Helpers/Encoding/TagFixer.php53 private static function recoverFromDoubleMojibake(string $value): stringCODE
LOWapp/Services/MediaBrowser.php66 public function maybeCreateFolderStructureForSong(Song $song): voidCODE
LOWapp/Services/EmbedService.php16 public function resolveEmbedForEmbeddable(Embeddable $embeddable, User $user): EmbedCODE
LOWapp/Services/PwaManifestService.php30 public function removeUncustomizedLegacyFiles(): voidCODE
LOWapp/Services/PwaManifestService.php67 private static function stillPointsAtPlaceholderHost(string $path): boolCODE
LOWapp/Services/AlbumService.php65 public function trySetAlbumCoverFromDirectory(Album $album, string $directory): voidCODE
LOWapp/Services/AlbumService.php100 public function getOrCreateAlbumThumbnail(Album $album): ?stringCODE
LOWapp/Services/AlbumService.php100 public function getOrCreateAlbumThumbnail(Album $album): ?stringCODE
LOWapp/Services/RadioService.php58 public function deleteRadioStationsByUser(User $user): voidCODE
LOWapp/Services/DownloadService.php24 public function getLocalPathOrDownloadableUrl(Song $song): ?stringCODE
LOWapp/Services/SongService.php229 public function createOrUpdateSongFromScan(CODE
LOWapp/Services/SongService.php323 private static function getMbidKeysOfIgnoredNames(array $ignores): arrayCODE
LOWapp/Services/SongService.php335 private static function getCurrentArtistAndAlbumNames(Song $song): arrayCODE
LOWapp/Services/UserService.php48 public function createOrUpdateUserFromSso(SsoUser $ssoUser): UserCODE
LOWapp/Services/Playlist/PlaylistFolderService.php124 private static function movingFolderWouldCreateCycle(CODE
LOWapp/Services/Playlist/PlaylistFolderService.php142 private static function ensureParentBelongsToUser(?PlaylistFolder $parent, User $user): voidCODE
LOWapp/Services/Playlist/PlaylistService.php152 public function removePlayablesFromPlaylist(Playlist $playlist, Collection|Playable|array $playables): voidCODE
LOWapp/Services/Playlist/PlaylistService.php157 public function makePlaylistContentPublic(Playlist $playlist): voidCODE
LOWapp/Services/License/LicenseService.php120 private function updateOrCreateLicenseFromApiResponseBody(object $body): LicenseCODE
LOWapp/Services/Auth/AuthenticationService.php52 public function generateTwoFactorLoginToken(User $user): stringCODE
LOWapp/Services/Auth/AuthenticationService.php60 public function loginViaTwoFactorChallenge(CODE
LOWapp/Services/Auth/AuthenticationService.php79 public function logUserInOrStartTwoFactorChallenge(User $user): arrayCODE
LOWapp/Services/Auth/AuthenticationService.php103 public function tryResetPasswordUsingBroker(CODE
LOWapp/Services/Auth/TokenManager.php49 public function deleteTokenByPlainTextToken(#[SensitiveParameter] string $plainTextToken): voidCODE
LOWapp/Services/Auth/TokenManager.php54 public function getUserFromPlainTextToken(#[SensitiveParameter] string $plainTextToken): ?UserCODE
LOWapp/Services/Auth/PasskeyService.php86 public function generateConfirmationOptions(User $user): arrayCODE
LOWapp/Services/Auth/PasskeyService.php99 public function confirmIdentityWithPasskey(User $user, PublicKeyCredential $credential): voidCODE
LOWapp/Services/Auth/PasskeyService.php117 public function confirmIdentityWithPassword(CODE
LOWapp/Services/Auth/PasskeyService.php141 public function generateRegistrationOptions(User $user): arrayCODE
LOWapp/Services/Auth/ProxyAuthService.php30 public function tryGetProxyAuthenticatedUserFromRequest(Request $request): ?UserCODE
LOWapp/Services/Transcoding/Transcoder.php62 private static function resolveAacEncoderArguments(string $ffmpegPath, int $bitRate, bool $aacFast): arrayCODE
LOWapp/Services/Transcoding/LocalTranscodingStrategy.php12 protected function findOrCreateTranscodeLocation(Song $song, int $bitRate, ?string $localSourcePath): stringCODE
LOW…Services/Transcoding/RemoteDiskTranscodingStrategy.php24 protected function findOrCreateTranscodeLocation(Song $song, int $bitRate, ?string $localSourcePath): stringCODE
LOWapp/Services/Transcoding/TranscodingStrategy.php22 protected function findTranscodeBySongAndBitRate(Song $song, int $bitRate): ?TranscodeCODE
LOWapp/Services/Transcoding/TranscodingStrategy.php80 abstract protected function findOrCreateTranscodeLocation(CODE
LOWapp/Services/Transcoding/CloudTranscodingStrategy.php15 protected function findOrCreateTranscodeLocation(Song $song, int $bitRate, ?string $localSourcePath): stringCODE
LOWapp/Services/Integrations/MusicBrainzService.php128 private static function rescueUnlessMusicBrainzIsBusy(Closure $callback): mixedCODE
LOWapp/Services/Integrations/MusicBrainzRateLimiter.php91 private function resolveDefaultWaitSeconds(): floatCODE
1132 more matches not shown…
Fake / Example Data36 hits · 45 pts
SeverityFileLineSnippetContext
LOWresources/assets/js/composables/useKoelPlus.spec.ts10 customer_name: 'John Doe',CODE
LOWresources/assets/js/stores/userStore.spec.ts38 name: 'Jane Doe',CODE
LOWresources/assets/js/stores/userStore.spec.ts58 name: 'Jane Doe',CODE
LOW…es/assets/js/components/auth/ResetPasswordForm.spec.ts19 expect(resetMock).toHaveBeenCalledWith('foo@bar.com', 'new-password', 'my-token')CODE
LOW…es/assets/js/components/auth/ResetPasswordForm.spec.ts20 expect(loginMock).toHaveBeenCalledWith('foo@bar.com', 'new-password')CODE
LOW⚡…s/assets/js/components/auth/ForgotPasswordForm.spec.ts14 await h.type(screen.getByPlaceholderText('Your email address'), 'foo@bar.com')CODE
LOW⚡…s/assets/js/components/auth/ForgotPasswordForm.spec.ts17 expect(requestMock).toHaveBeenCalledWith('foo@bar.com')CODE
LOW⚡…s/assets/js/components/auth/ForgotPasswordForm.spec.ts24 await h.type(screen.getByPlaceholderText('Your email address'), 'foo@bar.com')CODE
LOW…ents/profile-preferences/EditableProfileAvatar.spec.ts13 name: 'John Doe',CODE
LOW…rces/assets/js/components/utils/AppInitializer.spec.ts41 currentUser: ref({ id: '1', email: 'test@test.com' }),CODE
LOW⚡resources/assets/js/components/user/AddUserForm.spec.ts24 name: 'John Doe',CODE
LOW⚡resources/assets/js/components/user/AddUserForm.spec.ts33 await h.type(screen.getByRole('textbox', { name: 'name' }), 'John Doe')CODE
LOW⚡resources/assets/js/components/user/AddUserForm.spec.ts41 name: 'John Doe',CODE
LOW⚡resources/assets/js/components/user/AddUserForm.spec.ts47 expect(toasterMock).toHaveBeenCalledWith('New user "John Doe" created.')CODE
LOW…sources/assets/js/components/user/EditUserForm.spec.ts37 await h.type(screen.getByRole('textbox', { name: 'name' }), 'Jane Doe')CODE
LOW…sources/assets/js/components/user/EditUserForm.spec.ts44 name: 'Jane Doe',CODE
LOWresources/assets/js/components/ai/AiChatMessage.spec.ts14 const user = { name: 'John Doe', avatar: 'https://example.com/avatar.jpg' }CODE
LOWresources/assets/js/__tests__/TestHarness.ts148 customer_name: 'John Doe',CODE
LOW⚡resources/assets/js/services/authService.spec.ts174 name: 'John Doe',CODE
LOW⚡resources/assets/js/services/authService.spec.ts179 name: 'Jane Doe',CODE
LOW⚡resources/assets/js/services/authService.spec.ts186 name: 'Jane Doe',CODE
LOW⚡resources/assets/js/services/authService.spec.ts193 expect(userStore.current.name).toBe('Jane Doe')CODE
LOW⚡tests/Unit/Helpers/ImageStorageUrlTest.php33 'key' => 'dummy-key',CODE
LOW⚡tests/Unit/Services/Auth/AuthenticationServiceTest.php56 ->with(['email' => 'foo@bar.com'])CODE
LOW⚡tests/Unit/Services/Auth/AuthenticationServiceTest.php59 $this->assertTrue($this->service->trySendResetPasswordLink('foo@bar.com'));CODE
LOW…sts/Integration/Services/UserInvitationServiceTest.php34 $emails = ['foo@bar.com', 'bar@baz.io'];CODE
LOW⚡tests/Feature/ForgotPasswordTest.php25 ->with('foo@bar.com')CODE
LOW⚡tests/Feature/ForgotPasswordTest.php28 $this->postJson('/api/forgot-password', ['email' => 'foo@bar.com'])->assertNoContent();CODE
LOWtests/Feature/SongTest.php220 'lyrics' => 'Lorem ipsum dolor sic amet.',CODE
LOWtests/Feature/SongTest.php239 'lyrics' => 'Lorem ipsum dolor sic amet.',CODE
LOWtests/Feature/SongTest.php260 'lyrics' => 'Lorem ipsum dolor sic amet.',CODE
LOWtests/Feature/SongTest.php328 'lyrics' => 'Lorem ipsum dolor sic amet.',CODE
LOWtests/Feature/SongTest.php363 'lyrics' => 'Lorem ipsum dolor sic amet.',CODE
LOWtests/Feature/SongTest.php384 'lyrics' => 'Lorem ipsum dolor sic amet.',CODE
LOW⚡tests/Feature/KoelPlus/UserTest.php19 'email' => 'foo@bar.com',CODE
LOW⚡tests/Feature/KoelPlus/UserTest.php36 'email' => 'foo@bar.com',CODE
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUM…es/assets/js/visualizers/asteroid/shaders/blob.frag.ts71 // http://the-witness.net/news/2012/02/seamless-cube-map-filtering/COMMENT
Over-Commented Block2 hits · 2 pts
SeverityFileLineSnippetContext
LOW…es/assets/js/visualizers/asteroid/shaders/blob.vert.ts41#endifCOMMENT
LOWresources/assets/js/stores/userStore.ts61 // Didn't mean to make you cryCOMMENT
Redundant / Tautological Comments1 hit · 2 pts
SeverityFileLineSnippetContext
LOWdocs/.vitepress/check-frontmatter.sh11 # Check if file starts with --- (has frontmatter) and contains a description fieldCOMMENT