Skip to content

Test Qodo best practices detection - #4126

Open
nemarjan wants to merge 1 commit into
openstack-k8s-operators:mainfrom
nemarjan:test/qodo-validation
Open

Test Qodo best practices detection#4126
nemarjan wants to merge 1 commit into
openstack-k8s-operators:mainfrom
nemarjan:test/qodo-validation

Conversation

@nemarjan

Copy link
Copy Markdown
Contributor

Purpose

This PR deliberately violates rules from best_practices.md to verify
Qodo picks them up during review. Do not merge -- delete after testing.

Rules being tested

  • [Critical] No Hardcoded Paths or Hosts
  • [Critical] Secrets and Credentials
  • [Critical] Error Handling (ignore_errors)
  • [Critical] Idempotency
  • [Critical] External Service Calls Must Be Retried
  • [Critical] Jinja2 Safety
  • [Critical] Debug and Diagnostic Tasks
  • [Critical] Import vs Include
  • [Critical] Race Conditions in Wait Loops
  • [Suggestion] Excessive Variables

Made with Cursor

@openshift-ci

openshift-ci Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@nemarjan nemarjan changed the title [DO NOT MERGE] Test Qodo best practices detection [DNM] Test Qodo best practices detection Aug 20, 2026
@nemarjan nemarjan self-assigned this Aug 20, 2026
@nemarjan
nemarjan force-pushed the test/qodo-validation branch from 11a9883 to 6b5bccc Compare August 20, 2026 13:53
@openshift-ci

openshift-ci Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please ask for approval from nemarjan. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@nemarjan nemarjan changed the title [DNM] Test Qodo best practices detection Test Qodo best practices detection Aug 20, 2026
@nemarjan
nemarjan marked this pull request as ready for review August 20, 2026 14:14
@qodo-code-review

qodo-code-review Bot commented Aug 20, 2026

Copy link
Copy Markdown

PR Summary by Qodo

Add intentionally non-compliant Ansible role to validate Qodo best-practices checks

🧪 Tests 🕐 10-20 Minutes

Grey Divider

AI Description

• Add a test-only role with tasks that intentionally violate documented best practices.
• Cover critical rule categories (secrets, retries, idempotency, error handling, safety).
• Use as a short-lived fixture to verify Qodo review detections (do not merge).
Diagram

graph TD
A["REVIEW.md rules"] --> B["Qodo review bot"] --> C["test_qodo tasks"] --> D["Ansible execution"] --> E{{"External deps"}}
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Dedicated synthetic diff fixture (non-executable)
  • ➕ Eliminates risk of accidental runtime execution in CI or real deployments
  • ➕ Can be stored under a test/fixtures directory and excluded from Ansible role paths
  • ➖ May not exercise tooling paths that expect valid role structure/tasks syntax
2. Guarded test role (hard fail unless explicit opt-in)
  • ➕ Keeps realistic role structure while preventing accidental use
  • ➕ Allows running Qodo checks against realistic Ansible content safely
  • ➖ Adds extra boilerplate (assertions/vars) that may interfere with some rule detections
3. Automated CI job that generates violations on the fly
  • ➕ No long-lived repo artifacts to clean up
  • ➕ Can parameterize violations and expand coverage easily
  • ➖ More CI scripting/complexity; harder to reproduce locally from the repo alone

Recommendation: Given this is explicitly a short-lived detection fixture, the PR’s approach is acceptable if it remains clearly non-mergeable and non-executable. If this needs to live longer than a one-off validation branch, prefer either a non-executable synthetic diff fixture or add a hard opt-in guard (e.g., an early assert that fails unless a dedicated variable is set) to prevent accidental invocation.

Files changed (2) +66 / -0

Tests (1) +66 / -0
main.ymlAdd intentionally non-compliant tasks to trigger Qodo rule detections +66/-0

Add intentionally non-compliant tasks to trigger Qodo rule detections

• Introduces a task list designed to violate multiple critical best-practice rules (hardcoded paths, secret handling, ignore_errors, non-idempotent commands, missing retries, unsafe Jinja access, unguarded debug, import_tasks in loops, and unsafe wait conditions). This role is explicitly marked as a temporary test artifact intended for deletion after validation.

