argus-code-review 0.2.3__tar.gz → 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/CHANGELOG.md +17 -1
  2. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/PKG-INFO +1 -1
  3. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/gemini_runner.py +8 -6
  4. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_gemini_runner.py +6 -5
  5. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/.gitignore +0 -0
  6. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/LICENSE +0 -0
  7. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/README.md +0 -0
  8. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/__init__.py +0 -0
  9. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/bench.py +0 -0
  10. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/bench_default.toml +0 -0
  11. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/cli.py +0 -0
  12. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/config.py +0 -0
  13. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/coverage.py +0 -0
  14. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/dotenv_utils.py +0 -0
  15. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/gemini_cache.py +0 -0
  16. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/github_client.py +0 -0
  17. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/graph.py +0 -0
  18. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/helpers.py +0 -0
  19. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/llm/models.py +0 -0
  20. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/llm/output_models.py +0 -0
  21. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/llm/pricing.py +0 -0
  22. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/models.py +0 -0
  23. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/openai_client.py +0 -0
  24. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/openai_runner.py +0 -0
  25. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/pipeline_models.py +0 -0
  26. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/__init__.py +0 -0
  27. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/actions_scanner.py +0 -0
  28. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/engine.py +0 -0
  29. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/eslint_bundle/.gitignore +0 -0
  30. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/eslint_bundle/README.md +0 -0
  31. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/eslint_bundle/eslint.config.js +0 -0
  32. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/eslint_bundle/package-lock.json +0 -0
  33. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/eslint_bundle/package.json +0 -0
  34. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/js_scanner.py +0 -0
  35. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/migration_scanner.py +0 -0
  36. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/rules/README.md +0 -0
  37. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/sarif.py +0 -0
  38. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/scanner_utils.py +0 -0
  39. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/secrets_scanner.py +0 -0
  40. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/shadow.py +0 -0
  41. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/terraform_scanner.py +0 -0
  42. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/precheck/workflow_lint_scanner.py +0 -0
  43. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/__init__.py +0 -0
  44. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-blocking-validator.md +0 -0
  45. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-coverage-check.md +0 -0
  46. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-cross-cutting.md +0 -0
  47. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-feedback-verifier.md +0 -0
  48. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-lite.md +0 -0
  49. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-planner.md +0 -0
  50. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-preflight-router.md +0 -0
  51. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-prior-art.md +0 -0
  52. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-specialist-deployment.md +0 -0
  53. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-specialist-frontend.md +0 -0
  54. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-specialist-infra.md +0 -0
  55. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-specialist-llm-patterns.md +0 -0
  56. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-specialist-observability.md +0 -0
  57. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-specialist-orchestration.md +0 -0
  58. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-specialist-security.md +0 -0
  59. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-specialist-slackbot.md +0 -0
  60. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-specialist-sql.md +0 -0
  61. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-subagent.md +0 -0
  62. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-tests-and-docs.md +0 -0
  63. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts/pr-review-writer.md +0 -0
  64. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/prompts_runtime.py +0 -0
  65. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/repo_provision.py +0 -0
  66. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/review_tools.py +0 -0
  67. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/runners.py +0 -0
  68. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/storage/__init__.py +0 -0
  69. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/storage/http.py +0 -0
  70. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/storage/models.py +0 -0
  71. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/storage/precheck.py +0 -0
  72. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/storage/resolver.py +0 -0
  73. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/storage/session.py +0 -0
  74. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/storage/sql.py +0 -0
  75. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/argus/storage/sqlite.py +0 -0
  76. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/pyproject.toml +0 -0
  77. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/schema/008_add_code_reviews.sql +0 -0
  78. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/schema/009_add_reviewer_version.sql +0 -0
  79. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/schema/010_add_review_patterns.sql +0 -0
  80. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/schema/011_add_review_progress_columns.sql +0 -0
  81. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/schema/015_create_agent_runs.sql +0 -0
  82. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/schema/016_add_agent_runs_failure_reason.sql +0 -0
  83. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/schema/017_add_precheck_rules.sql +0 -0
  84. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/__init__.py +0 -0
  85. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/conftest.py +0 -0
  86. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/golden/review_response.schema.json +0 -0
  87. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/storage/__init__.py +0 -0
  88. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/storage/test_backend_contract.py +0 -0
  89. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/storage/test_http.py +0 -0
  90. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/storage/test_models.py +0 -0
  91. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/storage/test_resolver.py +0 -0
  92. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/storage/test_session.py +0 -0
  93. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/storage/test_sql.py +0 -0
  94. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/storage/test_sqlite_backend.py +0 -0
  95. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_actions_scanner.py +0 -0
  96. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_argus_review_local.py +0 -0
  97. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_bench.py +0 -0
  98. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_bench_config_guard.py +0 -0
  99. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_catchup_gate.py +0 -0
  100. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_cli_args.py +0 -0
  101. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_cli_output_contract.py +0 -0
  102. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_cli_post_review.py +0 -0
  103. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_cli_preflight.py +0 -0
  104. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_cli_prompts.py +0 -0
  105. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_config.py +0 -0
  106. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_conftest.py +0 -0
  107. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_gemini_cache.py +0 -0
  108. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_github_client_checks_signal.py +0 -0
  109. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_github_client_write.py +0 -0
  110. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_graph_fetch_diff.py +0 -0
  111. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_graph_get_llm_temperature.py +0 -0
  112. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_graph_http_guards.py +0 -0
  113. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_graph_precheck.py +0 -0
  114. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_graph_preflight_image_bump.py +0 -0
  115. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_graph_progress.py +0 -0
  116. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_graph_storage_resolution.py +0 -0
  117. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_graph_timeout_surfacing.py +0 -0
  118. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_js_scanner.py +0 -0
  119. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_lite_review_cost.py +0 -0
  120. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_llm_models.py +0 -0
  121. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_llm_models_override.py +0 -0
  122. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_llm_pricing.py +0 -0
  123. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_migration_scanner.py +0 -0
  124. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_models.py +0 -0
  125. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_multi_round.py +0 -0
  126. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_openai_client.py +0 -0
  127. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_openai_runner.py +0 -0
  128. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_packaging.py +0 -0
  129. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_plan_review.py +0 -0
  130. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_precheck_engine.py +0 -0
  131. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_precheck_engine_integration.py +0 -0
  132. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_precheck_sarif.py +0 -0
  133. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_precheck_shadow.py +0 -0
  134. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_precheck_shadow_integration.py +0 -0
  135. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_prompts.py +0 -0
  136. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_repo_provision.py +0 -0
  137. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_review_patterns_integration.py +0 -0
  138. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_review_tools.py +0 -0
  139. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_runners_context7.py +0 -0
  140. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_runners_context_usage.py +0 -0
  141. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_runners_helpers.py +0 -0
  142. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_runners_new.py +0 -0
  143. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_scanner_utils.py +0 -0
  144. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_secrets_scanner.py +0 -0
  145. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_specialist_validation.py +0 -0
  146. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_storage_precheck.py +0 -0
  147. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_terraform_scanner.py +0 -0
  148. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_terraform_scanner_integration.py +0 -0
  149. {argus_code_review-0.2.3 → argus_code_review-0.2.4}/tests/test_workflow_lint_scanner.py +0 -0
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.2.4] - 2026-09-17
11
+
12
+ ### Changed
13
+
14
+ - Decoupled the Gemini reviewer's turn budget from the shared
15
+ `argus.runners._MAX_TURNS` constant (TECH-6453). `argus/gemini_runner.py`
16
+ now has its own `_MAX_TURNS_GEMINI = 45` (30 \* 1.5), independent of the
17
+ Claude Agent SDK and OpenAI runner paths, which remain at `_MAX_TURNS = 30`
18
+ unchanged. Gemini-backed bulk reviewer sessions were exhausting the
19
+ previously-shared 30-turn budget before calling `finish_review`,
20
+ truncating exploration; raising only Gemini's budget avoids widening the
21
+ cost/blast-radius ceiling on the more expensive Claude-Opus-tier
22
+ cross-cutting/blocking-validator/feedback-verifier roles, which showed no
23
+ evidence of needing more turns.
24
+
10
25
  ## [0.2.3] - 2026-09-14
