AI Slop Code Risk Monitor

penpot/penpot

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

Penpot: The open-source design platform for Product teams that need scalable collaboration.

2.2 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for penpot/penpot, a Clojure project with 61,905 GitHub stars. SynthScan examined 443,457 lines of code across 1897 source files, recording 554 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 2.2 (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.

2.2
Adjusted Signal
2.2
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
61.9K
Stars
Clojure
Language
443.5K
Lines of Code
1.9K
Files
554
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 3.8/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 3.5/100 · LOW

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

Agent Over-Engineering Ratio 4.7/100 · LOW

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

PR Review Velocity Impact 9.2/100 · LOW

Which changes need focused human review? 554 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 7HIGH 2MEDIUM 115LOW 430

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 554 distinct pattern matches across 16 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.

Decorative Section Separators92 hits · 294 pts
SeverityFileLineSnippetContext
MEDIUMmanage.sh82# ----------------------------------------------------------------------------COMMENT
MEDIUMmanage.sh119# ----------------------------------------------------------------------------COMMENT
MEDIUM⚡frontend/src/app/main/ui/dashboard/grid.scss14// ─── VARIABLES ─────────────────────────────────COMMENT
MEDIUM⚡frontend/src/app/main/ui/dashboard/grid.scss20// ─── DASHBOARD GRID ────────────────────────────COMMENT
MEDIUM⚡frontend/src/app/main/ui/dashboard/grid.scss30// ─── GRID ROW ──────────────────────────────────COMMENT
MEDIUMfrontend/src/app/main/ui/dashboard/grid.scss50// ─── CARD VIEW: GRID ITEM ─────────────────────COMMENT
MEDIUMfrontend/src/app/main/ui/dashboard/grid.scss157// ─── CARD VIEW: PROJECT THUMBNAIL ──────────────COMMENT
MEDIUMfrontend/src/app/main/ui/dashboard/grid.scss203// ─── LIST VIEW ─────────────────────────────────COMMENT
MEDIUMfrontend/src/app/main/ui/dashboard/grid.scss290// ─── LIBRARY ───────────────────────────────────COMMENT
MEDIUMfrontend/src/app/main/ui/dashboard/grid.scss391// ─── MISC ──────────────────────────────────────COMMENT
MEDIUMplugins/apps/composable-test-suite/src/main.ts8// ── theme (plugin-styles colour variables are gated on [data-theme]) ───────────COMMENT
MEDIUMplugins/apps/composable-test-suite/src/main.ts14// ── messages exchanged with the sandbox ────────────────────────────────────────COMMENT
MEDIUMplugins/apps/composable-test-suite/src/main.ts35// ── a single test row ───────────────────────────────────────────────────────────COMMENT
MEDIUMplugins/apps/composable-test-suite/src/main.ts163// ── a group of rows (one test case) ─────────────────────────────────────────────COMMENT
MEDIUMplugins/apps/composable-test-suite/src/main.ts269// ── controller: builds the tree, wires selection and the run buttons ────────────COMMENT
MEDIUMplugins/apps/composable-test-suite/src/main.ts359// ── wire up ─────────────────────────────────────────────────────────────────────COMMENT
MEDIUMmcp/packages/server/src/PenpotMcpServer.test.ts33// ── Pure function tests ────────────────────────────────────────COMMENT
MEDIUMmcp/packages/server/src/PenpotMcpServer.test.ts47// ── Pure function tests: isReplEnabled ──────────────────────────COMMENT
MEDIUMmcp/packages/server/src/PenpotMcpServer.test.ts69// ── Integration tests: constructor gating ──────────────────────COMMENT
MEDIUMmcp/packages/server/src/PenpotMcpServer.test.ts217// ── Helpers ────────────────────────────────────────────────────COMMENT
MEDIUM⚡…p/packages/server/src/tools/dev/CljCheckParentheses.ts150 // ── Newline ──────────────────────────────────────────────────────COMMENT
MEDIUM⚡…p/packages/server/src/tools/dev/CljCheckParentheses.ts158 // ── Escape: skip next character ──────────────────────────────────COMMENT
MEDIUM⚡…p/packages/server/src/tools/dev/CljCheckParentheses.ts164 // ── Inside comment: skip until newline ───────────────────────────COMMENT
MEDIUM⚡…p/packages/server/src/tools/dev/CljCheckParentheses.ts167 // ── Inside string literal ────────────────────────────────────────COMMENT
MEDIUM⚡…p/packages/server/src/tools/dev/CljCheckParentheses.ts174 // ── Outside string / comment ─────────────────────────────────────COMMENT
MEDIUM…p/packages/server/src/tools/dev/CljCheckParentheses.ts188 // ── Opening delimiter ────────────────────────────────────────────COMMENT
MEDIUM…p/packages/server/src/tools/dev/CljCheckParentheses.ts222 // ── Closing delimiter ────────────────────────────────────────────COMMENT
MEDIUM…p/packages/server/src/tools/dev/CljCheckParentheses.ts234 // ── EOF: no mismatch was found, but the stack is not empty ──────────COMMENT
MEDIUMscripts/gh.py98# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py100# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py131# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py133# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py215# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py217# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py253# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py255# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py488 # ── No-milestone path ──────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py494 # ── Milestone path ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py545# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py547# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py706 # ── Milestone path ──────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py722 # ── Number-based path ───────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py742# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py744# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py891# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py893# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py960 # ── Single advisory detail ──────────────────────────────COMMENT
MEDIUMscripts/gh.py970 # ── List all advisories ─────────────────────────────────COMMENT
MEDIUMscripts/gh.py991# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/gh.py993# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/taiga.py41# ── URL Parsing ──────────────────────────────────────────────────────────────COMMENT
MEDIUM⚡scripts/taiga.py57# ── API call ─────────────────────────────────────────────────────────────────COMMENT
MEDIUM⚡scripts/taiga.py81# ── Output formatting ────────────────────────────────────────────────────────COMMENT
MEDIUMscripts/taiga.py184# ── CLI ───────────────────────────────────────────────────────────────────────COMMENT
MEDIUMscripts/changelog.py38# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/changelog.py40# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/changelog.py128# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/changelog.py130# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/changelog.py158# ─────────────────────────────────────────────COMMENT
MEDIUMscripts/changelog.py160# ─────────────────────────────────────────────COMMENT
32 more matches not shown…
Fake / Example Data177 hits · 212 pts
SeverityFileLineSnippetContext
LOW⚡…d/text-editor/src/editor/content/dom/Paragraph.test.js75 // "Lorem ipsum" as a paragraph with a text span.COMMENT
LOW⚡…d/text-editor/src/editor/content/dom/Paragraph.test.js77 const paragraph = createParagraphWith("Lorem ipsum");CODE
LOW⚡…d/text-editor/src/editor/content/dom/Paragraph.test.js83 expect(paragraph.firstChild.firstChild.textContent).toBe("Lorem ipsum");CODE
LOW⚡…d/text-editor/src/editor/content/dom/Paragraph.test.js85 // ["Lorem ipsum"] as a paragraph with a text span.COMMENT
LOW⚡…d/text-editor/src/editor/content/dom/Paragraph.test.js87 const paragraph = createParagraphWith(["Lorem ipsum"]);CODE
LOW⚡…d/text-editor/src/editor/content/dom/Paragraph.test.js93 expect(paragraph.firstChild.firstChild.textContent).toBe("Lorem ipsum");CODE
LOW⚡…d/text-editor/src/editor/content/dom/Paragraph.test.js95 // ["Lorem ipsum","\n","dolor sit amet"] as a paragraph with multiple text spans.COMMENT
LOW⚡…d/text-editor/src/editor/content/dom/Paragraph.test.js95 // ["Lorem ipsum","\n","dolor sit amet"] as a paragraph with multiple text spans.COMMENT
LOW⚡…d/text-editor/src/editor/content/dom/Paragraph.test.js97 const paragraph = createParagraphWith(["Lorem ipsum", "\n", "dolor sit amet"]);CODE
LOW⚡…d/text-editor/src/editor/content/dom/Paragraph.test.js97 const paragraph = createParagraphWith(["Lorem ipsum", "\n", "dolor sit amet"]);CODE
LOW⚡…d/text-editor/src/editor/content/dom/Paragraph.test.js103 expect(paragraph.children.item(0).firstChild.textContent).toBe("Lorem ipsum");CODE
LOW⚡…d/text-editor/src/editor/content/dom/Paragraph.test.js108 expect(paragraph.children.item(2).firstChild.textContent).toBe("dolor sit amet");CODE
LOW…d/text-editor/src/editor/content/dom/Paragraph.test.js186 createTextSpan(new Text("Lorem ipsum sit")),CODE
LOW⚡…end/text-editor/src/editor/content/dom/Content.test.js49 "Lorem ipsum",CODE
LOW⚡…end/text-editor/src/editor/content/dom/Content.test.js50 "Dolor sit amet",CODE
LOW⚡…end/text-editor/src/editor/content/dom/Content.test.js55 "<div>Lorem ipsum</div><div>Dolor sit amet</div><div>Sed iaculis blandit odio ornare sagittis.</div>",CODE
LOW⚡…end/text-editor/src/editor/content/dom/Content.test.js55 "<div>Lorem ipsum</div><div>Dolor sit amet</div><div>Sed iaculis blandit odio ornare sagittis.</div>",CODE
LOW…end/text-editor/src/editor/content/dom/Content.test.js75 "Lorem ipsumDolor sit ametSed iaculis blandit odio ornare sagittis.",CODE
LOW…end/text-editor/src/editor/content/dom/Content.test.js75 "Lorem ipsumDolor sit ametSed iaculis blandit odio ornare sagittis.",CODE
LOW…tor/src/editor/controllers/SelectionController.test.js339 expect(textEditorMock.root.textContent).toBe("Lorem ipsum dolor");CODE
LOW…tor/src/editor/controllers/SelectionController.test.js464 expect(textEditorMock.root.textContent).toBe("Lorem ipsum dolor");CODE
LOW…tor/src/editor/controllers/SelectionController.test.js1251 ["Lorem ipsum"],CODE
LOW…tor/src/editor/controllers/SelectionController.test.js1252 ["dolor sit amet"],CODE
LOWfrontend/playwright/ui/specs/numeric-input.spec.js281 await expect(widthInput).toHaveAttribute("placeholder", "Mixed");CODE
LOW…ontend/playwright/ui/specs/dashboard-libraries.spec.js22 const libraryItem = page.getByTitle(/Lorem Ipsum/);CODE
LOWfrontend/playwright/ui/specs/workspace.spec.js536 await page.evaluate(() => navigator.clipboard.writeText("Lorem ipsum dolor"));CODE
LOWfrontend/playwright/ui/specs/workspace.spec.js541 .getByText("Lorem ipsum dolor");CODE
LOWfrontend/playwright/ui/specs/text-editor-v3.spec.js385 await workspace.clickLeafLayer("Lorem ipsum");CODE
LOWfrontend/playwright/ui/specs/text-editor-v3.spec.js394 expect(copiedText).toBe("Lorem ipsum");CODE
LOWfrontend/playwright/ui/specs/text-editor-v3.spec.js498 await workspace.clickLeafLayer("Lorem ipsum");CODE
LOWfrontend/playwright/ui/specs/text-editor-v3.spec.js550 await expect.poll(() => readClipboard(page)).toBe("Lorem ipsum");CODE
LOWfrontend/playwright/ui/specs/text-editor-v3.spec.js559 await expect.poll(() => readClipboard(page)).toBe("Lorem ipsum");CODE
LOWfrontend/playwright/ui/specs/text-editor-v3.spec.js635 await expect.poll(() => copiedText(page)).toBe("Lorem ipsum");CODE
LOW⚡frontend/playwright/ui/specs/multiseleccion.spec.js72 await expect(widthInput).toHaveAttribute("placeholder", "Mixed");CODE
LOW⚡frontend/playwright/ui/specs/multiseleccion.spec.js73 await expect(heightInput).toHaveAttribute("placeholder", "Mixed");CODE
LOW⚡frontend/playwright/ui/specs/multiseleccion.spec.js74 await expect(xPosInput).toHaveAttribute("placeholder", "Mixed");CODE
LOW⚡frontend/playwright/ui/specs/multiseleccion.spec.js75 await expect(yPosInput).toHaveAttribute("placeholder", "Mixed");CODE
LOWfrontend/playwright/ui/specs/multiseleccion.spec.js201 await expect(rotationInput).toHaveAttribute("placeholder", "Mixed");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js79 await workspace.clickLeafLayer("Lorem ipsum");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js82 await page.keyboard.type(" dolor sit amet");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js84 await workspace.waitForSelectedShapeName("Lorem ipsum dolor sit amet");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js84 await workspace.waitForSelectedShapeName("Lorem ipsum dolor sit amet");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js96 await workspace.clickLeafLayer("Lorem ipsum");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js99 await page.keyboard.type("Dolor sit amet ");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js101 await workspace.waitForSelectedShapeName("Dolor sit amet Lorem ipsum");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js101 await workspace.waitForSelectedShapeName("Dolor sit amet Lorem ipsum");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js113 await workspace.clickLeafLayer("Lorem ipsum");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js116 await page.keyboard.type(" dolor sit amet");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js118 await workspace.waitForSelectedShapeName("Lorem dolor sit amet ipsum");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js124 const textToPaste = " dolor sit amet";CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js134 await workspace.clickLeafLayer("Lorem ipsum");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js139 await workspace.waitForSelectedShapeName("Lorem ipsum dolor sit amet");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js139 await workspace.waitForSelectedShapeName("Lorem ipsum dolor sit amet");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js145 const textToPaste = "Dolor sit amet ";CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js155 await workspace.clickLeafLayer("Lorem ipsum");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js168 const textToPaste = "Dolor sit amet";CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js175 await workspace.clickLeafLayer("Lorem ipsum");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js184 await workspace.waitForSelectedShapeName("Dolor sit amet ipsum");CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js190 const textToPaste = "dolor sit amet";CODE
LOW⚡frontend/playwright/ui/specs/text-editor-v2.spec.js197 await workspace.clickLeafLayer("Lorem ipsum");CODE
117 more matches not shown…
Hyper-Verbose Identifiers98 hits · 118 pts
SeverityFileLineSnippetContext
LOWfrontend/text-editor/src/editor/content/dom/Style.js120function getStyleDefaultsDeclaration() {CODE
LOWfrontend/text-editor/src/editor/content/dom/Content.js29function isContentFragmentFromDocumentTextSpan(document) {CODE
LOWfrontend/text-editor/src/editor/content/dom/Content.js56export function mapContentFragmentFromDocument(document, root, styleDefaults) {CODE
LOWfrontend/text-editor/src/editor/content/dom/Content.js201export function mapContentFragmentFromHTML(CODE
LOWfrontend/text-editor/src/editor/content/dom/Content.js228export function mapContentFragmentFromString(string, styleDefaults) {CODE
LOWfrontend/text-editor/src/editor/clipboard/paste.js21function getFormattedFragmentFromClipboardData(CODE
LOWfrontend/text-editor/src/editor/clipboard/paste.js37function getPlainFragmentFromClipboardData(selectionController, clipboardData) {CODE
LOWfrontend/text-editor/src/editor/clipboard/paste.js50function getFormattedOrPlainFragmentFromClipboardData(CODE
LOWfrontend/text-editor/src/editor/clipboard/paste.test.js14function createPlainTextClipboardEvent(text) {CODE
LOW…/playwright/ui/specs/text-options-missing-font.spec.js17function convertToTypographyButton(workspace) {CODE
LOWfrontend/playwright/ui/specs/text-editor-v3.spec.js709 async function expectBoardShrinksWhileTyping(workspace, text, boardY) {CODE
LOWfrontend/scripts/find-unused-translations.js51async function findExecutionTimeTranslations() {CODE
LOWfrontend/scripts/_helpers.js596export async function compileFontsPreviewSprite() {CODE
LOWfrontend/scripts/_worker.js42function configureModulesProcessor(options) {CODE
LOWfrontend/packages/draft-js/index.js205export function removeBlurSelectionEntity(state) {CODE
LOW…/plugins-runtime/src/lib/load-plugin-real-path.spec.ts96function lastCompartmentGlobalThis(): Record<string, unknown> {CODE
LOW…ns/libs/plugins-runtime/src/lib/api/plugin-api.spec.ts8 function generateMockPluginManager() {CODE
LOWplugins/apps/composable-test-suite/ci/run-ci.ts125async function openNotificationsWebSocket(page: Page, created: Set<string>): Promise<void> {CODE
LOW…posable-tests/cases/caseMainChildMovedOutLeavesCopy.ts26export function createTestCaseMainChildMovedOutLeavesCopy(): TestCase {CODE
LOW…omposable-tests/cases/caseMainReorderKeepsCopySlots.ts16export function createTestCaseMainReorderKeepsCopySlots(): TestCase {CODE
LOW…able-tests/cases/caseCopyOverrideSurvivesMainChange.ts21export function createTestCaseCopyOverrideSurvivesMainChange(): TestCase {CODE
LOW…composable-tests/cases/caseRemoteMainCopySyncNested.ts34export function createTestCaseRemoteMainCopySyncNested(): TestCase {CODE
LOW…/composable-tests/cases/caseVariantSwitchPropagates.ts26export function createTestCaseVariantSwitchPropagates(): TestCase {CODE
LOW…-suite/src/composable-tests/cases/caseMainEditSyncs.ts27export function createTestCaseMainEditSyncs(): TestCase {CODE
LOW…ble-tests/cases/caseCopySubheadDeletePreservesSlots.ts22export function createTestCaseCopySubheadDeletePreservesSlots(): TestCase {CODE
LOWplugins/apps/plugin-api-test-suite/ci/run-ci.ts283async function openNotificationsWebSocket(page: Page): Promise<void> {CODE
LOW…ins/apps/plugin-api-test-suite/src/framework/runner.ts55function assertNoNewIntegrityErrors(before: Set<string>): void {CODE
LOW…pps/plugin-api-test-suite/src/tests/components.test.ts36function boardComponentMainWithChildren(ctx: TestContext): Board {CODE
LOW…pps/plugin-api-test-suite/src/tests/components.test.ts48function componentMainFromClonedNestedMain(ctx: TestContext): Board {CODE
LOW…ns/apps/plugin-api-test-suite/src/tests/tokens.test.ts36async function rectangleWithStrokeTokens(ctx: TestContext) {CODE
LOWplugins/apps/poc-state-plugin/src/plugin.ts604function combineSelectedAsVariants() {CODE
LOWmcp/types-generator/test_prepare_api_docs.py7 def test_preserves_line_breaks_in_code_examples(self):CODE
LOWmcp/types-generator/prepare_api_docs.py136 def _convert_strings_to_block(self, obj):CODE
LOWmcp/packages/plugin/src/ReconnectPolicy.ts16export function shouldReconnectAfterClose(code: number): boolean {CODE
LOWmcp/packages/server/src/PenpotMcpServer.ts50export function shouldRegisterDeveloperTools(isDevEnv: boolean, isMultiUserMode: boolean): boolean {CODE
LOWscripts/gh.py355def fetch_no_milestone_issues(states: str, labels: str | None = None) -> list[dict]:CODE
LOWscripts/gh.py470def load_existing_issue_numbers(filepath: str) -> set[int]:CODE
LOW⚡scripts/test_ci.py63 def test_build_all_has_one_command_per_module_without_common(self):CODE
LOW⚡scripts/test_ci.py72 def test_build_is_not_part_of_the_default_tasks(self):CODE
LOW⚡scripts/test_ci.py80 def test_build_flag_runs_build_only(self):CODE
LOW⚡scripts/test_ci.py88 def test_no_build_flag_is_accepted(self):CODE
LOW⚡scripts/test_ci.py95 def test_dry_run_executes_nothing(self):CODE
LOW⚡scripts/test_ci.py104 def test_module_is_accepted_and_lint_is_skipped(self):CODE
LOW⚡scripts/test_ci.py115 def test_module_is_included_in_all(self):CODE
LOW⚡scripts/test_ci.py122 def test_build_runs_types_check_before_esbuild(self):CODE
LOWscripts/test_ci.py142 def test_help_documents_the_build_flags(self):CODE
LOWscripts/test_ci.py150 def test_help_lists_every_module(self):CODE
LOWscripts/test_gh.py54 def test_link_issue_to_pr_adds_reference(self, run_graphql):CODE
LOWscripts/test_gh.py72 def test_link_issue_to_pr_fails_when_mutation_did_not_link(self, run_graphql):CODE
LOWscripts/test_gh.py82 def test_cmd_link_issue_outputs_result(self, link_issue):CODE
LOWscripts/test_gh.py101 def test_cmd_link_issue_exits_on_error(self, _link_issue):CODE
LOWscripts/test_sync_pnpm_version.py93 def test_stamp_updates_stale_inserts_missing_keeps_synced(self):CODE
LOWscripts/test_sync_pnpm_version.py114 def test_check_passes_once_synced(self):CODE
LOWscripts/test_sync_pnpm_version.py119 def test_check_fails_on_drift_without_writing(self):CODE
LOWscripts/test_sync_pnpm_version.py132 def test_check_reports_missing_field(self):CODE
LOWscripts/test_sync_pnpm_version.py137 def test_target_dirs_are_never_stamped(self):CODE
LOW⚡scripts/test_check_commit.py57 def test_line_at_limit_passes(self):CODE
LOW⚡scripts/test_check_commit.py62 def test_line_one_over_limit_fails(self):CODE
LOW⚡scripts/test_check_commit.py68 def test_long_body_line_fails(self):CODE
LOW⚡scripts/test_check_commit.py74 def test_subject_is_not_checked(self):CODE
38 more matches not shown…
Over-Commented Block116 hits · 116 pts
SeverityFileLineSnippetContext
LOWmanage.sh1#!/usr/bin/env bashCOMMENT
LOWmanage.sh81COMMENT
LOWmanage.sh101# devenv-main-running true if 'main' is upCOMMENT
LOWmanage.sh321COMMENT
LOWmanage.sh421 [[ "$instance" =~ ^ws([0-9]+)$ ]] && n="${BASH_REMATCH[1]}"COMMENT
LOWmanage.sh481# `-c` overrides built at launch time -- see start-coding-agent.COMMENT
LOWmanage.sh501# <workspace>/.vscode/mcp.json auto-loaded by VS Code Copilot;COMMENT
LOWmanage.sh1081# replaces the developer's global client config; see .devenv/README.md forCOMMENT
LOWdocker/devenv/docker-compose.opencode.yml1# Optional compose overlay, included by manage.sh's instance-compose ONLYCOMMENT
LOWdocker/devenv/files/serena_config.yml1language_backend: LSPCOMMENT
LOWdocker/devenv/files/serena_config.yml21# window being updated. Since we can't control how agno or Claude Desktop start Serena,COMMENT
LOWdocker/devenv/files/serena_config.yml41COMMENT
LOWdocker/devenv/files/serena_config.yml81# list of regex patterns which, when matched, mark a memory entry as read‑only.COMMENT
LOWdocker/devenv/files/serena_config.yml121COMMENT
LOWdocker/images/docker-compose.yaml1## Common flags:COMMENT
LOWdocker/images/docker-compose.yaml61volumes:COMMENT
LOWdocker/images/docker-compose.yaml161COMMENT
LOWdocker/images/docker-compose.yaml241 # Don't touch it; this uses an internal docker network toCOMMENT
LOWdocker/images/files/nginx-entrypoint.sh101envsubst "\$PENPOT_INTERNAL_RESOLVER" \COMMENT
LOWdocker/images/files/config.js1// Frontend configurationCOMMENT
LOWfrontend/vitest.shims.d.ts1/// <reference types="@vitest/browser/providers/playwright" />COMMENT
LOWfrontend/resources/styles/main-default.scss21// LayoutsCOMMENT
LOWfrontend/resources/styles/common/refactor/themes.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOW…ht/ui/specs/workspace-texts-typography-persist.spec.js1import { test, expect } from "@playwright/test";COMMENT
LOW…/playwright/ui/specs/text-options-missing-font.spec.js1import { test, expect } from "@playwright/test";COMMENT
LOWfrontend/playwright/scripts/MockWebSocket.js21 }COMMENT
LOWfrontend/scripts/build-fonts-preview.js1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/scripts/check-translations/words.ru.txt1# Word catalog for check-translations.js (Russian).COMMENT
LOWfrontend/packages/ui/src/lib/menu/Menu.tsx61// closing both the root and the submenu popovers at once (rather than justCOMMENT
LOWfrontend/packages/ui/src/lib/menu/Menu.tsx101// between Menu and ContextMenu, which each keep their own stack (aCOMMENT
LOWfrontend/packages/ui/src/lib/menu/Menu.tsx241 className?: string;COMMENT
LOWfrontend/packages/ui/src/lib/menu/Menu.tsx321 triggerRef={triggerRef}COMMENT
LOWfrontend/packages/mousetrap/index.js741 // loop through matching callbacks for this key eventCOMMENT
LOWfrontend/packages/mousetrap/index.js781 // if the key you pressed matches the type of sequence withoutCOMMENT
LOWfrontend/src/app/util/path/arc_to_curve.js41COMMENT
LOWfrontend/src/app/main/ui/releases/v2_8.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_12.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_4.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_5.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_13.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_9.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_2.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_18.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_14.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_15.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_19.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_3.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_0.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_16.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_17.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_1.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_10.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_6.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_7.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/releases/v2_11.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/auth/recovery.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOWfrontend/src/app/main/ui/auth/recovery_request.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOW…nd/src/app/main/ui/workspace/sidebar/options/page.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOW…/src/app/main/ui/workspace/sidebar/common/sidebar.scss1// This Source Code Form is subject to the terms of the Mozilla PublicCOMMENT
LOW…/src/app/main/ui/workspace/sidebar/common/sidebar.scss61 grid-template-columns: repeat(#{$column-number}, #{$column-width});COMMENT
56 more matches not shown…
Hallucination Indicators7 hits · 90 pts
SeverityFileLineSnippetContext
CRITICAL…pps/plugin-api-test-suite/src/tests/components.test.ts216 ctx.penpot.library.local.components.some((c) => c.id === comp.id),CODE
CRITICAL…pps/plugin-api-test-suite/src/tests/components.test.ts238 ctx.penpot.library.local.components.some((c) => c.id === comp.id),CODE
CRITICAL…pps/plugin-api-test-suite/src/tests/components.test.ts243 ctx.penpot.library.local.components.some((c) => c.id === comp.id),CODE
CRITICAL⚡…pps/plugin-api-test-suite/src/tests/components.test.ts431 ctx.penpot.library.local.components.some((c) => c.id === comp.id),CODE
CRITICAL⚡…pps/plugin-api-test-suite/src/tests/components.test.ts434 const deleted = ctx.penpot.library.local.deletedComponents.find(CODE
CRITICAL⚡…pps/plugin-api-test-suite/src/tests/components.test.ts444 ctx.penpot.library.local.components.some((c) => c.id === comp.id),CODE
CRITICAL⚡…pps/plugin-api-test-suite/src/tests/components.test.ts447 ctx.penpot.library.local.deletedComponents.some((c) => c.id === comp.id),CODE
Structural Annotation Overuse25 hits · 42 pts
SeverityFileLineSnippetContext
LOWplugins/docs/create-angular-plugin.md11### Step 1: Initialize the PluginCOMMENT
LOWplugins/docs/create-angular-plugin.md24### Step 2: Configure the ManifestCOMMENT
LOWplugins/docs/create-angular-plugin.md44### Step 3: Update Project ConfigurationCOMMENT
LOWplugins/docs/create-angular-plugin.md81### Step 4: Modify TypeScript ConfigurationCOMMENT
LOWplugins/docs/create-angular-plugin.md106### Step 5: Add TS parser to eslintCOMMENT
LOW⚡plugins/docs/create-angular-plugin.md129### Step 7: Run the pluginCOMMENT
LOW⚡plugins/docs/create-angular-plugin.md139### Step 8: Load the Plugin in PenpotCOMMENT
LOW⚡plugins/docs/create-angular-plugin.md149### Step 9: Build pluginCOMMENT
LOWplugins/docs/create-plugin.md11### Step 1: Initialize the PluginCOMMENT
LOWplugins/docs/create-plugin.md36### Step 2: Create ESLint ConfigCOMMENT
LOWplugins/docs/create-plugin.md58### Step 3: Configure the ManifestCOMMENT
LOWplugins/docs/create-plugin.md78### Step 4: Update Vite ConfigurationCOMMENT
LOWplugins/docs/create-plugin.md96### Step 5: Modify TypeScript ConfigurationCOMMENT
LOWplugins/docs/create-plugin.md106### Step 6: Run a Static ServerCOMMENT
LOWplugins/docs/create-plugin.md120### Step 7: Load the Plugin in PenpotCOMMENT
LOW.agents/skills/plan-review-criteria/SKILL.md143### Step 1: Understand the GoalCOMMENT
LOW.agents/skills/plan-review-criteria/SKILL.md153### Step 2: Check Completeness FirstCOMMENT
LOW.agents/skills/plan-review-criteria/SKILL.md166### Step 3: Review Task QualityCOMMENT
LOW.agents/skills/plan-review-criteria/SKILL.md179### Step 4: Validate SequencingCOMMENT
LOW.agents/skills/plan-review-criteria/SKILL.md191### Step 5: Assess ActionabilityCOMMENT
LOW.agents/skills/plan-review-criteria/SKILL.md202### Step 6: Verify the Verification StoryCOMMENT
LOW.agents/skills/plan-review-criteria/SKILL.md213### Step 7: Evaluate Proposed Code Quality *(if applicable)*COMMENT
LOW⚡render-wasm/docs/visual_regression_tests.md23### Step 1: Initialize the pageCOMMENT
LOW⚡render-wasm/docs/visual_regression_tests.md33### Step 2: Intercept requestsCOMMENT
LOW⚡render-wasm/docs/visual_regression_tests.md41### Step 3: Go to workspace and take a screenshotCOMMENT
Modern AI Meta-Vocabulary13 hits · 38 pts
SeverityFileLineSnippetContext
MEDIUMmanage.sh105# --attach, --agentic (enables MCP + Serena), -e,COMMENT
MEDIUMmanage.sh592 # gitignored, so git ls-files would not list it, yet the agentic devenvCOMMENT
MEDIUMmanage.sh793# Bring a single instance up: compose up + detached tmux start. When agenticCOMMENT
MEDIUMmanage.sh795# it is a plain non-agentic workspace (no MCP, no Serena). Workspace sync andCOMMENT
MEDIUMmanage.sh892# Bring a single workspace up. Without --agentic it's non-agentic (no MCP, noCOMMENT
MEDIUMmanage.sh893# Serena); with --agentic it enables MCP + Serena for AI-driven development.COMMENT
MEDIUMmanage.sh958 # Pre-flight: config.js must exist for agentic mode. The file is gitignored;COMMENT
MEDIUMmanage.sh1127 # ws1+; ws0 is the default target so 'run-devenv --agentic' is the right hint.COMMENT
MEDIUMdocker/devenv/docker-compose.main.yml37 # Serena MCP server (agentic mode only). Internal ports fixed by Serena.COMMENT
MEDIUMdocker/devenv/files/serena_config.yml50# this may result in too many icons being displayed when using multi-agent setups.COMMENT
MEDIUM.serena/memories/devenv/core.md57## Workspace orchestration (ws1+)COMMENT
MEDIUM.agents/README.md325## 6. Common agentic flowsCOMMENT
MEDIUMdocs/technical-guide/developer/devenv.md51./manage.sh run-devenv --agentic --attach # bring up main devenv instance in agentic mode and attach tmuxCODE
Excessive Try-Catch Wrapping6 hits · 14 pts
SeverityFileLineSnippetContext
LOWbackend/scripts/manage.py70 except Exception as cause:CODE
MEDIUMbackend/scripts/manage.py62def run_cmd(params):CODE
MEDIUM⚡scripts/taiga.py66 print(f"Error: HTTP {e.code} — {e.reason}", file=sys.stderr)CODE
MEDIUM⚡scripts/taiga.py74 print(f"Error: {e.reason}", file=sys.stderr)CODE
MEDIUM⚡scripts/taiga.py77 print(f"Error: invalid JSON response — {e}", file=sys.stderr)CODE
MEDIUMscripts/taiga.py242 print(f"Error: ref must be a number, got '{ref_str}'", file=sys.stderr)CODE
Cross-Language Confusion2 hits · 9 pts
SeverityFileLineSnippetContext
HIGHscripts/gh.py828 Unlike PRs (which resolve to null), a dead issue number fails the wholeSTRING
HIGH⚡scripts/test_ci.py127 "pnpm run types:check && pnpm run build",CODE
Slop Phrases3 hits · 8 pts
SeverityFileLineSnippetContext
MEDIUMdocker/devenv/files/serena_config.yml77# Same syntax as gitignore, so you can use * and **.COMMENT
LOWplugins/libs/plugins-runtime/vite.config.ts51 // Don't forget to update your package.json as well.COMMENT
MEDIUM.serena/project.yml79# Same syntax as gitignore, so you can use * and **.COMMENT
Deep Nesting7 hits · 6 pts
SeverityFileLineSnippetContext
LOWbackend/scripts/manage.py38CODE
LOWmcp/types-generator/prepare_api_docs.py23CODE
LOWmcp/types-generator/prepare_api_docs.py207CODE
LOWscripts/gh.py850CODE
LOWscripts/changelog.py53CODE
LOWscripts/changelog.py230CODE
LOWscripts/project-anomalies.py224CODE
Self-Referential Comments2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMmanage.sh329# Create the backend-test database for <instance> on the shared PostgresCOMMENT
MEDIUMdocker/devenv/files/start-tmux.sh26# Create the tmux session first so attach-devenv can connect immediatelyCOMMENT
AI Slop Vocabulary2 hits · 4 pts
SeverityFileLineSnippetContext
MEDIUMfrontend/src/app/main/ui/ds/layout/menu.stories.jsx177 // Absolutely-positioned + transform centering, rather than flexCOMMENT
LOWmcp/types-generator/prepare_api_docs.py50 # for links, just return the textCOMMENT
Redundant / Tautological Comments2 hits · 3 pts
SeverityFileLineSnippetContext
LOW.serena/project.yml114# Set this to [] to disable base modes for this project.COMMENT
LOW.serena/project.yml115# Set this to a list of mode names to always include the respective modes for this project.COMMENT
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOW⚡scripts/replace-copyright.sh5# Usage:COMMENT
Unused Imports1 hit · 1 pts
SeverityFileLineSnippetContext
LOW.devenv/scripts/merge-mcp-config.py53CODE