roles/test_qodo/tasks/main.yml

Documentation (1) +0 / -0
REVIEW.mdBest-practices reference used by Qodo review checks +0/-0

Best-practices reference used by Qodo review checks

• No diff hunks were included in the provided patch for this file. In the current tree it contains the best-practices rules and examples that Qodo is expected to enforce during review.

REVIEW.md

@qodo-code-review

qodo-code-review Bot commented Aug 20, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (11) 📘 Rule violations (0) 📜 Skill insights (0)

Grey Divider


Action required

1. Secret written world-readable 🐞 Bug ⛨ Security
Description
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.
Code

roles/test_qodo/tasks/main.yml[R12-16]

+- name: Write auth token
+  ansible.builtin.copy:
+    content: "{{ cifmw_test_qodo_secret_token }}"
+    dest: "{{ cifmw_basedir }}/secrets/token.json"
+    mode: "0644"
Evidence
The task copies a secret token content to a file with mode 0644 and no no_log, while best
practices explicitly require mode 0600 and no_log for secrets.

roles/test_qodo/tasks/main.yml[12-16]
best_practices.md[110-133]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


2. import_tasks loop bug 🐞 Bug ≡ Correctness
Description
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.
Code

roles/test_qodo/tasks/main.yml[R44-46]

+- name: Process all scenarios
+  ansible.builtin.import_tasks: process_scenario.yml
+  loop: "{{ cifmw_test_qodo_scenarios }}"
Evidence
The PR adds an import_tasks with a loop; best practices warn this is wrong because it can silently
execute only once and prescribe include_tasks instead.

roles/test_qodo/tasks/main.yml[44-46]
best_practices.md[167-189]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


3. Unguarded debug task 🐞 Bug ◔ Observability
Description
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.
Code

roles/test_qodo/tasks/main.yml[R39-41]

+- name: Show current config
+  ansible.builtin.debug:
+    var: _config
Evidence
The PR adds a debug task that always prints _config; best practices define this exact pattern as
"Bad" and require gating via verbosity or a debug flag.

roles/test_qodo/tasks/main.yml[39-41]
best_practices.md[647-670]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


View high (6)
4. Non-idempotent db init 🐞 Bug ≡ Correctness
Description
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.
Code

roles/test_qodo/tasks/main.yml[R26-28]

+- name: Initialize the database
+  ansible.builtin.command: "/usr/local/bin/db-init --setup"
+
Evidence
The PR adds an unguarded db-init command; the best practices document explicitly requires
creates/removes/when for such tasks and even uses db-init as the example.

roles/test_qodo/tasks/main.yml[26-28]
best_practices.md[14-38]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


5. No retries on pull 🐞 Bug ☼ Reliability
Description
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.
Code

roles/test_qodo/tasks/main.yml[R30-32]

+- name: Pull container image
+  ansible.builtin.command: "podman pull {{ cifmw_test_qodo_image }}"
+
Evidence
The PR adds a single-shot podman pull command; best practices explicitly classify this as "Bad"
and provide a retry pattern.

roles/test_qodo/tasks/main.yml[30-32]
best_practices.md[84-101]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


6. Errors are ignored 🐞 Bug ☼ Reliability
Description
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.
Code

roles/test_qodo/tasks/main.yml[R19-23]

+- name: Deploy operator
+  kubernetes.core.k8s:
+    state: present
+    definition: "{{ _manifest }}"
+  ignore_errors: true
Evidence
The PR adds a k8s deployment task that ignores failures; the repo’s best practices explicitly define
this as "Bad" and prescribe a block/rescue approach.

roles/test_qodo/tasks/main.yml[19-23]
best_practices.md[41-80]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


7. Hardcoded secret paths 🐞 Bug ⚙ Maintainability
Description
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.
Code

roles/test_qodo/tasks/main.yml[R6-9]

+- 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
Evidence
The PR introduces a copy task with hardcoded absolute src/dest paths, which the best practices doc
explicitly forbids for portability across environments.

roles/test_qodo/tasks/main.yml[6-9]
best_practices.md[136-150]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


8. Unsafe nested Jinja access 🐞 Bug ≡ Correctness
Description
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.
Code