11
26
 
12
27
  ### Added
@@ -244,7 +259,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
244
259
  packaged set.
245
260
  - `argus --version`, `argus prompts list`, and `argus prompts export`.
246
261
 
247
- [Unreleased]: https://github.com/redesignhealth/argus-review/compare/v0.2.3...HEAD
262
+ [Unreleased]: https://github.com/redesignhealth/argus-review/compare/v0.2.4...HEAD
263
+ [0.2.4]: https://github.com/redesignhealth/argus-review/compare/v0.2.3...v0.2.4
248
264
  [0.2.3]: https://github.com/redesignhealth/argus-review/compare/v0.2.2...v0.2.3
249
265
  [0.2.2]: https://github.com/redesignhealth/argus-review/compare/v0.2.1...v0.2.2
250
266
  [0.2.1]: https://github.com/redesignhealth/argus-review/compare/v0.2.0...v0.2.1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: argus-code-review
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: Self-orchestrated PR review agent using LangGraph + Claude Agent SDK
5
5
  Project-URL: Repository, https://github.com/redesignhealth/argus-review
6
6
  Project-URL: Issues, https://github.com/redesignhealth/argus-review/issues
@@ -40,8 +40,9 @@ then loop ``client.aio.models.generate_content(...)`` -- executing every
40
40
  function call the model requests each turn (there can be more than
41
41
  one), feeding all of their results back as a single follow-up turn --
