AI Slop Code RIsk Monitor

FStarLang/FStar

A Proof-oriented Programming Language

6.7 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for FStarLang/FStar, a F* project with 3,113 GitHub stars. SynthScan examined 30,671 lines of code across 239 source files, recording 106 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 6.7 (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.

6.7
Adjusted Signal
6.7
Raw Pattern Score
100%
Time Factor
2026-10-11
Last Push
3.1K
Stars
F*
Language
30.7K
Lines of Code
239
Files
106
Pattern Hits
2026-10-12
Scan Date
0.04
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 11.0/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 7.8/100 · LOW

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

Agent Over-Engineering Ratio 13.4/100 · LOW

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

PR Review Velocity Impact 28.4/100 · MEDIUM

Which changes need focused human review? 106 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 9MEDIUM 27LOW 70

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

Decorative Section Separators20 hits · 60 pts
SeverityFileLineSnippetContext
MEDIUM.scripts/diff_smt2.sh44# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/diff_smt2.sh46# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/diff_smt2.sh62# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/diff_smt2.sh64# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/diff_smt2.sh80# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/diff_smt2.sh82# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/diff_smt2.sh152# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/diff_smt2.sh154# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/diff_smt2.sh209# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/diff_smt2.sh211# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/diff_smt2.sh299# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/diff_smt2.sh301# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/diff_smt2.sh433# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/diff_smt2.sh435# ──────────────────────────────────────────────────COMMENT
MEDIUM.scripts/ramon-report.py30# ── Parsing ──────────────────────────────────────────────────────────────────COMMENT
MEDIUM.scripts/ramon-report.py117# ── Helpers ──────────────────────────────────────────────────────────────────COMMENT
MEDIUM.scripts/ramon-report.py136# ── Statistics ───────────────────────────────────────────────────────────────COMMENT
MEDIUM.scripts/ramon-report.py205# ── Markdown Report ──────────────────────────────────────────────────────────COMMENT
MEDIUM.scripts/ramon-report.py327# ── HTML Report ──────────────────────────────────────────────────────────────COMMENT
MEDIUM.scripts/ramon-report.py620# ── Main ─────────────────────────────────────────────────────────────────────COMMENT
Cross-Language Confusion7 hits · 42 pts
SeverityFileLineSnippetContext
HIGHtests/ide/test-incremental.py247 request = f'{{"query-id":"1", "query": "vfs-add", "args":{{"filename":null, "contents": {json_contents}}}}}\n{{"querCODE
HIGH.scripts/ramon-report.py532const sigMem = memData.filter(d => d.base > 50 || d.patch > 50);CODE
HIGH.scripts/ramon-report.py562const sigTime = timeData.filter(d => d.base > 1 || d.patch > 1);CODE
HIGH.scripts/benchmarking/run_benchmarks.py173 shell_exec('grep BENCHMARK_PRE ulib/gmake/fstar.mk || git apply %s'%args.benchmark_hook_patch)CODE
HIGH⚡src/parser/gen_unicode_tables.py18 if 48 <= c && c <= 57 then c - 48CODE
HIGH⚡src/parser/gen_unicode_tables.py19 else if 97 <= c && c <= 102 then c - 87CODE
HIGH⚡src/parser/gen_unicode_tables.py20 else if 65 <= c && c <= 70 then c - 55CODE
Over-Commented Block33 hits · 33 pts
SeverityFileLineSnippetContext
LOWtests/ide/test-incremental.py241 json_contents = json.dumps(contents)COMMENT
LOWtests/custard/Narrow_stubs.h41#define CUSTARD_FN static __host__ __device__ inlineCOMMENT
LOWtests/custard/checkpartial.py41PKGS = ("batteries,zarith,stdint,yojson,ppxlib,menhirLib,pprint,process,"COMMENT
LOWtests/custard/checkpartial.py101 print("checkpartial: ocamlfind not found; skipping")COMMENT
LOWtests/custard/ExtPtr_stubs.h1#ifndef __EXTPTR_STUBS_HCOMMENT
LOWtests/custard/KrmlExt_stubs.h1/* The target side of KrmlExt.fst: a symbol whose C name is not its F* name. */COMMENT
LOWtests/custard/NarrowOverride_stubs.h21#include <stdbool.h>COMMENT
LOWtests/custard/ExportUser.cpp1// Section 32.4. A consumer Custard did not generate, compiled as C++.COMMENT
LOWtests/custard/KrmlMacro_stubs.h1/* The target side of KrmlMacro.fst: the symbol is a macro, not a function. */COMMENT
LOWtests/custard/ExtFlag_stubs.h1#ifndef __EXTFLAG_STUBS_HCOMMENT
LOWpulse/src/custard-entrypoints.txt1# Compiler entry points the Pulse plugin needs.COMMENT
LOWpulse/src/custard-entrypoints.txt21FStarC.Syntax.Free.ord_univ_uvarCOMMENT
LOWpulse/src/syntax_extension/custard-entrypoints.txt1# Entry points for the syntax_extension unit itself.COMMENT
LOWcontrib/CoreCrypto/ml/openssl_stub.c1/* -------------------------------------------------------------------- */COMMENT
LOWcontrib/CoreCrypto/ml/openssl_stub.c1401COMMENT
LOW.scripts/renamings.sh1#!/bin/bashCOMMENT
LOW.scripts/add_iface_opens.py1#!/usr/bin/env python3COMMENT
LOW.scripts/remove_all_unused_opens.sh1#!/usr/bin/env bashCOMMENT
LOW.scripts/runlim_diff.py1#!/usr/bin/env python3COMMENT
LOW.scripts/run_benchmark.sh1#!/bin/bashCOMMENT
LOW.scripts/diff_smt2.sh1#!/usr/bin/env bashCOMMENT
LOW.scripts/diff_smt2.sh301# ──────────────────────────────────────────────────COMMENT
LOW.scripts/release.sh1#!/usr/bin/env bashCOMMENT
LOW.github/workflows/nightly-build.yml1name: F* nightly buildCOMMENT
LOW.github/workflows/build-windows.yml81 echo FSTAR_VERSION="nightly-$(date -I)" >> $GITHUB_ENVCOMMENT
LOWdoc/book/PoP-in-FStar/book/conf.py1# -*- coding: utf-8 -*-COMMENT
LOWdoc/book/PoP-in-FStar/book/conf.py41COMMENT
LOWdoc/book/PoP-in-FStar/book/conf.py61# source_suffix = ['.rst', '.md']COMMENT
LOWdoc/book/PoP-in-FStar/book/conf.py81COMMENT
LOWdoc/book/PoP-in-FStar/book/conf.py101# Custom sidebar templates, must be a dictionary that maps document namesCOMMENT
LOWdoc/book/PoP-in-FStar/book/conf.py121latex_elements = {COMMENT
LOWsrc/custard/entrypoints.txt1# Entry points for the Custard build of the F* compiler.COMMENT
LOWsrc/custard/entrypoints.txt361# Hand-written registrations in a plugin's .ml.fixup use these two as well:COMMENT
Deep Nesting16 hits · 16 pts
SeverityFileLineSnippetContext
LOWtests/custard/checkgroup.py75CODE
LOWtests/custard/checkrefs.py41CODE
LOWtests/custard/cbor-corpus/model.py4CODE
LOW.scripts/add_iface_opens.py181CODE
LOW.scripts/add_iface_opens.py211CODE
LOW.scripts/query-stats.py50CODE
LOW.scripts/query-stats.py96CODE
LOW.scripts/query-stats.py136CODE
LOW.scripts/query-stats.py202CODE
LOW.scripts/query-stats.py282CODE
LOW.scripts/query-stats.py405CODE
LOW.scripts/ramon-report.py54CODE
LOW.scripts/fstardoc/fstardoc.py39CODE
LOW.scripts/fstardoc/fstardoc.py114CODE
LOW.scripts/fstardoc/fstardoc.py273CODE
LOWexamples/tactics/bench/script.py72CODE
Excessive Try-Catch Wrapping7 hits · 15 pts
SeverityFileLineSnippetContext
LOWtests/ide/cleanup.py40 except Exception as ex:CODE
MEDIUM.scripts/query-stats.py420 print("Error: %s\n" % str(err))CODE
MEDIUM.scripts/query-stats.py430 print("Error: file '%s' does not exists." % a)CODE
MEDIUM⚡.scripts/query-stats.py450 print("Error: -n/-t/--top must be >= 0.")CODE
MEDIUM⚡.scripts/query-stats.py460 print("Error: filter not in s=v format.")CODE
MEDIUM⚡.scripts/query-stats.py469 print("Error: unsupported output format '%s'" % a)CODE
LOW.scripts/ramon-report.py68 except Exception as e:CODE
Empty Error Handlers2 hits · 10 pts
SeverityFileLineSnippetContext
HIGH.scripts/simpl_graph.py48except AttributeError:CODE
HIGH.scripts/ramon-report.py82except FileNotFoundError:CODE
AI Slop Vocabulary4 hits · 8 pts
SeverityFileLineSnippetContext
LOWstage0/.scripts/mk-package.sh5# This will just create a tar.gz or zip out of a directory.COMMENT
MEDIUM.scripts/src-install.sh24# before it tries to copy it. This seems robust.COMMENT
LOW.scripts/mk-package.sh5# This will just create a tar.gz or zip out of a directory.COMMENT
LOW.github/workflows/nightly-schedule.yml4# nightly build. To add a new branch, just add it to the matrix below.COMMENT
Unused Imports7 hits · 7 pts
SeverityFileLineSnippetContext
LOWtests/ide/test-incremental.py3CODE
LOWtests/ide/emacs/fuzz.py28CODE
LOWtests/custard/cbor-corpus/mutants.py1CODE
LOW.scripts/ramon-report.py27CODE
LOW.scripts/runlim_diff_old.py7CODE
LOWdoc/book/PoP-in-FStar/book/smt2_pygments.py2CODE
LOWdoc/book/PoP-in-FStar/book/fstar_pygments.py2CODE
Slop Phrases2 hits · 4 pts
SeverityFileLineSnippetContext
LOW.scripts/remove_all_unused_opens.sh13# Please do NOT trust this script and make sure to save your stateCOMMENT
MEDIUM.scripts/run_benchmark.sh16# (you can use other commands, but they should support a `-o FILE`COMMENT
Redundant / Tautological Comments3 hits · 4 pts
SeverityFileLineSnippetContext
LOW.scripts/diff_smt2.sh356 # Check if difference is only in metadata (comment lines)COMMENT
LOW.scripts/create_tag.sh21# Check if the user has provided a GitHub authentication tokenCOMMENT
LOW.scripts/create_tag.sh63# Check if the commit pointed to by that tag (if any) points to the current commitCOMMENT
Example Usage Blocks2 hits · 3 pts
SeverityFileLineSnippetContext
LOW.scripts/add_iface_opens.py19# Usage:COMMENT
LOW.scripts/diff_smt2.sh13# Usage:COMMENT
Hyper-Verbose Identifiers3 hits · 3 pts
SeverityFileLineSnippetContext
LOW.scripts/benchmarking/fstar_slack_post.py155def create_slack_text_message(s):CODE
LOW.scripts/benchmarking/fstar_slack_post.py160def create_slack_attachment_message(fallback, color, text, footer):CODE
LOW.scripts/benchmarking/run_benchmarks.py87def parse_and_format_results_for_upload(fname, bench_name_prefix=''):CODE