A simple tool to update bib entries with their official information (e.g., DBLP or the ACL anthology).
This report summarizes scanner evidence for yuchenlin/rebiber, a Python project with 3,044 GitHub stars. SynthScan examined 2,280,859 lines of code across 416 source files, recording 151 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 0.1 (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.
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.
Can maintainers explain intent, assumptions, and trade-offs? 134 finding(s).
Are imports declared and package/API names verified? 4 finding(s).
Are wrappers, guards, and repeated structures necessary? 139 finding(s).
Which changes need focused human review? 151 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 151 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_download_dblp.py | 82 | def test_pagination_follows_server_cap_not_requested_h(): | CODE |
| LOW | tests/test_download_dblp.py | 140 | def test_eccv_not_skipped_ecml_is(): | CODE |
| LOW | tests/test_download_dblp.py | 159 | def test_toc_queries_robotics_main_tracks_not_workshops(): | CODE |
| LOW | tests/test_download_dblp.py | 170 | def test_multivol_yields_numbered_volumes_after_empty_bare(): | CODE |
| LOW | tests/test_download_dblp.py | 204 | def test_multivol_always_merges_numbered_volumes_when_bare_nonempty(): | CODE |
| LOW | tests/test_download_dblp.py | 241 | def test_skip_incomplete_small_json_redownloads(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_download_dblp.py | 263 | def test_skip_existing_complete_json_does_not_download(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_download_dblp.py | 277 | def test_reject_overwrite_with_thinner_download(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_download_dblp.py | 291 | def test_colm_openreview_fixture_two_bib_entries(): | CODE |
| LOW | tests/test_download_dblp.py | 316 | def test_colm_openreview_error_prints_warning_and_skips(capsys): | CODE |
| LOW | tests/test_download_dblp.py | 326 | def test_colm_falls_back_to_openreview_when_dblp_empty(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_download_dblp.py | 350 | def test_prev_year_thin_prints_error_but_writes_when_no_existing( | CODE |
| LOW | tests/test_download_dblp.py | 368 | def test_skip_existing_prev_year_thin_non_journal_redownloads(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_download_dblp.py | 390 | def test_skip_existing_prev_year_thin_journal_still_skips(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_download_dblp.py | 409 | def test_needs_http_when_prev_year_thin_non_journal(tmp_path): | CODE |
| LOW | tests/test_camera.py | 6 | def test_protect_acronyms_not_title_case_words(): | CODE |
| LOW | tests/test_camera.py | 15 | def test_protect_does_not_double_brace_whole_title(): | CODE |
| LOW⚡ | tests/test_camera.py | 30 | def test_protect_mixed_case_and_digits(): | CODE |
| LOW⚡ | tests/test_camera.py | 36 | def test_protect_empty_and_none(): | CODE |
| LOW⚡ | tests/test_camera.py | 41 | def test_apply_keep_always_keeps_id_and_entrytype(): | CODE |
| LOW | tests/test_camera.py | 62 | def test_apply_keep_empty_is_noop(): | CODE |
| LOW | tests/test_camera.py | 69 | def test_apply_keep_case_insensitive_and_comma_string(): | CODE |
| LOW | tests/test_camera.py | 86 | def test_apply_keep_none_entry(): | CODE |
| LOW | tests/test_venue_data.py | 152 | def test_fixture_keys_match_normalize_title(self): | STRING |
| LOW | tests/test_venue_data.py | 158 | def test_each_arxiv_style_input_becomes_official_venue(self): | STRING |
| LOW | tests/test_venue_data.py | 178 | def test_batch_file_converts_all_fixture_papers(self): | STRING |
| LOW | tests/test_venue_data.py | 187 | def test_wrong_author_not_converted_even_if_title_matches(self): | STRING |
| LOW | tests/test_venue_data.py | 207 | def test_dump_contains_fixture_paper(self): | CODE |
| LOW | tests/test_venue_data.py | 251 | def test_bib_list_paths_exist(self): | CODE |
| LOW | tests/test_bib2json.py | 34 | def test_normalize_title_strips_punctuation_lowercases_letters_only(): | CODE |
| LOW | tests/test_bib2json.py | 60 | def test_load_bib_file_parses_two_entries_ignores_comments(): | CODE |
| LOW | tests/test_bib2json.py | 90 | def test_load_bib_file_comment_inside_entry_does_not_drop_it(): | CODE |
| LOW | tests/test_bib2json.py | 114 | def test_load_bib_file_skips_comment_and_preamble(): | CODE |
| LOW | tests/test_bib2json.py | 136 | def test_brace_nested_fields_stay_in_one_entry(): | CODE |
| LOW | tests/test_bib2json.py | 158 | def test_build_json_keys_by_normalize_title(): | CODE |
| LOW | tests/test_bib2json.py | 187 | def test_build_json_uses_keep_digits_keys(): | CODE |
| LOW | tests/test_bib2json.py | 218 | def test_build_json_keeps_title_containing_month(): | CODE |
| LOW | tests/test_bib2json.py | 240 | def test_load_bib_file_keeps_unclosed_entry(): | CODE |
| LOW | tests/test_bib2json.py | 257 | def test_load_bib_file_recovers_from_extra_closing_brace(): | CODE |
| LOW | tests/test_bib2json.py | 283 | def test_load_bib_file_splits_unclosed_buffer_at_next_at(): | CODE |
| LOW | tests/test_bib2json.py | 308 | def test_build_json_keeps_single_line_entry_containing_month(): | CODE |
| LOW | tests/test_bib2json.py | 326 | def test_normalize_title_nfkd_before_ascii_strip(): | CODE |
| LOW | tests/test_bib2json.py | 354 | def test_load_bib_file_ignores_leading_junk_before_at(): | CODE |
| LOW | tests/test_bib2json.py | 375 | def test_build_json_duplicate_key_warns_and_keeps_last(capsys): | CODE |
| LOW | tests/test_bib2json.py | 403 | def test_build_json_accepts_uppercase_title(): | CODE |
| LOW | tests/test_star_history.py | 26 | def test_cumulative_daily_counts_and_order(): | CODE |
| LOW | tests/test_star_history.py | 38 | def test_downsample_keeps_ends(): | CODE |
| LOW | tests/test_star_history.py | 47 | def test_ytd_series_carries_baseline_and_counts_gain(): | CODE |
| LOW⚡ | tests/test_star_history.py | 62 | def test_ytd_series_empty_before_year_starts_at_zero(): | CODE |
| LOW⚡ | tests/test_star_history.py | 72 | def test_x_ticks_use_months_for_short_spans(): | CODE |
| LOW⚡ | tests/test_star_history.py | 81 | def test_render_svg_contains_title_and_total(): | CODE |
| LOW | tests/test_star_history.py | 97 | def test_fetch_follows_next_link_and_collects_starred_at(): | CODE |
| LOW | tests/test_cli.py | 93 | def test_default_main_does_not_call_dblp(self): | CODE |
| LOW | tests/test_cli.py | 117 | def test_live_lookup_reaches_search_empty_keeps_original(self): | CODE |
| LOW | tests/test_cli.py | 158 | def test_dry_run_does_not_create_output_and_reports_converted_key(self): | CODE |
| LOW | tests/test_cli.py | 203 | def test_used_in_unused_key_not_converted(self): | CODE |
| LOW | tests/test_cli.py | 255 | def test_help_epilog_has_examples_and_arxiv_api_note(self): | CODE |
| LOW⚡ | tests/test_normalize.py | 544 | def test_multiple_inputs_require_directory_output(self): | STRING |
| LOW⚡ | tests/test_normalize.py | 552 | def test_multiple_inputs_same_are_inplace(self): | STRING |
| LOW⚡ | tests/test_normalize.py | 561 | def test_entry_venue_prefers_journal_then_booktitle(self): | STRING |
| 65 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | rebiber/bib2json.py | 156 | except Exception as e: | CODE |
| LOW | rebiber/download_dblp.py | 643 | except Exception as exc: | CODE |
| LOW | rebiber/download_dblp.py | 659 | except Exception as exc: | CODE |
| LOW | rebiber/download_dblp.py | 969 | except Exception as exc: | CODE |
| LOW | rebiber/normalize.py | 481 | except Exception as exc: | CODE |
| LOW | rebiber/normalize.py | 681 | except Exception as exc: | CODE |
| LOW | rebiber/normalize.py | 724 | except Exception as exc: | CODE |
| LOW | rebiber/normalize.py | 732 | except Exception as exc: | CODE |
| LOW | rebiber/normalize.py | 917 | except Exception as exc: | CODE |
| LOW | rebiber/normalize.py | 1294 | except Exception: | CODE |
| MEDIUM | rebiber/normalize.py | 686 | def infer_year_from_arxiv_id(arxiv_id): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | rebiber/bib2json.py | 58 | CODE | |
| LOW | rebiber/download_dblp.py | 904 | CODE | |
| LOW | rebiber/normalize.py | 122 | CODE | |
| LOW | rebiber/normalize.py | 557 | CODE | |
| LOW | rebiber/normalize.py | 790 | CODE | |
| LOW | rebiber/normalize.py | 1047 | CODE | |
| LOW | scripts/refresh_bib_list.py | 69 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | rebiber/download_dblp.py | 184 | except ImportError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | rebiber/__init__.py | 5 | CODE | |
| LOW | rebiber/__init__.py | 6 | CODE | |
| LOW | rebiber/__init__.py | 6 | CODE | |
| LOW | scripts/star_history.py | 14 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | rebiber/normalize.py | 790 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | rebiber/__init__.py | 8 | __all__ = ["load_bib_file", "construct_bib_db", "normalize_bib"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | rebiber/data/iccv2015.bib.json | 7533 | " title = {Generating Notifications for Missing Actions: Don't Forget to Turn\n", | CODE |