📑 PageIndex: Document Index for Vectorless, Reasoning-based RAG
This report presents the forensic synthetic code analysis of VectifyAI/PageIndex, a Python project with 35,370 GitHub stars. SynthScan v2.0 examined 41,527 lines of code across 141 source files, recording 2664 pattern matches distributed across 17 syntactic categories. The overall adjusted score of 49.8 places this repository in the Strong AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 2664 distinct pattern matches across 17 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | run_pageindex.py | 4 | CODE | |
| LOW | tests/test_flash_extraction.py | 69 | CODE | |
| LOW | tests/test_flash_extraction.py | 221 | CODE | |
| LOW | tests/test_local_chat.py | 51 | CODE | |
| LOW | tests/test_issue_163.py | 4 | CODE | |
| LOW | pageindex/_version.py | 2 | CODE | |
| LOW | pageindex/client.py | 2 | CODE | |
| LOW | pageindex/client.py | 71 | CODE | |
| LOW | pageindex/client.py | 32 | CODE | |
| LOW | pageindex/client.py | 1627 | CODE | |
| LOW | pageindex/local_store.py | 2 | CODE | |
| LOW | pageindex/__init__.py | 4 | CODE | |
| LOW | pageindex/__init__.py | 4 | CODE | |
| LOW | pageindex/__init__.py | 4 | CODE | |
| LOW | pageindex/__init__.py | 5 | CODE | |
| LOW | pageindex/__init__.py | 6 | CODE | |
| LOW | pageindex/__init__.py | 6 | CODE | |
| LOW | pageindex/__init__.py | 6 | CODE | |
| LOW | pageindex/__init__.py | 6 | CODE | |
| LOW | pageindex/__init__.py | 10 | CODE | |
| LOW | pageindex/__init__.py | 11 | CODE | |
| LOW | pageindex/__init__.py | 11 | CODE | |
| LOW | pageindex/__init__.py | 12 | CODE | |
| LOW | pageindex/__init__.py | 13 | CODE | |
| LOW | pageindex/types.py | 12 | CODE | |
| LOW | pageindex/mcp_bridge.py | 12 | 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/local_chat.py | 2 | CODE | |
| LOW | pageindex/local_chat.py | 170 | CODE | |
| LOW | pageindex/local_chat.py | 877 | CODE | |
| LOW | pageindex/local_chat.py | 878 | CODE | |
| LOW | pageindex/integrations/anthropic_sdk.py | 10 | CODE | |
| LOW | pageindex/integrations/openai_agents.py | 12 | 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 | |
| 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 | |
| 1890 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| 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_optimize_full_keyless_reports_file_errors_first(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 84 | def test_empty_outline_gate_carries_page_texts(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 98 | def test_propose_children_clamps_to_loaded_pages(monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 125 | def test_bootstrap_reimport_is_not_swallowed(monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 156 | def test_pool_construction_failure_falls_back_sequential(monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 180 | def test_submit_document_refuses_during_bootstrap(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 193 | def test_unguarded_script_parses_parallel_without_reexecution(tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 217 | def test_optimize_wins_over_deprecated_optimize_expand(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 254 | def test_lone_surrogate_from_broken_tounicode_is_replaced(monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 280 | def test_lone_surrogate_targets_never_patched_into_chars(): | CODE |
| LOW | tests/test_flash_extraction.py | 294 | def test_lone_surrogate_from_single_byte_map_is_replaced(): | CODE |
| LOW | tests/test_flash_extraction.py | 309 | def test_anonymous_main_overlapping_windows_restore(monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 351 | def test_optimize_full_skips_expand_without_page_texts(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 376 | def test_optimize_full_skips_expand_on_textless_pages(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_flash_extraction.py | 402 | def test_optimize_expand_warning_names_the_behavior_change(tmp_path, | CODE |
| LOW | tests/test_flash_extraction.py | 445 | def test_flash_cli_summary_model_follows_config_chain(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_flash_extraction.py | 464 | def test_flash_cli_rejects_empty_structure(monkeypatch, tmp_path): | CODE |
| LOW⚡ | tests/test_local_chat.py | 1111 | def test_responses_envelope_echoes_reasoning(client, store_path, fake_model): | CODE |
| LOW⚡ | tests/test_local_chat.py | 1121 | def test_responses_input_validation(client, fake_model): | CODE |
| LOW⚡ | tests/test_local_chat.py | 1129 | def test_doc_id_scopes_tools_to_targeted_documents(client, store_path, | CODE |
| LOW | tests/test_local_chat.py | 191 | def test_chat_completions_end_to_end(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 219 | def test_chat_completions_system_and_doc_block(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 232 | def test_chat_completions_accepts_query_string(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 243 | def test_chat_completions_validation(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 261 | def test_chat_completions_stream_modes(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 279 | def test_chat_completions_missing_framework(client, monkeypatch): | CODE |
| LOW | tests/test_local_chat.py | 316 | def test_anthropic_routed_models_mark_managed_prefix_for_cache( | CODE |
| LOW | tests/test_local_chat.py | 336 | def test_status_recorder_attaches_to_the_real_responses_model(monkeypatch): | CODE |
| LOW | tests/test_local_chat.py | 352 | def test_cache_marker_reaches_the_anthropic_wire(client, store_path, | CODE |
| LOW | tests/test_local_chat.py | 399 | def test_chat_returns_answer_string(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 411 | def test_chat_stream_yields_text_chunks(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 417 | def test_chat_multi_turn_history(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 429 | def test_chat_reasoning_effort_reaches_the_engine(client, store_path, | CODE |
| LOW | tests/test_local_chat.py | 450 | def test_chat_cloud_unwraps_envelope(monkeypatch): | CODE |
| LOW | tests/test_local_chat.py | 465 | def test_responses_end_to_end(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 491 | def test_responses_round_trip_extends_prefix(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 511 | def test_responses_round_trip_prefix_with_doc_id(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 531 | def test_doc_id_conversations_get_distinct_cache_keys(client, store_path, | CODE |
| LOW | tests/test_local_chat.py | 574 | def test_responses_stream_passthrough(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 602 | def test_responses_stream_opens_with_created(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 626 | def test_responses_envelope_validates_as_official_response(client, store_path, | CODE |
| LOW | tests/test_local_chat.py | 644 | def test_responses_stream_events_validate_as_official_events( | CODE |
| LOW | tests/test_local_chat.py | 753 | def test_messages_doc_block_and_system(client, store_path, fake_anthropic): | CODE |
| LOW | tests/test_local_chat.py | 766 | def test_messages_stream_passthrough(client, store_path, fake_anthropic): | CODE |
| LOW | tests/test_local_chat.py | 797 | def test_messages_accepts_query_string(client, fake_anthropic): | CODE |
| LOW | tests/test_local_chat.py | 823 | def test_messages_raises_when_runner_params_unreadable(client, fake_anthropic, | CODE |
| LOW | tests/test_local_chat.py | 839 | def test_messages_missing_framework(client, monkeypatch): | CODE |
| LOW | tests/test_local_chat.py | 874 | def test_max_turns_rejects_non_positive(client, store_path, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 885 | def test_enable_citations_rejected_before_framework_check(client, monkeypatch): | CODE |
| LOW | tests/test_local_chat.py | 901 | def test_chat_stream_role_chunk_even_with_empty_output(client, fake_model): | CODE |
| LOW | tests/test_local_chat.py | 911 | def test_responses_stream_single_completed_monotonic_sequence( | CODE |
| LOW | tests/test_local_chat.py | 931 | def test_responses_envelope_fields_and_cache_group(client, store_path, | CODE |
| LOW | tests/test_local_chat.py | 946 | def test_sol_class_refusal_names_its_exits(): | CODE |
| LOW | tests/test_local_chat.py | 965 | def test_conversation_cache_key_stable_per_conversation(): | CODE |
| LOW | tests/test_local_chat.py | 987 | def test_agent_carries_prompt_cache_key_in_extra_body(monkeypatch): | CODE |
| LOW | tests/test_local_chat.py | 1017 | def test_reasoning_passthrough_reaches_each_engine(monkeypatch): | CODE |
| LOW | tests/test_local_chat.py | 1052 | def test_extra_body_passthrough_reaches_each_engine(monkeypatch): | CODE |
| LOW | tests/test_local_chat.py | 1082 | def test_sampling_knobs_ride_model_settings(client, store_path, fake_model, | CODE |
| LOW | tests/test_local_chat.py | 1153 | def test_empty_doc_id_is_refused(client, store_path): | CODE |
| 404 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/agentic_vectorless_rag_demo.py | 45 | CODE | |
| LOW | examples/agentic_vectorless_rag_demo.py | 58 | CODE | |
| LOW | pageindex/cloud_api.py | 254 | CODE | |
| LOW | pageindex/cloud_api.py | 284 | CODE | |
| LOW | pageindex/mcp_bridge.py | 201 | CODE | |
| LOW | pageindex/utils.py | 301 | CODE | |
| LOW | pageindex/utils.py | 319 | CODE | |
| LOW | pageindex/utils.py | 515 | CODE | |
| LOW | pageindex/utils.py | 654 | CODE | |
| LOW | pageindex/utils.py | 321 | CODE | |
| LOW | pageindex/page_index_md.py | 32 | CODE | |
| LOW | pageindex/page_index_md.py | 137 | CODE | |
| LOW | pageindex/page_index_classic.py | 430 | CODE | |
| LOW | pageindex/page_index_classic.py | 468 | CODE | |
| LOW | pageindex/page_index_classic.py | 813 | CODE | |
| LOW | pageindex/page_index_classic.py | 853 | CODE | |
| LOW | pageindex/page_index_classic.py | 1293 | CODE | |
| LOW | pageindex/tree_optimize.py | 133 | CODE | |
| LOW | pageindex/agent_tools.py | 531 | CODE | |
| LOW | pageindex/agent_tools.py | 832 | CODE | |
| LOW | pageindex/local_chat.py | 58 | CODE | |
| LOW | pageindex/local_chat.py | 695 | CODE | |
| LOW | pageindex/local_chat.py | 1007 | CODE | |
| LOW | pageindex/local_chat.py | 788 | 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 | 429 | 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 | 342 | 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/pipeline.py | 52 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/pipeline.py | 210 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/geometry.py | 46 | CODE | |
| LOW | pageindex/flash/parser_pdfium_charlevel/geometry.py | 197 | CODE | |
| 27 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_local_chat.py | 769 | 'data: {"type":"message_start","message":{"id":"msg_1","type":"message","role":"assistant","model":"claude-test" | CODE |
| HIGH | tests/test_local_chat.py | 781 | 'data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"output_tokens": | CODE |
| HIGH | tests/test_agent_tools.py | 1859 | """A 200 body of null, a batched array, or an SSE string frame must | STRING |
| HIGH | pageindex/utils.py | 395 | # In Linux, only '/' and '\0' (null) are invalid in filenames. | COMMENT |
| HIGH | pageindex/agent_tools.py | 1334 | # 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 | 220 | stack.push(stack_outline_node) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pageindex/tree_optimize.py | 94 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 96 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 151 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 153 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 227 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 229 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 293 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 295 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 397 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 399 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 465 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 467 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 592 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 594 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 761 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pageindex/tree_optimize.py | 763 | # -------------------------------------------------------------------------- | 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 |
| LOW | pageindex/client.py | 33 | except Exception: | CODE |
| MEDIUM | pageindex/client.py | 30 | def _import() -> None: | CODE |
| LOW | pageindex/local_api.py | 112 | except Exception as e: | CODE |
| LOW | pageindex/local_api.py | 138 | except Exception as e: | CODE |
| MEDIUM | pageindex/utils.py | 227 | def extract_json(content): | CODE |
| LOW | pageindex/utils.py | 45 | except Exception: | CODE |
| LOW | pageindex/utils.py | 168 | except Exception as e: | CODE |
| LOW | pageindex/utils.py | 199 | except Exception as e: | CODE |
| LOW | pageindex/utils.py | 253 | except Exception: | CODE |
| LOW | pageindex/utils.py | 256 | except Exception as e: | CODE |
| LOW | pageindex/utils.py | 922 | except Exception as e: | STRING |
| LOW | pageindex/utils.py | 982 | except Exception as e: | STRING |
| LOW | pageindex/tree_optimize.py | 674 | except Exception as exc: | CODE |
| LOW | pageindex/agent_tools.py | 1160 | except Exception as exc: | CODE |
| LOW | pageindex/agent_tools.py | 1246 | except Exception as exc: # tool calls must never raise into the agent loop | CODE |
| LOW | pageindex/agent_tools.py | 1372 | except Exception as exc: | CODE |
| LOW | pageindex/local_chat.py | 249 | except Exception: | CODE |
| LOW | pageindex/local_chat.py | 284 | except Exception: | CODE |
| LOW | pageindex/local_chat.py | 529 | except Exception: | CODE |
| LOW | pageindex/local_chat.py | 1001 | 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 | 37 | 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 | 363 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/char_extract.py | 381 | except Exception: | CODE |
| LOW | pageindex/flash/parser_pdfium_charlevel/char_extract.py | 389 | 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/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 | 37 | 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 | 261 | # the used-as-heading flag so heading collection skips claimed caption/section bodies. | 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_cf": candidate_item["is_cf"], | 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 | 81 | if target_text_items is None: | COMMENT |
| LOW | …geindex/flash/parser_pdfium_charlevel/unicode_apply.py | 121 | # Skipped targets are glyphs PDFium never emitted; record | COMMENT |
| LOW | …geindex/flash/parser_pdfium_charlevel/unicode_apply.py | 241 | # Page-scope last resort: scattered same-glyph labels (dense math-heavy page's | COMMENT |
| LOW | …geindex/flash/parser_pdfium_charlevel/unicode_apply.py | 261 | if synth_sites: | 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 | 15 | __all__ = [ | CODE |
| LOW | pageindex/local_api.py | 17 | 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 | 146 | __all__ = ["page_index_flash"] | CODE |
| LOW | pageindex/flash/embedded_toc.py | 610 | __all__ = [ | CODE |
| LOW | pageindex/flash/main.py | 333 | __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 | 98 | __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 | 338 | CODE | |
| LOW | pageindex/client.py | 803 | CODE | |
| LOW | pageindex/client.py | 943 | CODE | |
| LOW | pageindex/client.py | 1036 | CODE | |
| LOW | pageindex/client.py | 1645 | CODE | |
| LOW | pageindex/utils.py | 722 | CODE | |
| LOW | pageindex/page_index_md.py | 245 | CODE | |
| LOW | pageindex/page_index_classic.py | 1282 | CODE | |
| LOW | pageindex/tree_optimize.py | 771 | CODE | |
| LOW | pageindex/local_chat.py | 299 | CODE | |
| LOW | pageindex/local_chat.py | 584 | CODE | |
| LOW | pageindex/local_chat.py | 695 | CODE | |
| LOW | pageindex/local_chat.py | 1007 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 14 | # PageIndex: Vectorless, Reasoning-based RAG | COMMENT |
| MEDIUM | README.md | 63 | ### Compare with Vector RAG | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/agentic_vectorless_rag_demo.py | 127 | # Step 1: Index PDF and view tree structure | COMMENT |
| LOW⚡ | examples/agentic_vectorless_rag_demo.py | 143 | # Step 2: View document metadata | COMMENT |
| LOW⚡ | examples/agentic_vectorless_rag_demo.py | 150 | # Step 3: Agent Query | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/agentic_vectorless_rag_demo.py | 127 | # Step 1: Index PDF and view tree structure | COMMENT |
| LOW⚡ | examples/agentic_vectorless_rag_demo.py | 143 | # Step 2: View document metadata | COMMENT |
| LOW⚡ | examples/agentic_vectorless_rag_demo.py | 150 | # Step 3: Agent Query | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pageindex/utils.py | 340 | # Check if the node is a leaf node | COMMENT |
| LOW | pageindex/utils.py | 657 | # Check if item is a dictionary and has 'physical_index' key | COMMENT |
| LOW | pageindex/page_index_classic.py | 936 | # Check if list_index is valid | COMMENT |
| LOW | pageindex/page_index_classic.py | 990 | # 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 | 1264 | # Create a clean structure without unnecessary fields for description generation | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_local_chat.py | 1441 | 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 |