AI Slop Code RIsk Monitor

virgiliojr94/book-to-skill

Turn any technical book PDF into a Claude Code skill — ready to study, reference, and use while you work.

47.0 High pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for virgiliojr94/book-to-skill, a Python project with 34,469 GitHub stars. SynthScan examined 18,140 lines of code across 108 source files, recording 704 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 47.0 (High 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.

47.0
Adjusted Signal
47.0
Raw Pattern Score
100%
Time Factor
2026-10-05
Last Push
34.5K
Stars
Python
Language
18.1K
Lines of Code
108
Files
704
Pattern Hits
2026-10-12
Scan Date
0.07
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 83.7/100 · CRITICAL

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

Hallucinated Dependency & Supply Chain Risk 5.4/100 · LOW

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

Agent Over-Engineering Ratio 88.2/100 · CRITICAL

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

PR Review Velocity Impact 89.7/100 · CRITICAL

Which changes need focused human review? 704 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 8MEDIUM 41LOW 655

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

Hyper-Verbose Identifiers571 hits · 599 pts
SeverityFileLineSnippetContext
LOWtools/scan_generated_skill.py130def _frontmatter_line_numbers(lines: Sequence[str]) -> set[int]:CODE
LOWbook_to_skill/config.py60def supported_formats_message() -> str:CODE
LOWbook_to_skill/pdf_inspector_integration.py193def install_pdf_inspector_hook(utils_module: Any | None = None) -> None:CODE
LOWbook_to_skill/pdf_inspector_integration.py236def enrich_pdf_inspector_metadata(metadata_path: str | Path | None = None) -> None:CODE
LOWbook_to_skill/utils.py486def _closed_fence_line_numbers(lines: list[str]) -> set[int]:CODE
LOWbook_to_skill/utils.py527def _numbered_titles_are_structural(CODE
LOWbook_to_skill/utils.py549def _structural_chapter_headings(text: str) -> list[str]:CODE
LOWbook_to_skill/utils.py640def _structural_chapter_count(text: str) -> int:CODE
LOWbook_to_skill/parsers/docx.py8def extract_docx_with_python_docx(docx_path: str) -> str | None:CODE
LOWbook_to_skill/parsers/docx.py52def extract_docx_with_zipfile(docx_path: str) -> str | None:CODE
LOWbook_to_skill/parsers/calibre.py14def extract_with_ebook_convert(input_path: str) -> str | None:CODE
LOWbook_to_skill/parsers/rtf.py66def _strip_destination_groups(raw: str) -> str:CODE
LOWtests/test_opencode_host_support.py146def test_opencode_is_named_as_supported_host():CODE
LOWtests/test_opencode_host_support.py154def test_opencode_extractor_probe_discovers_supported_layouts(tmp_path, layout):CODE
LOWtests/test_opencode_host_support.py178def test_opencode_project_probe_resolves_project_root_from_nested_cwd(CODE
LOWtests/test_opencode_host_support.py203def test_opencode_project_extractor_is_discoverable(tmp_path, project_skill_dir):CODE
LOWtests/test_opencode_host_support.py216def test_opencode_personal_root_is_reachable_beside_compatibility_roots(tmp_path):CODE
LOWtests/test_opencode_host_support.py239def test_opencode_does_not_execute_hermes_only_project_layout(tmp_path):CODE
LOWtests/test_opencode_host_support.py256def test_opencode_ignores_foreign_project_roots(tmp_path):CODE
LOWtests/test_opencode_host_support.py271def test_opencode_destination_and_project_roots_are_documented():CODE
LOWtests/test_opencode_host_support.py277def test_opencode_is_in_unknown_host_prompt_and_reload_guidance():CODE
LOW⚡tests/test_pdftotext_edge_only_boilerplate.py41 def test_mid_page_heading_survives(self):CODE
LOW⚡tests/test_pdftotext_edge_only_boilerplate.py46 def test_surrounding_body_text_intact(self):CODE
LOW⚡tests/test_pdftotext_edge_only_boilerplate.py52 def test_running_headers_are_still_removed(self):CODE
LOW⚡tests/test_pdftotext_edge_only_boilerplate.py59 def test_page_numbers_are_still_removed(self):CODE
LOW⚡tests/test_pdftotext_edge_only_boilerplate.py64 def test_plain_running_header_still_stripped(self):CODE
LOWtests/test_pdftotext_edge_only_boilerplate.py76 def test_footer_boilerplate_still_stripped(self):CODE
LOWtests/test_pdftotext_edge_only_boilerplate.py89 def test_part_divider_page_is_not_stripped(self):CODE
LOWtests/test_pdftotext_edge_only_boilerplate.py106 def test_genuinely_repeated_single_line_page_still_stripped(self):CODE
LOW⚡tests/test_pdftotext_edge_only_boilerplate.py119 def test_hyphenated_wrap_still_rejoined(self):CODE
LOW⚡tests/test_pdftotext_edge_only_boilerplate.py122 def test_short_document_keeps_content_and_drops_form_feeds(self):CODE
LOW⚡tests/test_pdftotext_edge_only_boilerplate.py128 def test_mid_page_bare_number_is_kept(self):CODE
LOW⚡tests/test_pdftotext_edge_only_boilerplate.py138 def test_one_word_lines_still_survive(self):CODE
LOWtests/test_pdftotext_edge_only_boilerplate.py150 def test_roman_front_matter_numbers_still_stripped(self):CODE
LOWtests/test_fingerprint.py22def test_same_size_different_content_gives_different_fingerprint(tmp_path):CODE
LOWtests/test_fingerprint.py120def test_scenario_reuse_same_content(tmp_path):CODE
LOWtests/test_fingerprint.py127def test_scenario_changed_content_same_size_falls_back(tmp_path):CODE
LOWtests/test_fingerprint.py139def test_scenario_missing_workdir_falls_back(tmp_path):CODE
LOWtests/test_fingerprint.py149def test_scenario_mode_mismatch_falls_back(tmp_path):CODE
LOWtests/test_fingerprint.py169def test_scenario_sources_changed_falls_back(tmp_path):CODE
LOW⚡tests/test_structural_framing_sections.py38def test_framing_sections_are_excluded_and_structural_sample_is_populated():CODE
LOW⚡tests/test_structural_framing_sections.py48def test_twenty_chapters_are_not_inflated_by_framing_sections():CODE
LOW⚡tests/test_structural_framing_sections.py57def test_whole_title_and_word_boundary_guards_keep_instructional_titles():CODE
LOWtests/test_structural_framing_sections.py77def test_bare_appendix_and_labelled_part_are_not_chapters():CODE
LOWtests/test_structural_framing_sections.py97def test_setext_framing_sections_are_filtered_too():STRING
LOW⚡tests/test_discovery_tax.py44 def test_detects_three_chapters(self):STRING
LOW⚡tests/test_discovery_tax.py50 def test_best_chapter_picks_largest_body_over_toc_line(self):STRING
LOW⚡tests/test_discovery_tax.py58 def test_cross_reference_does_not_split(self):STRING
LOW⚡tests/test_discovery_tax.py64 def test_chapter_with_title_splits(self):STRING
LOW⚡tests/test_discovery_tax.py69 def test_repeated_cross_ref_does_not_refragment(self):STRING
LOWtests/test_discovery_tax.py125def test_extract_toc_detects_non_english_toc():CODE
LOWtests/test_openclaw_host_support.py66def test_openclaw_extractor_probe_discovers_supported_layouts(tmp_path, layout):CODE
LOWtests/test_openclaw_host_support.py102def test_openclaw_host_layouts_are_documented():CODE
LOW⚡tests/test_rtf_destination_groups.py57 def test_chapter_heading_is_on_its_own_line(self):CODE
LOW⚡tests/test_rtf_destination_groups.py62 def test_info_metadata_not_exposed(self):CODE
LOW⚡tests/test_rtf_destination_groups.py68 def test_pict_binary_payload_dropped(self):CODE
LOW⚡tests/test_rtf_destination_groups.py75 def test_nested_group_inside_skipped_group(self):CODE
LOW⚡tests/test_rtf_destination_groups.py83 def test_content_group_after_skipped_group_is_kept(self):CODE
LOWtests/test_rtf_destination_groups.py94 def test_unknown_star_destination_skipped(self):CODE
LOWtests/test_rtf_destination_groups.py100 def test_field_keeps_result_drops_instruction(self):CODE
511 more matches not shown…
Decorative Section Separators33 hits · 106 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_fingerprint.py99# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/test_fingerprint.py101# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_book_to_skill.py219# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py221# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py278# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py280# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py419# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py421# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py488# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py490# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py630 # ── Hindi (Devanagari) chapter headings ────────────────────────────────COMMENT
MEDIUM⚡tests/test_book_to_skill.py848 # ── Korean chapter headings ────────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_book_to_skill.py893 # ── Persian chapter headings ───────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_book_to_skill.py1205 # ── Chinese (CJK) chapter headings ──────────────────────────────────────COMMENT
MEDIUM⚡tests/test_book_to_skill.py1781# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_book_to_skill.py1783# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_book_to_skill.py2308# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py2310# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py2359# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py2361# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py2428# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py2430# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUMtests/test_book_to_skill.py20# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/test_book_to_skill.py22# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/test_book_to_skill.py44# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUMtests/test_book_to_skill.py46# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUMtests/test_book_to_skill.py539# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUMtests/test_book_to_skill.py541# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUMtests/test_book_to_skill.py1295 # ── Kangxi-radical numerals (U+2F00 block) ──────────────────────────────COMMENT
MEDIUMtests/test_book_to_skill.py2391# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUMtests/test_book_to_skill.py2393# ═══════════════════════════════════════════════════════════════════════════COMMENT
MEDIUM⚡tests/test_book_to_skill.py174# ═══════════════════════════════════════════════════════════════════════════STRING
MEDIUM⚡tests/test_book_to_skill.py176# ═══════════════════════════════════════════════════════════════════════════STRING
Empty Error Handlers8 hits · 40 pts
SeverityFileLineSnippetContext
HIGHtools/validate_skill.py49except (AttributeError, ValueError):CODE
HIGHbook_to_skill/cli.py22except (AttributeError, ValueError):CODE
HIGHbook_to_skill/parsers/pdf.py195except Exception:CODE
HIGHbook_to_skill/parsers/pdf.py207except Exception:CODE
HIGHbook_to_skill/parsers/pdf.py186except Exception:CODE
HIGHbook_to_skill/parsers/rtf.py169except ImportError:CODE
HIGHbook_to_skill/parsers/epub.py71except (KeyError, Exception):CODE
HIGHscripts/extract.py24except (AttributeError, ValueError):CODE
Excessive Try-Catch Wrapping26 hits · 28 pts
SeverityFileLineSnippetContext
LOWtools/discovery_tax.py65 except Exception:CODE
LOWtools/discovery_tax.py73 except Exception:CODE
MEDIUMtools/discovery_tax.py69def token_method() -> str:CODE
LOWbook_to_skill/pdf_inspector_integration.py98 except Exception as exc:CODE
MEDIUMbook_to_skill/pdf_inspector_integration.py31def _package_version() -> str | None:CODE
LOWbook_to_skill/dependencies.py129 except Exception as exc:CODE
LOWbook_to_skill/parsers/docx.py47 except Exception as e:CODE
LOWbook_to_skill/parsers/docx.py107 except Exception as e:CODE
LOWbook_to_skill/parsers/docx.py132 except Exception as e:CODE
LOWbook_to_skill/parsers/calibre.py52 except Exception as e:CODE
LOWbook_to_skill/parsers/html.py112 except Exception:CODE
LOWbook_to_skill/parsers/pdf.py88 except Exception as e:CODE
LOWbook_to_skill/parsers/pdf.py108 except Exception:CODE
LOWbook_to_skill/parsers/pdf.py121 except Exception:CODE
LOWbook_to_skill/parsers/pdf.py128 except Exception as e:CODE
LOWbook_to_skill/parsers/pdf.py140 except Exception as e:CODE
LOWbook_to_skill/parsers/pdf.py166 except Exception as e:CODE
LOWbook_to_skill/parsers/pdf.py186 except Exception:CODE
LOWbook_to_skill/parsers/pdf.py195 except Exception:CODE
LOWbook_to_skill/parsers/pdf.py207 except Exception:CODE
LOWbook_to_skill/parsers/rtf.py171 except Exception as e:CODE
LOWbook_to_skill/parsers/text.py19 except Exception as e:CODE
LOWbook_to_skill/parsers/epub.py54 except Exception as e:CODE
LOWbook_to_skill/parsers/epub.py151 except Exception:CODE
LOWbook_to_skill/parsers/epub.py154 except Exception as e:CODE
LOWbook_to_skill/parsers/epub.py168 except Exception:CODE
Unused Imports20 hits · 20 pts
SeverityFileLineSnippetContext
LOWtools/scan_generated_skill.py4CODE
LOWtools/discovery_tax.py31CODE
LOWtools/evals/paper_flat.py6CODE
LOWtools/evals/manifest.py6CODE
LOWtools/evals/replay.py3CODE
LOWtools/evals/score.py3CODE
LOWbook_to_skill/pdf_inspector_integration.py1CODE
LOWbook_to_skill/__init__.py1CODE
LOWbook_to_skill/__init__.py1CODE
LOWbook_to_skill/__init__.py1CODE
LOWbook_to_skill/__init__.py2CODE
LOWbook_to_skill/utils.py1CODE
LOWbook_to_skill/sanitize.py1CODE
LOWbook_to_skill/dependencies.py1CODE
LOWbook_to_skill/parsers/docx.py1CODE
LOWbook_to_skill/parsers/calibre.py1CODE
LOWbook_to_skill/parsers/html.py1CODE
LOWbook_to_skill/parsers/pdf.py1CODE
LOWbook_to_skill/parsers/text.py1CODE
LOWbook_to_skill/parsers/epub.py1CODE
Deep Nesting19 hits · 19 pts
SeverityFileLineSnippetContext
LOWtools/validate_skill.py168CODE
LOWtools/validate_skill.py193CODE
LOWtools/evals/score.py25CODE
LOWbook_to_skill/utils.py549CODE
LOWbook_to_skill/utils.py930CODE
LOWbook_to_skill/utils.py966CODE
LOWbook_to_skill/utils.py1096CODE
LOWbook_to_skill/dependencies.py267CODE
LOWbook_to_skill/parsers/docx.py8CODE
LOWbook_to_skill/parsers/docx.py52CODE
LOWbook_to_skill/parsers/docx.py112CODE
LOWbook_to_skill/parsers/docx.py66CODE
LOWbook_to_skill/parsers/docx.py78CODE
LOWbook_to_skill/parsers/calibre.py14CODE
LOWbook_to_skill/parsers/pdf.py30CODE
LOWbook_to_skill/parsers/pdf.py112CODE
LOWbook_to_skill/parsers/pdf.py171CODE
LOWbook_to_skill/parsers/rtf.py66CODE
LOWbook_to_skill/parsers/epub.py90CODE
Over-Commented Block18 hits · 18 pts
SeverityFileLineSnippetContext
LOWcliff.toml1# git-cliff configuration — generates CHANGELOG.md from Conventional CommitCOMMENT
LOWbook_to_skill/utils.py61# CJK codepoints: ideographs + extensions, kana, hangul, CJK punctuation, andCOMMENT
LOWbook_to_skill/utils.py101 latin_words = len(_CJK_RE.sub(" ", text).split())COMMENT
LOWbook_to_skill/utils.py121# indicated by the `&` symbol…", "Chapter 17.) We have seen…" — is prose wrappedCOMMENT
LOWbook_to_skill/utils.py141# a markdown heading ("## i. introduction") to avoid false positives fromCOMMENT
LOWbook_to_skill/utils.py221# ଅଧ୍ୟାୟ ("chapter") + a number. Grouped next to Bengali because both areCOMMENT
LOWbook_to_skill/utils.py281# Gujarati chapter headings: "પ્રકરણ 1", "અધ્યાય ૧", "## પ્રકરણ 2".COMMENT
LOWbook_to_skill/utils.py301# there. Requiring whitespace then a number keeps prose that merely uses anCOMMENT
LOWbook_to_skill/utils.py321# The trailing group is the Korean analogue of _HEADING_TAIL: Korean has no letterCOMMENT
LOWbook_to_skill/utils.py721 # ebooks that encode chapter numbers in the U+2F00 block are detected.COMMENT
LOWbook_to_skill/sanitize.py21 0x2064, # INVISIBLE PLUSCOMMENT
LOWbook_to_skill/sanitize.py81# U+180E just above is the same Mongolian block, which is what makes the freeCOMMENT
LOWbook_to_skill/sanitize.py121_TAG_BLOCK_END = 0xE007FCOMMENT
LOWbook_to_skill/parsers/docx.py1from __future__ import annotationsCOMMENT
LOWbook_to_skill/parsers/calibre.py21 # a predictable name can be satisfied by an earlier run's leftover: aCOMMENT
LOWbook_to_skill/parsers/pdf.py1from __future__ import annotationsCOMMENT
LOW.github/workflows/deploy-docs.yml41 # Single-source: the Guide and Skill Reference pages are the repo-rootCOMMENT
LOW.github/workflows/ci.yml41 run: pip install ruffCOMMENT
Self-Referential Comments3 hits · 10 pts
SeverityFileLineSnippetContext
MEDIUM⚡tests/test_book_to_skill.py299 # Create a valid text fileCOMMENT
MEDIUM⚡tests/test_book_to_skill.py301 # Create a file that will fail (unsupported extension, garbage bytes)COMMENT
MEDIUMtests/test_book_to_skill.py1643 # Create a malicious DOCXCOMMENT
Modern AI Meta-Vocabulary2 hits · 5 pts
SeverityFileLineSnippetContext
MEDIUMdocs/research/progressive-disclosure-evals.md136 run.py # experiment orchestration / dry-run / budget gateCODE
MEDIUMdocs/research/progressive-disclosure-evals.md486### PD-10 — Optional Hybrid RAG reference baselineCOMMENT
AI Slop Vocabulary2 hits · 4 pts
SeverityFileLineSnippetContext
MEDIUMtools/evals/score.py38 # harness that recorded route_correct itself -- while `opens` did not containCOMMENT
LOWbook_to_skill/parsers/html.py71 # boundary would just add trailing spaces — drop it and keepCOMMENT
Redundant / Tautological Comments1 hit · 2 pts
SeverityFileLineSnippetContext
LOWbook_to_skill/utils.py984 # Check if it has glob wildcardsCOMMENT
Modern Structural Boilerplate1 hit · 1 pts
SeverityFileLineSnippetContext
LOWbook_to_skill/__init__.py4__all__ = ["resolve_input_files", "extract_single_file", "main", "ExtractionError"]CODE