AI Slop Code Risk Monitor

EasyTier/EasyTier

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

A simple, decentralized mesh VPN with WireGuard support.

1.3 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for EasyTier/EasyTier, a Rust project with 14,477 GitHub stars. SynthScan examined 329,729 lines of code across 1053 source files, recording 137 pattern matches distributed across 7 syntactic categories. The legacy adjusted pattern signal is 1.3 (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.

1.3
Adjusted Signal
1.3
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
14.5K
Stars
Rust
Language
329.7K
Lines of Code
1.1K
Files
137
Pattern Hits
2026-10-31
Scan Date
0.02
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 1.9/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 4.5/100 · LOW

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

Agent Over-Engineering Ratio 0.3/100 · LOW

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

PR Review Velocity Impact 5.5/100 · LOW

Which changes need focused human review? 137 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 26HIGH 0MEDIUM 1LOW 110

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 137 distinct pattern matches across 7 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.

Hallucination Indicators26 hits · 305 pts
SeverityFileLineSnippetContext
CRITICALeasytier/src/tests/ipv6_test.rs37 let ipv6 = config.snapshot.runtime.core.routes.ipv6.unwrap();CODE
CRITICALeasytier/src/common/global_ctx.rs178 .and_then(|runtime| runtime.peer.runtime.core.node.hostname.clone())CODE
CRITICALeasytier/src/common/global_ctx.rs217 let prefix = peer.runtime.core.routes.ipv4.as_ref()?;CODE
CRITICALeasytier/src/common/global_ctx.rs225 let prefix = peer.runtime.core.routes.ipv6.as_ref()?;CODE
CRITICALeasytier/src/arch/windows.rs578 interface.Anonymous.Anonymous.Anonymous.bstrVal.to_string(),CODE
CRITICAL⚡easytier/src/instance/config.rs171 initial.peer.snapshot.runtime.core.node.hostname.as_deref(),CODE
CRITICAL⚡easytier/src/instance/config.rs175 cleared.peer.snapshot.runtime.core.node.hostname.as_deref(),CODE
CRITICAL⚡easytier/src/instance/config.rs179 cleared.peer.snapshot.runtime.core.node.hostname.as_deref(),CODE
CRITICALeasytier/src/instance/config.rs192 config.peer.snapshot.runtime.core.node.hostname.as_deref(),CODE
CRITICALeasytier/src/instance/composition.rs488 config_a.connectivity.direct.tcp_bind.context.clone(),CODE
CRITICALeasytier-core/src/connectivity/direct/mod.rs253 self.data.options.udp_bind.context.clone(),CODE
CRITICALeasytier-core/src/connectivity/direct/mod.rs278 self.data.options.udp_bind.context.clone(),CODE
CRITICALeasytier-core/src/config/runtime.rs193 before.peer.runtime.core.node.hostname.as_deref(),CODE
CRITICALeasytier-core/src/config/runtime.rs199 after.peer.runtime.core.node.hostname.as_deref(),CODE
CRITICALeasytier-core/src/config/runtime.rs268 snapshot.peer.runtime.core.node.hostname.as_deref(),CODE
CRITICALeasytier-core/src/instance/tests.rs2831 final_config.peer.runtime.core.node.hostname.as_deref(),CODE
CRITICALeasytier-core/src/instance/lifecycle.rs87 let has_proxy_networks = !config.peer.runtime.core.routes.proxy_networks.is_empty();CODE
CRITICAL⚡easytier-core/src/peers/attached.rs413 snapshot.runtime.core.routes.advertised_routes.clear();CODE
CRITICAL⚡easytier-core/src/peers/attached.rs414 snapshot.runtime.core.routes.proxy_networks.clear();CODE
CRITICAL⚡easytier-core/src/peers/attached.rs415 snapshot.runtime.core.routes.foreign_networks.clear();CODE
CRITICALeasytier-core/src/peers/peer_manager.rs285 next_peer.runtime.core.routes.ipv4 = current.peer.runtime.core.routes.ipv4.clone();CODE
CRITICALeasytier-core/src/peers/peer_manager.rs288 next_peer.runtime.core.routes.ipv6 = current.peer.runtime.core.routes.ipv6.clone();CODE
CRITICALeasytier-core/src/gateway/dhcp.rs1123 assert!(runtime.snapshot().peer.runtime.core.routes.ipv4.is_some());CODE
CRITICAL⚡easytier-core/src/gateway/dhcp.rs1157 assert!(runtime.snapshot().peer.runtime.core.routes.ipv6.is_none());CODE
CRITICAL⚡easytier-core/src/gateway/dhcp.rs1161 assert!(runtime.snapshot().peer.runtime.core.routes.ipv4.is_some());CODE
CRITICAL⚡easytier-core/src/gateway/dhcp.rs1162 assert!(runtime.snapshot().peer.runtime.core.routes.ipv6.is_some());CODE
Over-Commented Block73 hits · 73 pts
SeverityFileLineSnippetContext
LOWeasytier/src/easytier-cli.rs321COMMENT
LOWeasytier/src/tests/credential_tests.rs541/// Regression coverage for a public-server-mediated credential topology:COMMENT
LOWeasytier/src/tests/credential_tests.rs1481 "10.144.144.3",COMMENT
LOWeasytier/src/tunnel/quic.rs341 // as happens when reordering exceeds the RFC 9000 Appendix ACOMMENT
LOWeasytier/src/tunnel/common.rs181}COMMENT
LOWeasytier/src/tunnel/common.rs201/// * **(default) `BindDev::Auto`**: Enables **auto-discovery**. The function will attempt to automaticallyCOMMENT
LOWeasytier/src/common/config.rs221 ///COMMENT
LOWeasytier/src/common/env_parser.rs1//! 环境变量解析模块COMMENT
LOWeasytier/src/common/ifcfg/route.rs41 #[cfg(target_os = "windows")]COMMENT
LOWeasytier/src/instance/virtual_nic.rs1981 }COMMENT
LOWeasytier/src/socket/fake_tcp/stack.rs1//! A minimum, userspace TCP based datagram stackCOMMENT
LOWeasytier/src/socket/fake_tcp/stack.rs21//!COMMENT
LOW…ytier-contrib/easytier-android-jni/example_config.toml1# EasyTier Android JNI 示例配置文件COMMENT
LOW…ytier-contrib/easytier-android-jni/example_config.toml21COMMENT
LOW…ytier-contrib/easytier-android-jni/example_config.toml41# enable_ipv6 = falseCOMMENT
LOWeasytier-contrib/easytier-android-jni/src/lib.rs1//! JNI facade for Android callers of EasyTier.COMMENT
LOWeasytier-contrib/easytier-android-jni/src/lib.rs61/// `EasyTierJNI.parseConfig(config: String): Int`COMMENT
LOWeasytier-contrib/easytier-android-jni/src/lib.rs81/// On failure this returns `-1` and throws `RuntimeException`.COMMENT
LOWeasytier-contrib/easytier-android-jni/src/lib.rs201 env: JNIEnv,COMMENT
LOWeasytier-contrib/easytier-android-jni/src/lib.rs241///COMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs1//! C ABI facade for EasyTier.COMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs21//!COMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs61/// `cfg_str` must be a non-null pointer to a null-terminated UTF-8 string.COMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs81/// Returns `0` after the instance is started and registered in the FFI nameCOMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs101///COMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs121///COMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs141/// key/value strings are allocated by this library and must be released withCOMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs161/// instance name and each returned value is a JSON string containing thatCOMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs181COMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs201/// This generic bridge intentionally excludes instance lifecycle managementCOMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs241}COMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs281 user_data,COMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs321 data_plane_tcp_read_result_take, data_plane_tcp_read_submit, data_plane_tcp_write_result_take,COMMENT
LOWeasytier-contrib/easytier-ffi/src/lib.rs341///COMMENT
LOWeasytier-contrib/easytier-ios/build-xcframework.sh1#!/usr/bin/env bashCOMMENT
LOWeasytier-contrib/easytier-ios/src/lib.rs1//! iOS-facing C ABI for EasyTier.COMMENT
LOWeasytier-contrib/easytier-ios/src/lib.rs81/// Configure persistent EasyTier diagnostic logging for the embedding app.COMMENT
LOWeasytier-contrib/easytier-ios/src/lib.rs381/// generic management registry). `payload_json` must contain the protobufCOMMENT
LOWeasytier-gui/src-tauri/src/elevate/macos.rs181impl Command {COMMENT
LOWeasytier-gui/src-tauri/src/elevate/macos.rs201 (0, 0) => true,COMMENT
LOWeasytier-gui/src-tauri/src/elevate/mod.rs21 /// instance, it would read the following configuration fromCOMMENT
LOWeasytier-gui/src-tauri/src/elevate/windows.rs21 /// Check the state the current program runningCOMMENT
LOWeasytier-gui/src-tauri/src/elevate/windows.rs61 /// Prompting the user with a graphical OS dialog for the root password,COMMENT
LOWeasytier-web/src/restful/captcha/mod.rs1//! Rust图形验证码,由Java同名开源库[whvcse/EasyCaptcha](https://github.com/ele-admin/EasyCaptcha)移植而来👏,100%纯Rust实现,支持gif、算术等类型。COMMENT
LOWeasytier-web/src/restful/captcha/mod.rs21//! dependencies into you system.COMMENT
LOWeasytier-web/src/restful/captcha/mod.rs41//! /// 接口:获取验证码COMMENT
LOWeasytier-web/src/restful/captcha/mod.rs61//! CaptchaUtil::clear(&session).await; // 如果愿意的话,你可以从Session中清理掉验证码 You may clear the Captcha from the SesCOMMENT
LOWeasytier-web/src/restful/captcha/mod.rs81//!COMMENT
LOWeasytier-web/src/restful/captcha/mod.rs101//!COMMENT
LOWeasytier-web/src/restful/captcha/mod.rs121pub mod extension;COMMENT
LOWeasytier-web/src/restful/captcha/utils/font.rs1use ab_glyph::FontArc;COMMENT
LOWeasytier-web/src/restful/captcha/base/captcha.rs181 /// Initialize the Captcha with the size of output image and the character length of the Captcha.COMMENT
LOWeasytier-web/src/restful/captcha/base/captcha.rs281 fn out(&mut self, out: impl Write) -> Result<(), Self::Error>;COMMENT
LOWeasytier-web/src/central_network/compiler.rs61 #[error("virtual subnet has no free host address for member {0}")]COMMENT
LOWeasytier-core/src/host/mod.rs1//! Host capability seams.COMMENT
LOWeasytier-core/src/host/environment.rs1//! Host-operation bridge for connector environment queries.COMMENT
LOWeasytier-core/src/host/socket/mod.rs1//! Host-backed socket seams.COMMENT
LOWeasytier-core/src/connectivity/connector_host.rs1//! Host-operation Adapter for the shared connector composition.COMMENT
LOWeasytier-core/src/config/toml.rs361fn default_true() -> bool {COMMENT
LOWeasytier-core/src/management/full/config_patch.rs181 // the durable write is in flight, without holding a synchronousCOMMENT
13 more matches not shown…
Structural Annotation Overuse13 hits · 21 pts
SeverityFileLineSnippetContext
LOWeasytier/docs/credential_peer.md44### Step 1: Protobuf 定义COMMENT
LOWeasytier/docs/credential_peer.md108### Step 2: 凭据管理模块COMMENT
LOWeasytier/docs/credential_peer.md160### Step 3: Noise 握手适配(最小改动)COMMENT
LOWeasytier/docs/credential_peer.md185### Step 4: RoutePeerInfo 传播凭据信息COMMENT
LOWeasytier/docs/credential_peer.md195### Step 5: 全网校验与自动踢出(核心逻辑)COMMENT
LOWeasytier/docs/credential_peer.md246### Step 6: GlobalCtx / Config 集成COMMENT
LOWeasytier/docs/credential_peer.md269### Step 7: RPC 服务 + CLICOMMENT
LOWeasytier/docs/credential_peer.md295### Step 8: 连接时验证(握手后快速拒绝,必选)COMMENT
LOWeasytier/docs/credential_peer.md371### Step 9: 临时节点 OSPF 路由限制COMMENT
LOWeasytier/docs/credential_peer.md535### Step 10: 禁止通过临时节点接入网络COMMENT
LOW⚡easytier-core/src/peers/route/peer_ospf_route.rs399 // Step 1: first Dijkstra, compute shortest hop count.COMMENT
LOW⚡easytier-core/src/peers/route/peer_ospf_route.rs402 // Step 2: build subgraph containing only shortest-hop and AVOID RELAY edges.COMMENT
LOWeasytier-core/src/peers/route/peer_ospf_route.rs425 // Step 3: second Dijkstra on subgraph, choose least-cost among shortest-hop paths.COMMENT
Hyper-Verbose Identifiers19 hits · 21 pts
SeverityFileLineSnippetContext
LOW⚡easytier-gui/src/composables/config.ts10export function saveLastNetworkInstanceId(instanceId: string) {CODE
LOW⚡easytier-gui/src/composables/config.ts18export function loadLastNetworkInstanceId(): string | null {CODE
LOW⚡easytier-gui/src/composables/config.ts22export function saveVpnTileStoppedInstanceIds(instanceIds: string[]) {CODE
LOW⚡easytier-gui/src/composables/config.ts26export function loadVpnTileStoppedInstanceIds(): string[] {CODE
LOWeasytier-gui/src/composables/event.ts35function normalizeInstanceIdPayload(payload: unknown): string {CODE
LOWeasytier-gui/src/composables/event.ts81async function onVpnServiceConfigChanged(event: Event<unknown>) {CODE
LOWeasytier-gui/src/composables/mobile_vpn.ts55export function setMobileVpnTileActionHandler(CODE
LOWeasytier-gui/src/composables/mobile_vpn.ts61export async function consumePendingMobileVpnTileAction() {CODE
LOWeasytier-gui/src/composables/mobile_vpn.ts299async function registerVpnServiceListener() {CODE
LOWeasytier-gui/src/pages/index.vue272async function handleMobileVpnTileAction(action: 'start' | 'stop') {CODE
LOWeasytier-web/frontend-lib/tests/status-display.spec.ts18function peerRoutePairWithDefaultConn(conns: any[], defaultConnId: string) {CODE
LOW…eb/frontend-lib/tests/remote-management-config.spec.ts150function snapshotBooleanConfigFields(config: NetworkConfig): Record<string, unknown> {CODE
LOWeasytier-web/frontend-lib/src/types/networkCompat.ts12export function prepareNetworkConfigForProtoJson(config: NetworkConfig): NetworkConfig {CODE
LOWeasytier-web/frontend-lib/src/types/networkCompat.ts45function dropUnsupportedJsonValues(value: unknown): unknown {CODE
LOWeasytier-web/frontend-lib/src/components/Config.vue109function searchExitNodesSuggestions(e: { query: string }) {CODE
LOWeasytier-web/frontend-lib/src/components/Config.vue117function searchWhitelistSuggestions(e: { query: string }) {CODE
LOWeasytier-web/frontend-lib/src/components/Config.vue212function parseInstanceRecvBpsLimitInput(value: string): number | string | null | undefined {CODE
LOWeasytier-web/frontend-lib/src/modules/vpnPortal.ts38export function normalizeVpnPortalEndpoint(value: string, port: string): string {CODE
LOWeasytier-js/browser/src/create.ts20export async function createEasyTierWithArtifact(CODE
Verbosity Indicators3 hits · 6 pts
SeverityFileLineSnippetContext
LOW⚡easytier-core/src/peers/route/peer_ospf_route.rs399 // Step 1: first Dijkstra, compute shortest hop count.COMMENT
LOW⚡easytier-core/src/peers/route/peer_ospf_route.rs402 // Step 2: build subgraph containing only shortest-hop and AVOID RELAY edges.COMMENT
LOWeasytier-core/src/peers/route/peer_ospf_route.rs425 // Step 3: second Dijkstra on subgraph, choose least-cost among shortest-hop paths.COMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMeasytier/src/socket/fake_tcp/stack.rs456 /// of reader will be spawned later. This allows user to utilize the performanceCOMMENT
Fake / Example Data2 hits · 2 pts
SeverityFileLineSnippetContext
LOWeasytier-web/frontend-lib/src/components/UrlInput.vue209 <Dialog v-model:visible="editing" modal :header="placeholder" :style="{ width: '90vw', maxWidth: '500px' }">CODE
LOW…ytier-web/frontend-lib/src/components/UrlListInput.vue26 <UrlInput v-model="list[index]" :protos="protos" :placeholder="placeholder">CODE