roles/test_qodo/tasks/main.yml[R34-37]

+- name: Set endpoint URL
+  ansible.builtin.set_fact:
+    endpoint: "{{ my_config.nested.url }}"
+
Evidence
The PR adds a nested lookup without defaulting; the best practices document calls out this exact
pattern as unsafe and provides the corrected pattern using default.

roles/test_qodo/tasks/main.yml[34-37]
best_practices.md[232-248]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


9. Wait loop empty index 🐞 Bug ☼ Reliability
Description
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.
Code

roles/test_qodo/tasks/main.yml[R49-56]

+- 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'
Evidence
The PR adds an until condition that directly indexes the first element of a potentially empty list;
best practices call out this exact failure mode and provide a guarded pattern.

roles/test_qodo/tasks/main.yml[49-56]
best_practices.md[193-205]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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



Remediation recommended

10. Undefined _manifest used 🐞 Bug ≡ Correctness ⭐ New
Description
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.
Code

roles/test_qodo/tasks/main.yml[R20-23]

+  kubernetes.core.k8s:
+    state: present
+    definition: "{{ _manifest }}"
+  ignore_errors: true
Evidence
The task uses _manifest as the k8s definition argument, but the file shows _manifest is never
assigned anywhere before this task, so templating will fail unless an external caller provides it.

roles/test_qodo/tasks/main.yml[1-23]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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



Informational

11. One-shot namespace variable 🐞 Bug ⚙ Maintainability
Description
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.
Code

roles/test_qodo/tasks/main.yml[R59-66]

+- name: Set namespace
+  ansible.builtin.set_fact:
+    _ns: "openstack"
+
+- name: Get pods in namespace
+  kubernetes.core.k8s_info:
+    kind: Pod
+    namespace: "{{ _ns }}"
Evidence
The PR adds a _ns set_fact whose value is used only for the immediately following task; best
practices explicitly label this pattern as "Bad" and recommend inlining.

roles/test_qodo/tasks/main.yml[59-66]
best_practices.md[620-640]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


Grey Divider

Tip of the day
💡 Did you know, you can tweak Display preferences with a live preview to see your comment before it ships

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Previous reviews

Review updated until commit 974f53e ⚖️ Balanced

Results up to commit 6b5bccc ⚖️ Balanced


🐞 Bugs (10) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)


Action required
1. Hardcoded secret paths 🐞 Bug ⚙ Maintainability
Description
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.
Code

roles/test_qodo/tasks/main.yml[R6-9]

+- 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
Evidence
The PR introduces a copy task with hardcoded absolute src/dest paths, which the best practices doc
explicitly forbids for portability across environments.

roles/test_qodo/tasks/main.yml[6-9]
best_practices.md[136-150]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


2. Secret written world-readable 🐞 Bug ⛨ Security
Description
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.
Code

roles/test_qodo/tasks/main.yml[R12-16]

+- name: Write auth token
+  ansible.builtin.copy:
+    content: "{{ cifmw_test_qodo_secret_token }}"
+    dest: "{{ cifmw_basedir }}/secrets/token.json"
+    mode: "0644"
Evidence
The task copies a secret token content to a file with mode 0644 and no no_log, while best
practices explicitly require mode 0600 and no_log for secrets.

roles/test_qodo/tasks/main.yml[12-16]
best_practices.md[110-133]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


3. Errors are ignored 🐞 Bug ☼ Reliability
Description
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.
Code

roles/test_qodo/tasks/main.yml[R19-23]

+- name: Deploy operator
+  kubernetes.core.k8s:
+    state: present
+    definition: "{{ _manifest }}"
+  ignore_errors: true
Evidence
The PR adds a k8s deployment task that ignores failures; the repo’s best practices explicitly define
this as "Bad" and prescribe a block/rescue approach.

roles/test_qodo/tasks/main.yml[19-23]
best_practices.md[41-80]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


View high (6)
4. Non-idempotent db init 🐞 Bug ≡ Correctness
Description
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.
Code

roles/test_qodo/tasks/main.yml[R26-28]

