Local-first code intelligence graph for MCP and CLI. Builds a persistent map of your codebase so AI coding tools read only what matters, with benchmarked context reductions on reviews and large-repo workflows.
This report presents the forensic synthetic code analysis of tirth8205/code-review-graph, a Python project with 30,960 GitHub stars. SynthScan v2.0 examined 122,967 lines of code across 269 source files, recording 3602 pattern matches distributed across 20 syntactic categories. The overall adjusted score of 38.0 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 3602 distinct pattern matches across 20 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 | code_review_graph/communities.py | 849 | def incremental_detect_communities( | CODE |
| LOW | code_review_graph/communities.py | 1020 | def get_architecture_overview(store: GraphStore) -> dict[str, Any]: | CODE |
| LOW | code_review_graph/scoped_resolver.py | 162 | def _is_unresolved_scoped_target(target: str) -> bool: | CODE |
| LOW | code_review_graph/analysis.py | 213 | def find_surprising_connections( | CODE |
| LOW | code_review_graph/analysis.py | 317 | def generate_suggested_questions( | CODE |
| LOW | code_review_graph/jedi_resolver.py | 234 | def _find_untracked_method_calls(root, is_test_file: bool = False): | CODE |
| LOW | code_review_graph/refactor.py | 233 | def _collect_type_referenced_names(store: GraphStore) -> set[str]: | CODE |
| LOW | code_review_graph/skills.py | 402 | def _warn_legacy_opencode_config(repo_root: Path) -> None: | CODE |
| LOW | code_review_graph/skills.py | 1091 | def generate_codex_hooks_config(repo_root: Path) -> dict[str, Any]: | CODE |
| LOW | code_review_graph/skills.py | 1782 | def inject_platform_instructions(repo_root: Path, target: str = "all") -> list[str]: | CODE |
| LOW | code_review_graph/skills.py | 1836 | def generate_cursor_hooks_config() -> dict[str, Any]: | CODE |
| LOW | code_review_graph/skills.py | 1205 | def _merge_hooks_into_settings( | STRING |
| LOW | code_review_graph/skills.py | 1460 | def _known_instruction_sections() -> tuple[str, ...]: | STRING |
| LOW | code_review_graph/skills.py | 1577 | def _remove_legacy_instruction_file(path: Path) -> None: | STRING |
| LOW | code_review_graph/skills.py | 1736 | def install_gemini_cli_skills(repo_root: Path) -> Path: | STRING |
| LOW | code_review_graph/context_savings.py | 201 | def format_context_savings_panel( | CODE |
| LOW | code_review_graph/graph.py | 49 | def _compatible_edge_languages(language: str) -> tuple[str, ...]: | CODE |
| LOW | code_review_graph/graph.py | 498 | def search_edges_by_target_name( | CODE |
| LOW | code_review_graph/graph.py | 519 | def iter_edges_by_target_name( | CODE |
| LOW | code_review_graph/graph.py | 720 | def _select_evidence_backed_candidate( | CODE |
| LOW | code_review_graph/graph.py | 733 | def resolve_bare_call_targets(self) -> int: | CODE |
| LOW | code_review_graph/graph.py | 746 | def resolve_cpp_scoped_call_targets(self) -> int: | CODE |
| LOW | code_review_graph/graph.py | 953 | def resolve_bare_tested_by_sources(self) -> int: | CODE |
| LOW | code_review_graph/graph.py | 1820 | def get_flow_criticalities_for_node(self, node_id: int) -> list[float]: | CODE |
| LOW | code_review_graph/graph.py | 1840 | def get_community_ids_by_qualified_names( | CODE |
| LOW | code_review_graph/graph.py | 1871 | def get_nodes_without_signature(self) -> list[sqlite3.Row]: | CODE |
| LOW | code_review_graph/graph.py | 2015 | def get_nodes_by_community_id( | CODE |
| LOW | code_review_graph/graph.py | 1584 | def _get_impact_radius_networkx( | STRING |
| LOW | code_review_graph/rescript_resolver.py | 36 | def resolve_rescript_cross_module(store: GraphStore) -> dict: | CODE |
| LOW | code_review_graph/hcl_resolver.py | 15 | def resolve_hcl_module_references(store: GraphStore) -> dict[str, int]: | CODE |
| LOW⚡ | code_review_graph/parser.py | 8625 | def _extract_js_var_functions( | CODE |
| LOW⚡ | code_review_graph/parser.py | 11134 | def _resolve_php_scoped_calls( | CODE |
| LOW⚡ | code_review_graph/parser.py | 16150 | def _handle_r_binary_operator( | CODE |
| LOW | code_review_graph/parser.py | 134 | def _python_type_checking_aliases( | CODE |
| LOW | code_review_graph/parser.py | 321 | def _python_unreachable_call_positions( | CODE |
| LOW | code_review_graph/parser.py | 369 | def _is_statically_false_condition(cond) -> bool: | CODE |
| LOW | code_review_graph/parser.py | 460 | def _parser_load_timeout_seconds() -> float: | CODE |
| LOW | code_review_graph/parser.py | 512 | def _parser_load_probe_succeeds( | CODE |
| LOW | code_review_graph/parser.py | 555 | def _clear_parser_probe_cache() -> None: | CODE |
| LOW | code_review_graph/parser.py | 1557 | def _vbnet_relationship_targets(value: str) -> list[str]: | CODE |
| LOW | code_review_graph/parser.py | 1731 | def _rescript_brace_depth_array(cleaned: str) -> list[int]: | CODE |
| LOW | code_review_graph/parser.py | 1918 | def _modifier_annotation_names(node) -> list[str]: | CODE |
| LOW | code_review_graph/parser.py | 2230 | def _hcl_dynamic_iterator_name(block_node) -> Optional[str]: | CODE |
| LOW | code_review_graph/parser.py | 2522 | def _detect_language_from_shebang( | CODE |
| LOW | code_review_graph/parser.py | 3432 | def _parse_databricks_py_notebook( | CODE |
| LOW | code_review_graph/parser.py | 4939 | def _resolve_julia_call_targets( | CODE |
| LOW | code_review_graph/parser.py | 5060 | def _collect_typed_call_targets( | CODE |
| LOW | code_review_graph/parser.py | 5184 | def _collect_class_typed_fields( | CODE |
| LOW | code_review_graph/parser.py | 5212 | def _collect_function_typed_parameters( | CODE |
| LOW | code_review_graph/parser.py | 5248 | def _collect_ts_parameter_properties(self, constructor_node) -> dict[str, str]: | CODE |
| LOW | code_review_graph/parser.py | 5275 | def _typed_bindings_from_node( | CODE |
| LOW | code_review_graph/parser.py | 5470 | def _resolve_typed_method_target( | CODE |
| LOW | code_review_graph/parser.py | 5515 | def _apply_typed_call_targets( | CODE |
| LOW | code_review_graph/parser.py | 5700 | def _spring_property_logical_lines(text: str) -> list[tuple[int, str]]: | CODE |
| LOW | code_review_graph/parser.py | 5855 | def _resolve_ansible_notify_targets( | CODE |
| LOW | code_review_graph/parser.py | 6192 | def _ansible_extract_role_name(self, item: object) -> Optional[str]: | CODE |
| LOW | code_review_graph/parser.py | 6207 | def _ansible_extract_notify_targets(self, notify_node: object) -> list[str]: | CODE |
| LOW | code_review_graph/parser.py | 6237 | def _ansible_role_from_module_args(self, args_node: Optional[object]) -> Optional[str]: | CODE |
| LOW | code_review_graph/parser.py | 6563 | def _elixir_function_name_and_params( | CODE |
| LOW | code_review_graph/parser.py | 6592 | def _extract_elixir_constructs( | CODE |
| 2365 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | code_review_graph/communities.py | 29 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | code_review_graph/communities.py | 31 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | code_review_graph/communities.py | 41 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | code_review_graph/communities.py | 43 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 67 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 69 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 182 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 184 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 256 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 258 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 469 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 471 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 560 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 562 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 793 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 795 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | code_review_graph/exports.py | 19 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | code_review_graph/exports.py | 21 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 54 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 56 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 120 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 122 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 191 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 193 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 353 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 355 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 40 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 42 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 181 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 183 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 274 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 276 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 319 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 321 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 388 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 390 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/spring_resolver.py | 50 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/spring_resolver.py | 53 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/spring_resolver.py | 74 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/spring_resolver.py | 81 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | code_review_graph/spring_resolver.py | 100 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | code_review_graph/spring_resolver.py | 103 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | code_review_graph/spring_resolver.py | 113 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | code_review_graph/spring_resolver.py | 115 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/tsconfig_resolver.py | 40 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | code_review_graph/tsconfig_resolver.py | 42 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | code_review_graph/tsconfig_resolver.py | 70 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | code_review_graph/tsconfig_resolver.py | 72 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | code_review_graph/tsconfig_resolver.py | 235 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/tsconfig_resolver.py | 237 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/scoped_resolver.py | 272 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | code_review_graph/scoped_resolver.py | 276 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | code_review_graph/scoped_resolver.py | 295 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | code_review_graph/scoped_resolver.py | 298 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | code_review_graph/scoped_resolver.py | 307 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | code_review_graph/scoped_resolver.py | 312 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | code_review_graph/refactor.py | 47 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/refactor.py | 49 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/refactor.py | 68 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/refactor.py | 70 | # --------------------------------------------------------------------------- | COMMENT |
| 374 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | code_review_graph/skills.py | 1056 | "cat >/dev/null || true; " | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1057 | "command -v code-review-graph >/dev/null 2>&1 || exit 0; " | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1060 | " --repo \"$(git rev-parse --show-toplevel 2>/dev/null)\"" | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1075 | "cat >/dev/null || true; " | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1076 | "command -v code-review-graph >/dev/null 2>&1 || exit 0; " | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1079 | " --repo \"$(git rev-parse --show-toplevel 2>/dev/null)\"" | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1635 | cat > /dev/null || true | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1637 | msg="$(code-review-graph status --repo "__CRG_REPO__" 2>&1 | head -n 1 || true)" | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1643 | ' 2>/dev/null || echo '{"suppressOutput": true}' | CODE |
| HIGH | code_review_graph/skills.py | 1102 | "cat >/dev/null || true; " | CODE |
| HIGH | code_review_graph/skills.py | 1120 | "cat >/dev/null || true; " | CODE |
| HIGH | code_review_graph/skills.py | 1156 | code-review-graph update || true | CODE |
| HIGH | code_review_graph/skills.py | 1157 | code-review-graph detect-changes --brief || true | CODE |
| HIGH | code_review_graph/skills.py | 1654 | cat > /dev/null || true | CODE |
| HIGH | code_review_graph/skills.py | 1656 | code-review-graph update --skip-flows --repo "__CRG_REPO__" >/dev/null 2>&1 || true | CODE |
| HIGH | code_review_graph/skills.py | 1903 | " 2>/dev/null || echo '{"passed":true}' | CODE |
| HIGH | code_review_graph/skills.py | 1925 | " <<< "$output" 2>/dev/null || echo '{"passed":true}' | CODE |
| HIGH | code_review_graph/skills.py | 1947 | " <<< "$output" 2>/dev/null || echo '{"passed":true}' | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 953 | var bg = communityColoringOn && d.community_id != null ? communityColorScale(d.community_id) : (KIND_COLOR[d.kind] || | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 958 | if (d.line_start != null) h += '<div class="tt-row"><span class="tt-label">Lines: </span>' + d.line_start + ' \u2013 ' | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 958 | if (d.line_start != null) h += '<div class="tt-row"><span class="tt-label">Lines: </span>' + d.line_start + ' \u2013 ' | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 961 | if (d.community_id != null) { | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1014 | CONTAINS: { dash:null, width:1, opacity:0.14, marker:"" }, | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1015 | CALLS: { dash:null, width:2, opacity:0.7, marker:"url(#arrow-calls)" }, | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1022 | function eStyle(d) { return EDGE_CFG[d.kind] || {dash:null,width:1,opacity:0.3,marker:""}; } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1025 | if (communityColoringOn && d.community_id != null) return communityColorScale(d.community_id); | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1025 | if (communityColoringOn && d.community_id != null) return communityColorScale(d.community_id); | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1096 | var best = null, bestDist = Infinity; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1102 | if (ev.key === "ArrowRight" && dx > 0 && Math.abs(dy) < Math.abs(dx)) ok = true; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1103 | if (ev.key === "ArrowLeft" && dx < 0 && Math.abs(dy) < Math.abs(dx)) ok = true; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1104 | if (ev.key === "ArrowDown" && dy > 0 && Math.abs(dx) < Math.abs(dy)) ok = true; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1105 | if (ev.key === "ArrowUp" && dy < 0 && Math.abs(dx) < Math.abs(dy)) ok = true; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1106 | if (ok && dist < bestDist) { best = n; bestDist = dist; } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1313 | return d._hidden ? "none" : null; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1322 | if (cid == null) { | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1325 | if (cid != null && hiddenCommunities.has(cid)) { | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1328 | return null; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1333 | if (cid == null) { | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1336 | if (cid != null && hiddenCommunities.has(cid)) { | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1339 | return null; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1343 | var activeFlowQns = null; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1346 | if (idx === "") { activeFlowQns = null; clearFlowHighlight(); return; } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1355 | if (!activeFlowQns || activeFlowQns.size === 0) { clearFlowHighlight(); return; } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1392 | if (t === d.qualified_name && e.kind === "CALLS") { var sN = nodeById.get(s); if (sN) callers.push(sN); } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1392 | if (t === d.qualified_name && e.kind === "CALLS") { var sN = nodeById.get(s); if (sN) callers.push(sN); } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1393 | if (s === d.qualified_name && e.kind === "CALLS") { var tN = nodeById.get(t); if (tN) callees.push(tN); } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1393 | if (s === d.qualified_name && e.kind === "CALLS") { var tN = nodeById.get(t); if (tN) callees.push(tN); } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1396 | var bg = communityColoringOn && d.community_id != null ? communityColorScale(d.community_id) : (KIND_COLOR[d.kind] || | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1402 | if (d.community_id != null) { | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1771 | CROSS_COMMUNITY: { dash: null, width: 2, opacity: 0.6, marker: "" }, | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1773 | CONTAINS: { dash: null, width: 1, opacity: 0.08, marker: "" }, | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1774 | CALLS: { dash: null, width: 1.5, opacity: 0.7, marker: "url(#arrow-calls)" }, | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1778 | function eStyle(d) { return EDGE_CFG[d.kind] || { dash: null, width: 1, opacity: 0.3, marker: "" }; } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1883 | if (d.line_start != null) addRow("Lines", d.line_start + " \u2013 " + (d.line_end || d.line_start)); | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1883 | if (d.line_start != null) addRow("Lines", d.line_start + " \u2013 " + (d.line_end || d.line_start)); | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1886 | if (d.weight != null) addRow("Weight", d.weight); | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1926 | var linkSel = null, labelSel = null; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1928 | var simulation = null; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1934 | if (d.kind === "Community") return Math.max(12, Math.min(40, 8 + Math.sqrt(d.member_count || 1) * 3)); | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1936 | if (d.symbol_count != null) return Math.max(8, Math.min(30, 6 + Math.sqrt(d.symbol_count || 1) * 2)); | CODE |
| 77 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | code_review_graph/communities.py | 7 | CODE | |
| LOW | code_review_graph/exports.py | 3 | CODE | |
| LOW | code_review_graph/forget.py | 20 | CODE | |
| LOW | code_review_graph/changes.py | 7 | CODE | |
| LOW | code_review_graph/spring_resolver.py | 18 | CODE | |
| LOW | code_review_graph/tsconfig_resolver.py | 10 | CODE | |
| LOW | code_review_graph/scoped_resolver.py | 60 | CODE | |
| LOW | code_review_graph/analysis.py | 4 | CODE | |
| LOW | code_review_graph/jedi_resolver.py | 12 | CODE | |
| LOW | code_review_graph/refactor.py | 9 | CODE | |
| LOW | code_review_graph/skills.py | 9 | CODE | |
| LOW | code_review_graph/memory.py | 3 | CODE | |
| LOW | code_review_graph/enrich.py | 8 | CODE | |
| LOW | code_review_graph/http_origin_guard.py | 29 | CODE | |
| LOW | code_review_graph/registry.py | 7 | CODE | |
| LOW | code_review_graph/python_resolver.py | 3 | CODE | |
| LOW | code_review_graph/context_savings.py | 7 | CODE | |
| LOW | code_review_graph/graph.py | 8 | CODE | |
| LOW | code_review_graph/graph_diff.py | 3 | CODE | |
| LOW | code_review_graph/constants.py | 3 | CODE | |
| LOW | code_review_graph/__init__.py | 3 | CODE | |
| LOW | code_review_graph/__init__.py | 3 | CODE | |
| LOW | code_review_graph/__init__.py | 3 | CODE | |
| LOW | code_review_graph/__init__.py | 3 | CODE | |
| LOW | code_review_graph/__init__.py | 3 | CODE | |
| LOW | code_review_graph/rescript_resolver.py | 23 | CODE | |
| LOW | code_review_graph/visualization.py | 16 | CODE | |
| LOW | code_review_graph/hcl_resolver.py | 3 | CODE | |
| LOW | code_review_graph/prompts.py | 13 | CODE | |
| LOW | code_review_graph/uncertainty.py | 23 | CODE | |
| LOW | code_review_graph/embeddings.py | 12 | CODE | |
| LOW | code_review_graph/embeddings.py | 1029 | CODE | |
| LOW | code_review_graph/cli.py | 29 | CODE | |
| LOW | code_review_graph/custom_languages.py | 24 | CODE | |
| LOW | code_review_graph/uninstall.py | 9 | CODE | |
| LOW | code_review_graph/_legacy_instructions.py | 16 | CODE | |
| LOW | code_review_graph/migrations.py | 7 | CODE | |
| LOW | code_review_graph/search.py | 8 | CODE | |
| LOW | code_review_graph/flows.py | 9 | CODE | |
| LOW | code_review_graph/postprocessing.py | 20 | CODE | |
| LOW | code_review_graph/hints.py | 9 | CODE | |
| LOW | code_review_graph/main.py | 11 | CODE | |
| LOW | code_review_graph/wiki.py | 7 | CODE | |
| LOW | code_review_graph/daemon_cli.py | 13 | CODE | |
| LOW | code_review_graph/daemon.py | 11 | CODE | |
| LOW | code_review_graph/config_keys.py | 3 | CODE | |
| LOW | code_review_graph/event_resolver.py | 3 | CODE | |
| LOW | code_review_graph/token_benchmark.py | 3 | CODE | |
| LOW | code_review_graph/incremental.py | 7 | CODE | |
| LOW | code_review_graph/incremental.py | 2490 | CODE | |
| LOW | code_review_graph/temporal_resolver.py | 19 | CODE | |
| LOW | code_review_graph/tools/analysis_tools.py | 3 | CODE | |
| LOW | code_review_graph/tools/build.py | 3 | CODE | |
| LOW | code_review_graph/tools/query.py | 3 | CODE | |
| LOW | code_review_graph/tools/refactor_tools.py | 3 | CODE | |
| LOW | code_review_graph/tools/community_tools.py | 3 | CODE | |
| LOW | code_review_graph/tools/_common.py | 3 | CODE | |
| LOW | code_review_graph/tools/__init__.py | 34 | CODE | |
| LOW | code_review_graph/tools/__init__.py | 37 | CODE | |
| LOW | code_review_graph/tools/__init__.py | 38 | CODE | |
| 101 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | code_review_graph/communities.py | 145 | CODE | |
| LOW | code_review_graph/communities.py | 565 | CODE | |
| LOW | code_review_graph/communities.py | 732 | CODE | |
| LOW | code_review_graph/exports.py | 178 | CODE | |
| LOW | code_review_graph/exports.py | 195 | CODE | |
| LOW | code_review_graph/changes.py | 279 | CODE | |
| LOW | code_review_graph/tsconfig_resolver.py | 74 | CODE | |
| LOW | code_review_graph/tsconfig_resolver.py | 155 | CODE | |
| LOW | code_review_graph/scoped_resolver.py | 249 | CODE | |
| LOW | code_review_graph/refactor.py | 244 | CODE | |
| LOW | code_review_graph/refactor.py | 621 | CODE | |
| LOW | code_review_graph/refactor.py | 714 | CODE | |
| LOW | code_review_graph/refactor.py | 310 | CODE | |
| LOW | code_review_graph/skills.py | 37 | CODE | |
| LOW | code_review_graph/skills.py | 616 | CODE | |
| LOW | code_review_graph/skills.py | 693 | CODE | |
| LOW | code_review_graph/skills.py | 1205 | CODE | |
| LOW | code_review_graph/skills.py | 1285 | CODE | |
| LOW | code_review_graph/memory.py | 77 | CODE | |
| LOW | code_review_graph/enrich.py | 30 | CODE | |
| LOW | code_review_graph/http_origin_guard.py | 68 | CODE | |
| LOW | code_review_graph/registry.py | 64 | CODE | |
| LOW | code_review_graph/graph.py | 541 | CODE | |
| LOW | code_review_graph/graph.py | 746 | CODE | |
| LOW | code_review_graph/graph.py | 965 | CODE | |
| LOW | code_review_graph/graph.py | 1316 | CODE | |
| LOW | code_review_graph/graph.py | 1584 | CODE | |
| LOW | code_review_graph/visualization.py | 98 | CODE | |
| LOW | code_review_graph/parser.py | 134 | CODE | |
| LOW | code_review_graph/parser.py | 390 | CODE | |
| LOW | code_review_graph/parser.py | 588 | CODE | |
| LOW | code_review_graph/parser.py | 1424 | CODE | |
| LOW | code_review_graph/parser.py | 1484 | CODE | |
| LOW | code_review_graph/parser.py | 1499 | CODE | |
| LOW | code_review_graph/parser.py | 1664 | CODE | |
| LOW | code_review_graph/parser.py | 1749 | CODE | |
| LOW | code_review_graph/parser.py | 1918 | CODE | |
| LOW | code_review_graph/parser.py | 1950 | CODE | |
| LOW | code_review_graph/parser.py | 1975 | CODE | |
| LOW | code_review_graph/parser.py | 2026 | CODE | |
| LOW | code_review_graph/parser.py | 2083 | CODE | |
| LOW | code_review_graph/parser.py | 2827 | CODE | |
| LOW | code_review_graph/parser.py | 2972 | CODE | |
| LOW | code_review_graph/parser.py | 3083 | CODE | |
| LOW | code_review_graph/parser.py | 3213 | CODE | |
| LOW | code_review_graph/parser.py | 3297 | CODE | |
| LOW | code_review_graph/parser.py | 3432 | CODE | |
| LOW | code_review_graph/parser.py | 3534 | CODE | |
| LOW | code_review_graph/parser.py | 3957 | CODE | |
| LOW | code_review_graph/parser.py | 4588 | CODE | |
| LOW | code_review_graph/parser.py | 4652 | CODE | |
| LOW | code_review_graph/parser.py | 5060 | CODE | |
| LOW | code_review_graph/parser.py | 5275 | CODE | |
| LOW | code_review_graph/parser.py | 5515 | CODE | |
| LOW | code_review_graph/parser.py | 5557 | CODE | |
| LOW | code_review_graph/parser.py | 5598 | CODE | |
| LOW | code_review_graph/parser.py | 5901 | CODE | |
| LOW | code_review_graph/parser.py | 6563 | CODE | |
| LOW | code_review_graph/parser.py | 6592 | CODE | |
| LOW | code_review_graph/parser.py | 6778 | CODE | |
| 130 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | code_review_graph/communities.py | 720 | except Exception: | CODE |
| LOW | code_review_graph/forget.py | 149 | except Exception as exc: # noqa: BLE001 - a parser failure is non-fatal | CODE |
| LOW | code_review_graph/forget.py | 158 | except Exception as exc: # noqa: BLE001 - resolver failure is non-fatal | CODE |
| LOW | code_review_graph/jedi_resolver.py | 128 | except Exception as e: | CODE |
| LOW | code_review_graph/jedi_resolver.py | 147 | except Exception: # nosec B112 - Jedi may fail on malformed code | CODE |
| LOW | code_review_graph/graph.py | 1239 | except Exception: # nosec B110 - FTS5 table may not exist on older schemas | CODE |
| LOW | code_review_graph/graph.py | 1279 | except Exception: # nosec B110 - FTS5 may not exist on older schemas | CODE |
| LOW | code_review_graph/uncertainty.py | 378 | except Exception: | CODE |
| LOW | code_review_graph/uncertainty.py | 415 | except Exception: | CODE |
| LOW | code_review_graph/uncertainty.py | 442 | except Exception: | CODE |
| LOW | code_review_graph/parser.py | 2311 | except Exception: | CODE |
| LOW | code_review_graph/parser.py | 13194 | except Exception as exc: | CODE |
| LOW | code_review_graph/embeddings.py | 109 | except Exception as exc: # pragma: no cover — best-effort startup hook | CODE |
| LOW | code_review_graph/embeddings.py | 219 | except Exception as e: | CODE |
| LOW | code_review_graph/embeddings.py | 324 | except Exception as e: | CODE |
| LOW | code_review_graph/embeddings.py | 492 | except Exception: | CODE |
| LOW | code_review_graph/embeddings.py | 503 | except Exception: # nosec B110 | CODE |
| LOW | code_review_graph/embeddings.py | 567 | except Exception as e: | CODE |
| LOW | code_review_graph/embeddings.py | 720 | except Exception: | CODE |
| LOW | code_review_graph/embeddings.py | 731 | except Exception: # nosec B110 | CODE |
| LOW | code_review_graph/embeddings.py | 777 | except Exception as e: | CODE |
| LOW | code_review_graph/embeddings.py | 837 | except Exception: | CODE |
| LOW | code_review_graph/cli.py | 412 | except Exception as exc: | CODE |
| LOW⚡ | code_review_graph/cli.py | 434 | except Exception as exc: | CODE |
| LOW⚡ | code_review_graph/cli.py | 441 | except Exception as exc: | CODE |
| LOW⚡ | code_review_graph/cli.py | 449 | except Exception as exc: | CODE |
| LOW | code_review_graph/cli.py | 467 | except Exception as exc: | CODE |
| MEDIUM | code_review_graph/cli.py | 1805 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| MEDIUM | code_review_graph/cli.py | 1989 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| LOW⚡ | code_review_graph/search.py | 246 | except Exception as e: | STRING |
| LOW | code_review_graph/search.py | 358 | except Exception as e: | STRING |
| LOW | code_review_graph/postprocessing.py | 199 | except Exception as exc: | CODE |
| MEDIUM⚡ | code_review_graph/daemon_cli.py | 36 | print("Error: Daemon is already running.") | CODE |
| MEDIUM | code_review_graph/daemon_cli.py | 68 | print("Error: Could not read daemon PID.") | CODE |
| MEDIUM | code_review_graph/daemon_cli.py | 79 | print(f"Error: Permission denied sending signal to PID {pid}.") | CODE |
| MEDIUM | code_review_graph/daemon_cli.py | 249 | print(f"Error reading log file: {exc}") | CODE |
| MEDIUM | code_review_graph/daemon_cli.py | 265 | print(f"Error: {exc}") | CODE |
| LOW⚡ | code_review_graph/daemon.py | 734 | except Exception: | CODE |
| LOW | code_review_graph/daemon.py | 966 | except Exception: | CODE |
| LOW | code_review_graph/daemon.py | 1236 | except Exception: | CODE |
| MEDIUM | code_review_graph/incremental.py | 1727 | def _call() -> None: | CODE |
| LOW⚡ | code_review_graph/incremental.py | 111 | except Exception as exc: # noqa: BLE001 - best-effort post-pass | CODE |
| LOW⚡ | code_review_graph/incremental.py | 121 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW⚡ | code_review_graph/incremental.py | 133 | except Exception as exc: # noqa: BLE001 - best-effort post-pass | CODE |
| LOW⚡ | code_review_graph/incremental.py | 143 | except Exception as exc: # noqa: BLE001 - best-effort post-pass | CODE |
| LOW⚡ | code_review_graph/incremental.py | 153 | except Exception as exc: # noqa: BLE001 - best-effort post-pass | CODE |
| LOW | code_review_graph/incremental.py | 87 | except Exception as exc: # noqa: BLE001 - best-effort post-pass | CODE |
| LOW | code_review_graph/incremental.py | 99 | except Exception as exc: # noqa: BLE001 - best-effort post-pass | CODE |
| LOW | code_review_graph/incremental.py | 396 | except Exception as exc: | CODE |
| LOW | code_review_graph/incremental.py | 1241 | except Exception as e: | CODE |
| LOW | code_review_graph/incremental.py | 1296 | except Exception as e: | CODE |
| LOW | code_review_graph/incremental.py | 1479 | except Exception as e: | CODE |
| LOW | code_review_graph/incremental.py | 1730 | except Exception as exc: # noqa: BLE001 - teardown must not mask the real error | CODE |
| LOW | code_review_graph/incremental.py | 1748 | except Exception as exc: # noqa: BLE001 - health reporting is best-effort | CODE |
| LOW | code_review_graph/tools/build.py | 43 | except Exception as exc: | CODE |
| LOW⚡ | code_review_graph/tools/refactor_tools.py | 177 | except Exception as exc: | CODE |
| LOW⚡ | code_review_graph/tools/community_tools.py | 114 | except Exception as exc: | CODE |
| LOW⚡ | code_review_graph/tools/community_tools.py | 200 | except Exception as exc: | CODE |
| LOW | code_review_graph/tools/community_tools.py | 337 | except Exception as exc: | CODE |
| LOW | code_review_graph/tools/_common.py | 121 | except Exception: | CODE |
| 23 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | code_review_graph/communities.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | code_review_graph/exports.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/forget.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/changes.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/spring_resolver.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tsconfig_resolver.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/scoped_resolver.py | 69 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/analysis.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/jedi_resolver.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/refactor.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/skills.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/memory.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/enrich.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/registry.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/python_resolver.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/graph.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/graph.py | 394 | def set_metadata(self, key: str, value: str) -> None: | CODE |
| LOW | code_review_graph/graph_diff.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/__init__.py | 13 | __all__ = [ | CODE |
| LOW | code_review_graph/rescript_resolver.py | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/visualization.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/hcl_resolver.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/uncertainty.py | 38 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/parser.py | 451 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/embeddings.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/cli.py | 52 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/custom_languages.py | 45 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/migrations.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/migrations.py | 34 | def _set_schema_version(conn: sqlite3.Connection, version: int) -> None: | CODE |
| LOW⚡ | code_review_graph/search.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | code_review_graph/flows.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/postprocessing.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/main.py | 67 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/wiki.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | code_review_graph/daemon_cli.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | code_review_graph/daemon.py | 38 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/daemon.py | 1154 | def _setup_signal_handlers(self) -> None: | CODE |
| LOW | code_review_graph/event_resolver.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/token_benchmark.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/incremental.py | 76 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/temporal_resolver.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tools/build.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | code_review_graph/tools/query.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tools/_common.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tools/__init__.py | 106 | __all__ = [ | CODE |
| LOW⚡ | code_review_graph/tools/docs.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tools/review.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tools/context.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | code_review_graph/tools/registry_tools.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/eval/runner.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/eval/__init__.py | 22 | __all__ = [ | CODE |
| LOW | code_review_graph/eval/token_benchmark.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/eval/benchmarks/build_performance.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/eval/benchmarks/agent_baseline.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | …de_review_graph/eval/benchmarks/multi_hop_retrieval.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/eval/benchmarks/search_quality.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/eval/benchmarks/flow_completeness.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/eval/benchmarks/impact_accuracy.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/eval/benchmarks/token_efficiency.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/test_agent_transparency.py | 28 | def _set_build_metadata(store: GraphStore, sha: str) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_registry.py | 111 | # Create a new registry from the same file | COMMENT |
| MEDIUM | tests/test_flows.py | 289 | # Create a chain of 20 functions. | COMMENT |
| MEDIUM | tests/test_multilang.py | 428 | # Create a mini Java project with two packages | COMMENT |
| MEDIUM | tests/test_daemon.py | 751 | # Create a new repo directory for alpha with a different path (no graph.db) | COMMENT |
| MEDIUM | tests/test_incremental.py | 704 | # Create a simple Python file | COMMENT |
| MEDIUM⚡ | tests/test_integration_git.py | 279 | # Create the parent repo and add lib as a submodule | COMMENT |
| MEDIUM⚡ | tests/test_integration_git.py | 363 | # Create a legitimate page | COMMENT |
| MEDIUM | tests/test_tools.py | 1854 | # Create the two communities and stamp community_id on nodes. | COMMENT |
| MEDIUM | tests/test_tools.py | 2065 | # Create a small graph | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | code_review_graph/changes.py | 421 | # Diff keys are forward-slash paths relative to the repo root, but | COMMENT |
| LOW | code_review_graph/visualization.py | 521 | COMMENT | |
| LOW | code_review_graph/parser.py | 1041 | # inside class_implementation. C-style function_definition is also present | COMMENT |
| LOW | code_review_graph/parser.py | 1101 | "bash": [], | COMMENT |
| LOW | code_review_graph/parser.py | 6341 | ): | COMMENT |
| LOW | code_review_graph/parser.py | 11981 | return component_name | COMMENT |
| LOW | code_review_graph/parser.py | 13661 | # APPEND the extension — never `with_suffix`, which REPLACES the | COMMENT |
| LOW | code_review_graph/parser.py | 15701 | val = child.text.decode("utf-8", errors="replace").strip("'\"") | COMMENT |
| LOW | code_review_graph/embeddings.py | 521 | # OpenAI spec: data[i].index maps to input[i], but some | COMMENT |
| LOW | code_review_graph/daemon.py | 61 | return crg_home() / "logs" | COMMENT |
| LOW | code_review_graph/tools/_common.py | 261 | COMMENT | |
| LOW | code_review_graph/tools/review.py | 41 | # flow (~980 tokens each), so 50 flows is still ~49k tokens — #849 was only | COMMENT |
| LOW | .serena/project.yml | 1 | # the name by which the project can be referenced within Serena | COMMENT |
| LOW | .serena/project.yml | 21 | # - For JavaScript, use typescript | COMMENT |
| LOW | .serena/project.yml | 41 | # The language backend to use for this project. | COMMENT |
| LOW | .serena/project.yml | 61 | COMMENT | |
| LOW | .serena/project.yml | 81 | # * `execute_shell_command`: Executes a shell command. | COMMENT |
| LOW | .serena/project.yml | 101 | # * `rename_symbol`: Renames a symbol throughout the codebase using language server refactoring capabilities. | COMMENT |
| LOW | .serena/project.yml | 121 | # If the setting is undefined, the base_modes from the global configuration (serena_config.yml) apply. | COMMENT |
| LOW | .serena/project.yml | 141 | # If null or missing, use the setting from the global configuration. | COMMENT |
| LOW | tests/test_parser.py | 1321 | # live_helper: emitted (no guard) | COMMENT |
| LOW | tests/test_token_budget.py | 181 | COMMENT | |
| LOW | .beads/config.yaml | 1 | # Beads Configuration File | COMMENT |
| LOW | .beads/config.yaml | 21 | # title-length: 255 | COMMENT |
| LOW | .beads/config.yaml | 41 | # backup: | COMMENT |
| LOW | docs/COMMANDS.md | 381 | code-review-graph visualize --serve # Serve graph.html on localhost:8765 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | code_review_graph/eval/token_benchmark.py | 28 | # Step 1: get_minimal_context | COMMENT |
| LOW⚡ | code_review_graph/eval/token_benchmark.py | 34 | # Step 2: detect_changes (minimal) | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 342 | # Step 1: Trigger | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 350 | # Step 2: Detect | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 524 | # Step 1: User asks | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 532 | # Step 2: Claude Code | COMMENT |
| LOW | diagrams/generate_diagrams.py | 363 | # Step 3: Cascade | COMMENT |
| LOW | diagrams/generate_diagrams.py | 376 | # Step 4: Re-parse | COMMENT |
| LOW | diagrams/generate_diagrams.py | 545 | # Step 3: MCP call | COMMENT |
| LOW | diagrams/generate_diagrams.py | 558 | # Step 4: Graph query | COMMENT |
| LOW | diagrams/generate_diagrams.py | 570 | # Step 5: Claude responds | COMMENT |
| LOW⚡ | tests/test_refactor.py | 761 | # Step 2: refactor_id should still be valid — dry_run doesn't consume it | COMMENT |
| LOW⚡ | tests/test_refactor.py | 765 | # Step 3: real apply — uses same refactor_id | COMMENT |
| LOW | tests/test_refactor.py | 746 | # Step 1: dry_run — no writes, returns diff | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | code_review_graph/eval/token_benchmark.py | 28 | # Step 1: get_minimal_context | COMMENT |
| LOW⚡ | code_review_graph/eval/token_benchmark.py | 34 | # Step 2: detect_changes (minimal) | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 342 | # Step 1: Trigger | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 350 | # Step 2: Detect | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 524 | # Step 1: User asks | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 532 | # Step 2: Claude Code | COMMENT |
| LOW | diagrams/generate_diagrams.py | 363 | # Step 3: Cascade | COMMENT |
| LOW | diagrams/generate_diagrams.py | 376 | # Step 4: Re-parse | COMMENT |
| LOW | diagrams/generate_diagrams.py | 545 | # Step 3: MCP call | COMMENT |
| LOW | diagrams/generate_diagrams.py | 558 | # Step 4: Graph query | COMMENT |
| LOW | diagrams/generate_diagrams.py | 570 | # Step 5: Claude responds | COMMENT |
| LOW⚡ | tests/test_refactor.py | 761 | # Step 2: refactor_id should still be valid — dry_run doesn't consume it | COMMENT |
| LOW⚡ | tests/test_refactor.py | 765 | # Step 3: real apply — uses same refactor_id | COMMENT |
| LOW | tests/test_refactor.py | 746 | # Step 1: dry_run — no writes, returns diff | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | code_review_graph/registry.py | 67 | Register a repository path. Validates that the path contains a ``.git`` or ``.code-review-graph`` direc | STRING |
| HIGH | code_review_graph/daemon.py | 149 | Load daemon configuration from a TOML file. Args: path: Explicit config path. Falls back to :func:`default | STRING |
| HIGH | code_review_graph/daemon.py | 310 | Add a repository to the daemon config and persist the change. Args: repo_path: Path to the repository (wi | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | code_review_graph/tools/analysis_tools.py | 0 | keep only *fields* on each row, dropping keys the row does not have. | STRING |
| HIGH | code_review_graph/tools/refactor_tools.py | 0 | keep only *fields* on each row, dropping keys the row does not have. | STRING |
| HIGH | code_review_graph/tools/review.py | 0 | keep only *fields* on each row, dropping keys the row does not have. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_embeddings.py | 373 | "CRG_OPENAI_API_KEY": "fake-key", | CODE |
| LOW⚡ | tests/test_embeddings.py | 382 | api_key="fake-key", | CODE |
| LOW⚡ | tests/test_embeddings.py | 398 | "CRG_OPENAI_API_KEY": "fake-key", | CODE |
| LOW⚡ | tests/test_integration_git.py | 106 | assert _git(repo, "config", "user.email", "test@test.com").returncode == 0 | CODE |
| LOW⚡ | tests/test_integration_git.py | 273 | _git(lib_repo, "config", "user.email", "test@test.com") | CODE |
| LOW⚡ | tests/test_integration_git.py | 283 | _git(parent, "config", "user.email", "test@test.com") | CODE |
| LOW⚡ | tests/test_integration_git.py | 380 | assert _git(repo, "config", "user.email", "test@test.com").returncode == 0 | CODE |
| LOW | tests/test_integration_git.py | 69 | _git(repo, "config", "user.email", "test@test.com") | CODE |
| LOW | tests/test_integration_git.py | 432 | _git_ok(repo, "config", "user.email", "test@test.com") | CODE |
| LOW | tests/test_integration_git.py | 623 | _git_ok(repo, "config", "user.email", "test@test.com") | CODE |
| LOW | tests/test_integration_git.py | 746 | _git_ok(repo, "config", "user.email", "test@test.com") | CODE |
| LOW | tests/test_eval.py | 298 | ["git", "config", "user.email", "test@test.com"], | CODE |
| LOW | tests/test_eval.py | 441 | ["git", "config", "user.email", "test@test.com"], | CODE |
| LOW | tests/test_eval.py | 515 | ["git", "config", "user.email", "test@test.com"], | CODE |
| LOW | tests/test_eval.py | 585 | _git(repo_path, "config", "user.email", "test@test.com") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | code_review_graph/flows.py | 89 | # FastAPI lifecycle / dependency injection | COMMENT |
| MEDIUM⚡ | code_review_graph/tools/_common.py | 269 | # Every MCP tool response has to survive a client-side context window. #849 | COMMENT |
| MEDIUM | docs/FAQ.md | 51 | ## Isn't this just RAG? | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | code_review_graph/communities.py | 873 | # Check if any communities are affected (batch to stay under SQLite limit) | COMMENT |
| LOW | code_review_graph/refactor.py | 567 | # Check if this is a method override where the base class method | COMMENT |
| LOW | code_review_graph/skills.py | 829 | # Check if already present | COMMENT |
| LOW | code_review_graph/parser.py | 3466 | # Check if all non-empty lines are MAGIC lines | COMMENT |
| LOW | code_review_graph/wiki.py | 108 | # Check if this flow passes through any community member | COMMENT |
| LOW | .serena/project.yml | 123 | # Set this to [] to disable base modes for this project. | COMMENT |
| LOW | .serena/project.yml | 124 | # Set this to a list of mode names to always include the respective modes for this project. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_parser.py | 359 | "def helper():\n" | CODE |
| LOW | tests/test_parser.py | 1300 | b"def helper(): pass\n", | CODE |
| LOW | tests/test_forget_parity.py | 26 | "util.py": "def helper():\n return 41\n", | CODE |
| LOW | tests/test_forget_parity.py | 37 | "src_one/pkg/util.py": "def helper():\n return 1\n", | CODE |
| LOW | tests/test_forget_parity.py | 38 | "src_two/pkg/util.py": "def helper():\n return 2\n", | CODE |
| LOW⚡ | tests/test_integration_git.py | 275 | (lib_repo / "util.py").write_text("def helper():\n pass\n") | CODE |
| LOW⚡ | tests/test_tools.py | 1211 | + "def handle_request():\n" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | code_review_graph/main.py | 291 | CODE | |
| LOW | code_review_graph/main.py | 679 | CODE | |
| LOW | code_review_graph/main.py | 745 | CODE | |
| LOW | code_review_graph/tools/refactor_tools.py | 42 | CODE | |
| LOW | code_review_graph/tools/review.py | 99 | CODE | |
| LOW | code_review_graph/tools/review.py | 527 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_parser.py | 1935 | # the highest-leverage language for the fix after Python. | COMMENT |
| MEDIUM | tests/test_embeddings.py | 905 | """Ensure localhost detection is robust against subdomain tricks.""" | STRING |
| MEDIUM | code-review-graph-vscode/package-lock.json | 3466 | "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .serena/project.yml | 58 | # Same syntax as gitignore, so you can use * and **. | COMMENT |
| LOW | .serena/project.yml | 71 | # To make sure you have the latest list of tools, and to view their descriptions, | COMMENT |