AI Slop Code RIsk Monitor

lektor/lektor

The lektor static file content management system

11.7 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for lektor/lektor, a Python project with 3,950 GitHub stars. SynthScan examined 47,319 lines of code across 369 source files, recording 394 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 11.7 (Moderate 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.

11.7
Adjusted Signal
11.7
Raw Pattern Score
100%
Time Factor
2026-10-05
Last Push
4.0K
Stars
Python
Language
47.3K
Lines of Code
369
Files
394
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 27.9/100 · MEDIUM

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

Hallucinated Dependency & Supply Chain Risk 10.6/100 · LOW

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

Agent Over-Engineering Ratio 34.0/100 · MEDIUM

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

PR Review Velocity Impact 44.7/100 · MEDIUM

Which changes need focused human review? 394 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 0HIGH 31MEDIUM 6LOW 357

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 394 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.

Hyper-Verbose Identifiers243 hits · 256 pts
SeverityFileLineSnippetContext
LOWfrontend/js/widgets.tsx119export function getWidgetComponentWithFallback(CODE
LOWfrontend/js/shortcut-keys.ts132export function installShortcutKeyListener(keymap: ShortcutKeyMap) {CODE
LOWfrontend/js/shortcut-keys.ts160export function deserializeShortcutKeyMap(obj: unknown): ShortcutKeyMap {CODE
LOWfrontend/js/widgets/SingleLineTextInputWidget.tsx7export function SingleLineTextInputWidget(CODE
LOWtests/test_videotools.py51def test_get_ffmpeg_quality_bad_range(in_quality):CODE
LOWtests/test_videotools.py64def test_dimensions_aspect_ratio(dim, ar):CODE
LOWtests/test_videotools.py76def test_dimensions_fit_within(source, target, upscale, rescale):CODE
LOWtests/test_videotools.py127def test_dimensions_invalid_resize():CODE
LOWtests/test_reporter.py24def test_describe_build_func_describes_partial():CODE
LOWtests/test_reporter.py37def test_describe_build_func_deals_with_garbage():CODE
LOWtests/test_utils.py221def test_url_builder_dot_handling():CODE
LOWtests/test_utils.py268def test_make_relative_url_relative_source_absolute_target():CODE
LOWtests/test_utils.py286def test_atomic_open_exception(tmp_path):CODE
LOWtests/test_utils.py309def test_atomic_open_respects_umask(tmp_path, umask):CODE
LOWtests/test_utils.py317def test_atomic_open_raises_on_bad_mode(tmp_path, mode):CODE
LOWtests/test_utils.py334def test_create_temp_respects_umask(tmp_path, mode, umask):CODE
LOWtests/test_utils.py407def test_deprecated_classmethod():CODE
LOWtests/test_utils.py424def test_deprecated_raises_type_error():CODE
LOWtests/test_utils.py429def test_deprecated_stacklevel():CODE
LOWtests/test_utils.py457def test_untrusted_to_os_path(db_path, expected):CODE
LOWtests/test_utils.py462def test_format_lat_long_keeps_sign_below_one_degree():CODE
LOWtests/test_issue_410.py41def test_build_childless_page(scratch_builder):CODE
LOWtests/test_pagination.py46def test_unpaginated_children(pad):CODE
LOWtests/test_pagination.py82def test_pagination_attributes(pad):CODE
LOWtests/test_pagination.py103def test_url_matching_for_pagination(pad):CODE
LOWtests/test_pagination.py125def test_pagination_url_paths(pad):CODE
LOWtests/test_pagination.py141def test_unpaginated_children_other_alt(pad):CODE
LOWtests/test_pagination.py177def test_url_matching_for_alt_pagination(pad):CODE
LOWtests/test_pagination.py190def test_pagination_items_filter(pad):CODE
LOWtests/test_pagination.py211def test_virtual_path_behavior(pad):CODE
LOWtests/conftest.py261def child_sources_test_project_builder(tmp_path, data_path, save_sys_path):CODE
LOWtests/test_unicode.py22def test_unicode_project_folder(pad, builder):CODE
LOWtests/test_unicode.py28def test_unicode_attachment_filename(pad, builder):CODE
LOWtests/test_packages.py153def test_update_cache_installs_requirements(CODE
LOWtests/test_packages.py165def test_update_cache_skips_install_if_up_to_date(CODE
LOWtests/test_packages.py178def test_update_cache_removes_package_cache_if_no_requirements(tmp_path: Path) -> None:CODE
LOWtests/test_packages.py186def test_load_packages_add_package_cache_to_sys_path(env: Environment) -> None:CODE
LOWtests/test_packages.py197def test_load_packages_reinstall_wipes_cache(CODE
LOWtests/test_assets.py60def test_asset_source_filename(asset, pad, asset_path):CODE
LOWtests/test_assets.py87def test_asset_url_content_path(asset, expected):CODE
LOWtests/test_assets.py117def test_asset_children_no_children_if_dir_unreadable(asset):CODE
LOWtests/test_assets.py150def test_asset_get_child_from_url_param_deprecated(asset):CODE
LOWtests/test_assets.py202def test_directory_merges_subdirectories(asset_root, asset_paths):CODE
LOWtests/test_assets.py214def test_directory_file_shadows_directory(asset_root, asset_paths):CODE
LOWtests/test_assets.py228def test_directory_directory_conflicts_with_file(asset_root, asset_paths):CODE
LOWtests/test_tree.py89def test_tree_item_can_be_deleted(tree, path, expect):CODE
LOWtests/test_tree.py103def test_tree_item_is_visible(tree, path, expect):CODE
LOWtests/test_tree.py116def test_tree_item_is_attachment(tree, path, is_attachment, attachment_type):CODE
LOWtests/test_tree.py130def test_tree_item_can_have_children(tree, path, expect):CODE
LOWtests/test_tree.py164def test_tree_implied_child_datamodel(tree, path, expect):CODE
LOWtests/test_tree.py215def test_tree_item_get_children(tree, path, offset, limit, order_by, expect):CODE
LOWtests/test_tree.py264def test_tree_item_iter_subpages(tree, path, order_by, expect):CODE
LOWtests/test_tree.py284def test_tree_item_iter_attachments(tree, path, expect):CODE
LOWtests/test_tree.py297def test_tree_item_get_order_by(tree, path, order_by, expect):CODE
LOWtests/test_tree.py359def test_alt_is_primary_overlay(tree, alt, expect):CODE
LOWtests/test_quickstart.py29def test_project_html_escaping(tmp_path, with_blog, project_name, escaped_name):CODE
LOW⚡tests/test_quickstart.py82def test_default_author_from_pwd(mocker):CODE
LOW⚡tests/test_quickstart.py90def test_default_author_from_username(mocker):CODE
LOW⚡tests/test_quickstart.py98def test_default_author_email(git_config_file):CODE
LOWtests/test_quickstart.py111def test_default_author_email_no_default(monkeypatch):CODE
183 more matches not shown…
Empty Error Handlers21 hits · 105 pts
SeverityFileLineSnippetContext
HIGHlektor/db.py2193except KeyError:CODE
HIGHlektor/db.py126except (ValueError, TypeError, OverflowError):CODE
HIGHlektor/db.py131except (ValueError, TypeError, OverflowError):CODE
HIGHlektor/db.py727except ValueError:CODE
HIGHlektor/databags.py42except OSError:CODE
HIGHlektor/devcli.py15except ImportError:CODE
HIGHlektor/packages.py223except OSError:CODE
HIGHlektor/builder.py728except OSError:CODE
HIGHlektor/builder.py1114except OSError:CODE
HIGHlektor/builder.py1152except OSError:CODE
HIGHlektor/builder.py995except OSError:CODE
HIGHlektor/utils.py62except LookupError:CODE
HIGHlektor/utils.py777except ValueError:CODE
HIGHlektor/buildfailures.py70except OSError:CODE
HIGHlektor/editor.py359except OSError:CODE
HIGHlektor/editor.py311except OSError: # noqa: PERF203CODE
HIGHlektor/editor.py329except OSError: # noqa: PERF203CODE
HIGHlektor/videotools.py262except (KeyError, TypeError, ValueError):CODE
HIGHlektor/quickstart.py136except KeyError:CODE
HIGHlektor/quickstart.py125except OSError:CODE
HIGHlektor/environment/__init__.py212except OSError:CODE
Cross-Language Confusion9 hits · 50 pts
SeverityFileLineSnippetContext
HIGHtests/conftest.py281 reporter.push()CODE
HIGHtests/test_prev_next_sibling.py55 reporter.push()CODE
HIGHlektor/reporter.py41 _reporter_stack.push(self)CODE
HIGHlektor/reporter.py48 self.push()CODE
HIGHlektor/builder.py960 ctx.push()CODE
HIGHlektor/context.py136 _ctx_stack.push(self)CODE
HIGHlektor/context.py143 self.push()CODE
HIGH⚡lektor/types/base.py10def get_undefined_info(undefined):CODE
HIGH⚡lektor/types/base.py11 if isinstance(undefined, Undefined):CODE
Unused Imports47 hits · 47 pts
SeverityFileLineSnippetContext
LOWtests/test_pluginsystem.py3CODE
LOWtests/test_watcher.py1CODE
LOWtests/imagetools/test_exif.py1CODE
LOWtests/imagetools/test_thumbnail.py1CODE
LOWtests/imagetools/test_image_info.py1CODE
LOWtests/admin/test_serve.py1CODE
LOWlektor/devserver.py1CODE
LOWlektor/db.py2CODE
LOWlektor/cli_utils.py2CODE
LOWlektor/compat.py1CODE
LOWlektor/packages.py1CODE
LOWlektor/pluginsystem.py1CODE
LOWlektor/builder.py1CODE
LOWlektor/utils.py1CODE
LOWlektor/assets.py1CODE
LOWlektor/watcher.py1CODE
LOWlektor/publisher.py1CODE
LOWlektor/sourceobj.py1CODE
LOWlektor/project.py1CODE
LOWlektor/imagetools/image_info.py3CODE
LOWlektor/imagetools/thumbnail.py3CODE
LOWlektor/imagetools/__init__.py1CODE
LOWlektor/imagetools/__init__.py6CODE
LOWlektor/imagetools/__init__.py8CODE
LOWlektor/imagetools/__init__.py9CODE
LOWlektor/imagetools/__init__.py10CODE
LOWlektor/imagetools/__init__.py11CODE
LOWlektor/imagetools/exif.py3CODE
LOWlektor/imagetools/_compat.py3CODE
LOWlektor/types/__init__.py1CODE
LOWlektor/types/__init__.py2CODE
LOWlektor/types/__init__.py3CODE
LOWlektor/types/__init__.py4CODE
LOWlektor/markdown/controller.py23CODE
LOWlektor/markdown/mistune2.py3CODE
LOWlektor/markdown/__init__.py22CODE
LOWlektor/admin/webui.py1CODE
LOWlektor/admin/__init__.py1CODE
LOWlektor/admin/context.py1CODE
LOWlektor/admin/modules/serve.py1CODE
LOWlektor/admin/modules/livereload.py1CODE
LOWlektor/environment/__init__.py1CODE
LOWlektor/environment/__init__.py21CODE
LOWlektor/environment/__init__.py22CODE
LOWlektor/environment/__init__.py23CODE
LOWlektor/environment/__init__.py24CODE
LOWlektor/environment/__init__.py25CODE
Excessive Try-Catch Wrapping21 hits · 26 pts
SeverityFileLineSnippetContext
LOWtests/test_buildfailures.py33 except Exception:CODE
LOW⚡tests/test_buildfailures.py56 except Exception:CODE
LOWtests/test_buildfailures.py88 except Exception:CODE
MEDIUMtests/test_buildfailures.py53def test_failure_controller(failure_controller):CODE
LOWtests/admin/test_serve.py274 except Exception:CODE
LOWlektor/devserver.py72 except Exception:CODE
LOWlektor/datamodel.py329 except Exception:CODE
LOWlektor/datamodel.py349 except Exception as exc:CODE
LOWlektor/utils.py631 except Exception:CODE
LOWlektor/publisher.py382 except Exception as e:CODE
LOWlektor/publisher.py395 except Exception as e:CODE
LOWlektor/publisher.py406 except Exception as e:CODE
LOW⚡lektor/publisher.py484 except Exception as e:CODE
LOW⚡lektor/publisher.py488 except Exception as e:CODE
LOW⚡lektor/publisher.py496 except Exception as e:CODE
LOW⚡lektor/publisher.py504 except Exception as e:CODE
MEDIUMlektor/publisher.py477def rename_file(self, src, dst):CODE
LOWlektor/types/primitives.py110 except Exception:CODE
LOWlektor/types/multi.py87 except Exception:CODE
LOW⚡lektor/types/base.py14 except Exception as e:CODE
LOWlektor/environment/__init__.py114 except Exception as exc:CODE
Deep Nesting23 hits · 22 pts
SeverityFileLineSnippetContext
LOWtests/test_tree.py18CODE
LOWlektor/db.py598CODE
LOWlektor/db.py1134CODE
LOWlektor/db.py1302CODE
LOWlektor/db.py1358CODE
LOWlektor/db.py1455CODE
LOWlektor/db.py1493CODE
LOWlektor/reporter.py342CODE
LOWlektor/builder.py546CODE
LOWlektor/builder.py1177CODE
LOWlektor/builder.py1285CODE
LOWlektor/metaformat.py18CODE
LOWlektor/cli.py94CODE
LOWlektor/utils.py239CODE
LOWlektor/utils.py366CODE
LOWlektor/assets.py133CODE
LOWlektor/publisher.py549CODE
LOWlektor/sourceobj.py106CODE
LOWlektor/quickstart.py113CODE
LOWlektor/types/multi.py78CODE
LOWlektor/types/flow.py17CODE
LOWlektor/environment/__init__.py162CODE
LOWlektor/environment/__init__.py196CODE
Self-Referential Comments3 hits · 8 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_pluginsystem.py195 # Create a plugin with no associated distribution.COMMENT
MEDIUM⚡tests/test_buildfailures.py76 # Create a directory in the location that FailureController wantsCOMMENT
MEDIUMlektor/builder.py678 """This class represents a build artifact."""STRING
Cross-Language Confusion (JS/TS)1 hit · 8 pts
SeverityFileLineSnippetContext
HIGHfrontend/js/widgets/MultiLineTextInputWidget.tsx51 * @return True if we are on a touch deviceCOMMENT
AI Slop Vocabulary5 hits · 7 pts
SeverityFileLineSnippetContext
LOWlektor/db.py1076 # child_config.order_by, but for now, just return None.COMMENT
LOWlektor/db.py1549 # The alternative system is not configured, just returnCOMMENT
LOWlektor/db.py1743 # not allowed but one was passed, we just return `None`.COMMENT
MEDIUMlektor/publisher.py102 """A wrapper around subprocess.Popen to facilitate streaming output via generator.STRING
LOWlektor/imagetools/thumbnail.py450 # resize anything, we just return it. This is not ideal but it'sCOMMENT
Over-Commented Block6 hits · 6 pts
SeverityFileLineSnippetContext
LOWtox.ini41# WARNING: Skipping page https://pypi.org/simple/coverage/ because the GET requestCOMMENT
LOWtests/test_themes.py101 # only exist in themes-project assets will be loaded from thereCOMMENT
LOWlektor/db.py2061 """COMMENT
LOWlektor/build_programs.py201 child_sources = []COMMENT
LOWlektor/imagetools/thumbnail.py281 # XXX: The old imagemagick code (which ran `convert` with `-strip -colorspace sRGB`)COMMENT
LOWlektor/imagetools/thumbnail.py341 #COMMENT
Modern Structural Boilerplate6 hits · 6 pts
SeverityFileLineSnippetContext
LOWlektor/compat.py16__all__ = ["werkzeug_urls_URL"]CODE
LOWlektor/publisher.py714 def set_ssh_credentials(self, credentials: Mapping[str, str]) -> None:CODE
LOWlektor/publisher.py725 def set_https_credentials(self, credentials: Mapping[str, str]) -> None:CODE
LOWlektor/imagetools/__init__.py14__all__ = [CODE
LOWlektor/imagetools/_compat.py15__all__ = ["ExifTags", "Transpose", "UnidentifiedImageError"]CODE
LOWlektor/admin/__init__.py4__all__ = ["WebAdmin"]CODE
Redundant / Tautological Comments4 hits · 6 pts
SeverityFileLineSnippetContext
LOWlektor/datamodel.py99 # Check if we have a cached versionCOMMENT
LOWlektor/videotools.py84 # Check if we should rescale at allCOMMENT
LOWlektor/videotools.py120 # Check if we should rescale at allCOMMENT
LOWlektor/videotools.py153 # Check if we should rescale at allCOMMENT
Overly Generic Function Names2 hits · 2 pts
SeverityFileLineSnippetContext
LOW⚡tests/test_devcli.py116 def test_function():STRING
LOWlektor/db.py1516 def process_data(self, data, datamodel, pad):CODE
Verbosity Indicators1 hit · 2 pts
SeverityFileLineSnippetContext
LOWlektor/builder.py358 # If we do have an already existing artifact, we need to check ifCOMMENT
Fake / Example Data1 hit · 1 pts
SeverityFileLineSnippetContext
LOWtests/test_devcli.py39 email = "jrh@example.org"CODE
AI Structural Patterns1 hit · 1 pts
SeverityFileLineSnippetContext
LOWlektor/datamodel.py232CODE