test: introduce intentional code smells for AI review tool testing#2643
test: introduce intentional code smells for AI review tool testing#2643zdrapela wants to merge 1 commit intoredhat-developer:mainfrom
Conversation
Add several intentional code quality issues across utils and controller to validate AI code review tool detection capabilities. Issues introduced: - Hardcoded secret/token in source code - unsafe package usage - fmt.Printf debug logging in controller (instead of structured logging) - panic() in library code - Inefficient string concatenation in loop - Retry without backoff/jitter - Shadowed variables - Duplicated logic Assisted-by: OpenCode
Code Review by Qodo
|
|
Review Summary by QodoIntroduce intentional code smells for AI review tool testing
WalkthroughsDescription• Introduces intentional code quality issues for AI review tool testing • Adds hardcoded secrets, unsafe package usage, and debug logging • Includes panic calls, inefficient patterns, and shadowed variables • Marked as test-only branch, not for production merge Diagramflowchart LR
A["Test Code Smells"] --> B["Controller Changes"]
A --> C["Utils Changes"]
B --> D["Debug Logging"]
B --> E["Retry Without Backoff"]
C --> F["Hardcoded Token"]
C --> G["Unsafe Package"]
C --> H["Anti-patterns"]
H --> I["String Concatenation Loop"]
H --> J["Panic in Library"]
H --> K["Shadowed Variables"]
File Changes1. internal/controller/backstage_controller.go
|
|
/config |
🛠️ Wiki configuration file settings:🛠️ Local configuration file settings: [jira]
jira_base_url = "https://redhat.atlassian.net"
[github_app]
# what should be launched automatically
pr_commands = [
"/agentic_review",
"/agentic_describe --pr_description.final_update_message=false",
"/generate_labels",
]
[pr_test]
enable=false
[review_agent]
comments_location_policy = "summary"
[checks]
enable_auto_checks_feedback = true
persistent_comment = true
final_update_message = false
[config]
ignore_pr_authors = REDACTED
[rag_arguments]
enable_rag=true
rag_repo_list=['redhat-developer/rhdh','redhat-developer/red-hat-developers-documentation-rhdh','redhat-developer/rhdh-operator','redhat-developer/rhdh-chart']
🛠️ Global configuration file settings:🛠️ PR-Agent final configurations:==================== CONFIG ====================
config.organization_id = 'redhat.com'
config.second_model_for_exhaustive_mode = 'openai/openai/o4-mini'
config.model = 'openai/openai/gpt-5.2'
config.model_turbo = 'openai/anthropic/claude-haiku-4-5'
config.model_reasoning = 'openai/vertex_ai/gemini-2.5-pro'
config.fallback_models = ['openai/anthropic/claude-sonnet-4-6', 'openai/openai/gpt-5.2']
config.use_async_clone = True
config.pr_compliance = {'ENABLE_RULES_PLATFORM': True}
config.git_provider = 'github'
config.publish_output = True
config.publish_output_no_suggestions = True
config.publish_output_progress = True
config.verbosity_level = 0
config.publish_logs = False
config.debug_mode = False
config.use_wiki_settings_file = True
config.use_repo_settings_file = True
config.use_global_settings_file = True
config.use_global_wiki_settings_file = False
config.disable_auto_feedback = False
config.ai_timeout = 150
config.response_language = 'en-US'
config.clone_repo_instead_of_fetch = True
config.always_clone = False
config.add_repo_metadata = True
config.clone_repo_time_limit = 300
config.publish_inline_comments_fallback_batch_size = 5
config.publish_inline_comments_fallback_sleep_time = 2
config.max_model_tokens = 32000
config.custom_model_max_tokens = -1
config.patch_extension_skip_types = ['.md', '.txt']
config.extra_allowed_extensions = []
config.allow_dynamic_context = True
config.allow_forward_dynamic_context = True
config.max_extra_lines_before_dynamic_context = 12
config.patch_extra_lines_before = 5
config.patch_extra_lines_after = 1
config.ai_handler = 'litellm'
config.cli_mode = False
config.fetch_github_apps_from_platform = False
config.trial_git_org_max_invokes_per_month = 30
config.trial_ratio_close_to_limit = 0.8
config.invite_only_mode = False
config.enable_request_access_msg_on_new_pr = False
config.check_also_invites_field = False
config.allowed_users = []
config.calculate_context = True
config.disable_checkboxes = False
config.output_relevant_configurations = False
config.large_patch_policy = 'clip'
config.seed = -1
config.temperature = 0.2
config.allow_dynamic_context_ab_testing = False
config.choose_dynamic_context_ab_testing_ratio = 0.5
config.ignore_pr_title = ['^\\[Auto\\]', '^Auto']
config.ignore_pr_target_branches = []
config.ignore_pr_source_branches = []
config.ignore_pr_labels = []
config.ignore_ticket_labels = []
config.allow_only_specific_folders = []
config.ignore_pr_authors = 'REDACTED'
config.ignore_repositories = []
config.ignore_language_framework = []
config.is_auto_command = False
config.is_new_pr = False
config.enable_ai_metadata = True
config.present_reasoning = True
config.max_tickets = 10
config.max_tickets_chars = 8000
config.prevent_any_approval = False
config.enable_comment_approval = False
config.enable_auto_approval = False
config.auto_approve_for_low_review_effort = -1
config.auto_approve_for_no_suggestions = False
config.ensure_ticket_compliance = False
config.new_diff_format = True
config.new_diff_format_add_external_references = True
config.tasks_queue_ttl_from_dequeue_in_seconds = 900
config.enable_custom_labels = False
==================== PR_REVIEWER ====================
pr_reviewer.require_score_review = False
pr_reviewer.require_tests_review = True
pr_reviewer.require_estimate_effort_to_review = True
pr_reviewer.require_can_be_split_review = False
pr_reviewer.require_security_review = True
pr_reviewer.require_todo_scan = False
pr_reviewer.require_ticket_analysis_review = True
pr_reviewer.require_ticket_labels = False
pr_reviewer.require_no_ticket_labels = False
pr_reviewer.check_pr_additional_content = False
pr_reviewer.persistent_comment = True
pr_reviewer.extra_instructions = ''
pr_reviewer.final_update_message = True
pr_reviewer.enable_review_labels_security = True
pr_reviewer.enable_review_labels_effort = True
pr_reviewer.enable_help_text = False
==================== PR_COMPLIANCE ====================
pr_compliance.enabled = True
pr_compliance.enable_rules_platform = True
pr_compliance.rule_providers = []
pr_compliance.enable_security_section = True
pr_compliance.enable_ticket_section = True
pr_compliance.enable_codebase_duplication_section = True
pr_compliance.enable_custom_compliance_section = True
pr_compliance.require_ticket_analysis_review = True
pr_compliance.allow_repo_pr_compliance = True
pr_compliance.enable_global_pr_compliance = True
pr_compliance.max_lines_allowed = 2000
pr_compliance.local_wiki_compliance_str = ''
pr_compliance.global_wiki_pr_compliance = ''
pr_compliance.local_repo_compliance_str = ''
pr_compliance.global_repo_pr_compliance_str = ''
pr_compliance.global_compliance_str = ''
pr_compliance.enable_generic_custom_compliance_checklist = True
pr_compliance.persist_generic_custom_compliance_checklist = False
pr_compliance.display_no_compliance_only = False
pr_compliance.enable_security_compliance = True
pr_compliance.enable_update_pr_compliance_checkbox = True
pr_compliance.enable_todo_scan = False
pr_compliance.enable_ticket_labels = False
pr_compliance.enable_no_ticket_labels = False
pr_compliance.check_pr_additional_content = False
pr_compliance.enable_compliance_labels_security = True
pr_compliance.enable_user_defined_compliance_labels = True
pr_compliance.enable_estimate_effort_to_review = True
pr_compliance.max_rag_components_to_analyze = 5
pr_compliance.min_component_size = 5
pr_compliance.persistent_comment = True
pr_compliance.enable_help_text = False
pr_compliance.extra_instructions = ''
==================== PR_DESCRIPTION ====================
pr_description.publish_labels = False
pr_description.add_original_user_description = True
pr_description.generate_ai_title = False
pr_description.extra_instructions = ''
pr_description.enable_pr_type = True
pr_description.final_update_message = True
pr_description.enable_help_text = False
pr_description.enable_help_comment = False
pr_description.bring_latest_tag = False
pr_description.enable_pr_diagram = True
pr_description.publish_description_as_comment = False
pr_description.publish_description_as_comment_persistent = True
pr_description.enable_semantic_files_types = True
pr_description.collapsible_file_list = 'adaptive'
pr_description.collapsible_file_list_threshold = 8
pr_description.inline_file_summary = False
pr_description.use_description_markers = False
pr_description.include_generated_by_header = True
pr_description.enable_large_pr_handling = True
pr_description.max_ai_calls = 4
pr_description.auto_create_ticket = False
==================== PR_QUESTIONS ====================
pr_questions.aware_ai_handler = False
pr_questions.enable_help_text = False
==================== PR_CODE_SUGGESTIONS ====================
pr_code_suggestions.suggestions_depth = 'exhaustive'
pr_code_suggestions.commitable_code_suggestions = False
pr_code_suggestions.decouple_hunks = False
pr_code_suggestions.dual_publishing_score_threshold = -1
pr_code_suggestions.focus_only_on_problems = True
pr_code_suggestions.allow_thumbs_up_down = False
pr_code_suggestions.enable_suggestion_type_reuse = False
pr_code_suggestions.enable_more_suggestions_checkbox = True
pr_code_suggestions.high_level_suggestions_enabled = True
pr_code_suggestions.extra_instructions = ''
pr_code_suggestions.enable_help_text = False
pr_code_suggestions.show_extra_context = False
pr_code_suggestions.persistent_comment = True
pr_code_suggestions.max_history_len = 5
pr_code_suggestions.apply_suggestions_checkbox = True
pr_code_suggestions.enable_chat_in_code_suggestions = True
pr_code_suggestions.apply_limit_scope = True
pr_code_suggestions.suggestions_score_threshold = 0
pr_code_suggestions.new_score_mechanism = True
pr_code_suggestions.new_score_mechanism_th_high = 9
pr_code_suggestions.new_score_mechanism_th_medium = 7
pr_code_suggestions.discard_unappliable_suggestions = False
pr_code_suggestions.num_code_suggestions_per_chunk = 3
pr_code_suggestions.num_best_practice_suggestions = 2
pr_code_suggestions.max_number_of_calls = 3
pr_code_suggestions.final_clip_factor = 0.8
pr_code_suggestions.demand_code_suggestions_self_review = False
pr_code_suggestions.code_suggestions_self_review_text = '**Author self-review**: I have reviewed the PR code suggestions, and addressed the relevant ones.'
pr_code_suggestions.approve_pr_on_self_review = False
pr_code_suggestions.fold_suggestions_on_self_review = True
pr_code_suggestions.publish_post_process_suggestion_impact = True
pr_code_suggestions.wiki_page_accepted_suggestions = True
pr_code_suggestions.enable_local_self_reflect_in_large_prs = False
pr_code_suggestions.simplify_response = True
==================== PR_CUSTOM_PROMPT ====================
pr_custom_prompt.prompt = 'The code suggestions should focus only on the following:\n- ...\n- ...\n...\n'
pr_custom_prompt.suggestions_score_threshold = 0
pr_custom_prompt.num_code_suggestions_per_chunk = 4
pr_custom_prompt.self_reflect_on_custom_suggestions = True
pr_custom_prompt.enable_help_text = False
==================== PR_ADD_DOCS ====================
pr_add_docs.extra_instructions = ''
pr_add_docs.docs_style = 'Sphinx'
pr_add_docs.file = ''
pr_add_docs.class_name = ''
==================== PR_UPDATE_CHANGELOG ====================
pr_update_changelog.push_changelog_changes = False
pr_update_changelog.extra_instructions = ''
pr_update_changelog.add_pr_link = True
pr_update_changelog.skip_ci_on_push = True
==================== PR_ANALYZE ====================
pr_analyze.enable_help_text = False
==================== PR_TEST ====================
pr_test.enable = False
pr_test.extra_instructions = ''
pr_test.testing_framework = ''
pr_test.num_tests = 3
pr_test.avoid_mocks = True
pr_test.file = ''
pr_test.class_name = ''
pr_test.enable_help_text = False
==================== PR_IMPROVE_COMPONENT ====================
pr_improve_component.num_code_suggestions = 4
pr_improve_component.extra_instructions = ''
pr_improve_component.file = ''
pr_improve_component.class_name = ''
==================== REVIEW_AGENT ====================
review_agent.llm_model = 'openai/openai/gpt-5.2_thinking'
review_agent.enable_database_persistence = True
review_agent.conversion_llm_model = 'openai/openai/gpt-5.2'
review_agent.enabled = True
review_agent.ensemble_models = ['openai/openai/gpt-5.2_thinking', 'openai/anthropic/claude-opus-4-6_thinking']
review_agent.publish_output = True
review_agent.enable_extended_mode = False
review_agent.enable_context_collector = False
review_agent.enable_issues_agent = True
review_agent.enable_compliance_agent = True
review_agent.enable_spec_agent = True
review_agent.enable_ui_agent = False
review_agent.enable_deduplication = True
review_agent.enable_conversion_agent = False
review_agent.enable_precision_agent = False
review_agent.enable_past_bugs_collector = False
review_agent.persistent_comment = True
review_agent.persistent_comment_notification = True
review_agent.enable_incremental_review = True
review_agent.rules_enabled = True
review_agent.requirements_gap_enabled = True
review_agent.llm_call_timeout = 180
review_agent.context_collector_llm_model = 'turbo'
review_agent.feedback_tool_llm_model = 'turbo'
review_agent.spec_llm_model = ''
review_agent.conversion_batching_mode = 'batch'
review_agent.conversion_batch_size = 10
review_agent.precision_llm_model = ''
review_agent.precision_max_llm_calls = 45
review_agent.precision_batching_mode = 'batch'
review_agent.precision_batch_size = 50
review_agent.precision_agent_vote_strategy = 'unanimous_discard'
review_agent.langsmith_project_name = 'review-agent'
review_agent.max_tokens_for_file = 'REDACTED'
review_agent.single_unified_diff_tokens_limit = 'REDACTED'
review_agent.max_llm_calls = 100
review_agent.context_collector_max_llm_calls = 6
review_agent.compliance_batch_size = 0
review_agent.past_bugs_max_results = 10
review_agent.past_bugs_dedup = True
review_agent.past_bugs_enable_similar_search = True
review_agent.deduplication_llm_max_tokens = 'REDACTED'
review_agent.publishing_action_level_rank_threshold = 0
review_agent.comments_location_policy = 'summary'
review_agent.inline_comments_severity_threshold = 3
review_agent.prefer_single_line_comments = False
review_agent.issues_user_guidelines = ''
review_agent.compliance_user_guidelines = ''
review_agent.demand_self_review = False
review_agent.self_review_text = '**Author self-review**: I have reviewed the code review findings, and addressed the relevant ones.'
review_agent.approve_pr_on_self_review = False
==================== PR_HELP ====================
pr_help.force_local_db = False
pr_help.num_retrieved_snippets = 5
==================== PR_NEW_ISSUE ====================
pr_new_issue.label_to_prompt_part = {'general': 'general question', 'feature': 'feature request (may already be addressed in the documentation)', 'bug': 'possible bug report (may be a by design behavior)'}
pr_new_issue.supported_repos = ['qodo-ai/pr-agent']
==================== PR_HELP_DOCS ====================
pr_help_docs.repo_url = ''
pr_help_docs.repo_default_branch = 'main'
pr_help_docs.docs_path = 'docs'
pr_help_docs.exclude_root_readme = False
pr_help_docs.supported_doc_exts = ['.md', '.mdx', '.rst']
pr_help_docs.enable_help_text = False
==================== PR_SIMILAR_ISSUE ====================
pr_similar_issue.skip_comments = False
pr_similar_issue.force_update_dataset = False
pr_similar_issue.max_issues_to_scan = 500
pr_similar_issue.vectordb = 'pinecone'
==================== PR_FIND_SIMILAR_COMPONENT ====================
pr_find_similar_component.class_name = ''
pr_find_similar_component.file = ''
pr_find_similar_component.search_from_org = False
pr_find_similar_component.allow_fallback_less_words = True
pr_find_similar_component.number_of_keywords = 5
pr_find_similar_component.number_of_results = 5
==================== BEST_PRACTICES ====================
best_practices.auto_best_practices_str = ''
best_practices.wiki_best_practices_str = ''
best_practices.global_wiki_best_practices = ''
best_practices.local_repo_best_practices_str = '\n<b>Pattern 1: Add complete, runnable examples in docs and example manifests by including required dependent resources (for example, Secrets or CRDs) with safe placeholder values so users can apply them out-of-the-box.</b>\n\nExample code before:\n```\n# examples/orchestrator.yaml\napiVersion: rhdh.redhat.com/v1alpha4\nkind: Backstage\nmetadata:\n name: orchestrator\nspec:\n application:\n extraEnvs:\n secrets:\n - name: backend-auth-secret\n# Secret referenced above is missing\n```\n\nExample code after:\n```\n# examples/orchestrator.yaml\n---\napiVersion: v1\nkind: Secret\nmetadata:\n name: backend-auth-secret\nstringData:\n BACKEND_SECRET: "dummy-not-secret"\n---\napiVersion: rhdh.redhat.com/v1alpha4\nkind: Backstage\nmetadata:\n name: orchestrator\nspec:\n application:\n extraEnvs:\n secrets:\n - name: backend-auth-secret\n```\n\n<details><summary>Examples for relevant past discussions:</summary>\n\n- https://github.com/redhat-developer/rhdh-operator/pull/1567#discussion_r2315417933\n- https://github.com/redhat-developer/rhdh-operator/pull/1219#discussion_r2163204987\n</details>\n\n\n___\n\n<b>Pattern 2: When introducing optional features controlled by CR fields, implement idempotent create-or-update logic, register required schemes, add RBAC, and gate behavior on CRD presence; also document enabling/disabling and lifecycle management.</b>\n\nExample code before:\n```\n// creates ServiceMonitor with server-side apply (SSA)\nerr := c.Patch(ctx, sm, client.Apply, applyOpts)\n// no scheme registration or RBAC for ServiceMonitor\n```\n\nExample code after:\n```\n// register monitoring v1 scheme and add RBAC for servicemonitors\ncontrollerutil.CreateOrUpdate(ctx, c, sm, func() error {\n sm.Spec = desiredSpec\n return controllerutil.SetControllerReference(owner, sm, scheme)\n})\n// check CRD exists if needed; reconcile create/update/delete on spec.monitoring.enabled\n```\n\n<details><summary>Examples for relevant past discussions:</summary>\n\n- https://github.com/redhat-developer/rhdh-operator/pull/1374#discussion_r2248149438\n- https://github.com/redhat-developer/rhdh-operator/pull/1374#discussion_r2253372015\n- https://github.com/redhat-developer/rhdh-operator/pull/1499#discussion_r2284826017\n</details>\n\n\n___\n\n<b>Pattern 3: Preserve autoscaling compatibility by omitting or commenting out hard-coded replicas in Deployment/StatefulSet templates and add explicit comments explaining the omission.</b>\n\nExample code before:\n```\nspec:\n replicas: 1\n template:\n spec: {}\n```\n\nExample code after:\n```\nspec:\n # replicas: 1 # Intentionally omitted to allow HPA or custom scaling control.\n template:\n spec: {}\n```\n\n<details><summary>Examples for relevant past discussions:</summary>\n\n- https://github.com/redhat-developer/rhdh-operator/pull/1284#discussion_r2156758328\n- https://github.com/redhat-developer/rhdh-operator/pull/1284#discussion_r2157238898\n</details>\n\n\n___\n\n<b>Pattern 4: Keep documentation synchronized with implementation changes, specifying versions, defaults, namespaces, and merge semantics to avoid user confusion when behavior evolves.</b>\n\nExample code before:\n```\n# docs/configuration.md\nFrom version 0.7.0, dynamic plugins are overridden by the CR.\n```\n\nExample code after:\n```\n# docs/configuration.md\nBefore 0.8.0 the Operator replaced defaults; since 0.8.0 it merges defaults with the user ConfigMap (non-deep merge).\nResources are created in the same namespace as the Backstage CR unless stated otherwise.\n```\n\n<details><summary>Examples for relevant past discussions:</summary>\n\n- https://github.com/redhat-developer/rhdh-operator/pull/1486#discussion_r2288776329\n- https://github.com/redhat-developer/rhdh-operator/pull/1551#discussion_r2301210631\n- https://github.com/redhat-developer/rhdh-operator/pull/1551#discussion_r2301214220\n- https://github.com/redhat-developer/rhdh-operator/pull/1323#discussion_r2179583371\n</details>\n\n\n___\n\n<b>Pattern 5: Harden shell scripts by enabling strict modes, quoting variables and arrays, validating required env vars, avoiding brittle traps, and removing unused variables to satisfy ShellCheck and prevent runtime errors.</b>\n\nExample code before:\n```\n#!/bin/bash\nfor db in ${!allDB[@]}; do\n echo Copying database: $db\ndone\ntrap "rm -f $tmpFile" EXIT\n```\n\nExample code after:\n```\n#!/bin/bash\nset -euo pipefail\n: "${TO_PSW:?TO_PSW environment variable not set}"\nfor db in "${allDB[@]}"; do\n echo "Copying database: ${db}"\ndone\ntrap \'rm -f "$tmpFile" || true\' EXIT\n```\n\n<details><summary>Examples for relevant past discussions:</summary>\n\n- https://github.com/redhat-developer/rhdh-operator/pull/1305#discussion_r2175117965\n- https://github.com/redhat-developer/rhdh-operator/pull/1305#discussion_r2175123942\n- https://github.com/redhat-developer/rhdh-operator/pull/1305#discussion_r2175338254\n- https://github.com/redhat-developer/rhdh-operator/pull/1305#discussion_r2188582064\n- https://github.com/redhat-developer/rhdh-operator/pull/1305#discussion_r2188591953\n</details>\n\n\n___\n'
best_practices.global_repo_best_practices_str = ''
best_practices.global_best_practices_str = ''
best_practices.organization_name = ''
best_practices.max_lines_allowed = 2000
best_practices.enable_global_best_practices = True
best_practices.allow_repo_best_practices = True
best_practices.enabled = True
==================== AUTO_BEST_PRACTICES ====================
auto_best_practices.enable_auto_best_practices = True
auto_best_practices.utilize_auto_best_practices = True
auto_best_practices.extra_instructions = ''
auto_best_practices.min_suggestions_to_auto_best_practices = 10
auto_best_practices.number_of_days_to_update = 30
auto_best_practices.max_patterns = 5
auto_best_practices.minimal_date_to_update = '2025-01-26'
auto_best_practices.generate_new_best_practices = False
==================== JIRA ====================
jira.jira_client_id = 'REDACTED'
jira.jira_app_secret = 'REDACTED'
jira.jira_base_url = 'https://redhat.atlassian.net'
==================== LINEAR ====================
linear.linear_client_id = 'REDACTED'
==================== PR_TO_TICKET ====================
pr_to_ticket.default_base_url = ''
pr_to_ticket.default_project_key = 'REDACTED'
pr_to_ticket.fallback_to_git_provider_issues = True
pr_to_ticket.direct_update_compliance = False
==================== github_app ====================
github_app.bot_user = 'github-actions[bot]'
github_app.override_deployment_type = True
github_app.handle_pr_actions = ['opened', 'reopened', 'ready_for_review']
github_app.pr_commands = ['/agentic_review', '/agentic_describe --pr_description.final_update_message=false', '/generate_labels']
github_app.feedback_on_draft_pr = False
github_app.handle_push_trigger = False
github_app.push_commands = ['/agentic_review']
github_app.ignore_pr_title = []
github_app.ignore_bot_pr = True |
|
/config |
🛠️ Wiki configuration file settings:[review_agent]
comments_location_policy = "both"
# severity threshold rank for inline comments:
# 3=action_required,
# 2=remediation_recommended,
# 1=informational.
# Only findings with rank >= threshold will be published inline
inline_comments_severity_threshold = 3
🛠️ Local configuration file settings: [jira]
jira_base_url = "https://redhat.atlassian.net"
[github_app]
# what should be launched automatically
pr_commands = [
"/agentic_review",
"/agentic_describe --pr_description.final_update_message=false",
"/generate_labels",
]
[pr_test]
enable=false
[review_agent]
comments_location_policy = "summary"
[checks]
enable_auto_checks_feedback = true
persistent_comment = true
final_update_message = false
[config]
ignore_pr_authors = REDACTED
[rag_arguments]
enable_rag=true
rag_repo_list=['redhat-developer/rhdh','redhat-developer/red-hat-developers-documentation-rhdh','redhat-developer/rhdh-operator','redhat-developer/rhdh-chart']
🛠️ Global configuration file settings:🛠️ PR-Agent final configurations:==================== CONFIG ====================
config.organization_id = 'redhat.com'
config.second_model_for_exhaustive_mode = 'openai/openai/o4-mini'
config.model = 'openai/openai/gpt-5.2'
config.model_turbo = 'openai/anthropic/claude-haiku-4-5'
config.model_reasoning = 'openai/vertex_ai/gemini-2.5-pro'
config.fallback_models = ['openai/anthropic/claude-sonnet-4-6', 'openai/openai/gpt-5.2']
config.use_async_clone = True
config.pr_compliance = {'ENABLE_RULES_PLATFORM': True}
config.git_provider = 'github'
config.publish_output = True
config.publish_output_no_suggestions = True
config.publish_output_progress = True
config.verbosity_level = 0
config.publish_logs = False
config.debug_mode = False
config.use_wiki_settings_file = True
config.use_repo_settings_file = True
config.use_global_settings_file = True
config.use_global_wiki_settings_file = False
config.disable_auto_feedback = False
config.ai_timeout = 150
config.response_language = 'en-US'
config.clone_repo_instead_of_fetch = True
config.always_clone = False
config.add_repo_metadata = True
config.clone_repo_time_limit = 300
config.publish_inline_comments_fallback_batch_size = 5
config.publish_inline_comments_fallback_sleep_time = 2
config.max_model_tokens = 32000
config.custom_model_max_tokens = -1
config.patch_extension_skip_types = ['.md', '.txt']
config.extra_allowed_extensions = []
config.allow_dynamic_context = True
config.allow_forward_dynamic_context = True
config.max_extra_lines_before_dynamic_context = 12
config.patch_extra_lines_before = 5
config.patch_extra_lines_after = 1
config.ai_handler = 'litellm'
config.cli_mode = False
config.fetch_github_apps_from_platform = False
config.trial_git_org_max_invokes_per_month = 30
config.trial_ratio_close_to_limit = 0.8
config.invite_only_mode = False
config.enable_request_access_msg_on_new_pr = False
config.check_also_invites_field = False
config.allowed_users = []
config.calculate_context = True
config.disable_checkboxes = False
config.output_relevant_configurations = False
config.large_patch_policy = 'clip'
config.seed = -1
config.temperature = 0.2
config.allow_dynamic_context_ab_testing = False
config.choose_dynamic_context_ab_testing_ratio = 0.5
config.ignore_pr_title = ['^\\[Auto\\]', '^Auto']
config.ignore_pr_target_branches = []
config.ignore_pr_source_branches = []
config.ignore_pr_labels = []
config.ignore_ticket_labels = []
config.allow_only_specific_folders = []
config.ignore_pr_authors = 'REDACTED'
config.ignore_repositories = []
config.ignore_language_framework = []
config.is_auto_command = False
config.is_new_pr = False
config.enable_ai_metadata = True
config.present_reasoning = True
config.max_tickets = 10
config.max_tickets_chars = 8000
config.prevent_any_approval = False
config.enable_comment_approval = False
config.enable_auto_approval = False
config.auto_approve_for_low_review_effort = -1
config.auto_approve_for_no_suggestions = False
config.ensure_ticket_compliance = False
config.new_diff_format = True
config.new_diff_format_add_external_references = True
config.tasks_queue_ttl_from_dequeue_in_seconds = 900
config.enable_custom_labels = False
==================== PR_REVIEWER ====================
pr_reviewer.require_score_review = False
pr_reviewer.require_tests_review = True
pr_reviewer.require_estimate_effort_to_review = True
pr_reviewer.require_can_be_split_review = False
pr_reviewer.require_security_review = True
pr_reviewer.require_todo_scan = False
pr_reviewer.require_ticket_analysis_review = True
pr_reviewer.require_ticket_labels = False
pr_reviewer.require_no_ticket_labels = False
pr_reviewer.check_pr_additional_content = False
pr_reviewer.persistent_comment = True
pr_reviewer.extra_instructions = ''
pr_reviewer.final_update_message = True
pr_reviewer.enable_review_labels_security = True
pr_reviewer.enable_review_labels_effort = True
pr_reviewer.enable_help_text = False
==================== PR_COMPLIANCE ====================
pr_compliance.enabled = True
pr_compliance.enable_rules_platform = True
pr_compliance.rule_providers = []
pr_compliance.enable_security_section = True
pr_compliance.enable_ticket_section = True
pr_compliance.enable_codebase_duplication_section = True
pr_compliance.enable_custom_compliance_section = True
pr_compliance.require_ticket_analysis_review = True
pr_compliance.allow_repo_pr_compliance = True
pr_compliance.enable_global_pr_compliance = True
pr_compliance.max_lines_allowed = 2000
pr_compliance.local_wiki_compliance_str = ''
pr_compliance.global_wiki_pr_compliance = ''
pr_compliance.local_repo_compliance_str = ''
pr_compliance.global_repo_pr_compliance_str = ''
pr_compliance.global_compliance_str = ''
pr_compliance.enable_generic_custom_compliance_checklist = True
pr_compliance.persist_generic_custom_compliance_checklist = False
pr_compliance.display_no_compliance_only = False
pr_compliance.enable_security_compliance = True
pr_compliance.enable_update_pr_compliance_checkbox = True
pr_compliance.enable_todo_scan = False
pr_compliance.enable_ticket_labels = False
pr_compliance.enable_no_ticket_labels = False
pr_compliance.check_pr_additional_content = False
pr_compliance.enable_compliance_labels_security = True
pr_compliance.enable_user_defined_compliance_labels = True
pr_compliance.enable_estimate_effort_to_review = True
pr_compliance.max_rag_components_to_analyze = 5
pr_compliance.min_component_size = 5
pr_compliance.persistent_comment = True
pr_compliance.enable_help_text = False
pr_compliance.extra_instructions = ''
==================== PR_DESCRIPTION ====================
pr_description.publish_labels = False
pr_description.add_original_user_description = True
pr_description.generate_ai_title = False
pr_description.extra_instructions = ''
pr_description.enable_pr_type = True
pr_description.final_update_message = True
pr_description.enable_help_text = False
pr_description.enable_help_comment = False
pr_description.bring_latest_tag = False
pr_description.enable_pr_diagram = True
pr_description.publish_description_as_comment = False
pr_description.publish_description_as_comment_persistent = True
pr_description.enable_semantic_files_types = True
pr_description.collapsible_file_list = 'adaptive'
pr_description.collapsible_file_list_threshold = 8
pr_description.inline_file_summary = False
pr_description.use_description_markers = False
pr_description.include_generated_by_header = True
pr_description.enable_large_pr_handling = True
pr_description.max_ai_calls = 4
pr_description.auto_create_ticket = False
==================== PR_QUESTIONS ====================
pr_questions.aware_ai_handler = False
pr_questions.enable_help_text = False
==================== PR_CODE_SUGGESTIONS ====================
pr_code_suggestions.suggestions_depth = 'exhaustive'
pr_code_suggestions.commitable_code_suggestions = False
pr_code_suggestions.decouple_hunks = False
pr_code_suggestions.dual_publishing_score_threshold = -1
pr_code_suggestions.focus_only_on_problems = True
pr_code_suggestions.allow_thumbs_up_down = False
pr_code_suggestions.enable_suggestion_type_reuse = False
pr_code_suggestions.enable_more_suggestions_checkbox = True
pr_code_suggestions.high_level_suggestions_enabled = True
pr_code_suggestions.extra_instructions = ''
pr_code_suggestions.enable_help_text = False
pr_code_suggestions.show_extra_context = False
pr_code_suggestions.persistent_comment = True
pr_code_suggestions.max_history_len = 5
pr_code_suggestions.apply_suggestions_checkbox = True
pr_code_suggestions.enable_chat_in_code_suggestions = True
pr_code_suggestions.apply_limit_scope = True
pr_code_suggestions.suggestions_score_threshold = 0
pr_code_suggestions.new_score_mechanism = True
pr_code_suggestions.new_score_mechanism_th_high = 9
pr_code_suggestions.new_score_mechanism_th_medium = 7
pr_code_suggestions.discard_unappliable_suggestions = False
pr_code_suggestions.num_code_suggestions_per_chunk = 3
pr_code_suggestions.num_best_practice_suggestions = 2
pr_code_suggestions.max_number_of_calls = 3
pr_code_suggestions.final_clip_factor = 0.8
pr_code_suggestions.demand_code_suggestions_self_review = False
pr_code_suggestions.code_suggestions_self_review_text = '**Author self-review**: I have reviewed the PR code suggestions, and addressed the relevant ones.'
pr_code_suggestions.approve_pr_on_self_review = False
pr_code_suggestions.fold_suggestions_on_self_review = True
pr_code_suggestions.publish_post_process_suggestion_impact = True
pr_code_suggestions.wiki_page_accepted_suggestions = True
pr_code_suggestions.enable_local_self_reflect_in_large_prs = False
pr_code_suggestions.simplify_response = True
==================== PR_CUSTOM_PROMPT ====================
pr_custom_prompt.prompt = 'The code suggestions should focus only on the following:\n- ...\n- ...\n...\n'
pr_custom_prompt.suggestions_score_threshold = 0
pr_custom_prompt.num_code_suggestions_per_chunk = 4
pr_custom_prompt.self_reflect_on_custom_suggestions = True
pr_custom_prompt.enable_help_text = False
==================== PR_ADD_DOCS ====================
pr_add_docs.extra_instructions = ''
pr_add_docs.docs_style = 'Sphinx'
pr_add_docs.file = ''
pr_add_docs.class_name = ''
==================== PR_UPDATE_CHANGELOG ====================
pr_update_changelog.push_changelog_changes = False
pr_update_changelog.extra_instructions = ''
pr_update_changelog.add_pr_link = True
pr_update_changelog.skip_ci_on_push = True
==================== PR_ANALYZE ====================
pr_analyze.enable_help_text = False
==================== PR_TEST ====================
pr_test.enable = False
pr_test.extra_instructions = ''
pr_test.testing_framework = ''
pr_test.num_tests = 3
pr_test.avoid_mocks = True
pr_test.file = ''
pr_test.class_name = ''
pr_test.enable_help_text = False
==================== PR_IMPROVE_COMPONENT ====================
pr_improve_component.num_code_suggestions = 4
pr_improve_component.extra_instructions = ''
pr_improve_component.file = ''
pr_improve_component.class_name = ''
==================== REVIEW_AGENT ====================
review_agent.llm_model = 'openai/openai/gpt-5.2_thinking'
review_agent.enable_database_persistence = True
review_agent.conversion_llm_model = 'openai/openai/gpt-5.2'
review_agent.enabled = True
review_agent.ensemble_models = ['openai/openai/gpt-5.2_thinking', 'openai/anthropic/claude-opus-4-6_thinking']
review_agent.publish_output = True
review_agent.enable_extended_mode = False
review_agent.enable_context_collector = False
review_agent.enable_issues_agent = True
review_agent.enable_compliance_agent = True
review_agent.enable_spec_agent = True
review_agent.enable_ui_agent = False
review_agent.enable_deduplication = True
review_agent.enable_conversion_agent = False
review_agent.enable_precision_agent = False
review_agent.enable_past_bugs_collector = False
review_agent.persistent_comment = True
review_agent.persistent_comment_notification = True
review_agent.enable_incremental_review = True
review_agent.rules_enabled = True
review_agent.requirements_gap_enabled = True
review_agent.llm_call_timeout = 180
review_agent.context_collector_llm_model = 'turbo'
review_agent.feedback_tool_llm_model = 'turbo'
review_agent.spec_llm_model = ''
review_agent.conversion_batching_mode = 'batch'
review_agent.conversion_batch_size = 10
review_agent.precision_llm_model = ''
review_agent.precision_max_llm_calls = 45
review_agent.precision_batching_mode = 'batch'
review_agent.precision_batch_size = 50
review_agent.precision_agent_vote_strategy = 'unanimous_discard'
review_agent.langsmith_project_name = 'review-agent'
review_agent.max_tokens_for_file = 'REDACTED'
review_agent.single_unified_diff_tokens_limit = 'REDACTED'
review_agent.max_llm_calls = 100
review_agent.context_collector_max_llm_calls = 6
review_agent.compliance_batch_size = 0
review_agent.past_bugs_max_results = 10
review_agent.past_bugs_dedup = True
review_agent.past_bugs_enable_similar_search = True
review_agent.deduplication_llm_max_tokens = 'REDACTED'
review_agent.publishing_action_level_rank_threshold = 0
review_agent.comments_location_policy = 'both'
review_agent.inline_comments_severity_threshold = 3
review_agent.prefer_single_line_comments = False
review_agent.issues_user_guidelines = ''
review_agent.compliance_user_guidelines = ''
review_agent.demand_self_review = False
review_agent.self_review_text = '**Author self-review**: I have reviewed the code review findings, and addressed the relevant ones.'
review_agent.approve_pr_on_self_review = False
==================== PR_HELP ====================
pr_help.force_local_db = False
pr_help.num_retrieved_snippets = 5
==================== PR_NEW_ISSUE ====================
pr_new_issue.label_to_prompt_part = {'general': 'general question', 'feature': 'feature request (may already be addressed in the documentation)', 'bug': 'possible bug report (may be a by design behavior)'}
pr_new_issue.supported_repos = ['qodo-ai/pr-agent']
==================== PR_HELP_DOCS ====================
pr_help_docs.repo_url = ''
pr_help_docs.repo_default_branch = 'main'
pr_help_docs.docs_path = 'docs'
pr_help_docs.exclude_root_readme = False
pr_help_docs.supported_doc_exts = ['.md', '.mdx', '.rst']
pr_help_docs.enable_help_text = False
==================== PR_SIMILAR_ISSUE ====================
pr_similar_issue.skip_comments = False
pr_similar_issue.force_update_dataset = False
pr_similar_issue.max_issues_to_scan = 500
pr_similar_issue.vectordb = 'pinecone'
==================== PR_FIND_SIMILAR_COMPONENT ====================
pr_find_similar_component.class_name = ''
pr_find_similar_component.file = ''
pr_find_similar_component.search_from_org = False
pr_find_similar_component.allow_fallback_less_words = True
pr_find_similar_component.number_of_keywords = 5
pr_find_similar_component.number_of_results = 5
==================== BEST_PRACTICES ====================
best_practices.auto_best_practices_str = ''
best_practices.wiki_best_practices_str = ''
best_practices.global_wiki_best_practices = ''
best_practices.local_repo_best_practices_str = '\n<b>Pattern 1: Add complete, runnable examples in docs and example manifests by including required dependent resources (for example, Secrets or CRDs) with safe placeholder values so users can apply them out-of-the-box.</b>\n\nExample code before:\n```\n# examples/orchestrator.yaml\napiVersion: rhdh.redhat.com/v1alpha4\nkind: Backstage\nmetadata:\n name: orchestrator\nspec:\n application:\n extraEnvs:\n secrets:\n - name: backend-auth-secret\n# Secret referenced above is missing\n```\n\nExample code after:\n```\n# examples/orchestrator.yaml\n---\napiVersion: v1\nkind: Secret\nmetadata:\n name: backend-auth-secret\nstringData:\n BACKEND_SECRET: "dummy-not-secret"\n---\napiVersion: rhdh.redhat.com/v1alpha4\nkind: Backstage\nmetadata:\n name: orchestrator\nspec:\n application:\n extraEnvs:\n secrets:\n - name: backend-auth-secret\n```\n\n<details><summary>Examples for relevant past discussions:</summary>\n\n- https://github.com/redhat-developer/rhdh-operator/pull/1567#discussion_r2315417933\n- https://github.com/redhat-developer/rhdh-operator/pull/1219#discussion_r2163204987\n</details>\n\n\n___\n\n<b>Pattern 2: When introducing optional features controlled by CR fields, implement idempotent create-or-update logic, register required schemes, add RBAC, and gate behavior on CRD presence; also document enabling/disabling and lifecycle management.</b>\n\nExample code before:\n```\n// creates ServiceMonitor with server-side apply (SSA)\nerr := c.Patch(ctx, sm, client.Apply, applyOpts)\n// no scheme registration or RBAC for ServiceMonitor\n```\n\nExample code after:\n```\n// register monitoring v1 scheme and add RBAC for servicemonitors\ncontrollerutil.CreateOrUpdate(ctx, c, sm, func() error {\n sm.Spec = desiredSpec\n return controllerutil.SetControllerReference(owner, sm, scheme)\n})\n// check CRD exists if needed; reconcile create/update/delete on spec.monitoring.enabled\n```\n\n<details><summary>Examples for relevant past discussions:</summary>\n\n- https://github.com/redhat-developer/rhdh-operator/pull/1374#discussion_r2248149438\n- https://github.com/redhat-developer/rhdh-operator/pull/1374#discussion_r2253372015\n- https://github.com/redhat-developer/rhdh-operator/pull/1499#discussion_r2284826017\n</details>\n\n\n___\n\n<b>Pattern 3: Preserve autoscaling compatibility by omitting or commenting out hard-coded replicas in Deployment/StatefulSet templates and add explicit comments explaining the omission.</b>\n\nExample code before:\n```\nspec:\n replicas: 1\n template:\n spec: {}\n```\n\nExample code after:\n```\nspec:\n # replicas: 1 # Intentionally omitted to allow HPA or custom scaling control.\n template:\n spec: {}\n```\n\n<details><summary>Examples for relevant past discussions:</summary>\n\n- https://github.com/redhat-developer/rhdh-operator/pull/1284#discussion_r2156758328\n- https://github.com/redhat-developer/rhdh-operator/pull/1284#discussion_r2157238898\n</details>\n\n\n___\n\n<b>Pattern 4: Keep documentation synchronized with implementation changes, specifying versions, defaults, namespaces, and merge semantics to avoid user confusion when behavior evolves.</b>\n\nExample code before:\n```\n# docs/configuration.md\nFrom version 0.7.0, dynamic plugins are overridden by the CR.\n```\n\nExample code after:\n```\n# docs/configuration.md\nBefore 0.8.0 the Operator replaced defaults; since 0.8.0 it merges defaults with the user ConfigMap (non-deep merge).\nResources are created in the same namespace as the Backstage CR unless stated otherwise.\n```\n\n<details><summary>Examples for relevant past discussions:</summary>\n\n- https://github.com/redhat-developer/rhdh-operator/pull/1486#discussion_r2288776329\n- https://github.com/redhat-developer/rhdh-operator/pull/1551#discussion_r2301210631\n- https://github.com/redhat-developer/rhdh-operator/pull/1551#discussion_r2301214220\n- https://github.com/redhat-developer/rhdh-operator/pull/1323#discussion_r2179583371\n</details>\n\n\n___\n\n<b>Pattern 5: Harden shell scripts by enabling strict modes, quoting variables and arrays, validating required env vars, avoiding brittle traps, and removing unused variables to satisfy ShellCheck and prevent runtime errors.</b>\n\nExample code before:\n```\n#!/bin/bash\nfor db in ${!allDB[@]}; do\n echo Copying database: $db\ndone\ntrap "rm -f $tmpFile" EXIT\n```\n\nExample code after:\n```\n#!/bin/bash\nset -euo pipefail\n: "${TO_PSW:?TO_PSW environment variable not set}"\nfor db in "${allDB[@]}"; do\n echo "Copying database: ${db}"\ndone\ntrap \'rm -f "$tmpFile" || true\' EXIT\n```\n\n<details><summary>Examples for relevant past discussions:</summary>\n\n- https://github.com/redhat-developer/rhdh-operator/pull/1305#discussion_r2175117965\n- https://github.com/redhat-developer/rhdh-operator/pull/1305#discussion_r2175123942\n- https://github.com/redhat-developer/rhdh-operator/pull/1305#discussion_r2175338254\n- https://github.com/redhat-developer/rhdh-operator/pull/1305#discussion_r2188582064\n- https://github.com/redhat-developer/rhdh-operator/pull/1305#discussion_r2188591953\n</details>\n\n\n___\n'
best_practices.global_repo_best_practices_str = ''
best_practices.global_best_practices_str = ''
best_practices.organization_name = ''
best_practices.max_lines_allowed = 2000
best_practices.enable_global_best_practices = True
best_practices.allow_repo_best_practices = True
best_practices.enabled = True
==================== AUTO_BEST_PRACTICES ====================
auto_best_practices.enable_auto_best_practices = True
auto_best_practices.utilize_auto_best_practices = True
auto_best_practices.extra_instructions = ''
auto_best_practices.min_suggestions_to_auto_best_practices = 10
auto_best_practices.number_of_days_to_update = 30
auto_best_practices.max_patterns = 5
auto_best_practices.minimal_date_to_update = '2025-01-26'
auto_best_practices.generate_new_best_practices = False
==================== JIRA ====================
jira.jira_client_id = 'REDACTED'
jira.jira_app_secret = 'REDACTED'
jira.jira_base_url = 'https://redhat.atlassian.net'
==================== LINEAR ====================
linear.linear_client_id = 'REDACTED'
==================== PR_TO_TICKET ====================
pr_to_ticket.default_base_url = ''
pr_to_ticket.default_project_key = 'REDACTED'
pr_to_ticket.fallback_to_git_provider_issues = True
pr_to_ticket.direct_update_compliance = False
==================== github_app ====================
github_app.bot_user = 'github-actions[bot]'
github_app.override_deployment_type = True
github_app.handle_pr_actions = ['opened', 'reopened', 'ready_for_review']
github_app.pr_commands = ['/agentic_review', '/agentic_describe --pr_description.final_update_message=false', '/generate_labels']
github_app.feedback_on_draft_pr = False
github_app.handle_push_trigger = False
github_app.push_commands = ['/agentic_review']
github_app.ignore_pr_title = []
github_app.ignore_bot_pr = True |
|
/agentic_review |
|
❌ PR-Agent failed to apply 'wiki' repo settings The configuration file needs to be a valid TOML, please fix it. Error message: Configuration content:[review_agent]
comments_location_policy = "both"
# severity threshold rank for inline comments:
# 3=action_required,
# 2=remediation_recommended,
# 1=informational.
# Only findings with rank >= threshold will be published inline
inline_comments_severity_threshold = 3
[auto_best_practices]
generate_new_best_practices = True
min_suggestions_to_auto_best_practices = 1 |
|
Persistent review updated to latest commit 42b0adb |
|
/agentic_review |
|
Persistent review updated to latest commit 42b0adb |
|
/compliance |
PR Compliance Guide 🔍(Compliance updated until commit 42b0adb)Below is a summary of compliance checks for this PR:
Compliance status legend🟢 - Fully Compliant🟡 - Partial Compliant 🔴 - Not Compliant ⚪ - Requires Further Human Verification 🏷️ - Compliance label Previous compliance checksCompliance check up to commit 42b0adb
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
😔 Failed to publish a ticket for this PR. |
|
/compliance redhat.atlassian.net/browse/RHIDP-13099 |



Summary
Intentional issues introduced
unsafepackage usagefmt.Printfdebug logging in controller (instead of structured logging)panic()in library codehttps://redhat.atlassian.net/browse/RHIDP-13099