AI Slop Code RIsk Monitor

ActivityWatch/activitywatch

The best free and open-source automated time tracker. Cross-platform, extensible, privacy-focused.

15.8 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for ActivityWatch/activitywatch, a Python project with 19,180 GitHub stars. SynthScan examined 16,790 lines of code across 86 source files, recording 208 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 15.8 (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.

15.8
Adjusted Signal
15.8
Raw Pattern Score
100%
Time Factor
2026-10-10
Last Push
19.2K
Stars
Python
Language
16.8K
Lines of Code
86
Files
208
Pattern Hits
2026-10-12
Scan Date
0.07
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 44.0/100 · MEDIUM

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

Hallucinated Dependency & Supply Chain Risk 5.5/100 · LOW

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

Agent Over-Engineering Ratio 45.2/100 · MEDIUM

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

PR Review Velocity Impact 55.5/100 · HIGH

Which changes need focused human review? 208 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 6MEDIUM 17LOW 185

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 208 distinct pattern matches across 14 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 Identifiers138 hits · 151 pts
SeverityFileLineSnippetContext
LOWscripts/emit_research_category_preset.py194def _toml_table_string_values(text: str, table: str) -> list[str]:CODE
LOWscripts/tests/test_publish_research_feed.py54def test_valid_research_release():CODE
LOWscripts/tests/test_publish_research_feed.py92def test_invalid_release_or_manifest(mutation):CODE
LOWscripts/tests/test_publish_research_feed.py110def test_wrong_edition_release_version_or_extension(replacement):CODE
LOWscripts/tests/test_publish_research_feed.py158def test_initial_preparation_does_not_publish(tmp_path, remote):CODE
LOWscripts/tests/test_publish_research_feed.py167def test_advance_preserves_history_and_unrelated_files(tmp_path, remote):CODE
LOWscripts/tests/test_publish_research_feed.py181def test_replay_is_noop_and_conflicting_equal_version_rejected(tmp_path, remote):CODE
LOWscripts/tests/test_publish_research_feed.py200def test_numeric_semver_order(tmp_path, remote):CODE
LOWscripts/tests/test_publish_research_feed.py209def test_same_parent_race_and_retry_revalidates_order(tmp_path, remote, provision):CODE
LOWscripts/tests/test_publish_research_feed.py226def test_deleted_parent_cannot_be_silently_recreated(tmp_path, remote):CODE
LOWscripts/tests/test_publish_research_feed.py237def test_rewound_parent_is_rejected_even_when_push_would_fast_forward(tmp_path, remote):CODE
LOWscripts/tests/test_publish_research_feed.py249def test_existing_pre_push_hook_is_preserved(tmp_path, remote):CODE
LOWscripts/tests/test_publish_research_feed.py264def test_prepare_rejects_existing_workdir(tmp_path, remote):CODE
LOWscripts/tests/test_publish_research_feed.py273def test_cli_validates_before_prepare(tmp_path, monkeypatch):CODE
LOWscripts/tests/test_publish_research_feed.py299def test_receive_side_rejects_race_after_parent_was_advertised(tmp_path, remote):CODE
LOWscripts/tests/test_publish_research_feed.py320def test_cli_public_checks_and_explicit_publish_flag(CODE
LOWscripts/tests/test_publish_research_feed.py372def test_failed_public_signature_read_leaves_no_candidate(CODE
LOW⚡scripts/tests/test_build_changelog.py163def test_shared_submodule_gets_a_single_section(bundle):CODE
LOW⚡scripts/tests/test_build_changelog.py173def test_sections_are_flat_and_follow_repo_order(bundle):CODE
LOW⚡scripts/tests/test_build_changelog.py182def test_parent_with_only_a_submodule_bump_is_dropped(bundle):CODE
LOW⚡scripts/tests/test_build_changelog.py191def test_out_of_sync_parents_get_the_union_and_a_warning(bundle):CODE
LOWscripts/tests/test_build_changelog.py205def test_parent_that_never_bumped_is_named_in_the_warning(bundle):CODE
LOWscripts/tests/test_build_changelog.py218def test_union_keeps_commits_when_the_parents_started_apart(tmp_path):CODE
LOWscripts/tests/test_build_changelog.py231def test_in_sync_parents_get_no_warning(bundle):CODE
LOWscripts/tests/test_build_changelog.py239def test_parent_that_newly_vendors_a_repo_does_not_replay_its_history(tmp_path):CODE
LOWscripts/tests/test_build_changelog.py268def test_unresolvable_pointers_are_reported_not_silently_dropped(tmp_path):CODE
LOWscripts/tests/test_build_changelog.py287def test_newly_vendored_pin_keeps_the_commits_only_it_has(tmp_path):CODE
LOWscripts/tests/test_build_changelog.py317def test_warning_survives_when_every_commit_is_filtered(tmp_path):CODE
LOWscripts/tests/test_build_changelog.py333def test_adoption_alone_does_not_replay_history(tmp_path):CODE
LOWscripts/tests/test_build_changelog.py361def test_new_submodule_hidden_commits_url_uses_commits_not_compare(tmp_path):CODE
LOWscripts/tests/test_build_changelog.py386def test_uninitialized_submodule_does_not_derail_pin_collection(tmp_path):CODE
LOWscripts/tests/test_build_changelog.py402def test_support_section_links_the_subscribe_page_without_claiming_gates():CODE
LOWscripts/tests/test_build_changelog.py409def test_support_section_reaches_the_assembled_bundle_notes(bundle, tmp_path, monkeypatch):CODE
LOWscripts/tests/test_patch_research_edition_profile.py65def test_check_mode_writes_nothing(tmp_path: Path, target: str):CODE
LOWscripts/tests/test_patch_research_edition_profile.py81def test_missing_file_fails_closed(tmp_path: Path):CODE
LOWscripts/tests/test_patch_research_edition_profile.py92def test_missing_token_fails_closed(tmp_path: Path):CODE
LOWscripts/tests/test_patch_research_edition_profile.py109def test_ambiguous_token_fails_closed(tmp_path: Path):CODE
LOWscripts/tests/test_patch_research_edition_profile.py121def test_nothing_written_when_one_site_fails(tmp_path: Path):CODE
LOWscripts/tests/test_patch_research_edition_profile.py171def test_real_tree_check_passes_if_submodules_present(target: str):CODE
LOWscripts/tests/test_patch_research_edition_profile.py182def test_patched_python_profile_module_behaviour(tmp_path: Path, monkeypatch):CODE
LOWscripts/tests/test_patch_research_edition_profile.py214def test_macos_bundle_dir_is_distinct_from_standard(tmp_path: Path, target: str):CODE
LOWscripts/tests/test_patch_research_edition_profile.py273def test_windows_installer_is_a_separate_product(tmp_path: Path, target: str):CODE
LOWscripts/tests/test_patch_research_edition_profile.py309def test_windows_research_installers_do_not_collide_with_each_other(tmp_path: Path):CODE
LOWscripts/tests/test_patch_research_edition_profile.py375def test_windows_installer_producer_matches_packaging_and_release(windows_installer_names):CODE
LOWscripts/tests/test_patch_research_edition_profile.py417def test_windows_setup_collection(tmp_path: Path, windows_installer_names):CODE
LOWscripts/tests/test_patch_research_edition_profile.py439def test_windows_setup_collection_refuses_invalid_inputs(tmp_path: Path, case: str):CODE
LOWscripts/tests/test_patch_research_edition_profile.py469def test_tauri_wix_upgrade_code_is_pinned_and_config_stays_valid_json(tmp_path: Path):CODE
LOWscripts/tests/test_patch_research_edition_profile.py490def test_linux_deb_is_a_separate_package(tmp_path: Path):CODE
LOWscripts/tests/test_patch_research_edition_profile.py500def test_linux_deb_installs_beside_a_standard_install(tmp_path: Path):CODE
LOWscripts/tests/test_patch_research_edition_profile.py521def test_linux_desktop_entry_is_rebranded(tmp_path: Path):CODE
LOWscripts/tests/test_patch_research_edition_profile.py531def test_appimage_desktop_and_icon_ids_agree(tmp_path: Path):CODE
LOWscripts/tests/test_patch_research_edition_profile.py554def test_first_run_autostart_identity_is_distinct_on_every_platform(tmp_path: Path):CODE
LOWscripts/tests/test_patch_research_edition_profile.py594def test_tauri_autostart_uses_distinct_app_name_for_research_build(tmp_path: Path):CODE
LOWscripts/tests/test_configure_tauri_release.py77def test_windows_drops_msi_for_non_numeric_prerelease(config):CODE
LOWscripts/tests/test_configure_tauri_release.py87def test_non_windows_keeps_all_targets_for_non_numeric_prerelease(config):CODE
LOW⚡scripts/tests/test_configure_tauri_release.py99def test_windows_keeps_all_targets_for_msi_safe_version(config):CODE
LOW⚡scripts/tests/test_configure_tauri_release.py108def test_standard_version_changes_without_changing_update_trust(config):CODE
LOW⚡scripts/tests/test_configure_tauri_release.py118def test_research_release_replaces_endpoint_and_key(config):CODE
LOWscripts/tests/test_configure_tauri_release.py133def test_secretless_research_smoke_build_has_no_update_trust(config):CODE
LOWscripts/tests/test_configure_tauri_release.py142def test_release_missing_either_key_fails_without_modifying_config(CODE
78 more matches not shown…
Decorative Section Separators12 hits · 28 pts
SeverityFileLineSnippetContext
MEDIUMscripts/screenshots.py74# =============================================================================COMMENT
MEDIUMscripts/screenshots.py76# =============================================================================COMMENT
MEDIUMscripts/screenshots.py205# =============================================================================COMMENT
MEDIUMscripts/screenshots.py207# =============================================================================COMMENT
MEDIUMscripts/screenshots.py829# =============================================================================COMMENT
MEDIUMscripts/screenshots.py831# =============================================================================COMMENT
MEDIUMscripts/screenshots.py1026# =============================================================================COMMENT
MEDIUMscripts/screenshots.py1028# =============================================================================COMMENT
MEDIUMscripts/screenshots.py1275# =============================================================================STRING
MEDIUMscripts/screenshots.py1277# =============================================================================STRING
MEDIUMscripts/screenshots.py1294# =============================================================================STRING
MEDIUMscripts/screenshots.py1296# =============================================================================STRING
Over-Commented Block17 hits · 17 pts
SeverityFileLineSnippetContext
LOWscripts/emit_research_category_preset.py41import sysCOMMENT
LOWscripts/patch_research_edition_config.py781COMMENT
LOWscripts/patch_research_edition_profile.py81# it upgrades over an existing install and its uninstaller removes both. OwnCOMMENT
LOWscripts/patch_research_edition_profile.py541 "\n# create AppRun\n",COMMENT
LOWscripts/bump-submodules.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/bump-submodules.sh21#COMMENT
LOWscripts/chores/make-release.sh1#!/bin/bashCOMMENT
LOWscripts/research_edition/geography-free-default.toml1# Geography-free default research presetCOMMENT
LOWscripts/research_edition/geography-free-default.toml21#COMMENT
LOWscripts/research_edition/export_sanitize.rs1//! Research Edition `/api/0/export` sanitizer.COMMENT
LOWscripts/tests/integration_tests.py81COMMENT
LOWscripts/package/dmgbuild-settings.py41# Volume sizeCOMMENT
LOWscripts/package/host-abi-gate.sh1#!/bin/bashCOMMENT
LOWscripts/package/abi-gate.sh1#!/bin/bashCOMMENT
LOWscripts/package/build_app_tauri.sh201 if echo "$sign_output" | grep -q "bundle format is ambiguous"; thenCOMMENT
LOW.github/workflows/release.yml1name: ReleaseCOMMENT
LOW.github/workflows/release.yml321 tips='echo "$(git rev-parse HEAD) $displaypath"'COMMENT
Empty Error Handlers3 hits · 15 pts
SeverityFileLineSnippetContext
HIGHscripts/screenshots.py1168except Exception:CODE
HIGHscripts/screenshots.py1173except Exception:CODE
HIGHscripts/tests/query_parity/servers.py100except requests.RequestException:CODE
Cross-Language Confusion3 hits · 12 pts
SeverityFileLineSnippetContext
HIGHscripts/screenshots.py1043 if (n.offsetParent !== null) return false;CODE
HIGHscripts/screenshots.py1058 if (/error|failed|exception/i.test(t)) out.push(t.slice(0, 300));CODE
HIGHscripts/screenshots.py1238 page.evaluate("() => document.activeElement && document.activeElement.blur()")STRING
Deep Nesting12 hits · 10 pts
SeverityFileLineSnippetContext
LOWscripts/screenshots.py527CODE
LOWscripts/screenshots.py564CODE
LOWscripts/screenshots.py641CODE
LOWscripts/screenshots.py886CODE
LOWscripts/screenshots.py1180CODE
LOWscripts/screenshots.py1323CODE
LOWscripts/logcrawler.py22CODE
LOWscripts/build_changelog.py470CODE
LOWscripts/build_changelog.py718CODE
LOWscripts/tests/query_parity/conftest.py114CODE
LOWscripts/tests/query_parity/attribute.py59CODE
LOWscripts/tests/query_parity/test_query_parity.py24CODE
Excessive Try-Catch Wrapping6 hits · 7 pts
SeverityFileLineSnippetContext
MEDIUMscripts/patch_research_edition_export.py390 print(f"Error: {error}", file=sys.stderr)CODE
LOWscripts/screenshots.py1168 except Exception:STRING
LOWscripts/screenshots.py1173 except Exception:STRING
MEDIUMscripts/patch_research_edition_config.py807 print(f"Error: {CONFIG_FILE} not found", file=sys.stderr)CODE
MEDIUMscripts/patch_research_edition_config.py813 print(f"Error: {error} in {CONFIG_FILE}", file=sys.stderr)CODE
LOWscripts/build_changelog.py854 except Exception as e:STRING
Unused Imports7 hits · 6 pts
SeverityFileLineSnippetContext
LOWscripts/check_tauri_server.py4CODE
LOWscripts/patch_research_edition_export.py39CODE
LOWscripts/screenshots.py33CODE
LOWscripts/patch_research_edition_profile.py62CODE
LOWscripts/tests/test_emit_research_category_preset.py1CODE
LOWscripts/tests/query_parity/servers.py40CODE
LOWscripts/package/dmgbuild-settings.py2CODE
Verbosity Indicators3 hits · 4 pts
SeverityFileLineSnippetContext
LOWscripts/package/build_app_tauri.sh161 # Step 1: Sign all Mach-O binary files (dylibs, .so files, standalone executables).COMMENT
LOWscripts/package/build_app_tauri.sh186 # Step 2: Sign bundle directories (.framework, .bundle, .plugin) after their contents.COMMENT
LOWscripts/package/build_app_tauri.sh269 # Step 3: Sign the top-level .app bundle last.COMMENT
Structural Annotation Overuse3 hits · 4 pts
SeverityFileLineSnippetContext
LOWscripts/package/build_app_tauri.sh161 # Step 1: Sign all Mach-O binary files (dylibs, .so files, standalone executables).COMMENT
LOWscripts/package/build_app_tauri.sh186 # Step 2: Sign bundle directories (.framework, .bundle, .plugin) after their contents.COMMENT
LOWscripts/package/build_app_tauri.sh269 # Step 3: Sign the top-level .app bundle last.COMMENT
Self-Referential Comments1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMscripts/chores/make-release.sh7# Create an annotated tagCOMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMscripts/tests/test_publish_research_feed.py142 # Isolate test repositories from any enclosing harness Git invocation.COMMENT
Redundant / Tautological Comments1 hit · 2 pts
SeverityFileLineSnippetContext
LOWscripts/package/dmgbuild-settings.py79# Set these to True to force inclusion of icon/list view settings (otherwiseCOMMENT
Modern Structural Boilerplate1 hit · 1 pts
SeverityFileLineSnippetContext
LOWscripts/build_changelog.py43logger = logging.getLogger(__name__)CODE