AI coding assistant skill (Claude Code, Codex, OpenCode, Cursor, Gemini CLI, and more). Turn any folder of code, SQL schemas, R scripts, shell scripts, docs, papers, images, or videos into a queryable knowledge graph. App code + database schema + infrastructure in one graph.
This report presents the forensic synthetic code analysis of safishamsi/graphify, a Python project with 85,283 GitHub stars. SynthScan v2.0 examined 172,722 lines of code across 612 source files, recording 4659 pattern matches distributed across 16 syntactic categories. The overall adjusted score of 34.1 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 4659 distinct pattern matches across 16 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 | tools/skillgen/gen.py | 730 | def _is_frontmatter_description_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 784 | def _is_content_scope_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 799 | def _is_cache_unlink_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 813 | def _is_zero_node_guard_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 839 | def _is_manifest_root_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 867 | def _is_shebang_allowlist_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 880 | def _is_obsidian_usage_comment_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 891 | def _is_uv_from_interpreter_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 905 | def _is_semantic_cache_scope_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 942 | def _is_sanctioned_monolith_diff(line: str) -> bool: | CODE |
| LOW | worked/mixed-corpus/raw/analyze.py | 239 | def _cross_community_surprises( | CODE |
| LOW | worked/httpx/raw/utils.py | 55 | def obfuscate_sensitive_headers(headers: dict) -> dict: | CODE |
| LOW | tests/test_extract_cli.py | 20 | def test_extract_exits_nonzero_when_all_semantic_chunks_fail( | CODE |
| LOW | tests/test_extract_cli.py | 81 | def test_extract_succeeds_when_at_least_one_chunk_completes( | CODE |
| LOW | tests/test_extract_cli.py | 160 | def test_extract_codeonly_succeeds_without_api_key(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 187 | def test_extract_out_keeps_project_root_clean(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 224 | def test_extract_without_key_still_errors_when_docs_present( | CODE |
| LOW | tests/test_extract_cli.py | 252 | def test_extract_timing_flag_emits_stage_timings(monkeypatch, tmp_path, capsys): | CODE |
| LOW⚡ | tests/test_semantic_similarity.py | 13 | def _make_extraction_with_semantic_edge(): | CODE |
| LOW⚡ | tests/test_semantic_similarity.py | 68 | def test_semantic_edge_survives_build_from_json(): | CODE |
| LOW⚡ | tests/test_semantic_similarity.py | 75 | def test_semantic_edge_nodes_present(): | CODE |
| LOW⚡ | tests/test_semantic_similarity.py | 85 | def test_semantic_edge_confidence_score_preserved(): | CODE |
| LOW⚡ | tests/test_semantic_similarity.py | 97 | def test_semantic_edge_scores_higher_than_references(): | CODE |
| LOW⚡ | tests/test_semantic_similarity.py | 129 | def _make_report_with_semantic_surprise(): | CODE |
| LOW⚡ | tests/test_semantic_similarity.py | 151 | def test_report_renders_semantically_similar_tag(): | CODE |
| LOW⚡ | tests/test_semantic_similarity.py | 156 | def test_report_semantic_tag_on_correct_line(): | CODE |
| LOW⚡ | tests/test_semantic_similarity.py | 166 | def test_report_no_semantic_tag_for_other_relations(): | CODE |
| LOW | tests/test_semantic_similarity.py | 39 | def _make_graph_with_semantic_edge(): | CODE |
| LOW | tests/test_semantic_similarity.py | 113 | def test_semantic_edge_reason_mentions_similarity(): | CODE |
| LOW | tests/test_word_count_cache.py | 12 | def test_word_count_cached_until_file_changes(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_word_count_cache.py | 37 | def test_word_count_augments_existing_hash_entry(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_openai_custom_endpoint.py | 12 | def test_openai_defaults_without_env(monkeypatch): | CODE |
| LOW | tests/test_openai_custom_endpoint.py | 24 | def test_openai_base_url_and_model_env_override(monkeypatch): | CODE |
| LOW | tests/test_openai_custom_endpoint.py | 36 | def test_graphify_openai_model_wins_over_openai_model(monkeypatch): | CODE |
| LOW⚡ | tests/test_multigraph_diagnostics.py | 106 | def test_diagnose_extraction_accepts_node_link_links_key() -> None: | CODE |
| LOW⚡ | tests/test_multigraph_diagnostics.py | 116 | def test_diagnose_extraction_does_not_mutate_input() -> None: | CODE |
| LOW⚡ | tests/test_multigraph_diagnostics.py | 125 | def test_diagnose_extraction_handles_malformed_shapes_without_crashing() -> None: | CODE |
| LOW⚡ | tests/test_multigraph_diagnostics.py | 269 | def test_scan_producer_suppression_sites_handles_unknown_tuple_arity(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/test_multigraph_diagnostics.py | 279 | def test_diagnose_file_rejects_oversized_graph(monkeypatch, tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/test_multigraph_diagnostics.py | 288 | def test_diagnose_file_rejects_non_object_json(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/test_multigraph_diagnostics.py | 296 | def test_diagnose_file_defaults_to_json_directed_flag(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 87 | def test_diagnose_extraction_categorizes_same_endpoint_collapse() -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 153 | def test_diagnose_extraction_handles_non_list_nodes_and_edges() -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 164 | def test_diagnose_extraction_bounds_examples() -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 171 | def test_diagnose_extraction_stops_examples_at_requested_limit() -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 189 | def test_diagnose_extraction_defaults_raw_inputs_to_directed(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 199 | def test_diagnose_file_reads_json_and_formats_report(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 215 | def test_format_diagnostic_report_includes_build_and_suppression_errors( | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 235 | def test_diagnostic_json_report_is_serializable(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 248 | def test_scan_producer_suppression_sites_finds_seen_sets(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 308 | def test_diagnose_file_explicit_directed_override(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 320 | def test_scan_producer_suppression_sites_reports_missing_file(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 328 | def test_diagnose_multigraph_cli_human_output(monkeypatch, tmp_path: Path, capsys) -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 347 | def test_diagnose_multigraph_cli_undirected_override(monkeypatch, tmp_path: Path, capsys) -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 366 | def test_diagnose_multigraph_cli_max_examples_zero(monkeypatch, tmp_path: Path, capsys) -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 389 | def test_diagnose_multigraph_cli_json_output(monkeypatch, tmp_path: Path, capsys) -> None: | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 418 | def test_diagnose_multigraph_cli_usage_errors( | CODE |
| LOW | tests/test_multigraph_diagnostics.py | 434 | def test_diagnose_multigraph_cli_rejects_conflicting_direction_flags( | CODE |
| LOW | tests/test_indirect_dispatch_getattr.py | 41 | def test_getattr_string_literal_emits_indirect_call(tmp_path): | STRING |
| LOW | tests/test_indirect_dispatch_getattr.py | 59 | def test_getattr_with_default_emits(tmp_path): | STRING |
| 2671 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_semantic_similarity.py | 9 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_semantic_similarity.py | 11 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_semantic_similarity.py | 64 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_semantic_similarity.py | 66 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_semantic_similarity.py | 81 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_semantic_similarity.py | 83 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_semantic_similarity.py | 92 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_semantic_similarity.py | 95 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_semantic_similarity.py | 125 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_semantic_similarity.py | 127 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_codebuddy.py | 43 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_codebuddy.py | 45 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_codebuddy.py | 69 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_codebuddy.py | 71 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_codebuddy.py | 180 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_codebuddy.py | 182 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_codebuddy.py | 233 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_codebuddy.py | 235 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_codebuddy.py | 273 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_codebuddy.py | 275 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_codebuddy.py | 10 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_codebuddy.py | 12 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pascal.py | 145 | # ── Lazarus Form (.lfm) ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_pascal.py | 199 | # ── Lazarus Package (.lpk) ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_pascal.py | 245 | # ── Delphi Form (.dfm) ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_build_merge_hyperedges_and_prune.py | 36 | # ── #1574: hyperedge preservation ───────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_build_merge_hyperedges_and_prune.py | 97 | # ── #1571: root-less prune (absolute deleted paths vs relative node keys) ────── | COMMENT |
| MEDIUM⚡ | tests/test_dedup.py | 7 | # ── entropy gate ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_dedup.py | 19 | # ── shingles ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_dedup.py | 32 | # ── full pipeline ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_dedup.py | 123 | # ── build integration ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_dedup.py | 273 | # ── #1284: numbered siblings + cross-file file-anchored boilerplate ────────── | COMMENT |
| MEDIUM | tests/test_dedup.py | 341 | # ── #1243: JaroWinkler prefix-bonus over-merge (cross-file) ────────────────── | COMMENT |
| MEDIUM | tests/test_dedup.py | 369 | # ── #1504: cross-chunk node ID collision warning ────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_symbol_resolution.py | 331 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_symbol_resolution.py | 332 | # ── Bash source edges resolver tests ────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_symbol_resolution.py | 333 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_symbol_resolution.py | 632 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_symbol_resolution.py | 634 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 31 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 33 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 58 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 60 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 145 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 147 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 198 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 200 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 229 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 231 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 237 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 239 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 345 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_security.py | 347 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_security.py | 118 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_security.py | 120 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_querylog.py | 10 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_querylog.py | 12 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_querylog.py | 31 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_querylog.py | 33 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_querylog.py | 143 | # --------------------------------------------------------------------------- | COMMENT |
| 354 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tools/skillgen/gen.py | 241 | "### Step 4 - Build the graph and generate outputs", | CODE |
| LOW⚡ | tools/skillgen/gen.py | 242 | "### Step 5 - Save manifest, clean up, and report", | CODE |
| LOW⚡ | tools/skillgen/gen.py | 252 | "### Step 4 - Build graph and cluster", | CODE |
| LOW⚡ | tools/skillgen/gen.py | 253 | "### Step 5 - Generate report and visualization", | CODE |
| LOW | tools/skillgen/fragments/core/devin.md | 70 | ### Step 1 - Ensure graphify is installed | COMMENT |
| LOW | tools/skillgen/fragments/core/devin.md | 112 | ### Step 2 - Detect files | COMMENT |
| LOW | tools/skillgen/fragments/core/devin.md | 187 | ### Step 3 - Extract entities and relationships | COMMENT |
| LOW | tools/skillgen/fragments/core/devin.md | 453 | ### Step 4 - Build graph, cluster, analyze, generate outputs | COMMENT |
| LOW | tools/skillgen/fragments/core/devin.md | 513 | ### Step 5 - Label communities | COMMENT |
| LOW | tools/skillgen/fragments/core/devin.md | 553 | ### Step 6 - Generate Obsidian vault (opt-in) + HTML | COMMENT |
| LOW | tools/skillgen/fragments/core/devin.md | 667 | ### Step 7 - Neo4j export (only if --neo4j or --neo4j-push flag) | COMMENT |
| LOW | tools/skillgen/fragments/core/devin.md | 767 | ### Step 8 - Token reduction benchmark (only if total_words > 5000) | COMMENT |
| LOW | tools/skillgen/fragments/core/devin.md | 787 | ### Step 9 - Save manifest, update cost tracker, clean up, and report | COMMENT |
| LOW⚡ | tools/skillgen/fragments/core/core.md | 58 | ### Step 0 - GitHub repos and multi-path merge (only if a URL or several paths) | COMMENT |
| LOW⚡ | tools/skillgen/fragments/core/core.md | 62 | ### Step 1 - Ensure graphify is installed | COMMENT |
| LOW⚡ | tools/skillgen/fragments/core/core.md | 66 | ### Step 2 - Detect files | COMMENT |
| LOW | tools/skillgen/fragments/core/core.md | 107 | ### Step 3 - Extract entities and relationships | COMMENT |
| LOW | tools/skillgen/fragments/core/core.md | 323 | ### Step 4 - Build graph, cluster, analyze, generate outputs | COMMENT |
| LOW | tools/skillgen/fragments/core/core.md | 412 | ### Step 5 - Label communities | COMMENT |
| LOW | tools/skillgen/fragments/core/core.md | 453 | ### Step 6 - Generate Obsidian vault (opt-in) + HTML | COMMENT |
| LOW | tools/skillgen/fragments/core/core.md | 479 | ### Step 9 - Save manifest, update cost tracker, clean up, and report | COMMENT |
| LOW | tools/skillgen/fragments/core/aider.md | 59 | ### Step 1 - Ensure graphify is installed | COMMENT |
| LOW | tools/skillgen/fragments/core/aider.md | 99 | ### Step 2 - Detect files | COMMENT |
| LOW | tools/skillgen/fragments/core/aider.md | 174 | ### Step 3 - Extract entities and relationships | COMMENT |
| LOW | tools/skillgen/fragments/core/aider.md | 388 | ### Step 4 - Build graph, cluster, analyze, generate outputs | COMMENT |
| LOW | tools/skillgen/fragments/core/aider.md | 448 | ### Step 5 - Label communities | COMMENT |
| LOW | tools/skillgen/fragments/core/aider.md | 488 | ### Step 6 - Generate Obsidian vault (opt-in) + HTML | COMMENT |
| LOW | tools/skillgen/fragments/core/aider.md | 548 | ### Step 7 - Neo4j export (only if --neo4j or --neo4j-push flag) | COMMENT |
| LOW | tools/skillgen/fragments/core/aider.md | 649 | ### Step 8 - Token reduction benchmark (only if total_words > 5000) | COMMENT |
| LOW | tools/skillgen/fragments/core/aider.md | 669 | ### Step 9 - Save manifest, update cost tracker, clean up, and report | COMMENT |
| LOW | …illgen/fragments/references/shared/github-and-merge.md | 5 | ### Step 0 - Clone GitHub repo(s) (only if a GitHub URL was given) | COMMENT |
| LOW | tools/skillgen/fragments/references/shared/exports.md | 15 | ### Step 7 - Neo4j export (only if --neo4j or --neo4j-push flag) | COMMENT |
| LOW | tools/skillgen/fragments/references/shared/exports.md | 79 | ### Step 8 - Token reduction benchmark (only if total_words > 5000) | COMMENT |
| LOW | …pected/graphify__skills__codex__references__exports.md | 15 | ### Step 7 - Neo4j export (only if --neo4j or --neo4j-push flag) | COMMENT |
| LOW | …pected/graphify__skills__codex__references__exports.md | 79 | ### Step 8 - Token reduction benchmark (only if total_words > 5000) | COMMENT |
| LOW | …raphify__skills__kilo__references__github-and-merge.md | 5 | ### Step 0 - Clone GitHub repo(s) (only if a GitHub URL was given) | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-trae.md | 61 | ### Step 0 - GitHub repos and multi-path merge (only if a URL or several paths) | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-trae.md | 65 | ### Step 1 - Ensure graphify is installed | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-trae.md | 107 | ### Step 2 - Detect files | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-trae.md | 148 | ### Step 3 - Extract entities and relationships | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-trae.md | 386 | ### Step 4 - Build graph, cluster, analyze, generate outputs | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-trae.md | 475 | ### Step 5 - Label communities | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-trae.md | 516 | ### Step 6 - Generate Obsidian vault (opt-in) + HTML | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-trae.md | 542 | ### Step 9 - Save manifest, update cost tracker, clean up, and report | COMMENT |
| LOW | …ify__skills__opencode__references__github-and-merge.md | 5 | ### Step 0 - Clone GitHub repo(s) (only if a GitHub URL was given) | COMMENT |
| LOW | …hify__skills__windows__references__github-and-merge.md | 5 | ### Step 0 - Clone GitHub repo(s) (only if a GitHub URL was given) | COMMENT |
| LOW | …cted/graphify__skills__windows__references__exports.md | 15 | ### Step 7 - Neo4j export (only if --neo4j or --neo4j-push flag) | COMMENT |
| LOW | …cted/graphify__skills__windows__references__exports.md | 79 | ### Step 8 - Token reduction benchmark (only if total_words > 5000) | COMMENT |
| LOW | …cted/graphify__skills__copilot__references__exports.md | 15 | ### Step 7 - Neo4j export (only if --neo4j or --neo4j-push flag) | COMMENT |
| LOW | …cted/graphify__skills__copilot__references__exports.md | 79 | ### Step 8 - Token reduction benchmark (only if total_words > 5000) | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 61 | ### Step 0 - GitHub repos and multi-path merge (only if a URL or several paths) | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 65 | ### Step 1 - Ensure graphify is installed | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 129 | ### Step 2 - Detect files | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 170 | ### Step 3 - Extract entities and relationships | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 410 | ### Step 4 - Build graph, cluster, analyze, generate outputs | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 499 | ### Step 5 - Label communities | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 540 | ### Step 6 - Generate Obsidian vault (opt-in) + HTML | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 566 | ### Step 9 - Save manifest, update cost tracker, clean up, and report | COMMENT |
| LOW | …hify__skills__copilot__references__github-and-merge.md | 5 | ### Step 0 - Clone GitHub repo(s) (only if a GitHub URL was given) | COMMENT |
| LOW | …ted/graphify__skills__opencode__references__exports.md | 15 | ### Step 7 - Neo4j export (only if --neo4j or --neo4j-push flag) | COMMENT |
| 340 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_java_type_resolution.py | 91 | " public boolean validateCurrency(String c) { return c.length() == 3; }\n" | CODE |
| HIGH | tests/test_java_type_resolution.py | 217 | " public Map<String, Object> lookup(Long id) { return null; }\n" | CODE |
| HIGH | tests/test_java_type_resolution.py | 218 | " public java.util.Optional<Boolean> flag() { return null; }\n" | CODE |
| HIGH⚡ | tests/test_java_type_resolution.py | 246 | " public OrderDto first() { return null; }\n" | CODE |
| HIGH | tests/test_languages.py | 425 | " return null;\n" | CODE |
| HIGH | tests/test_dart.py | 483 | context.router.push(ProfileRoute()); | CODE |
| HIGH⚡ | tests/test_hook_guard.py | 80 | "cd findings && ls", # 'find' without a trailing space is not a match | CODE |
| HIGH⚡ | tests/test_hooks.py | 454 | assert 'cd "$(git rev-parse --git-dir 2>/dev/null)" 2>/dev/null && pwd' in script | CODE |
| HIGH⚡ | tests/test_hooks.py | 454 | assert 'cd "$(git rev-parse --git-dir 2>/dev/null)" 2>/dev/null && pwd' in script | CODE |
| HIGH⚡ | tests/test_java_member_calls.py | 146 | " { AuditLog service = null; service.charge(); }\n" | CODE |
| HIGH⚡ | tests/test_java_member_calls.py | 149 | " new Object() { void nested() { AuditLog service = null; } };\n" | CODE |
| HIGH⚡ | tests/test_java_member_calls.py | 213 | " void run(int value) { PaymentGateway service = null; service.charge(); }\n" | CODE |
| HIGH⚡ | tests/test_java_member_calls.py | 214 | " void run(String value) { AuditLog service = null; service.charge(); }\n" | CODE |
| HIGH | tests/test_cross_language_call_resolution.py | 48 | " return null;\n" | CODE |
| HIGH⚡ | tests/test_extract.py | 862 | " render() { return null; }\n" | CODE |
| HIGH⚡ | graphify/hooks.py | 47 | if [ -n "$_FROM_FILE" ] && [ -x "$_FROM_FILE" ] && "$_FROM_FILE" -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 54 | GRAPHIFY_BIN=$(command -v graphify 2>/dev/null) | CODE |
| HIGH⚡ | graphify/hooks.py | 61 | if [ -x "$_GFY_BINDIR/../python.exe" ] && "$_GFY_BINDIR/../python.exe" -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 63 | elif [ -x "$_GFY_BINDIR/python.exe" ] && "$_GFY_BINDIR/python.exe" -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 85 | if [ -n "$GRAPHIFY_PYTHON" ] && ! "$GRAPHIFY_PYTHON" -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 92 | if command -v python3 >/dev/null 2>&1 && python3 -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 92 | if command -v python3 >/dev/null 2>&1 && python3 -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 94 | elif command -v python >/dev/null 2>&1 && python -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 94 | elif command -v python >/dev/null 2>&1 && python -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH | graphify/hooks.py | 35 | if [ -n "$_PINNED" ] && [ -x "$_PINNED" ] && "$_PINNED" -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 254 | _GFY_GITDIR=$(cd "$(git rev-parse --git-dir 2>/dev/null)" 2>/dev/null && pwd) | STRING |
| HIGH⚡ | graphify/hooks.py | 254 | _GFY_GITDIR=$(cd "$(git rev-parse --git-dir 2>/dev/null)" 2>/dev/null && pwd) | STRING |
| HIGH⚡ | graphify/hooks.py | 255 | _GFY_COMMONDIR=$(cd "$(git rev-parse --git-common-dir 2>/dev/null)" 2>/dev/null && pwd) | STRING |
| HIGH⚡ | graphify/hooks.py | 255 | _GFY_COMMONDIR=$(cd "$(git rev-parse --git-common-dir 2>/dev/null)" 2>/dev/null && pwd) | STRING |
| HIGH⚡ | graphify/hooks.py | 282 | GIT_DIR=${GIT_DIR:-$(git rev-parse --git-dir 2>/dev/null)} | STRING |
| HIGH⚡ | graphify/hooks.py | 291 | CHANGED=$(git diff --name-only HEAD~1 HEAD 2>/dev/null || git diff --name-only HEAD 2>/dev/null) | STRING |
| HIGH⚡ | graphify/hooks.py | 291 | CHANGED=$(git diff --name-only HEAD~1 HEAD 2>/dev/null || git diff --name-only HEAD 2>/dev/null) | STRING |
| HIGH | graphify/hooks.py | 351 | GIT_DIR=${GIT_DIR:-$(git rev-parse --git-dir 2>/dev/null)} | STRING |
| HIGH | graphify/llm.py | 437 | {"nodes":[{"id":"stem_entity","label":"Human Readable Name","file_type":"code|document|paper|image|rationale|concept","s | CODE |
| HIGH | graphify/llm.py | 1668 | null, or unparseable content (typical of a local Ollama under load). | STRING |
| HIGH | graphify/callflow_html.py | 1879 | const rawWidth = svg.viewBox && svg.viewBox.baseVal && svg.viewBox.baseVal.width | CODE |
| HIGH⚡ | graphify/tree_html.py | 357 | function collapseBranch(d) {{ if (d.children) {{ d._children = d.children; d._children.forEach(collapseBranch); d.ch | CODE |
| HIGH⚡ | graphify/tree_html.py | 358 | function expandBranch(d) {{ if (d._children) {{ d.children = d._children; d._children = null; }} if (d.children) {{ | CODE |
| HIGH⚡ | graphify/tree_html.py | 361 | window.resetView = () => {{ if (rootNode.children) {{ rootNode.children.forEach(d_child => {{ if (d_child.children | | CODE |
| HIGH⚡ | graphify/tree_html.py | 361 | window.resetView = () => {{ if (rootNode.children) {{ rootNode.children.forEach(d_child => {{ if (d_child.children | | CODE |
| HIGH⚡ | graphify/tree_html.py | 383 | .attr('class', d => "node" + (d.children || d._children ? " node--internal" : " node--leaf") + (d._children ? " | CODE |
| HIGH⚡ | graphify/tree_html.py | 385 | .on('click', (event, d) => {{ if (d.children) {{ d._children = d.children; d.children = null; }} else if (d._chi | CODE |
| HIGH⚡ | graphify/tree_html.py | 386 | .style('cursor', d => (d.children || d._children) ? 'pointer' : 'default'); | CODE |
| HIGH⚡ | graphify/tree_html.py | 392 | .attr('x', d => d.children || d._children ? -14 : 14) | CODE |
| HIGH⚡ | graphify/tree_html.py | 393 | .attr('text-anchor', d => d.children || d._children ? 'end' : 'start') | CODE |
| HIGH⚡ | graphify/tree_html.py | 465 | textD3.text(null); | CODE |
| HIGH⚡ | graphify/tree_html.py | 471 | if (countMatch && originalNodeText.endsWith(countMatch[0])) {{ | CODE |
| HIGH⚡ | graphify/tree_html.py | 478 | tokens.push({{ text: word, type: 'name' }}); | CODE |
| HIGH⚡ | graphify/tree_html.py | 481 | tokens.push({{ text: countPartText, type: 'count' }}); | CODE |
| HIGH⚡ | graphify/tree_html.py | 484 | if (tokens.length === 0 && originalNodeText) {{ | CODE |
| HIGH⚡ | graphify/tree_html.py | 485 | tokens.push({{ text: originalNodeText, type: 'name' }}); | CODE |
| HIGH⚡ | graphify/tree_html.py | 496 | lineTokens.push(tokenObj); | CODE |
| HIGH⚡ | graphify/tree_html.py | 499 | if (currentTspan.node().getComputedTextLength() > maxWidth && lineTokens.length > 1) {{ | CODE |
| HIGH⚡ | graphify/tree_html.py | 502 | currentTspan.text(null); | CODE |
| HIGH⚡ | graphify/tree_html.py | 516 | currentTspan.text(null); | CODE |
| HIGH⚡ | graphify/tree_html.py | 524 | if (textD3.selectAll("tspan > tspan").empty() && textD3.select("tspan").text().length === 0 && originalNodeT | CODE |
| HIGH⚡ | graphify/tree_html.py | 528 | if (t.node() && t.node().getComputedTextLength() > maxWidth && displayText.length > 20) {{ | CODE |
| HIGH | graphify/tree_html.py | 270 | if (node.total_count !== undefined) {{ | CODE |
| HIGH | graphify/tree_html.py | 284 | if (node.children && node.children.length > 0) {{ | CODE |
| HIGH | graphify/exporters/html.py | 80 | .filter(p => p !== undefined); | CODE |
| 8 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/skillgen/gen.py | 24 | CODE | |
| LOW | tools/skillgen/gen.py | 35 | CODE | |
| LOW | tools/skillgen/__main__.py | 2 | CODE | |
| LOW | worked/mixed-corpus/raw/build.py | 2 | CODE | |
| LOW | worked/mixed-corpus/raw/cluster.py | 2 | CODE | |
| LOW | worked/mixed-corpus/raw/analyze.py | 2 | CODE | |
| LOW | worked/example/raw/api.py | 5 | CODE | |
| LOW | worked/example/raw/api.py | 7 | CODE | |
| LOW | worked/httpx/raw/client.py | 7 | CODE | |
| LOW | worked/httpx/raw/client.py | 7 | CODE | |
| LOW | worked/httpx/raw/client.py | 9 | CODE | |
| LOW | worked/httpx/raw/client.py | 9 | CODE | |
| LOW | worked/httpx/raw/client.py | 10 | CODE | |
| LOW | worked/httpx/raw/utils.py | 5 | CODE | |
| LOW | tests/test_extract_cli.py | 2 | CODE | |
| LOW | tests/test_semantic_similarity.py | 5 | CODE | |
| LOW | tests/test_word_count_cache.py | 5 | CODE | |
| LOW | tests/test_multigraph_diagnostics.py | 1 | CODE | |
| LOW | tests/test_codebuddy.py | 7 | CODE | |
| LOW | tests/test_pascal.py | 2 | CODE | |
| LOW | tests/test_build_merge_hyperedges_and_prune.py | 13 | CODE | |
| LOW | tests/test_dedup.py | 2 | CODE | |
| LOW | tests/test_dedup.py | 3 | CODE | |
| LOW | tests/test_dedup.py | 186 | CODE | |
| LOW | tests/test_symbol_resolution.py | 3 | CODE | |
| LOW | tests/test_swift_import_resolution.py | 1 | CODE | |
| LOW | tests/test_security.py | 2 | CODE | |
| LOW | tests/test_security.py | 4 | CODE | |
| LOW | tests/test_security.py | 12 | CODE | |
| LOW | tests/test_security.py | 12 | CODE | |
| LOW | tests/test_vue_extraction.py | 7 | CODE | |
| LOW | tests/conftest.py | 1 | CODE | |
| LOW | tests/test_query_cli.py | 2 | CODE | |
| LOW | tests/test_semantic_id_remap_root.py | 10 | CODE | |
| LOW | tests/test_path_cli.py | 2 | CODE | |
| LOW | tests/test_path_cli.py | 4 | CODE | |
| LOW | tests/test_path_cli.py | 6 | CODE | |
| LOW | tests/test_querylog.py | 3 | CODE | |
| LOW | tests/test_zero_node_no_cache.py | 9 | CODE | |
| LOW | tests/test_zero_node_no_cache.py | 11 | CODE | |
| LOW | tests/test_hypergraph.py | 2 | CODE | |
| LOW | tests/test_hypergraph.py | 8 | CODE | |
| LOW | tests/test_mcp_ingest.py | 2 | CODE | |
| LOW | tests/test_mcp_ingest.py | 7 | CODE | |
| LOW | tests/test_google_workspace.py | 1 | CODE | |
| LOW | tests/test_install_upgrade.py | 12 | CODE | |
| LOW | tests/test_ts_import_require.py | 11 | CODE | |
| LOW | tests/test_ruby_resolution.py | 15 | CODE | |
| LOW | tests/test_ts_receiver_member_calls.py | 13 | CODE | |
| LOW | tests/test_ts_receiver_member_calls.py | 15 | CODE | |
| LOW | tests/test_astro_extraction.py | 10 | CODE | |
| LOW | tests/test_charmap_encoding.py | 14 | CODE | |
| LOW | tests/test_charmap_encoding.py | 17 | CODE | |
| LOW | tests/test_charmap_encoding.py | 18 | CODE | |
| LOW | tests/test_charmap_encoding.py | 19 | CODE | |
| LOW | tests/test_charmap_encoding.py | 20 | CODE | |
| LOW | tests/test_charmap_encoding.py | 22 | CODE | |
| LOW | tests/test_pascal_resolution.py | 23 | CODE | |
| LOW | tests/test_pascal_call_scoping.py | 11 | CODE | |
| LOW | tests/test_label_retry.py | 4 | CODE | |
| 466 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | worked/mixed-corpus/raw/cluster.py | 88 | except Exception: | CODE |
| LOW | worked/example/raw/parser.py | 77 | except Exception as e: | CODE |
| LOW | worked/httpx/raw/auth.py | 112 | except Exception: | CODE |
| LOW | worked/httpx/raw/transport.py | 78 | except Exception as exc: | CODE |
| LOW | worked/httpx/raw/transport.py | 131 | except Exception as exc: | CODE |
| LOW⚡ | tests/test_falkordb_integration.py | 34 | except Exception as e: # pragma: no cover - depends on local environment | CODE |
| LOW⚡ | tests/test_falkordb_integration.py | 44 | except Exception: | CODE |
| LOW⚡ | tests/test_falkordb_integration.py | 49 | except Exception: | CODE |
| LOW⚡ | tests/test_llm_backends.py | 692 | except Exception: | CODE |
| MEDIUM | tests/bench_extract.py | 119 | print(f"Error: {target} does not exist", file=sys.stderr) | CODE |
| LOW | …erpowers/plans/2026-05-04-incremental-updates-dedup.md | 780 | except Exception as exc: | CODE |
| LOW | …erpowers/plans/2026-05-04-incremental-updates-dedup.md | 790 | except Exception as exc: | CODE |
| LOW | …erpowers/plans/2026-05-04-incremental-updates-dedup.md | 841 | except Exception as exc: | CODE |
| LOW | …erpowers/plans/2026-05-04-incremental-updates-dedup.md | 1044 | except Exception as exc: | CODE |
| LOW | graphify/build.py | 173 | except Exception: | CODE |
| LOW | graphify/ingest.py | 112 | except Exception: | CODE |
| LOW | graphify/ingest.py | 179 | except Exception: | CODE |
| LOW | graphify/hooks.py | 144 | except Exception: | CODE |
| LOW | graphify/hooks.py | 149 | except Exception as exc: | CODE |
| LOW | graphify/hooks.py | 185 | except Exception: | CODE |
| LOW | graphify/hooks.py | 190 | except Exception as exc: | CODE |
| LOW | graphify/manifest_ingest.py | 63 | except Exception as exc: # noqa: BLE001 — a malformed manifest must not abort extraction | CODE |
| LOW | graphify/global_graph.py | 19 | except Exception as exc: | CODE |
| LOW | graphify/global_graph.py | 34 | except Exception as rename_exc: | CODE |
| LOW | graphify/diagnostics.py | 233 | except Exception as exc: | CODE |
| LOW | graphify/querylog.py | 79 | except Exception: | CODE |
| LOW | graphify/cache.py | 32 | except Exception: | CODE |
| LOW | graphify/cache.py | 137 | except Exception: | CODE |
| LOW | graphify/cache.py | 451 | except Exception: | CODE |
| MEDIUM | graphify/serve.py | 819 | def _relay() -> None: | CODE |
| LOW | graphify/serve.py | 42 | except Exception: | CODE |
| LOW | graphify/serve.py | 54 | except Exception: | CODE |
| LOW | graphify/serve.py | 826 | except Exception: | CODE |
| LOW | graphify/serve.py | 1313 | except Exception: | CODE |
| LOW | graphify/serve.py | 1350 | except Exception: | CODE |
| LOW | graphify/serve.py | 1388 | except Exception as exc: | CODE |
| LOW | graphify/serve.py | 1413 | except Exception as exc: | CODE |
| LOW | graphify/serve.py | 1427 | except Exception as exc: | CODE |
| LOW⚡ | graphify/llm.py | 2577 | except Exception: | CODE |
| LOW⚡ | graphify/llm.py | 2594 | except Exception as exc: | CODE |
| LOW | graphify/llm.py | 52 | except Exception: # network failure on first-use download, etc. | CODE |
| LOW | graphify/llm.py | 200 | except Exception: | CODE |
| LOW | graphify/llm.py | 255 | except Exception: | CODE |
| LOW | graphify/llm.py | 1711 | except Exception as exc: # noqa: BLE001 — re-raise unless it's a known context overflow | CODE |
| LOW | graphify/llm.py | 1894 | except Exception as exc: # noqa: BLE001 — caller-facing surface, log + continue | CODE |
| LOW | graphify/llm.py | 1932 | except Exception as _exc: # noqa: BLE001 — checkpoint is best-effort | CODE |
| LOW | graphify/llm.py | 2230 | except Exception: | CODE |
| LOW | graphify/llm.py | 2514 | except Exception as exc: # noqa: BLE001 - reported per-batch; surfaced below | CODE |
| LOW | graphify/multigraph_compat.py | 64 | except Exception as exc: | CODE |
| LOW | graphify/export.py | 60 | except Exception: | CODE |
| LOW | graphify/export.py | 89 | except Exception: | CODE |
| LOW | graphify/export.py | 94 | except Exception as exc: | CODE |
| LOW | graphify/export.py | 179 | except Exception: | CODE |
| LOW⚡ | graphify/export.py | 190 | except Exception: | CODE |
| LOW⚡ | graphify/export.py | 200 | except Exception: | CODE |
| LOW⚡ | graphify/export.py | 210 | except Exception as exc: | CODE |
| LOW | graphify/callflow_html.py | 236 | except Exception: | CODE |
| MEDIUM⚡ | graphify/cli.py | 288 | print("Error: --base-url, --default-model, and --env-key are required.", file=sys.stderr) | CODE |
| MEDIUM⚡ | graphify/cli.py | 292 | print(f"Error: refusing to add provider with unsafe base_url {base_url!r}.", file=sys.stderr) | CODE |
| MEDIUM | graphify/cli.py | 259 | print(f"Error: '{name}' is a built-in provider and cannot be overridden.", file=sys.stderr) | CODE |
| 133 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/skillgen/gen.py | 548 | CODE | |
| LOW | worked/example/raw/parser.py | 29 | CODE | |
| LOW | tests/test_pg_introspect.py | 16 | CODE | |
| LOW | tests/test_pg_introspect.py | 40 | CODE | |
| LOW | tests/test_multilang.py | 167 | CODE | |
| LOW | tests/test_multilang.py | 215 | CODE | |
| LOW | tests/test_multilang.py | 224 | CODE | |
| LOW | graphify/build.py | 84 | CODE | |
| LOW | graphify/build.py | 307 | CODE | |
| LOW | graphify/build.py | 383 | CODE | |
| LOW | graphify/build.py | 811 | CODE | |
| LOW | graphify/ingest.py | 13 | CODE | |
| LOW | graphify/manifest_ingest.py | 114 | CODE | |
| LOW | graphify/manifest_ingest.py | 144 | CODE | |
| LOW | graphify/benchmark.py | 40 | CODE | |
| LOW | graphify/security.py | 103 | CODE | |
| LOW | graphify/cache.py | 39 | CODE | |
| LOW | graphify/cache.py | 560 | CODE | |
| LOW | graphify/serve.py | 128 | CODE | |
| LOW | graphify/serve.py | 155 | CODE | |
| LOW | graphify/serve.py | 286 | CODE | |
| LOW | graphify/serve.py | 588 | CODE | |
| LOW | graphify/serve.py | 737 | CODE | |
| LOW | graphify/serve.py | 805 | CODE | |
| LOW | graphify/serve.py | 850 | CODE | |
| LOW | graphify/serve.py | 819 | CODE | |
| LOW | graphify/serve.py | 1366 | CODE | |
| LOW | graphify/llm.py | 223 | CODE | |
| LOW | graphify/llm.py | 804 | CODE | |
| LOW | graphify/llm.py | 957 | CODE | |
| LOW | graphify/llm.py | 1813 | CODE | |
| LOW | graphify/llm.py | 1999 | CODE | |
| LOW | graphify/export.py | 35 | CODE | |
| LOW | graphify/export.py | 116 | CODE | |
| LOW | graphify/export.py | 183 | CODE | |
| LOW | graphify/ruby_resolution.py | 52 | CODE | |
| LOW | graphify/validate.py | 10 | CODE | |
| LOW | graphify/callflow_html.py | 572 | CODE | |
| LOW | graphify/cli.py | 96 | CODE | |
| LOW | graphify/cli.py | 215 | CODE | |
| LOW | graphify/dedup.py | 192 | CODE | |
| LOW | graphify/dedup.py | 463 | CODE | |
| LOW | graphify/cluster.py | 134 | CODE | |
| LOW | graphify/pascal_resolution.py | 42 | CODE | |
| LOW | graphify/install.py | 1079 | CODE | |
| LOW | graphify/install.py | 1427 | CODE | |
| LOW | graphify/install.py | 1470 | CODE | |
| LOW | graphify/install.py | 1884 | CODE | |
| LOW | graphify/watch.py | 243 | CODE | |
| LOW | graphify/watch.py | 369 | CODE | |
| LOW | graphify/watch.py | 721 | CODE | |
| LOW | graphify/watch.py | 1171 | CODE | |
| LOW | graphify/watch.py | 279 | CODE | |
| LOW | graphify/prs.py | 298 | CODE | |
| LOW | graphify/prs.py | 348 | CODE | |
| LOW | graphify/prs.py | 584 | CODE | |
| LOW | graphify/prs.py | 677 | CODE | |
| LOW | graphify/detect.py | 59 | CODE | |
| LOW | graphify/detect.py | 240 | CODE | |
| LOW | graphify/detect.py | 460 | CODE | |
| 174 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/skillgen/platforms.toml | 1 | # skillgen platform manifest | COMMENT |
| LOW | tools/skillgen/platforms.toml | 21 | # dispatch Part-B dispatch fragment basename under fragments/dispatch/. | COMMENT |
| LOW | tools/skillgen/gen.py | 41 | FRAGMENTS_DIR = SKILLGEN_DIR / "fragments" | COMMENT |
| LOW | tools/skillgen/gen.py | 61 | """The git ref for a split host's own pre-split skill body.""" | COMMENT |
| LOW | tools/skillgen/gen.py | 141 | _QUERY_REFERENCE = "references/query/default.md" | COMMENT |
| LOW | tools/skillgen/gen.py | 201 | # | COMMENT |
| LOW | tools/skillgen/gen.py | 221 | # lives in the core or a reference under the new heading; the audit confirms | COMMENT |
| LOW | tests/test_cli_export.py | 441 | COMMENT | |
| LOW | graphify/build.py | 1 | # assemble node+edge dicts into a NetworkX graph, preserving edge direction | COMMENT |
| LOW | graphify/build.py | 601 | for ghost_id, canonical_id in _ghost_remap.items(): | COMMENT |
| LOW | graphify/build.py | 621 | # | COMMENT |
| LOW | graphify/hooks.py | 21 | # Detect the correct Python interpreter (handles uv tool, pipx, venv, system installs). | COMMENT |
| LOW | graphify/hooks.py | 261 | COMMENT | |
| LOW | graphify/hooks.py | 421 | except (configparser.Error, OSError) as exc: | COMMENT |
| LOW | graphify/paths.py | 21 | from pathlib import Path, PurePosixPath | COMMENT |
| LOW | graphify/pg_introspect.py | 61 | # 4. Query foreign keys — grouped by constraint to handle composites. | COMMENT |
| LOW | graphify/llm.py | 1021 | # Ollama defaults num_ctx to 2048 and silently truncates prompts larger | COMMENT |
| LOW | graphify/llm.py | 1221 | # zero nodes/edges, so _response_is_hollow flags it as truncation and the | COMMENT |
| LOW | graphify/llm.py | 1901 | max_concurrency = 1 | COMMENT |
| LOW | graphify/cli.py | 1081 | # Accumulate token usage from the labeling LLM calls so cluster-only mode | COMMENT |
| LOW | graphify/cli.py | 1461 | # nx.compose requires all graphs to be the same type. When input graphs | COMMENT |
| LOW | graphify/wiki.py | 281 | # Fold case in the collision check: two labels differing only by case | COMMENT |
| LOW | graphify/detect.py | 641 | out_dir.mkdir(parents=True, exist_ok=True) | COMMENT |
| LOW | graphify/detect.py | 1221 | # Dot dirs are allowed — users often want .github/, .claude/, etc. | COMMENT |
| LOW | graphify/extract.py | 2801 | ) | COMMENT |
| LOW | graphify/extract.py | 3761 | # AST-walked into per-key nodes — that floods the graph with orphan key-nodes | COMMENT |
| LOW | graphify/extract.py | 3921 | "lua": extract_lua, | COMMENT |
| LOW | graphify/extract.py | 4421 | # marker set in the per-file extractor. Populated just before the pass that uses it. | COMMENT |
| LOW | graphify/extract.py | 4441 | # the extractor saw). For a root-level file that stem picks up the absolute | COMMENT |
| LOW | graphify/extract.py | 4601 | normalised = raw.strip("()").lstrip(".") | COMMENT |
| LOW | graphify/extract.py | 4621 | # the callee's symbol id. Module imports (`imports_from`) are weaker but still | COMMENT |
| LOW | graphify/extract.py | 4801 | "confidence": "INFERRED", | COMMENT |
| LOW | graphify/__main__.py | 241 | COMMENT | |
| LOW | graphify/__main__.py | 281 | # generated by tools/skillgen and guarded by `skillgen --check`. Reading them at | COMMENT |
| LOW | graphify/exporters/html.py | 41 | .search-item:hover { background: #2a2a4e; } | COMMENT |
| LOW | graphify/extractors/pascal.py | 321 | _add_edge(module_nid, cls_nid, "contains", line) | COMMENT |
| LOW | graphify/extractors/engine.py | 2161 | # nids of function / method / class definitions in this file. The indirect- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_pipeline.py | 25 | # Step 1: detect | COMMENT |
| LOW⚡ | tests/test_pipeline.py | 31 | # Step 2: extract (AST only - no LLM) | COMMENT |
| LOW⚡ | tests/test_pipeline.py | 38 | # Step 3: build | COMMENT |
| LOW⚡ | tests/test_pipeline.py | 43 | # Step 4: cluster | COMMENT |
| LOW⚡ | tests/test_pipeline.py | 51 | # Step 5: analyze | COMMENT |
| LOW⚡ | tests/test_pipeline.py | 63 | # Step 6: report | COMMENT |
| LOW⚡ | tests/test_pipeline.py | 70 | # Step 7: export - JSON | COMMENT |
| LOW⚡ | tests/test_pipeline.py | 78 | # Step 8: export - HTML | COMMENT |
| LOW⚡ | tests/test_pipeline.py | 86 | # Step 9: export - Obsidian vault | COMMENT |
| LOW | graphify/paths.py | 206 | # Step 2: path proximity over the survivors. | COMMENT |
| LOW | graphify/analyze.py | 660 | # Step 1: Build a directed file-level graph from import/re-export edges. | COMMENT |
| LOW | graphify/analyze.py | 701 | # Step 2: Find simple cycles, bounded by length. | COMMENT |
| LOW | graphify/analyze.py | 713 | # Step 3: Sort by length (shortest = tightest coupling), then deduplicate. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_llm_backends.py | 550 | # `chat_template_kwargs.enable_thinking=false` or the model emits chain-of-thought | COMMENT |
| MEDIUM | tests/test_llm_backends.py | 252 | # produce when a chunk overflows the model's context window. | COMMENT |
| MEDIUM⚡ | tests/test_llm_backends.py | 693 | pass # mock scaffolding may not be complete; we only care about the call | CODE |
| MEDIUM⚡ | tests/test_labeling.py | 246 | # 16k context window of self-hosted reasoning models (Qwen3, Llama-3.1 8B). | COMMENT |
| MEDIUM | graphify/llm.py | 1227 | # object directly. The <untrusted_source> guardrails in _extraction_system | COMMENT |
| MEDIUM | graphify/llm.py | 2292 | # When graphify runs inside an orchestrating agent (Claude Code / Gemini CLI), | COMMENT |
| MEDIUM | graphify/cli.py | 1143 | # standalone there is no orchestrating agent to do skill.md Step 5, so | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_extract_cli.py | 35 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_extract_cli.py | 88 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW⚡ | tests/test_llm_backends.py | 178 | big.write_text(("# Section\n\n" + "lorem ipsum dolor sit amet " * 60 + "\n\n") * 30) | CODE |
| LOW⚡ | tests/test_llm_backends.py | 178 | big.write_text(("# Section\n\n" + "lorem ipsum dolor sit amet " * 60 + "\n\n") * 30) | CODE |
| LOW | tests/test_llm_backends.py | 1074 | "https://api.moonshot.ai/v1", "fake-key", "kimi-k2", | CODE |
| LOW | tests/test_llm_backends.py | 1102 | monkeypatch.setattr(llm, "_get_backend_api_key", lambda _b: "fake-key") | CODE |
| LOW | tests/test_llm_backends.py | 1130 | monkeypatch.setattr(llm, "_get_backend_api_key", lambda _b: "fake-key") | CODE |
| LOW⚡ | tests/test_labeling.py | 197 | assert source == "placeholder" | CODE |
| LOW⚡ | tests/test_labeling.py | 205 | assert source == "placeholder" | CODE |
| LOW⚡ | tests/test_file_slice.py | 28 | text = ("# Heading\n\n" + "lorem ipsum " * 40 + "\n\n") * 20 | CODE |
| LOW⚡ | graphify/llm.py | 2586 | return _placeholder_community_labels(communities), "placeholder" | CODE |
| LOW⚡ | graphify/llm.py | 2601 | return _placeholder_community_labels(communities), "placeholder" | CODE |
| LOW⚡ | graphify/llm.py | 2573 | ``"placeholder"``. Never raises.""" | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_languages.py | 1916 | # More robust: no target should contain a brace character | COMMENT |
| MEDIUM | tests/test_hook_guard.py | 21 | # Direct-call harness: hermetic w.r.t. the ambient GRAPHIFY_OUT env. | COMMENT |
| MEDIUM | graphify/extract.py | 4635 | # path.name)``). Resolving file membership by that shared string is robust | COMMENT |
| LOW | graphify/extract.py | 1218 | # Edge target already a real node - just add the edge, don't add a node. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | worked/httpx/raw/transport.py | 13 | def handle_request(self, request: Request) -> Response: | CODE |
| LOW | worked/httpx/raw/transport.py | 70 | def handle_request(self, request: Request) -> Response: | CODE |
| LOW | worked/httpx/raw/transport.py | 112 | def handle_request(self, request: Request) -> Response: | CODE |
| LOW | worked/httpx/raw/transport.py | 126 | def handle_request(self, request: Request) -> Response: | CODE |
| LOW | tests/test_rationale.py | 193 | def helper() -> int: | CODE |
| LOW | tests/test_incremental.py | 113 | (pkg / "b.py").write_text("def helper():\n return 1\n") | CODE |
| LOW⚡ | tests/test_case_sensitive_resolution.py | 70 | "h.py": "def helper():\n return 1\n", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_prs.py | 26 | CODE | |
| LOW | graphify/pg_introspect.py | 151 | CODE | |
| LOW | graphify/serve.py | 1591 | CODE | |
| LOW | graphify/llm.py | 1813 | CODE | |
| LOW | graphify/callflow_html.py | 1579 | CODE | |
| LOW | graphify/callflow_html.py | 1514 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_hooks.py | 353 | def _set_hookspath(repo: Path, value: str) -> None: | CODE |
| LOW | graphify/manifest_ingest.py | 25 | __all__ = ["is_package_manifest_path", "extract_package_manifest", "PACKAGE_MANIFEST_NAMES"] | CODE |
| LOW | graphify/manifest.py | 4 | __all__ = ["save_manifest", "load_manifest", "detect_incremental"] | CODE |
| LOW | graphify/ids.py | 29 | __all__ = ["normalize_id", "make_id"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | graphify/detect.py | 430 | # Check if it's a converted paper | COMMENT |
| LOW | graphify/extractors/dart.py | 36 | # Check if this is a part-of file and redirect to parent | COMMENT |