AI Slop Code Risk Monitor

toeverything/blocksuite

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

🧩 Content editing tech stack for the web - BlockSuite is a toolkit for building editors and collaborative applications.

1.6 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for toeverything/blocksuite, a TypeScript project with 6,080 GitHub stars. SynthScan examined 286,480 lines of code across 2928 source files, recording 198 pattern matches distributed across 6 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
6.1K
Stars
TypeScript
Language
286.5K
Lines of Code
2.9K
Files
198
Pattern Hits
2026-10-31
Scan Date
0.01
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 3.6/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 4.2/100 · LOW

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

Agent Over-Engineering Ratio 2.0/100 · LOW

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

PR Review Velocity Impact 7.0/100 · LOW

Which changes need focused human review? 198 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 24HIGH 0MEDIUM 0LOW 174

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 198 distinct pattern matches across 6 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 Indicators24 hits · 240 pts
SeverityFileLineSnippetContext
CRITICAL…kages/playground/apps/_common/components/docs-panel.ts111 this.editor.doc.workspace.slots.docListUpdated.subscribe(() => {CODE
CRITICAL…ages/framework/std/src/view/element/block-component.ts219 const disposable = this.std.store.slots.blockUpdated.subscribe(CODE
CRITICAL…/affine/blocks/bookmark/src/bookmark-edgeless-block.ts35 this.gfx.selection.slots.updated.subscribe(() => {CODE
CRITICAL…c/src/embed-linked-doc-block/embed-linked-doc-block.ts525 this.store.workspace.slots.docListUpdated.subscribe(() => {CODE
CRITICAL…c/src/embed-synced-doc-block/embed-synced-doc-block.ts522 this.store.workspace.slots.docListUpdated.subscribe(() => {CODE
CRITICAL…oc/src/embed-synced-doc-block/init-height-extension.ts15 this.std.store.slots.blockUpdated.subscribe(payload => {CODE
CRITICAL…affine/blocks/root/src/edgeless/edgeless-root-block.ts160 this.gfx.layer.slots.layerUpdated.subscribe(() => updateLayers())CODE
CRITICAL…blocks/root/src/preview/edgeless-root-preview-block.ts119 this._gfx.layer.slots.layerUpdated.subscribe(() => updateLayers())CODE
CRITICALpackages/affine/fragments/outline/src/outline-viewer.ts205 this.editor.store.workspace.meta.docMetaUpdated.subscribe(() => {CODE
CRITICAL…s/affine/fragments/outline/src/card/outline-preview.ts55 const refMeta = block.store.workspace.meta.docMetas.find(CODE
CRITICAL…affine/shared/src/services/doc-display-meta-service.ts171 const disposable = this.std.workspace.slots.docListUpdated.subscribe(CODE
CRITICAL…s/affine/inlines/comment/src/inline-comment-manager.ts54 this.std.selection.slots.changed.subscribe(this._handleSelectionChanged)CODE
CRITICALpackages/affine/gfx/note/src/toolbar/note-menu.ts69 const [_, { insertedLinkType }] = this.edgeless.service.std.command.exec(CODE
CRITICALpackages/affine/gfx/mindmap/src/view/view.ts150 this.gfx.selection.slots.updated.subscribe(() => {CODE
CRITICAL…dgets/remote-selection/src/doc/doc-remote-selection.ts280 this.std.store.slots.blockUpdated.subscribe(() => {CODE
CRITICALpackages/affine/widgets/toolbar/src/toolbar.ts409 context.gfx.selection.slots.updated.subscribe(selections => {CODE
CRITICAL…ffine/widgets/scroll-anchoring/src/scroll-anchoring.ts102 this.std.store.slots.blockUpdated.subscribe(v => {CODE
CRITICAL…ffine/widgets/scroll-anchoring/src/scroll-anchoring.ts157 const subscription = this.std.store.slots.blockUpdated.subscribe(v => {CODE
CRITICAL…s/edgeless-selected-rect/src/edgeless-auto-complete.ts688 this.gfx.selection.slots.updated.subscribe(() => {CODE
CRITICAL…es/affine/widgets/linked-doc/src/linked-doc-popover.ts204 this.context.inlineEditor.slots.renderComplete.subscribe(() => {CODE
CRITICAL…es/affine/widgets/linked-doc/src/linked-doc-popover.ts224 this.context.inlineEditor.slots.renderComplete.subscribe(() => {CODE
CRITICAL…widgets/drag-handle/src/watchers/drag-event-watcher.ts1229 this.std.store.workspace.docs.has(sourceDocId) &&CODE
CRITICALpackages/affine/widgets/frame-title/src/frame-title.ts226 this.model.props.title.yText.unobserve(updateTitle);CODE
CRITICALpackages/affine/widgets/frame-title/src/frame-title.ts228 this.model.props.title.yText.observe(updateTitle);CODE
Hyper-Verbose Identifiers110 hits · 114 pts
SeverityFileLineSnippetContext
LOWpackages/playground/apps/_common/mock-services.ts155export function mockGenerateDocUrlService(collection: Workspace) {CODE
LOWpackages/playground/apps/starter/utils/collection.ts26export function createStarterDocCollection(CODE
LOW…ges/framework/std/src/inline/utils/point-conversion.ts159function getTextPointRoughlyFromElement(element: Element): TextPoint | null {CODE
LOW…ges/framework/std/src/inline/utils/point-conversion.ts166function getTextPointRoughlyFromElementByOffset(CODE
LOWpackages/framework/std/src/inline/utils/query.ts4export function getInlineEditorInsideRoot(CODE
LOWpackages/framework/std/src/__tests__/inline/utils.ts19export async function enterInlineEditorPlayground(page: Page) {CODE
LOWpackages/framework/std/src/__tests__/inline/utils.ts41export async function getDeltaFromInlineRichText(CODE
LOWpackages/framework/std/src/__tests__/inline/utils.ts60export async function getInlineRangeFromInlineRichText(CODE
LOW…kages/framework/std/src/clipboard/clipboard-adapter.ts22export function ClipboardAdapterConfigExtension(CODE
LOWpackages/framework/global/src/gfx/bound.ts20export function getPointsFromBoundWithRotation(CODE
LOWpackages/framework/global/src/gfx/bound.ts108export function getCommonBoundWithRotation(bounds: IBound[]): Bound {CODE
LOWpackages/framework/global/src/gfx/math.ts504export function getPointFromBoundsWithRotation(CODE
LOWpackages/framework/global/src/gfx/curve.ts155export function getBezierCurveBoundingBox(values: BezierCurveParameters) {CODE
LOW…kages/framework/store/src/extension/store-extension.ts57export function isStoreExtensionConstructor(CODE
LOWpackages/framework/store/src/test/index.ts7export function createAutoIncrementIdGenerator(): IdGenerator {CODE
LOW…/framework/store/src/__tests__/collection.unit.spec.ts72function requestIdleCallbackPolyfill(CODE
LOWpackages/framework/store/src/model/store/query.ts72function setAncestorsToDisplayIfHidden(mode: QueryMode, block: Block) {CODE
LOWpackages/affine/blocks/embed/src/types.ts14export function isExternalEmbedBlockComponent(CODE
LOW…s/affine/blocks/embed/src/embed-youtube-block/utils.ts61export async function refreshEmbedYoutubeUrlData(CODE
LOW…es/affine/blocks/embed/src/common/render-linked-doc.ts80export function getDocContentWithMaxLength(doc: Store, maxlength = 500) {CODE
LOW…es/affine/blocks/embed/src/common/render-linked-doc.ts115export function getTitleFromSelectedModels(selectedModels: DraftModel[]) {CODE
LOW…es/affine/blocks/embed/src/common/render-linked-doc.ts150export async function convertSelectedBlocksToLinkedDoc(CODE
LOW…affine/blocks/embed/src/common/adapters/notion-html.ts7export function createEmbedBlockNotionHtmlAdapterMatcher(CODE
LOW…es/affine/blocks/embed/src/common/adapters/markdown.ts3export function createEmbedBlockMarkdownAdapterMatcher(CODE
LOW…/affine/blocks/embed/src/common/adapters/plain-text.ts3export function createEmbedBlockPlainTextAdapterMatcher(CODE
LOW…ckages/affine/blocks/embed/src/common/adapters/html.ts3export function createEmbedBlockHtmlAdapterMatcher(CODE
LOW…c/embed-iframe-block/configs/providers/google-drive.ts36function isValidGoogleDriveFileUrl(parsedUrl: URL): boolean {CODE
LOW…c/embed-iframe-block/configs/providers/google-drive.ts51function isValidGoogleDriveFolderUrl(parsedUrl: URL): boolean {CODE
LOW…c/embed-iframe-block/configs/providers/google-drive.ts65function isValidGoogleDrivePathUrl(parsedUrl: URL): boolean {CODE
LOW…c/embed-iframe-block/configs/providers/google-drive.ts121function buildGoogleDriveFileEmbedUrl(fileId: string): string | undefined {CODE
LOW…c/embed-iframe-block/configs/providers/google-drive.ts135function buildGoogleDriveFolderEmbedUrl(folderId: string): string | undefined {CODE
LOWpackages/affine/blocks/embed/src/configs/toolbar.ts86function createBuiltinToolbarConfigForExternal(CODE
LOW…es/affine/blocks/embed/src/embed-github-block/utils.ts76export async function refreshEmbedGithubUrlData(CODE
LOWpackages/affine/blocks/attachment/src/utils.ts144export async function addSiblingAttachmentBlocks(CODE
LOWpackages/affine/blocks/attachment/src/embed.ts66export function AttachmentEmbedConfigExtension(CODE
LOW…kages/affine/blocks/code/src/code-preview-extension.ts18export function CodeBlockPreviewExtension(CODE
LOWpackages/affine/blocks/code/src/clipboard/index.ts28export function CodeClipboardAdapterConfigExtension(CODE
LOWpackages/affine/blocks/code/src/clipboard/index.ts166export function getCodeClipboardExtensions(): ExtensionType[] {CODE
LOW…fine/blocks/surface/src/utils/points-on-curve/index.ts55function getPointsOnBezierCurveWithSplitting(CODE
LOW…ne/blocks/surface/src/extensions/surface-middleware.ts12export function surfaceMiddlewareExtension(CODE
LOW…/surface/src/adapters/markdown/element-adapter/type.ts17export function ElementToMarkdownAdapterExtension(CODE
LOW…urface/src/adapters/plain-text/element-adapter/type.ts17export function ElementToPlainTextAdapterExtension(CODE
LOW…ckages/affine/blocks/image/src/image-resize-manager.ts103function getClosestRootBlockComponent(el: HTMLElement): BlockComponent | null {CODE
LOWpackages/affine/blocks/table/src/table-data-manager.ts8export class TableDataManager {CODE
LOWpackages/affine/blocks/list/src/commands/utils.ts14export function correctNumberedListsOrderToPrev(CODE
LOW…root/src/edgeless/configs/toolbar/render-linked-doc.ts50export function createLinkedDocFromEdgelessElements(CODE
LOW…ges/affine/blocks/root/src/edgeless/clipboard/utils.ts24export function createNewPresentationIndexes(CODE
LOW…ges/affine/blocks/root/src/edgeless/clipboard/utils.ts107export function edgelessElementsBoundFromRawData(CODE
LOW…ges/affine/blocks/root/src/edgeless/clipboard/utils.ts128function getBoundFromSerializedElement(element: SerializedElement) {CODE
LOW…ges/affine/blocks/root/src/edgeless/clipboard/utils.ts137function getBoundFromGfxBlockSnapshot(snapshot: BlockSnapshot) {CODE
LOW…s/affine/blocks/root/src/edgeless/clipboard/command.ts172function updatePastedElementsIndex(CODE
LOWpackages/affine/fragments/outline/src/utils/scroll.ts34export function isBlockBeforeViewportCenter(CODE
LOWpackages/affine/fragments/outline/src/utils/scroll.ts156export async function scrollToBlockWithHighlight(CODE
LOWpackages/affine/all/src/extensions/view.ts60export function getInternalViewExtensions() {CODE
LOWpackages/affine/all/src/extensions/store.ts34export function getInternalStoreExtensions() {CODE
LOWpackages/affine/shared/src/utils/fractional-indexing.ts15export function generateFractionalIndexingKeyBetween(CODE
LOWpackages/affine/shared/src/utils/reference.ts37export function cloneReferenceInfoWithoutAliases({CODE
LOWpackages/affine/shared/src/utils/event.ts43export function isControlledKeyboardEvent(e: KeyboardEvent) {CODE
LOW⚡…/affine/shared/src/utils/dnd/get-drop-rect-by-point.ts117function getDatabaseBlockTableElement(element: Element) {CODE
LOW⚡…/affine/shared/src/utils/dnd/get-drop-rect-by-point.ts124function getDatabaseBlockColumnHeaderElement(element: Element) {CODE
50 more matches not shown…
Structural Annotation Overuse24 hits · 44 pts
SeverityFileLineSnippetContext
LOW⚡packages/framework/std/src/gfx/viewport-element.ts85 // Step 1: Activate all the blocks that should be visibleCOMMENT
LOW⚡packages/framework/std/src/gfx/viewport-element.ts92 // Step 2: Hide all the blocks that should not be visibleCOMMENT
LOWpackages/framework/sync/src/doc/engine.ts127 // Step 1: start main sync peerCOMMENT
LOW⚡packages/framework/sync/src/doc/engine.ts145 // Step 2: wait for main sync completeCOMMENT
LOW⚡packages/framework/sync/src/doc/engine.ts148 // Step 3: start shadow sync peerCOMMENT
LOWpackages/framework/sync/src/doc/engine.ts170 // Step 4: continuously sync main and shadowCOMMENT
LOW⚡packages/framework/sync/src/doc/peer.ts243 // Step 1: load root docCOMMENT
LOW⚡packages/framework/sync/src/doc/peer.ts246 // Step 2: load subdocsCOMMENT
LOWpackages/framework/store/src/extension/extension.ts20 * ## Step 1: Define the interfacesCOMMENT
LOW⚡packages/framework/store/src/extension/extension.ts33 * ## Step 2: Create a service identifierCOMMENT
LOW⚡packages/framework/store/src/extension/extension.ts41 * ## Step 3: Create implementationsCOMMENT
LOWpackages/framework/store/src/extension/extension.ts59 * ## Step 4: Create an extension factoryCOMMENT
LOW⚡packages/framework/store/src/extension/extension.ts74 * ## Step 5: Create concrete extensionsCOMMENT
LOW⚡packages/framework/store/src/extension/extension.ts81 * ## Step 6: Use the extensionsCOMMENT
LOW…ckages/docs/api/@blocksuite/store/classes/Extension.md25## Step 1: Define the interfacesCOMMENT
LOW…ckages/docs/api/@blocksuite/store/classes/Extension.md38## Step 2: Create a service identifierCOMMENT
LOW…ckages/docs/api/@blocksuite/store/classes/Extension.md46## Step 3: Create implementationsCOMMENT
LOW…ckages/docs/api/@blocksuite/store/classes/Extension.md64## Step 4: Create an extension factoryCOMMENT
LOW…ckages/docs/api/@blocksuite/store/classes/Extension.md79## Step 5: Create concrete extensionsCOMMENT
LOW…ckages/docs/api/@blocksuite/store/classes/Extension.md86## Step 6: Use the extensionsCOMMENT
LOW…ges/affine/blocks/surface/src/renderer/dom-renderer.ts634 // Step 1: Handle elements whose models are deleted from the surfaceCOMMENT
LOW…ges/affine/blocks/surface/src/renderer/dom-renderer.ts650 // Step 2: Render elements in the current viewportCOMMENT
LOW…ges/affine/blocks/surface/src/renderer/dom-renderer.ts686 // Step 3: Remove DOM elements that are in _elementsMap but were not processed in Step 2COMMENT
LOW…ges/affine/blocks/surface/src/renderer/dom-renderer.ts701 // Step 4: Notify about changesCOMMENT
Verbosity Indicators19 hits · 36 pts
SeverityFileLineSnippetContext
LOW⚡packages/framework/std/src/gfx/viewport-element.ts85 // Step 1: Activate all the blocks that should be visibleCOMMENT
LOW⚡packages/framework/std/src/gfx/viewport-element.ts92 // Step 2: Hide all the blocks that should not be visibleCOMMENT
LOWpackages/framework/sync/src/doc/engine.ts127 // Step 1: start main sync peerCOMMENT
LOW⚡packages/framework/sync/src/doc/engine.ts145 // Step 2: wait for main sync completeCOMMENT
LOW⚡packages/framework/sync/src/doc/engine.ts148 // Step 3: start shadow sync peerCOMMENT
LOWpackages/framework/sync/src/doc/engine.ts170 // Step 4: continuously sync main and shadowCOMMENT
LOW⚡packages/framework/sync/src/doc/peer.ts243 // Step 1: load root docCOMMENT
LOW⚡packages/framework/sync/src/doc/peer.ts246 // Step 2: load subdocsCOMMENT
LOWpackages/framework/store/src/extension/extension.ts20 * ## Step 1: Define the interfacesCOMMENT
LOW⚡packages/framework/store/src/extension/extension.ts33 * ## Step 2: Create a service identifierCOMMENT
LOW⚡packages/framework/store/src/extension/extension.ts41 * ## Step 3: Create implementationsCOMMENT
LOWpackages/framework/store/src/extension/extension.ts59 * ## Step 4: Create an extension factoryCOMMENT
LOW⚡packages/framework/store/src/extension/extension.ts74 * ## Step 5: Create concrete extensionsCOMMENT
LOW⚡packages/framework/store/src/extension/extension.ts81 * ## Step 6: Use the extensionsCOMMENT
LOW…ges/affine/blocks/surface/src/renderer/dom-renderer.ts634 // Step 1: Handle elements whose models are deleted from the surfaceCOMMENT
LOW…ges/affine/blocks/surface/src/renderer/dom-renderer.ts650 // Step 2: Render elements in the current viewportCOMMENT
LOW…ges/affine/blocks/surface/src/renderer/dom-renderer.ts686 // Step 3: Remove DOM elements that are in _elementsMap but were not processed in Step 2COMMENT
LOW…ges/affine/blocks/surface/src/renderer/dom-renderer.ts701 // Step 4: Notify about changesCOMMENT
LOWpackages/affine/components/src/peek/peekable.ts61 * In edgeless mode, we need to check if the click target is not covered byCOMMENT
Over-Commented Block16 hits · 16 pts
SeverityFileLineSnippetContext
LOWpackages/framework/global/src/di/stable-hash.ts1// copied from https://github.com/shuding/stable-hashCOMMENT
LOWpackages/framework/global/src/lit/watch.ts41 this.__dispose?.();COMMENT
LOWpackages/framework/global/src/lit/signal-watcher.ts41 if (this.isUpdatePending === false || this.isConnected === false) {COMMENT
LOWpackages/affine/blocks/frame/src/frame-manager.ts241 surfaceModel.elementAdded.subscribe(({ id, local }) => {COMMENT
LOWpackages/affine/shared/src/utils/figma-squircle/draw.ts21// The original code by MartinRGBCOMMENT
LOW…es/affine/components/src/color-picker/custom-button.ts41 content-box,COMMENT
LOW…/view-presets/table/pc-virtual/controller/selection.ts721 const newSelection = this.focusToArea(selection);COMMENT
LOW…/view-presets/table/pc-virtual/controller/selection.ts761 // inline: 'nearest',COMMENT
LOW…/view-presets/table/pc-virtual/controller/selection.ts821 newSelection.rowsSelection.start - 1COMMENT
LOW…w/src/view-presets/table/pc-virtual/controller/drag.ts1// related componentCOMMENT
LOW…w/src/view-presets/table/pc-virtual/controller/drag.ts21 // | undefinedCOMMENT
LOW…w/src/view-presets/table/pc-virtual/controller/drag.ts41 // }COMMENT
LOW…w/src/view-presets/table/pc-virtual/controller/drag.ts61 // }COMMENT
LOW…w/src/view-presets/table/pc-virtual/controller/drag.ts141 // // const event = context.get('pointerState').raw;COMMENT
LOW…w/src/view-presets/table/pc-virtual/controller/drag.ts161COMMENT
LOW…get-presets/tools/presets/view-options/view-options.ts321 return html` <div style="display: flex">${result}</div>`;COMMENT
Fake / Example Data5 hits · 5 pts
SeverityFileLineSnippetContext
LOW…/integration-test/src/__tests__/utils/doc-generator.ts14 'Hello World! Lorem ipsum dolor sit amet. Consectetur adipiscing elit. Sed do eiusmod tempor incididunt.'CODE
LOW…/integration-test/src/__tests__/utils/doc-generator.ts14 'Hello World! Lorem ipsum dolor sit amet. Consectetur adipiscing elit. Sed do eiusmod tempor incididunt.'CODE
LOW…es/affine/fragments/frame-panel/src/card/frame-card.ts244 accessor status: 'selected' | 'dragging' | 'placeholder' | 'none' = 'none';CODE
LOW…ine/fragments/frame-panel/src/body/frame-panel-body.ts273 ? 'placeholder'CODE
LOW…ages/affine/inlines/latex/src/latex-node/latex-node.ts136 html`<span class="placeholder">Equation</span>`,CODE