AI Slop Code Risk Monitor

fosrl/pangolin

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

Modern networking and security platform providing secure access and connectivity to apps, infrastructure, and AI workloads. Connect and protect your users.

1.6 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for fosrl/pangolin, a TypeScript project with 23,279 GitHub stars. SynthScan examined 444,017 lines of code across 1922 source files, recording 638 pattern matches distributed across 10 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-30
Last Push
23.3K
Stars
TypeScript
Language
444.0K
Lines of Code
1.9K
Files
638
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.5/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.2/100 · LOW

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

Agent Over-Engineering Ratio 6.6/100 · LOW

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

PR Review Velocity Impact 7.6/100 · LOW

Which changes need focused human review? 638 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 33LOW 605

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 638 distinct pattern matches across 10 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 Identifiers512 hits · 515 pts
SeverityFileLineSnippetContext
LOWlicense_header_checker.py23def extract_leading_block_comment(content):STRING
LOWserver/integrationApiServer.ts25export function createIntegrationApiServer() {CODE
LOWserver/routers/idp/validateOidcCallback.ts760function normalizeRoleMappingResult(result: unknown): string[] {CODE
LOWserver/routers/launcher/listLauncherAiModels.ts25export async function listLauncherPublicAiModels(CODE
LOWserver/routers/launcher/formatLauncherAccess.ts11export function resolveHttpHttpsDisplayPort(CODE
LOWserver/routers/launcher/formatLauncherAccess.ts21export function formatSiteResourceDestinationDisplay(CODE
LOWserver/routers/launcher/formatLauncherAccess.ts66function formatTcpUdpResourceAccess(CODE
LOWserver/routers/launcher/formatLauncherAccess.ts98export function formatPublicResourceAccess(CODE
LOWserver/routers/launcher/launcherDefaultView.ts27export function extractDefaultViewOverrides(CODE
LOWserver/routers/launcher/launcherDefaultView.ts69export async function upsertDefaultViewOverride({CODE
LOWserver/routers/launcher/launcherDefaultView.ts112export async function deleteDefaultViewOverride({CODE
LOWserver/routers/launcher/launcherDefaultView.ts131export async function deleteAllDefaultViewOverrides(CODE
LOWserver/routers/launcher/types.ts103export function getEffectiveDefaultLauncherConfig(CODE
LOWserver/routers/launcher/upsertLauncherDefaultView.ts16export async function upsertLauncherDefaultView(CODE
LOWserver/routers/launcher/launcherScale.ts26function launcherScaleCountsCacheKey(CODE
LOWserver/routers/launcher/launcherScale.ts57async function getLauncherScaleCountsForUser(CODE
LOWserver/routers/launcher/launcherResourceAccess.ts98function launcherResourcesQueryHash(CODE
LOWserver/routers/launcher/launcherResourceAccess.ts114function launcherResourcesCacheKey(CODE
LOWserver/routers/launcher/launcherResourceAccess.ts130function launcherAccessibleIdsCacheKey(CODE
LOWserver/routers/launcher/launcherResourceAccess.ts139async function resolveAccessibleIdsUncached(CODE
LOWserver/routers/launcher/launcherResourceAccess.ts312function buildSearchConditionForPublic(query: string) {CODE
LOWserver/routers/launcher/launcherResourceAccess.ts345function buildSearchConditionForSiteResource(query: string) {CODE
LOWserver/routers/launcher/launcherResourceAccess.ts378async function filterPublicResourceIdsByTextSearch(CODE
LOWserver/routers/launcher/launcherResourceAccess.ts413async function filterSiteResourceIdsByTextSearch(CODE
LOWserver/routers/launcher/launcherResourceAccess.ts1038async function listLauncherGroupsForUserUncached(CODE
LOWserver/routers/launcher/launcherResourceAccess.ts1053export async function listLauncherGroupsForUser(CODE
LOWserver/routers/launcher/launcherResourceAccess.ts1368async function listLauncherResourcesForUserUncached(CODE
LOWserver/routers/launcher/launcherResourceAccess.ts1512export async function listLauncherResourcesForUser(CODE
LOWserver/routers/launcher/launcherResourceAccess.ts1540function buildSiteNameSearchCondition(query: string) {CODE
LOWserver/routers/launcher/launcherResourceAccess.ts1551function buildLabelNameSearchCondition(query: string) {CODE
LOWserver/routers/launcher/launcherResourceAccess.ts1755export async function listAccessibleLauncherSitesForUser(CODE
LOWserver/routers/launcher/launcherResourceAccess.ts1789export async function listAccessibleLauncherLabelsForUser(CODE
LOWserver/routers/launcher/invalidateLauncherCache.ts7async function invalidateLauncherCacheForUser(CODE
LOWserver/routers/launcher/deleteLauncherDefaultView.ts18export async function deleteLauncherDefaultView(CODE
LOWserver/routers/aiProvider/validation.ts74export function refineProviderUpstreamFields(CODE
LOWserver/routers/auth/requestEmailVerificationCode.ts15export async function requestEmailVerificationCode(CODE
LOWserver/routers/virtualApiKey/validation.ts13function refineVirtualApiKeyEmailFields(CODE
LOW…rver/routers/aiBudget/listAiBudgetsForVirtualApiKey.ts32export async function listAiBudgetsForVirtualApiKey(CODE
LOWserver/routers/aiBudget/listAiBudgetsForSiteResource.ts32export async function listAiBudgetsForSiteResource(CODE
LOWserver/routers/olm/fingerprintingUtils.ts40export async function handleFingerprintInsertion(CODE
LOWserver/routers/olm/fingerprintingUtils.ts218export async function cleanUpOldFingerprintSnapshots(retentionDays: number) {CODE
LOWserver/routers/olm/handleOlmRegisterMessage.ts37function getHolePunchChainCounterKey(olmId: string, chainId: string): string {CODE
LOWserver/routers/olm/buildConfiguration.ts22export async function buildSiteConfigurationForOlmClient(CODE
LOWserver/routers/olm/peers.ts342export async function initPeerAddHandshakeBatch(CODE
LOWserver/routers/olm/recoverOlmWithFingerprint.ts25export async function recoverOlmWithFingerprint(CODE
LOWserver/routers/olm/gateway.ts15async function sendGatewayMessageToClients(CODE
LOWserver/routers/user/adminGeneratePasswordResetCode.ts32export async function adminGeneratePasswordResetCode(CODE
LOW…ver/routers/siteResource/setSiteResourceAiProviders.ts60export async function setSiteResourceAiProviders(CODE
LOW…ver/routers/siteResource/removeRoleFromSiteResource.ts98export async function removeRoleFromSiteResource(CODE
LOW…er/routers/siteResource/exportSiteResourceBlueprint.ts49export async function exportSiteResourceBlueprint(CODE
LOW…rver/routers/siteResource/listAllSiteResourcesByOrg.ts294export async function listAllSiteResourcesByOrg(CODE
LOW…ver/routers/siteResource/removeUserFromSiteResource.ts98export async function removeUserFromSiteResource(CODE
LOW…er/routers/siteResource/addAiProviderToSiteResource.ts60export async function addAiProviderToSiteResource(CODE
LOW…/routers/siteResource/batchAddClientToSiteResources.ts103export async function batchAddClientToSiteResources(CODE
LOW…/routers/siteResource/removeAiModelFromSiteResource.ts55export async function removeAiModelFromSiteResource(CODE
LOW…uters/siteResource/removeAiProviderFromSiteResource.ts60export async function removeAiProviderFromSiteResource(CODE
LOWserver/routers/siteResource/getSiteResource.test.ts4function testSiteResourceIdOnlyParams() {CODE
LOWserver/routers/siteResource/getSiteResource.test.ts29function testOrgScopedParamsRemainSupported() {CODE
LOWserver/routers/siteResource/getSiteResource.test.ts42function testInvalidSiteResourceId() {CODE
LOW…r/routers/siteResource/removeClientFromSiteResource.ts99export async function removeClientFromSiteResource(CODE
452 more matches not shown…
Decorative Section Separators29 hits · 87 pts
SeverityFileLineSnippetContext
MEDIUMserver/routers/newt/pingAccumulator.ts27// ── Site (newt) pings ──────────────────────────────────────────────────COMMENT
MEDIUMserver/routers/newt/pingAccumulator.ts31// ── Client (OLM) pings ────────────────────────────────────────────────COMMENT
MEDIUMserver/routers/newt/pingAccumulator.ts47// ── Public API ─────────────────────────────────────────────────────────COMMENT
MEDIUMserver/routers/newt/pingAccumulator.ts76// ── Flush Logic ────────────────────────────────────────────────────────COMMENT
MEDIUMserver/routers/newt/pingAccumulator.ts200 // ── Flush client pings ─────────────────────────────────────────────COMMENT
MEDIUMserver/routers/newt/pingAccumulator.ts241 // ── Flush OLM archive resets ───────────────────────────────────────COMMENT
MEDIUMserver/routers/newt/pingAccumulator.ts277// ── Retry / Error Helpers ──────────────────────────────────────────────COMMENT
MEDIUMserver/routers/newt/pingAccumulator.ts280// ── Lifecycle ──────────────────────────────────────────────────────────COMMENT
MEDIUMserver/lib/traefik/pathEncoding.test.ts23// ── Helpers ──────────────────────────────────────────────────────────COMMENT
MEDIUMserver/lib/traefik/pathEncoding.test.ts65// ── Tests ────────────────────────────────────────────────────────────COMMENT
MEDIUMserver/lib/traefik/pathEncoding.test.ts72 // ── encodePath unit tests ────────────────────────────────────────COMMENT
MEDIUMserver/lib/traefik/pathEncoding.test.ts187 // ── Collision fix: the actual bug we're fixing ───────────────────COMMENT
MEDIUMserver/lib/traefik/pathEncoding.test.ts253 // ── Edge cases ───────────────────────────────────────────────────COMMENT
MEDIUMsrc/app/[orgId]/settings/logs/streaming/page.tsx59// ── Re-export Destination so the rest of the file can use it ──────────────────COMMENT
MEDIUMsrc/app/[orgId]/settings/logs/streaming/page.tsx70// ── Destination card ───────────────────────────────────────────────────────────COMMENT
MEDIUMsrc/app/[orgId]/settings/logs/streaming/page.tsx227// ── Add destination card ───────────────────────────────────────────────────────COMMENT
MEDIUMsrc/app/[orgId]/settings/logs/streaming/page.tsx250// ── Destination type picker ────────────────────────────────────────────────────COMMENT
MEDIUMsrc/app/[orgId]/settings/logs/streaming/page.tsx354// ── Main page ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMsrc/components/HttpDestinationCredenza.tsx30// ── Types ──────────────────────────────────────────────────────────────────────COMMENT
MEDIUMsrc/components/HttpDestinationCredenza.tsx67// ── Helpers ────────────────────────────────────────────────────────────────────COMMENT
MEDIUMsrc/components/HttpDestinationCredenza.tsx91// ── Headers editor ─────────────────────────────────────────────────────────────COMMENT
MEDIUMsrc/components/HttpDestinationCredenza.tsx158// ── Component ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMsrc/components/S3DestinationCredenza.tsx29// ── Types ──────────────────────────────────────────────────────────────────────COMMENT
MEDIUMsrc/components/S3DestinationCredenza.tsx45// ── Helpers ────────────────────────────────────────────────────────────────────COMMENT
MEDIUMsrc/components/S3DestinationCredenza.tsx67// ── Component ──────────────────────────────────────────────────────────────────COMMENT
MEDIUM…omponents/resource-policy/PolicyAccessRulesSection.tsx55// ─── PolicyRulesSection ───────────────────────────────────────────────────────COMMENT
MEDIUMsrc/components/resource-policy/CreatePolicyForm.tsx49// ─── CreatePolicyForm ─────────────────────────────────────────────────────────COMMENT
MEDIUM…mponents/resource-policy/EditPolicyNameSectionForm.tsx44// ─── PolicyNameSection ──────────────────────────────────────────────────COMMENT
MEDIUMsrc/components/resource-policy/index.ts1// ─── Schemas & types ──────────────────────────────────────────────────────────COMMENT
Over-Commented Block72 hits · 72 pts
SeverityFileLineSnippetContext
LOWserver/routers/external.ts921COMMENT
LOWserver/routers/external.ts1201// verifyRoleAccess,COMMENT
LOWserver/routers/external.ts1261 verifyUserHasAction(ActionsEnum.removeUser),COMMENT
LOWserver/routers/external.ts1281// "/org/:orgId/user/:userId/action",COMMENT
LOWserver/routers/role/removeRoleSite.ts61 if (deletedRoleSite.length === 0) {COMMENT
LOWserver/routers/auth/login.ts161 // // Check if user has security keys registeredCOMMENT
LOWserver/routers/auth/lookupUser.ts41// path: "/auth/lookup-user",COMMENT
LOWserver/routers/org/createOrg.ts121COMMENT
LOWserver/routers/org/listUserOrgs.ts41// 200: {COMMENT
LOWserver/routers/olm/createUserOlm.ts41// }COMMENT
LOWserver/routers/olm/getUserOlm.ts21const querySchema = z.object({COMMENT
LOWserver/routers/olm/listUserOlms.ts41// query: querySchema,COMMENT
LOWserver/routers/olm/deleteUserOlm.ts21 userId: z.string(),COMMENT
LOWserver/routers/user/removeUserSite.ts61 if (deletedUserSite.length === 0) {COMMENT
LOWserver/routers/user/addUserSite.ts41 })COMMENT
LOWserver/routers/auditLogs/queryRequestAuditLog.ts361 .from(requestAuditLog)COMMENT
LOWserver/routers/auditLogs/generateCSV.ts1// Spreadsheet applications (Excel, LibreOffice, Google Sheets) evaluate a cellCOMMENT
LOWserver/routers/site/updateSite.ts141 // // if remoteSubnets is provided, ensure it's a valid comma-separated list of cidrsCOMMENT
LOWserver/routers/client/listClients.ts521 roles: rolesForClientsCOMMENT
LOWserver/routers/client/listClients.ts541 // const latestOlmVersion = await latestOlVersionPromise;COMMENT
LOWserver/routers/ws/checkRoundTripMessage.ts21// registry.registerPath({COMMENT
LOWserver/setup/scriptsPg/1.25.0.ts121 } catch (e) {COMMENT
LOWserver/setup/scriptsPg/1.25.0.ts141 // })COMMENT
LOWserver/setup/scriptsPg/1.25.0.ts161 // console.log(COMMENT
LOWserver/setup/scriptsSqlite/1.25.0.ts141 // APP_PATH,COMMENT
LOWserver/setup/scriptsSqlite/1.25.0.ts161COMMENT
LOWserver/private/routers/org/sendUsageNotifications.ts61// "application/json": {COMMENT
LOW…ate/routers/domain/checkDomainNamespaceAvailability.ts81 // build == "saas" &&COMMENT
LOWserver/private/routers/billing/getOrgUsage.ts41// },COMMENT
LOWserver/private/middlewares/verifyRemoteExitNode.ts41 // .from(users)COMMENT
LOWserver/private/lib/readConfigFile.ts181 enable_redis: z.boolean().optional().default(false),COMMENT
LOWserver/private/lib/readConfigFile.ts201 cert_mode: zCOMMENT
LOWserver/private/lib/certificates/scheduler.ts21COMMENT
LOWserver/private/lib/certificates/certificate-service.ts21import { withTimeout, withRetry } from "@server/lib/retry";COMMENT
LOWserver/private/lib/certificates/certificate-service.ts41const CERTIFICATE_ISSUANCE_TIMEOUT_MS = 20 * 60 * 1000;COMMENT
LOWserver/private/lib/certificates/acme-client.ts21import { acmeRateLimiter } from "./acmeRateLimiter";COMMENT
LOWserver/private/lib/exitNodes/exitNodes.ts201 );COMMENT
LOWserver/private/lib/exitNodes/exitNodes.ts221 // if (isActuallyOnline != node.online) {COMMENT
LOWserver/private/lib/dns/customRecordMatch.ts21 port: number | null;COMMENT
LOWserver/private/lib/dns/server.ts1661COMMENT
LOWserver/lib/ip.test.ts41 // Test 4: Empty existingCOMMENT
LOWserver/lib/ip.test.ts101// assertEqualsObj(result, {COMMENT
LOWserver/lib/ip.test.ts121// "Invalid IPv4 prefix test failed"COMMENT
LOWserver/lib/aiBudgetEnforcement.ts461 // Same id as the aiSessionLog row logged for this request, so the twoCOMMENT
LOWserver/lib/rebuildClientAssociations.ts641 `rebuildClientAssociations: [rebuildClientAssociationsFromSiteResource] siteId=${siteId} otherResourceClCOMMENT
LOWserver/lib/blueprints/parseDotNotation.ts81// "resources.resource-nice-id.name": "this is my resource",COMMENT
LOWserver/lib/blueprints/parseDotNotation.ts101// "resources.resource-nice-id2.protocol": "tcp",COMMENT
LOWserver/lib/blueprints/parseDockerContainers.ts221 }COMMENT
LOWserver/lib/blueprints/parseDockerContainers.ts241// ip: "0.0.0.0"COMMENT
LOWserver/lib/blueprints/parseDockerContainers.ts261// name: "nginx2",COMMENT
LOWserver/lib/blueprints/parseDockerContainers.ts281// owen_default: {COMMENT
LOWserver/lib/blueprints/parseDockerContainers.ts301// ],COMMENT
LOWserver/lib/blueprints/parseDockerContainers.ts321// image: "bolkedebruin/rdpgw:latest",COMMENT
LOWserver/db/sqlite/driver.ts21 const sqlite = new Database(location, { verbose });COMMENT
LOWserver/db/pg/poolConfig.ts41 );COMMENT
LOW.github/workflows/linting.yml1name: ESLintCOMMENT
LOW.github/workflows/mirror-node.yml1name: Mirror Node Base Image (Docker Hub to GHCR)COMMENT
LOWsrc/components/ShareLinksTable.tsx201 // cell: ({ row }) => {COMMENT
LOWsrc/components/ShareLinksTable.tsx221 // variant="ghost"COMMENT
LOWsrc/components/ShareLinksTable.tsx241 // );COMMENT
12 more matches not shown…
Fake / Example Data17 hits · 17 pts
SeverityFileLineSnippetContext
LOWmessages/it-IT.json650 "placeholder": "Segnaposto",CODE
LOWmessages/ko-KR.json650 "placeholder": "자리 표시자",CODE
LOWmessages/es-ES.json650 "placeholder": "Marcador de posición",CODE
LOWmessages/bg-BG.json650 "placeholder": "Запълване",CODE
LOWmessages/zh-CN.json650 "placeholder": "占位符",CODE
LOWmessages/tr-TR.json650 "placeholder": "Yer Tutucu",CODE
LOWmessages/pt-PT.json650 "placeholder": "Espaço reservado",CODE
LOWmessages/pl-PL.json650 "placeholder": "Symbol zastępczy",CODE
LOWmessages/da-DK.json650 "placeholder": "Pladsholder",CODE
LOWmessages/nb-NO.json650 "placeholder": "Plassholder",CODE
LOWmessages/de-DE.json650 "placeholder": "Platzhalter",CODE
LOWmessages/cs-CZ.json650 "placeholder": "Zástupný symbol",CODE
LOWmessages/fr-FR.json650 "placeholder": "Espace réservé",CODE
LOWmessages/zh-TW.json407 "placeholder": "占位符",CODE
LOWmessages/ru-RU.json650 "placeholder": "Заполнитель",CODE
LOWmessages/nl-NL.json650 "placeholder": "Plaatsaanduiding",CODE
LOWmessages/en-US.json650 "placeholder": "Placeholder",CODE
Excessive Try-Catch Wrapping3 hits · 2 pts
SeverityFileLineSnippetContext
LOWlicense_header_checker.py117 except Exception as e:STRING
MEDIUMlicense_header_checker.py118 print(f"Error processing file {file_path}: {e}")STRING
MEDIUMlicense_header_checker.py134 print(f"Error: Directory '{target_directory}' not found.")STRING
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMpackage-lock.json16088 "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz",CODE
Self-Referential Comments1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMsrc/components/newt-install-commands.tsx123 command: `# Create the directory and environment fileCODE
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWserver/lib/blueprints/parseDotNotation.ts79// // Example usage:COMMENT
Deep Nesting1 hit · 1 pts
SeverityFileLineSnippetContext
LOWlicense_header_checker.py62CODE
Slop Phrases1 hit · 1 pts
SeverityFileLineSnippetContext
LOWmessages/en-US.json1707 "otpSetupSuccessStoreBackupCodes": "Your account is now more secure. Don't forget to save your backup codes.",CODE