AI Slop Code Risk Monitor

gitify-app/gitify

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

Git notifications on your menu bar. Available on macOS, Windows & Linux.

1.6 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for gitify-app/gitify, a TypeScript project with 5,394 GitHub stars. SynthScan examined 71,267 lines of code across 540 source files, recording 110 pattern matches distributed across 5 syntactic categories. The legacy adjusted pattern signal is 1.6 (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.6
Adjusted Signal
1.6
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
5.4K
Stars
TypeScript
Language
71.3K
Lines of Code
540
Files
110
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 7.2/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.7/100 · LOW

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

Agent Over-Engineering Ratio 6.5/100 · LOW

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

PR Review Velocity Impact 7.6/100 · LOW

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

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 110 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 Identifiers93 hits · 96 pts
SeverityFileLineSnippetContext
LOWscripts/verifyPackagedDependencies.js135function checkPackagedDependencies(asarPath) {CODE
LOWsrc/renderer/__mocks__/user-mocks.ts10export function mockGitifyNotificationUser(login: string): GitifyNotificationUser {CODE
LOWsrc/renderer/__mocks__/notifications-mocks.ts330export function mockPartialGitifyNotification(CODE
LOWsrc/renderer/__mocks__/notifications-mocks.ts359export function mockGitifyNotificationForRepoName(CODE
LOWsrc/renderer/__helpers__/hook-mocks.ts29function buildNotificationsDefaults(): NotificationsState {CODE
LOWsrc/renderer/__helpers__/hook-mocks.ts63export function getMockedNotificationsState(): NotificationsState {CODE
LOWsrc/renderer/__helpers__/hook-mocks.ts73export function getMockedNotificationActionsState(): NotificationActionsState {CODE
LOWsrc/renderer/__helpers__/hook-mocks.ts97export function setNotificationsOverrides(overrides: Partial<NotificationsState>): void {CODE
LOWsrc/renderer/stores/subscriptions.ts34export function initializeStoreSubscriptions(): () => void {CODE
LOW…/renderer/stores/useNotificationActionFailuresStore.ts8export function getNotificationFailureKey(account: Account, notificationId: string): string {CODE
LOWsrc/renderer/utils/ui/keyboard.ts1export function shouldIgnoreKeyboardEvent(event: KeyboardEvent): boolean {CODE
LOWsrc/renderer/utils/ui/emojis.ts12export async function convertTextToEmojiImgHtml(text: string): Promise<string> {CODE
LOWsrc/renderer/utils/ui/theme.ts29export function mapThemeModeToColorScheme(themeMode: Theme, highContrast = false): string | null {CODE
LOWsrc/renderer/utils/core/errors.ts126export function doesAllAccountsHaveErrors(accountNotifications: AccountNotifications[]) {CODE
LOW⚡src/renderer/utils/auth/scopeNames.ts35export function formatRequiredOAuthScopes(): string {CODE
LOW⚡src/renderer/utils/auth/scopeNames.ts44export function formatRecommendedOAuthScopes(): string {CODE
LOW⚡src/renderer/utils/auth/scopeNames.ts53export function formatAlternateOAuthScopes(): string {CODE
LOWsrc/renderer/utils/system/links.ts67export function openGitHubParticipatingDocs() {CODE
LOWsrc/renderer/utils/system/comms.ts111export function setShowUpdateNotifications(value: boolean): void {CODE
LOWsrc/renderer/utils/system/keyboardShortcut.ts49export function keyboardEventToAccelerator(event: KeyboardEvent): string | null {CODE
LOWsrc/renderer/utils/system/keyboardShortcut.ts70function normalizePhysicalKeyToAccelerator(event: KeyboardEvent): string | null {CODE
LOWsrc/renderer/utils/system/keyboardShortcut.ts93export function formatAcceleratorForDisplay(accelerator: string, isMac: boolean): string {CODE
LOWsrc/renderer/utils/api/errors.test.ts125function createGraphQLResponseError(message: string): GraphqlResponseError<unknown> {CODE
LOWsrc/renderer/utils/api/features.ts12export function isMarkAsDoneFeatureSupported(account: Account): boolean {CODE
LOWsrc/renderer/utils/api/features.ts19export function isUnsubscribeThreadSupported(account: Account): boolean {CODE
LOWsrc/renderer/utils/api/queryClient.ts13export function syncOnlineManagerWithBrowser(): void {CODE
LOWsrc/renderer/utils/forges/labels.ts10export function translateLoginMethodLabel(label: string): string {CODE
LOWsrc/renderer/utils/forges/gitlab/client.ts126export function fetchGitLabAuthenticatedUser(account: Account): Promise<GitLabUser> {CODE
LOWsrc/renderer/utils/forges/gitea/transform.ts18export function transformGiteaNotifications(CODE
LOWsrc/renderer/utils/forges/gitea/transform.ts25function transformGiteaNotification(CODE
LOWsrc/renderer/utils/forges/gitea/client.ts96export function fetchGiteaAuthenticatedUser(account: Account): Promise<GiteaUser> {CODE
LOWsrc/renderer/utils/forges/gitea/client.ts100export async function patchGiteaNotificationThread(CODE
LOWsrc/renderer/utils/forges/github/octokit.ts38export function clearOctokitClientCacheForAccount(account: Account): void {CODE
LOWsrc/renderer/utils/forges/github/octokit.ts77export async function createOctokitClientUncached(CODE
LOWsrc/renderer/utils/forges/github/flows.ts71export function describeDeviceFlowStartError(CODE
LOWsrc/renderer/utils/forges/github/capabilities.ts38export function supportsAnsweredDiscussion(account: Account): boolean {CODE
LOWsrc/renderer/utils/forges/github/capabilities.ts57export function supportsStackedPullRequests(account: Account): boolean {CODE
LOWsrc/renderer/utils/forges/github/platform.ts28export function isGitHubEnterpriseServerHost(hostname: Hostname): boolean {CODE
LOWsrc/renderer/utils/forges/github/platform.ts32export function isGitHubCloudDataResidencyHost(hostname: Hostname): boolean {CODE
LOWsrc/renderer/utils/forges/github/client.ts39export async function fetchAuthenticatedUserDetails(account: Account) {CODE
LOWsrc/renderer/utils/forges/github/client.ts58export async function listNotificationsForAuthenticatedUser(CODE
LOWsrc/renderer/utils/forges/github/client.ts105export async function markNotificationThreadAsRead(CODE
LOWsrc/renderer/utils/forges/github/client.ts126export async function markNotificationThreadAsDone(CODE
LOWsrc/renderer/utils/forges/github/client.ts144export async function ignoreNotificationThreadSubscription(CODE
LOWsrc/renderer/utils/forges/github/client.ts279export async function fetchNotificationDetailsForList(CODE
LOWsrc/renderer/utils/forges/github/enrich.ts29export async function enrichGitHubNotifications(CODE
LOWsrc/renderer/utils/forges/github/users.ts11export function formatGitHubNotificationUser(CODE
LOW…nderer/utils/forges/github/__mocks__/response-mocks.ts62export function mockDiscussionResponseNode(mocks: {CODE
LOW…nderer/utils/forges/github/__mocks__/response-mocks.ts122export function mockPullRequestResponseNode(mocks: {CODE
LOWsrc/renderer/utils/forges/github/graphql/utils.ts135export function aliasFieldAndSubstituteIndexedVars(CODE
LOW⚡src/renderer/utils/forges/github/graphql/utils.ts165export function extractIndexedVariableDefinitions(CODE
LOW⚡src/renderer/utils/forges/github/graphql/utils.ts172export function extractNonIndexedVariableDefinitions(CODE
LOW⚡src/renderer/utils/forges/github/graphql/utils.ts179function filterVariableDefinitionsByIndexSuffix(CODE
LOW⚡src/renderer/utils/forges/github/graphql/utils.ts186function extractVariableDefinitions(doc: TypedDocumentString<unknown, unknown>): VariableDef[] {CODE
LOWsrc/renderer/utils/forges/github/handlers/discussion.ts118export function getClosestDiscussionCommentOrReply(CODE
LOWsrc/renderer/utils/forges/github/handlers/index.ts18export function createNotificationHandler(CODE
LOW…c/renderer/utils/forges/github/handlers/pullRequest.ts46class PullRequestHandler extends DefaultHandler {CODE
LOW…c/renderer/utils/forges/github/handlers/pullRequest.ts155export function getClosestPullRequestActivity(CODE
LOWsrc/renderer/utils/forges/bitbucket/transform.ts83export function transformBitbucketNotifications(CODE
LOWsrc/renderer/utils/forges/bitbucket/transform.ts90function transformBitbucketNotification(CODE
33 more matches not shown…
Fake / Example Data10 hits · 10 pts
SeverityFileLineSnippetContext
LOWsrc/renderer/__mocks__/account-mocks.ts101 username: 'user@example.com',CODE
LOWsrc/renderer/utils/auth/loginValidation.test.ts53 username: 'user@example.com',CODE
LOWsrc/renderer/utils/forges/bitbucket/adapter.test.ts83 login: 'user@example.com',CODE
LOWsrc/renderer/utils/forges/bitbucket/adapter.test.ts88 ).toBe('user@example.com');CODE
LOWsrc/renderer/hooks/useLogins.test.tsx217 username: 'user@example.com',CODE
LOWsrc/renderer/hooks/useLogins.test.tsx226 'user@example.com',CODE
LOW…routes/bitbucket/LoginWithPersonalAccessToken.test.tsx54 'user@example.com',CODE
LOW…routes/bitbucket/LoginWithPersonalAccessToken.test.tsx65 username: 'user@example.com',CODE
LOW…routes/bitbucket/LoginWithPersonalAccessToken.test.tsx81 'user@example.com',CODE
LOW…routes/bitbucket/LoginWithPersonalAccessToken.test.tsx118 'user@example.com',CODE
Over-Commented Block5 hits · 5 pts
SeverityFileLineSnippetContext
LOWscripts/visual.sh1#!/usr/bin/env bashCOMMENT
LOW.github/actionlint.yaml1# WORKAROUND: actionlint does not recognize the `ubuntu-26.04-arm` GitHub-hostedCOMMENT
LOWopenspec/config.yaml1schema: spec-drivenCOMMENT
LOWopenspec/config.yaml21# proposal:COMMENT
LOW…/renderer/hooks/notifications/useNotificationsQuery.ts121COMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMsrc/renderer/utils/forges/github/graphql/utils.ts72// AST-based helpers for robust fragment parsing and dedupingCOMMENT
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWscripts/visual.sh15# Usage:COMMENT