📑 PageIndex: Document Index for Vectorless, Reasoning-based RAG
This report summarizes scanner evidence for VectifyAI/PageIndex, a Python project with 39,049 GitHub stars. SynthScan examined 48,660 lines of code across 141 source files, recording 2939 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 47.6 (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? 861 finding(s).
Are imports declared and package/API names verified? 1965 finding(s).
Are wrappers, guards, and repeated structures necessary? 844 finding(s).
Which changes need focused human review? 2939 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 2939 distinct pattern matches across 16 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 | run_pageindex.py | 4 | CODE | |
| LOW | tests/test_flash_extraction.py | 178 | CODE | |
| LOW | tests/test_flash_extraction.py | 330 | CODE | |
| LOW | tests/test_local_chat.py | 52 | CODE | |
| LOW | tests/test_issue_163.py | 4 | CODE | |
| LOW | pageindex/_version.py | 2 | CODE | |
| LOW | pageindex/chat_stream.py | 2 | CODE | |
| LOW | pageindex/client.py | 2 | CODE | |
| LOW | pageindex/client.py | 165 | CODE | |
| LOW | pageindex/client.py | 29 | CODE | |
| LOW | pageindex/client.py | 2672 | CODE | |
| LOW | pageindex/local_store.py | 2 | CODE | |
| LOW | pageindex/__init__.py | 4 | CODE | |
| LOW | pageindex/__init__.py | 5 | CODE | |
| LOW | pageindex/__init__.py | 5 | CODE | |
| LOW | pageindex/__init__.py | 5 | CODE | |
| LOW | pageindex/__init__.py | 6 | CODE | |
| LOW | pageindex/__init__.py | 7 | CODE | |
| LOW | pageindex/__init__.py | 7 | CODE | |
| LOW | pageindex/__init__.py | 7 | CODE | |
| LOW | pageindex/__init__.py | 7 | CODE | |
| LOW | pageindex/__init__.py | 7 | CODE | |
| LOW | pageindex/__init__.py | 11 | CODE | |
| LOW | pageindex/__init__.py | 12 | CODE | |
| LOW | pageindex/__init__.py | 13 | CODE | |
| LOW | pageindex/__init__.py | 13 | CODE | |
| LOW | pageindex/__init__.py | 14 | CODE | |
| LOW | pageindex/__init__.py | 15 | CODE | |
| LOW | pageindex/types.py | 12 | CODE | |
| LOW | pageindex/mcp_bridge.py | 14 | CODE | |
| LOW | pageindex/local_api.py | 2 | CODE | |
| LOW | pageindex/page_index_md.py | 6 | CODE | |
| LOW | pageindex/page_index_md.py | 8 | CODE | |
| LOW | pageindex/page_index_classic.py | 7 | CODE | |
| LOW | pageindex/imaging.py | 2 | CODE | |
| LOW | pageindex/local_chat.py | 4 | CODE | |
| LOW | pageindex/local_chat.py | 166 | CODE | |
| LOW | pageindex/local_chat.py | 1229 | CODE | |
| LOW | pageindex/local_chat.py | 1230 | CODE | |
| LOW | pageindex/integrations/anthropic_sdk.py | 19 | CODE | |
| LOW | pageindex/integrations/openai_agents.py | 15 | CODE | |
| LOW | pageindex/flash/parser_pdfium_parallel.py | 23 | CODE | |
| LOW | pageindex/flash/__init__.py | 3 | CODE | |
| LOW | pageindex/flash/api.py | 3 | CODE | |
| LOW | pageindex/flash/embedded_toc.py | 39 | CODE | |
| LOW | pageindex/flash/main.py | 8 | CODE | |
| LOW | pageindex/flash/main.py | 11 | CODE | |
| LOW | pageindex/flash/main.py | 22 | CODE | |
| LOW | pageindex/flash/main.py | 23 | CODE | |
| LOW | pageindex/flash/main.py | 23 | CODE | |
| LOW | pageindex/flash/blocks/build.py | 3 | CODE | |
| LOW | pageindex/flash/blocks/build.py | 7 | CODE | |
| LOW | pageindex/flash/blocks/build.py | 7 | CODE | |
| LOW | pageindex/flash/blocks/build.py | 7 | CODE | |
| LOW | pageindex/flash/blocks/build.py | 7 | CODE | |
| LOW | pageindex/flash/blocks/build.py | 7 | CODE | |
| LOW | pageindex/flash/blocks/build.py | 7 | CODE | |
| LOW | pageindex/flash/blocks/build.py | 7 | CODE | |
| LOW | pageindex/flash/blocks/build.py | 7 | CODE | |
| LOW | pageindex/flash/blocks/build.py | 7 | CODE | |
| 1893 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_flash_extraction.py | 842 | def test_non_latin_document_is_indexed(name): | CODE |
| LOW⚡ | tests/test_flash_extraction.py | 852 | def test_japanese_headings_are_kept(): | CODE |
| LOW⚡ | tests/test_flash_extraction.py | 860 | def test_cross_script_headings_are_kept(): | CODE |
| LOW⚡ | tests/test_flash_extraction.py | 870 | def test_non_latin_headings_are_detected(name): | CODE |
| LOW⚡ | tests/test_flash_extraction.py | 878 | def test_landscape_deck_title_is_the_slide_heading(tmp_path): | CODE |
| LOW⚡ | tests/test_flash_extraction.py | 886 | def test_flash_cli_summary_concurrency_reaches_the_indexer(monkeypatch, tmp_path): | CODE |
| LOW⚡ | tests/test_flash_extraction.py | 892 | def test_flash_cli_summary_max_words_reaches_the_indexer(monkeypatch, tmp_path): | CODE |
| LOW⚡ | tests/test_flash_extraction.py | 898 | def test_flash_cli_summary_flags_refuse_standard_mode(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 41 | def test_page_mode_walk_uses_merged_surrogate_census(): | CODE |
| LOW | tests/test_flash_extraction.py | 63 | def test_rtl_sign_takes_a_multi_code_point_glyph(): | CODE |
| LOW | tests/test_flash_extraction.py | 79 | def test_ink_past_the_advance_does_not_split_the_word(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 93 | def test_dropped_glyph_after_ink_past_the_advance_does_not_split_the_word(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 111 | def test_dropped_glyph_with_no_next_survivor_advances_by_its_code_width(): | CODE |
| LOW | tests/test_flash_extraction.py | 124 | def test_rotated_text_ignores_code_widths(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 138 | def test_rtl_chars_ignore_code_widths(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 152 | def test_composite_font_widths_read_both_w_forms(): | CODE |
| LOW | tests/test_flash_extraction.py | 172 | def test_optimize_full_keyless_reports_file_errors_first(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 193 | def test_no_heading_result_carries_page_texts(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 207 | def test_propose_children_clamps_to_loaded_pages(monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 234 | def test_bootstrap_reimport_is_not_swallowed(monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 265 | def test_pool_construction_failure_falls_back_sequential(monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 289 | def test_submit_document_refuses_during_bootstrap(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 302 | def test_unguarded_script_parses_parallel_without_reexecution(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 326 | def test_optimize_wins_over_deprecated_optimize_expand(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 363 | def test_lone_surrogate_from_broken_tounicode_is_replaced(monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 389 | def test_lone_surrogate_targets_never_patched_into_chars(): | CODE |
| LOW | tests/test_flash_extraction.py | 403 | def test_lone_surrogate_from_single_byte_map_is_replaced(): | CODE |
| LOW | tests/test_flash_extraction.py | 418 | def test_anonymous_main_overlapping_windows_restore(monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 460 | def test_optimize_full_skips_expand_without_page_texts(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 485 | def test_optimize_full_skips_expand_on_textless_pages(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 511 | def test_optimize_expand_warning_names_the_behavior_change(tmp_path, | CODE |
| LOW | tests/test_flash_extraction.py | 557 | def test_flash_cli_summary_model_follows_config_chain(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 576 | def test_flash_cli_rejects_empty_structure(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 584 | def test_flash_cli_rejects_oversized_flat_tree(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 644 | def test_landscape_deck_is_structured(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 657 | def test_short_document_headings_are_detected(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 670 | def test_toc_source_is_always_present(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 686 | def test_no_hierarchy_falls_back_to_page_nodes(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 703 | def test_flat_fallback_over_limit_skips_model_passes(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 725 | def test_textless_pdf_is_unreadable(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 738 | def test_flash_rejection_reason(): | CODE |
| LOW | tests/test_flash_extraction.py | 760 | def test_page_fallback_covers_every_page(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 776 | def test_page_nodes_are_leaves(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 788 | def test_every_page_is_in_a_node(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 816 | def test_preface_page_is_retrievable(tmp_path, monkeypatch): | CODE |
| LOW⚡ | tests/test_local_chat.py | 860 | def test_chat_process_blank_chat_model_refuses(client): | CODE |
| LOW⚡ | tests/test_local_chat.py | 866 | def test_clip_flattens_and_caps(): | CODE |
| LOW⚡ | tests/test_local_chat.py | 872 | def test_chat_process_parallel_calls_pair_results(client, store_path, | CODE |
| LOW⚡ | tests/test_local_chat.py | 4162 | def test_chat_reaches_the_model_with_client_instructions(store_path, | CODE |
| LOW⚡ | tests/test_local_chat.py | 4172 | def test_bridge_client_instructions_follow_the_live_instructions( | CODE |
| LOW⚡ | tests/test_local_chat.py | 4180 | def test_openai_agent_config_carries_client_instructions(store_path): | CODE |
| LOW⚡ | tests/test_local_chat.py | 4186 | def test_anthropic_runner_config_carries_client_instructions(store_path): | CODE |
| LOW⚡ | tests/test_local_chat.py | 4194 | def test_claude_agent_config_carries_client_instructions(store_path): | CODE |
| LOW⚡ | tests/test_local_chat.py | 4201 | def test_managed_chat_sends_one_leading_system_row(monkeypatch): | CODE |
| LOW | tests/test_local_chat.py | 210 | def test_chat_completions_end_to_end(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 238 | def test_chat_completions_system_and_doc_block(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 251 | def test_chat_completions_accepts_query_string(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 262 | def test_chat_completions_validation(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 280 | def test_chat_completions_stream_modes(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 298 | def test_chat_completions_missing_framework(client, monkeypatch): | CODE |
| 647 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_agent_tools.py | 3186 | except OSError: # the client gave up (timeout tests) | CODE |
| HIGH | pageindex/client.py | 30 | except Exception: | CODE |
| HIGH | pageindex/local_store.py | 93 | except OSError: | CODE |
| HIGH | pageindex/mcp_bridge.py | 192 | except PageIndexAPIError: | CODE |
| HIGH | pageindex/utils.py | 49 | except Exception: | CODE |
| HIGH | pageindex/utils.py | 703 | except ValueError: | CODE |
| HIGH | pageindex/local_chat.py | 582 | except Exception: | CODE |
| HIGH | pageindex/local_chat.py | 137 | except asyncio.CancelledError: | CODE |
| HIGH | pageindex/local_chat.py | 871 | except ValueError: | CODE |
| HIGH | pageindex/local_chat.py | 756 | except (ValueError, TypeError): | CODE |
| HIGH | pageindex/flash/blocks/build.py | 150 | except ValueError: | CODE |
| HIGH | pageindex/flash/blocks/build.py | 160 | except ValueError: | CODE |
| HIGH | pageindex/flash/classification/toc_boilerplate.py | 225 | except ValueError: | CODE |
| HIGH | pageindex/flash/parser_pdfium_charlevel/code_walk.py | 66 | except Exception: | CODE |
| HIGH | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 100 | except Exception: | CODE |
| HIGH | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 267 | except Exception: | CODE |
| HIGH | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 279 | except Exception: | CODE |
| HIGH | pageindex/flash/parser_pdfium_charlevel/pdf_objects.py | 165 | except Exception: | CODE |
| HIGH | pageindex/flash/parser_pdfium_charlevel/pdf_objects.py | 187 | except ValueError: | CODE |
| HIGH | pageindex/flash/outline_assembly/assembly.py | 99 | except (ValueError, AttributeError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pageindex/cloud_api.py | 342 | CODE | |
| LOW | pageindex/cloud_api.py | 376 | CODE | |
| LOW | pageindex/client.py | 2412 | CODE | |
| LOW | pageindex/mcp_bridge.py | 263 | CODE | |
| LOW | pageindex/utils.py | 323 | CODE | |
| LOW | pageindex/utils.py | 341 | CODE | |
| LOW | pageindex/utils.py | 537 | CODE | |
| LOW | pageindex/utils.py | 675 | CODE | |
| LOW | pageindex/utils.py | 343 | CODE | |
| LOW | pageindex/page_index_md.py | 32 | CODE | |
| LOW | pageindex/page_index_md.py | 137 | CODE | |
| LOW | pageindex/page_index_classic.py | 431 | CODE | |
| LOW | pageindex/page_index_classic.py | 469 | CODE | |
| LOW | pageindex/page_index_classic.py | 814 | CODE | |
| LOW | pageindex/page_index_classic.py | 854 | CODE | |
| LOW | pageindex/page_index_classic.py | 1301 | CODE | |
| LOW | pageindex/agent_tools.py | 536 | CODE | |
| LOW | pageindex/agent_tools.py | 837 | CODE | |
| LOW | pageindex/local_chat.py | 50 | CODE | |
| LOW | pageindex/local_chat.py | 721 | CODE | |
| LOW | pageindex/local_chat.py | 776 | CODE | |
| LOW | pageindex/local_chat.py | 845 | CODE | |
| LOW | pageindex/local_chat.py | 1043 | CODE | |
| LOW | pageindex/local_chat.py | 1363 | CODE | |
| LOW | pageindex/local_chat.py | 1140 | CODE | |
| LOW | pageindex/flash/embedded_toc.py | 351 | CODE | |
| LOW | pageindex/flash/main.py | 124 | CODE | |
| LOW | pageindex/flash/blocks/build.py | 95 | CODE | |
| LOW | pageindex/flash/blocks/join_rules.py | 73 | CODE | |
| LOW | pageindex/flash/classification/body_text.py | 193 | CODE | |
| LOW | pageindex/flash/classification/toc_boilerplate.py | 184 | CODE | |
| LOW | pageindex/flash/classification/toc_boilerplate.py | 306 | CODE | |
| LOW | pageindex/flash/classification/header_footer.py | 153 | CODE | |
| LOW | pageindex/flash/classification/header_footer.py | 230 | CODE | |
| LOW | pageindex/flash/classification/header_footer.py | 279 | CODE | |
| LOW | pageindex/flash/classification/header_footer.py | 290 | CODE | |
| LOW | pageindex/flash/heading_detection/text_checks.py | 87 | CODE | |
| LOW | pageindex/flash/heading_detection/text_checks.py | 141 | CODE | |
| LOW | pageindex/flash/heading_detection/style_detectors.py | 239 | CODE | |
| LOW | pageindex/flash/heading_detection/neighbors.py | 79 | CODE | |
| LOW | pageindex/flash/heading_detection/page_scan.py | 63 | CODE | |
| LOW | pageindex/flash/heading_detection/page_scan.py | 296 | CODE | |
| LOW | pageindex/flash/heading_detection/page_scan.py | 425 | CODE | |
| LOW | pageindex/flash/heading_detection/detectors.py | 459 | CODE | |
| LOW | pageindex/flash/heading_detection/candidates.py | 124 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/code_walk.py | 22 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/code_walk.py | 141 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/merge.py | 18 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/char_extract.py | 255 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/char_extract.py | 350 | CODE | |
| LOW | …eindex/flash/parser_pdfium_charlevel/content_stream.py | 59 | CODE | |
| LOW | …eindex/flash/parser_pdfium_charlevel/content_stream.py | 396 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/cmap_parse.py | 111 | CODE | |
| LOW | …eindex/flash/parser_pdfium_charlevel/text_normalize.py | 123 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/font_unicode.py | 25 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/font_unicode.py | 116 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/font_unicode.py | 190 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/font_unicode.py | 397 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 52 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 210 | CODE | |
| 29 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_local_chat.py | 1281 | 'data: {"type":"message_start","message":{"id":"msg_1","type":"message","role":"assistant","model":"claude-test" | CODE |
| HIGH | tests/test_local_chat.py | 1293 | 'data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"output_tokens": | CODE |
| HIGH | tests/test_agent_tools.py | 1986 | """A 200 body of null, a batched array, or an SSE string frame must | STRING |
| HIGH | pageindex/utils.py | 417 | # In Linux, only '/' and '\0' (null) are invalid in filenames. | COMMENT |
| HIGH | pageindex/agent_tools.py | 1336 | # Nullable unions arrive as anyOf: [{type: string}, {type: null}]. | COMMENT |
| HIGH | pageindex/flash/parser_pdfium_charlevel/merge.py | 346 | # previous glyph transform is still null): position comparison returns | COMMENT |
| HIGH | …eindex/flash/parser_pdfium_charlevel/content_stream.py | 31 | # (B -> BM -> BMC, f -> false, n -> null). Not operators. | COMMENT |
| HIGH | …eindex/flash/parser_pdfium_charlevel/content_stream.py | 239 | continue # content operator evaluator: `if (obj != null) args append` | CODE |
| HIGH | pageindex/flash/parser_pdfium_charlevel/font_unicode.py | 67 | # Detail: encoding lookup(null) -> null assigned to built-in encoding. | COMMENT |
| HIGH | pageindex/flash/outline_assembly/assembly.py | 206 | stack.push(stack_outline_node) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pageindex/tree_optimize.py | 95 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 97 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 142 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 144 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 243 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 245 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 308 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 310 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 412 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 414 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 480 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 482 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 609 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 611 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 860 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 862 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/flash/parser_pdfium_charlevel/glyph_tables.py | 11 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/flash/parser_pdfium_charlevel/glyph_tables.py | 39 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pageindex/_version.py | 9 | except Exception: | CODE |
| MEDIUM | pageindex/_version.py | 5 | def sdk_version() -> str: | CODE |
| MEDIUM | pageindex/client.py | 27 | def _import() -> None: | CODE |
| LOW | pageindex/client.py | 30 | except Exception: | CODE |
| LOW | pageindex/local_api.py | 128 | except Exception as e: | CODE |
| LOW | pageindex/local_api.py | 150 | except Exception as e: | CODE |
| MEDIUM | pageindex/utils.py | 249 | def extract_json(content): | CODE |
| LOW | pageindex/utils.py | 49 | except Exception: | CODE |
| LOW | pageindex/utils.py | 91 | except Exception: | CODE |
| LOW | pageindex/utils.py | 189 | except Exception as e: | CODE |
| LOW | pageindex/utils.py | 221 | except Exception as e: | CODE |
| LOW | pageindex/utils.py | 275 | except Exception: | CODE |
| LOW | pageindex/utils.py | 278 | except Exception as e: | CODE |
| LOW | pageindex/utils.py | 1094 | except Exception as e: | STRING |
| LOW | pageindex/utils.py | 1193 | except Exception as e: | STRING |
| LOW | pageindex/tree_optimize.py | 751 | except Exception as exc: | CODE |
| LOW | pageindex/agent_tools.py | 1162 | except Exception as exc: | CODE |
| LOW | pageindex/agent_tools.py | 1248 | except Exception as exc: # tool calls must never raise into the agent loop | CODE |
| LOW | pageindex/agent_tools.py | 1395 | except Exception as exc: | CODE |
| LOW | pageindex/local_chat.py | 252 | except Exception: | CODE |
| LOW | pageindex/local_chat.py | 290 | except Exception: | CODE |
| LOW | pageindex/local_chat.py | 582 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_parallel.py | 114 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_parallel.py | 167 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_parallel.py | 176 | except Exception: | CODE |
| LOW | pageindex/flash/api.py | 42 | except Exception as exc: # noqa: BLE001 - normalize stream capability errors | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/code_walk.py | 66 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/code_walk.py | 101 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/code_walk.py | 123 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/char_extract.py | 371 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/char_extract.py | 389 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/char_extract.py | 397 | except Exception: | CODE |
| LOW | …eindex/flash/parser_pdfium_charlevel/content_stream.py | 422 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/font_unicode.py | 224 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/font_unicode.py | 351 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/font_unicode.py | 375 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/font_unicode.py | 402 | except Exception: | CODE |
| MEDIUM | pageindex/flash/parser_pdfium_charlevel/font_unicode.py | 399 | def number(value, default): | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 65 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 69 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 81 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 100 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 232 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 267 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 279 | except Exception: | CODE |
| LOW | …geindex/flash/parser_pdfium_charlevel/unicode_apply.py | 38 | except Exception: | CODE |
| LOW | …geindex/flash/parser_pdfium_charlevel/unicode_apply.py | 60 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/pdf_objects.py | 63 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/pdf_objects.py | 165 | except Exception: | CODE |
| MEDIUM | pageindex/flash/parser_pdfium_charlevel/pdf_objects.py | 162 | def close(self) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pageindex/config.yaml | 1 | # Models — index_model indexes documents (structure and summaries), | COMMENT |
| LOW | pageindex/flash/main.py | 241 | COMMENT | |
| LOW | pageindex/flash/heading_detection/keyword_tables.py | 41 | # Whole-text lookup sets use normalized lowercase strings. The normalization is | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/code_walk.py | 181 | patches.append((chars[pos][0], token_value)) | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/code_walk.py | 221 | # table rows can contain real star glyphs adjacent to synthetic spaces. | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/merge.py | 61 | # degenerate x-column). Boundary conditions: | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/merge.py | 101 | "font_tally": {mapping["font_name"]: 1}, | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/merge.py | 181 | # Text-item box accumulation: appending a glyph only grows the item's | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/merge.py | 201 | chunk["weight_tally"][mapping["weight"]] = chunk["weight_tally"].get(mapping["weight"], 0) + 1 | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/merge.py | 221 | # reading-direction reference past it; otherwise that advance | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/merge.py | 241 | chunk["ws_pending"] = True | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/merge.py | 301 | COMMENT | |
| LOW | pageindex/flash/parser_pdfium_charlevel/merge.py | 321 | # | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/merge.py | 361 | else: | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/merge.py | 381 | or (_object_merge_id(text) != chunk["flush_id"] and not ws_bridge) | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/merge.py | 421 | # prev.glyph_w, so we see advance ≈ -prev.glyph_w. Glyph widths | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/merge.py | 441 | chunk["left"] = min(chunk["left"], text["left"]) | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/char_extract.py | 81 | ch_str = chr(codepoint) | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/char_extract.py | 101 | char_origin_x.value = 0.0; char_origin_y.value = 0.0 | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/char_extract.py | 121 | # as expected for advance-based text items). Using the ink box cumulatively under-fills | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/char_extract.py | 301 | "is_mn": candidate_item["is_mn"], | COMMENT |
| LOW | …eindex/flash/parser_pdfium_charlevel/text_normalize.py | 21 | # text extraction maps a glyph whose unicode lands on U+00AD to U+002D. (An | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/font_unicode.py | 261 | if flags_match: | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 161 | # [u] or u) -- the table lookup is then wrapped in RTL ligature reversal, which | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 181 | # that value. Emit it rather than the per-chunk minimum. | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/geometry.py | 101 | object_top = max(y00, y01, y10, y11) | COMMENT |
| LOW | pageindex/flash/parser_pdfium_charlevel/glyph_tables.py | 21 | # disagrees. | COMMENT |
| LOW | …geindex/flash/parser_pdfium_charlevel/unicode_apply.py | 121 | res = _walk_codes(chars_by_obj.get(id(obj), []), target_text_items) | COMMENT |
| LOW | …geindex/flash/parser_pdfium_charlevel/unicode_apply.py | 281 | window.append(object_index) | COMMENT |
| LOW | …geindex/flash/parser_pdfium_charlevel/unicode_apply.py | 301 | for _, font, window_end in reversed(synth_windows): | COMMENT |
| LOW | pageindex/flash/model/char_stats.py | 1 | """Character categories and per-run character statistics.""" | COMMENT |
| LOW | .github/workflows/publish.yml | 1 | name: Publish to PyPI | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pageindex/local_store.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | pageindex/__init__.py | 17 | __all__ = [ | CODE |
| LOW | pageindex/local_api.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | pageindex/flash/parser_pdfium_parallel.py | 193 | __all__ = ["parse_charlevel_meta_parallel"] | CODE |
| LOW | pageindex/flash/__init__.py | 5 | __all__ = ["page_index_flash"] | CODE |
| LOW | pageindex/flash/api.py | 251 | __all__ = ["page_index_flash"] | CODE |
| LOW | pageindex/flash/embedded_toc.py | 610 | __all__ = [ | CODE |
| LOW | pageindex/flash/main.py | 306 | __all__ = ["extract_toc", "DocumentState", "find_references", "mark_references"] | CODE |
| LOW | pageindex/flash/blocks/build.py | 87 | def _set_add(tree: SortedKeyList, block: Block) -> None: | CODE |
| LOW | pageindex/flash/blocks/__init__.py | 56 | __all__ = ["BlockClusterContext", "should_join_line_to_block", "cluster_lines_into_blocks", "split_heading_body_blocks", | CODE |
| LOW | pageindex/flash/classification/__init__.py | 125 | __all__ = [ | CODE |
| LOW | pageindex/flash/heading_detection/__init__.py | 111 | __all__ = [ | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/__init__.py | 171 | __all__ = ["parse_charlevel", "parse_charlevel_meta"] | CODE |
| LOW | pageindex/flash/title/__init__.py | 54 | __all__ = ["is_title_candidate_block", "score_title_candidate", "TitleSearchState", "TitleCandidate", "detect_title", "i | CODE |
| LOW | pageindex/flash/clustering/build.py | 118 | def _set_add(tree: SortedKeyList, line: Line) -> None: | CODE |
| LOW | pageindex/flash/clustering/__init__.py | 60 | __all__ = [ | CODE |
| LOW | pageindex/flash/labels/__init__.py | 44 | __all__ = [ | CODE |
| LOW | pageindex/flash/outline/__init__.py | 44 | __all__ = [ | CODE |
| LOW | pageindex/flash/model/__init__.py | 111 | __all__ = [ | CODE |
| LOW | pageindex/flash/outline_assembly/__init__.py | 96 | __all__ = [ | CODE |
| LOW | pageindex/flash/columns/__init__.py | 40 | __all__ = [ | CODE |
| LOW | pageindex/flash/phases/__init__.py | 41 | __all__ = [ | CODE |
| LOW | pageindex/flash/tokens/__init__.py | 94 | __all__ = [ | CODE |
| LOW | pageindex/flash/stats/__init__.py | 34 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pageindex/client.py | 457 | CODE | |
| LOW | pageindex/client.py | 1025 | CODE | |
| LOW | pageindex/client.py | 1045 | CODE | |
| LOW | pageindex/client.py | 1065 | CODE | |
| LOW | pageindex/client.py | 1085 | CODE | |
| LOW | pageindex/client.py | 1105 | CODE | |
| LOW | pageindex/client.py | 1125 | CODE | |
| LOW | pageindex/client.py | 1145 | CODE | |
| LOW | pageindex/client.py | 1165 | CODE | |
| LOW | pageindex/client.py | 1491 | CODE | |
| LOW | pageindex/client.py | 1669 | CODE | |
| LOW | pageindex/client.py | 1766 | CODE | |
| LOW | pageindex/client.py | 2690 | CODE | |
| LOW | pageindex/utils.py | 741 | CODE | |
| LOW | pageindex/page_index_md.py | 245 | CODE | |
| LOW | pageindex/page_index_classic.py | 1290 | CODE | |
| LOW | pageindex/tree_optimize.py | 878 | CODE | |
| LOW | pageindex/local_chat.py | 335 | CODE | |
| LOW | pageindex/local_chat.py | 637 | CODE | |
| LOW | pageindex/local_chat.py | 908 | CODE | |
| LOW | pageindex/local_chat.py | 941 | CODE | |
| LOW | pageindex/local_chat.py | 1043 | CODE | |
| LOW | pageindex/local_chat.py | 1363 | CODE | |
| LOW | pageindex/flash/api.py | 180 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 14 | # PageIndex: Vectorless, Reasoning-based RAG | COMMENT |
| MEDIUM | README.md | 62 | ### Compare with Vector RAG | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pageindex/utils.py | 362 | # Check if the node is a leaf node | COMMENT |
| LOW | pageindex/utils.py | 678 | # Check if item is a dictionary and has 'physical_index' key | COMMENT |
| LOW | pageindex/page_index_classic.py | 937 | # Check if list_index is valid | COMMENT |
| LOW | pageindex/page_index_classic.py | 991 | # Check if the result is correct | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pageindex/page_index_md.py | 283 | # Create a clean structure without unnecessary fields for description generation | COMMENT |
| MEDIUM | pageindex/page_index_classic.py | 1270 | # Create a clean structure without unnecessary fields for description generation | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_local_chat.py | 2049 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pageindex/flash/data/boilerplate_phrases.json | 1 | ["ヌ ク ャ O 轗 ゙ 紗 礇 蕃 芸 タ k r Т ニ 招 b ム X キ 妓 D 奣", "カ ュ R+ S ニ g ゥ M ィ 鋕 S c テツ テ ヨ 黷 フヌ ル J z F ミ e2Tz", "ウ 畍 ノ 斡 泥 ヤ 宋 | CODE |
| LOW | pageindex/flash/data/boilerplate_phrases.json | 1 | ["ヌ ク ャ O 轗 ゙ 紗 礇 蕃 芸 タ k r Т ニ 招 b ム X キ 妓 D 奣", "カ ュ R+ S ニ g ゥ M ィ 鋕 S c テツ テ ヨ 黷 フヌ ル J z F ミ e2Tz", "ウ 畍 ノ 斡 泥 ヤ 宋 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/scripts/comment-on-duplicates.sh | 5 | # Usage: | COMMENT |