+- name: Initialize the database
+  ansible.builtin.command: "/usr/local/bin/db-init --setup"
+
Evidence
The PR adds an unguarded db-init command; the best practices document explicitly requires
creates/removes/when for such tasks and even uses db-init as the example.

roles/test_qodo/tasks/main.yml[26-28]
best_practices.md[14-38]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


5. No retries on pull 🐞 Bug ☼ Reliability
Description
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.
Code

roles/test_qodo/tasks/main.yml[R30-32]

+- name: Pull container image
+  ansible.builtin.command: "podman pull {{ cifmw_test_qodo_image }}"
+
Evidence
The PR adds a single-shot podman pull command; best practices explicitly classify this as "Bad"
and provide a retry pattern.

roles/test_qodo/tasks/main.yml[30-32]
best_practices.md[84-101]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


6. Unsafe nested Jinja access 🐞 Bug ≡ Correctness
Description
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.
Code

roles/test_qodo/tasks/main.yml[R34-37]

+- name: Set endpoint URL
+  ansible.builtin.set_fact:
+    endpoint: "{{ my_config.nested.url }}"
+
Evidence
The PR adds a nested lookup without defaulting; the best practices document calls out this exact
pattern as unsafe and provides the corrected pattern using default.

roles/test_qodo/tasks/main.yml[34-37]
best_practices.md[232-248]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


7. Unguarded debug task 🐞 Bug ◔ Observability
Description
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.
Code

roles/test_qodo/tasks/main.yml[R39-41]

+- name: Show current config
+  ansible.builtin.debug:
+    var: _config
Evidence
The PR adds a debug task that always prints _config; best practices define this exact pattern as
"Bad" and require gating via verbosity or a debug flag.

roles/test_qodo/tasks/main.yml[39-41]
best_practices.md[647-670]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


8. import_tasks loop bug 🐞 Bug ≡ Correctness
Description
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.
Code

roles/test_qodo/tasks/main.yml[R44-46]

+- name: Process all scenarios
+  ansible.builtin.import_tasks: process_scenario.yml
+  loop: "{{ cifmw_test_qodo_scenarios }}"
Evidence
The PR adds an import_tasks with a loop; best practices warn this is wrong because it can silently
execute only once and prescribe include_tasks instead.

roles/test_qodo/tasks/main.yml[44-46]
best_practices.md[167-189]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


9. Wait loop empty index 🐞 Bug ☼ Reliability
Description
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.
Code

roles/test_qodo/tasks/main.yml[R49-56]

+- 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'
Evidence
The PR adds an until condition that directly indexes the first element of a potentially empty list;
best practices call out this exact failure mode and provide a guarded pattern.

roles/test_qodo/tasks/main.yml[49-56]
best_practices.md[193-205]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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



Informational
10. One-shot namespace variable 🐞 Bug ⚙ Maintainability
Description
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.
Code

roles/test_qodo/tasks/main.yml[R59-66]

+- name: Set namespace
+  ansible.builtin.set_fact:
+    _ns: "openstack"
+
+- name: Get pods in namespace
+  kubernetes.core.k8s_info:
+    kind: Pod
+    namespace: "{{ _ns }}"
Evidence
The PR adds a _ns set_fact whose value is used only for the immediately following task; best
practices explicitly label this pattern as "Bad" and recommend inlining.

roles/test_qodo/tasks/main.yml[59-66]
best_practices.md[620-640]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


Grey Divider

Qodo Logo

Comment on lines +6 to +9
- 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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

Comment on lines +12 to +16
- name: Write auth token
ansible.builtin.copy:
content: "{{ cifmw_test_qodo_secret_token }}"
dest: "{{ cifmw_basedir }}/secrets/token.json"
mode: "0644"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

Comment on lines +19 to +23
- name: Deploy operator
kubernetes.core.k8s:
state: present
definition: "{{ _manifest }}"
ignore_errors: true

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

Comment on lines +26 to +28
- name: Initialize the database
ansible.builtin.command: "/usr/local/bin/db-init --setup"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

Comment on lines +30 to +32
- name: Pull container image
ansible.builtin.command: "podman pull {{ cifmw_test_qodo_image }}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

Comment on lines +34 to +37
- name: Set endpoint URL
ansible.builtin.set_fact:
endpoint: "{{ my_config.nested.url }}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

