AI Slop Code RIsk Monitor

cs341-illinois/coursebook

Open Source Introductory Systems Programming Textbook for the University of Illinois

24.4 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for cs341-illinois/coursebook, a TeX project with 3,817 GitHub stars. SynthScan examined 6,404 lines of code across 47 source files, recording 126 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 24.4 (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.

24.4
Adjusted Signal
24.4
Raw Pattern Score
100%
Time Factor
2026-10-06
Last Push
3.8K
Stars
TeX
Language
6.4K
Lines of Code
47
Files
126
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 61.4/100 · HIGH

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

Hallucinated Dependency & Supply Chain Risk 4.2/100 · LOW

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

Agent Over-Engineering Ratio 61.1/100 · HIGH

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

PR Review Velocity Impact 68.5/100 · HIGH

Which changes need focused human review? 126 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

Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.

No multi-scan history yet — run the scanner again to build trend data.

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 0MEDIUM 11LOW 115

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 126 distinct pattern matches across 8 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 Identifiers78 hits · 92 pts
SeverityFileLineSnippetContext
LOW⚡_scripts/test_verapdf_summary.py70 def test_failing_figure_rule_fails_under_strict(self):CODE
LOW⚡_scripts/test_verapdf_summary.py74 def test_failing_figure_rule_only_reports_without_strict(self):CODE
LOW⚡_scripts/test_verapdf_summary.py80 def test_non_figure_failure_passes_the_figure_gate(self):CODE
LOW⚡_scripts/test_verapdf_summary.py86 def test_unparseable_pdf_fails(self):CODE
LOW⚡_scripts/test_verapdf_summary.py90 def test_unparseable_pdf_fails_even_beside_a_good_one(self):CODE
LOW_scripts/test_verapdf_summary.py109 def test_null_failed_checks_is_tolerated(self):CODE
LOW⚡_scripts/test_pandoc_filters.py99 def test_alt_key_wins_over_caption(self):CODE
LOW⚡_scripts/test_pandoc_filters.py109 def test_caption_used_when_no_alt_key(self):CODE
LOW⚡_scripts/test_pandoc_filters.py119 def test_no_alt_no_caption_raises(self):CODE
LOW⚡_scripts/test_pandoc_filters.py127 def test_whitespace_or_placeholder_alt_raises(self):CODE
LOW⚡_scripts/test_pandoc_filters.py135 def test_placeholder_alt_falls_back_to_caption(self):CODE
LOW⚡_scripts/test_pandoc_filters.py140 def test_latex_escapes_rendered_not_leaked(self):CODE
LOW⚡_scripts/test_pandoc_filters.py153 def test_multiline_alt_collapses_whitespace(self):CODE
LOW⚡_scripts/test_pandoc_filters.py159 def test_epub_eps_becomes_png(self):CODE
LOW⚡_scripts/test_pandoc_filters.py163 def test_wiki_eps_becomes_absolute_png(self):CODE
LOW⚡_scripts/test_pandoc_filters.py200 def test_capital_c_listing_is_c_not_objectivec(self):CODE
LOW⚡_scripts/test_pandoc_filters.py207 def test_wiki_citation_link_keeps_its_text(self):CODE
LOW⚡_scripts/test_pandoc_filters.py216 def test_wiki_ordinary_link_unchanged(self):CODE
LOW⚡_scripts/test_pandoc_filters.py250 def test_filter_failure_fails_pandoc(self):CODE
LOW⚡_scripts/test_pandoc_filters.py257 def test_empty_date_filled_from_metadata_file(self):CODE
LOW⚡_scripts/test_pandoc_filters.py267 def test_missing_date_filled_from_metadata_file(self):CODE
LOW⚡_scripts/test_pandoc_filters.py272 def test_empty_date_removed_when_metadata_file_sets_none(self):CODE
LOW⚡_scripts/test_pandoc_filters.py336 def test_normalize_smart_typography(self):CODE
LOW⚡_scripts/test_pandoc_filters.py340 def test_invalid_latex_alt_raises_cleanly(self):CODE
LOW⚡_scripts/test_pandoc_filters.py350 def test_expected_matches_filter_rendering(self):CODE
LOW_scripts/test_pandoc_filters.py176 def test_figure_becomes_image_and_caption_paragraphs(self):CODE
LOW_scripts/test_pandoc_filters.py185 def test_gfm_output_is_markdown_not_html(self):CODE
LOW_scripts/test_pandoc_filters.py236 def test_epub_filter_html_alt(self):CODE
LOW_scripts/test_pandoc_filters.py300 def test_cover_missing_raises(self):CODE
LOW⚡_scripts/test_alt_lint.py61 def test_nested_braces_in_alt(self):CODE
LOW⚡_scripts/test_alt_lint.py69 def test_commented_out_include_is_skipped(self):CODE
LOW⚡_scripts/test_alt_lint.py78 def test_comment_environment_is_skipped(self):CODE
LOW⚡_scripts/test_alt_lint.py133 def test_generic_alt_word_warns(self):CODE
LOW⚡_scripts/test_alt_lint.py140 def test_unsafe_macro_in_alt_warns(self):CODE
LOW⚡_scripts/test_alt_lint.py147 def test_safe_escapes_do_not_warn(self):CODE
LOW⚡_scripts/test_alt_lint.py155 def test_escapes_that_leak_into_pdf_alt_warn(self):CODE
LOW⚡_scripts/test_alt_lint.py178 def test_escaped_dollar_is_not_math(self):CODE
LOW⚡_scripts/test_alt_lint.py184 def test_allowlisted_title_duck_is_excluded(self):CODE
LOW⚡_scripts/test_alt_lint.py194 def test_non_allowlisted_title_image_still_checked(self):CODE
LOW⚡_scripts/test_alt_lint.py202 def test_book_order_used_when_order_yaml_present(self):CODE
LOW⚡_scripts/test_alt_lint.py209 def test_no_figure_environment_gives_null_caption(self):CODE
LOW⚡_scripts/test_alt_lint.py216 def test_extra_whitespace_around_equals(self):CODE
LOW⚡_scripts/test_alt_lint.py224 def test_duplicate_key_last_one_wins(self):CODE
LOW⚡_scripts/test_alt_lint.py231 def test_starred_includegraphics_is_scanned(self):CODE
LOW⚡_scripts/test_alt_lint.py239 def test_caption_with_short_title_is_found(self):CODE
LOW⚡_scripts/test_alt_lint.py249 def test_caption_with_space_before_brace_is_found(self):CODE
LOW⚡_scripts/test_alt_lint.py259 def test_two_image_caption_pairs_in_one_figure(self):CODE
LOW⚡_scripts/test_alt_lint.py323 def test_missing_path_group_is_reported(self):CODE
LOW⚡_scripts/test_alt_lint.py329 def test_unterminated_path_group_is_reported(self):CODE
LOW⚡_scripts/test_alt_lint.py335 def test_title_macro_hacks_are_not_malformed(self):CODE
LOW⚡_scripts/test_alt_lint.py401 def test_unreachable_figure_is_reported(self):CODE
LOW⚡_scripts/test_alt_lint.py410 def test_figure_reached_through_input_chain_is_reachable(self):CODE
LOW⚡_scripts/test_alt_lint.py418 def test_no_order_yaml_skips_reachability(self):CODE
LOW⚡_scripts/test_alt_lint.py455 def test_fails_on_missing_alt(self):CODE
LOW⚡_scripts/test_alt_lint.py461 def test_fails_on_malformed_include(self):CODE
LOW⚡_scripts/test_alt_lint.py467 def test_fails_on_unreachable_figure(self):CODE
LOW⚡_scripts/test_alt_lint.py475 def test_malformed_include_absent_from_json(self):CODE
LOW_scripts/test_alt_lint.py89 def test_escaped_percent_is_not_a_comment(self):CODE
LOW_scripts/test_alt_lint.py115 def test_whitespace_only_alt_fails(self):CODE
LOW_scripts/test_alt_lint.py122 def test_alt_equal_to_caption_warns(self):CODE
18 more matches not shown…
Decorative Section Separators8 hits · 24 pts
SeverityFileLineSnippetContext
MEDIUM_scripts/alt_lint.py56# ---------------------------------------------------------------------------COMMENT
MEDIUM_scripts/alt_lint.py58# ---------------------------------------------------------------------------COMMENT
MEDIUM_scripts/alt_lint.py113# ---------------------------------------------------------------------------COMMENT
MEDIUM_scripts/alt_lint.py115# ---------------------------------------------------------------------------COMMENT
MEDIUM_scripts/alt_lint.py295# ---------------------------------------------------------------------------COMMENT
MEDIUM_scripts/alt_lint.py297# ---------------------------------------------------------------------------COMMENT
MEDIUM_scripts/alt_lint.py669# ---------------------------------------------------------------------------COMMENT
MEDIUM_scripts/alt_lint.py671# ---------------------------------------------------------------------------COMMENT
Deep Nesting15 hits · 14 pts
SeverityFileLineSnippetContext
LOW_scripts/epub_cover_alt.py57CODE
LOW_scripts/epub_check.py151CODE
LOW_scripts/epub_check.py65CODE
LOW_scripts/check_pdf_tags.py121CODE
LOW_scripts/check_pdf_tags.py155CODE
LOW_scripts/check_pdf_tags.py336CODE
LOW_scripts/test_pandoc_filters.py119CODE
LOW_scripts/test_pandoc_filters.py127CODE
LOW_scripts/alt_check_common.py37CODE
LOW_scripts/compare_pandoc_ast.py90CODE
LOW_scripts/wiki_check.py92CODE
LOW_scripts/alt_lint.py184CODE
LOW_scripts/alt_lint.py231CODE
LOW_scripts/alt_lint.py484CODE
LOW_scripts/alt_lint.py544CODE
Over-Commented Block11 hits · 11 pts
SeverityFileLineSnippetContext
LOW_scripts/install.sh1#!/bin/bashCOMMENT
LOW_scripts/install.sh61 # (texlive/texlive, see .github/workflows/build.yaml), not withCOMMENT
LOW_scripts/compare_pdf_text.sh1#!/bin/bashCOMMENT
LOW_scripts/check_tex_logs.sh1#!/bin/bashCOMMENT
LOW_scripts/site_deploy.sh1#!/bin/bashCOMMENT
LOW_scripts/check_verapdf.sh1#!/bin/bashCOMMENT
LOW_scripts/epub_metadata.yaml1# EPUB accessibility metadata (issue #238, Part A step 6).COMMENT
LOW_scripts/epub_metadata.yaml21# empty date, which it writes as <dc:date></dc:date> and EPUBCheck rejectsCOMMENT
LOW_scripts/epub_metadata.yaml41# content figure now has alt text (alt_lint.py enforces this). But theCOMMENT
LOW_scripts/alt_lint.py61# scanned as such:COMMENT
LOW.github/workflows/deploy.yaml81 # instead, which needs no secret to rotate and survives renames.COMMENT
Unused Imports6 hits · 6 pts
SeverityFileLineSnippetContext
LOW_scripts/pandoc_header_filter.py22CODE
LOW_scripts/test_pandoc_filters.py16CODE
LOW_scripts/pandoc_epub_filter.py19CODE
LOW_scripts/alt_check_common.py14CODE
LOW_scripts/gen_wiki.py9CODE
LOW_scripts/alt_lint.py47CODE
Self-Referential Comments3 hits · 5 pts
SeverityFileLineSnippetContext
MEDIUM_scripts/push_to_wiki.sh8# Create a temp directory, so we don't get raced by the filesystemCOMMENT
MEDIUM_scripts/gen_wiki.py205 # Create a standalone document, all the tex chapters are chaptersSTRING
MEDIUM_scripts/gen_wiki.py226 '-s', # Create a standalone wiki page not a fragmentSTRING
Excessive Try-Catch Wrapping4 hits · 4 pts
SeverityFileLineSnippetContext
LOW_scripts/check_pdf_tags.py75 except Exception: # noqa: BLE001CODE
LOW_scripts/check_pdf_tags.py166 except Exception: # noqa: BLE001CODE
LOW_scripts/check_pdf_tags.py228 except Exception as e: # noqa: BLE001CODE
LOW_scripts/alt_text.py51 except Exception as e: # e.g. unbalanced braces: name the culpritCODE
Modern Structural Boilerplate1 hit · 1 pts
SeverityFileLineSnippetContext
LOW_scripts/alt_check_common.py136__all__ = ['latex_to_text', 'normalize', 'expected_alt', 'png_path',CODE