AI Slop Code RIsk Monitor

Delgan/loguru

Python logging made (stupidly) simple

26.1 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for Delgan/loguru, a Python project with 24,140 GitHub stars. SynthScan examined 26,777 lines of code across 288 source files, recording 561 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 26.1 (Elevated 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.

26.1
Adjusted Signal
26.1
Raw Pattern Score
100%
Time Factor
2026-10-03
Last Push
24.1K
Stars
Python
Language
26.8K
Lines of Code
288
Files
561
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 60.0/100 · HIGH

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

Hallucinated Dependency & Supply Chain Risk 2.2/100 · LOW

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

Agent Over-Engineering Ratio 70.9/100 · HIGH

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

PR Review Velocity Impact 72.8/100 · HIGH

Which changes need focused human review? 561 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 23MEDIUM 11LOW 527

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 561 distinct pattern matches across 11 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 Identifiers434 hits · 460 pts
SeverityFileLineSnippetContext
LOWtests/test_colorama.py44def test_stream_wrapped_on_windows_if_no_vt_support(patched, monkeypatch, patch_colorama):CODE
LOWtests/test_colorama.py56def test_stream_not_wrapped_on_windows_if_vt_support(patched, monkeypatch, patch_colorama):CODE
LOWtests/test_colorama.py110def test_github_actions_fixed(monkeypatch, patched, expected):CODE
LOWtests/test_colorama.py130def test_mintty_fixed_windows(monkeypatch, patched, expected):CODE
LOWtests/test_colorama.py148def test_dumb_term_not_colored(monkeypatch, patched, expected):CODE
LOWtests/test_colorama.py173def test_honor_no_color_standard(monkeypatch, patched, no_color, expected):CODE
LOWtests/test_colorama.py198def test_honor_force_color_standard(monkeypatch, patched, force_color, expected):CODE
LOWtests/test_colorama.py206def test_no_color_takes_precedence_over_force_color(monkeypatch):CODE
LOWtests/test_colorama.py232def test_mintty_not_fixed_linux(monkeypatch, patched, expected):CODE
LOWtests/test_colorama.py295def test_dont_wrap_if_not_original_stdout_or_stderr(monkeypatch, patched, patch_colorama):CODE
LOWtests/test_colorama.py305def test_dont_wrap_if_terminal_has_vt_support(monkeypatch, patched, patch_colorama):CODE
LOWtests/test_colorama.py317def test_dont_wrap_if_winapi_false(monkeypatch, patched, patch_colorama):CODE
LOWtests/test_colorama.py329def test_wrap_if_winapi_true_and_no_vt_support(monkeypatch, patched, patch_colorama):CODE
LOWtests/test_colorama.py342def test_wrap_if_winapi_true_and_vt_check_fails(monkeypatch, patched, patch_colorama):CODE
LOWtests/test_colorama.py355def test_wrap_if_winapi_true_and_stream_has_no_fileno(monkeypatch, patched, patch_colorama):CODE
LOWtests/test_colorama.py367def test_wrap_if_winapi_true_and_old_colorama_version(monkeypatch, patched, patch_colorama):CODE
LOW⚡tests/test_filesink_rotation.py1127def test_invalid_day_rotation(rotation):CODE
LOW⚡tests/test_filesink_rotation.py1135def test_invalid_time_rotation(rotation):CODE
LOW⚡tests/test_filesink_rotation.py1141def test_invalid_value_size_rotation(rotation):CODE
LOW⚡tests/test_filesink_rotation.py1147def test_invalid_unit_rotation_duration(rotation):CODE
LOW⚡tests/test_filesink_rotation.py1153def test_invalid_value_rotation_duration(rotation):CODE
LOW⚡tests/test_filesink_rotation.py1159def test_out_of_range_rotation_duration(rotation):CODE
LOWtests/test_filesink_rotation.py196def test_time_rotation_with_tzinfo_diff_bigger(freeze_time, tmp_path):CODE
LOWtests/test_filesink_rotation.py219def test_time_rotation_with_tzinfo_diff_lower(freeze_time, tmp_path):CODE
LOWtests/test_filesink_rotation.py242def test_time_rotation_with_tzinfo_utc(freeze_time, tmp_path):CODE
LOWtests/test_filesink_rotation.py268def test_time_rotation_multiple_days_at_midnight_utc(freeze_time, tmp_path):CODE
LOWtests/test_filesink_rotation.py300def test_daily_rotation_with_different_timezone(freeze_time, tmp_path, offset):CODE
LOWtests/test_filesink_rotation.py338def test_time_rotation_after_positive_timezone_changes_forward(freeze_time, tmp_path, rotation):CODE
LOWtests/test_filesink_rotation.py365def test_time_rotation_when_positive_timezone_changes_forward(freeze_time, tmp_path, rotation):CODE
LOWtests/test_filesink_rotation.py401def test_time_rotation_after_negative_timezone_changes_forward(freeze_time, tmp_path, rotation):CODE
LOWtests/test_filesink_rotation.py428def test_time_rotation_when_negative_timezone_changes_forward(freeze_time, tmp_path, rotation):CODE
LOWtests/test_filesink_rotation.py462def test_time_rotation_after_positive_timezone_changes_backward_aware(CODE
LOWtests/test_filesink_rotation.py491def test_time_rotation_after_positive_timezone_changes_backward_naive(CODE
LOWtests/test_filesink_rotation.py529def test_time_rotation_after_negative_timezone_changes_backward_aware(CODE
LOWtests/test_filesink_rotation.py558def test_time_rotation_after_negative_timezone_changes_backward_naive(CODE
LOWtests/test_filesink_rotation.py588def test_time_rotation_when_timezone_changes_backward_rename_file(freeze_time, tmp_path):CODE
LOWtests/test_filesink_rotation.py624def test_dont_rotate_earlier_when_utc_is_one_day_before(freeze_time, tmp_path, rotation):CODE
LOWtests/test_filesink_rotation.py659def test_dont_rotate_later_when_utc_is_one_day_after(freeze_time, tmp_path, rotation):CODE
LOWtests/test_filesink_rotation.py685def test_rotation_at_midnight_with_date_in_filename(freeze_time, tmp_path, timezone):CODE
LOWtests/test_filesink_rotation.py707def test_time_rotation_reopening_native(tmp_path_local, delay):CODE
LOWtests/test_filesink_rotation.py763def test_time_rotation_reopening_xattr_attributeerror(tmp_path_local, monkeypatch, delay):CODE
LOWtests/test_filesink_rotation.py799def test_time_rotation_reopening_xattr_oserror(tmp_path_local, monkeypatch, delay):CODE
LOWtests/test_filesink_rotation.py828def test_time_rotation_windows_no_setctime(tmp_path, monkeypatch):CODE
LOWtests/test_filesink_rotation.py852def test_time_rotation_windows_setctime_exception(tmp_path, monkeypatch, exception):CODE
LOWtests/test_filesink_rotation.py920def test_no_rotation_at_remove(tmp_path, mode):CODE
LOWtests/test_filesink_rotation.py928def test_rename_existing_with_creation_time(freeze_time, tmp_path):CODE
LOWtests/test_filesink_rotation.py944def test_renaming_rotation_dest_exists(freeze_time, tmp_path):CODE
LOWtests/test_filesink_rotation.py962def test_renaming_rotation_dest_exists_with_time(freeze_time, tmp_path):CODE
LOWtests/test_filesink_rotation.py982def test_exception_during_rotation(tmp_path, capsys):CODE
LOWtests/test_filesink_rotation.py1001def test_exception_during_rotation_not_caught(tmp_path, capsys):CODE
LOWtests/test_filesink_rotation.py1020def test_recipe_rotation_both_size_and_time(freeze_time, tmp_path):CODE
LOWtests/test_filesink_rotation.py1067def test_multiple_rotation_conditions(freeze_time, tmp_path):CODE
LOWtests/test_filesink_rotation.py1092def test_empty_rotation_condition_list():CODE
LOWtests/test_filesink_rotation.py1100def test_invalid_rotation_type(rotation):CODE
LOWtests/test_add_option_serialize.py29def test_serialize_non_ascii_characters():CODE
LOWtests/test_add_option_serialize.py60def test_serialize_exception_without_context():CODE
LOWtests/test_add_option_serialize.py77def test_serialize_exception_none_tuple():CODE
LOWtests/test_add_option_serialize.py94def test_serialize_exception_instance():CODE
LOWtests/test_add_option_serialize.py111def test_serialize_with_catch_decorator():CODE
LOWtests/test_add_option_serialize.py127def test_serialize_with_record_option():CODE
374 more matches not shown…
Empty Error Handlers23 hits · 115 pts
SeverityFileLineSnippetContext
HIGHtests/conftest.py264except ValueError:CODE
HIGHtests/test_type_hinting.py9except ImportError:CODE
HIGH…ptions/source/others/exception_formatting_generator.py21except StopIteration:CODE
HIGH…ptions/source/others/exception_formatting_coroutine.py21except StopIteration:CODE
HIGH…/exceptions/source/others/broken_but_decorated_repr.py26except ValueError:CODE
HIGH…/exceptions/source/others/broken_but_decorated_repr.py32except ValueError:CODE
HIGH…s/exceptions/source/others/sys_tracebacklimit_unset.py54except AttributeError:CODE
HIGH…s/exceptions/source/modern/decorate_async_generator.py55except ValueError:CODE
HIGH…s/exceptions/source/modern/decorate_async_generator.py77except StopAsyncIteration:CODE
HIGH…s/exceptions/source/modern/decorate_async_generator.py96except StopAsyncIteration:CODE
HIGH…s/exceptions/source/modern/decorate_async_generator.py109except ValueError:CODE
HIGH…s/exceptions/source/modern/decorate_async_generator.py117except StopAsyncIteration:CODE
HIGH…e/modern/exception_formatting_async_generator_throw.py23except StopIteration:CODE
HIGH…e/modern/exception_formatting_async_generator_throw.py29except StopAsyncIteration:CODE
HIGH…/source/modern/exception_formatting_async_generator.py21except StopAsyncIteration:CODE
HIGHloguru/_colorama.py32except Exception:CODE
HIGHloguru/_logger.py1356except StopAsyncIteration:CODE
HIGHloguru/_logger.py1364except StopAsyncIteration:CODE
HIGHloguru/_simple_sinks.py194except Exception:CODE
HIGHloguru/_string_parsers.py312except ValueError:CODE
HIGHloguru/_error_interceptor.py31except OSError:CODE
HIGHloguru/_ctime_functions.py17except (OSError, ValueError):CODE
HIGHloguru/_ctime_functions.py43except OSError:CODE
Excessive Try-Catch Wrapping63 hits · 80 pts
SeverityFileLineSnippetContext
LOWtests/test_opt.py68 except Exception:CODE
LOWtests/test_opt.py82 except Exception:CODE
LOWtests/test_opt.py98 except Exception:CODE
LOWtests/test_opt.py114 except Exception:CODE
LOWtests/test_interception.py110 except Exception:CODE
LOWtests/test_add_option_diagnose.py10 except Exception:CODE
LOWtests/test_add_option_diagnose.py20 except Exception:CODE
LOWtests/test_exceptions_catch.py75 except Exception:CODE
LOWtests/test_exceptions_catch.py91 except Exception:CODE
LOWtests/test_add_option_enqueue.py263 except Exception:CODE
LOWtests/test_add_option_enqueue.py286 except Exception:CODE
LOWtests/test_propagation.py89 except Exception:CODE
LOWtests/test_add_option_backtrace.py10 except Exception:CODE
LOWtests/test_add_option_backtrace.py20 except Exception:CODE
LOW⚡tests/test_exceptions_formatting.py288 except Exception:CODE
LOW…tions/source/backtrace/missing_lineno_frame_objects.py40except Exception as e:CODE
LOWtests/exceptions/source/backtrace/nested_wrapping.py32except Exception:CODE
LOW…exceptions/source/backtrace/nested_chained_catch_up.py23 except Exception as e:CODE
MEDIUM…exceptions/source/backtrace/nested_chained_catch_up.py20def main():CODE
LOWtests/exceptions/source/others/repeated_lines.py22except Exception:CODE
LOWtests/exceptions/source/others/one_liner_recursion.py15except Exception:CODE
LOWtests/exceptions/source/others/recursion_error.py20except Exception:CODE
LOWtests/exceptions/source/others/nested_with_reraise.py21 except Exception as e:CODE
MEDIUMtests/exceptions/source/others/nested_with_reraise.py18def bar(x, y):CODE
LOWtests/exceptions/source/diagnose/chained_both.py16 except Exception:CODE
LOWtests/exceptions/source/diagnose/chained_both.py23 except Exception as e:CODE
MEDIUMtests/exceptions/source/diagnose/chained_both.py13def cause(x, y):CODE
MEDIUMtests/exceptions/source/diagnose/chained_both.py20def context(x, y):CODE
LOW⚡tests/exceptions/source/modern/grouped_simple.py27 except Exception as error_1:CODE
LOW⚡tests/exceptions/source/modern/grouped_simple.py30 except Exception as error_2:CODE
LOW⚡tests/exceptions/source/modern/grouped_simple.py33 except Exception as error_3:CODE
MEDIUMtests/exceptions/source/modern/grouped_simple.py24def main():CODE
LOW⚡…ptions/source/modern/grouped_with_cause_and_context.py18 except Exception as err:CODE
LOW⚡…ptions/source/modern/grouped_with_cause_and_context.py20 except Exception as err:CODE
LOW⚡…ptions/source/modern/grouped_with_cause_and_context.py25 except Exception as err:CODE
LOW⚡…ptions/source/modern/grouped_with_cause_and_context.py27 except Exception as err:CODE
LOW⚡…ptions/source/modern/grouped_with_cause_and_context.py32 except Exception as err:CODE
LOW⚡…ptions/source/modern/grouped_with_cause_and_context.py35 except Exception:CODE
MEDIUM…ptions/source/modern/grouped_with_cause_and_context.py14def main():CODE
LOW⚡tests/exceptions/source/modern/grouped_nested.py18 except Exception as err:CODE
LOW⚡tests/exceptions/source/modern/grouped_nested.py23 except Exception as err:CODE
LOW⚡tests/exceptions/source/modern/grouped_nested.py30 except Exception as err:CODE
MEDIUMtests/exceptions/source/modern/grouped_nested.py14def main():CODE
LOW⚡…ceptions/source/modern/grouped_as_cause_and_context.py21 except Exception as err:CODE
LOW⚡…ceptions/source/modern/grouped_as_cause_and_context.py26 except Exception as err:CODE
LOW⚡…ceptions/source/modern/grouped_as_cause_and_context.py32 except Exception as err:CODE
LOW⚡…ceptions/source/modern/grouped_as_cause_and_context.py34 except Exception as err:CODE
MEDIUM…ceptions/source/modern/grouped_as_cause_and_context.py18def main():CODE
LOWloguru/_better_exceptions.py353 except Exception:CODE
MEDIUMloguru/_better_exceptions.py193def _get_char(self, char, default):CODE
LOWloguru/_handler.py207 except Exception:CODE
LOWloguru/_handler.py319 except Exception:CODE
LOWloguru/_handler.py334 except Exception:CODE
MEDIUMloguru/_handler.py127def emit(self, record, level_id, from_decorator, is_raw, colored_message):CODE
LOWloguru/_colorama.py32 except Exception:CODE
LOWloguru/_colorama.py53 except Exception:CODE
LOWloguru/_colorama.py76 except Exception:CODE
LOWloguru/_simple_sinks.py194 except Exception:CODE
LOWloguru/_error_interceptor.py26 except Exception:CODE
LOWloguru/_get_frame.py8 except Exception:CODE
3 more matches not shown…
Deep Nesting15 hits · 15 pts
SeverityFileLineSnippetContext
LOWloguru/_better_exceptions.py72CODE
LOWloguru/_better_exceptions.py210CODE
LOWloguru/_better_exceptions.py275CODE
LOWloguru/_better_exceptions.py361CODE
LOWloguru/_better_exceptions.py401CODE
LOWloguru/_colorizer.py222CODE
LOWloguru/_colorizer.py416CODE
LOWloguru/_colorizer.py477CODE
LOWloguru/_handler.py127CODE
LOWloguru/_file_sink.py381CODE
LOWloguru/_logger.py273CODE
LOWloguru/_logger.py1185CODE
LOWloguru/_logger.py1892CODE
LOWloguru/_logger.py2059CODE
LOWloguru/_logger.py1322CODE
Unused Imports12 hits · 12 pts
SeverityFileLineSnippetContext
LOWtests/exceptions/source/ownership/callback.py3CODE
LOW…ts/exceptions/source/ownership/assertion_from_local.py3CODE
LOW…ts/exceptions/source/ownership/assertion_from_local.py4CODE
LOWtests/exceptions/source/ownership/assertion_from_lib.py3CODE
LOWtests/exceptions/source/ownership/syntaxerror.py3CODE
LOWtests/exceptions/source/ownership/decorated_callback.py3CODE
LOWtests/exceptions/source/ownership/decorated_callback.py4CODE
LOWtests/exceptions/source/ownership/catch_decorator.py3CODE
LOWtests/exceptions/source/ownership/indirect.py3CODE
LOW…xceptions/source/ownership/catch_decorator_from_lib.py3CODE
LOWtests/exceptions/source/ownership/string_lib.py3CODE
LOWtests/exceptions/source/ownership/direct.py3CODE
Overly Generic Function Names3 hits · 4 pts
SeverityFileLineSnippetContext
LOWtests/test_multiprocessing.py26def do_something(i):CODE
LOW⚡tests/test_repr.py84def test_function():CODE
LOW⚡tests/test_repr.py85 def my_function(message):CODE
AI Structural Patterns4 hits · 4 pts
SeverityFileLineSnippetContext
LOWloguru/_better_exceptions.py151CODE
LOWloguru/_file_sink.py169CODE
LOWloguru/_logger.py273CODE
LOWloguru/_logger.py1390CODE
Over-Commented Block3 hits · 3 pts
SeverityFileLineSnippetContext
LOWdocs/conf.py81# The theme to use for HTML and HTML Help pages. See the documentation forCOMMENT
LOWdocs/conf.py101# defined by theme itself. Builtin themes are using these templates byCOMMENT
LOWdocs/conf.py121 #COMMENT
Slop Phrases2 hits · 2 pts
SeverityFileLineSnippetContext
LOWloguru/_logger.py785 Windows, don't forget to restart your terminal for the change to be taken into account.CODE
LOWloguru/_logger.py1743 >>> logger.info("While publishing a library, don't forget to disable logging")CODE
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
LOWtests/test_template_strings.py18 # We can't just use t"2**8 = {2**8}", because its a syntax error before python-3.14.COMMENT
Modern Structural Boilerplate1 hit · 1 pts
SeverityFileLineSnippetContext
LOWloguru/__init__.py16__all__ = ["logger"]CODE