Comment on lines +39 to +41
- name: Show current config
ansible.builtin.debug:
var: _config

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

Comment on lines +44 to +46
- name: Process all scenarios
ansible.builtin.import_tasks: process_scenario.yml
loop: "{{ cifmw_test_qodo_scenarios }}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

Comment on lines +49 to +56
- 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'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

Comment on lines +59 to +66
- name: Set namespace
ansible.builtin.set_fact:
_ns: "openstack"

- name: Get pods in namespace
kubernetes.core.k8s_info:
kind: Pod
namespace: "{{ _ns }}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Informational

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

@centosinfra-prod-github-app

Copy link
Copy Markdown

Build failed (check pipeline). Post recheck (without leading slash)
to rerun all jobs. Make sure the failure cause has been resolved before
you rerun jobs.

https://gateway-cloud-softwarefactory.apps.ocp.cloud.ci.centos.org/zuul/t/rdoproject.org/buildset/12ae71b94b744d909b5578dd3be76517

✔️ openstack-k8s-operators-content-provider SUCCESS in 2h 56m 30s
✔️ podified-multinode-edpm-deployment-crc SUCCESS in 1h 34m 54s
✔️ cifmw-crc-podified-edpm-baremetal SUCCESS in 2h 22m 19s
✔️ cifmw-crc-podified-edpm-baremetal-minor-update SUCCESS in 2h 41m 35s
cifmw-pod-zuul-files FAILURE in 4m 32s
✔️ openstack-k8s-operators-content-provider-bootc SUCCESS in 45m 35s
cifmw-crc-podified-edpm-baremetal-bootc NODE_FAILURE Node(set) request 099-0000176608 failed in 0s
✔️ noop SUCCESS in 0s
✔️ cifmw-pod-ansible-test SUCCESS in 9m 47s
cifmw-pod-pre-commit FAILURE in 9m 55s

Co-authored-by: Cursor <cursoragent@cursor.com>
@nemarjan
nemarjan force-pushed the test/qodo-validation branch from 6b5bccc to 974f53e Compare August 21, 2026 07:06
@nemarjan

Copy link
Copy Markdown
Contributor Author

/agentic_review

Comment on lines +20 to +23
kubernetes.core.k8s:
state: present
definition: "{{ _manifest }}"
ignore_errors: true

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

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

@qodo-code-review

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit 974f53e

@centosinfra-prod-github-app

Copy link
Copy Markdown

Build failed (check pipeline). Post recheck (without leading slash)
to rerun all jobs. Make sure the failure cause has been resolved before
you rerun jobs.

https://gateway-cloud-softwarefactory.apps.ocp.cloud.ci.centos.org/zuul/t/rdoproject.org/buildset/ee7f3bb9f3544842aedae790c022d334

✔️ openstack-k8s-operators-content-provider SUCCESS in 18m 19s
podified-multinode-edpm-deployment-crc NODE_FAILURE Node(set) request 099-0000177287 failed in 0s
cifmw-crc-podified-edpm-baremetal NODE_FAILURE Node(set) request 099-0000177288 failed in 0s
cifmw-crc-podified-edpm-baremetal-minor-update NODE_FAILURE Node(set) request 099-0000177289 failed in 0s
cifmw-pod-zuul-files FAILURE in 5m 54s
✔️ openstack-k8s-operators-content-provider-bootc SUCCESS in 2h 25m 53s
✔️ cifmw-crc-podified-edpm-baremetal-bootc SUCCESS in 1h 47m 54s
✔️ noop SUCCESS in 0s
✔️ cifmw-pod-ansible-test SUCCESS in 9m 56s
cifmw-pod-pre-commit FAILURE in 10m 17s

@Valkyrie00

Copy link
Copy Markdown
Contributor

/help

@Valkyrie00

Copy link
Copy Markdown
Contributor

/config

@qodo-code-review

Copy link
Copy Markdown
🛠️ 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  

@Valkyrie00

Copy link
Copy Markdown
Contributor

/help

@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@nemarjan

Copy link
Copy Markdown
Contributor Author

/help

@Valkyrie00

Copy link
Copy Markdown
Contributor

/describe

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants