AI Slop Code Risk Monitor

safing/portmaster

SlopCodeMonitor badge for safing/portmaster Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

🏔 Love Freedom - ❌ Block Mass Surveillance

2.0 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for safing/portmaster, a Go project with 14,010 GitHub stars. SynthScan examined 234,344 lines of code across 1608 source files, recording 297 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 2.0 (Low 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.

2.0
Adjusted Signal
2.0
Raw Pattern Score
100%
Time Factor
2026-10-29
Last Push
14.0K
Stars
Go
Language
234.3K
Lines of Code
1.6K
Files
297
Pattern Hits
2026-10-31
Scan Date
0.00
HC Hit Rate

Risk Review · Payload v1

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

Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.

Cognitive Ownership Risk 7.0/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 1.3/100 · LOW

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

Agent Over-Engineering Ratio 1.4/100 · LOW

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

PR Review Velocity Impact 8.0/100 · LOW

Which changes need focused human review? 297 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 4HIGH 1MEDIUM 26LOW 266

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 297 distinct pattern matches across 12 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 Block192 hits · 186 pts
SeverityFileLineSnippetContext
LOWwindows_kext/driver/src/connection_map.rs121 /// It must not inherit the old verdict or the old owner's process id.COMMENT
LOWwindows_kext/driver/src/device.rs301 // "Packet cache: {} entries",COMMENT
LOWwindows_kext/driver/src/lib.rs41#[panic_handler]COMMENT
LOWwindows_kext/driver/src/packet_util.rs61/// Redirects an outbound packet to a specified remote address and port.COMMENT
LOWwindows_kext/driver/src/packet_util.rs141COMMENT
LOWwindows_kext/driver/src/packet_util.rs381// Converts a given key into connection information.COMMENT
LOWwindows_kext/driver/src/packet_util.rs401// process_id: u64,COMMENT
LOWwindows_kext/driver/src/packet_util.rs421// payload,COMMENT
LOWwindows_kext/driver/src/callouts.rs61 // ale_callouts::ale_resource_monitor,COMMENT
LOWwindows_kext/wdk/src/error.rs1// use anyhow::anyhow;COMMENT
LOWwindows_kext/c_helper/helper.c1COMMENT
LOWcmds/observation-hub/apprise.go181COMMENT
LOWcmds/observation-hub/apprise.go241}COMMENT
LOWcmds/observation-hub/apprise.go261COMMENT
LOWcmds/portmaster-core/main_windows.go21 // Ensure the service ImagePath in the registry is properly quoted (CWE-428).COMMENT
LOWcmds/updatemgr/build.sh1#!/bin/bashCOMMENT
LOWdesktop/tauri/src-tauri/Cargo.toml81# this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is dCOMMENT
LOWdesktop/tauri/src-tauri/Cargo.toml101# https://github.com/tauri-apps/tao/pull/1334COMMENT
LOWdesktop/tauri/src-tauri/src/windows_tao_patch.rs1//! Windows-only: guard for the patched `tao` dependency, plus a debug-onlyCOMMENT
LOWdesktop/tauri/src-tauri/src/windows_tao_patch.rs21//! normal use needs hours or days to hit it.COMMENT
LOWdesktop/tauri/src-tauri/src/windows_tao_patch.rs41//! `tao::PORTMASTER_PATCH_LEVEL`. Only the count becomes atomic; the runnerCOMMENT
LOWdesktop/tauri/src-tauri/src/windows_tao_patch.rs61//! flag because the CLI parser in `cli.rs` skips unknown flags. The flag isCOMMENT
LOWdesktop/tauri/src-tauri/src/window.rs161///COMMENT
LOWdesktop/tauri/src-tauri/src/window.rs201/// Opens a window for the tauri application.COMMENT
LOW…ktop/tauri/src-tauri/src/linux_graphics_workarounds.rs1//! Linux-only graphics workarounds, applied at the start of `main()` beforeCOMMENT
LOW…ktop/tauri/src-tauri/src/linux_graphics_workarounds.rs21//! Reference: <https://v2.tauri.app/develop/debug/linux-graphics/>.COMMENT
LOW…ktop/tauri/src-tauri/src/linux_graphics_workarounds.rs41//! in `is_wayland_session()`.COMMENT
LOWdesktop/tauri/src-tauri/src/main.rs181 }COMMENT
LOWdesktop/tauri/src-tauri/src/portmaster/mod.rs1/// This module contains a custom tauri plugin that handles all communicationCOMMENT
LOW…rojects/safing/portmaster-api/src/lib/network.types.ts101 Port: number;COMMENT
LOW…rojects/safing/portmaster-api/src/lib/network.types.ts261 // TunnelContext holds additional data about the SPN tunnel used forCOMMENT
LOW…rojects/safing/portmaster-api/src/lib/network.types.ts281 LocalIPScope: IPScope;COMMENT
LOW…rojects/safing/portmaster-api/src/lib/network.types.ts301 // VerdictPermanent is set to true if the connection was marked andCOMMENT
LOW…projects/safing/portmaster-api/src/lib/config.types.ts221 Key: string;COMMENT
LOWdesktop/angular/src/app/pages/app-view/app-view.ts541 this.highlightSettingKey = queryMap.get('setting');COMMENT
LOWdesktop/angular/src/app/services/notifications.types.ts141COMMENT
LOWdesktop/angular/src/app/services/notifications.types.ts161 Invalid = "invalid",COMMENT
LOWdesktop/angular/src/app/services/notifications.types.ts181 // markdown.COMMENT
LOWdesktop/angular/src/i18n/helptexts.yaml201# How to use? In App settings, search for "Default Action"COMMENT
LOWdesktop/angular/src/i18n/helptexts.yaml241COMMENT
LOWspn/ships/ship.go41 // LoadSize returns the recommended data size that should be handed to Load().COMMENT
LOWspn/unit/doc.go1// Package unit provides a "work unit" scheduling system for handling data sets that traverse multiple workers / goroutiCOMMENT
LOWspn/unit/scheduler.go81type SchedulerConfig struct {COMMENT
LOWspn/tools/install.sh1#!/bin/shCOMMENT
LOWspn/tools/install.v2.sh1#!/bin/shCOMMENT
LOWspn/terminal/terminal.go41 // Should not be overridden by implementations.COMMENT
LOWspn/terminal/operation.go41COMMENT
LOWspn/terminal/control_flow.go161// be ignored.COMMENT
LOWspn/terminal/testing.go221// Should not be overridden by implementations.COMMENT
LOWspn/navigator/optimize.go41COMMENT
LOWspn/navigator/state.go121 // OR:COMMENT
LOWspn/docks/crane.go61 cancelCtx context.CancelFuncCOMMENT
LOWspn/hub/intel.go61COMMENT
LOWspn/hub/intel.go81COMMENT
LOWspn/hub/hub.go101 // "smtp:587",COMMENT
LOWservice/intel/geoip/country_info_test.go41 }COMMENT
LOWservice/intel/filterlists/index.go21// Category is used to group different list sources by the typeCOMMENT
LOWservice/broadcasts/testdata/notifications.yaml1notifications:COMMENT
LOWservice/interop/ivpn/hook_linux.go61}COMMENT
LOWservice/interop/ivpn/hook_linux.go201 return 0, fmt.Errorf("no rule entry found in nft output")COMMENT
132 more matches not shown…
Structural Annotation Overuse35 hits · 63 pts
SeverityFileLineSnippetContext
LOWwindows_kext/test/BUILD_DEBUG.md22## Step 1: Enable Test Signing (One-time Setup)COMMENT
LOWwindows_kext/test/BUILD_DEBUG.md60## Step 2: Enable Debug Logging in DriverCOMMENT
LOWwindows_kext/test/BUILD_DEBUG.md78## Step 3: Build Driver in Release ModeCOMMENT
LOWwindows_kext/test/BUILD_DEBUG.md93## Step 4: Link the DriverCOMMENT
LOWwindows_kext/test/BUILD_DEBUG.md111## Step 5: Sign the DriverCOMMENT
LOWwindows_kext/test/BUILD_DEBUG.md113## Step 5: Sign the DriverCOMMENT
LOWwindows_kext/test/BUILD_DEBUG.md130## Step 6: View Driver LogsCOMMENT
LOWcmds/observation-hub/observe.go119 // Step 1: Wait for SPN to connect, if needed.COMMENT
LOWcmds/observation-hub/observe.go149 // Step 2: Get current state.COMMENT
LOWcmds/observation-hub/observe.go185 // Step 3: Monitor for changes.COMMENT
LOWspn/access/token/pblind.go352 // Step 1: Process issued tokens.COMMENT
LOWspn/access/token/pblind.go394 // Step 2: Randomize received tokensCOMMENT
LOWspn/access/token/pblind.go407 // Step 3: Add tokens to storage.COMMENT
LOW⚡spn/navigator/state.go237 // Step 1: Check if only one is active.COMMENT
LOW⚡spn/navigator/state.go246 // Step 2: Check if only one is reachable.COMMENT
LOW⚡spn/navigator/state.go255 // Step 3: Check which one has been seen first.COMMENT
LOW⚡spn/patrol/http.go60 // Step 1: Check 1 domain, require 100%COMMENT
LOW⚡spn/patrol/http.go65 // Step 2: Check 5 domains, require 80%COMMENT
LOW⚡spn/patrol/http.go70 // Step 3: Check 20 domains, require 70%COMMENT
LOW⚡service/compat/selfcheck.go50 // Step 0: Check if self-check makes sense.COMMENT
LOW⚡service/compat/selfcheck.go55 // Step 1: Check if the system integration sees a packet.COMMENT
LOWservice/compat/selfcheck.go90 // Step 2: Check if a DNS request arrives at the nameserverCOMMENT
LOWservice/compat/selfcheck.go159 // Step 3: Have the nameserver respond with random data in the answer section.COMMENT
LOW⚡service/network/clean.go74 // Step 0: delete old incomplete connectionsCOMMENT
LOW⚡service/network/clean.go83 // Step 1: check if still activeCOMMENT
LOWservice/network/clean.go110 // Step 2: mark as endedCOMMENT
LOWservice/network/clean.go127 // Step 3: deleteCOMMENT
LOWservice/updates/index_scan.go123 // Step 1: Extract information and check ignores.COMMENT
LOWservice/updates/index_scan.go163 // Step 2: Check and compare file version.COMMENT
LOWservice/updates/index_scan.go188 // Step 3: Create new Artifact.COMMENT
LOW⚡service/sync/util.go148 // Step 1: Separate profile icon.COMMENT
LOW⚡service/sync/util.go154 // Step 2: Serialize main export.COMMENT
LOW⚡service/sync/util.go160 // Step 3: Serialize icon only.COMMENT
LOW⚡service/sync/util.go166 // Step 4: Stitch data together and add copyright notice for icon.COMMENT
LOWservice/sync/util.go177 // Step 4: Add checksum.COMMENT
Decorative Section Separators20 hits · 60 pts
SeverityFileLineSnippetContext
MEDIUMdesktop/tauri/src-tauri/Cargo.toml89# ---------------------------------------------------------------------------COMMENT
MEDIUMdesktop/tauri/src-tauri/Cargo.toml102# ---------------------------------------------------------------------------COMMENT
MEDIUMservice/splittun/proxy/cache.go11// ─── ConnContext ──────────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/cache.go101// ─── Metrics ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/cache.go115// ─── Session cache ────────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/cache.go262// ─── Shared helpers ───────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/udp_proxy.go162// ─── Inbound read loop ────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/udp_proxy.go303// ─── Upstream → client forwarder ─────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/udp_proxy.go382// ─── Idle cleanup loop ────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/udp_proxy.go433// ─── Error helpers ────────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/common.go11// ─── Public API types ────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/common.go73// ─── Configuration ────────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/tcp_proxy.go152// ─── accept loop ──────────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/tcp_proxy.go189// ─── per-connection handler ───────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/proxy_test.go14// ─── helpers ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/proxy_test.go86// ─── TCP tests ────────────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/proxy_test.go275// ─── UDP tests ────────────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/proxy_test.go476// ─── Misc ─────────────────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/bench_test.go12// ─── TCP benchmarks ───────────────────────────────────────────────────────────COMMENT
MEDIUMservice/splittun/proxy/bench_test.go77// ─── UDP benchmarks ───────────────────────────────────────────────────────────COMMENT
Hallucination Indicators4 hits · 60 pts
SeverityFileLineSnippetContext
CRITICAL⚡spn/unit/unit.go72 u.scheduler.stats.progress.avgUnitLifeCnt.Add(1)CODE
CRITICAL⚡spn/unit/unit.go73 if u.scheduler.stats.progress.avgUnitLifeSum.Add(timeTaken) < 0 {CODE
CRITICAL⚡spn/unit/unit.go75 u.scheduler.stats.progress.avgUnitLifeCnt.Store(1)CODE
CRITICAL⚡spn/unit/unit.go76 u.scheduler.stats.progress.avgUnitLifeSum.Store(timeTaken)CODE
Verbosity Indicators28 hits · 52 pts
SeverityFileLineSnippetContext
LOWcmds/observation-hub/observe.go119 // Step 1: Wait for SPN to connect, if needed.COMMENT
LOWcmds/observation-hub/observe.go149 // Step 2: Get current state.COMMENT
LOWcmds/observation-hub/observe.go185 // Step 3: Monitor for changes.COMMENT
LOWspn/access/token/pblind.go352 // Step 1: Process issued tokens.COMMENT
LOWspn/access/token/pblind.go394 // Step 2: Randomize received tokensCOMMENT
LOWspn/access/token/pblind.go407 // Step 3: Add tokens to storage.COMMENT
LOW⚡spn/navigator/state.go237 // Step 1: Check if only one is active.COMMENT
LOW⚡spn/navigator/state.go246 // Step 2: Check if only one is reachable.COMMENT
LOW⚡spn/navigator/state.go255 // Step 3: Check which one has been seen first.COMMENT
LOW⚡spn/patrol/http.go60 // Step 1: Check 1 domain, require 100%COMMENT
LOW⚡spn/patrol/http.go65 // Step 2: Check 5 domains, require 80%COMMENT
LOW⚡spn/patrol/http.go70 // Step 3: Check 20 domains, require 70%COMMENT
LOW⚡service/compat/selfcheck.go50 // Step 0: Check if self-check makes sense.COMMENT
LOW⚡service/compat/selfcheck.go55 // Step 1: Check if the system integration sees a packet.COMMENT
LOWservice/compat/selfcheck.go90 // Step 2: Check if a DNS request arrives at the nameserverCOMMENT
LOWservice/compat/selfcheck.go159 // Step 3: Have the nameserver respond with random data in the answer section.COMMENT
LOW⚡service/network/clean.go74 // Step 0: delete old incomplete connectionsCOMMENT
LOW⚡service/network/clean.go83 // Step 1: check if still activeCOMMENT
LOWservice/network/clean.go110 // Step 2: mark as endedCOMMENT
LOWservice/network/clean.go127 // Step 3: deleteCOMMENT
LOWservice/updates/index_scan.go123 // Step 1: Extract information and check ignores.COMMENT
LOWservice/updates/index_scan.go163 // Step 2: Check and compare file version.COMMENT
LOWservice/updates/index_scan.go188 // Step 3: Create new Artifact.COMMENT
LOW⚡service/sync/util.go148 // Step 1: Separate profile icon.COMMENT
LOW⚡service/sync/util.go154 // Step 2: Serialize main export.COMMENT
LOW⚡service/sync/util.go160 // Step 3: Serialize icon only.COMMENT
LOW⚡service/sync/util.go166 // Step 4: Stitch data together and add copyright notice for icon.COMMENT
LOWservice/sync/util.go177 // Step 4: Add checksum.COMMENT
Modern AI Meta-Vocabulary3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMdesktop/angular/README.md72### Code scaffoldingCOMMENT
MEDIUMdesktop/angular/projects/safing/ui/README.md5## Code scaffoldingCOMMENT
MEDIUM…sktop/angular/projects/safing/portmaster-api/README.md5## Code scaffoldingCOMMENT
Synthetic Comment Markers1 hit · 8 pts
SeverityFileLineSnippetContext
HIGHservice/resolver/ipinfo.go35 // Domain is the domain as requested by the application.COMMENT
TODO Padding4 hits · 6 pts
SeverityFileLineSnippetContext
LOWservice/netenv/environment_default.go15// TODO: implement usingCOMMENT
LOWservice/netenv/online-status.go414 // TODO: implement more methodsCOMMENT
LOWbase/database/storage/fstree/fstree.go269 // TODO: implement MaintainRecordStatesCOMMENT
LOWbase/database/storage/badger/badger.go224 // TODO: implement MaintainRecordStatesCOMMENT
AI Slop Vocabulary2 hits · 5 pts
SeverityFileLineSnippetContext
MEDIUMdesktop/angular/package-lock.json18780 "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz",CODE
MEDIUMservice/firewall/packet_handler.go396 // Fast-tracking keeps the UI connection seamless when resuming from paused state.COMMENT
Redundant / Tautological Comments3 hits · 4 pts
SeverityFileLineSnippetContext
LOWcmds/updatemgr/build.sh62# Check if UPX is installed and compress the binaryCOMMENT
LOWspn/tools/container-init.sh10# Check if data dir is mounted.COMMENT
LOWspn/testing/simple/run.sh33# Check if there is an old binary for testing.COMMENT
Hyper-Verbose Identifiers4 hits · 4 pts
SeverityFileLineSnippetContext
LOW…gular/projects/safing/portmaster-api/src/lib/module.ts26export function HttpClientProviderFactory() {CODE
LOWdesktop/angular/src/app/app.module.ts75function loadAndSetLocaleInitializer(configService: ConfigService) {CODE
LOWdesktop/angular/src/app/integration/factory.ts7export function integrationServiceFactory(): IntegrationService {CODE
LOWdesktop/angular/src/app/services/notifications.types.ts138export function getNotificationTypeString(val: NotificationType): string {CODE
Slop Phrases1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMdesktop/tauri/src-tauri/Cargo.toml82# If you use cargo directly instead of tauri's cli you can use this feature flag to switch between tauri's `dev` and `buCOMMENT