AI Slop Code RIsk Monitor

arnegiacomo/fugleramme

Bird frame for Raspberry Pi or your homelab - real-time bird detection by audio, fully local AI, rendered as real, hand-cut 1800s bird illustrations. On an e-ink panel, a TV, or any screen.

12.4 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for arnegiacomo/fugleramme, a Python project with 3,613 GitHub stars. SynthScan examined 52,199 lines of code across 150 source files, recording 520 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 12.4 (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.

12.4
Adjusted Signal
12.4
Raw Pattern Score
100%
Time Factor
2026-10-11
Last Push
3.6K
Stars
Python
Language
52.2K
Lines of Code
150
Files
520
Pattern Hits
2026-10-12
Scan Date
0.11
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 37.9/100 · MEDIUM

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

Hallucinated Dependency & Supply Chain Risk 12.6/100 · LOW

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

Agent Over-Engineering Ratio 36.7/100 · MEDIUM

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

PR Review Velocity Impact 44.0/100 · MEDIUM

Which changes need focused human review? 520 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

Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.

No multi-scan history yet — run the scanner again to build trend data.

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 1HIGH 15MEDIUM 1LOW 503

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 520 distinct pattern matches across 10 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 Identifiers416 hits · 464 pts
SeverityFileLineSnippetContext
LOWtests/test_fake.py59def test_summary_windows_the_range_and_drops_false_positives(api):CODE
LOWtests/test_fake.py81def test_summary_limit_keeps_the_busiest(api):CODE
LOWtests/test_fake.py88def test_recent_is_newest_first_and_respects_limit(api):CODE
LOWtests/test_fake.py100def test_only_listed_locales_with_a_dictionary_answer(api):CODE
LOWtests/test_fake.py112def test_a_dictionary_revalidates_by_etag(api):CODE
LOWtests/test_fake.py123def test_auth_gates_everything_until_login(api):CODE
LOWtests/test_fake.py155def test_every_language_adds_a_dictionary_per_script_and_upstream_s_shape_does_not(api):CODE
LOWtests/test_artwork_names.py104def test_every_artwork_name_is_a_birdnet_label_or_exception():CODE
LOWtests/test_artwork_names.py120def test_every_detectable_plate_has_a_body_mass():CODE
LOWtests/test_artwork_names.py137def test_every_bird_box_names_a_plate_that_exists():CODE
LOWtests/test_artwork_names.py151def test_every_shipped_bird_has_a_box():CODE
LOWtests/test_artwork_names.py170def test_every_bird_box_is_well_formed():CODE
LOWtests/test_artwork_names.py197def test_every_bird_box_was_drawn_on_the_plate_it_is_filed_under(library):CODE
LOWtests/test_artwork_names.py218def test_every_artwork_image_has_attribution():CODE
LOWtests/test_artwork_names.py232def test_every_manifest_source_is_named_in_attribution():CODE
LOWtests/test_artwork_names.py268def test_every_bird_is_cut_large_enough(library):CODE
LOW⚡tests/test_admin.py45def test_the_page_renders_before_anything_has_written_to_the_data_dir(tmp_path, source):CODE
LOW⚡tests/test_admin.py52def test_every_slot_in_the_template_is_filled(tmp_path, source, mode):CODE
LOW⚡tests/test_admin.py57def test_the_page_still_fills_every_slot_with_the_detector_gone(tmp_path, source):CODE
LOW⚡tests/test_admin.py63def test_the_detector_tab_counts_every_bird_heard_without_art(tmp_path, source):CODE
LOW⚡tests/test_admin.py70def test_every_asset_the_page_links_is_one_the_server_serves(tmp_path, source):CODE
LOW⚡tests/test_admin.py76def test_the_config_blob_carries_everything_admin_js_reads(tmp_path, source):CODE
LOW⚡tests/test_admin.py83def test_a_species_with_no_artwork_is_marked_rather_than_dropped(tmp_path):CODE
LOW⚡tests/test_admin.py91def test_a_bird_without_art_is_a_line_the_issue_form_takes():CODE
LOW⚡tests/test_admin.py100def test_the_issue_carries_the_list_while_github_takes_it():CODE
LOW⚡tests/test_admin.py109def test_a_station_with_art_for_every_bird_says_so():CODE
LOW⚡tests/test_admin.py113def test_a_plate_with_a_citation_links_to_it(tmp_path):CODE
LOW⚡tests/test_admin.py120def test_every_species_name_carries_its_scientific_name_for_the_birdnet_link(tmp_path):CODE
LOW⚡tests/test_admin.py127def test_the_update_row_offers_the_install_only_once_a_release_is_known():CODE
LOW⚡tests/test_admin.py156def test_a_working_password_is_not_reported_as_a_missing_one():CODE
LOW⚡tests/test_admin.py162def test_the_detector_password_says_what_it_is_for(tmp_path, source):CODE
LOW⚡tests/test_admin.py170def test_a_stored_password_never_reaches_the_page(tmp_path, source):CODE
LOW⚡tests/test_admin.py177def test_the_placeholder_posts_back_as_leave_it_alone(field):CODE
LOW⚡tests/test_admin.py284def test_the_resolution_names_the_size_the_kiosk_renders_locked_or_not(tmp_path, source):CODE
LOW⚡tests/test_admin.py292def test_the_kiosk_shape_switches_are_declared_so_unticking_one_is_a_change(tmp_path, source):CODE
LOW⚡tests/test_admin.py301def test_a_dimmed_portrait_box_keeps_its_saved_value(tmp_path):CODE
LOW⚡tests/test_admin.py311def test_with_no_panel_the_lock_is_disabled_declaration_and_all(tmp_path, source):CODE
LOW⚡tests/test_admin.py323def test_the_panel_has_a_title_over_its_outputs(tmp_path, source):CODE
LOW⚡tests/test_admin.py329def test_every_tab_has_the_pane_admin_js_shows(tmp_path, source):CODE
LOW⚡tests/test_admin.py335def test_the_margin_offers_each_edge_while_there_is_a_panel(tmp_path, source):CODE
LOW⚡tests/test_admin.py368def test_the_birdnet_link_only_substitutes_this_host_for_a_loopback_one(url, expected):CODE
LOW⚡tests/test_admin.py374def test_the_page_carries_the_link_for_a_detector_on_another_machine(tmp_path, source, monkeypatch):CODE
LOW⚡tests/test_admin.py383def test_the_connection_test_tells_the_three_answers_apart(detector):CODE
LOW⚡tests/test_admin.py442def test_the_credentials_ask_for_a_password_and_no_username(tmp_path, source):CODE
LOW⚡tests/test_admin.py448def test_the_names_field_says_why_it_has_only_the_scientific_name(tmp_path, source, monkeypatch):CODE
LOW⚡tests/test_admin.py457def test_the_display_tab_names_the_password_rather_than_calling_it_unreachable(tmp_path, source):CODE
LOWtests/test_admin.py138def test_the_detector_row_carries_the_version_it_reports():CODE
LOWtests/test_admin.py145def test_the_detector_row_says_a_password_is_wanted_rather_than_unreachable():CODE
LOWtests/test_admin.py193def test_the_form_cannot_set_the_session_secret():CODE
LOWtests/test_admin.py201def test_the_sign_out_button_is_only_offered_where_there_is_a_session_to_end(tmp_path, source):CODE
LOWtests/test_admin.py212def test_the_access_note_says_where_the_switch_and_the_password_leave_things(tmp_path, source):CODE
LOWtests/test_admin.py228def test_the_access_field_says_whether_the_admin_has_a_password(tmp_path, source):CODE
LOWtests/test_admin.py237def test_the_access_switches_are_declared_so_unticking_one_is_a_change(tmp_path, source, field):CODE
LOWtests/test_admin.py248def test_saving_the_form_untouched_leaves_the_password_standing(tmp_path):CODE
LOWtests/test_admin.py259def test_the_collage_fields_render_and_a_plate_mode_save_leaves_the_layout_alone(tmp_path, source):CODE
LOWtests/test_admin.py271def test_the_spotlight_box_saves_both_ways(tmp_path, source):CODE
LOWtests/test_admin.py351def test_unticking_the_margin_lock_is_a_change(tmp_path):CODE
LOWtests/test_admin.py399def test_the_connection_test_reads_the_stored_password_behind_the_placeholder(detector):CODE
LOWtests/test_admin.py405def test_the_connection_test_answers_in_the_status_row_s_words_too(detector):CODE
LOWtests/test_admin.py425def test_the_connection_test_catches_a_detector_that_only_gates_the_names(detector):CODE
356 more matches not shown…
Cross-Language Confusion12 hits · 72 pts
SeverityFileLineSnippetContext
HIGHtools/bird_box.py506let drag = null;CODE
HIGHtools/bird_box.py537 const w = art.naturalWidth || 1, h = art.naturalHeight || 1;CODE
HIGHtools/bird_box.py618 drag = null;CODE
HIGHtools/bird_box.py644 box = moved(box, picked, step[0] * px / (art.naturalWidth || 1),CODE
HIGHtools/bird_box.py645 step[1] * px / (art.naturalHeight || 1));CODE
HIGH⚡tests/test_panel.py50 panel.push(Image.new("P", (1600, 1200)))CODE
HIGH⚡tests/test_panel.py60 panel.push(Image.new("RGB", size), rotation)CODE
HIGH⚡tests/test_panel.py69 panel.push(source, 90)CODE
HIGH⚡tests/test_panel.py76 panel.push(Image.new("P", (800, 480)))CODE
HIGH⚡tests/test_panel.py84 panel.push(Image.new("P", (1200, 1600)))CODE
HIGHsrc/fugleramme/service.py211 panel.push(*pending)CODE
HIGHsrc/fugleramme/updates.py34CONTAINER_COMMAND = "docker compose pull && docker compose up -d"CODE
Unused Imports63 hits · 58 pts
SeverityFileLineSnippetContext
LOWtools/add_bird.py30CODE
LOWtools/preview_plates.py8CODE
LOWtools/species_map.py22CODE
LOWtools/vendor_fonts.py11CODE
LOWtools/bird_box.py25CODE
LOWtools/bird_boxes.py31CODE
LOWtests/test_fake.py4CODE
LOWtests/test_artwork_names.py13CODE
LOWtests/test_admin.py5CODE
LOWtests/conftest.py5CODE
LOWtests/test_artwork_duplicates.py10CODE
LOWtests/test_service.py5CODE
LOWtests/test_container.py8CODE
LOWtests/test_add_bird.py13CODE
LOWtests/test_panel.py6CODE
LOWtests/test_languages.py5CODE
LOWtests/test_updates.py6CODE
LOWtests/test_selection.py7CODE
LOWtests/test_buttons.py4CODE
LOWtests/test_labels.py5CODE
LOWtests/test_names_styles.py5CODE
LOWtests/test_server.py3CODE
LOWtests/test_check.py3CODE
LOWtests/test_picks.py5CODE
LOWtests/test_packing.py5CODE
LOWtests/test_taxa.py7CODE
LOWtests/test_api.py8CODE
LOWtests/test_e6.py5CODE
LOWtests/test_paper.py4CODE
LOWtests/test_modes.py5CODE
LOWtests/test_sizes.py10CODE
LOWtests/test_settings.py4CODE
LOWsrc/fugleramme/service.py13CODE
LOWsrc/fugleramme/picks.py15CODE
LOWsrc/fugleramme/config.py8CODE
LOWsrc/fugleramme/check.py12CODE
LOWsrc/fugleramme/fake.py15CODE
LOWsrc/fugleramme/updates.py8CODE
LOWsrc/fugleramme/modes.py14CODE
LOWsrc/fugleramme/names.py31CODE
LOWsrc/fugleramme/api.py16CODE
LOWsrc/fugleramme/taxa.py18CODE
LOWsrc/fugleramme/cli.py11CODE
LOWsrc/fugleramme/buttons.py9CODE
LOWsrc/fugleramme/settings.py11CODE
LOWsrc/fugleramme/dev.py13CODE
LOWsrc/fugleramme/panel.py13CODE
LOWsrc/fugleramme/languages.py30CODE
LOWsrc/fugleramme/source.py8CODE
LOWsrc/fugleramme/e6.py19CODE
LOWsrc/fugleramme/status.py7CODE
LOWsrc/fugleramme/web/server.py23CODE
LOWsrc/fugleramme/web/__init__.py3CODE
LOWsrc/fugleramme/web/admin.py7CODE
LOWsrc/fugleramme/web/hostinfo.py6CODE
LOWsrc/fugleramme/render/plate.py9CODE
LOWsrc/fugleramme/render/collage.py24CODE
LOWsrc/fugleramme/render/dither.py16CODE
LOWsrc/fugleramme/render/paper.py11CODE
LOWsrc/fugleramme/render/page.py7CODE
3 more matches not shown…
Synthetic Comment Markers3 hits · 18 pts
SeverityFileLineSnippetContext
HIGHREADME.md157- [AvianVisitors](https://github.com/Twarner491/AvianVisitors) - BirdNET-Pi, AI-generated illustrations and photo cutoutCODE
HIGHREADME.md160- [belkins-birdnet](https://github.com/Belkins/belkins-birdnet) - BirdNET-Pi, AI-generated kachō-e style illustrationsCODE
HIGHdocs/faq.md85## Is any of the included art AI-generated?COMMENT
Excessive Try-Catch Wrapping11 hits · 11 pts
SeverityFileLineSnippetContext
LOWtools/platereview/crops.py54 except Exception as error:CODE
LOWexamples/ee02/main.py194 except Exception as error:CODE
LOWexamples/ee02/main.py374except Exception as error:CODE
LOWsrc/fugleramme/service.py83 except Exception as exc:CODE
LOWsrc/fugleramme/service.py214 except Exception as exc:CODE
LOWsrc/fugleramme/check.py51 except Exception as error: # a shape the frame cannot read is a failure tooCODE
LOWsrc/fugleramme/buttons.py72 except Exception as exc:CODE
LOWsrc/fugleramme/buttons.py90 except Exception as exc:CODE
LOWsrc/fugleramme/buttons.py100 except Exception: # a failed write must not take the thread with itCODE
LOWsrc/fugleramme/panel.py60 except Exception as exc: # library not installed (dev loop)CODE
LOWsrc/fugleramme/panel.py65 except Exception as exc: # library present but no panel wired upCODE
Hallucination Indicators1 hit · 10 pts
SeverityFileLineSnippetContext
CRITICALassets/artwork/classic/manifest.json3264 "url": "https://commons.wikimedia.org/wiki/File:Blue_Song_Grosbeak._1._Male._2._Female._3._Young_(NYPL_b13559627-108CODE
Deep Nesting7 hits · 7 pts
SeverityFileLineSnippetContext
LOWexamples/ee02/main.py212CODE
LOWsrc/fugleramme/service.py114CODE
LOWsrc/fugleramme/fake.py257CODE
LOWsrc/fugleramme/fake.py375CODE
LOWsrc/fugleramme/languages.py311CODE
LOWsrc/fugleramme/web/server.py122CODE
LOWsrc/fugleramme/web/server.py459CODE
Over-Commented Block4 hits · 4 pts
SeverityFileLineSnippetContext
LOWtools/platereview/index.html121const store = { get: k => { try { return JSON.parse(localStorage.getItem("plate-review") || "{}")[k] || {}; } catch { reCOMMENT
LOWdocs/species.md1# Species coverageCOMMENT
LOWdocs/species.md21#species-art label:last-of-type { border-radius: 0 .2rem .2rem 0; }COMMENT
LOWdocs/species.md41#species-map-shapes [data-bin="3"] { fill: var(--bin-3); }COMMENT
Modern AI Meta-Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMCHANGELOG.md527- **tools**: #135 add agent-based plate cut skill and review toolingCODE
AI Structural Patterns2 hits · 2 pts
SeverityFileLineSnippetContext
LOWsrc/fugleramme/render/plate.py45CODE
LOWsrc/fugleramme/render/collage.py421CODE