AI Slop Code RIsk Monitor

purocean/yn

A highly extensible Markdown editor featuring version control, AI Copilot, document annotations, mind maps, document encryption, executable code snippets, chart embedding, HTML applets, plugins, and macro replacement. Its integrated sidebar terminal makes working with AI faster and more convenient.

4.9 Low pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for purocean/yn, a TypeScript project with 6,765 GitHub stars. SynthScan examined 100,010 lines of code across 534 source files, recording 81 pattern matches distributed across 4 syntactic categories. The legacy adjusted pattern signal is 4.9 (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.

4.9
Adjusted Signal
4.9
Raw Pattern Score
100%
Time Factor
2026-10-07
Last Push
6.8K
Stars
TypeScript
Language
100.0K
Lines of Code
534
Files
81
Pattern Hits
2026-10-12
Scan Date
0.08
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 1.3/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 20.7/100 · LOW

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

Agent Over-Engineering Ratio 1.0/100 · LOW

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

PR Review Velocity Impact 20.1/100 · LOW

Which changes need focused human review? 81 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 41HIGH 0MEDIUM 0LOW 40

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 81 distinct pattern matches across 4 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.

Hallucination Indicators41 hits · 450 pts
SeverityFileLineSnippetContext
CRITICALsrc/renderer/plugins/markdown-mind-map.ts315 km._modules.View.events.resize.apply(km)CODE
CRITICAL…c/renderer/plugins/markdown-hashtags/worker-indexer.ts11 const enableHashTags = await ctx.bridgeClient.call.ctx.setting.getSetting('render.md-hash-tags', true as any)CODE
CRITICALsrc/renderer/plugins/__tests__/editor-paste.ts135 expect(mocks.editor.addAction.mock.calls.map(([action]: any[]) => action.id)).toEqual([CODE
CRITICALsrc/renderer/plugins/__tests__/history-stack.ts87 expect(ctx.action.registerAction.mock.calls.map(([action]: any[]) => action.name)).toEqual([CODE
CRITICALsrc/renderer/plugins/__tests__/history-stack.ts176 ctx.statusBar.tapMenus.mock.calls.at(-1)[0](menusAfterDelete)CODE
CRITICALsrc/renderer/plugins/__tests__/switch-todo.ts150 expect(ctx.editor.replaceLine.mock.calls.map(([line]: any[]) => line)).toEqual([1, 2, 3])CODE
CRITICAL…c/renderer/plugins/__tests__/external-file-readonly.ts84 expect(mocks.editor.addAction.mock.calls.map(([action]: any[]) => action.id)).toEqual([CODE
CRITICALsrc/renderer/plugins/__tests__/editor-attachment.ts150 expect(ready.editor.addAction.mock.calls.map(([action]: any[]) => action.id)).toEqual([CODE
CRITICALsrc/renderer/plugins/__tests__/editor-attachment.ts185 const actions = new Map(ready.editor.addAction.mock.calls.map(([action]: any[]) => [action.id, action]))CODE
CRITICALsrc/renderer/plugins/__tests__/editor-attachment.ts208 const action = ready.editor.addAction.mock.calls.find(([item]: any[]) => item.id === 'plugin.editor.link-file')[0]CODE
CRITICALsrc/renderer/plugins/__tests__/editor-attachment.ts226 const action = ready.editor.addAction.mock.calls.find(([item]: any[]) => item.id === 'plugin.editor.link-doc')[0]CODE
CRITICALsrc/renderer/plugins/__tests__/editor-attachment.ts247 const addFile = ready.editor.addAction.mock.calls.find(([item]: any[]) => item.id === 'plugin.editor.add-file')[0]CODE
CRITICALsrc/renderer/plugins/__tests__/markdown-plantuml.ts58 expect(ctx.markdown.registerPlugin.mock.calls.map(([, options]: any[]) => options.openMarker)).toEqual([CODE
CRITICALsrc/renderer/plugins/__tests__/editor-restore-state.ts101 await Promise.all(ctx.editor.whenEditorReady.mock.results.map((result: any) => result.value))CODE
CRITICALsrc/renderer/plugins/__tests__/editor-restore-state.ts127 await Promise.all(ctx.editor.whenEditorReady.mock.results.map((result: any) => result.value))CODE
CRITICALsrc/renderer/plugins/__tests__/custom-styles.ts117 expect(ctx.theme.registerThemeStyle.mock.calls.map(([style]: any[]) => style)).toEqual([CODE
CRITICALsrc/renderer/plugins/__tests__/editor-md-list.ts173 harness.model.tokenization.grammarTokens.getLineTokens.mockReturnValueOnce({ getForeground: vi.fn(() => 23) })CODE
CRITICALsrc/renderer/plugins/__tests__/floating-editor.ts144 expect(ctx.action.registerAction.mock.calls.map(([action]: any[]) => action.name)).toEqual([CODE
CRITICALsrc/renderer/plugins/__tests__/editor-markdown.ts134 expect(mocks.editor.addAction.mock.calls.map(([action]: any[]) => action.id)).toEqual([CODE
CRITICALsrc/renderer/plugins/__tests__/editor-markdown.ts166 const actions = new Map(mocks.editor.addAction.mock.calls.map(([action]: any[]) => [action.id, action]))CODE
CRITICALsrc/renderer/plugins/__tests__/editor-markdown.ts225 const actions = new Map(mocks.editor.addAction.mock.calls.map(([action]: any[]) => [action.id, action]))CODE
CRITICALsrc/renderer/plugins/__tests__/drop-to-open-file.ts108 expect(ctx._iframeWindow.addEventListener.mock.calls.map(([type]: any[]) => type)).toEqual(expectedEvents)CODE
CRITICALsrc/renderer/plugins/__tests__/drop-to-open-file.ts109 expect(ctx._iframeWindow.addEventListener.mock.calls.map(([, , capture]: any[]) => capture)).toEqual([true, true, trCODE
CRITICAL…renderer/plugins/markdown-wiki-links/worker-indexer.ts11 const enableWikiLinks = await ctx.bridgeClient.call.ctx.setting.getSetting('render.md-wiki-links', true as any)CODE
CRITICALsrc/renderer/components/DefaultPreviewer.vue271 container.value.ownerDocument.documentElement.style.setProperty(CSS_VAR_NAME.PREVIEWER_HEIGHT, height.value + 'px')CODE
CRITICALsrc/renderer/components/__tests__/more-components.ts318 expect(mocks.lastIframe.contentDocument.documentElement.style.getPropertyValue('--previewer-height')).toBe('640px')CODE
CRITICAL⚡src/main/server/__tests__/mcp.ts121 mocks.jsonRPCClient.call.ctx.action.getRawActions.mockReset()CODE
CRITICAL⚡src/main/server/__tests__/mcp.ts122 mocks.jsonRPCClient.call.ctx.action.executeAction.mockReset()CODE
CRITICAL⚡src/main/server/__tests__/mcp.ts123 mocks.jsonRPCClient.call.ctx.setting.showSettingPanel.mockReset()CODE
CRITICAL⚡src/main/server/__tests__/mcp.ts124 mocks.jsonRPCClient.call.ctx.setting.getSchemaForMcp.mockReset()CODE
CRITICAL⚡src/main/server/__tests__/mcp.ts125 mocks.jsonRPCClient.call.ctx.setting.getSettingsForMcp.mockReset()CODE
CRITICALsrc/main/server/__tests__/mcp.ts151 mocks.jsonRPCClient.call.ctx.action.getRawActions.mockResolvedValue([CODE
CRITICALsrc/main/server/__tests__/mcp.ts180 mocks.jsonRPCClient.call.ctx.action.executeAction.mockResolvedValueOnce({ ok: true })CODE
CRITICALsrc/main/server/__tests__/mcp.ts185 mocks.jsonRPCClient.call.ctx.action.executeAction.mockRejectedValueOnce(new Error('bad action'))CODE
CRITICALsrc/main/server/__tests__/mcp.ts225 mocks.jsonRPCClient.call.ctx.setting.getSchemaForMcp.mockResolvedValue({CODE
CRITICALsrc/main/server/__tests__/mcp.ts249 mocks.jsonRPCClient.call.ctx.setting.getSettingsForMcp.mockResolvedValue({ theme: 'dark', readonly: true })CODE
CRITICALsrc/main/server/__tests__/mcp.ts263 mocks.jsonRPCClient.call.ctx.setting.getSchemaForMcp.mockResolvedValue({ properties: {} })CODE
CRITICALsrc/main/server/__tests__/index.ts1208 const engineGuard = mocks.socketEmitter.engine.use.mock.calls.at(-1)![0]CODE
CRITICAL⚡src/main/__tests__/app.ts349 mocks.jsonRPCClient.call.ctx.base.triggerDeepLinkOpen.mockClear()CODE
CRITICAL⚡src/main/__tests__/app.ts350 mocks.jsonRPCClient.call.ctx.doc.switchDocByPath.mockClear()CODE
CRITICAL⚡src/main/__tests__/app.ts351 mocks.jsonRPCClient.call.ctx.setting.showSettingPanel.mockClear()CODE
Hyper-Verbose Identifiers20 hits · 20 pts
SeverityFileLineSnippetContext
LOWsrc/renderer/plugins/markdown-macro.ts475 function buildGlobalMacroReplacement (settings: BuildInSettings) {CODE
LOWsrc/renderer/plugins/floating-editor.ts214 function hasVisibleMonacoEscapeWidget () {CODE
LOWsrc/renderer/plugins/floating-editor.ts227 function pausePreviewSyncForEditorScroll () {CODE
LOWsrc/renderer/plugins/floating-editor.ts696 function highlightPreviewClickLine (e: MouseEvent) {CODE
LOWsrc/renderer/plugins/insert-table/index.ts15 function buildTableCompletionItems (): SimpleCompletionItem[] | false {CODE
LOWsrc/renderer/others/premium.ts280async function refreshAndCheckLicenseStatus () {CODE
LOWsrc/renderer/others/extension.ts38export function getInstalledExtensionFileUrl (id: string, filename: string) {CODE
LOWsrc/renderer/others/extension.ts161export async function getRegistryExtensionVersions (id: string, registry: RegistryHostname = 'registry.npmjs.org'): PromCODE
LOWsrc/renderer/components/ExtensionManager.vue376async function refreshInstalledExtensions () {CODE
LOWsrc/renderer/components/DefaultPreviewerRender.ce.vue247function updateMarkdownBodyMaxWidth () {CODE
LOWsrc/renderer/components/Layout.vue250 function initContentRightSideResize (e: MouseEvent) {CODE
LOWsrc/renderer/support/api.ts606export async function abortExtensionInstallation (): Promise<any> {CODE
LOWsrc/renderer/services/editor.ts469export function tapMarkdownMonarchLanguage (tapper: (mdLanguage: any) => void) {CODE
LOWsrc/renderer/services/editor.ts478export function getMarkdownMonarchLanguage () {CODE
LOWsrc/renderer/services/editor.ts537export async function getAvailableCustomEditors (ctx: CustomEditorCtx): Promise<CustomEditor[]> {CODE
LOWsrc/renderer/services/export.ts429export async function printCurrentDocumentToPDF (opts?: PrintOpts, runtimeOptions: PrintPDFRuntimeOptions = {}): PromiseCODE
LOWsrc/renderer/services/layout.ts131export function toggleEditorPreviewExclusive (exclusive?: boolean) {CODE
LOWsrc/main/helper.ts36 function newStreamReadableFromReadableStream (readableStream: ReadableStream, options: any = {}) {CODE
LOWsrc/main/server/__tests__/mcp.ts51 StreamableHTTPServerTransport: vi.fn(function StreamableHTTPServerTransport (this: any) {CODE
LOWsrc/share/misc.ts38export function getDefaultApplicationAccelerators (platform: NodeJS.Platform, lang: Language = 'en') {CODE
Fake / Example Data14 hits · 14 pts
SeverityFileLineSnippetContext
LOWsrc/renderer/directives/placeholder.ts4 app.directive('placeholder', {CODE
LOWsrc/renderer/directives/__tests__/directives.ts52 'placeholder',CODE
LOWsrc/renderer/directives/__tests__/directives.ts106 const directive = installOne(placeholder, 'placeholder')CODE
LOWsrc/renderer/components/ExtensionManager.vue50 <div v-if="!registryExtensions" class="placeholder">{{ $t('loading') }}</div>CODE
LOWsrc/renderer/components/ExtensionManager.vue51 <div v-else-if="registryExtensions.length === 0 && installedExtensions?.length === 0" class="placeholder">{{CODE
LOWsrc/renderer/components/ExtensionManager.vue172 <div v-if="!iframeLoaded" class="placeholder">{{ $t('loading') }}</div>CODE
LOWsrc/renderer/components/ExtensionManager.vue183 <div v-else class="placeholder">{{ $t('loading') }}</div>CODE
LOWsrc/renderer/components/ExtensionManager.vue187 <div v-else class="placeholder">{{ $t('extension.extension-manager') }}</div>CODE
LOWsrc/renderer/components/QuickFilter.vue18 :placeholder="placeholder"CODE
LOWsrc/renderer/components/__tests__/basic-components.ts242 expect(input.element.getAttribute('placeholder')).toBe('enter name')CODE
LOWsrc/share/i18n/languages/zh-TW.ts86 'placeholder': '請輸入激活代碼',CODE
LOWsrc/share/i18n/languages/zh-CN.ts86 'placeholder': '请输入激活码',CODE
LOWsrc/share/i18n/languages/en.ts85 'placeholder': 'Enter license',CODE
LOWsrc/share/i18n/languages/ru.ts86 'placeholder': 'Введите лицензию',CODE
Over-Commented Block6 hits · 6 pts
SeverityFileLineSnippetContext
LOWtest/md/markmap.md41 + PrismJSCOMMENT
LOWtest/md/code-features.md181// Line 3COMMENT
LOWsrc/renderer/plugins/editor-md-list.ts141COMMENT
LOWsrc/renderer/others/fuzzy-match.ts1// https://github.com/forrestthewoods/lib_fts/blob/master/code/fts_fuzzy_match.jsCOMMENT
LOWsrc/renderer/services/export.ts241 ${codeBlockAssets}COMMENT
LOWsrc/main/server/index.ts461}COMMENT