AI Slop Code Risk Monitor

Openpanel-dev/openpanel

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

OpenPanel is an open-source web and product analytics platform, an open-source alternative to Mixpanel with optional self-hosting.

1.3 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for Openpanel-dev/openpanel, a TypeScript project with 7,232 GitHub stars. SynthScan examined 374,716 lines of code across 2203 source files, recording 403 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 1.3 (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.3
Adjusted Signal
1.3
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
7.2K
Stars
TypeScript
Language
374.7K
Lines of Code
2.2K
Files
403
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 4.6/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.7/100 · LOW

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

Agent Over-Engineering Ratio 5.1/100 · LOW

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

PR Review Velocity Impact 6.3/100 · LOW

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

Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.

No multi-scan history yet — run the scanner again to build trend data.

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 3HIGH 0MEDIUM 31LOW 369

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 403 distinct pattern matches across 8 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 Identifiers303 hits · 302 pts
SeverityFileLineSnippetContext
LOWtooling/gates/conformance/rules.ts245export function checkCreateServicesCallSites(sources: ParsedSource[]): Metric {CODE
LOWtooling/gates/conformance/rules.ts538export function checkModuleScopeConstruction(sources: ParsedSource[]): Metric {CODE
LOWtooling/gates/conformance/rules.ts636export function checkSharedPackageIsolation(repoRoot: string): Metric {CODE
LOWtooling/gates/conformance/rules.ts784export function checkRpcProceduresWithoutCallers(CODE
LOWtest/retention-fixtures.ts268export async function teardownRetentionFixtures(CODE
LOWpackages/payments/scripts/sync-subscriptions.ts100function calculateSubscriptionEndsAt(subscription: {CODE
LOWpackages/payments/src/subscription-state.ts94export function subscriptionBlocksDashboard(state: SubscriptionState): boolean {CODE
LOWpackages/payments/src/polar.ts156export function applySubscriptionDiscount(CODE
LOWpackages/core/test/rpc-fixtures.ts150export function servicesWithProjectAccess(): Services {CODE
LOWpackages/core/src/slug-id.test.ts10function fixedSessionKeySegmentsInSource(): Set<string> {CODE
LOWpackages/core/src/clients/integrations/discord.ts36export function sendTestDiscordNotification(CODE
LOWpackages/core/src/shared/ch-dates.ts21export function convertClickhouseDateToJs(date: string): Date {CODE
LOWpackages/core/src/shared/js-runtime/ast-walker.ts35export function collectDeclaredIdentifiers(ast: unknown): Set<string> {CODE
LOWpackages/core/src/shared/js-runtime/ast-walker.ts69function collectPatternIdentifiers(CODE
LOWpackages/core/src/http/client-auth.ts127async function authenticateAllowedClient(CODE
LOWpackages/core/src/http/query.ts42export function parseQueryStringTransform({CODE
LOW…/core/src/modules/organization/organization.service.ts100export async function getOrganizationByProjectId(CODE
LOW…/core/src/modules/organization/organization.service.ts248export async function connectUserToOrganization(CODE
LOW…/core/src/modules/organization/organization.service.ts368export async function getOrganizationBillingEventsCount(CODE
LOW…/core/src/modules/organization/organization.service.ts404export async function getOrganizationEventsCount(CODE
LOW…/core/src/modules/organization/organization.service.ts427export async function getOrganizationEventsCountSince(CODE
LOW…/core/src/modules/organization/organization.service.ts488export async function getOrganizationBillingUsage(CODE
LOW…/core/src/modules/organization/organization.service.ts573export async function getOrganizationSubscriptionChartEndDate(CODE
LOW…/core/src/modules/organization/organization.service.ts594export async function getSettingsForOrganization(CODE
LOW…/core/src/modules/organization/organization.service.ts815export async function scheduleOrganizationDeletion(CODE
LOW…/core/src/modules/organization/organization.service.ts852export async function cancelOrganizationDeletion(CODE
LOW…/core/src/modules/organization/organization.service.ts1049async function assertProjectsInOrganization(CODE
LOW…/core/src/modules/organization/organization.service.ts1071export async function updateOrganizationMemberAccess(CODE
LOW…/core/src/modules/organization/organization.service.ts1106export function createOrganizationService(CODE
LOW…ore/src/modules/organization/organization.constants.ts51export function normalizeOrganizationRole(stored: string): OrganizationRole {CODE
LOW…/src/modules/organization/organization.service.test.ts462function seedMemberWithTwoProjects() {CODE
LOWpackages/core/src/modules/assistant/src/title.ts12export async function generateConversationTitle(CODE
LOWpackages/core/src/modules/widget/widget.rpc.ts91async function findPublicCounterWidgetOrThrow(db: Ctx['db'], shareId: string) {CODE
LOWpackages/core/src/modules/widget/widget.rpc.ts91async function findPublicCounterWidgetOrThrow(db: Ctx['db'], shareId: string) {CODE
LOWpackages/core/src/modules/auth/auth.service.ts76export function resetAccessChecksForTests(): void {CODE
LOWpackages/core/src/modules/group/group.service.ts452export async function getGroupMemberProfilesPage(CODE
LOWpackages/core/src/modules/group/src/dates.ts15export function convertClickhouseDateToJs(date: string): Date {CODE
LOW…/core/src/modules/notification/notification.service.ts182export function notificationTemplateEvent({CODE
LOW…/core/src/modules/notification/notification.service.ts213export function notificationTemplateFunnel({CODE
LOW…/core/src/modules/notification/notification.service.ts368export async function getNotificationRuleByIdOrThrow(CODE
LOW…/core/src/modules/notification/notification.service.ts375function assertRegexFiltersAreSafe(input: ICreateNotificationRule) {CODE
LOW…/core/src/modules/notification/notification.service.ts397export async function createOrUpdateNotificationRule(CODE
LOW…/core/src/modules/notification/notification.service.ts490export function createNotificationService(CODE
LOW…/src/modules/notification/src/notification-dispatch.ts109export async function checkNotificationRulesForEvent(CODE
LOW…/src/modules/notification/src/notification-dispatch.ts187export async function checkNotificationRulesForSessionEnd(CODE
LOW…es/core/src/modules/integration/integration.service.ts42async function assertProjectAccessAndGetOrg(CODE
LOW…es/core/src/modules/integration/integration.service.ts113export async function listIntegrationsForProject(CODE
LOW…es/core/src/modules/integration/integration.service.ts234export async function createOrUpdateSlackIntegration(CODE
LOW…es/core/src/modules/integration/integration.service.ts312export async function testIntegrationConnection(CODE
LOW…es/core/src/modules/integration/integration.service.ts334export async function testExportIntegrationConnection(CODE
LOW…es/core/src/modules/integration/integration.service.ts394export async function completeSlackOAuthCallback(CODE
LOW…ages/core/src/modules/integration/src/flush-exports.ts437function convertClickhouseDateToJs(date: string): Date {CODE
LOW…ore/src/modules/integration/src/export/export-event.ts5function convertClickhouseDateToJs(date: string): Date {CODE
LOW…ore/src/modules/integration/src/export/export-event.ts48export function clickhouseEventToExportEvent(CODE
LOW…ckages/core/src/modules/ingest/src/consumer-handler.ts24export function createIncomingEventHandler(CODE
LOW…/core/src/modules/ingest/src/incoming-event-handler.ts185async function isEventExcludedByProjectFilter(CODE
LOWpackages/core/src/modules/chart/sankey.service.ts141export function assertSankeyWindowIsAnswerable(CODE
LOWpackages/core/src/modules/chart/sankey.service.ts235function groupTransitionsByStepAndSource(transitions: Transition[]) {CODE
LOWpackages/core/src/modules/chart/sankey.service.ts417function buildSankeyFromTransitions(CODE
LOWpackages/core/src/modules/chart/retention.service.ts106export function getRetentionLastSeenSeries(CODE
243 more matches not shown…
Decorative Section Separators29 hits · 87 pts
SeverityFileLineSnippetContext
MEDIUMapps/start/src/components/charts/funnel-chart.tsx17// ─── Public types ───────────────────────────────────────────────────COMMENT
MEDIUMapps/start/src/components/charts/funnel-chart.tsx111// ─── Defaults ───────────────────────────────────────────────────────COMMENT
MEDIUMapps/start/src/components/charts/funnel-chart.tsx118// ─── SVG helpers ────────────────────────────────────────────────────COMMENT
MEDIUMapps/start/src/components/charts/funnel-chart.tsx169// ─── Animated Segment ───────────────────────────────────────────────COMMENT
MEDIUMapps/start/src/components/charts/funnel-chart.tsx593// ─── Label overlay ──────────────────────────────────────────────────COMMENT
MEDIUMapps/start/src/components/charts/funnel-chart.tsx746// ─── Main Component ─────────────────────────────────────────────────COMMENT
MEDIUMapps/start/src/components/charts/loading-sweep.tsx54// ─── Pure, SSR-safe helpers ──────────────────────────────────────────────COMMENT
MEDIUMapps/start/src/components/charts/loading-sweep.tsx104// ─── Shared mask defs (`${chartId}-mask` is the mask id) ─────────────────────COMMENT
MEDIUMapps/start/src/components/charts/loading-sweep.tsx180// ─── Line / Area loading sweep (its own re-randomizing silhouette) ───────────COMMENT
MEDIUMapps/start/src/components/charts/loading-sweep.tsx353// ─── Bar loading skeleton (seeded bars under the sweep, inner coords) ─────────COMMENT
MEDIUMapps/start/src/components/charts/bar.tsx24// ── Bar-depth perspective trim ───────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/lib.ts11// ── Config ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/lib.ts32// ── Auth paths ──────────────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/lib.ts110// ── Redis key helpers ───────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/lib.ts126// ── Timing ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/lib.ts147// ── Report framework ──────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/lib.ts184// ── HTTP ────────────────────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/lib.ts224// ── Latency percentiles ─────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/lib.ts284// ── Auth-cache warming and the scrypt outlier ───────────────────────────────COMMENT
MEDIUMapps/api/e2e/lib.ts425// ── Fixtures ────────────────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/redis-fail-fast.ts55// ── The proxy ───────────────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/redis-fail-fast.ts162// ── Probes ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/redis-fail-fast.ts303// ── The API under test ──────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/redis-fail-fast.ts357 // ── warm-up: the L1 caches the criterion turns on ──────────────────────COMMENT
MEDIUMapps/api/e2e/redis-fail-fast.ts375 // ── B. sustained outage ───────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/redis-fail-fast.ts413 // ── C. recovery ───────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/redis-fail-fast.ts440 // ── D. the blip ───────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/redis-fail-fast.ts484 // ── E. blackhole ──────────────────────────────────────────────────────COMMENT
MEDIUMapps/api/e2e/redis-fail-fast.ts502 // ── F. boot with Redis already down ───────────────────────────────────COMMENT
Over-Commented Block39 hits · 39 pts
SeverityFileLineSnippetContext
LOWbunfig.toml1# Root `bun install` policy (ADR-014).COMMENT
LOWbunfig.toml21# that only holds when someone remembers a flag is not a policy.COMMENT
LOWmise.toml1# Pins the toolchain per checkout, so `cd` into the repo selects the versions itCOMMENT
LOWtooling/gates/conformance.sh1#!/usr/bin/env bashCOMMENT
LOWtooling/gates/p13-images.sh1#!/usr/bin/env bashCOMMENT
LOWdocker/redpanda/auth-entrypoint.sh1#!/usr/bin/env bashCOMMENT
LOWself-hosting/redpanda/bootstrap.template.yaml1# Redpanda cluster bootstrap config — applied ONCE, when the data volume isCOMMENT
LOWpackages/core/bunfig.toml1# `bun test` configuration for @openpanel/core.COMMENT
LOWpackages/core/scripts/migrate-code.ts1// Forwards to `@openpanel/db`'s code migrations for installs whose composeCOMMENT
LOWpackages/core/src/cacheable-per-deps.ts1// `cacheable` for a function that needs the caller's `ServiceDeps`. PassingCOMMENT
LOWpackages/core/src/slug-id.ts1// Slug-based primary-id generation for project/dashboard/organization rows.COMMENT
LOWpackages/core/src/buffers/profile-buffer.ts1import { sql } from '@openpanel/db/src/clickhouse/sql';COMMENT
LOWpackages/core/src/http/cors.ts1// `CORS_OPERATOR_PATHS` (Basic-authenticated operator tooling) is readableCOMMENT
LOW…/src/modules/notification/src/notification-dispatch.ts1// The BullMQ-producer orchestration around a rule match sits beside the ruleCOMMENT
LOW…rc/modules/integration/src/object-store/gcs-adapter.ts41 };COMMENT
LOWpackages/core/src/modules/health/health.routes.ts1// Kubernetes liveness and readiness.COMMENT
LOWpackages/core/src/modules/ingest/ingest.routes.ts1// THE HOOK ORDER IS THE CONTRACT: duplicate -> clientAuth -> isBot ->COMMENT
LOW…ckages/core/src/modules/ingest/src/producer-batcher.ts1// Amortises the produce round-trip: accumulates messages and sends them asCOMMENT
LOWpackages/core/src/modules/ingest/src/producer-errors.ts1// The producer's error classification, split out of `kafka.ts` so the batchingCOMMENT
LOW…ges/core/src/modules/ingest/src/bots/header-signals.ts1// Header-consistency bot signals.COMMENT
LOWpackages/core/src/modules/ingest/src/bots/suspicion.ts1// Combines the individual bot signals into a single verdict for an event, andCOMMENT
LOWpackages/core/src/modules/chart/src/sql.ts1// Every ClickHouse query the chart module runs, as pure `sql` fragments.COMMENT
LOWpackages/core/src/modules/mcp/mcp.routes.ts1// MCP's stateless POST transport, mounted at `/mcp`.COMMENT
LOW…ges/core/src/modules/realtime/realtime.service.test.ts1// The event buffer and the ClickHouse client are HANDED INCOMMENT
LOWpackages/core/src/modules/cohort/cohort.service.ts41// Max members materialized into cohort_members per compute. Larger cohorts areCOMMENT
LOWpackages/core/src/modules/cohort/cohort.service.ts141// Neither can be expressed as a HAVING on the summary MVs: those hold a rowCOMMENT
LOWpackages/core/src/modules/email/src/sequence.ts1// A day-gated email sequence runner. Each subject carries a pointer (the lastCOMMENT
LOWpackages/sdks/web/src/init-snippet.ts1// Source:COMMENT
LOWpackages/db/bunfig.toml1# `bun test` configuration for @openpanel/db.COMMENT
LOWpackages/db/scripts/backfill-profile-seen.ts1// One-off backfill that reconciles `profiles.created_at` (first seen) andCOMMENT
LOWpackages/db/scripts/access-snapshot.ts1// Dumps what every member may do on every project of their organization, so aCOMMENT
LOW…ages/db/src/code-migrations/16-restructure-profiles.ts1import {COMMENT
LOW…ages/db/src/code-migrations/16-restructure-profiles.ts21//COMMENT
LOW…ages/db/src/code-migrations/16-restructure-profiles.ts41// ANY LEFT JOIN (COMMENT
LOW…es/db/src/code-migrations/22-add-events-inserted-at.ts1import {COMMENT
LOW.github/smoke/smoke.sh1#!/usr/bin/env bashCOMMENT
LOW.github/smoke/docker-compose.yml1# Smoke-test stack for CI.COMMENT
LOW.github/workflows/sdks.yml1name: SDKsCOMMENT
LOWapps/api/bunfig.toml1# `bun test` configuration for @openpanel/api.COMMENT
Hallucination Indicators3 hits · 30 pts
SeverityFileLineSnippetContext
CRITICALpackages/core/src/modules/realtime/realtime.routes.ts143 const access = await ws.data.ctx.services.auth.getProjectAccess({CODE
CRITICALpackages/core/src/modules/realtime/realtime.routes.ts173 const access = await ws.data.ctx.services.auth.getProjectAccess({CODE
CRITICALpackages/core/src/modules/realtime/realtime.routes.ts213 const access = await ws.data.ctx.services.auth.getOrganizationAccess({CODE
Fake / Example Data23 hits · 24 pts
SeverityFileLineSnippetContext
LOWpackages/core/src/shared/js-runtime/validate.test.ts585 name: 'John Doe',CODE
LOW…es/core/src/modules/organization/src/wind-down.test.ts75 user: { id: 'user-1', email: 'user@example.com', firstName: 'Alex' },CODE
LOW…es/core/src/modules/organization/src/wind-down.test.ts128 to: 'user@example.com',CODE
LOW…es/core/src/modules/organization/src/wind-down.test.ts268 email: 'admin@example.com',CODE
LOW…es/core/src/modules/organization/src/wind-down.test.ts280 expect(options).toMatchObject({ to: 'admin@example.com' });CODE
LOW…es/core/src/modules/organization/src/wind-down.test.ts328 to: 'user@example.com',CODE
LOW…es/core/src/modules/organization/src/wind-down.test.ts350 to: 'user@example.com',CODE
LOW…es/core/src/modules/organization/src/wind-down.test.ts365 to: 'user@example.com',CODE
LOWpackages/core/src/modules/email/src/sequence.test.ts62 email: 'user@example.com',CODE
LOWpackages/core/src/modules/email/src/sequence.test.ts103 to: 'user@example.com',CODE
LOW…core/src/modules/onboarding/onboarding.service.test.ts73 user: { id: 'user-1', email: 'user@example.com', firstName: 'Alex' },CODE
LOW…core/src/modules/onboarding/onboarding.service.test.ts108 to: 'user@example.com',CODE
LOW…core/src/modules/onboarding/onboarding.service.test.ts145 to: 'user@example.com',CODE
LOW…core/src/modules/onboarding/onboarding.service.test.ts183 to: 'user@example.com',CODE
LOW⚡packages/core/src/modules/share/share.service.test.ts43const ORG = { name: 'Acme Inc' };CODE
LOWapps/testbed/src/pages/Product.tsx50 Lorem ipsum dolor sit amet consectetur adipiscing elit.CODE
LOWapps/testbed/src/pages/Product.tsx50 Lorem ipsum dolor sit amet consectetur adipiscing elit.CODE
LOWapps/testbed/src/pages/Login.tsx8 name: 'Acme Corp',CODE
LOWapps/start/e2e/sweep-a11y.spec.ts60 `${field.getAttribute('placeholder') ? '(placeholder only) ' : ''}${describe(field)}`CODE
LOWapps/start/e2e/sweep-a11y.spec.ts96 element.getAttribute('placeholder') ||CODE
LOWapps/start/src/modals/add-group.tsx76 placeholder="Acme Corp"CODE
LOWapps/start/src/components/ui/combobox.tsx53 'items' | 'placeholder'CODE
LOWapps/start/src/routes/_steps.onboarding.project.tsx492 placeholder="Acme Inc"CODE
AI Slop Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMapps/public/src/app/(home)/_sections/testimonials.tsx120 // This creates a seamless infinite scroll effectCOMMENT
MEDIUMapps/public/src/app/(home)/_sections/mcp.tsx48 // Duplicate for seamless loopCOMMENT
Verbosity Indicators2 hits · 3 pts
SeverityFileLineSnippetContext
LOW…ckages/core/src/modules/insight/src/referrer-spikes.ts116 // Step 1: top non-direct referrers by total range volume. Bounds theCOMMENT
LOW…ckages/core/src/modules/insight/src/referrer-spikes.ts134 // Step 2: per-bucket sessions for top referrers + bucket totals (includingCOMMENT
Structural Annotation Overuse2 hits · 3 pts
SeverityFileLineSnippetContext
LOW…ckages/core/src/modules/insight/src/referrer-spikes.ts116 // Step 1: top non-direct referrers by total range volume. Bounds theCOMMENT
LOW…ckages/core/src/modules/insight/src/referrer-spikes.ts134 // Step 2: per-bucket sessions for top referrers + bucket totals (includingCOMMENT