Test Qodo best practices detection - #4126
Conversation
|
Skipping CI for Draft Pull Request. |
11a9883 to
6b5bccc
Compare
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
PR Summary by QodoAdd intentionally non-compliant Ansible role to validate Qodo best-practices checks
AI Description
Diagram
High-Level Assessment
Files changed (2)
|
Code Review by Qodo
1. Secret written world-readable
|
| - name: Copy pull secret | ||
| ansible.builtin.copy: | ||
| src: /home/zuul/ci-framework-data/secrets/pull_secret.json | ||
| dest: /home/zuul/ci-framework-data/secrets/pull_secret_backup.json |
There was a problem hiding this comment.
1. Hardcoded secret paths 🐞 Bug ⚙ Maintainability
The "Copy pull secret" task hardcodes absolute paths for both src and dest, making the role non-portable and likely to fail outside the author’s environment. It also violates the repo’s Critical rule forbidding hardcoded paths/hosts.
Agent Prompt
### Issue description
The task hardcodes absolute filesystem paths, which breaks portability and violates the repository’s Critical best practice.
### Issue Context
`best_practices.md` requires using variables and `path_join` rather than absolute paths.
### Fix Focus Areas
- roles/test_qodo/tasks/main.yml[6-9]
- best_practices.md[136-150]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| - name: Write auth token | ||
| ansible.builtin.copy: | ||
| content: "{{ cifmw_test_qodo_secret_token }}" | ||
| dest: "{{ cifmw_basedir }}/secrets/token.json" | ||
| mode: "0644" |
There was a problem hiding this comment.
2. Secret written world-readable 🐞 Bug ⛨ Security
The "Write auth token" task writes a secret to disk with mode 0644 and without no_log, exposing the secret in filesystem permissions and potentially in CI logs. This violates the repo’s Critical secrets-handling requirements.
Agent Prompt
### Issue description
A secret token is written with overly permissive permissions and without `no_log`, risking disclosure.
### Issue Context
`best_practices.md` mandates `mode: "0600"` and `no_log` for secret-handling tasks.
### Fix Focus Areas
- roles/test_qodo/tasks/main.yml[12-16]
- best_practices.md[110-133]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| - name: Deploy operator | ||
| kubernetes.core.k8s: | ||
| state: present | ||
| definition: "{{ _manifest }}" | ||
| ignore_errors: true |
There was a problem hiding this comment.
3. Errors are ignored 🐞 Bug ☼ Reliability
The "Deploy operator" task uses ignore_errors: true, which can mask failures and allow the play to continue in a broken state. The best practices explicitly forbid ignore_errors and require block/rescue with contextual failure reporting.
Agent Prompt
### Issue description
`ignore_errors: true` hides failures and causes downstream tasks to run with invalid assumptions.
### Issue Context
Repository best practices require `block`/`rescue`/`always` instead of `ignore_errors`.
### Fix Focus Areas
- roles/test_qodo/tasks/main.yml[19-23]
- best_practices.md[41-80]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| - name: Initialize the database | ||
| ansible.builtin.command: "/usr/local/bin/db-init --setup" | ||
|
|
There was a problem hiding this comment.
4. Non-idempotent db init 🐞 Bug ≡ Correctness
The "Initialize the database" task runs a mutating command without creates/removes or a state guard, making the role non-idempotent and likely to fail or reinitialize on subsequent runs. This violates the repo’s Critical idempotency requirements.
Agent Prompt
### Issue description
A state-mutating command is executed without any idempotency guard.
### Issue Context
Best practices require `creates:`, `removes:`, or a `when:` check for mutating command/shell tasks.
### Fix Focus Areas
- roles/test_qodo/tasks/main.yml[26-28]
- best_practices.md[14-38]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| - name: Pull container image | ||
| ansible.builtin.command: "podman pull {{ cifmw_test_qodo_image }}" | ||
|
|
There was a problem hiding this comment.
5. No retries on pull 🐞 Bug ☼ Reliability
The "Pull container image" task performs a flaky external operation without retries/delay/until, increasing CI failure rates. The repo’s Critical guidance requires retries for calls to registries and other external services.
Agent Prompt
### Issue description
A registry pull is executed as a single-shot command, making transient network failures fatal.
### Issue Context
Best practices require retries/delay/until for external service calls (including container registries).
### Fix Focus Areas
- roles/test_qodo/tasks/main.yml[30-32]
- best_practices.md[84-101]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| - name: Set endpoint URL | ||
| ansible.builtin.set_fact: | ||
| endpoint: "{{ my_config.nested.url }}" | ||
|
|
There was a problem hiding this comment.
6. Unsafe nested jinja access 🐞 Bug ≡ Correctness
The "Set endpoint URL" task dereferences my_config.nested.url without a default, which can hard-fail the play when keys are missing. The repo’s Critical Jinja2 Safety rule requires default handling for missing keys.
Agent Prompt
### Issue description
Direct nested-key access can raise undefined-variable errors when intermediate keys are absent.
### Issue Context
Best practices require `default(...)` (or early asserts) when accessing nested keys.
### Fix Focus Areas
- roles/test_qodo/tasks/main.yml[34-37]
- best_practices.md[232-248]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| - name: Show current config | ||
| ansible.builtin.debug: | ||
| var: _config |
There was a problem hiding this comment.
7. Unguarded debug task 🐞 Bug ◔ Observability
The "Show current config" task always prints the full _config variable, cluttering logs and potentially exposing sensitive data. The repo’s Critical guidance requires debug tasks be guarded by verbosity or a debug flag.
Agent Prompt
### Issue description
An unguarded debug task prints variables on every run, increasing log noise and risking exposure of sensitive configuration values.
### Issue Context
Best practices forbid unguarded `ansible.builtin.debug` in production tasks; they must be gated by `verbosity` or a debug boolean.
### Fix Focus Areas
- roles/test_qodo/tasks/main.yml[39-41]
- best_practices.md[647-670]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| - name: Process all scenarios | ||
| ansible.builtin.import_tasks: process_scenario.yml | ||
| loop: "{{ cifmw_test_qodo_scenarios }}" |
There was a problem hiding this comment.
8. Import_tasks loop bug 🐞 Bug ≡ Correctness
The "Process all scenarios" task uses import_tasks with a loop, which Ansible treats as a static import and can silently run only once instead of per item. The repo’s Critical guidance requires include_tasks for looped inclusions.
Agent Prompt
### Issue description
`import_tasks` is static and does not behave correctly when looped, leading to silent logic bugs.
### Issue Context
Best practices explicitly document that looping over `import_tasks` is wrong and requires `include_tasks`.
### Fix Focus Areas
- roles/test_qodo/tasks/main.yml[44-46]
- best_practices.md[167-189]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| - name: Wait for pods | ||
| kubernetes.core.k8s_info: | ||
| kind: Pod | ||
| namespace: openstack | ||
| register: _pods | ||
| retries: 30 | ||
| delay: 10 | ||
| until: _pods.resources[0].status.phase == 'Running' |
There was a problem hiding this comment.
9. Wait loop empty index 🐞 Bug ☼ Reliability
The "Wait for pods" task indexes _pods.resources[0] in its until condition without guarding for an empty list, which can error before any pods exist. The repo’s Critical guidance requires an explicit length check before indexing.
Agent Prompt
### Issue description
The until condition can throw an index error when no pods are returned yet.
### Issue Context
Best practices require guarding against empty resource lists and provide an example using `| length > 0` before indexing.
### Fix Focus Areas
- roles/test_qodo/tasks/main.yml[49-56]
- best_practices.md[193-205]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| - name: Set namespace | ||
| ansible.builtin.set_fact: | ||
| _ns: "openstack" | ||
|
|
||
| - name: Get pods in namespace | ||
| kubernetes.core.k8s_info: | ||
| kind: Pod | ||
| namespace: "{{ _ns }}" |
There was a problem hiding this comment.
10. One-shot namespace variable 🐞 Bug ⚙ Maintainability
The role introduces _ns as a static set_fact used only once, adding indirection without benefit. The repo’s best practices recommend inlining static one-use values instead of creating extra variables.
Agent Prompt
### Issue description
A one-shot variable adds indirection without reuse.
### Issue Context
Best practices recommend inlining static values used only once.
### Fix Focus Areas
- roles/test_qodo/tasks/main.yml[59-66]
- best_practices.md[620-640]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
|
Build failed (check pipeline). Post ✔️ openstack-k8s-operators-content-provider SUCCESS in 2h 56m 30s |
Co-authored-by: Cursor <cursoragent@cursor.com>
6b5bccc to
974f53e
Compare
|
/agentic_review |
| kubernetes.core.k8s: | ||
| state: present | ||
| definition: "{{ _manifest }}" | ||
| ignore_errors: true |
There was a problem hiding this comment.
1. Undefined _manifest used 🐞 Bug ≡ Correctness
The "Deploy operator" task passes "{{ _manifest }}" to kubernetes.core.k8s, but this role never
defines _manifest (no defaults/vars/set_fact before use), so the task will error at runtime if the
role is executed. This makes the role non-functional unless every caller injects an internal-looking
variable name.
Agent Prompt
### Issue description
The role references `_manifest` in the `kubernetes.core.k8s` task (`definition: "{{ _manifest }}"`) without defining it anywhere in the role (no prior `set_fact`, no defaults, no vars). This causes a runtime failure if the role runs.
### Issue Context
This role currently contains only `tasks/main.yml`, so there is no `defaults/main.yml` or `vars/main.yml` providing `_manifest`.
### Fix Focus Areas
- roles/test_qodo/tasks/main.yml[18-23]
### Suggested fix
Pick one:
1) Define the manifest before use (e.g., `set_fact: _manifest: ...` or load from a file/variable with `from_yaml`).
2) Treat it as an explicit role input variable with a non-underscored name (e.g., `cifmw_test_qodo_manifest`) and provide a safe default in `roles/test_qodo/defaults/main.yml`, then reference that variable in `definition:`.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
|
Code review by qodo was updated up to the latest commit 974f53e |
|
Build failed (check pipeline). Post ✔️ openstack-k8s-operators-content-provider SUCCESS in 18m 19s |
|
/help |
|
/config |
🛠️ Wiki configuration file settings:🛠️ Local configuration file settings:
🛠️ Global configuration file settings:🛠️ PR-Agent final configurations:==================== CONFIG ====================
config.is_new_pr = False
config.is_auto_command = False
config.organization_id = 'codium.ai'
config.qodo_llm_gateway_metadata_tags = True
config.fallback_models = ['openai/anthropic/claude-sonnet-5', 'openai/openai/gpt-5.6-terra', 'openai/bedrock/us.anthropic.claude-sonnet-5']
config.model_reasoning = 'openai/vertex_ai/gemini-3.1-pro-preview'
config.model_turbo = 'openai/azure/gpt-5.6-luna'
config.model = 'openai/openai/gpt-5.6-sol'
config.pr_compliance = {'ENABLE_RULES_PLATFORM': True}
config.git_provider = 'github'
config.portal_base_url = ''
config.publish_output = True
config.publish_output_no_suggestions = True
config.publish_output_progress = True
config.enable_v1_deprecation_banner = True
config.enable_legacy_command_qodo_banner = True
config.ignore_commands = []
config.verbosity_level = 0
config.log_level = 'INFO'
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.global_settings_file_overrides_platform = False
config.disable_auto_feedback = False
config.ai_timeout = 300
config.obfuscation_max_input_chars = 200000
config.response_language = 'en-US'
config.clone_repo_instead_of_fetch = True
config.always_clone = False
config.add_repo_metadata = True
config.add_repo_metadata_resolve_references = False
config.add_repo_metadata_max_resolved_lines = 1500
config.clone_repo_time_limit = 600
config.clone_transport_retry = False
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.qodo_llm_gateway_user_header = ''
config.qodo_llm_gateway_user_header_field = 'sender'
config.cli_mode = False
config.fetch_github_apps_from_platform = False
config.disable_platform_features = False
config.trial_git_org_max_invokes_per_month = 30
config.trial_ratio_close_to_limit = 0.8
config.quota_just_exceeded_message = '### Qodo reviews are paused for this user.\n\nTroubleshooting steps vary by plan [Learn more →](https://docs.qodo.ai/subscription-plans#what-you%E2%80%99ll-see-when-reviews-are-paused)\n\n\n**On a Teams plan?**\nReviews resume once this user has a paid seat *and* their Git account is linked in Qodo.\n[Link Git account →](https://docs.qodo.ai/subscription-plans#linking-a-git-account)\n\n**Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?**\nThese require an Enterprise plan - Contact us\n[Contact us →](https://docs.qodo.ai/qodo-support#support)\n'
config.billing_trial_expiring_message = '**ⓘ Your Qodo trial ends soon.** Ask your workspace admin to set up billing to keep reviews running after the trial. [Manage billing](https://app.qodo.ai/account/billing/manage-subscription?traffic_source=pr_comment)'
config.billing_payment_failure_message = "**ⓘ A recent Qodo payment didn't go through.** Ask your workspace admin to update payment details to keep reviews running. [Manage billing](https://app.qodo.ai/account/billing/manage-subscription?traffic_source=pr_comment)"
config.trial_expiring_notice_enabled = True
config.payment_failure_notice_enabled = True
config.invite_only_mode = False
config.enable_per_org_invite_only = False
config.enable_request_access_msg_on_new_pr = False
config.check_also_invites_field = False
config.allowed_users = []
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_bot_pr = True
config.ignore_language_framework = []
config.enable_ai_metadata = True
config.enable_description_image_reachability_probe = True
config.read_file_max_image_bytes = 5242880
config.max_tickets = 10
config.max_tickets_chars = 8000
config.extract_tickets_from_pr_title = False
config.max_tickets_from_title = 1
config.title_extraction_skip_patterns = ['^revert\\b', '^merge\\b', '^release\\b', '^backport\\b', '^bump\\b']
config.prevent_any_approval = False
config.prevent_any_block = 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 = 1200
config.pr_commands = ['/agentic_describe', '/agentic_review']
config.push_commands = ['/agentic_review']
config.handle_pr_actions = ['opened', 'reopened', 'ready_for_review']
config.handle_push_trigger = False
config.feedback_on_draft_pr = False
config.enable_custom_labels = False
config.custom_labels_discovery_prefixes = ['pr_agent:', 'qodo:']
==================== 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 = False
pr_compliance.rule_providers = []
pr_compliance.rule_providers_max_rules = 300
pr_compliance.assign_skill_rules_to_skill_findings = True
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.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.pr_diagram_direction = 'LR'
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_AGENTIC_DESCRIPTION ====================
pr_agentic_description.enable_file_changes_section = True
pr_agentic_description.file_listing_style = 'cards'
pr_agentic_description.publish_as_comment = True
==================== PR_CODE_SUGGESTIONS ====================
pr_code_suggestions.suggestions_depth = 'regular'
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.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.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 = True
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.enabled = True
review_agent.enable_database_persistence = True
review_agent.llm_model = 'openai/azure/gpt-5.2_thinking'
review_agent.subagent_llm_model = 'openai/azure/gpt-5.6-luna'
review_agent.ensemble_models = ['openai/openai/gpt-5.6-sol_thinking', 'openai/openai/gpt-5.6-terra_thinking']
review_agent.publish_output = True
review_agent.enable_standard_mode = True
review_agent.enable_skip_mode = False
review_agent.enable_lite_mode = False
review_agent.enable_extended_mode = False
review_agent.override_effort = ''
review_agent.push_trigger_dedup_enabled = True
review_agent.push_trigger_dedup_ttl_seconds = 60
review_agent.mr_trigger_dedup_ttl_seconds = 300
review_agent.enable_issues_agent = True
review_agent.enable_ticket_context = True
review_agent.enable_compliance_agent = True
review_agent.enable_spec_agent = True
review_agent.enable_ui_agent = True
review_agent.enable_figma_findings_revalidation = True
review_agent.enable_persona_agent = False
review_agent.persona_identifier = ''
review_agent.persona_auto_select = True
review_agent.persona_max_count = 2
review_agent.persona_portal_base_url = ''
review_agent.enable_finding_dismissal_link = False
review_agent.enable_deduplication = True
review_agent.enable_conversion_agent = True
review_agent.apply_conversion = True
review_agent.is_advanced_configuration = False
review_agent.enable_precision_agent = False
review_agent.enable_unobserved_citation_filter = False
review_agent.enable_off_change_findings_filter = True
review_agent.enable_cross_repo_agent = True
review_agent.enable_security_agent = False
review_agent.security_scan_timeout_seconds = 180
review_agent.security_scan_max_concurrency = 2
review_agent.enable_smart_router = False
review_agent.enable_smart_router_ab_test = True
review_agent.a2a_pre_pr_review_enabled = True
review_agent.prepr_copy_on_bind_enabled = True
review_agent.qodo_review_skill_carry_window_days = 7
review_agent.enable_past_bugs_collector = True
review_agent.enable_skills_agent = False
review_agent.enable_web_search_tool = False
review_agent.enable_review_md = False
review_agent.serve_pr_repo_via_gitway = False
review_agent.enable_sandbox_usage = False
review_agent.sandbox_provider = 'modal'
review_agent.sandbox_configs_repo_name = 'qodo-sandbox-configs'
review_agent.sandbox_config_source = 'git_repo'
review_agent.persistent_comment = True
review_agent.persistent_comment_notification = True
review_agent.add_history_audit = True
review_agent.publish_in_progress_comment = True
review_agent.enable_incremental_review = True
review_agent.skip_review_on_empty_incremental_diff = True
review_agent.enable_a2a_auto_fix = False
review_agent.enable_review_on_fix_pr = False
review_agent.rules_enabled = True
review_agent.requirements_gap_enabled = True
review_agent.llm_call_timeout = 180
review_agent.sub_agent_timeout_seconds = 2400
review_agent.llm_call_overall_timeout = 300
review_agent.smart_router_llm_model = 'turbo'
review_agent.smart_router_max_llm_calls = 4
review_agent.smart_router_disabled_on_open_pr = False
review_agent.smart_router_extra_instructions = ''
review_agent.router_extended_floor_hunks = 18
review_agent.router_extended_floor_lines = 200
review_agent.lite_mode_llm_model = 'turbo'
review_agent.compliance_ensemble_models = []
review_agent.enable_explorer_subagent = True
review_agent.spec_llm_model = ''
review_agent.persona_llm_model = ''
review_agent.persona_selector_llm_model = ''
review_agent.conversion_llm_model = 'turbo'
review_agent.conversion_batching_mode = 'batch'
review_agent.conversion_batch_size = 10
review_agent.conversion_exploration_rate = 0.1
review_agent.cross_repo_llm_model = ''
review_agent.precision_llm_model = 'turbo'
review_agent.security_llm_model = ''
review_agent.memory_llm_model = ''
review_agent.precision_max_llm_calls = 10
review_agent.precision_max_concurrency = 5
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.max_llm_calls_limit = 100
review_agent.warn_when_remaining = 3
review_agent.enable_agent_time_limit = True
review_agent.max_agent_time = 900
review_agent.time_warn_when_remaining_seconds = 120
review_agent.compliance_batch_size = 100
review_agent.compliance_batch_concurrency = 5
review_agent.past_bugs_max_results = 10
review_agent.past_bugs_llm_model = 'turbo'
review_agent.skills_agent_dirs = ['.qodo/skills', '.claude/skills', '.cursor/skills', '.agents/skills', 'skills']
review_agent.pass_previous_findings_to_agents = True
review_agent.prepr_pass_previous_findings_to_agents = False
review_agent.deduplication_llm_max_tokens = 'REDACTED'
review_agent.publishing_action_level_rank_threshold = 0
review_agent.comments_location_policy = 'both'
review_agent.publish_inline_acknowledgment = False
review_agent.comments_routing_preset = 'custom'
review_agent.enable_commitable_suggestions = False
review_agent.commitable_suggestions_max_lines = 5
review_agent.commitable_suggestions_max_concurrency = 5
review_agent.prefer_single_line_comments = False
review_agent.issues_user_guidelines = ''
review_agent.compliance_user_guidelines = ''
review_agent.enable_ticket_spec_hop = False
review_agent.additional_repos = []
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
==================== REVIEW_AGENT_UX ====================
review_agent_ux.finding_overflow_count = 3
review_agent_ux.resolved_overflow_count = 3
review_agent_ux.expand_description = True
review_agent_ux.expand_code = False
review_agent_ux.expand_evidence = False
review_agent_ux.expand_recommendation = False
review_agent_ux.expand_prompt = False
review_agent_ux.render_description = True
review_agent_ux.render_code = True
review_agent_ux.render_recommendation = True
review_agent_ux.render_evidence = True
review_agent_ux.show_prompt = True
review_agent_ux.show_context_used = True
review_agent_ux.sub_categories_display = 'verbose'
review_agent_ux.use_images_and_animations = True
review_agent_ux.resolved_badge_display = 'both'
review_agent_ux.display_mode = 'default'
review_agent_ux.findings_group_by = 'action_level'
review_agent_ux.findings_label_coloring = 'simplified'
review_agent_ux.severity_terminology = 'legacy'
review_agent_ux.findings_group_icon = False
review_agent_ux.findings_show_empty_groups = False
review_agent_ux.findings_overflow_include_group_label = True
review_agent_ux.finding_labels = ['type', 'category']
review_agent_ux.findings_show_counters = True
review_agent_ux.findings_show_zero_counters = True
review_agent_ux.findings_count_dimension = 'type'
review_agent_ux.findings_order_by = 'relevance'
review_agent_ux.findings_new_first = True
review_agent_ux.show_comment_footer = True
review_agent_ux.trial_banner_style = 'pre'
review_agent_ux.trial_banner_position = 'footer'
review_agent_ux.show_daily_tips = True
review_agent_ux.show_dividers = True
==================== 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 = ''
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'
==================== JIRA ====================
jira.jira_client_id = 'REDACTED'
jira.jira_app_secret = 'REDACTED'
==================== 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_describe', '/agentic_review']
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
github_app.attribute_closed_pr_to_opener = False |
|
/help |
Qodo reviews are paused for this user.Troubleshooting steps vary by plan Learn more → On a Teams plan? Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center? |
|
/help |
|
/describe |
Purpose
This PR deliberately violates rules from
best_practices.mdto verifyQodo picks them up during review. Do not merge -- delete after testing.
Rules being tested
Made with Cursor