The world's most popular open source digital signage project.
This report presents the forensic synthetic code analysis of Screenly/Anthias, a Python project with 3,655 GitHub stars. SynthScan v2.0 examined 109,584 lines of code across 429 source files, recording 2342 pattern matches distributed across 17 syntactic categories. The overall adjusted score of 26.8 places this repository in the Moderate AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 2342 distinct pattern matches across 17 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | conftest.py | 272 | def pytest_collection_modifyitems( | CODE |
| LOW⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 134 | def test_get_latest_tag_honours_release_tag_env( | CODE |
| LOW⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 176 | def test_get_board_from_url_returns_none_for_non_image(url: str) -> None: | CODE |
| LOW⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 185 | def test_get_asset_list_filters_to_supported_boards( | CODE |
| LOW⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 211 | def test_get_asset_list_excludes_non_xz( | CODE |
| LOW⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 224 | def test_retrieve_and_patch_json_patches_url( | CODE |
| LOW⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 303 | def test_every_supported_board_has_device_tags() -> None: | CODE |
| LOW⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 317 | def test_build_imager_json_emits_one_entry_per_supported_board( | CODE |
| LOW⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 327 | def test_build_imager_json_round_trips_through_json( | CODE |
| LOW | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 160 | def test_get_board_from_url_extracts_board( | CODE |
| LOW | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 235 | def test_retrieve_and_patch_json_converts_sizes_to_int( | CODE |
| LOW | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 250 | def test_retrieve_and_patch_json_marks_maintenance_boards( | CODE |
| LOW | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 264 | def test_retrieve_and_patch_json_skips_maintenance_for_modern_boards( | CODE |
| LOW | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 277 | def test_retrieve_and_patch_json_has_all_required_fields( | CODE |
| LOW | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 292 | def test_retrieve_and_patch_json_adds_device_tags( | CODE |
| LOW | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 341 | def test_build_imager_json_tags_every_entry_for_its_board( | CODE |
| LOW | bin/balena_unpin_devices.py | 499 | def latest_supervisor_release( | CODE |
| LOW | tests/test_recheck_endpoint.py | 71 | def test_enqueues_task_when_no_lock_held() -> None: | CODE |
| LOW | tests/test_recheck_endpoint.py | 86 | def test_skips_enqueue_when_queue_debounce_held() -> None: | CODE |
| LOW | tests/test_recheck_endpoint.py | 108 | def test_back_to_back_calls_only_enqueue_once() -> None: | CODE |
| LOW | tests/test_recheck_endpoint.py | 130 | def test_missing_internal_auth_is_forbidden() -> None: | CODE |
| LOW | tests/test_recheck_endpoint.py | 141 | def test_internal_auth_works_without_basic_auth() -> None: | CODE |
| LOW | tests/test_csrf.py | 44 | def test_same_host_http_origin_passes() -> None: | CODE |
| LOW | tests/test_csrf.py | 57 | def test_same_host_https_origin_on_http_passes() -> None: | CODE |
| LOW | tests/test_csrf.py | 74 | def test_host_with_port_origin_without_port_passes() -> None: | CODE |
| LOW | tests/test_csrf.py | 93 | def test_same_host_distinct_non_default_ports_rejected() -> None: | CODE |
| LOW | tests/test_csrf.py | 110 | def test_default_port_origin_vs_non_default_host_port_rejected() -> None: | CODE |
| LOW | tests/test_csrf.py | 128 | def test_cross_host_origin_still_rejected() -> None: | CODE |
| LOW | tests/test_csrf.py | 141 | def test_missing_token_still_rejected() -> None: | CODE |
| LOW | tests/test_csrf.py | 156 | def test_bad_token_still_rejected() -> None: | CODE |
| LOW | tests/test_csrf.py | 169 | def test_no_origin_header_still_works() -> None: | CODE |
| LOW⚡ | tests/test_csrf.py | 196 | def test_iis_rewrite_host_proxy_without_trusted_origin_rejected() -> None: | CODE |
| LOW | tests/test_csrf.py | 213 | def test_iis_rewrite_host_proxy_with_trusted_origin_passes( | CODE |
| LOW | tests/test_csrf.py | 233 | def test_trusted_origin_does_not_open_other_hosts( | CODE |
| LOW⚡ | tests/test_undervoltage.py | 72 | def test_returns_none_without_the_driver( | CODE |
| LOW⚡ | tests/test_undervoltage.py | 82 | def test_returns_none_when_hwmon_is_absent( | CODE |
| LOW⚡ | tests/test_undervoltage.py | 89 | def test_ignores_rpi_volt_without_the_attribute( | CODE |
| LOW⚡ | tests/test_undervoltage.py | 114 | def test_unsupported_reads_none_not_false( | CODE |
| LOW⚡ | tests/test_undervoltage.py | 124 | def test_unreadable_attribute_is_unknown(self, tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/test_undervoltage.py | 131 | def test_first_alarm_sets_the_latch(self, fake_redis: MagicMock) -> None: | CODE |
| LOW⚡ | tests/test_undervoltage.py | 227 | def test_same_boot_survives_a_reread(self, fake_redis: MagicMock) -> None: | CODE |
| LOW⚡ | tests/test_undervoltage.py | 235 | def test_corrupt_latch_is_discarded(self, fake_redis: MagicMock) -> None: | CODE |
| LOW⚡ | tests/test_undervoltage.py | 244 | def test_boot_id_is_persisted(self, fake_redis: MagicMock) -> None: | CODE |
| LOW⚡ | tests/test_undervoltage.py | 254 | def test_redis_failure_still_returns_the_reading( | CODE |
| LOW⚡ | tests/test_undervoltage.py | 508 | def test_healthy_device_never_creates_the_key( | CODE |
| LOW⚡ | tests/test_undervoltage.py | 518 | def test_a_real_change_still_writes(self, fake_redis: MagicMock) -> None: | CODE |
| LOW⚡ | tests/test_undervoltage.py | 526 | def test_unreadable_redis_does_not_erase_history( | CODE |
| LOW | tests/test_undervoltage.py | 53 | def test_finds_rpi_volt_among_other_sensors( | CODE |
| LOW | tests/test_undervoltage.py | 102 | def test_reads_the_boolean_attribute( | CODE |
| LOW | tests/test_undervoltage.py | 142 | def test_recovery_clears_active_but_not_history( | CODE |
| LOW | tests/test_undervoltage.py | 156 | def test_distinct_brown_outs_accumulate( | CODE |
| LOW | tests/test_undervoltage.py | 170 | def test_sustained_brown_out_counts_once( | CODE |
| LOW | tests/test_undervoltage.py | 186 | def test_worker_restart_does_not_inflate_the_count( | CODE |
| LOW | tests/test_undervoltage.py | 199 | def test_corrupt_count_does_not_raise(self, fake_redis: MagicMock) -> None: | CODE |
| LOW | tests/test_undervoltage.py | 214 | def test_reboot_resets_the_latch(self, fake_redis: MagicMock) -> None: | CODE |
| LOW | tests/test_undervoltage.py | 280 | def test_healthy_board_does_not_warn( | CODE |
| LOW | tests/test_undervoltage.py | 295 | def test_live_alarm_warns_without_a_latch( | CODE |
| LOW | tests/test_undervoltage.py | 312 | def test_history_warns_after_recovery( | CODE |
| LOW | tests/test_undervoltage.py | 329 | def test_live_alarm_is_written_back_to_the_latch( | CODE |
| LOW | tests/test_undervoltage.py | 349 | def test_warning_survives_recovery_after_a_render_only_sighting( | CODE |
| 1368 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | conftest.py | 53 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | conftest.py | 55 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | conftest.py | 85 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | conftest.py | 87 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | conftest.py | 92 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | conftest.py | 94 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | conftest.py | 140 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | conftest.py | 142 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 129 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 131 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 144 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 146 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 180 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 182 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 219 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 221 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 312 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …raspberry_pi_imager/tests/test_build_pi_imager_json.py | 314 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/balena_unpin_devices.py | 199 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/balena_unpin_devices.py | 201 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/balena_unpin_devices.py | 230 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/balena_unpin_devices.py | 232 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/balena_unpin_devices.py | 345 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/balena_unpin_devices.py | 347 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/balena_unpin_devices.py | 475 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/balena_unpin_devices.py | 477 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/balena_unpin_devices.py | 565 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/balena_unpin_devices.py | 567 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | bin/collect_debug.sh | 41 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | bin/collect_debug.sh | 43 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 92 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 94 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 137 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 139 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 226 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 228 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 482 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 484 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 517 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 519 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 561 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 563 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 635 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 637 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 692 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 694 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 795 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 797 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 809 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | bin/collect_debug.sh | 811 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_csrf.py | 183 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_csrf.py | 190 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_diagnostics.py | 149 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_diagnostics.py | 157 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_utils.py | 379 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_utils.py | 435 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_utils.py | 522 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_processing.py | 739 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_processing.py | 741 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_processing.py | 1540 | # --------------------------------------------------------------------------- | COMMENT |
| 258 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | conftest.py | 61 | # job runs with ``-p no:django`` in a *minimal* venv that has neither | COMMENT |
| LOW | pyproject.toml | 61 | # libheif1 system package is supplied by the base image (see | COMMENT |
| LOW | pyproject.toml | 161 | COMMENT | |
| LOW | docker-compose.test.yml | 1 | # vim: ft=yaml.docker-compose | COMMENT |
| LOW | tools/image_builder/utils.py | 101 | builder_extra_apt = [ | COMMENT |
| LOW | tools/image_builder/utils.py | 161 | COMMENT | |
| LOW | tools/image_builder/utils.py | 181 | qt5_toolchain_url = f'{releases_url}/WebView-v2026.07.1' | COMMENT |
| LOW | tools/image_builder/utils.py | 201 | # * Pi2 / Pi3 (32-bit, Qt5): Qt linuxfb + a custom -no-xcb | COMMENT |
| LOW | tools/image_builder/utils.py | 281 | # ``VideoOutput`` hosted in a QQuickWidget (issue #2967: | COMMENT |
| LOW | tools/image_builder/utils.py | 301 | # gstreamer plugin set needed. VLC is deliberately not | COMMENT |
| LOW | tools/image_builder/utils.py | 341 | # | COMMENT |
| LOW | tools/image_builder/utils.py | 361 | # enough to issue the ioctl; see anthias_common/smart.py. | COMMENT |
| LOW | tools/image_builder/utils.py | 381 | # via V4L2 M2M / request API, not VAAPI; mesa-va-drivers | COMMENT |
| LOW | tools/image_builder/utils.py | 401 | # plays pi1/pi2/pi3 video by shelling out to ``gst-launch-1.0 | COMMENT |
| LOW | tools/image_builder/__main__.py | 61 | f'Warning: Failed to create cache directory: {e}', | COMMENT |
| LOW | tools/image_builder/__main__.py | 81 | 'ffmpeg', | COMMENT |
| LOW | tools/image_builder/__main__.py | 181 | # | COMMENT |
| LOW | tools/image_builder/__main__.py | 201 | # Hardcode the GHCR-primary namespace so the cache lives next to | COMMENT |
| LOW | tools/image_builder/__main__.py | 361 | COMMENT | |
| LOW | tools/raspberry_pi_imager/build_pi_imager_json.py | 21 | # one. `pi2` stays because the Pi 2 has no 64-bit option. | COMMENT |
| LOW | bin/balena_unpin_devices.py | 121 | KEEP_PINNED_TAG = 'anthias_keep_pinned' | COMMENT |
| LOW | bin/balena_unpin_devices.py | 141 | # balenaOS 5.1.x, whose devices run supervisor 15.x; pushing 17.x there | COMMENT |
| LOW | bin/enable_ssl.sh | 1 | #!/bin/bash -e | COMMENT |
| LOW | bin/enable_ssl.sh | 21 | # A compose override (docker-compose.ssl.override.yml) is generated to: | COMMENT |
| LOW | bin/enable_ssl.sh | 161 | } | COMMENT |
| LOW | bin/collect_debug.sh | 1 | #!/bin/bash | COMMENT |
| LOW | bin/collect_debug.sh | 21 | # | COMMENT |
| LOW | bin/collect_debug.sh | 241 | section "Mounts" "$SYS" mount | COMMENT |
| LOW | bin/collect_debug.sh | 281 | echo "a kernel built without CONFIG_SENSORS_RASPBERRYPI_HWMON." | COMMENT |
| LOW | bin/collect_debug.sh | 701 | section "Listening sockets" "$NET" sh -c 'ss -tlnp 2>/dev/null || netstat -tlnp 2>/dev/null' | COMMENT |
| LOW | bin/collect_debug.sh | 721 | # should land as more of them move into the UI: adding a field to the | COMMENT |
| LOW | bin/migrate_legacy_paths.sh | 1 | #!/bin/bash | COMMENT |
| LOW | bin/migrate_legacy_paths.sh | 21 | # parallel reimplementation. | COMMENT |
| LOW | bin/generate_board_enablement_testbed.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | bin/install.sh | 381 | [ "$(uv --version 2>/dev/null | awk '{print $2}')" != "${UV_PIN_VERSION}" ]; then | COMMENT |
| LOW | bin/install.sh | 461 | # so `uname -m` reports aarch64 while Docker/apt are armhf. | COMMENT |
| LOW | bin/install.sh | 501 | cd "${ANTHIAS_REPO_DIR}/ansible" | COMMENT |
| LOW | bin/install.sh | 561 | # Free the RAM held by the previous-version stack (server, viewer, | COMMENT |
| LOW | bin/rebuild_qt5_toolchain.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | bin/rebuild_qt5_toolchain.sh | 21 | # (a) two parallel builds will OOM most hosts and (b) the Linaro | COMMENT |
| LOW | bin/rebuild_qt5_toolchain.sh | 61 | COMMENT | |
| LOW | bin/start_viewer.sh | 1 | #!/bin/bash | COMMENT |
| LOW | bin/start_viewer.sh | 41 | # the system interpreter, which has no Anthias deps installed. | COMMENT |
| LOW | bin/build_favicons.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | bin/upgrade_containers.sh | 1 | #!/bin/bash -e | COMMENT |
| LOW | bin/upgrade_containers.sh | 21 | # against a decompression-bomb fixture or runaway ffprobe, not | COMMENT |
| LOW | bin/upgrade_containers.sh | 61 | # Detect Raspberry Pi version. Pi 4 is always treated as pi4-64 (the | COMMENT |
| LOW | bin/upgrade_containers.sh | 101 | # @TODO: Rename later | COMMENT |
| LOW | bin/upgrade_containers.sh | 161 | # No CEC device passthrough is needed, on any board. | COMMENT |
| LOW | bin/migrate_in_container_paths.sh | 1 | #!/bin/bash | COMMENT |
| LOW | bin/purge_stale_images.sh | 1 | #!/bin/bash | COMMENT |
| LOW | bin/purge_stale_images.sh | 21 | # *tagged* images is restricted to the Anthias repositories, and only | COMMENT |
| LOW | bin/render_balena_yml.sh | 1 | #!/bin/bash | COMMENT |
| LOW | bin/balena_ota_deploy.sh | 1 | #!/bin/bash | COMMENT |
| LOW | bin/test_webview_cpp.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | bin/lib/viewer/common.sh | 1 | # shellcheck shell=bash | COMMENT |
| LOW | bin/lib/viewer/common.sh | 21 | # from upstream mpv (RK3399 / Rock Pi 4 today; future Rockchip / | COMMENT |
| LOW | bin/lib/viewer/common.sh | 41 | # Rockchip / Allwinner / Amlogic stateless decoders. The | COMMENT |
| LOW | bin/lib/viewer/common.sh | 101 | COMMENT | |
| LOW | bin/lib/viewer/common.sh | 121 | # Run a minimal per-container daemon as the viewer user. The config | COMMENT |
| 272 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/image_builder/__main__.py | 59 | except Exception as e: | CODE |
| LOW | bin/migrate_legacy_paths.sh | 177 | except Exception: | CODE |
| MEDIUM | bin/migrate_legacy_paths.sh | 173 | def asset_count(path): | CODE |
| LOW | tests/test_processing.py | 68 | except Exception: | CODE |
| LOW | src/anthias_viewer/media_player.py | 655 | except Exception: | CODE |
| LOW | src/anthias_viewer/media_player.py | 670 | except Exception: | CODE |
| LOW | src/anthias_viewer/media_player.py | 943 | except Exception as exc: | CODE |
| LOW | src/anthias_viewer/__init__.py | 909 | except Exception: | CODE |
| LOW | src/anthias_viewer/__init__.py | 919 | except Exception: | CODE |
| LOW | src/anthias_viewer/__init__.py | 1348 | except Exception as exc: | CODE |
| LOW | src/anthias_viewer/__init__.py | 1401 | except Exception as exc: | CODE |
| LOW | src/anthias_viewer/__init__.py | 1406 | except Exception: | CODE |
| LOW | src/anthias_viewer/__init__.py | 1484 | except Exception as exc: | CODE |
| LOW | src/anthias_viewer/__init__.py | 1604 | except Exception as exc: | CODE |
| LOW | src/anthias_viewer/__init__.py | 1714 | except Exception: | CODE |
| LOW | src/anthias_viewer/__init__.py | 2219 | except Exception as exc: | CODE |
| LOW | src/anthias_viewer/__init__.py | 2247 | except Exception: | CODE |
| LOW | src/anthias_viewer/__init__.py | 2527 | except Exception as exc: | CODE |
| LOW | src/anthias_viewer/__init__.py | 2615 | except Exception: | CODE |
| LOW | src/anthias_viewer/__init__.py | 2677 | except Exception: | CODE |
| LOW | src/anthias_viewer/__init__.py | 2705 | except Exception: | CODE |
| LOW | src/anthias_viewer/__main__.py | 10 | except Exception: | CODE |
| LOW | src/anthias_common/board.py | 60 | except Exception: | CODE |
| LOW | src/anthias_common/board.py | 88 | except Exception: | CODE |
| LOW | src/anthias_common/storage_health.py | 821 | except Exception: | CODE |
| LOW | src/anthias_common/storage_health.py | 886 | except Exception: | CODE |
| LOW | src/anthias_common/storage_health.py | 899 | except Exception: | CODE |
| LOW | src/anthias_common/version.py | 45 | except Exception: | CODE |
| LOW | src/anthias_common/version.py | 66 | except Exception: | CODE |
| LOW | src/anthias_common/smart.py | 350 | except Exception: | CODE |
| LOW | src/anthias_common/smart.py | 364 | except Exception: | CODE |
| LOW | src/anthias_common/utils.py | 459 | except Exception: | CODE |
| LOW | src/anthias_common/utils.py | 515 | except Exception: | CODE |
| LOW | src/anthias_common/undervoltage.py | 263 | except Exception: | CODE |
| LOW | src/anthias_common/undervoltage.py | 375 | except Exception: | CODE |
| MEDIUM | src/anthias_common/undervoltage.py | 124 | def _scan_for_alarm_path() -> str | None: | CODE |
| LOW | src/anthias_webview/pyshim/imp.py | 147 | except Exception: | CODE |
| LOW⚡ | src/anthias_server/processing.py | 512 | except Exception: | CODE |
| LOW⚡ | src/anthias_server/processing.py | 519 | except Exception: | CODE |
| LOW | src/anthias_server/processing.py | 544 | except Exception: # pragma: no cover - graceful no-op on hosts w/o libheif | CODE |
| LOW | src/anthias_server/processing.py | 618 | except Exception: | CODE |
| LOW | src/anthias_server/processing.py | 980 | except Exception: | CODE |
| MEDIUM | src/anthias_server/celery_tasks.py | 566 | def send_telemetry_task() -> None: | CODE |
| LOW | src/anthias_server/celery_tasks.py | 387 | except Exception: | CODE |
| LOW | src/anthias_server/celery_tasks.py | 408 | except Exception: | CODE |
| LOW | src/anthias_server/celery_tasks.py | 535 | except Exception: | CODE |
| LOW | src/anthias_server/celery_tasks.py | 680 | except Exception: | CODE |
| LOW | src/anthias_server/celery_tasks.py | 737 | except Exception: | CODE |
| LOW | src/anthias_server/celery_tasks.py | 805 | except Exception: | CODE |
| LOW | src/anthias_server/celery_tasks.py | 1520 | except Exception: | CODE |
| LOW | src/anthias_server/celery_tasks.py | 1816 | except Exception: | CODE |
| LOW | src/anthias_server/app/consumers.py | 80 | except Exception: | CODE |
| LOW | src/anthias_server/app/page_context.py | 88 | except Exception: | CODE |
| LOW | src/anthias_server/app/page_context.py | 124 | except Exception: | CODE |
| LOW | src/anthias_server/app/page_context.py | 156 | except Exception: | CODE |
| MEDIUM | src/anthias_server/app/page_context.py | 153 | def _storage_state() -> dict[str, Any]: | CODE |
| LOW | src/anthias_server/app/views.py | 1780 | except Exception as exc: | CODE |
| LOW | src/anthias_server/lib/storage_watcher.py | 141 | except Exception: | CODE |
| LOW | src/anthias_server/lib/telemetry.py | 61 | except Exception as exc: | CODE |
| MEDIUM | src/anthias_server/lib/telemetry.py | 55 | def _get_asset_counts() -> dict[str, int]: | CODE |
| 14 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | conftest.py | 73 | CODE | |
| LOW | bin/balena_unpin_devices.py | 81 | CODE | |
| LOW | bin/shoot_pages.py | 17 | CODE | |
| LOW | bin/balena_fleet_maintenance.py | 41 | CODE | |
| LOW | emails/render_logo.py | 22 | CODE | |
| LOW | tests/test_csrf.py | 10 | CODE | |
| LOW | tests/test_processing.py | 31 | CODE | |
| LOW | tests/test_auth.py | 20 | CODE | |
| LOW | tests/test_login_view.py | 10 | CODE | |
| LOW | tests/test_design_system_page.py | 18 | CODE | |
| LOW | tests/test_sentry.py | 292 | CODE | |
| LOW | tests/test_sentry.py | 315 | CODE | |
| LOW | tests/test_email_tokens.py | 22 | CODE | |
| LOW | tests/test_migrate_to_screenly.py | 15 | CODE | |
| LOW | tests/test_error_pages.py | 11 | CODE | |
| LOW | tests/test_design_tokens.py | 16 | CODE | |
| LOW | tests/_seed_data.py | 24 | CODE | |
| LOW | tests/test_remote_video.py | 13 | CODE | |
| LOW | tests/test_storage_watcher.py | 3 | CODE | |
| LOW | tests/test_host_agent_board_subtype.py | 19 | CODE | |
| LOW | tests/test_host_agent_ifaddrs.py | 11 | CODE | |
| LOW | tests/test_smart.py | 8 | CODE | |
| LOW | tests/test_app.py | 30 | CODE | |
| LOW | tests/test_template_views.py | 11 | CODE | |
| LOW | tests/test_storage_health.py | 10 | CODE | |
| LOW | src/anthias_common/board.py | 29 | CODE | |
| LOW | src/anthias_common/storage_health.py | 75 | CODE | |
| LOW | src/anthias_common/version.py | 11 | CODE | |
| LOW | src/anthias_common/youtube.py | 12 | CODE | |
| LOW | src/anthias_common/remote_video.py | 17 | CODE | |
| LOW | src/anthias_common/smart.py | 44 | CODE | |
| LOW | src/anthias_common/http.py | 13 | CODE | |
| LOW | src/anthias_common/undervoltage.py | 49 | CODE | |
| LOW | src/anthias_host_agent/ifaddrs.py | 18 | CODE | |
| LOW | src/anthias_webview/pyshim/pipes.py | 6 | CODE | |
| LOW | src/anthias_server/processing.py | 51 | CODE | |
| LOW | src/anthias_server/app/design_system.py | 21 | CODE | |
| LOW | …thias_server/app/management/commands/import_content.py | 11 | CODE | |
| LOW | src/anthias_server/lib/auth.py | 66 | CODE | |
| LOW | src/anthias_server/lib/csrf.py | 37 | CODE | |
| LOW | src/anthias_server/lib/storage_watcher.py | 35 | CODE | |
| LOW | src/anthias_server/lib/screenly_migration.py | 14 | CODE | |
| LOW | src/anthias_server/lib/undervoltage_watcher.py | 26 | CODE | |
| LOW | src/anthias_server/lib/timezone.py | 17 | CODE | |
| LOW | src/anthias_server/lib/integrations/screencloud.py | 25 | CODE | |
| LOW | src/anthias_server/lib/integrations/ingest.py | 20 | CODE | |
| LOW | src/anthias_server/lib/integrations/graphql.py | 10 | CODE | |
| LOW | src/anthias_server/lib/integrations/registry.py | 9 | CODE | |
| LOW | src/anthias_server/lib/integrations/xibo.py | 25 | CODE | |
| LOW | src/anthias_server/lib/integrations/pisignage.py | 22 | CODE | |
| LOW | src/anthias_server/lib/integrations/http.py | 14 | CODE | |
| LOW | src/anthias_server/lib/integrations/base.py | 19 | CODE | |
| LOW | src/anthias_server/lib/integrations/yodeck.py | 20 | CODE | |
| LOW | src/anthias_server/api/admin.py | 1 | CODE | |
| LOW | src/anthias_server/api/tests/test_pisignage_import.py | 9 | CODE | |
| LOW | src/anthias_server/api/tests/test_xibo_import.py | 9 | CODE | |
| LOW | src/anthias_server/api/tests/test_yodeck_import.py | 14 | CODE | |
| LOW | src/anthias_server/api/tests/_graphql_helpers.py | 9 | CODE | |
| LOW | src/anthias_server/api/tests/test_screenly_migration.py | 15 | CODE | |
| LOW | src/anthias_server/api/tests/test_screencloud_import.py | 9 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bin/shoot_pages.py | 87 | def _setup_django(seed: bool) -> None: | CODE |
| LOW | tests/test_celery_tasks.py | 34 | def _set_mtime(file_path: str, age_seconds: int) -> None: | CODE |
| LOW | tests/test_app.py | 1509 | def _set_clock_toggle(page: Page, use_24h: bool) -> None: | CODE |
| LOW | tests/test_app.py | 1573 | def _set_date_format(page: Page, value: str) -> None: | CODE |
| LOW | tests/test_app.py | 1629 | def _set_name(value: str) -> None: | CODE |
| LOW | src/anthias_viewer/media_player.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_viewer/media_player.py | 38 | def set_browser_bus(bus: Any) -> None: | CODE |
| LOW | src/anthias_viewer/media_player.py | 55 | def set_send_to_webview(fn: Any) -> None: | CODE |
| LOW | src/anthias_viewer/media_player.py | 521 | def set_asset(self, uri: str, duration: int | str) -> None: | CODE |
| LOW | src/anthias_viewer/media_player.py | 625 | def set_asset(self, uri: str, duration: int | str) -> None: | CODE |
| LOW | src/anthias_viewer/media_player.py | 797 | def set_asset(self, uri: str, duration: int | str) -> None: | CODE |
| LOW | src/anthias_viewer/__init__.py | 77 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_viewer/utils.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_viewer/scheduling.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_viewer/scheduling.py | 201 | def update_playlist(self, *, allow_reshuffle: bool = False) -> None: | CODE |
| LOW | src/anthias_viewer/gst_fbdev_player.py | 63 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_viewer/__main__.py | 5 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_viewer/messaging.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_common/storage_health.py | 88 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_common/smart.py | 53 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_common/utils.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_common/undervoltage.py | 79 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_host_agent/__main__.py | 35 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_host_agent/__main__.py | 94 | def set_ip_addresses() -> None: | CODE |
| LOW | src/anthias_host_agent/__main__.py | 209 | def set_total_mem_kb(rdb: 'redis.Redis') -> None: | CODE |
| LOW | src/anthias_host_agent/__main__.py | 230 | def set_board_subtype(rdb: 'redis.Redis') -> None: | CODE |
| LOW | src/anthias_server/settings.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/processing.py | 68 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/celery_tasks.py | 61 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/app/consumers.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/app/helpers.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/app/page_context.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/app/views.py | 60 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/app/views.py | 1537 | def _set_toast_header(response: HttpResponse, kind: str, message: str) -> None: | CODE |
| LOW | src/anthias_server/lib/auth.py | 110 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | src/anthias_server/lib/cec.py | 56 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/lib/display_power.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/lib/storage_watcher.py | 44 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/lib/diagnostics.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/lib/telemetry.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/lib/backup_helper.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/lib/whitenoise.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/lib/whitenoise.py | 40 | def update_files_dictionary(self, root: str, prefix: str) -> None: | CODE |
| LOW | src/anthias_server/lib/cec_client.py | 50 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/lib/undervoltage_watcher.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/lib/github.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/lib/github.py | 50 | def _set_github_error_backoff(action: str) -> None: | CODE |
| LOW | src/anthias_server/lib/integrations/screencloud.py | 43 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/lib/integrations/yodeck.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/api/helpers.py | 21 | def update_asset(asset: dict[str, Any], data: dict[str, Any]) -> None: | CODE |
| LOW | src/anthias_server/api/views/mixins.py | 44 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/anthias_server/api/views/v2.py | 90 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_app.py | 249 | ' return el && typeof window.Alpine?.$data(el)?.openAdd === "function";' | CODE |
| HIGH | tests/test_app.py | 775 | _alpine_state(page, 'state.editAsset && state.editAsset.asset_id') | CODE |
| HIGH | tests/test_app.py | 974 | 'state.previewAsset && state.previewAsset.asset_id', | CODE |
| HIGH | tests/test_app.py | 999 | 'state.previewAsset && state.previewAsset.asset_id', | CODE |
| HIGH | tests/test_app.py | 1652 | if (l && l.textContent.trim() === label) { | CODE |
| HIGH | tests/test_app.py | 1656 | return null; | CODE |
| HIGH | tests/test_app.py | 1706 | if (memLegend[i] !== undefined) row.textContent = memLegend[i]; | CODE |
| HIGH | tests/test_app.py | 1723 | if (diskLegend[i] !== undefined) row.textContent = diskLegend[i]; | CODE |
| HIGH | tests/test_app.py | 1736 | : null; | CODE |
| HIGH | tests/test_app.py | 110 | if (!el) return null; | STRING |
| HIGH | tests/test_app.py | 465 | return Boolean(el && el.closest('.modal-card')); | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bin/shoot_pages.py | 153 | CODE | |
| LOW | bin/balena_fleet_maintenance.py | 173 | CODE | |
| LOW | tests/fake_docker.py | 77 | CODE | |
| LOW | tests/test_design_tokens.py | 275 | CODE | |
| LOW | tests/test_design_tokens.py | 300 | CODE | |
| LOW | tests/test_design_tokens.py | 355 | CODE | |
| LOW | tests/test_design_tokens.py | 474 | CODE | |
| LOW | tests/test_template_views.py | 3265 | CODE | |
| LOW | tests/test_template_views.py | 3416 | CODE | |
| LOW | src/anthias_viewer/media_player.py | 97 | CODE | |
| LOW | src/anthias_viewer/media_player.py | 339 | CODE | |
| LOW | src/anthias_viewer/__init__.py | 1885 | CODE | |
| LOW | src/anthias_viewer/__init__.py | 1914 | CODE | |
| LOW | src/anthias_viewer/__init__.py | 1994 | CODE | |
| LOW | src/anthias_viewer/__init__.py | 2343 | CODE | |
| LOW | src/anthias_viewer/messaging.py | 46 | CODE | |
| LOW | src/anthias_common/storage_health.py | 687 | CODE | |
| LOW | src/anthias_common/utils.py | 198 | CODE | |
| LOW | src/anthias_common/utils.py | 388 | CODE | |
| LOW | src/anthias_common/utils.py | 439 | CODE | |
| LOW | src/anthias_common/undervoltage.py | 124 | CODE | |
| LOW | src/anthias_common/device_helper.py | 34 | CODE | |
| LOW | src/anthias_common/device_helper.py | 193 | CODE | |
| LOW | src/anthias_host_agent/__main__.py | 132 | CODE | |
| LOW | src/anthias_host_agent/__main__.py | 173 | CODE | |
| LOW | src/anthias_server/celery_tasks.py | 1167 | CODE | |
| LOW | src/anthias_server/celery_tasks.py | 1586 | CODE | |
| LOW | src/anthias_server/app/views.py | 226 | CODE | |
| LOW | src/anthias_server/app/views.py | 492 | CODE | |
| LOW | src/anthias_server/app/templatetags/asset_filters.py | 330 | CODE | |
| LOW | src/anthias_server/lib/cec.py | 548 | CODE | |
| LOW | src/anthias_server/lib/cec.py | 331 | CODE | |
| LOW | src/anthias_server/lib/storage_watcher.py | 60 | CODE | |
| LOW | src/anthias_server/lib/whitenoise.py | 70 | CODE | |
| LOW | src/anthias_server/lib/undervoltage_watcher.py | 77 | CODE | |
| LOW | src/anthias_server/lib/integrations/ingest.py | 200 | CODE | |
| LOW | src/anthias_server/api/serializers/mixins.py | 61 | CODE | |
| LOW | src/anthias_server/api/views/mixins.py | 290 | CODE | |
| LOW | src/anthias_server/api/views/v2.py | 624 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | bin/install.sh | 503 | # If the user can't elevate without a password, Ansible needs | COMMENT |
| MEDIUM | bin/install.sh | 537 | # host + runtime layers. An explicit -e is robust against sudo stripping | COMMENT |
| LOW | bin/start_viewer.sh | 43 | # we just set; -E alone is subject to env_check / env_delete and is not | COMMENT |
| MEDIUM | ansible/site.yml | 6 | # install.sh passes -e anthias_user explicitly (robust under sudo). | COMMENT |
| MEDIUM | src/anthias_webview/src/view.cpp | 295 | // an in-place navigation), so transitions are seamless with at most | COMMENT |
| MEDIUM | src/anthias_server/app/static/sass/_styles.scss | 3230 | // 16rem parent is robust to whichever `position` wins. | COMMENT |
| MEDIUM | src/anthias_server/app/static/src/apps/location-map.ts | 133 | // whenever the canvas actually gets its size — robust to the modal | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bin/generate_board_enablement_testbed.sh | 67 | # Step 2: cut H.264 sources to CUT_SECONDS via -c copy. Avoids a | COMMENT |
| LOW | bin/generate_board_enablement_testbed.sh | 92 | # Step 3: HEVC re-encode each H.264 cut. ``-tag:v hvc1`` writes | COMMENT |
| LOW | bin/generate_board_enablement_testbed.sh | 120 | # Step 4: report. | COMMENT |
| LOW⚡ | website/content/docs/x86-installation.md | 27 | ## Step 1: Download Debian | COMMENT |
| LOW⚡ | website/content/docs/x86-installation.md | 35 | ## Step 2: Write the installer to a USB drive | COMMENT |
| LOW⚡ | website/content/docs/x86-installation.md | 42 | ## Step 3: Install Debian | COMMENT |
| LOW⚡ | website/content/docs/x86-installation.md | 52 | ## Step 4: Prepare the system for Anthias | COMMENT |
| LOW | website/content/docs/x86-installation.md | 90 | ## Step 5: Run the Anthias installer | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src/anthias_server/lib/auth.py | 540 | from django.core.exceptions import ValidationError | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | bin/start_server.sh | 21 | # The following block ensures that the migration is transactional and that the | COMMENT |
| MEDIUM | tests/test_processing.py | 793 | # Create a minimal placeholder — ffprobe is mocked below so the | COMMENT |
| MEDIUM | tests/test_processing.py | 1111 | # Create an empty placeholder file so the FileNotFoundError check | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bin/generate_board_enablement_testbed.sh | 67 | # Step 2: cut H.264 sources to CUT_SECONDS via -c copy. Avoids a | COMMENT |
| LOW | bin/generate_board_enablement_testbed.sh | 92 | # Step 3: HEVC re-encode each H.264 cut. ``-tag:v hvc1`` writes | COMMENT |
| LOW | bin/generate_board_enablement_testbed.sh | 120 | # Step 4: report. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | bin/collect_debug.sh | 31 | # Usage: | COMMENT |
| LOW | bin/generate_board_enablement_testbed.sh | 14 | # Usage: | COMMENT |
| LOW | bin/rebuild_qt5_toolchain.sh | 25 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | bin/start_viewer.sh | 3 | # start_viewer.sh — orchestrates the viewer boot. Shared setup runs on | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | emails/README.md | 156 | announcement, kept real rather than filled with lorem ipsum so the | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_storage_health.py | 73 | CODE |