AI Slop Code RIsk Monitor

darrylmorley/whatcable

macOS menu bar app that tells you, in plain English, what each USB-C cable plugged into your Mac can actually do

8.5 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for darrylmorley/whatcable, a Swift project with 8,875 GitHub stars. SynthScan examined 193,219 lines of code across 544 source files, recording 1745 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 8.5 (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.

8.5
Adjusted Signal
8.5
Raw Pattern Score
100%
Time Factor
2026-10-11
Last Push
8.9K
Stars
Swift
Language
193.2K
Lines of Code
544
Files
1.7K
Pattern Hits
2026-10-12
Scan Date
0.00
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 34.4/100 · MEDIUM

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

Hallucinated Dependency & Supply Chain Risk 0.4/100 · LOW

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

Agent Over-Engineering Ratio 1.3/100 · LOW

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

PR Review Velocity Impact 36.5/100 · MEDIUM

Which changes need focused human review? 1745 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 1MEDIUM 3LOW 1741

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

Over-Commented Block1645 hits · 1537 pts
SeverityFileLineSnippetContext
LOW.gitleaks.toml1# gitleaks configuration for WhatCable.COMMENT
LOWprobes/test-kit/55_hub_ports.c21#include <IOKit/IOCFPlugIn.h>COMMENT
LOWprobes/test-kit/probe_json.h21#include <CoreFoundation/CoreFoundation.h>COMMENT
LOWTests/WhatCableCoreTests/VendorDBTests.swift41COMMENT
LOW…atCableCoreTests/LocalizedBundleConcurrencyTests.swift1import FoundationCOMMENT
LOWTests/WhatCableCoreTests/TRMTransportTests.swift101 #expect(t.transportType == "USB2")COMMENT
LOW…sts/WhatCableCoreTests/CableDBVariantLookupTests.swift1import TestingCOMMENT
LOW…sts/WhatCableCoreTests/CableDBVariantLookupTests.swift81 #expect(matches.first?.brand.contains("CalDigit") == true)COMMENT
LOW…/WhatCableCoreTests/USB3CorroborationWidgetTests.swift1import FoundationCOMMENT
LOW…/WhatCableCoreTests/USB3CorroborationWidgetTests.swift61 }COMMENT
LOW…ts/WhatCableCoreTests/ThunderboltProbeSweepTests.swift1import FoundationCOMMENT
LOW…ts/WhatCableCoreTests/ThunderboltProbeSweepTests.swift121 ///COMMENT
LOW…ts/WhatCableCoreTests/ThunderboltProbeSweepTests.swift421 // Both corpus pairs carry both ends; a folder with one end only is aCOMMENT
LOW…ts/WhatCableCoreTests/ThunderboltProbeSweepTests.swift661 #expect(sw?.parentSwitchUID == 100)COMMENT
LOW…ts/WhatCableCoreTests/ThunderboltProbeSweepTests.swift861 /// through the PRODUCTION parser (`IOThunderboltPort.from(read:)`, theCOMMENT
LOW…ts/WhatCableCoreTests/ThunderboltProbeSweepTests.swift941 }COMMENT
LOW…ts/WhatCableCoreTests/ThunderboltProbeSweepTests.swift1061 // An earlier hop-table count of 45 was inflated by truncatedCOMMENT
LOW…ts/WhatCableCoreTests/ThunderboltProbeSweepTests.swift1101 """COMMENT
LOW…ts/WhatCableCoreTests/ThunderboltProbeSweepTests.swift1121 // exercised: at zero, nothing in this sweep would touch it.COMMENT
LOW…ts/WhatCableCoreTests/ThunderboltProbeSweepTests.swift1221 .filter { $0.parentSwitchUID == sw.id && $0.depth >= 1 }COMMENT
LOWTests/WhatCableCoreTests/CableCertLookupTests.swift1import FoundationCOMMENT
LOWTests/WhatCableCoreTests/CableCertLookupTests.swift41COMMENT
LOWTests/WhatCableCoreTests/CableCertLookupTests.swift81 let certs = CableDB.certifications(forXID: Self.ankerXID)COMMENT
LOW…CableCoreTests/DataLinkDiagnosticProbeSweepTests.swift1081 // case is the non-confirming one and the golden (unknownCable)COMMENT
LOW…s/WhatCableCoreTests/PortSummaryCorpusSweepTests.swift1import FoundationCOMMENT
LOW…s/WhatCableCoreTests/PortSummaryCorpusSweepTests.swift21/// probe capture (never a decodable array), so `PowerSource.options` isCOMMENT
LOW…s/WhatCableCoreTests/PortSummaryCorpusSweepTests.swift441 // case, not as a list of ports: a case resolves with sourceCOMMENT
LOW…s/WhatCableCoreTests/PortSummaryCorpusSweepTests.swift521 "\(violations.count) connected corpus port(s) reported .empty status: \(violations.prefix(5))")COMMENT
LOW…s/WhatCableCoreTests/PortSummaryCorpusSweepTests.swift761 @Test("Invariant: an e-marker response always produces an e-marker group")COMMENT
LOW…sts/WhatCableCoreTests/PowerSourceSynthesisTests.swift321 )COMMENT
LOW…sts/WhatCableCoreTests/PowerSourceSynthesisTests.swift361 }COMMENT
LOW…sts/WhatCableCoreTests/PowerSourceSynthesisTests.swift521 #expect(result == nil)COMMENT
LOW…sts/WhatCableCoreTests/PowerSourceSynthesisTests.swift581 // Mismatch: entries.count (2) != positionalPortKeys.count (3).COMMENT
LOW…bleCoreTests/PowerSourceSynthesisProbeSweepTests.swift1import FoundationCOMMENT
LOW…bleCoreTests/PowerSourceSynthesisProbeSweepTests.swift121 guard let range = body.range(of: "\(key):") else { return nil }COMMENT
LOW…bleCoreTests/PowerSourceSynthesisProbeSweepTests.swift441 if routine.count > 40 {COMMENT
LOW…CableCoreTests/USB3CorroborationCorpusSweepTests.swift1import FoundationCOMMENT
LOW…CableCoreTests/USB3CorroborationCorpusSweepTests.swift21/// (`portName(fromUSBIOPortPath:)`: take the first ancestor'sCOMMENT
LOW…CableCoreTests/USB3CorroborationCorpusSweepTests.swift41/// - **Uncorroborated baseline ports**: asserts NO USB3 label/verdictCOMMENT
LOW…CableCoreTests/USB3CorroborationCorpusSweepTests.swift261 }COMMENT
LOW…CableCoreTests/USB3CorroborationCorpusSweepTests.swift421COMMENT
LOW…CableCoreTests/USB3CorroborationCorpusSweepTests.swift541 }COMMENT
LOW…CableCoreTests/USB3CorroborationCorpusSweepTests.swift581 // an unrelated later block when a probe-19 dash separator appearedCOMMENT
LOWTests/WhatCableCoreTests/AppInfoVersionTests.swift1import TestingCOMMENT
LOWTests/WhatCableCoreTests/SnapshotCorpusTests.swift81 func snapshotView() throws {COMMENT
LOW…sts/WhatCableCoreTests/ClassDiscoveryCorpusTests.swift1import FoundationCOMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift181 @Test("4-lane HBR2, the node lists the G34w-10's 100Hz top: belowMonitorMax, the statement clears the cable")COMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift201 let diag = try #require(DisplayDiagnostic(dp: makeDP(lanes: 2, currentMode: Self.liveG34w60, drivenTiming: Self.COMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift321 // Base block PLUS the CTA-861 extension. The G34w's 100 Hz mode isCOMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift381 #expect(DisplayDiagnostic.branchDeviceLabel("CustomHub") == "CustomHub")COMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift401 // UltraFine 4K reached over a Thunderbolt/USB4 tunnel at 4 lanes HBR2.COMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift581COMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift701 #expect(diag.facts.maxMode?.height == 2880)COMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift741 #expect(diag.bottleneck == .fine)COMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift1101 // Driven at 1440p60 with the node listing that picture at 60 Hz only:COMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift1221 }COMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift1241COMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift1321 func linkLimitedMaxModeDoesNotReadAsFine() throws {COMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift1381 // never a throughput figure.COMMENT
LOWTests/WhatCableCoreTests/DisplayDiagnosticTests.swift1441 @Test("A max mode below the declared top does not lower it")COMMENT
1585 more matches not shown…
Hyper-Verbose Identifiers59 hits · 52 pts
SeverityFileLineSnippetContext
LOWscripts/check-localisation.py762def scan_triple_quoted_literal(text: str, start: int):CODE
LOWscripts/check-localisation.py1099def build_string_returning_funcs(all_contents):CODE
LOWscripts/check-localisation.py1193def check_stringsdict_structure(target, lang, path, failures):CODE
LOWscripts/probe-tests/snapshot_checks.py261def connection_class_problems(body):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py117 def test_withheld_summary_must_add_up(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py121 def test_skipped_summary_must_add_up(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py126 def test_skipped_connection_keeps_its_class_and_place(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py201 def test_part_withheld_bytes_must_be_zero(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py205 def test_part_withheld_range_in_bounds(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py213 def test_small_probe_withheld_bytes_checked(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py323 def test_reci_in_a_raw_bytes_field(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py330 def test_short_identifier_gives_no_short_text(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py338 def test_shared_bytes_not_dropped(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py409 def test_skipped_entry_not_missing(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py417 def test_skipped_connection_must_have_its_entry_and_links(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py426 def test_skipped_hardware_is_a_problem(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py433 def test_beneath_a_process_connection_is_recorded(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py553 def test_accessories_beneath_user_clients_pass(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py560 def test_connection_without_its_entry_is_an_island(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py569 def test_nested_user_client_must_be_an_instance(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py575 def test_virtual_hid_device_skipped_with_its_user_client(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py774 def test_paired_bluetooth_kept_count(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py780 def test_small_probe_skips_snapshot_only_checks(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py788 def test_privacy_fails_on_a_broken_file(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py837 def test_part_withheld_join_key(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py841 def test_part_withheld_not_counted_as_kept(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py846 def test_withheld_device_serial_flagged(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py859 def test_attached_adapter_must_be_kept(self):CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py867 def test_withheld_volume_uuid_flagged(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py90 def test_footer_step_is_required(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py139 def test_connection_recorded_in_full_is_caught_by_its_class(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py163 def test_process_id_left_in_the_output_is_caught(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py177 def test_skipped_properties_must_add_up(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py184 def test_every_entry_reachable_from_the_root(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py226 def test_withheld_summary_required(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py231 def test_link_parent_is_an_entry(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py261 def test_bad_middle_line_is_not_a_cut(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py290 def test_every_generated_form_found(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py299 def test_known_encodings_found(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py363 def test_each_probe_has_its_own_record_types(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py374 def test_format_doc_lists_the_same_records(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py390 def test_process_name_compared_without_its_pid(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py447 def test_skipped_property_not_compared(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py455 def test_part_withheld_compares_other_bytes(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py466 def test_every_plane_compared(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py478 def test_volatile_value_ignored(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py481 def test_volatile_gpu_counters_ignored(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py496 def test_missing_key_excused_only_when_it_holds_an_identifier(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py521 def test_withheld_counted_not_failed(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py587 def test_virtual_hid_device_missing(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py593 def test_cross_plane_entry_keeps_its_service_link(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py665 def test_reader_returns_every_instance_nested_included(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py685 def test_reader_finds_connections_nested_below_the_root(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py694 def test_vs_ioreg_does_not_trust_the_probe_skip_list(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py739 def test_planted_in_raw_bytes_field(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py745 def test_near_empty_address_matched_only_whole(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py760 def test_identifier_not_read_is_a_problem(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py800 def test_privacy_judges_a_capped_file_on_its_content(self):CODE
LOWscripts/probe-tests/test_snapshot_checks.py818 def test_capped_snapshot_skips_the_live_kept_checks(self):CODE
Deep Nesting22 hits · 22 pts
SeverityFileLineSnippetContext
LOWscripts/check-duplicate-readers.py275CODE
LOWscripts/check-duplicate-readers.py311CODE
LOWscripts/check-localisation.py641CODE
LOWscripts/check-localisation.py714CODE
LOWscripts/check-localisation.py762CODE
LOWscripts/check-localisation.py1193CODE
LOWscripts/check-localisation.py1270CODE
LOWscripts/edid-timings/extract-cta-vic.py94CODE
LOWscripts/edid-timings/check-edid-timings.py64CODE
LOWscripts/edid-timings/check-edid-timings.py82CODE
LOWscripts/probe-tests/snapshot_checks.py55CODE
LOWscripts/probe-tests/snapshot_checks.py235CODE
LOWscripts/probe-tests/snapshot_checks.py282CODE
LOWscripts/probe-tests/snapshot_checks.py344CODE
LOWscripts/probe-tests/snapshot_checks.py480CODE
LOWscripts/probe-tests/snapshot_checks.py584CODE
LOWscripts/probe-tests/snapshot_checks.py862CODE
LOWscripts/probe-tests/snapshot_checks.py956CODE
LOWscripts/probe-tests/snapshot_checks.py973CODE
LOWscripts/probe-tests/snapshot_checks.py240CODE
LOWscripts/probe-tests/snapshot_checks.py869CODE
LOWscripts/probe-tests/test_snapshot_checks.py694CODE
Cross-Language Confusion1 hit · 11 pts
SeverityFileLineSnippetContext
HIGH⚡scripts/probe-tests/test_snapshot_checks.py107 # 693): a complete footer has reason null and step null, whatever theCOMMENT
AI Slop Vocabulary3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUM…eTests/ReferenceScenarios/JoeshawDaisyChainTests.swift27/// not sensitive to that field, so this test is robust to thatCOMMENT
MEDIUMSources/WhatCable/Services/Installer.swift223 // so the parse is robust to that (and to any future change in whichCOMMENT
MEDIUM…rces/WhatCableWidget/Cable/CableTimelineProvider.swift56 /// discards the objects. This is simpler and more robust than keeping aCOMMENT
Example Usage Blocks4 hits · 6 pts
SeverityFileLineSnippetContext
LOWscripts/bump-formula.sh5# Usage:COMMENT
LOWscripts/bump-cask.sh4# Usage:COMMENT
LOWscripts/beta-release.sh4# Usage:COMMENT
LOWscripts/release.sh4# Usage:COMMENT
Unused Imports3 hits · 3 pts
SeverityFileLineSnippetContext
LOWscripts/edid-timings/extract-cta-vic.py43CODE
LOWscripts/edid-timings/check-edid-timings.py25CODE
LOWscripts/edid-timings/extract-dmt.py32CODE
Verbosity Indicators2 hits · 3 pts
SeverityFileLineSnippetContext
LOW…ces/WhatCableCore/Devices/ChainDeviceAttribution.swift197 // Step 3: the controller's own record must carry a usable path andCOMMENT
LOW…ces/WhatCableCore/Devices/ChainDeviceAttribution.swift225 // Step 5: pick the deepest match. A candidate's path is always aCOMMENT
Structural Annotation Overuse2 hits · 3 pts
SeverityFileLineSnippetContext
LOW…ces/WhatCableCore/Devices/ChainDeviceAttribution.swift197 // Step 3: the controller's own record must carry a usable path andCOMMENT
LOW…ces/WhatCableCore/Devices/ChainDeviceAttribution.swift225 // Step 5: pick the deepest match. A candidate's path is always aCOMMENT
Fake / Example Data4 hits · 2 pts
SeverityFileLineSnippetContext
LOWscripts/build-cable-db.swift705 "Acme Ltd info@example.co.uk", "Acme Ltd"),STRING
LOW⚡scripts/probe-tests/test_snapshot_checks.py855 ids = sc.identifier_forms(users=["jdoe", "Jane Doe"])CODE
LOW⚡scripts/probe-tests/test_snapshot_checks.py856 bad = wrap([entry(ROOT, [["Owner", {"t": "str", "v": "Jane Doe's Mac"}]])])CODE
LOWscripts/probe-tests/test_snapshot_checks.py271 "homes": ["/Users/jdoe"], "users": ["jdoe", "Jane Doe"]}CODE