Turn any technical book PDF into a Claude Code skill — ready to study, reference, and use while you work.
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.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 616 finding(s).
Are imports declared and package/API names verified? 20 finding(s).
Are wrappers, guards, and repeated structures necessary? 639 finding(s).
Which changes need focused human review? 704 finding(s).
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.
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.
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.
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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/scan_generated_skill.py | 130 | def _frontmatter_line_numbers(lines: Sequence[str]) -> set[int]: | CODE |
| LOW | book_to_skill/config.py | 60 | def supported_formats_message() -> str: | CODE |
| LOW | book_to_skill/pdf_inspector_integration.py | 193 | def install_pdf_inspector_hook(utils_module: Any | None = None) -> None: | CODE |
| LOW | book_to_skill/pdf_inspector_integration.py | 236 | def enrich_pdf_inspector_metadata(metadata_path: str | Path | None = None) -> None: | CODE |
| LOW | book_to_skill/utils.py | 486 | def _closed_fence_line_numbers(lines: list[str]) -> set[int]: | CODE |
| LOW | book_to_skill/utils.py | 527 | def _numbered_titles_are_structural( | CODE |
| LOW | book_to_skill/utils.py | 549 | def _structural_chapter_headings(text: str) -> list[str]: | CODE |
| LOW | book_to_skill/utils.py | 640 | def _structural_chapter_count(text: str) -> int: | CODE |
| LOW | book_to_skill/parsers/docx.py | 8 | def extract_docx_with_python_docx(docx_path: str) -> str | None: | CODE |
| LOW | book_to_skill/parsers/docx.py | 52 | def extract_docx_with_zipfile(docx_path: str) -> str | None: | CODE |
| LOW | book_to_skill/parsers/calibre.py | 14 | def extract_with_ebook_convert(input_path: str) -> str | None: | CODE |
| LOW | book_to_skill/parsers/rtf.py | 66 | def _strip_destination_groups(raw: str) -> str: | CODE |
| LOW | tests/test_opencode_host_support.py | 146 | def test_opencode_is_named_as_supported_host(): | CODE |
| LOW | tests/test_opencode_host_support.py | 154 | def test_opencode_extractor_probe_discovers_supported_layouts(tmp_path, layout): | CODE |
| LOW | tests/test_opencode_host_support.py | 178 | def test_opencode_project_probe_resolves_project_root_from_nested_cwd( | CODE |
| LOW | tests/test_opencode_host_support.py | 203 | def test_opencode_project_extractor_is_discoverable(tmp_path, project_skill_dir): | CODE |
| LOW | tests/test_opencode_host_support.py | 216 | def test_opencode_personal_root_is_reachable_beside_compatibility_roots(tmp_path): | CODE |
| LOW | tests/test_opencode_host_support.py | 239 | def test_opencode_does_not_execute_hermes_only_project_layout(tmp_path): | CODE |
| LOW | tests/test_opencode_host_support.py | 256 | def test_opencode_ignores_foreign_project_roots(tmp_path): | CODE |
| LOW | tests/test_opencode_host_support.py | 271 | def test_opencode_destination_and_project_roots_are_documented(): | CODE |
| LOW | tests/test_opencode_host_support.py | 277 | def test_opencode_is_in_unknown_host_prompt_and_reload_guidance(): | CODE |
| LOW⚡ | tests/test_pdftotext_edge_only_boilerplate.py | 41 | def test_mid_page_heading_survives(self): | CODE |
| LOW⚡ | tests/test_pdftotext_edge_only_boilerplate.py | 46 | def test_surrounding_body_text_intact(self): | CODE |
| LOW⚡ | tests/test_pdftotext_edge_only_boilerplate.py | 52 | def test_running_headers_are_still_removed(self): | CODE |
| LOW⚡ | tests/test_pdftotext_edge_only_boilerplate.py | 59 | def test_page_numbers_are_still_removed(self): | CODE |
| LOW⚡ | tests/test_pdftotext_edge_only_boilerplate.py | 64 | def test_plain_running_header_still_stripped(self): | CODE |
| LOW | tests/test_pdftotext_edge_only_boilerplate.py | 76 | def test_footer_boilerplate_still_stripped(self): | CODE |
| LOW | tests/test_pdftotext_edge_only_boilerplate.py | 89 | def test_part_divider_page_is_not_stripped(self): | CODE |
| LOW | tests/test_pdftotext_edge_only_boilerplate.py | 106 | def test_genuinely_repeated_single_line_page_still_stripped(self): | CODE |
| LOW⚡ | tests/test_pdftotext_edge_only_boilerplate.py | 119 | def test_hyphenated_wrap_still_rejoined(self): | CODE |
| LOW⚡ | tests/test_pdftotext_edge_only_boilerplate.py | 122 | def test_short_document_keeps_content_and_drops_form_feeds(self): | CODE |
| LOW⚡ | tests/test_pdftotext_edge_only_boilerplate.py | 128 | def test_mid_page_bare_number_is_kept(self): | CODE |
| LOW⚡ | tests/test_pdftotext_edge_only_boilerplate.py | 138 | def test_one_word_lines_still_survive(self): | CODE |
| LOW | tests/test_pdftotext_edge_only_boilerplate.py | 150 | def test_roman_front_matter_numbers_still_stripped(self): | CODE |
| LOW | tests/test_fingerprint.py | 22 | def test_same_size_different_content_gives_different_fingerprint(tmp_path): | CODE |
| LOW | tests/test_fingerprint.py | 120 | def test_scenario_reuse_same_content(tmp_path): | CODE |
| LOW | tests/test_fingerprint.py | 127 | def test_scenario_changed_content_same_size_falls_back(tmp_path): | CODE |
| LOW | tests/test_fingerprint.py | 139 | def test_scenario_missing_workdir_falls_back(tmp_path): | CODE |
| LOW | tests/test_fingerprint.py | 149 | def test_scenario_mode_mismatch_falls_back(tmp_path): | CODE |
| LOW | tests/test_fingerprint.py | 169 | def test_scenario_sources_changed_falls_back(tmp_path): | CODE |
| LOW⚡ | tests/test_structural_framing_sections.py | 38 | def test_framing_sections_are_excluded_and_structural_sample_is_populated(): | CODE |
| LOW⚡ | tests/test_structural_framing_sections.py | 48 | def test_twenty_chapters_are_not_inflated_by_framing_sections(): | CODE |
| LOW⚡ | tests/test_structural_framing_sections.py | 57 | def test_whole_title_and_word_boundary_guards_keep_instructional_titles(): | CODE |
| LOW | tests/test_structural_framing_sections.py | 77 | def test_bare_appendix_and_labelled_part_are_not_chapters(): | CODE |
| LOW | tests/test_structural_framing_sections.py | 97 | def test_setext_framing_sections_are_filtered_too(): | STRING |
| LOW⚡ | tests/test_discovery_tax.py | 44 | def test_detects_three_chapters(self): | STRING |
| LOW⚡ | tests/test_discovery_tax.py | 50 | def test_best_chapter_picks_largest_body_over_toc_line(self): | STRING |
| LOW⚡ | tests/test_discovery_tax.py | 58 | def test_cross_reference_does_not_split(self): | STRING |
| LOW⚡ | tests/test_discovery_tax.py | 64 | def test_chapter_with_title_splits(self): | STRING |
| LOW⚡ | tests/test_discovery_tax.py | 69 | def test_repeated_cross_ref_does_not_refragment(self): | STRING |
| LOW | tests/test_discovery_tax.py | 125 | def test_extract_toc_detects_non_english_toc(): | CODE |
| LOW | tests/test_openclaw_host_support.py | 66 | def test_openclaw_extractor_probe_discovers_supported_layouts(tmp_path, layout): | CODE |
| LOW | tests/test_openclaw_host_support.py | 102 | def test_openclaw_host_layouts_are_documented(): | CODE |
| LOW⚡ | tests/test_rtf_destination_groups.py | 57 | def test_chapter_heading_is_on_its_own_line(self): | CODE |
| LOW⚡ | tests/test_rtf_destination_groups.py | 62 | def test_info_metadata_not_exposed(self): | CODE |
| LOW⚡ | tests/test_rtf_destination_groups.py | 68 | def test_pict_binary_payload_dropped(self): | CODE |
| LOW⚡ | tests/test_rtf_destination_groups.py | 75 | def test_nested_group_inside_skipped_group(self): | CODE |
| LOW⚡ | tests/test_rtf_destination_groups.py | 83 | def test_content_group_after_skipped_group_is_kept(self): | CODE |
| LOW | tests/test_rtf_destination_groups.py | 94 | def test_unknown_star_destination_skipped(self): | CODE |
| LOW | tests/test_rtf_destination_groups.py | 100 | def test_field_keeps_result_drops_instruction(self): | CODE |
| 511 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_fingerprint.py | 99 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_fingerprint.py | 101 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 219 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 221 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 278 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 280 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 419 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 421 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 488 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 490 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 630 | # ── Hindi (Devanagari) chapter headings ──────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 848 | # ── Korean chapter headings ──────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 893 | # ── Persian chapter headings ─────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 1205 | # ── Chinese (CJK) chapter headings ────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 1781 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 1783 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 2308 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 2310 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 2359 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 2361 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 2428 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 2430 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | tests/test_book_to_skill.py | 20 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_book_to_skill.py | 22 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_book_to_skill.py | 44 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | tests/test_book_to_skill.py | 46 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | tests/test_book_to_skill.py | 539 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | tests/test_book_to_skill.py | 541 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | tests/test_book_to_skill.py | 1295 | # ── Kangxi-radical numerals (U+2F00 block) ────────────────────────────── | COMMENT |
| MEDIUM | tests/test_book_to_skill.py | 2391 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | tests/test_book_to_skill.py | 2393 | # ═══════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 174 | # ═══════════════════════════════════════════════════════════════════════════ | STRING |
| MEDIUM⚡ | tests/test_book_to_skill.py | 176 | # ═══════════════════════════════════════════════════════════════════════════ | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tools/validate_skill.py | 49 | except (AttributeError, ValueError): | CODE |
| HIGH | book_to_skill/cli.py | 22 | except (AttributeError, ValueError): | CODE |
| HIGH | book_to_skill/parsers/pdf.py | 195 | except Exception: | CODE |
| HIGH | book_to_skill/parsers/pdf.py | 207 | except Exception: | CODE |
| HIGH | book_to_skill/parsers/pdf.py | 186 | except Exception: | CODE |
| HIGH | book_to_skill/parsers/rtf.py | 169 | except ImportError: | CODE |
| HIGH | book_to_skill/parsers/epub.py | 71 | except (KeyError, Exception): | CODE |
| HIGH | scripts/extract.py | 24 | except (AttributeError, ValueError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/discovery_tax.py | 65 | except Exception: | CODE |
| LOW | tools/discovery_tax.py | 73 | except Exception: | CODE |
| MEDIUM | tools/discovery_tax.py | 69 | def token_method() -> str: | CODE |
| LOW | book_to_skill/pdf_inspector_integration.py | 98 | except Exception as exc: | CODE |
| MEDIUM | book_to_skill/pdf_inspector_integration.py | 31 | def _package_version() -> str | None: | CODE |
| LOW | book_to_skill/dependencies.py | 129 | except Exception as exc: | CODE |
| LOW | book_to_skill/parsers/docx.py | 47 | except Exception as e: | CODE |
| LOW | book_to_skill/parsers/docx.py | 107 | except Exception as e: | CODE |
| LOW | book_to_skill/parsers/docx.py | 132 | except Exception as e: | CODE |
| LOW | book_to_skill/parsers/calibre.py | 52 | except Exception as e: | CODE |
| LOW | book_to_skill/parsers/html.py | 112 | except Exception: | CODE |
| LOW | book_to_skill/parsers/pdf.py | 88 | except Exception as e: | CODE |
| LOW | book_to_skill/parsers/pdf.py | 108 | except Exception: | CODE |
| LOW | book_to_skill/parsers/pdf.py | 121 | except Exception: | CODE |
| LOW | book_to_skill/parsers/pdf.py | 128 | except Exception as e: | CODE |
| LOW | book_to_skill/parsers/pdf.py | 140 | except Exception as e: | CODE |
| LOW | book_to_skill/parsers/pdf.py | 166 | except Exception as e: | CODE |
| LOW | book_to_skill/parsers/pdf.py | 186 | except Exception: | CODE |
| LOW | book_to_skill/parsers/pdf.py | 195 | except Exception: | CODE |
| LOW | book_to_skill/parsers/pdf.py | 207 | except Exception: | CODE |
| LOW | book_to_skill/parsers/rtf.py | 171 | except Exception as e: | CODE |
| LOW | book_to_skill/parsers/text.py | 19 | except Exception as e: | CODE |
| LOW | book_to_skill/parsers/epub.py | 54 | except Exception as e: | CODE |
| LOW | book_to_skill/parsers/epub.py | 151 | except Exception: | CODE |
| LOW | book_to_skill/parsers/epub.py | 154 | except Exception as e: | CODE |
| LOW | book_to_skill/parsers/epub.py | 168 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/scan_generated_skill.py | 4 | CODE | |
| LOW | tools/discovery_tax.py | 31 | CODE | |
| LOW | tools/evals/paper_flat.py | 6 | CODE | |
| LOW | tools/evals/manifest.py | 6 | CODE | |
| LOW | tools/evals/replay.py | 3 | CODE | |
| LOW | tools/evals/score.py | 3 | CODE | |
| LOW | book_to_skill/pdf_inspector_integration.py | 1 | CODE | |
| LOW | book_to_skill/__init__.py | 1 | CODE | |
| LOW | book_to_skill/__init__.py | 1 | CODE | |
| LOW | book_to_skill/__init__.py | 1 | CODE | |
| LOW | book_to_skill/__init__.py | 2 | CODE | |
| LOW | book_to_skill/utils.py | 1 | CODE | |
| LOW | book_to_skill/sanitize.py | 1 | CODE | |
| LOW | book_to_skill/dependencies.py | 1 | CODE | |
| LOW | book_to_skill/parsers/docx.py | 1 | CODE | |
| LOW | book_to_skill/parsers/calibre.py | 1 | CODE | |
| LOW | book_to_skill/parsers/html.py | 1 | CODE | |
| LOW | book_to_skill/parsers/pdf.py | 1 | CODE | |
| LOW | book_to_skill/parsers/text.py | 1 | CODE | |
| LOW | book_to_skill/parsers/epub.py | 1 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/validate_skill.py | 168 | CODE | |
| LOW | tools/validate_skill.py | 193 | CODE | |
| LOW | tools/evals/score.py | 25 | CODE | |
| LOW | book_to_skill/utils.py | 549 | CODE | |
| LOW | book_to_skill/utils.py | 930 | CODE | |
| LOW | book_to_skill/utils.py | 966 | CODE | |
| LOW | book_to_skill/utils.py | 1096 | CODE | |
| LOW | book_to_skill/dependencies.py | 267 | CODE | |
| LOW | book_to_skill/parsers/docx.py | 8 | CODE | |
| LOW | book_to_skill/parsers/docx.py | 52 | CODE | |
| LOW | book_to_skill/parsers/docx.py | 112 | CODE | |
| LOW | book_to_skill/parsers/docx.py | 66 | CODE | |
| LOW | book_to_skill/parsers/docx.py | 78 | CODE | |
| LOW | book_to_skill/parsers/calibre.py | 14 | CODE | |
| LOW | book_to_skill/parsers/pdf.py | 30 | CODE | |
| LOW | book_to_skill/parsers/pdf.py | 112 | CODE | |
| LOW | book_to_skill/parsers/pdf.py | 171 | CODE | |
| LOW | book_to_skill/parsers/rtf.py | 66 | CODE | |
| LOW | book_to_skill/parsers/epub.py | 90 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cliff.toml | 1 | # git-cliff configuration — generates CHANGELOG.md from Conventional Commit | COMMENT |
| LOW | book_to_skill/utils.py | 61 | # CJK codepoints: ideographs + extensions, kana, hangul, CJK punctuation, and | COMMENT |
| LOW | book_to_skill/utils.py | 101 | latin_words = len(_CJK_RE.sub(" ", text).split()) | COMMENT |
| LOW | book_to_skill/utils.py | 121 | # indicated by the `&` symbol…", "Chapter 17.) We have seen…" — is prose wrapped | COMMENT |
| LOW | book_to_skill/utils.py | 141 | # a markdown heading ("## i. introduction") to avoid false positives from | COMMENT |
| LOW | book_to_skill/utils.py | 221 | # ଅଧ୍ୟାୟ ("chapter") + a number. Grouped next to Bengali because both are | COMMENT |
| LOW | book_to_skill/utils.py | 281 | # Gujarati chapter headings: "પ્રકરણ 1", "અધ્યાય ૧", "## પ્રકરણ 2". | COMMENT |
| LOW | book_to_skill/utils.py | 301 | # there. Requiring whitespace then a number keeps prose that merely uses an | COMMENT |
| LOW | book_to_skill/utils.py | 321 | # The trailing group is the Korean analogue of _HEADING_TAIL: Korean has no letter | COMMENT |
| LOW | book_to_skill/utils.py | 721 | # ebooks that encode chapter numbers in the U+2F00 block are detected. | COMMENT |
| LOW | book_to_skill/sanitize.py | 21 | 0x2064, # INVISIBLE PLUS | COMMENT |
| LOW | book_to_skill/sanitize.py | 81 | # U+180E just above is the same Mongolian block, which is what makes the free | COMMENT |
| LOW | book_to_skill/sanitize.py | 121 | _TAG_BLOCK_END = 0xE007F | COMMENT |
| LOW | book_to_skill/parsers/docx.py | 1 | from __future__ import annotations | COMMENT |
| LOW | book_to_skill/parsers/calibre.py | 21 | # a predictable name can be satisfied by an earlier run's leftover: a | COMMENT |
| LOW | book_to_skill/parsers/pdf.py | 1 | from __future__ import annotations | COMMENT |
| LOW | .github/workflows/deploy-docs.yml | 41 | # Single-source: the Guide and Skill Reference pages are the repo-root | COMMENT |
| LOW | .github/workflows/ci.yml | 41 | run: pip install ruff | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_book_to_skill.py | 299 | # Create a valid text file | COMMENT |
| MEDIUM⚡ | tests/test_book_to_skill.py | 301 | # Create a file that will fail (unsupported extension, garbage bytes) | COMMENT |
| MEDIUM | tests/test_book_to_skill.py | 1643 | # Create a malicious DOCX | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/research/progressive-disclosure-evals.md | 136 | run.py # experiment orchestration / dry-run / budget gate | CODE |
| MEDIUM | docs/research/progressive-disclosure-evals.md | 486 | ### PD-10 — Optional Hybrid RAG reference baseline | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/evals/score.py | 38 | # harness that recorded route_correct itself -- while `opens` did not contain | COMMENT |
| LOW | book_to_skill/parsers/html.py | 71 | # boundary would just add trailing spaces — drop it and keep | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | book_to_skill/utils.py | 984 | # Check if it has glob wildcards | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | book_to_skill/__init__.py | 4 | __all__ = ["resolve_input_files", "extract_single_file", "main", "ExtractionError"] | CODE |