42
42
  until the model stops requesting function calls, calls
43
- ``finish_review``, or the turn budget (``argus.runners._MAX_TURNS``, the
44
- same constant the Claude path uses) is exhausted. Findings arrive via
43
+ ``finish_review``, or the turn budget (``_MAX_TURNS_GEMINI``, this
44
+ module's own budget, independent of the Claude/OpenAI paths' shared
45
+ ``argus.runners._MAX_TURNS``) is exhausted. Findings arrive via
45
46
  ``report_finding`` tool calls into ``review_tools``' per-session sink,
46
47
  not as a JSON blob embedded in the model's own text -- so, to keep this
47
48
  task's blast radius contained to this file plus ``argus.bench``'s
@@ -158,7 +159,6 @@ from argus.gemini_cache import GeminiCacheKeeper
158
159
  from argus.llm.models import estimate_cost_usd
159
160
  from argus.llm.models import resolve as resolve_model_alias
160
161
  from argus.runners import (
161
- _MAX_TURNS,
162
162
  _SUBPROCESS_TIMEOUT_S,
163
163
  SessionResult,
164
164
  _resolve_repo_root,
@@ -166,6 +166,8 @@ from argus.runners import (
166
166
 
167
167
  logger = logging.getLogger(__name__)
168
168
 
169
+ _MAX_TURNS_GEMINI = 45 # 30 * 1.5 — see TECH-6453
170
+
169
171
  # Both "auto" and "on" attempt explicit caching today -- there is no
170
172
  # separate heuristic distinguishing them yet (Track 1 defined the
171
173
  # `caching` values without one; see argus.bench's `_VALID_CACHING`). The
@@ -687,7 +689,7 @@ async def _run_turns(
687
689
  usage_tool_use_prompt_total = 0
688
690
 
689
691
  with review_tools.review_session(repo_root) as findings_sink:
690
- for _turn in range(_MAX_TURNS):
692
+ for _turn in range(_MAX_TURNS_GEMINI):
691
693
  try:
692
694
  response = await client.aio.models.generate_content(
693
695
  model=model, contents=contents, config=config
@@ -817,13 +819,13 @@ async def _run_turns(
817
819
  if finished:
818
820
  break
819
821
  else:
820
- # `for...else`: only reached if every one of _MAX_TURNS
822
+ # `for...else`: only reached if every one of _MAX_TURNS_GEMINI
821
823
  # iterations executed a function call and none of them was
822
824
  # finish_review -- i.e. the turn budget was exhausted.
823
825
  logger.warning(
824
826
  "Gemini session [%s] exhausted its %d-turn budget without a finish_review call",
825
827
  label or "unlabeled",
826
- _MAX_TURNS,
828
+ _MAX_TURNS_GEMINI,
827
829
  )
828
830
 
829
831
  result_text = _build_result_text(findings_sink, files_explored)
@@ -323,18 +323,19 @@ class TestMultipleSimultaneousFunctionCalls:
323
323
 
324
324
  class TestTurnBudgetExhaustion:
325
325
  async def test_exhausting_max_turns_still_returns_a_result(self) -> None:
326
- from argus.runners import _MAX_TURNS
326
+ from argus.gemini_runner import _MAX_TURNS_GEMINI
327
327
 
328
328
  entry = _make_entry(caching="off")
329
329
  settings = _make_settings()
330
330
 
331
331
  # Every turn keeps requesting a function call, never finish_review --
332
- # the loop must stop after _MAX_TURNS turns rather than looping forever.
332
+ # the loop must stop after _MAX_TURNS_GEMINI turns rather than looping
333
+ # forever.
333
334
  responses = [
334
335
  _make_response(
335
336
  calls=[("report_finding", {"file": None, "line": None, "description": "x"})]
336
337
  )
337
- for _ in range(_MAX_TURNS)
338
+ for _ in range(_MAX_TURNS_GEMINI)
338
339
  ]
339
340
  fake_client = _make_fake_client(responses)
340
341
 
@@ -348,9 +349,9 @@ class TestTurnBudgetExhaustion:
348
349
  )
349
350
 
350
351
  assert result.failure_reason is None
351
- assert fake_client.aio.models.generate_content.await_count == _MAX_TURNS
352
+ assert fake_client.aio.models.generate_content.await_count == _MAX_TURNS_GEMINI
352
353
  payload = _parse_result_json(result.result_text)
353
- assert len(payload["findings"]) == _MAX_TURNS
354
+ assert len(payload["findings"]) == _MAX_TURNS_GEMINI
354
355
 
355
356
 
356
357
  # ---------------------------------------------------------------------------