Turn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.
This report presents the forensic synthetic code analysis of safishamsi/graphify, a Python project with 111,924 GitHub stars. SynthScan v2.0 examined 226,979 lines of code across 711 source files, recording 6696 pattern matches distributed across 16 syntactic categories. The overall adjusted score of 36.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 6696 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 | 893 | def _is_frontmatter_description_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 947 | def _is_content_scope_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 962 | def _is_cache_unlink_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 976 | def _is_zero_node_guard_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 1002 | def _is_manifest_root_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 1017 | def _is_manifest_stamp_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 1045 | def _is_sensitive_reporting_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 1066 | def _is_shebang_allowlist_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 1079 | def _is_obsidian_usage_comment_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 1090 | def _is_uv_from_interpreter_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 1104 | def _is_semantic_cache_scope_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 1120 | def _is_community_label_export_fix_line(line: str) -> bool: | CODE |
| LOW | tools/skillgen/gen.py | 1169 | 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 | 22 | def test_extract_exits_nonzero_when_ast_extraction_raises( | CODE |
| LOW | tests/test_extract_cli.py | 59 | def test_extract_allow_partial_continues_past_ast_failure( | CODE |
| LOW | tests/test_extract_cli.py | 112 | def test_extract_exits_nonzero_when_all_semantic_chunks_fail( | CODE |
| LOW | tests/test_extract_cli.py | 173 | def test_extract_succeeds_when_at_least_one_chunk_completes( | CODE |
| LOW | tests/test_extract_cli.py | 230 | def test_incremental_partial_run_preserves_untouched_semantic_hash( | CODE |
| LOW | tests/test_extract_cli.py | 305 | def test_truncated_doc_semantic_hash_is_cleared_for_requeue(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 356 | def test_manifest_stamps_freshly_extracted_semantic_docs(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 416 | def test_stamped_manifest_files_normalizes_both_sides(tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 450 | def test_stamped_manifest_files_counts_hyperedge_only_docs(tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 478 | def test_manifest_stamps_hyperedge_only_docs(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 546 | def test_extract_mode_deep_dispatches_over_warm_cache(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 593 | def test_extract_force_flag_redispatches_and_stamps_manifest(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 633 | def test_extract_graphify_force_env_redispatches(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 656 | def test_cache_check_mode_deep_reads_deep_namespace(monkeypatch, tmp_path, capsys): | CODE |
| LOW | tests/test_extract_cli.py | 700 | def test_extract_codeonly_succeeds_without_api_key(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 727 | def test_missing_manifest_code_only_preserves_semantic_layer(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 794 | def test_extract_out_keeps_project_root_clean(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 831 | def test_extract_without_key_still_errors_when_docs_present( | CODE |
| LOW | tests/test_extract_cli.py | 859 | def test_extract_timing_flag_emits_stage_timings(monkeypatch, tmp_path, capsys): | CODE |
| LOW | tests/test_extract_cli.py | 894 | def test_pathless_postgres_extract_initializes_empty_detection( | CODE |
| LOW | tests/test_extract_cli.py | 1034 | def test_incremental_extract_prunes_newly_excluded_file_not_in_manifest( | CODE |
| LOW | tests/test_extract_cli.py | 1083 | def test_incremental_extract_prunes_excluded_file_listed_in_manifest( | CODE |
| LOW | tests/test_extract_cli.py | 1127 | def test_no_cluster_incremental_prunes_newly_excluded_file( | CODE |
| LOW | tests/test_extract_cli.py | 1208 | def test_failed_extra_is_retried_and_recovers(monkeypatch, tmp_path, capsys): | CODE |
| LOW | tests/test_extract_cli.py | 1257 | def test_permanent_failure_does_not_wedge(monkeypatch, tmp_path, capsys): | CODE |
| LOW | tests/test_extract_cli.py | 1290 | def test_success_and_unchanged_unaffected(monkeypatch, tmp_path, capsys): | CODE |
| LOW | tests/test_extract_cli.py | 1310 | def test_poisoned_manifest_is_healed(monkeypatch, tmp_path, capsys): | CODE |
| LOW | tests/test_extract_cli.py | 1354 | def test_cache_check_prompt_file_scopes_hits_to_that_prompt(monkeypatch, tmp_path, capsys): | CODE |
| LOW | tests/test_extract_cli.py | 1383 | def test_edge_only_semantic_extraction_not_stamped_and_retried(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_extract_cli.py | 1482 | def test_stale_poisoned_manifest_semantic_source_healed(monkeypatch, tmp_path, capsys): | CODE |
| LOW | tests/test_extract_cli.py | 1573 | def test_incremental_stray_attribution_preserves_undispatched_file( | CODE |
| LOW | tests/test_pdf_slicing.py | 78 | def test_the_fixture_is_the_shape_the_bug_needs(big_pdf): | CODE |
| LOW⚡ | tests/test_pdf_slicing.py | 92 | def test_an_oversized_pdf_is_sliced(big_pdf): | CODE |
| LOW⚡ | tests/test_pdf_slicing.py | 99 | def test_the_slices_tile_the_extracted_text_exactly(big_pdf): | CODE |
| LOW⚡ | tests/test_pdf_slicing.py | 106 | def test_no_slice_exceeds_the_cap(big_pdf): | CODE |
| LOW⚡ | tests/test_pdf_slicing.py | 112 | def test_a_slice_indexes_text_not_bytes(big_pdf): | CODE |
| LOW | tests/test_pdf_slicing.py | 123 | def test_the_tail_reaches_the_prompt(big_pdf): | CODE |
| LOW⚡ | tests/test_pdf_slicing.py | 138 | def test_a_small_pdf_still_passes_through_whole(tmp_path): | CODE |
| LOW⚡ | tests/test_pdf_slicing.py | 146 | def test_plain_text_slicing_is_unchanged(tmp_path): | CODE |
| LOW⚡ | tests/test_pdf_slicing.py | 155 | def test_images_and_code_are_still_not_sliced(tmp_path): | CODE |
| LOW⚡ | tests/test_pdf_slicing.py | 165 | def test_a_corrupt_pdf_does_not_break_the_pass(tmp_path): | CODE |
| LOW⚡ | tests/test_pdf_slicing.py | 171 | def test_a_rewritten_pdf_is_re_read(tmp_path): | CODE |
| LOW | tests/test_pdf_slicing.py | 184 | def test_repeated_reads_agree(big_pdf): | CODE |
| LOW | tests/test_pdf_slicing.py | 189 | def test_bisect_slice_of_a_pdf_indexes_extracted_text_not_bytes(big_pdf): | CODE |
| LOW | tests/test_csharp_partial_classes.py | 63 | def test_partial_halves_merge_to_one_class_node(tmp_path): | CODE |
| 4218 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_extract_cli.py | 999 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_extract_cli.py | 1004 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_extract_cli.py | 1166 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_extract_cli.py | 1172 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_extract_cli.py | 1555 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_extract_cli.py | 1562 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_slicing.py | 134 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_pdf_slicing.py | 136 | # --------------------------------------------------------------------------- | COMMENT |
| 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_tree_html.py | 51 | # ── build_tree unit tests ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_tree_html.py | 83 | # ── CLI integration ─────────────────────────────────────────────────────────── | 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 | 14 | # ── entropy gate ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_dedup.py | 26 | # ── shingles ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_dedup.py | 39 | # ── full pipeline ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_dedup.py | 130 | # ── build integration ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_dedup.py | 983 | # ── #2576: same-file labels differing by a content-word swap ────────────────── | COMMENT |
| MEDIUM | tests/test_dedup.py | 304 | # ── #1284: numbered siblings + cross-file file-anchored boilerplate ────────── | COMMENT |
| MEDIUM | tests/test_dedup.py | 372 | # ── #1243: JaroWinkler prefix-bonus over-merge (cross-file) ────────────────── | COMMENT |
| MEDIUM | tests/test_dedup.py | 400 | # ── #1504: cross-chunk node ID collision warning ────────────────────────────── | COMMENT |
| MEDIUM | tests/test_dedup.py | 440 | # ── #1857: dedup summary log breakdown ──────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_dedup.py | 476 | # ── ID collisions: definition vs cross-reference ────────────────────────────── | COMMENT |
| MEDIUM | tests/test_dedup.py | 638 | # ── #2532: lifecycle-aware, environment-stable collision ranking ────────────── | COMMENT |
| MEDIUM | tests/test_dedup.py | 740 | # ── #2091 review: attribute-merge correctness (fixes A-D) ───────────────────── | COMMENT |
| MEDIUM | tests/test_dedup.py | 806 | # ── #2182: cross-file exact-duplicate concepts must merge ───────────────────── | 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 |
| 483 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/test_ts_parse_warning.py | 50 | "declare const Comp: (props: { to: string }) => null;\n" | CODE |
| HIGH⚡ | tests/test_indirect_call_function_expression_shadow.py | 139 | "function wrap(a, b){ return a || b; }\n" | CODE |
| HIGH⚡ | tests/test_indirect_call_for_of_binding_shadow.py | 58 | " if (lookup(entry.name)) resolved.push({ entry });\n" | CODE |
| HIGH⚡ | tests/test_indirect_call_for_of_binding_shadow.py | 76 | " out.push({ entry });\n" | CODE |
| HIGH⚡ | tests/test_indirect_call_for_of_binding_shadow.py | 92 | " for (const entry of rows) { out.push({ entry }); }\n" | CODE |
| HIGH | tests/test_js_exported_scalar_bindings.py | 73 | export const A_MAX = Number(process.env.A_MAX || 10); | STRING |
| HIGH⚡ | tests/test_indirect_call_catch_binding_shadow.py | 70 | " try { boom(); } catch ({ cause }) { sink.push(cause); }\n" | CODE |
| 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 | 507 | " return null;\n" | STRING |
| 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_indirect_call_external_import_shadow.py | 58 | "Palette.tsx": "export function Palette() { return null; }\n", | CODE |
| HIGH⚡ | tests/test_indirect_call_external_import_shadow.py | 72 | "Chart.tsx": "export function Chart() { return null; }\n", | CODE |
| HIGH⚡ | tests/test_indirect_call_external_import_shadow.py | 87 | "export function run(sink) { sink.push(Utils); }\n" | CODE |
| HIGH⚡ | tests/test_indirect_call_external_import_shadow.py | 102 | "export function app(sink) { sink.push(Find); }\n" | CODE |
| HIGH⚡ | tests/test_indirect_call_external_import_shadow.py | 120 | "Palette.tsx": "export function Palette() { return null; }\n", | CODE |
| HIGH⚡ | tests/test_indirect_call_external_import_shadow.py | 135 | "widgets.ts": "export function Widget() { return null; }\n", | CODE |
| HIGH⚡ | tests/test_indirect_call_external_import_shadow.py | 138 | "export function host(sink) { sink.push(Widget); }\n" | CODE |
| HIGH⚡ | tests/test_indirect_call_external_import_shadow.py | 163 | "table.ts": "export function Filter() { return null; }\n", # unrelated corpus callable | CODE |
| HIGH⚡ | tests/test_indirect_call_external_import_shadow.py | 168 | " sink.push(Filter);\n" # external -> must NOT bind to table.ts Filter | CODE |
| HIGH | tests/test_build.py | 1253 | the source_location shape (AST emits 'L<line>', semantic emits null).""" | STRING |
| HIGH⚡ | tests/test_hooks.py | 795 | assert 'cd "$(git rev-parse --git-dir 2>/dev/null)" 2>/dev/null && pwd' in script | CODE |
| HIGH⚡ | tests/test_hooks.py | 795 | assert 'cd "$(git rev-parse --git-dir 2>/dev/null)" 2>/dev/null && pwd' in script | CODE |
| HIGH⚡ | tests/test_js_callback_calls.py | 106 | "function wrapper(a: unknown, b: unknown) { return a || b; }\n" | CODE |
| HIGH⚡ | tests/test_js_callback_calls.py | 122 | "function wrapper(a: unknown, b: unknown) { return a || b; }\n" | CODE |
| HIGH⚡ | tests/test_js_callback_calls.py | 138 | "function wrapper(a: unknown, b: unknown) { return a || b; }\n" | CODE |
| HIGH⚡ | tests/test_js_callback_calls.py | 141 | " (alpha) => { q.push(alpha); },\n" | CODE |
| HIGH⚡ | tests/test_js_callback_calls.py | 156 | "function wrapper(a: unknown, b: unknown) { return a || b; }\n" | CODE |
| HIGH⚡ | tests/test_js_callback_calls.py | 172 | "function wrapper(a: unknown, b: unknown) { return a || b; }\n" | 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_incremental.py | 116 | "export function ScanScreen() {\n return null;\n}\n", encoding="utf-8" | CODE |
| HIGH | tests/test_cross_language_call_resolution.py | 48 | " return null;\n" | CODE |
| HIGH⚡ | tests/test_extract.py | 1078 | " render() { return null; }\n" | CODE |
| HIGH⚡ | tests/test_extract.py | 2637 | "orlist() { helper || return 1; }\n" | CODE |
| HIGH⚡ | tests/test_extract.py | 2638 | "andlist() { true && helper; }\n" | CODE |
| HIGH⚡ | tests/test_extract.py | 2642 | "redir() { helper >/dev/null; }\n" | CODE |
| HIGH | tests/test_export.py | 1043 | return s(a,b,c)*s(a,b,d) < 0 && s(c,d,a)*s(c,d,b) < 0; | CODE |
| HIGH | tests/test_export.py | 1076 | if (!Array.isArray(h) || h.length < 1 || selfIntersects(h)) bad++; | CODE |
| HIGH⚡ | tests/test_skillgen.py | 457 | assert gen._rm_to_remove_item("rm -f graphify-out/.needs_update 2>/dev/null || true") == ( | CODE |
| HIGH⚡ | graphify/hooks.py | 46 | if [ -n "$_FROM_FILE" ] && [ -x "$_FROM_FILE" ] && "$_FROM_FILE" -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 53 | GRAPHIFY_BIN=$(command -v graphify 2>/dev/null) | CODE |
| HIGH⚡ | graphify/hooks.py | 60 | if [ -x "$_GFY_BINDIR/../python.exe" ] && "$_GFY_BINDIR/../python.exe" -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 62 | elif [ -x "$_GFY_BINDIR/python.exe" ] && "$_GFY_BINDIR/python.exe" -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 112 | if "$_GFY_CAND" -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 121 | if command -v python3 >/dev/null 2>&1 && python3 -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 121 | if command -v python3 >/dev/null 2>&1 && python3 -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 123 | elif command -v python >/dev/null 2>&1 && python -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 123 | elif command -v python >/dev/null 2>&1 && python -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH | graphify/hooks.py | 34 | if [ -n "$_PINNED" ] && [ -x "$_PINNED" ] && "$_PINNED" -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH | graphify/hooks.py | 91 | if [ -n "$GRAPHIFY_PYTHON" ] && ! "$GRAPHIFY_PYTHON" -c "$_GFY_PROBE" 2>/dev/null; then | CODE |
| HIGH⚡ | graphify/hooks.py | 299 | _GFY_GITDIR=$(cd "$(git rev-parse --git-dir 2>/dev/null)" 2>/dev/null && pwd) | STRING |
| HIGH⚡ | graphify/hooks.py | 299 | _GFY_GITDIR=$(cd "$(git rev-parse --git-dir 2>/dev/null)" 2>/dev/null && pwd) | STRING |
| HIGH⚡ | graphify/hooks.py | 300 | _GFY_COMMONDIR=$(cd "$(git rev-parse --git-common-dir 2>/dev/null)" 2>/dev/null && pwd) | STRING |
| HIGH⚡ | graphify/hooks.py | 300 | _GFY_COMMONDIR=$(cd "$(git rev-parse --git-common-dir 2>/dev/null)" 2>/dev/null && pwd) | STRING |
| 41 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 | 560 | ### Step 6 - Generate Obsidian vault (opt-in) + HTML | COMMENT |
| LOW | tools/skillgen/fragments/core/devin.md | 674 | ### Step 7 - Neo4j export (only if --neo4j or --neo4j-push flag) | COMMENT |
| LOW | tools/skillgen/fragments/core/devin.md | 774 | ### Step 8 - Token reduction benchmark (only if total_words > 5000) | COMMENT |
| LOW | tools/skillgen/fragments/core/devin.md | 794 | ### 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 | 110 | ### Step 3 - Extract entities and relationships | COMMENT |
| LOW | tools/skillgen/fragments/core/core.md | 328 | ### Step 4 - Build graph, cluster, analyze, generate outputs | COMMENT |
| LOW | tools/skillgen/fragments/core/core.md | 417 | ### Step 5 - Label communities | COMMENT |
| LOW | tools/skillgen/fragments/core/core.md | 466 | ### Step 6 - Generate Obsidian vault (opt-in) + HTML | COMMENT |
| LOW | tools/skillgen/fragments/core/core.md | 492 | ### 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 | 495 | ### Step 6 - Generate Obsidian vault (opt-in) + HTML | COMMENT |
| LOW | tools/skillgen/fragments/core/aider.md | 555 | ### Step 7 - Neo4j export (only if --neo4j or --neo4j-push flag) | COMMENT |
| LOW | tools/skillgen/fragments/core/aider.md | 656 | ### Step 8 - Token reduction benchmark (only if total_words > 5000) | COMMENT |
| LOW | tools/skillgen/fragments/core/aider.md | 676 | ### 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 | 151 | ### Step 3 - Extract entities and relationships | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-trae.md | 391 | ### Step 4 - Build graph, cluster, analyze, generate outputs | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-trae.md | 480 | ### Step 5 - Label communities | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-trae.md | 529 | ### Step 6 - Generate Obsidian vault (opt-in) + HTML | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-trae.md | 555 | ### 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 | 134 | ### Step 2 - Detect files | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 178 | ### Step 3 - Extract entities and relationships | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 420 | ### Step 4 - Build graph, cluster, analyze, generate outputs | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 509 | ### Step 5 - Label communities | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 558 | ### Step 6 - Generate Obsidian vault (opt-in) + HTML | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 584 | ### 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 |
| 347 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_extract_cli.py | 1388 | CODE | |
| LOW | tests/test_csharp_partial_classes.py | 13 | CODE | |
| LOW | tests/test_csharp_enum_members.py | 10 | 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_tree_html.py | 9 | CODE | |
| LOW | tests/test_hook_strict.py | 15 | CODE | |
| LOW | tests/test_community_labels_skill.py | 15 | 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 | 217 | CODE | |
| LOW | tests/test_symbol_resolution.py | 3 | CODE | |
| LOW | tests/test_csharp_call_site_generic_args.py | 16 | CODE | |
| LOW | tests/test_swift_import_resolution.py | 1 | CODE | |
| LOW | tests/test_js_dynamic_import_affected.py | 17 | CODE | |
| LOW | tests/bench_query_scoring.py | 29 | 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_scala_self_type.py | 13 | 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 | 3 | CODE | |
| LOW | tests/test_path_cli.py | 8 | CODE | |
| LOW | tests/test_path_cli.py | 10 | CODE | |
| LOW | tests/test_querylog.py | 3 | CODE | |
| LOW | tests/test_hyperedge_member_shapes.py | 11 | CODE | |
| LOW | tests/test_zero_node_no_cache.py | 9 | CODE | |
| LOW | tests/test_zero_node_no_cache.py | 11 | CODE | |
| LOW | tests/test_incomplete_build_guard.py | 10 | CODE | |
| LOW | tests/test_hypergraph.py | 2 | CODE | |
| LOW | tests/test_hypergraph.py | 8 | CODE | |
| LOW | tests/test_carried_hyperedge_remap.py | 9 | CODE | |
| LOW | tests/test_ts_parse_warning.py | 11 | CODE | |
| LOW | tests/test_mcp_ingest.py | 2 | CODE | |
| LOW | tests/test_mcp_ingest.py | 7 | CODE | |
| LOW | tests/test_cross_extension_reexport_self_cycle.py | 17 | CODE | |
| LOW | tests/test_google_workspace.py | 1 | CODE | |
| LOW | tests/test_hollow_chunks_arm_shrink_guard.py | 12 | CODE | |
| 529 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 | 43 | except Exception as e: # pragma: no cover - depends on local environment | CODE |
| LOW | tests/test_falkordb_integration.py | 47 | except Exception as e: # pragma: no cover - depends on local environment | CODE |
| LOW⚡ | tests/test_falkordb_integration.py | 58 | except Exception: | CODE |
| LOW⚡ | tests/test_falkordb_integration.py | 63 | except Exception: | CODE |
| LOW⚡ | tests/test_llm_backends.py | 878 | 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 | 455 | except Exception: | CODE |
| LOW | graphify/file_slice.py | 237 | except Exception: | CODE |
| LOW | graphify/ingest.py | 112 | except Exception: | CODE |
| LOW | graphify/ingest.py | 179 | except Exception: | CODE |
| LOW | graphify/hooks.py | 181 | except Exception: | CODE |
| LOW | graphify/hooks.py | 186 | except Exception as exc: | CODE |
| LOW | graphify/hooks.py | 230 | except Exception: | CODE |
| LOW | graphify/hooks.py | 235 | except Exception as exc: | CODE |
| LOW | graphify/manifest_ingest.py | 64 | 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 | 241 | except Exception as exc: | CODE |
| LOW | graphify/querylog.py | 79 | except Exception: | CODE |
| LOW | graphify/cache.py | 34 | except Exception: | CODE |
| LOW | graphify/cache.py | 403 | except Exception: | CODE |
| LOW | graphify/cache.py | 1111 | except Exception: | CODE |
| MEDIUM | graphify/serve.py | 1477 | def _relay() -> None: | CODE |
| LOW | graphify/serve.py | 51 | except Exception: | CODE |
| LOW | graphify/serve.py | 64 | except Exception: | CODE |
| LOW | graphify/serve.py | 1484 | except Exception: | CODE |
| LOW | graphify/serve.py | 1939 | except Exception: | CODE |
| LOW | graphify/serve.py | 1976 | except Exception: | CODE |
| LOW | graphify/serve.py | 2014 | except Exception as exc: | CODE |
| LOW | graphify/serve.py | 2039 | except Exception as exc: | CODE |
| LOW | graphify/serve.py | 2052 | except Exception as exc: | CODE |
| LOW | graphify/serve.py | 2087 | except Exception: | CODE |
| LOW⚡ | graphify/llm.py | 3427 | except Exception: | CODE |
| LOW⚡ | graphify/llm.py | 3444 | except Exception as exc: | CODE |
| LOW | graphify/llm.py | 53 | except Exception: # network failure on first-use download, etc. | CODE |
| LOW | graphify/llm.py | 242 | except Exception: | CODE |
| LOW | graphify/llm.py | 297 | except Exception: | CODE |
| LOW | graphify/llm.py | 678 | except Exception: # noqa: BLE001 — one unreadable file (e.g. a malformed PDF) must not disable binding for the | CODE |
| LOW | graphify/llm.py | 2010 | except Exception as _exc: # noqa: BLE001 — evidence-binding is advisory | CODE |
| LOW | graphify/llm.py | 2079 | except Exception: | CODE |
| LOW | graphify/llm.py | 2361 | except Exception as exc: # noqa: BLE001 — re-raise unless it's a known context overflow or timeout | CODE |
| LOW | graphify/llm.py | 2604 | except Exception as exc: # noqa: BLE001 — caller-facing surface, log + continue | CODE |
| LOW | graphify/llm.py | 2658 | except Exception as _exc: # noqa: BLE001 — checkpoint is best-effort | CODE |
| LOW | graphify/llm.py | 3071 | except Exception: | CODE |
| LOW | graphify/llm.py | 3364 | 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 | 245 | except Exception: | CODE |
| LOW⚡ | graphify/export.py | 250 | except Exception: | CODE |
| LOW⚡ | graphify/export.py | 254 | except Exception: | CODE |
| LOW⚡ | graphify/export.py | 260 | except Exception: | CODE |
| LOW⚡ | graphify/export.py | 273 | except Exception: | CODE |
| 177 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/skillgen/gen.py | 431 | CODE | |
| LOW | tools/skillgen/gen.py | 469 | CODE | |
| LOW | tools/skillgen/gen.py | 711 | 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 | tests/test_skillgen.py | 424 | CODE | |
| LOW | graphify/build.py | 711 | CODE | |
| LOW | graphify/build.py | 798 | CODE | |
| LOW | graphify/build.py | 1401 | CODE | |
| LOW | graphify/build.py | 2001 | CODE | |
| LOW | graphify/ingest.py | 13 | CODE | |
| LOW | graphify/hooks.py | 419 | CODE | |
| LOW | graphify/hooks.py | 533 | CODE | |
| LOW | graphify/manifest_ingest.py | 115 | CODE | |
| LOW | graphify/manifest_ingest.py | 145 | CODE | |
| LOW | graphify/cargo_introspect.py | 47 | CODE | |
| LOW | graphify/benchmark.py | 37 | CODE | |
| LOW | graphify/security.py | 103 | CODE | |
| LOW | graphify/csharp_dispatch.py | 66 | CODE | |
| LOW | graphify/cache.py | 44 | CODE | |
| LOW | graphify/cache.py | 328 | CODE | |
| LOW | graphify/cache.py | 428 | CODE | |
| LOW | graphify/cache.py | 572 | CODE | |
| LOW | graphify/cache.py | 1359 | CODE | |
| LOW | graphify/cache.py | 1621 | CODE | |
| LOW | graphify/serve.py | 262 | CODE | |
| LOW | graphify/serve.py | 290 | CODE | |
| LOW | graphify/serve.py | 462 | CODE | |
| LOW | graphify/serve.py | 924 | CODE | |
| LOW | graphify/serve.py | 982 | CODE | |
| LOW | graphify/serve.py | 1249 | CODE | |
| LOW | graphify/serve.py | 1365 | CODE | |
| LOW | graphify/serve.py | 1466 | CODE | |
| LOW | graphify/serve.py | 1508 | CODE | |
| LOW | graphify/serve.py | 1477 | CODE | |
| LOW | graphify/serve.py | 1992 | CODE | |
| LOW | graphify/llm.py | 265 | CODE | |
| LOW | graphify/llm.py | 1029 | CODE | |
| LOW | graphify/llm.py | 1345 | CODE | |
| LOW | graphify/llm.py | 1885 | CODE | |
| LOW | graphify/llm.py | 2231 | CODE | |
| LOW | graphify/llm.py | 2506 | CODE | |
| LOW | graphify/llm.py | 2826 | CODE | |
| LOW | graphify/export.py | 36 | CODE | |
| LOW | graphify/export.py | 126 | CODE | |
| LOW | graphify/export.py | 266 | CODE | |
| LOW | graphify/ruby_resolution.py | 53 | CODE | |
| LOW | graphify/validate.py | 10 | CODE | |
| LOW | graphify/callflow_html.py | 582 | CODE | |
| LOW | graphify/cross_repo_types.py | 32 | CODE | |
| LOW | graphify/cli.py | 160 | CODE | |
| LOW | graphify/cli.py | 649 | CODE | |
| LOW | graphify/cli.py | 680 | CODE | |
| LOW | graphify/cli.py | 930 | CODE | |
| LOW | graphify/dedup.py | 463 | CODE | |
| LOW | graphify/dedup.py | 503 | CODE | |
| 217 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pyproject.toml | 81 | # extract_pascal() uses tree-sitter-pascal for AST-quality extraction (more | COMMENT |
| 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 | tools/skillgen/gen.py | 361 | # | COMMENT |
| LOW | tools/skillgen/fragments/core/core.md | 501 | # Save manifest for --update | COMMENT |
| LOW | tools/skillgen/fragments/references/shared/update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | …n/expected/graphify__skills__pi__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-trae.md | 561 | from datetime import datetime, timezone | COMMENT |
| LOW | …pected/graphify__skills__vscode__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-windows.md | 601 | # | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill.md | 561 | import json | COMMENT |
| LOW | …pected/graphify__skills__agents__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | …expected/graphify__skills__trae__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | …xpected/graphify__skills__codex__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-kilo.md | 561 | import json | COMMENT |
| LOW | …cted/graphify__skills__opencode__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | …pected/graphify__skills__claude__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | …expected/graphify__skills__kilo__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-droid.md | 561 | from graphify.detect import save_manifest | COMMENT |
| LOW | …expected/graphify__skills__kiro__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | …xpected/graphify__skills__droid__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-kiro.md | 561 | import json | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-opencode.md | 561 | # In --update mode, 'all_files' carries the full corpus; 'files' is the changed | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-pi.md | 561 | import json | COMMENT |
| LOW | …ected/graphify__skills__copilot__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-copilot.md | 561 | import json | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-vscode.md | 561 | COMMENT | |
| LOW | tools/skillgen/expected/graphify__skill-agents.md | 561 | from graphify.detect import save_manifest | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-claw.md | 561 | import json | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-codex.md | 561 | from graphify.detect import save_manifest | COMMENT |
| LOW | …ected/graphify__skills__windows__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | …/expected/graphify__skills__amp__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | tools/skillgen/expected/graphify__skill-amp.md | 561 | from graphify.detect import save_manifest | COMMENT |
| LOW | …expected/graphify__skills__claw__references__update.md | 141 | # prior run's baseline (prevents ghost-node reports on subsequent updates). | COMMENT |
| LOW | tests/test_cross_extension_reexport_self_cycle.py | 161 | assert not self_loops, f"unexpected self-loop among siblings; got {self_loops}" | COMMENT |
| LOW | tests/test_detect.py | 1781 | # "token_config.yaml": "token" followed by "_" (not alpha) → flagged. | COMMENT |
| LOW | tests/test_build.py | 1561 | ], | COMMENT |
| LOW | .github/workflows/publish.yml | 1 | name: Publish to PyPI | COMMENT |
| LOW | graphify/build.py | 1 | # assemble node+edge dicts into a NetworkX graph, preserving edge direction | COMMENT |
| LOW | graphify/build.py | 641 | # build directory into node IDs when updated on Windows (#2618). | COMMENT |
| LOW | graphify/build.py | 981 | # uses bare-stem IDs (bpe_get_pairs) — different IDs, same symbol. | COMMENT |
| LOW | graphify/build.py | 1001 | attrs = G.nodes[nid] | COMMENT |
| LOW | graphify/build.py | 1061 | COMMENT | |
| LOW | graphify/build.py | 1081 | # re-keying aid instead of a silent cross-file (and cross-language) merge. | COMMENT |
| LOW | graphify/build.py | 1161 | tgt = norm_to_id.get(_normalize_id(tgt), tgt) | COMMENT |
| LOW | graphify/build.py | 1221 | and src_ext and tgt_ext and src_fam != tgt_fam | COMMENT |
| LOW | graphify/build.py | 1241 | # causing display functions to show edges backwards. | COMMENT |
| LOW | graphify/build.py | 1681 | # Re-extracted files REPLACE their prior contribution. Every source_file | COMMENT |
| LOW | graphify/build.py | 1861 | if edges_to_remove: | COMMENT |
| LOW | graphify/build.py | 1941 | COMMENT | |
| LOW | graphify/file_slice.py | 21 | COMMENT | |
| LOW | graphify/skill-windows.md | 601 | # | COMMENT |
| LOW | graphify/hooks.py | 21 | # _PINNED was recorded at hook-install time; tried first so the hook works even | COMMENT |
| LOW | graphify/skill-trae.md | 561 | from datetime import datetime, timezone | COMMENT |
| LOW | graphify/paths.py | 101 | _atomic_replace(path, lambda f: json.dump(obj, f, indent=indent, ensure_ascii=ensure_ascii)) | COMMENT |
| 116 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | CHANGELOG.md | 334 | - Fix: the `claude-cli` backend now reads the CLI's structured-output channel instead of trusting free-form prose (#2076 | CODE |
| MEDIUM⚡ | tests/test_claude_cli_backend.py | 243 | # Newer Claude Code CLIs treat a bare file-dump prompt as an agentic task and | COMMENT |
| MEDIUM⚡ | tests/test_llm_backends.py | 736 | # `chat_template_kwargs.enable_thinking=false` or the model emits chain-of-thought | COMMENT |
| MEDIUM | tests/test_llm_backends.py | 280 | # produce when a chunk overflows the model's context window. | COMMENT |
| MEDIUM⚡ | tests/test_llm_backends.py | 879 | pass # mock scaffolding may not be complete; we only care about the call | CODE |
| MEDIUM⚡ | tests/test_labeling.py | 248 | # 16k context window of self-hosted reasoning models (Qwen3, Llama-3.1 8B). | COMMENT |
| MEDIUM | graphify/llm.py | 1022 | # Reasoning models (nemotron, deepseek-r1, qwq, …) emit their chain of thought | COMMENT |
| MEDIUM | graphify/llm.py | 1682 | # object directly. The <untrusted_source> guardrails in _extraction_system | COMMENT |
| MEDIUM | graphify/llm.py | 1722 | # agentic task and REPORT the extraction in prose ("Knowledge graph | COMMENT |
| MEDIUM | graphify/llm.py | 2074 | # looks like. The chunk then blows the context window and falls into | COMMENT |
| MEDIUM | graphify/llm.py | 3137 | # When graphify runs inside an orchestrating agent (Claude Code / Gemini CLI), | COMMENT |
| MEDIUM | graphify/cli.py | 2086 | # standalone there is no orchestrating agent to do skill.md Step 5, so | COMMENT |
| MEDIUM | graphify/extractors/bash.py | 126 | # Cross-file resolution scaffolding consumed by resolve_bash_source_edges in | 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 | 284 | # Step 2: path proximity over the survivors. | COMMENT |
| LOW | graphify/analyze.py | 669 | # Step 1: Build a directed file-level graph from import/re-export edges. | COMMENT |
| LOW | graphify/analyze.py | 710 | # Step 2: Find simple cycles, bounded by length. | COMMENT |
| LOW | graphify/analyze.py | 722 | # Step 3: Sort by length (shortest = tightest coupling), then deduplicate. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_extract_cli.py | 67 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_extract_cli.py | 127 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_extract_cli.py | 180 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_extract_cli.py | 246 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_extract_cli.py | 315 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_extract_cli.py | 368 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_extract_cli.py | 485 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_extract_cli.py | 553 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_extract_cli.py | 600 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_extract_cli.py | 636 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_extract_cli.py | 1394 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_extract_cli.py | 1522 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_extract_cli.py | 1582 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW⚡ | tests/test_dedup.py | 972 | {"id": "acme_corp_one", "label": "Acme Corp", | CODE |
| LOW⚡ | tests/test_dedup.py | 974 | {"id": "acme_corp_two", "label": "Acme Corp", | CODE |
| LOW⚡ | tests/test_dedup.py | 969 | survivor: {'Acme Corp' doc1, 'Acme Corp' doc2, 'Acme Corp.' doc3} all | STRING |
| LOW | tests/test_incomplete_build_guard.py | 42 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_incomplete_build_guard.py | 128 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_hollow_chunks_arm_shrink_guard.py | 40 | monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-test-fake-key") | CODE |
| LOW | tests/test_detect.py | 2760 | doc_path.write_bytes(b"placeholder") | CODE |
| LOW⚡ | tests/test_llm_backends.py | 206 | big.write_text(("# Section\n\n" + "lorem ipsum dolor sit amet " * 60 + "\n\n") * 30) | CODE |
| LOW⚡ | tests/test_llm_backends.py | 206 | big.write_text(("# Section\n\n" + "lorem ipsum dolor sit amet " * 60 + "\n\n") * 30) | CODE |
| LOW | tests/test_llm_backends.py | 1270 | "https://api.moonshot.ai/v1", "fake-key", "kimi-k2", | CODE |
| LOW | tests/test_llm_backends.py | 1298 | monkeypatch.setattr(llm, "_get_backend_api_key", lambda _b: "fake-key") | CODE |
| LOW | tests/test_llm_backends.py | 1326 | monkeypatch.setattr(llm, "_get_backend_api_key", lambda _b: "fake-key") | CODE |
| LOW⚡ | tests/test_labeling.py | 199 | assert source == "placeholder" | CODE |
| LOW⚡ | tests/test_labeling.py | 207 | 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 | 3436 | return _placeholder_community_labels(communities), "placeholder" | CODE |
| LOW⚡ | graphify/llm.py | 3451 | return _placeholder_community_labels(communities), "placeholder" | CODE |
| LOW⚡ | graphify/llm.py | 3423 | ``"placeholder"``. Never raises.""" | STRING |
| 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_watch.py | 2087 | (corpus / "b.py").write_text("def helper():\n return 2\n", encoding="utf-8") | CODE |
| LOW | tests/test_watch.py | 2142 | (corpus / "b.py").write_text("def helper():\n return 2\n", encoding="utf-8") | CODE |
| LOW | tests/test_watch.py | 2168 | (corpus / "b.py").write_text("def helper():\n return 2\n", encoding="utf-8") | CODE |
| LOW | tests/test_rationale.py | 193 | def helper() -> int: | CODE |
| LOW | tests/test_src_layout_import_resolution.py | 21 | "mypkg/helpers.py": "def helper():\n return 1\n", | CODE |
| LOW | tests/test_incremental.py | 318 | (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 |
| LOW | tests/test_python_import_resolution.py | 51 | target = _write(tmp_path / "pkg" / "sibling.py", "def helper():\n return 1\n") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_languages.py | 2368 | # 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 | 6625 | # path.name)``). Resolving file membership by that shared string is robust | COMMENT |
| LOW | graphify/extract.py | 1589 | # Edge target already a real node - just add the edge, don't add a node. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_word_count_cache.py | 13 | def _settle(path: Path) -> None: | CODE |
| LOW | tests/test_stat_index_portability.py | 61 | def _settle(path: Path) -> None: | CODE |
| LOW | tests/test_hooks.py | 380 | 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 | 47 | __all__ = ["normalize_id", "make_id"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | graphify/detect.py | 527 | # Check if it's a converted paper | COMMENT |
| LOW | graphify/extractors/bash.py | 392 | # Check if the leading variable is tracked | COMMENT |
| LOW | graphify/extractors/dart.py | 36 | # Check if this is a part-of file and redirect to parent | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_prs.py | 29 | CODE | |
| LOW | graphify/cache.py | 1359 | CODE | |
| LOW | graphify/serve.py | 2259 | CODE | |
| LOW | graphify/llm.py | 2506 | CODE | |
| LOW | graphify/callflow_html.py | 1608 | CODE | |
| LOW | graphify/callflow_html.py | 1543 | CODE |