🚀 PR Agent: The Original Open-Source PR Reviewer. This project is not the Qodo free tier.
This report summarizes scanner evidence for The-PR-Agent/pr-agent, a Python project with 13,340 GitHub stars. SynthScan examined 219,371 lines of code across 602 source files, recording 7623 pattern matches distributed across 23 syntactic categories. The legacy adjusted pattern signal is 36.2 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 6681 finding(s).
Are imports declared and package/API names verified? 96 finding(s).
Are wrappers, guards, and repeated structures necessary? 7162 finding(s).
Which changes need focused human review? 7623 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 7623 distinct pattern matches across 23 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | setup.py | 17 | def _help_docs_output_mapping(self) -> dict[str, str]: | CODE |
| LOW | pr_agent/config_loader.py | 103 | def apply_secrets_manager_config(): | CODE |
| LOW | pr_agent/secret_providers/__init__.py | 7 | def validate_secret_provider_setting(): | CODE |
| LOW | pr_agent/mosaico/server.py | 47 | class MosaicoRequestHandler(DefaultRequestHandler): | CODE |
| LOW | pr_agent/mosaico/env_bridge.py | 65 | def _register_langfuse_callback(settings) -> None: | CODE |
| LOW | pr_agent/mosaico/dispatch.py | 233 | def _ask_needs_context_fallback() -> str: | CODE |
| LOW | pr_agent/mosaico/dispatch.py | 281 | def _pr_fetch_failed_fallback(pr_url: str) -> str: | CODE |
| LOW | pr_agent/mosaico/observability.py | 19 | def parse_observability_metadata(raw) -> dict: | CODE |
| LOW | pr_agent/mosaico/diff_provider.py | 47 | def _normalize_file_header_path(path: str) -> str: | CODE |
| LOW | pr_agent/mosaico/diff_provider.py | 160 | def get_request_policy_metadata(self, required_fields: set[str]) -> dict: | CODE |
| LOW | pr_agent/tools/pr_update_changelog.py | 34 | def strip_wrapping_code_fence(text: str) -> str: | CODE |
| LOW | pr_agent/tools/pr_update_changelog.py | 184 | def _publish_changelog_read_error_fallback(self, answer: str = ""): | CODE |
| LOW⚡ | pr_agent/tools/pr_update_changelog.py | 200 | def _publish_changelog_write_error_fallback(self, answer: str): | CODE |
| LOW | pr_agent/tools/pr_update_changelog.py | 270 | def _prepare_changelog_update(self) -> Tuple[str, str]: | CODE |
| LOW⚡ | pr_agent/tools/pr_code_suggestions.py | 87 | def get_suggestions_score_threshold() -> int: | CODE |
| LOW⚡ | pr_agent/tools/pr_code_suggestions.py | 91 | def get_dual_publishing_score_threshold() -> int: | CODE |
| LOW⚡ | pr_agent/tools/pr_code_suggestions.py | 98 | def get_reflection_failure_score() -> int: | CODE |
| LOW⚡ | pr_agent/tools/pr_code_suggestions.py | 107 | def apply_reflection_failure_score(suggestions: List[Dict]) -> None: | CODE |
| LOW⚡ | pr_agent/tools/pr_code_suggestions.py | 115 | def filter_suggestions_by_score_threshold(suggestions: List[Dict], call_index: int = 0) -> List[Dict]: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 140 | def get_committable_code_suggestions() -> bool: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 182 | def render_suggestions_markdown(data: dict) -> str: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 219 | def _supports_code_suggestion_state(git_provider) -> bool: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 224 | def _supports_persistent_progress_comment(git_provider) -> bool: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 335 | def _load_suggestion_discussion_context(self) -> str: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 608 | def _get_suggestions_coverage_footer(self, suggestions_present: bool = True) -> str: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 722 | def publish_persistent_comment_with_history(git_provider: GitProvider, | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 752 | def _publish_persistent_update_failure(): | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 817 | def _is_legacy_suggestions_comment(comment_text: str) -> bool: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1083 | async def _self_reflect_with_fallback(self, suggestion_list: List, patches_diff: str, model: str) -> str: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1118 | async def analyze_self_reflection_response(self, data, response_reflect): | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1222 | def _is_suggestion_line_range_valid(self, suggestion: dict) -> bool: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1245 | def _is_suggestion_line_range_in_diff( | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1281 | def _prepare_pr_code_suggestions(self, predictions: str) -> Dict: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1358 | def _limit_suggestions_per_file(self, suggestions: List[Dict]) -> List[Dict]: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1401 | async def push_inline_code_suggestions(self, data, include_coverage_footer: bool = True) -> None: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1566 | def _validate_python_replacement_syntax( | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1687 | def _infer_space_indentation_unit(space_deltas: list[int]) -> int: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1697 | def _continuation_space_adjustments( | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1855 | def validate_one_liner_suggestion_not_repeating_code(self, suggestion): | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 2225 | async def convert_to_decoupled_with_line_numbers( | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 2281 | def generate_summarized_suggestions(self, data: Dict) -> str: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 2432 | async def self_reflect_on_suggestions(self, | CODE |
| LOW | pr_agent/tools/pr_description.py | 53 | def _build_unprocessed_files_block(file_list: list, label: str, max_files: int = 50) -> str: | CODE |
| LOW | pr_agent/tools/pr_description.py | 570 | def _get_description_coverage_footer(self) -> str: | CODE |
| LOW | pr_agent/tools/pr_description.py | 788 | def _validate_description_schema(data: object) -> bool: | CODE |
| LOW | pr_agent/tools/pr_description.py | 841 | def _prepare_pr_answer_with_markers(self) -> Tuple[str, str]: | CODE |
| LOW | pr_agent/tools/pr_description.py | 1015 | def process_pr_files_prediction(self, pr_body, value): | CODE |
| LOW | pr_agent/tools/pr_similar_issue.py | 94 | def _raise_on_pinecone_upsert_errors(response): | CODE |
| LOW | pr_agent/tools/pr_similar_issue.py | 138 | def _pinecone_response_is_reconciled(response, target_lsn): | CODE |
| LOW | pr_agent/tools/pr_similar_issue.py | 148 | def _wait_for_pinecone_upsert_readiness(pinecone_index, upsert_response, namespace, vector_id): | CODE |
| LOW | pr_agent/tools/pr_similar_issue.py | 164 | def _provider_supports_issue_indexing() -> bool: | CODE |
| LOW | pr_agent/tools/pr_similar_issue.py | 549 | def _update_index_with_issues(self, issues_list, repo_name_for_index, pinecone_namespace, upsert=False): | CODE |
| LOW | pr_agent/tools/pr_similar_issue.py | 660 | def _lancedb_repo_already_indexed(self, repo_name_for_index) -> bool: | CODE |
| LOW | pr_agent/tools/pr_similar_issue.py | 673 | def _update_table_with_issues(self, issues_list, repo_name_for_index, ingest=False, | CODE |
| LOW | pr_agent/tools/pr_similar_issue.py | 775 | def _update_qdrant_with_issues(self, issues_list, repo_name_for_index, ingest=False): | CODE |
| LOW | pr_agent/tools/pr_line_questions.py | 145 | def _load_conversation_history(self) -> str: | CODE |
| LOW | pr_agent/tools/pr_line_questions.py | 222 | def _fit_conversation_history(self, variables, model): | CODE |
| LOW | pr_agent/tools/pr_line_questions.py | 232 | def configured_output_reserve(_model, _default): | CODE |
| LOW⚡ | pr_agent/tools/pr_help_docs.py | 128 | def map_documentation_files_to_contents(base_path: str, doc_files: list[str], | CODE |
| LOW⚡ | pr_agent/tools/pr_help_docs.py | 159 | def aggregate_documentation_files_for_prompt_contents(file_path_to_contents: dict[str, str], | CODE |
| 6243 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pr_agent/algo/__init__.py | 1 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pr_agent/algo/__init__.py | 14 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pr_agent/algo/__init__.py | 19 | # ── 1M-context models (no extended thinking) ───────────────────────── | COMMENT |
| MEDIUM | pr_agent/algo/__init__.py | 46 | # ── Models with extended thinking ──────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unittest/test_extra_config_url.py | 111 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_extra_config_url.py | 113 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_extra_config_url.py | 286 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_extra_config_url.py | 288 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unittest/test_extra_config_url.py | 19 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unittest/test_extra_config_url.py | 21 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unittest/test_extra_config_url.py | 368 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unittest/test_extra_config_url.py | 375 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_extra_config_url.py | 760 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/unittest/test_extra_config_url.py | 762 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | …s/unittest/test_gitlab_provider_exception_narrowing.py | 94 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …s/unittest/test_gitlab_provider_exception_narrowing.py | 96 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_diff_pipeline_core.py | 75 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_diff_pipeline_core.py | 77 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_diff_pipeline_core.py | 174 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_diff_pipeline_core.py | 176 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_diff_pipeline_core.py | 306 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_diff_pipeline_core.py | 308 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_diff_pipeline_core.py | 440 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_diff_pipeline_core.py | 442 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unittest/test_diff_pipeline_core.py | 25 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unittest/test_diff_pipeline_core.py | 27 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unittest/test_mosaico_provider.py | 274 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unittest/test_mosaico_provider.py | 276 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …/unittest/test_review_persistent_comment_authorship.py | 358 | # -------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …/unittest/test_review_persistent_comment_authorship.py | 364 | # -------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_pr_code_suggestions_rendering.py | 68 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_pr_code_suggestions_rendering.py | 70 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_pr_code_suggestions_rendering.py | 657 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_pr_code_suggestions_rendering.py | 659 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_pr_code_suggestions_rendering.py | 722 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_pr_code_suggestions_rendering.py | 724 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_pr_code_suggestions_rendering.py | 237 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/unittest/test_pr_code_suggestions_rendering.py | 239 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/unittest/test_pr_code_suggestions_rendering.py | 356 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/unittest/test_pr_code_suggestions_rendering.py | 358 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/unittest/test_pr_code_suggestions_rendering.py | 439 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/unittest/test_pr_code_suggestions_rendering.py | 441 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/unittest/test_run_status_acknowledgment.py | 62 | # -------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_run_status_acknowledgment.py | 64 | # -------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_run_status_acknowledgment.py | 219 | # -------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_run_status_acknowledgment.py | 221 | # -------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_run_status_acknowledgment.py | 388 | # -------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_run_status_acknowledgment.py | 394 | # -------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_mosaico_router.py | 161 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_mosaico_router.py | 163 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_mosaico_router.py | 183 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_mosaico_router.py | 185 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_mosaico_router.py | 248 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_mosaico_router.py | 250 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_mosaico_router.py | 378 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_mosaico_router.py | 380 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_mosaico_router.py | 438 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_mosaico_router.py | 440 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_mosaico_router.py | 480 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unittest/test_mosaico_router.py | 482 | # --------------------------------------------------------------------------- | COMMENT |
| 184 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pr_agent/config_loader.py | 70 | except Exception: | CODE |
| LOW | pr_agent/config_loader.py | 123 | except Exception as e: | CODE |
| LOW | pr_agent/config_loader.py | 125 | except Exception as e: | CODE |
| LOW | pr_agent/cli.py | 45 | except Exception: | CODE |
| LOW | pr_agent/custom_merge_loader.py | 97 | except Exception as e: | CODE |
| LOW | …agent/secret_providers/aws_secrets_manager_provider.py | 36 | except Exception as e: | CODE |
| LOW | …agent/secret_providers/aws_secrets_manager_provider.py | 48 | except Exception as e: | CODE |
| LOW | …agent/secret_providers/aws_secrets_manager_provider.py | 62 | except Exception as e: | CODE |
| LOW | …agent/secret_providers/aws_secrets_manager_provider.py | 93 | except Exception as e: | CODE |
| MEDIUM | …agent/secret_providers/aws_secrets_manager_provider.py | 24 | def __init__(self): | CODE |
| LOW | …cret_providers/google_cloud_storage_secret_provider.py | 17 | except Exception as e: | CODE |
| LOW | …cret_providers/google_cloud_storage_secret_provider.py | 25 | except Exception as e: | CODE |
| LOW | …cret_providers/google_cloud_storage_secret_provider.py | 36 | except Exception as e: | CODE |
| MEDIUM | …cret_providers/google_cloud_storage_secret_provider.py | 11 | def __init__(self): | CODE |
| LOW | pr_agent/secret_providers/__init__.py | 28 | except Exception as e: | CODE |
| LOW | pr_agent/secret_providers/__init__.py | 34 | except Exception as e: | CODE |
| LOW | pr_agent/mosaico/server.py | 90 | except Exception as e: | CODE |
| LOW | pr_agent/mosaico/dispatch.py | 276 | except Exception as e: | CODE |
| LOW | pr_agent/mosaico/dispatch.py | 398 | except Exception: | CODE |
| LOW | pr_agent/mosaico/observability.py | 106 | except Exception as e: | CODE |
| LOW | pr_agent/mosaico/observability.py | 109 | except Exception as close_error: | CODE |
| LOW | pr_agent/mosaico/observability.py | 120 | except Exception as cleanup_error: | CODE |
| LOW | pr_agent/mosaico/observability.py | 128 | except Exception as e: | CODE |
| LOW | pr_agent/mosaico/executor.py | 141 | except Exception as e: | CODE |
| LOW | pr_agent/mosaico/executor.py | 189 | except Exception as e: | CODE |
| LOW | pr_agent/tools/pr_update_changelog.py | 105 | except Exception as setup_error: | CODE |
| LOW | pr_agent/tools/pr_update_changelog.py | 133 | except Exception as progress_error: | CODE |
| LOW | pr_agent/tools/pr_update_changelog.py | 143 | except Exception as generation_error: | CODE |
| LOW | pr_agent/tools/pr_update_changelog.py | 179 | except Exception as cleanup_error: | CODE |
| LOW⚡ | pr_agent/tools/pr_update_changelog.py | 195 | except Exception as fallback_error: | CODE |
| LOW⚡ | pr_agent/tools/pr_update_changelog.py | 208 | except Exception as fallback_error: | CODE |
| LOW | pr_agent/tools/pr_update_changelog.py | 310 | except Exception: | CODE |
| LOW | pr_agent/tools/pr_update_changelog.py | 322 | except Exception as feedback_error: | CODE |
| LOW | pr_agent/tools/pr_update_changelog.py | 338 | except Exception: | CODE |
| LOW | pr_agent/tools/pr_update_changelog.py | 344 | except Exception as feedback_error: | CODE |
| LOW | pr_agent/tools/pr_update_changelog.py | 389 | except Exception as e: | CODE |
| MEDIUM | pr_agent/tools/pr_code_suggestions.py | 1855 | def validate_one_liner_suggestion_not_repeating_code(self, suggestion): | CODE |
| LOW⚡ | pr_agent/tools/pr_code_suggestions.py | 125 | except Exception as e: | CODE |
| LOW⚡ | pr_agent/tools/pr_code_suggestions.py | 559 | except Exception as cleanup_error: | CODE |
| LOW⚡ | pr_agent/tools/pr_code_suggestions.py | 565 | except Exception as e: | CODE |
| LOW⚡ | pr_agent/tools/pr_code_suggestions.py | 572 | except Exception as cleanup_error: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 340 | except Exception as e: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 380 | except Exception as e: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 528 | except Exception as cleanup_error: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 585 | except Exception as publish_error: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 684 | except Exception as cleanup_error: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 714 | except Exception as e: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 747 | except Exception as remove_error: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 765 | except Exception as error: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 774 | except Exception as error: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 964 | except Exception as e: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 982 | except Exception as remove_error: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1160 | except Exception as e: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1164 | except Exception: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1183 | except Exception as e: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1334 | except Exception as e: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1544 | except Exception as e: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1587 | except Exception as e: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1602 | except Exception as e: | CODE |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1850 | except Exception as e: | CODE |
| 474 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pr_agent/config_loader.py | 129 | except ImportError: | CODE |
| HIGH | pr_agent/git_providers/azuredevops_provider.py | 970 | except Exception: | CODE |
| HIGH | pr_agent/git_providers/github_provider.py | 450 | except ContextDoesNotExistError: | CODE |
| HIGH | pr_agent/git_providers/github_provider.py | 569 | except ContextDoesNotExistError: | CODE |
| HIGH | pr_agent/git_providers/github_provider.py | 1285 | except (GithubException, RequestException): | CODE |
| HIGH | pr_agent/git_providers/github_provider.py | 467 | except AttributeError: | CODE |
| HIGH | pr_agent/git_providers/gitlab_provider.py | 362 | except (AttributeError, TypeError, ValueError): | CODE |
| HIGH | pr_agent/git_providers/gitlab_provider.py | 371 | except (AttributeError, TypeError, ValueError): | CODE |
| HIGH | pr_agent/git_providers/gitlab_provider.py | 1148 | except (KeyError, TypeError): | CODE |
| HIGH | pr_agent/git_providers/__init__.py | 159 | except Exception: | CODE |
| HIGH | pr_agent/git_providers/bitbucket_provider.py | 313 | except Exception: | CODE |
| HIGH | pr_agent/git_providers/utils.py | 309 | except Exception: | CODE |
| HIGH | pr_agent/algo/utils.py | 1139 | except Exception: | CODE |
| HIGH | pr_agent/algo/utils.py | 1150 | except Exception: | CODE |
| HIGH | pr_agent/algo/utils.py | 1184 | except Exception: | CODE |
| HIGH | pr_agent/algo/utils.py | 1211 | except Exception: | CODE |
| HIGH | pr_agent/algo/utils.py | 1251 | except Exception: | CODE |
| HIGH | pr_agent/algo/utils.py | 1329 | except Exception: | CODE |
| HIGH | pr_agent/algo/utils.py | 1340 | except Exception: | CODE |
| HIGH | pr_agent/algo/utils.py | 964 | except Exception: | CODE |
| HIGH | pr_agent/algo/utils.py | 1289 | except Exception: | CODE |
| HIGH | pr_agent/algo/utils.py | 1302 | except Exception: | CODE |
| HIGH | pr_agent/algo/utils.py | 1352 | except Exception: | CODE |
| HIGH | pr_agent/algo/utils.py | 1238 | except Exception: | CODE |
| HIGH | pr_agent/algo/pr_processing.py | 243 | except Exception: | CODE |
| HIGH | pr_agent/algo/pr_processing.py | 398 | except Exception: | CODE |
| HIGH | pr_agent/algo/git_patch_processing.py | 255 | except (UnicodeError, LookupError): | CODE |
| HIGH | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 827 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 424 | except FileNotFoundError: | CODE |
| HIGH | pr_agent/algo/ai_handlers/litellm_helpers.py | 80 | except Exception: | CODE |
| HIGH | pr_agent/algo/ai_handlers/litellm_helpers.py | 589 | except Exception: | CODE |
| HIGH | pr_agent/algo/ai_handlers/cloud_auth.py | 1376 | except FileNotFoundError: | CODE |
| HIGH | pr_agent/algo/ai_handlers/langchain_ai_handler.py | 16 | except ImportError: # we don't enforce langchain as a dependency, so if it's not installed, just move on | CODE |
| HIGH | pr_agent/servers/github_lambda_webhook.py | 15 | except ImportError: | CODE |
| HIGH | pr_agent/servers/gitlab_lambda_webhook.py | 15 | except ImportError: | CODE |
| HIGH | pr_agent/servers/gunicorn_config.py | 98 | except (OSError, ValueError): | CODE |
| HIGH | pr_agent/servers/gunicorn_config.py | 107 | except (OSError, ValueError): | CODE |
| HIGH | tests/unittest/test_extra_config_url.py | 585 | except Exception: | CODE |
| HIGH | tests/unittest/test_extra_config_url.py | 583 | except Exception: | CODE |
| HIGH | tests/unittest/test_extra_config_url.py | 938 | except StopIteration: | CODE |
| HIGH | tests/unittest/test_litellm_callback_drain.py | 145 | except RuntimeError: | CODE |
| HIGH | tests/unittest/test_inline_comment_dedup.py | 170 | except NotImplementedError: | CODE |
| HIGH | tests/unittest/test_streaming_api_error_construction.py | 391 | except asyncio.CancelledError: | CODE |
| HIGH | tests/unittest/test_provider_http_timeout.py | 201 | except Exception: | CODE |
| HIGH | tests/unittest/test_provider_http_timeout.py | 242 | except Exception: | CODE |
| HIGH | tests/unittest/test_provider_http_timeout.py | 100 | except Exception: | CODE |
| HIGH | scripts/generate_config_reference.py | 78 | except tomllib.TOMLDecodeError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pr_agent/config_loader.py | 103 | CODE | |
| LOW | pr_agent/config_loader.py | 134 | CODE | |
| LOW | pr_agent/cli.py | 176 | CODE | |
| LOW | pr_agent/custom_merge_loader.py | 12 | CODE | |
| LOW | …agent/secret_providers/aws_secrets_manager_provider.py | 68 | CODE | |
| LOW | pr_agent/mosaico/dispatch.py | 368 | CODE | |
| LOW | pr_agent/mosaico/diff_provider.py | 57 | CODE | |
| LOW | pr_agent/mosaico/executor.py | 49 | CODE | |
| LOW | pr_agent/tools/pr_update_changelog.py | 54 | CODE | |
| LOW | pr_agent/tools/pr_update_changelog.py | 115 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 367 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 641 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 698 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 722 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1118 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1281 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1401 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1697 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1805 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1855 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1882 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1980 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 2225 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 2281 | CODE | |
| LOW | pr_agent/tools/pr_description.py | 1145 | CODE | |
| LOW | pr_agent/tools/pr_description.py | 1229 | CODE | |
| LOW | pr_agent/tools/pr_description.py | 139 | CODE | |
| LOW | pr_agent/tools/pr_description.py | 322 | CODE | |
| LOW | pr_agent/tools/pr_description.py | 591 | CODE | |
| LOW | pr_agent/tools/pr_description.py | 814 | CODE | |
| LOW | pr_agent/tools/pr_description.py | 897 | CODE | |
| LOW | pr_agent/tools/pr_description.py | 1015 | CODE | |
| LOW | pr_agent/tools/pr_similar_issue.py | 180 | CODE | |
| LOW | pr_agent/tools/pr_similar_issue.py | 419 | CODE | |
| LOW | pr_agent/tools/pr_similar_issue.py | 549 | CODE | |
| LOW | pr_agent/tools/pr_similar_issue.py | 673 | CODE | |
| LOW | pr_agent/tools/pr_similar_issue.py | 775 | CODE | |
| LOW | pr_agent/tools/pr_add_docs.py | 276 | CODE | |
| LOW | pr_agent/tools/pr_add_docs.py | 224 | CODE | |
| LOW | pr_agent/tools/pr_line_questions.py | 59 | CODE | |
| LOW | pr_agent/tools/pr_generate_labels.py | 73 | CODE | |
| LOW | pr_agent/tools/pr_generate_labels.py | 231 | CODE | |
| LOW | pr_agent/tools/pr_help_docs.py | 88 | CODE | |
| LOW | pr_agent/tools/pr_help_docs.py | 128 | CODE | |
| LOW | pr_agent/tools/pr_help_docs.py | 159 | CODE | |
| LOW | pr_agent/tools/pr_help_docs.py | 185 | CODE | |
| LOW | pr_agent/tools/pr_help_docs.py | 498 | CODE | |
| LOW | pr_agent/tools/pr_help_docs.py | 546 | CODE | |
| LOW | pr_agent/tools/pr_reviewer.py | 295 | CODE | |
| LOW | pr_agent/tools/pr_reviewer.py | 1286 | CODE | |
| LOW | pr_agent/tools/pr_reviewer.py | 1585 | CODE | |
| LOW | pr_agent/tools/pr_reviewer.py | 1667 | CODE | |
| LOW | pr_agent/tools/pr_help_message.py | 81 | CODE | |
| LOW | pr_agent/tools/pr_help_message.py | 84 | CODE | |
| LOW | pr_agent/tools/pr_help_message.py | 432 | CODE | |
| LOW | pr_agent/tools/ticket_pr_compliance_check.py | 166 | CODE | |
| LOW | pr_agent/tools/ticket_pr_compliance_check.py | 645 | CODE | |
| LOW | pr_agent/tools/ticket_pr_compliance_check.py | 701 | CODE | |
| LOW | pr_agent/tools/ticket_pr_compliance_check.py | 915 | CODE | |
| LOW | pr_agent/tools/ticket_pr_compliance_check.py | 1156 | CODE | |
| 159 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pr_agent/git_providers/codecommit_provider.py | 0 | retrieves the list of files that have been modified, added, deleted, or renamed in a pull request in gitlab, along with | STRING |
| HIGH | pr_agent/git_providers/github_provider.py | 0 | retrieves the list of files that have been modified, added, deleted, or renamed in a pull request in gitlab, along with | STRING |
| HIGH | pr_agent/git_providers/gitlab_provider.py | 0 | retrieves the list of files that have been modified, added, deleted, or renamed in a pull request in gitlab, along with | STRING |
| HIGH | tests/unittest/test_mosaico_smoke.py | 0 | \ review: estimated_effort_to_review_[1-5]: '2' score: '85' relevant_tests: 'no' key_issues_to_review: - relevant_file: | STRING |
| HIGH | tests/unittest/test_mosaico_provider.py | 0 | \ review: estimated_effort_to_review_[1-5]: '2' score: '85' relevant_tests: 'no' key_issues_to_review: - relevant_file: | STRING |
| HIGH | tests/unittest/test_mosaico_a2a_roundtrip.py | 0 | \ review: estimated_effort_to_review_[1-5]: '2' score: '85' relevant_tests: 'no' key_issues_to_review: - relevant_file: | STRING |
| HIGH | tests/unittest/test_similar_issue_pinecone.py | 0 | oversized rejects are not counted so the scan budget reaches older index gaps. | STRING |
| HIGH | tests/unittest/test_similar_issue_qdrant_ingest.py | 0 | oversized rejects are not counted so the scan budget reaches older index gaps. | STRING |
| HIGH | tests/unittest/test_similar_issue_lancedb_ingest.py | 0 | oversized rejects are not counted so the scan budget reaches older index gaps. | STRING |
| HIGH | tests/unittest/test_plain_diff_provider.py | 0 | diff --git a/foo.py b/foo.py index 1111111..2222222 100644 --- a/foo.py +++ b/foo.py @@ -1,3 +1,3 @@ line1 -line2 +line2 | STRING |
| HIGH | tests/unittest/test_plain_diff_mode_e2e.py | 0 | diff --git a/foo.py b/foo.py index 1111111..2222222 100644 --- a/foo.py +++ b/foo.py @@ -1,3 +1,3 @@ line1 -line2 +line2 | STRING |
| HIGH | tests/unittest/test_diff_parsing.py | 0 | diff --git a/foo.py b/foo.py index 1111111..2222222 100644 --- a/foo.py +++ b/foo.py @@ -1,3 +1,3 @@ line1 -line2 +line2 | STRING |
| HIGH | tests/unittest/test_gitlab_project_reads.py | 0 | the parts of `requests.response` that python-gitlab reads. | STRING |
| HIGH | tests/unittest/test_gitlab_reaction_requests.py | 0 | the parts of `requests.response` that python-gitlab reads. | STRING |
| HIGH | tests/unittest/test_gitlab_reaction_removal.py | 0 | the parts of `requests.response` that python-gitlab reads. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pr_agent/tools/pr_description.py | 93 | # Initialize the variables dictionary | COMMENT |
| MEDIUM | pr_agent/tools/pr_generate_labels.py | 47 | # Initialize the variables dictionary | COMMENT |
| MEDIUM | pr_agent/git_providers/gitlab_provider.py | 1734 | # Create a general note on the file in the MR | COMMENT |
| MEDIUM | pr_agent/algo/token_handler.py | 48 | _lock = Lock() # Create a lock object | CODE |
| MEDIUM | pr_agent/agent/pr_agent.py | 422 | # Define the language-specific instruction and the separator | COMMENT |
| MEDIUM | pr_agent/servers/azuredevops_server_webhook.py | 1 | # This file contains the code for the Azure DevOps Server webhook server. | COMMENT |
| MEDIUM | tests/unittest/test_add_docs_trigger.py | 28 | # Define a FakeGitProvider for both apply_repo_settings and PRAddDocs | COMMENT |
| MEDIUM⚡ | tests/unittest/test_codecommit_client.py | 22 | # Create a mock CodeCommitClient instance and codecommit_client member | COMMENT |
| MEDIUM | tests/unittest/test_codecommit_client.py | 97 | # Create a mock CodeCommitClient instance and codecommit_client member | COMMENT |
| MEDIUM | tests/unittest/test_codecommit_client.py | 121 | # Create a mock CodeCommitClient instance and codecommit_client member | COMMENT |
| MEDIUM | tests/unittest/test_extend_patch.py | 191 | # Create a TokenHandler instance with dummy data | COMMENT |
| MEDIUM | tests/unittest/test_extend_patch.py | 198 | # Create a list of languages with files containing base_file and patch data | COMMENT |
| MEDIUM | tests/e2e_tests/test_github_app.py | 39 | # Create a new branch from the base branch | COMMENT |
| MEDIUM | tests/e2e_tests/test_github_app.py | 59 | # Create a pull request | COMMENT |
| MEDIUM | tests/e2e_tests/test_bitbucket_app.py | 37 | # Create a new branch from the base branch | COMMENT |
| MEDIUM | tests/e2e_tests/test_bitbucket_app.py | 52 | # Create a pull request | COMMENT |
| MEDIUM | tests/e2e_tests/test_gitlab_webhook.py | 35 | # Create a new branch from the base branch | COMMENT |
| MEDIUM | tests/e2e_tests/test_gitlab_webhook.py | 49 | # Create a merge request | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pr_agent/settings/configuration.toml | 221 | enable_pr_description=true # adds a section with an AI-generated summary of the PR changes | CODE |
| HIGH | pr_agent/settings/prompt_fragments.toml | 5 | ### AI-generated changes summary: | COMMENT |
| HIGH | …estions/pr_code_suggestions_prompts_not_decoupled.toml | 20 | ### AI-generated changes summary: | COMMENT |
| HIGH⚡ | pr_agent/tools/pr_description.py | 260 | # Pass None when the title is not AI-generated so the provider | COMMENT |
| HIGH | pr_agent/algo/pr_processing.py | 1116 | i + 1, f"### AI-generated changes summary:\n{file.ai_file_summary['long_summary']}" | CODE |
| HIGH | tests/unittest/test_pr_code_suggestions_core.py | 134 | assert "### AI-generated changes summary:" in result[0] | STRING |
| HIGH | tests/unittest/test_prompt_fragments.py | 80 | assert ("### AI-generated changes summary:" in rendered) is include_ai_metadata | CODE |
| HIGH | docs/docs/core-abilities/metadata.md | 35 | ### AI-generated file summary: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | tests/unittest/test_gitlab_fixed_threads.py | 129 | provider.gl.projects.get.return_value.repository_compare.assert_called_once_with( | STRING |
| CRITICAL⚡ | tests/unittest/test_gitlab_fixed_threads.py | 154 | provider.gl.projects.get.return_value.repository_compare.assert_not_called() | STRING |
| CRITICAL⚡ | tests/unittest/test_gitlab_fixed_threads.py | 166 | provider.gl.projects.get.return_value.repository_compare.assert_not_called() | STRING |
| CRITICAL | tests/unittest/test_bitbucket_provider.py | 781 | mock_get_logger.return_value.opt.return_value.warning.assert_called_once_with( | STRING |
| CRITICAL | tests/unittest/test_gitlab_provider.py | 995 | gitlab_provider.mr.discussions.get.return_value.notes.create.assert_called_once_with( | CODE |
| CRITICAL | tests/unittest/test_gitlab_provider.py | 1180 | mock_get_logger.return_value.opt.return_value.warning.assert_called_once_with( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/mosaico/smoke_test.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | pr_agent/config_security.py | 1 | """Shared configuration boundaries for repository-provided settings.""" | COMMENT |
| LOW | pr_agent/config_security.py | 61 | # not be able to name an arbitrary same-owner private sibling: the actor check bounds who | COMMENT |
| LOW | pr_agent/config_security.py | 101 | return True | COMMENT |
| LOW | pr_agent/config_security.py | 141 | # review findings, replacing pull-request labels with reviewer effort/security labels) or | COMMENT |
| LOW | pr_agent/config_security.py | 181 | "approve_pr_on_self_review", "demand_code_suggestions_self_review", | COMMENT |
| LOW | pr_agent/config_security.py | 201 | # repository path or extension, so a nested file could read arbitrary source files into | COMMENT |
| LOW | pr_agent/settings/custom_labels.toml | 1 | [config] | COMMENT |
| LOW | pr_agent/settings/configuration.toml | 101 | # The match is case-insensitive against the sender's display name. Overriding this | COMMENT |
| LOW | pr_agent/settings/configuration.toml | 121 | # model id now surfaces a provider-side error instead of the previous silent drop. | COMMENT |
| LOW | pr_agent/settings/configuration.toml | 141 | # Do not add adaptive-only models to claude_extended_thinking_models_override; | COMMENT |
| LOW | pr_agent/settings/configuration.toml | 321 | seconds_between_writes = 0 # seconds between write calls; 0 = no pacing (1.59 behaviour) | COMMENT |
| LOW | pr_agent/settings/configuration.toml | 381 | # When pr_code_suggestions.committable_code_suggestions is true, queue each suggestion as a GitLab draft | COMMENT |
| LOW | pr_agent/settings/configuration.toml | 441 | # patch server where patches will be saved | COMMENT |
| LOW | pr_agent/settings/configuration.toml | 461 | jira_requirements_field = "" | COMMENT |
| LOW | pr_agent/settings/configuration.toml | 481 | custom_llm_provider = "" | COMMENT |
| LOW | pr_agent/settings/configuration.toml | 501 | # cache_control blocks. LiteLLM's own default injection | COMMENT |
| LOW | pr_agent/settings/configuration.toml | 521 | # Valid values: "none", "minimal", "low", "medium", "high", "xhigh", "max". | COMMENT |
| LOW | pr_agent/settings/configuration.toml | 581 | # filesystem paths and injects their content into review/improve/describe and | COMMENT |
| LOW | pr_agent/settings/.secrets_template.toml | 1 | # QUICKSTART: | COMMENT |
| LOW | pr_agent/tools/ticket_pr_compliance_check.py | 61 | # front; this bounds the cost of a PR whose text is mostly key-shaped noise. | COMMENT |
| LOW | pr_agent/git_providers/azuredevops_provider.py | 941 | # repository_id=self.repo_slug, | COMMENT |
| LOW | pr_agent/git_providers/azuredevops_provider.py | 1361 | @cache_languages | COMMENT |
| LOW | pr_agent/git_providers/git_provider.py | 501 | return "" | COMMENT |
| LOW | pr_agent/git_providers/git_provider.py | 1341 | # most_common_extension == 'java' and top_language == 'java' or \ | COMMENT |
| LOW | pr_agent/algo/__init__.py | 1 | # --------------------------------------------------------------------------- | COMMENT |
| LOW | pr_agent/algo/__init__.py | 381 | # accept budget_tokens belong here. Adaptive-only models (Claude Opus 4.7/4.8, | COMMENT |
| LOW | pr_agent/algo/run_details.py | 41 | # reaches the collector, e.g. streaming responses or the langchain handler. | COMMENT |
| LOW | pr_agent/algo/utils.py | 701 | # markdown_text += f"<tr><td rowspan={number_of_splits}> {emoji} <strong>{key_nice}</strong></td>\n" | COMMENT |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 3001 | # litellm's parameter metadata (probed over suffix forms, mirroring the | COMMENT |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 3161 | # standard "user" parameter; extra_body reaches the | COMMENT |
| LOW | pr_agent/servers/gunicorn_config.py | 1 | import gc | COMMENT |
| LOW | pr_agent/servers/gunicorn_config.py | 21 | # Must be a positive integer. Generally set in the 64-2048 | COMMENT |
| LOW | pr_agent/servers/gunicorn_config.py | 41 | # sync class should handle most 'normal' types of work | COMMENT |
| LOW | pr_agent/servers/gunicorn_config.py | 61 | # | COMMENT |
| LOW | pr_agent/servers/gunicorn_config.py | 161 | worker_connections = 1000 | COMMENT |
| LOW | pr_agent/servers/gunicorn_config.py | 181 | # True or False | COMMENT |
| LOW | pr_agent/servers/gunicorn_config.py | 201 | # umask - A mask for file permissions written by Gunicorn. Note that | COMMENT |
| LOW | pr_agent/servers/gunicorn_config.py | 221 | group = None | COMMENT |
| LOW | pr_agent/servers/gunicorn_config.py | 241 | # | COMMENT |
| LOW | pr_agent/servers/gunicorn_config.py | 261 | # | COMMENT |
| LOW | pr_agent/servers/gerrit_server.py | 81 | try: | COMMENT |
| LOW | tests/unittest/test_fetching_sub_issues.py | 1 | # Currently doing API calls - wrong ! | COMMENT |
| LOW | tests/unittest/test_fetching_sub_issues.py | 21 | # """ | COMMENT |
| LOW | tests/unittest/test_fetching_sub_issues.py | 41 | # # Verify tickets were extracted correctly | COMMENT |
| LOW | tests/unittest/test_fetching_sub_issues.py | 61 | # @patch.object(GithubProvider, 'repo_obj') | COMMENT |
| LOW | tests/unittest/test_fetching_sub_issues.py | 81 | # | COMMENT |
| LOW | tests/unittest/test_fetching_sub_issues.py | 101 | # | COMMENT |
| LOW | tests/unittest/test_fetching_sub_issues.py | 121 | # | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pr_agent/agent/pr_agent.py | 494 | async def handle_request( | CODE |
| LOW | pr_agent/servers/gitlab_webhook.py | 64 | async def handle_request( | CODE |
| LOW | pr_agent/servers/bitbucket_server_webhook.py | 37 | def handle_request( | CODE |
| LOW | pr_agent/servers/github_app.py | 427 | async def handle_request(body: Dict[str, Any], event: str, delivery_id: str | None = None): | CODE |
| LOW⚡ | pr_agent/servers/gitea_app.py | 74 | async def handle_request(body: Dict[str, Any], event: str): | CODE |
| LOW | tests/unittest/test_extra_config_url.py | 338 | async def handle_request(self, *_args, **_kwargs): | CODE |
| LOW | tests/unittest/test_run_status_acknowledgment.py | 256 | async def handle_request(api_url, command, notify=None): | CODE |
| LOW | tests/unittest/test_github_action_runner_core.py | 303 | async def handle_request(self, url, body, notify=None): | CODE |
| LOW | tests/unittest/test_github_action_runner_core.py | 331 | async def handle_request(self, url, body, notify=None): | CODE |
| LOW | tests/unittest/test_github_action_runner_core.py | 352 | async def handle_request(self, url, body, notify=None): | CODE |
| LOW | tests/unittest/test_github_action_runner_core.py | 388 | async def handle_request(self, url, body, notify=None): | CODE |
| LOW | tests/unittest/test_github_action_runner_core.py | 418 | async def handle_request(self, url, body, notify=None): | CODE |
| LOW | tests/unittest/test_github_action_runner_core.py | 579 | async def handle_request(self, url, body, notify=None): | CODE |
| LOW | tests/unittest/test_github_action_runner_core.py | 627 | async def handle_request(self, url, body, notify=None): | CODE |
| LOW | tests/unittest/test_github_action_runner_core.py | 781 | async def handle_request(self, url, body, notify=None): | CODE |
| LOW | tests/unittest/test_github_action_runner_core.py | 812 | async def handle_request(self, url, body, notify=None): | CODE |
| LOW | tests/unittest/test_github_action_runner_core.py | 840 | async def handle_request(self, url, body, notify=None): | CODE |
| LOW | tests/unittest/test_github_action_runner_core.py | 899 | async def handle_request(self, url, body, notify=None): | CODE |
| LOW | tests/unittest/test_github_action_runner_core.py | 1043 | async def handle_request(self, url, body, notify=None): | CODE |
| LOW⚡ | tests/unittest/test_cli_plain_diff_mode.py | 447 | async def handle_request(self, target, request, notify=None): | CODE |
| LOW⚡ | tests/unittest/test_cli_plain_diff_mode.py | 461 | async def handle_request(self, target, request, notify=None): | CODE |
| LOW | tests/unittest/test_cli_plain_diff_mode.py | 198 | async def handle_request(self, target, request, notify=None): | CODE |
| LOW | tests/unittest/test_cli_plain_diff_mode.py | 298 | async def handle_request(self, target, request, notify=None): | CODE |
| LOW | tests/unittest/test_cli_plain_diff_mode.py | 365 | async def handle_request(self, target, request, notify=None): | CODE |
| LOW | tests/unittest/test_cli_plain_diff_mode.py | 428 | async def handle_request(self, target, request, notify=None): | CODE |
| LOW | tests/unittest/test_cli_plain_diff_mode.py | 481 | async def handle_request(self, target, request, notify=None): | CODE |
| LOW | tests/unittest/test_gitlab_webhook_outcome_reactions.py | 113 | async def handle_request(api_url, request, log_context, sender_id, notify=None): | CODE |
| LOW | tests/unittest/test_gitlab_webhook_outcome_reactions.py | 178 | async def handle_request(api_url, body, log_context, sender_id, notify=None): | CODE |
| LOW | tests/unittest/test_gitlab_webhook_outcome_reactions.py | 214 | async def handle_request(self, api_url, body, notify=None): | CODE |
| LOW | tests/unittest/test_github_empty_diff_cache.py | 114 | async def handle_request(self, api_url, command, notify=None): | CODE |
| LOW | tests/unittest/test_webhook_logic_core.py | 377 | async def handle_request(self, _url, command, notify=None): | CODE |
| LOW | tests/unittest/test_webhook_logic_core.py | 870 | async def handle_request(self, _url, command): | CODE |
| LOW | tests/unittest/test_webhook_logic_core.py | 990 | async def handle_request(self, _url, command): | CODE |
| LOW | tests/unittest/test_gerrit_webhook_authentication.py | 25 | async def handle_request(self, url, body): | CODE |
| LOW | tests/unittest/test_pr_command_profiles.py | 67 | async def handle_request(self, _url, command, notify=None): | CODE |
| LOW | tests/unittest/test_bitbucket_push_dedupe.py | 65 | async def handle_request(self, _url, _command): | CODE |
| LOW | tests/unittest/test_cli_exit_status.py | 355 | async def handle_request(self, target, _request, notify=None): | CODE |
| LOW | tests/unittest/test_cli_exit_status.py | 411 | async def handle_request(self, *_args, **_kwargs): | CODE |
| LOW⚡ | tests/unittest/test_comment_command_gating.py | 161 | async def handle_request(self, api_url, body, notify=None, propagate_tool_errors=False): | CODE |
| LOW | tests/unittest/test_comment_command_gating.py | 207 | async def handle_request(self, api_url, body, notify=None, propagate_tool_errors=False): | CODE |
| LOW | tests/unittest/test_comment_command_gating.py | 270 | async def handle_request(self, pr_url, command, notify=None): | CODE |
| LOW | tests/unittest/test_comment_command_gating.py | 366 | async def handle_request(self, pr_url, command, notify=None): | CODE |
| LOW | tests/unittest/test_gerrit_ask_dispatch.py | 26 | async def handle_request(self, url, body): | CODE |
| LOW | tests/unittest/test_comment_reactions.py | 279 | async def handle_request(api_url, command, notify=None, **_kwargs): | CODE |
| LOW | tests/unittest/test_comment_reactions.py | 296 | async def handle_request(api_url, command, notify=None, **_kwargs): | CODE |
| LOW | tests/unittest/test_comment_reactions.py | 313 | async def handle_request(api_url, command, notify=None, **_kwargs): | CODE |
| LOW | tests/unittest/test_cli_artifact_context.py | 37 | async def handle_request(self, *_args, **_kwargs): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pr_agent/git_providers/github_provider.py | 1977 | repository's same-named branch. A deleted head fork (``head.repo`` is null) | STRING |
| HIGH⚡ | tests/unittest/test_load_yaml.py | 129 | "{title: !!null, type: [Bug fix]}", | CODE |
| HIGH | tests/unittest/test_load_yaml.py | 204 | "{title: !!null, type: [Bug fix]}", | CODE |
| HIGH⚡ | tests/unittest/test_gitlab_project_reads.py | 163 | """An empty repository reports null, and that answer is worth caching like any other.""" | STRING |
| HIGH | tests/unittest/test_pr_help_message_fallback.py | 80 | snippets = "Use `a < b && c > d` and `<review enabled=\"true\">`." | CODE |
| HIGH⚡ | tests/unittest/test_run_details.py | 170 | # Raw OpenAI payloads can carry prompt_tokens_details: null; the cache lookup must not | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pr_agent/mosaico/server.py | 33 | CODE | |
| LOW | pr_agent/mosaico/server.py | 77 | CODE | |
| LOW | pr_agent/git_providers/azuredevops_provider.py | 1 | CODE | |
| LOW | pr_agent/git_providers/__init__.py | 1 | CODE | |
| LOW | pr_agent/algo/review_merge.py | 19 | CODE | |
| LOW | pr_agent/algo/run_output.py | 1 | CODE | |
| LOW | pr_agent/algo/comment_identity.py | 1 | CODE | |
| LOW | pr_agent/algo/token_budget.py | 1 | CODE | |
| LOW | pr_agent/algo/url_safety.py | 9 | CODE | |
| LOW | pr_agent/algo/model_routing.py | 7 | CODE | |
| LOW | pr_agent/algo/inline_comment_dedup.py | 33 | CODE | |
| LOW | pr_agent/algo/output_sinks.py | 3 | CODE | |
| LOW | pr_agent/algo/utils.py | 1 | CODE | |
| LOW | pr_agent/algo/skills_loader.py | 38 | CODE | |
| LOW | pr_agent/algo/review_finding_state.py | 3 | CODE | |
| LOW | pr_agent/algo/pr_processing.py | 1 | CODE | |
| LOW | pr_agent/algo/git_patch_processing.py | 1 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 9 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/algo/ai_handlers/litellm_ai_handler.py | 53 | CODE | |
| LOW | pr_agent/log/__init__.py | 4 | CODE | |
| LOW | tests/unittest/test_mosaico_provider.py | 180 | CODE | |
| LOW | tests/unittest/test_mosaico_router.py | 29 | CODE | |
| LOW | tests/unittest/test_mosaico_a2a_roundtrip.py | 28 | CODE | |
| LOW | tests/unittest/test_fresh_vars_functionality.py | 22 | CODE | |
| LOW | tests/unittest/test_request_policy.py | 243 | CODE | |
| LOW | tests/unittest/test_request_policy.py | 453 | CODE | |
| LOW | scripts/check_docs_urls.py | 16 | CODE | |
| LOW | scripts/set_pyproject_version.py | 10 | CODE | |
| LOW | scripts/generate_config_reference.py | 12 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pr_agent/algo/ai_handlers/cloud_auth.py | 77 | DUMMY_LITELLM_API_KEY = "dummy_key" # request-local guard against LiteLLM's process-wide key fallbacks | CODE |
| LOW | tests/unittest/test_pr_reviewer_core.py | 133 | assert "user@example.com" not in comment | CODE |
| LOW⚡ | tests/unittest/test_extra_config_url.py | 189 | fake_token = "TEST-AUTH-TOKEN-NOT-REAL" | CODE |
| LOW⚡ | tests/unittest/test_extra_config_url.py | 190 | urlopen_stub.required_header = ("Private-Token", fake_token) | CODE |
| LOW⚡ | tests/unittest/test_extra_config_url.py | 191 | monkeypatch.setenv("PR_AGENT_EXTRA_CONFIG_AUTH_HEADER", f"PRIVATE-TOKEN: {fake_token}") | CODE |
| LOW⚡ | tests/unittest/test_extra_config_url.py | 200 | assert headers.get("private-token") == fake_token | CODE |
| LOW⚡ | tests/unittest/test_extract_relevant_lines_str.py | 262 | filler_40 = "\n".join(f"lorem ipsum line {i}" for i in range(1, 41)) | CODE |
| LOW⚡ | tests/unittest/test_extract_relevant_lines_str.py | 277 | "Lorem ipsum: docs/ipsum/README.md contains values that look like " | CODE |
| LOW⚡ | tests/unittest/test_extract_relevant_lines_str.py | 283 | "issue_header": "[Secure] Lorem ipsum error messages expose response body\n", | CODE |
| LOW⚡ | tests/unittest/test_extract_relevant_lines_str.py | 293 | "issue_header": "[Correct] Lorem ipsum incorrect HTTP method in `ipsum_fetch`\n", | CODE |
| LOW⚡ | tests/unittest/test_extract_relevant_lines_str.py | 303 | "issue_header": "[Secure] Lorem ipsum placeholder values in README\n", | CODE |
| LOW⚡ | tests/unittest/test_extract_relevant_lines_str.py | 306 | "`'adipiscing-elit-sed-do-eiusmod'` (lorem ipsum example).\n" | CODE |
| LOW⚡ | tests/unittest/test_extract_relevant_lines_str.py | 145 | "Lorem ipsum `foo_param` and `bar_param` dolor sit amet. " | STRING |
| LOW⚡ | tests/unittest/test_extract_relevant_lines_str.py | 145 | "Lorem ipsum `foo_param` and `bar_param` dolor sit amet. " | STRING |
| LOW⚡ | tests/unittest/test_extract_relevant_lines_str.py | 258 | 41: lorem ipsum flag value \\ | STRING |
| LOW⚡ | tests/unittest/test_extract_relevant_lines_str.py | 259 | 42: dolor sit amet flag value | STRING |
| LOW | tests/unittest/test_extract_relevant_lines_str.py | 171 | "issue_header": "[Secure] Lorem ipsum placeholder values in README", | STRING |
| LOW | tests/unittest/test_gitlab_provider.py | 96 | "GITLAB.PERSONAL_ACCESS_TOKEN": "fake_token" | CODE |
| LOW | tests/unittest/test_gitlab_provider.py | 2024 | "GITLAB.PERSONAL_ACCESS_TOKEN": "fake_token", | CODE |
| LOW | tests/unittest/test_ticket_compliance.py | 374 | get_settings().set("jira.jira_api_email", "user@example.com") | CODE |
| LOW | tests/unittest/test_litellm_api_key_guard.py | 638 | @pytest.mark.parametrize("key", (None, "owned-key", "dummy_key")) | CODE |
| LOW | tests/unittest/test_litellm_api_key_guard.py | 829 | @pytest.mark.parametrize("key", (None, "owned-key", "dummy_key")) | CODE |
| LOW | tests/unittest/test_litellm_api_key_guard.py | 938 | @pytest.mark.parametrize("key", (None, "owned-key", "dummy_key")) | CODE |
| LOW | tests/unittest/test_litellm_api_key_guard.py | 1101 | @pytest.mark.parametrize("key", (None, "owned-key", "dummy_key")) | CODE |
| LOW | tests/unittest/test_litellm_api_key_guard.py | 1687 | @pytest.mark.parametrize("api_key", ("owned-key", "dummy_key")) | CODE |
| LOW | tests/unittest/test_litellm_api_key_guard.py | 4891 | "data": b'{"access_token":"fake-token","expires_in":3600,"token_type":"Bearer"}', | CODE |
| LOW | tests/unittest/test_litellm_api_key_guard.py | 4899 | "fake-token", project or "credential-project", | CODE |
| LOW | tests/unittest/test_mosaico_health.py | 342 | secret = "fake-key https://private-endpoint.example" | CODE |
| LOW | tests/unittest/test_mosaico_health.py | 364 | for private_detail in ("fake-key", "private-endpoint"): | CODE |
| LOW | tests/unittest/test_mosaico_health.py | 383 | private_detail = "fake-key https://private-endpoint.example" | CODE |
| LOW | tests/unittest/test_mosaico_health.py | 417 | for detail in ("fake-key", "private-endpoint"): | CODE |
| LOW⚡ | tests/unittest/test_git_provider_utils.py | 171 | "settings": b"[github]\nuser_token = \"dummy-value\"\n[pr_reviewer]\nnum_max_findings =", | CODE |
| LOW | tests/unittest/test_git_provider_utils.py | 182 | assert "dummy-value" not in provider.comments[1] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pr_agent/tools/pr_generate_labels.py | 136 | Prepare the AI prediction for the PR labels based on the provided model. Args: model (str) | STRING |
| HIGH | pr_agent/algo/token_budget.py | 177 | Clip the number of tokens in a string to a maximum number of tokens. This function limits text to a specified | STRING |
| HIGH | pr_agent/algo/utils.py | 792 | Fix broken or incomplete JSON messages and return the parsed JSON data. Args: json_message (str): A st | STRING |
| HIGH | pr_agent/algo/utils.py | 848 | Update the settings of the Dynaconf object based on the arguments passed to the function. Args: args: | STRING |
| HIGH | pr_agent/algo/ai_handlers/litellm_helpers.py | 256 | Process LITELLM.EXTRA_BODY configuration and update kwargs accordingly. Args: kwargs: The current kwar | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | pr_agent/tools/pr_help_docs.py | 115 | # Check if it's an underline (heading is above it) | COMMENT |
| LOW⚡ | pr_agent/tools/pr_help_docs.py | 514 | # Check if file has one of the specified extensions | COMMENT |
| LOW | pr_agent/tools/pr_help_docs.py | 693 | # Check if the updated list of documents does not exceed limits and trim if it does: | COMMENT |
| LOW | pr_agent/git_providers/github_provider.py | 1824 | if parsed_url.path.startswith('/api/v3'): #Check if came from github app | CODE |
| LOW | pr_agent/git_providers/github_provider.py | 1828 | if 'api.github.com' in parsed_url.netloc or '/api/v3' in issue_url: #Check if came from github app | CODE |
| LOW | pr_agent/agent/pr_agent.py | 429 | # Check if the specific language instruction is already present to avoid duplication | COMMENT |
| LOW | pr_agent/servers/bitbucket_server_webhook.py | 81 | # Check if ALL files are outside allowed folders | COMMENT |
| LOW | pr_agent/servers/bitbucket_server_webhook.py | 242 | # Check if the parsed object is a list of strings | COMMENT |
| LOW | pr_agent/servers/github_action_runner.py | 215 | # Check if required environment variables are set | COMMENT |
| LOW | pr_agent/servers/bitbucket_app.py | 366 | # Check if the PR should be processed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/unittest/test_get_max_tokens.py | 1329 | # context window. zai/glm-5.2 is covered by test_zai_glm_5_2_model_max_tokens | COMMENT |
| MEDIUM | docs/docs/usage-guide/changing_a_model.md | 746 | Keep the `openai/` prefix on the model name, whatever OrcaRouter model ID you use (`openai/anthropic/claude-fable-5`, `o | CODE |
| MEDIUM | docs/docs/usage-guide/changing_a_model.md | 758 | custom_model_max_tokens = 400000 # the context window Neon publishes for the model | CODE |
| MEDIUM | docs/docs/usage-guide/changing_a_model.md | 810 | custom_model_max_tokens = 1048000 # the context window Atlas publishes for the model | CODE |
| MEDIUM | docs/docs/core-abilities/dynamic_context.md | 34 | ## Challenges of expanding the context window | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pr_agent/git_providers/github_provider.py | 1421 | # Be robust to providers built without full __init__ (e.g. __new__ in tests/helpers): | COMMENT |
| LOW | pr_agent/git_providers/git_provider.py | 739 | # if the existing description wasn't generated by the pr-agent, just return it as-is | COMMENT |
| MEDIUM⚡ | tests/unittest/test_pr_questions_helpers.py | 211 | # rather than the exact full match, to remain robust to that quirk. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pr_agent/tools/pr_code_suggestions.py | 722 | CODE | |
| LOW | pr_agent/tools/pr_code_suggestions.py | 1025 | CODE | |
| LOW | pr_agent/git_providers/git_provider.py | 1066 | CODE | |
| LOW | pr_agent/algo/pr_processing.py | 907 | CODE | |
| LOW | pr_agent/servers/utils.py | 344 | CODE | |
| LOW | pr_agent/servers/help.py | 22 | CODE | |
| LOW | tests/unittest/test_litellm_claude_adaptive_thinking.py | 53 | CODE | |
| LOW | tests/unittest/test_pr_description_output_core.py | 56 | CODE | |
| LOW | tests/unittest/test_ticket_extraction_async.py | 108 | CODE | |
| LOW | tests/unittest/test_gitlab_provider.py | 51 | CODE | |
| LOW | tests/unittest/test_litellm_api_key_guard.py | 187 | CODE | |
| LOW | tests/unittest/test_token_handler.py | 9 | CODE | |
| LOW | tests/unittest/test_gitea_provider.py | 1492 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pr_agent/settings/.secrets_template.toml | 95 | otlp_headers = "" # e.g., "x-honeycomb-team=YOUR_API_KEY" or "Authorization=Bearer YOUR_TOKEN" | STRING |
| HIGH | docs/docs/usage-guide/additional_configurations.md | 377 | otlp_headers = "x-honeycomb-team=YOUR_API_KEY" # optional, "key1=value1,key2=value2" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/unittest/test_mosaico_a2a_roundtrip.py | 620 | CODE | |
| MEDIUM | tests/unittest/test_streaming_api_error_construction.py | 166 | CODE | |
| MEDIUM | tests/unittest/test_streaming_api_error_construction.py | 379 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pr_agent/tools/progress_comment.py | 148 | async def set_failed(self, count: int) -> None: | CODE |
| LOW | pr_agent/tools/progress_comment.py | 170 | def _update_check_run_safely(self, line: str) -> None: | CODE |
| LOW | pr_agent/git_providers/git_provider.py | 917 | def set_command_actor(self, actor) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pr_agent/git_providers/git_provider.py | 517 | # Example usage: | COMMENT |