AI Slop Code Risk Monitor

outline/outline

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

The fastest knowledge base for growing teams. Beautiful, realtime collaborative, feature packed, and markdown compatible.

0.8 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for outline/outline, a TypeScript project with 41,124 GitHub stars. SynthScan examined 434,410 lines of code across 2476 source files, recording 225 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 0.8 (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.

0.8
Adjusted Signal
0.8
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
41.1K
Stars
TypeScript
Language
434.4K
Lines of Code
2.5K
Files
225
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 1.7/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 2.1/100 · LOW

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

Agent Over-Engineering Ratio 1.2/100 · LOW

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

PR Review Velocity Impact 3.6/100 · LOW

Which changes need focused human review? 225 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 10HIGH 1MEDIUM 1LOW 213

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 225 distinct pattern matches across 9 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 Identifiers102 hits · 104 pts
SeverityFileLineSnippetContext
LOW…es/Settings/components/GroupMemberSelectionToolbar.tsx29function GroupMemberSelectionToolbar({ group }: Props) {CODE
LOWapp/scenes/Settings/components/GroupMembersTable.tsx37const GroupMemberRowContextMenu = observer(function GroupMemberRowContextMenu({CODE
LOW…ettings/components/OAuthAuthenticationRevokeDialog.tsx10export default function OAuthAuthenticationRevokeDialog({CODE
LOWapp/scenes/Document/components/Notices.tsx38 function permanentlyDeletedDescription() {CODE
LOWapp/scenes/Document/components/ReferenceListItem.tsx51export function NewChildReferenceListItem({CODE
LOWapp/scenes/Document/hooks/useDocumentSave.ts54export function shouldAutoDeleteDraftOnUnmount({CODE
LOWapp/scenes/Login/urls.ts9function validateAndEncodeSubdomain(subdomain: string): string {CODE
LOWapp/scenes/Login/urls.ts9function validateAndEncodeSubdomain(subdomain: string): string {CODE
LOW…nes/Login/components/PasskeyAuthenticationProvider.tsx87export function PasskeyAuthenticationProvider(props: Props) {CODE
LOWapp/utils/autotrack.js261function getOrCreateMethodChain(context, methodName) {CODE
LOWapp/utils/autotrack.js496function linkClickWillUnloadCurrentPage(event, link) {CODE
LOWapp/utils/splitView.ts139export function isSplitViewNavigationSuppressed(): boolean {CODE
LOWapp/utils/splitView.ts149export function withoutSplitViewNavigation(callback: () => void): void {CODE
LOWapp/utils/splitView.ts245export function isSplitViewModifierPressed(): boolean {CODE
LOWapp/utils/emoji.ts24export function generateEmojiNameFromFilename(filename: string): string {CODE
LOWapp/components/ModelSelectionActionToolbar.tsx28export function ModelSelectionActionToolbar({ models, actions }: Props) {CODE
LOWapp/components/CollectionDuplicateDialog.tsx19function CollectionDuplicateDialog({ collection, onSubmit }: Props) {CODE
LOWapp/components/Lightbox.tsx148function ZoomablePannablePinchable({CODE
LOWapp/components/InputMemberPermissionSelect.tsx15export default function InputMemberPermissionSelect(CODE
LOWapp/components/Sidebar/components/SidebarNavigation.tsx32 function SidebarNavigationProvider({CODE
LOW…ponents/Sidebar/components/SidebarDisclosureContext.ts80export function useSidebarDisclosureState() {CODE
LOWapp/components/Sidebar/components/DraggableSection.tsx47export function normalizeSidebarSectionOrder(CODE
LOWapp/components/Sidebar/hooks/useDragAndDrop.tsx184export function useDropToReorderSidebarSection(CODE
LOWapp/components/Sidebar/hooks/useDragAndDrop.tsx251export function useDropToChangeCollection(CODE
LOWapp/components/Sidebar/hooks/useDragAndDrop.tsx340export function useDropToReparentDocument(CODE
LOWapp/components/Sidebar/hooks/useDragAndDrop.tsx579export function useDropToReorderUserMembership(getIndex?: () => string) {CODE
LOW…ents/DocumentExplorer/DocumentExplorerSearchResult.tsx23function DocumentExplorerSearchResult({CODE
LOWapp/components/Notifications/Notifications.tsx34function useStableOrderedNotifications(CODE
LOWapp/hooks/useKeyboardShortcutsQuery.tsx12export default function useKeyboardShortcutsQuery() {CODE
LOWapp/hooks/useTemplateSettingsActions.tsx24export function useTemplateSettingsActions(CODE
LOWapp/hooks/useLocationSidebarContext.ts9export function useLocationSidebarContext() {CODE
LOWapp/editor/components/CellBackgroundColorPicker.tsx11function CellBackgroundColorPicker({ activeColor, command }: Props) {CODE
LOWapp/editor/menus/mention.tsx192export function createDocumentMentionItems(CODE
LOWplugins/gitea/server/api/gitea.test.ts11async function buildConnectedIntegration() {CODE
LOWplugins/slack/server/presenters/userNotLinkedBlocks.ts6export function presentUserNotLinkedBlocks(team?: Team) {CODE
LOW…gins/webhooks/server/presenters/webhookSubscription.ts4export default function presentWebhookSubscription(CODE
LOW…/client/components/WebhookSubscriptionDeleteDialog.tsx11export default function WebhookSubscriptionRevokeDialog({CODE
LOW…bhooks/client/components/WebhookSubscriptionsTable.tsx47 function WebhookSubscriptionsTable(props: Props) {CODE
LOW…ooks/client/hooks/useWebhookSubscriptionMenuActions.ts15export function useWebhookSubscriptionMenuActions(CODE
LOWserver/errors.ts21export function InvalidAuthenticationError(CODE
LOWserver/errors.ts187export function EmailAuthenticationRequiredError(CODE
LOW⚡server/errors.ts216export function GmailAccountCreationError(CODE
LOW⚡server/errors.ts225export function OIDCMalformedUserInfoError(CODE
LOW⚡server/errors.ts234export function AuthenticationProviderDisabledError(CODE
LOWserver/errors.ts254export function InvalidClientMetadataError(CODE
LOWserver/test/factories.ts676export async function buildDocumentWithAttachment(CODE
LOWserver/test/factories.ts898export async function buildMetadataDocumentOAuthClient(CODE
LOWserver/test/factories.ts912export async function buildOAuthAuthorizationCode({CODE
LOWserver/middlewares/rateLimiter.ts30async function getRateLimiterIdentifiers(ctx: AppContext): Promise<string[]> {CODE
LOWserver/middlewares/rateLimiter.ts148 return async function registerRateLimiterMiddleware(CODE
LOWserver/middlewares/cleanupMultipartFiles.ts13 return async function cleanupMultipartFilesMiddleware(CODE
LOWserver/middlewares/feature.ts27 return async function commentingEnabledMiddleware(CODE
LOWserver/middlewares/csrf.ts24 return async function attachCSRFTokenMiddleware(ctx: AppContext, next: Next) {CODE
LOWserver/middlewares/csrf.ts85 return async function verifyCSRFTokenMiddleware(ctx: AppContext, next: Next) {CODE
LOWserver/middlewares/validateWebhook.ts15 return async function validateWebhookMiddleware(ctx: APIContext, next: Next) {CODE
LOWserver/middlewares/apexAuthRedirect.ts28 return async function apexAuthRedirectMiddleware(CODE
LOWserver/utils/jwt.ts121export async function getUserForEmailSigninToken(CODE
LOWserver/utils/jwt.ts176export async function getDetailsForEmailUpdateToken(CODE
LOWserver/utils/embeds.ts226export function convertBareUrlsToEmbedMarkdown(CODE
LOWserver/utils/fs.ts30function encodeWindowsUnsafeCharacter(char: string): string {CODE
42 more matches not shown…
Hallucination Indicators10 hits · 100 pts
SeverityFileLineSnippetContext
CRITICALapp/models/Collection.ts173 return !!this.store.rootStore.stars.orderedData.find(CODE
CRITICALapp/models/Document.ts339 return !!this.store.rootStore.stars.orderedData.find(CODE
CRITICALapp/models/Document.ts579 const pin = this.store.rootStore.pins.orderedData.find(CODE
CRITICALapp/models/Document.ts695 return !!this.store.rootStore.pins.orderedData.find(CODE
CRITICALapp/models/Document.ts703 return !!this.store.rootStore.pins.orderedData.find(CODE
CRITICALapp/models/User.ts318 return this.store.rootStore.userMemberships.orderedData.find(CODE
CRITICALapp/editor/extensions/Keys.ts169 view.state.schema.nodes.paragraph.create({})CODE
CRITICALserver/middlewares/feature.ts14 if (!ctx.state.auth.user.team.getPreference(preference)) {CODE
CRITICALserver/middlewares/feature.ts31 const commenting = ctx.state.auth.user.team.getPreference(CODE
CRITICALshared/editor/plugins/UploadPlugin.ts288 const node = view.state.schema.nodes.image.create({CODE
Fake / Example Data84 hits · 86 pts
SeverityFileLineSnippetContext
LOWapp/scenes/Collection/components/Overview.tsx114 color: ${s("placeholder")};CODE
LOWapp/scenes/Document/components/DocumentTitle.tsx311 color: ${s("placeholder")};CODE
LOWapp/scenes/Document/components/DocumentTitle.tsx312 -webkit-text-fill-color: ${s("placeholder")};CODE
LOW⚡app/scenes/Search/components/SearchInput.tsx68 color: ${s("placeholder")};CODE
LOW⚡app/scenes/Search/components/SearchInput.tsx71 color: ${s("placeholder")};CODE
LOW⚡app/scenes/Search/components/SearchInput.tsx74 color: ${s("placeholder")};CODE
LOW⚡app/scenes/Search/components/SearchInput.tsx77 color: ${s("placeholder")};CODE
LOWapp/components/Editor.tsx23 "placeholder" | "defaultValue" | "onClickLink" | "embeds" | "extensions"CODE
LOWapp/components/Table.tsx846 color: ${s("placeholder")};CODE
LOWapp/components/Input.tsx34 color: ${s("placeholder")};CODE
LOWapp/components/Input.tsx63 color: ${s("placeholder")};CODE
LOWapp/components/ContentEditable.tsx290 color: ${s("placeholder")};CODE
LOWapp/components/ContentEditable.tsx291 -webkit-text-fill-color: ${s("placeholder")};CODE
LOWapp/components/Sharing/components/index.tsx53 color: ${s("placeholder")};CODE
LOWapp/components/primitives/components/InputSelect.tsx88 color: ${s("placeholder")};CODE
LOWapp/components/CommandBar/SharedCommandBar.tsx69 color: ${s("placeholder")};CODE
LOWapp/components/CommandBar/CommandBar.tsx87 color: ${s("placeholder")};CODE
LOWapp/editor/components/SuggestionsMenu.tsx1115 "placeholder" in insertItem && !!insertItem.placeholderCODE
LOWapp/editor/components/SuggestionsMenu.tsx1173 "placeholder" in insertItem && !!insertItem.placeholderCODE
LOWapp/editor/menus/formatting.tsx238 name: "placeholder",CODE
LOWplugins/email/server/auth/email.test.ts138 email: "user@example.com",CODE
LOWplugins/email/server/auth/email.test.ts154 const email = "sso-user@example.org";CODE
LOWplugins/email/server/auth/email.test.ts183 const email = "guest-user@example.org";CODE
LOWplugins/email/server/auth/email.test.ts212 const email = "sso-user-2@example.org";CODE
LOWplugins/email/server/auth/email.test.ts241 const email = "guest-user-2@example.org";CODE
LOWserver/emails/templates/BaseEmail.test.tsx60 { to: "user@example.com" },CODE
LOWserver/emails/templates/BaseEmail.test.tsx84 { to: "user@example.com" },CODE
LOWserver/utils/validators.test.ts259 expect(isMailboxAddress("user@example.com")).toBe(true);CODE
LOWserver/utils/VerificationCode.test.ts6 const email = "user@example.com";CODE
LOWserver/utils/VerificationCode.test.ts47 "user@example.com"CODE
LOWserver/utils/VerificationCode.test.ts50 await VerificationCode.delete(teamId, "user@example.com");CODE
LOWserver/models/ShareSubscription.test.ts77 ShareSubscription.normalizeEmailFingerprint("user@example.com");CODE
LOWserver/models/ShareSubscription.test.ts84 ).toBe(ShareSubscription.normalizeEmailFingerprint("user@example.com"));CODE
LOWserver/models/ShareSubscription.test.ts106 ).toBe(ShareSubscription.normalizeEmailFingerprint("user@example.com"));CODE
LOWserver/models/ShareSubscription.test.ts130 ).toBe(ShareSubscription.normalizeEmailFingerprint("user@example.com"));CODE
LOWserver/models/ShareSubscription.test.ts156 ShareSubscription.normalizeEmailFingerprint("user@example.com");CODE
LOWserver/models/helpers/ProseMirrorHelper.test.ts1463 const text = "lorem ipsum dolor sit amet ".repeat(50);CODE
LOWserver/models/helpers/ProseMirrorHelper.test.ts1463 const text = "lorem ipsum dolor sit amet ".repeat(50);CODE
LOWserver/routes/api/users/users.test.ts27 name: "John Doe",CODE
LOWserver/routes/api/users/users.test.ts669 name: "Jane Doe",CODE
LOWserver/routes/api/users/users.test.ts684 const other = await buildUser({ teamId: team.id, name: "Jane Doe" });CODE
LOWserver/routes/api/suggestions/suggestions.test.ts106 name: "Jane Doe",CODE
LOW⚡server/routes/api/shares/shares.test.ts1553 email: "user@example.com",CODE
LOW⚡server/routes/api/shares/shares.test.ts1555 ShareSubscription.normalizeEmailFingerprint("user@example.com"),CODE
LOW⚡server/routes/api/shares/shares.test.ts1564 email: "user@example.com",CODE
LOW⚡server/routes/api/shares/shares.test.ts1577 email: "user@example.com",CODE
LOW⚡server/routes/api/shares/shares.test.ts1579 ShareSubscription.normalizeEmailFingerprint("user@example.com"),CODE
LOW⚡server/routes/api/shares/shares.test.ts1589 email: "user@example.com",CODE
LOWserver/routes/api/shares/shares.test.ts1604 email: "user@example.com",CODE
LOWserver/routes/api/shares/shares.test.ts1606 ShareSubscription.normalizeEmailFingerprint("user@example.com"),CODE
LOWserver/routes/api/shares/shares.test.ts1620 email: "user@example.com",CODE
LOWserver/routes/api/shares/shares.test.ts1634 email: "user@example.com",CODE
LOWserver/routes/api/shares/shares.test.ts1636 ShareSubscription.normalizeEmailFingerprint("user@example.com"),CODE
LOWserver/routes/api/shares/shares.test.ts1653 email: "user@example.com",CODE
LOWserver/routes/api/shares/shares.test.ts1670 email: "user@example.com",CODE
LOWserver/routes/api/shares/shares.test.ts1695 email: "user@example.com",CODE
LOWserver/routes/api/shares/shares.test.ts1696 emailFingerprint: "user@example.com",CODE
LOWserver/routes/api/shares/shares.test.ts1721 email: "user@example.com",CODE
LOWserver/routes/api/shares/shares.test.ts1722 emailFingerprint: "user@example.com",CODE
LOWserver/routes/api/shares/shares.test.ts1746 email: "user@example.com",CODE
24 more matches not shown…
Verbosity Indicators9 hits · 16 pts
SeverityFileLineSnippetContext
LOWapp/models/Comment.ts216 // Step 1: Update the reactions cache.COMMENT
LOWapp/models/Comment.ts236 // Step 2: Add the user to the store.COMMENT
LOW…ver/queues/tasks/UpdateDocumentsPopularityScoreTask.ts203 // Step 1: Read candidate document IDs from readonly replica to avoidCOMMENT
LOW…ver/queues/tasks/UpdateDocumentsPopularityScoreTask.ts264 // Step 2: Insert the eligible IDs into the working table on primaryCOMMENT
LOW…ver/queues/tasks/UpdateDocumentsPopularityScoreTask.ts311 // Step 1: Get batch of document IDs to processCOMMENT
LOW⚡…ver/queues/tasks/UpdateDocumentsPopularityScoreTask.ts331 // Step 2: Calculate scores outside of a transactionCOMMENT
LOW⚡…ver/queues/tasks/UpdateDocumentsPopularityScoreTask.ts338 // Step 3: Update document scoresCOMMENT
LOW⚡…ver/queues/tasks/UpdateDocumentsPopularityScoreTask.ts341 // Step 4: Mark batch as processedCOMMENT
LOWserver/routes/api/auth/auth.ts141 // If the user did not _just_ sign in then we need to check if they continueCOMMENT
Structural Annotation Overuse8 hits · 14 pts
SeverityFileLineSnippetContext
LOWapp/models/Comment.ts216 // Step 1: Update the reactions cache.COMMENT
LOWapp/models/Comment.ts236 // Step 2: Add the user to the store.COMMENT
LOW…ver/queues/tasks/UpdateDocumentsPopularityScoreTask.ts203 // Step 1: Read candidate document IDs from readonly replica to avoidCOMMENT
LOW…ver/queues/tasks/UpdateDocumentsPopularityScoreTask.ts264 // Step 2: Insert the eligible IDs into the working table on primaryCOMMENT
LOW…ver/queues/tasks/UpdateDocumentsPopularityScoreTask.ts311 // Step 1: Get batch of document IDs to processCOMMENT
LOW⚡…ver/queues/tasks/UpdateDocumentsPopularityScoreTask.ts331 // Step 2: Calculate scores outside of a transactionCOMMENT
LOW⚡…ver/queues/tasks/UpdateDocumentsPopularityScoreTask.ts338 // Step 3: Update document scoresCOMMENT
LOW⚡…ver/queues/tasks/UpdateDocumentsPopularityScoreTask.ts341 // Step 4: Mark batch as processedCOMMENT
Over-Commented Block9 hits · 9 pts
SeverityFileLineSnippetContext
LOW…ugins/search-postgres/server/PostgresSearchProvider.ts781 // - the doc is published AND lives in a collection the user can accessCOMMENT
LOW.claude/skills/verify-outline/scripts/verify-outline.sh1#!/usr/bin/env bashCOMMENT
LOWserver/typings/outlinewiki__koa-passport.d.ts1declare module "@outlinewiki/koa-passport" {COMMENT
LOWserver/utils/requestFilteringAgent/index.ts1// Vendored from request-filtering-agent v3.2.0 (MIT, by azu).COMMENT
LOWserver/policies/cancan.ts421// of this software and associated documentation files (the "Software"), to dealCOMMENT
LOWserver/logging/tracing.ts1// MIT LicenseCOMMENT
LOWshared/styles/normalize.ts1// MIT LicenseCOMMENT
LOWshared/editor/lib/markdown/serializer.ts21 // :: (Object<(state: MarkdownSerializerState, node: Node, parent: Node, index: number)>, Object)COMMENT
LOWshared/editor/lib/markdown/serializer.ts41 // opening and closing syntax appears relative to other mixableCOMMENT
Synthetic Comment Markers1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHREADME.md35> **Note:** Please do not submit AI-generated pull requests. We receive a high volume of mass, low-quality PRs generatedCODE
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMshared/i18n/locales/zh_TW/translation.json1752 "Import a zip file of Markdown documents exported from Slab – collections, posts, images, and attachments will be impoCODE
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOW.claude/skills/verify-outline/scripts/verify-outline.sh4# Usage:COMMENT