argus-code-review 0.2.1__tar.gz → 0.2.2__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 (148) hide show
  1. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/.gitignore +1 -0
  2. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/CHANGELOG.md +18 -1
  3. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/PKG-INFO +3 -1
  4. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/README.md +2 -0
  5. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/llm/models.py +6 -1
  6. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-specialist-llm-patterns.md +1 -1
  7. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_llm_models.py +15 -0
  8. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/LICENSE +0 -0
  9. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/__init__.py +0 -0
  10. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/bench.py +0 -0
  11. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/bench_default.toml +0 -0
  12. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/cli.py +0 -0
  13. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/config.py +0 -0
  14. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/coverage.py +0 -0
  15. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/dotenv_utils.py +0 -0
  16. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/gemini_cache.py +0 -0
  17. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/gemini_runner.py +0 -0
  18. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/github_client.py +0 -0
  19. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/graph.py +0 -0
  20. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/helpers.py +0 -0
  21. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/llm/output_models.py +0 -0
  22. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/llm/pricing.py +0 -0
  23. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/models.py +0 -0
  24. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/openai_client.py +0 -0
  25. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/openai_runner.py +0 -0
  26. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/pipeline_models.py +0 -0
  27. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/__init__.py +0 -0
  28. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/actions_scanner.py +0 -0
  29. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/engine.py +0 -0
  30. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/eslint_bundle/.gitignore +0 -0
  31. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/eslint_bundle/README.md +0 -0
  32. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/eslint_bundle/eslint.config.js +0 -0
  33. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/eslint_bundle/package-lock.json +0 -0
  34. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/eslint_bundle/package.json +0 -0
  35. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/js_scanner.py +0 -0
  36. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/migration_scanner.py +0 -0
  37. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/rules/README.md +0 -0
  38. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/sarif.py +0 -0
  39. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/scanner_utils.py +0 -0
  40. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/secrets_scanner.py +0 -0
  41. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/shadow.py +0 -0
  42. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/terraform_scanner.py +0 -0
  43. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/precheck/workflow_lint_scanner.py +0 -0
  44. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/__init__.py +0 -0
  45. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-blocking-validator.md +0 -0
  46. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-coverage-check.md +0 -0
  47. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-cross-cutting.md +0 -0
  48. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-feedback-verifier.md +0 -0
  49. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-lite.md +0 -0
  50. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-planner.md +0 -0
  51. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-preflight-router.md +0 -0
  52. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-prior-art.md +0 -0
  53. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-specialist-deployment.md +0 -0
  54. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-specialist-frontend.md +0 -0
  55. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-specialist-infra.md +0 -0
  56. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-specialist-observability.md +0 -0
  57. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-specialist-orchestration.md +0 -0
  58. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-specialist-security.md +0 -0
  59. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-specialist-slackbot.md +0 -0
  60. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-specialist-sql.md +0 -0
  61. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-subagent.md +0 -0
  62. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-tests-and-docs.md +0 -0
  63. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts/pr-review-writer.md +0 -0
  64. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/prompts_runtime.py +0 -0
  65. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/repo_provision.py +0 -0
  66. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/review_tools.py +0 -0
  67. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/runners.py +0 -0
  68. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/storage/__init__.py +0 -0
  69. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/storage/http.py +0 -0
  70. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/storage/models.py +0 -0
  71. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/storage/precheck.py +0 -0
  72. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/storage/resolver.py +0 -0
  73. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/storage/session.py +0 -0
  74. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/storage/sql.py +0 -0
  75. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/argus/storage/sqlite.py +0 -0
  76. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/pyproject.toml +0 -0
  77. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/schema/008_add_code_reviews.sql +0 -0
  78. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/schema/009_add_reviewer_version.sql +0 -0
  79. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/schema/010_add_review_patterns.sql +0 -0
  80. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/schema/011_add_review_progress_columns.sql +0 -0
  81. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/schema/015_create_agent_runs.sql +0 -0
  82. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/schema/016_add_agent_runs_failure_reason.sql +0 -0
  83. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/schema/017_add_precheck_rules.sql +0 -0
  84. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/__init__.py +0 -0
  85. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/conftest.py +0 -0
  86. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/golden/review_response.schema.json +0 -0
  87. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/storage/__init__.py +0 -0
  88. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/storage/test_backend_contract.py +0 -0
  89. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/storage/test_http.py +0 -0
  90. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/storage/test_models.py +0 -0
  91. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/storage/test_resolver.py +0 -0
  92. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/storage/test_session.py +0 -0
  93. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/storage/test_sql.py +0 -0
  94. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/storage/test_sqlite_backend.py +0 -0
  95. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_actions_scanner.py +0 -0
  96. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_argus_review_local.py +0 -0
  97. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_bench.py +0 -0
  98. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_catchup_gate.py +0 -0
  99. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_cli_args.py +0 -0
  100. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_cli_output_contract.py +0 -0
  101. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_cli_post_review.py +0 -0
  102. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_cli_preflight.py +0 -0
  103. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_cli_prompts.py +0 -0
  104. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_config.py +0 -0
  105. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_conftest.py +0 -0
  106. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_gemini_cache.py +0 -0
  107. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_gemini_runner.py +0 -0
  108. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_github_client_checks_signal.py +0 -0
  109. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_github_client_write.py +0 -0
  110. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_graph_fetch_diff.py +0 -0
  111. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_graph_get_llm_temperature.py +0 -0
  112. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_graph_http_guards.py +0 -0
  113. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_graph_precheck.py +0 -0
  114. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_graph_preflight_image_bump.py +0 -0
  115. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_graph_progress.py +0 -0
  116. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_graph_storage_resolution.py +0 -0
  117. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_graph_timeout_surfacing.py +0 -0
  118. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_js_scanner.py +0 -0
  119. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_lite_review_cost.py +0 -0
  120. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_llm_models_override.py +0 -0
  121. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_llm_pricing.py +0 -0
  122. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_migration_scanner.py +0 -0
  123. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_models.py +0 -0
  124. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_multi_round.py +0 -0
  125. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_openai_client.py +0 -0
  126. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_openai_runner.py +0 -0
  127. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_packaging.py +0 -0
  128. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_plan_review.py +0 -0
  129. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_precheck_engine.py +0 -0
  130. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_precheck_engine_integration.py +0 -0
  131. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_precheck_sarif.py +0 -0
  132. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_precheck_shadow.py +0 -0
  133. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_precheck_shadow_integration.py +0 -0
  134. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_prompts.py +0 -0
  135. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_repo_provision.py +0 -0
  136. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_review_patterns_integration.py +0 -0
  137. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_review_tools.py +0 -0
  138. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_runners_context7.py +0 -0
  139. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_runners_context_usage.py +0 -0
  140. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_runners_helpers.py +0 -0
  141. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_runners_new.py +0 -0
  142. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_scanner_utils.py +0 -0
  143. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_secrets_scanner.py +0 -0
  144. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_specialist_validation.py +0 -0
  145. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_storage_precheck.py +0 -0
  146. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_terraform_scanner.py +0 -0
  147. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_terraform_scanner_integration.py +0 -0
  148. {argus_code_review-0.2.1 → argus_code_review-0.2.2}/tests/test_workflow_lint_scanner.py +0 -0
@@ -12,3 +12,4 @@ build/
12
12
  .env.local
13
13
  .env.*.local
14
14
  !.env.example
15
+ .argus/
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.2.2] - 2026-09-11
11
+
12
+ ### Added
13
+
14
+ - `docs/BENCH.md`, documenting the reviewer bench's config-driven platform,
15
+ model, and caching selection for leaf-reviewer roles, including the override
16
+ chain, valid values, platform credentials, and a worked Gemini configuration.
17
+ README and `docs/BUILDING_A_REVIEW_LOOP.md` now point to the new guide.
18
+
19
+ ### Fixed
20
+
21
+ - Updated the `gemini-mini` alias from the superseded `gemini-3-flash-preview`
22
+ model to the stable `gemini-3.8-flash` release. The approved-model policy
23
+ table's Google default now matches, and a regression test pins the alias to
24
+ the approved value.
25
+
10
26
  ## [0.2.1] - 2026-09-10
11
27
 
12
28
  ### Added
@@ -187,7 +203,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
187
203
  packaged set.
188
204
  - `argus --version`, `argus prompts list`, and `argus prompts export`.
189
205
 
190
- [Unreleased]: https://github.com/redesignhealth/argus-review/compare/v0.2.1...HEAD
206
+ [Unreleased]: https://github.com/redesignhealth/argus-review/compare/v0.2.2...HEAD
207
+ [0.2.2]: https://github.com/redesignhealth/argus-review/compare/v0.2.1...v0.2.2
191
208
  [0.2.1]: https://github.com/redesignhealth/argus-review/compare/v0.2.0...v0.2.1
192
209
  [0.2.0]: https://github.com/redesignhealth/argus-review/compare/v0.1.5...v0.2.0
193
210
  [0.1.5]: https://github.com/redesignhealth/argus-review/compare/v0.1.4...v0.1.5
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: argus-code-review
3
- Version: 0.2.1
3
+ Version: 0.2.2
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
@@ -437,6 +437,8 @@ see the [write-up](https://www.redesignhealth.com/content/agentic-code-review-ha
437
437
  contract for self-hosters.
438
438
  - [`docs/BUILDING_A_REVIEW_LOOP.md`](docs/BUILDING_A_REVIEW_LOOP.md) — how to
439
439
  wrap Argus in a review → fix → re-review automation loop gated on CI.
440
+ - [`docs/BENCH.md`](docs/BENCH.md) — configure the static reviewer bench to
441
+ choose platforms and models for leaf reviewers.
440
442
  - [`docs/PRECHECKS.md`](docs/PRECHECKS.md) — the deterministic, non-LLM gate
441
443
  that runs before the LLM pipeline: CI-status routing signal and custom
442
444
  semgrep rules mined from Argus's own recurring findings.
@@ -385,6 +385,8 @@ see the [write-up](https://www.redesignhealth.com/content/agentic-code-review-ha
385
385
  contract for self-hosters.
386
386
  - [`docs/BUILDING_A_REVIEW_LOOP.md`](docs/BUILDING_A_REVIEW_LOOP.md) — how to
387
387
  wrap Argus in a review → fix → re-review automation loop gated on CI.
388
+ - [`docs/BENCH.md`](docs/BENCH.md) — configure the static reviewer bench to
389
+ choose platforms and models for leaf reviewers.
388
390
  - [`docs/PRECHECKS.md`](docs/PRECHECKS.md) — the deterministic, non-LLM gate
389
391
  that runs before the LLM pipeline: CI-status routing signal and custom
390
392
  semgrep rules mined from Argus's own recurring findings.
@@ -105,7 +105,12 @@ ALIAS_MAP: Final[dict[str, str]] = {
105
105
  # TODO: upgrade to stable gemini-3.1-pro (non-preview) when GA;
106
106
  # re-eval by 2026-11-01.
107
107
  "gemini-frontier": "gemini-3.1-pro-preview",
108
- "gemini-mini": "gemini-3-flash-preview",
108
+ # gemini-3-flash-preview has been superseded by gemini-3.8-flash, the
109
+ # stable (non-preview) release -- same reasoning as gemini-frontier's
110
+ # move off a deprecated preview above: prefer the stable successor over
111
+ # a preview model once one exists. test_llm_models.py pins this exact
112
+ # value as a regression guard.
113
+ "gemini-mini": "gemini-3.8-flash",
109
114
  }
110
115
 
111
116
  # Short-lived pins for evals / preview models. Anything in here is a known
@@ -9,7 +9,7 @@ Only approved model families. Check model strings in code against this table:
9
9
  |----------|----------|---------|
10
10
  | Anthropic | claude-opus-4, claude-sonnet-4, claude-haiku-4 (use `CLAUDE_MINI`), claude-fable-5 (use `CLAUDE_FRONTIER`), claude-opus-5 (use `CLAUDE_OPUS`), claude-sonnet-4-6 (use `CLAUDE_DEFAULT`) families; claude-sonnet-5 (the previous `CLAUDE_DEFAULT` pin) remains valid as an explicit `ARGUS_SPECIALIST_MODEL`/`--specialist-model` override value, not as a new hardcoded default | claude-sonnet-4-6 |
11
11
  | OpenAI | gpt-5.4 family (gpt-5.4, gpt-5.4-mini) and gpt-5.6 family | gpt-5.6-luna |
12
- | Google | gemini-3 family | gemini-3-flash |
12
+ | Google | gemini-3 family | gemini-3.8-flash |
13
13
 
14
14
  Flag any use of: o3, o1, gpt-4 family, gpt-5-mini, claude-3/3.5 family, gemini-1.5/2.5 family.
15
15
 
@@ -14,6 +14,7 @@ from argus.llm.models import (
14
14
  CLAUDE_DEFAULT,
15
15
  EXPERIMENTAL_MODELS,
16
16
  GEMINI_FRONTIER,
17
+ GEMINI_MINI,
17
18
  GPT_FRONTIER,
18
19
  GPT_MINI,
19
20
  estimate_cost_usd,
@@ -163,6 +164,20 @@ class TestEstimateCostUsd:
163
164
  cost = estimate_cost_usd(GPT_MINI, input_tokens=1000, output_tokens=500)
164
165
  assert cost > 0.0
165
166
 
167
+ def test_gemini_mini_pinned_to_approved_model(self) -> None:
168
+ """Regression guard for gemini-mini, alongside gpt-frontier and
169
+ gpt-mini's guards above: gemini-3-flash-preview has been superseded by
170
+ gemini-3.8-flash, the stable (non-preview) release on the approved model
171
+ list (see pr-review-specialist-llm-patterns.md). Pin the alias to that
172
+ approved value so an accidental regression to a preview model or
173
+ unapproved string is caught here instead of at review time.
174
+
175
+ Also exercises estimate_cost_usd(GEMINI_MINI, ...) directly."""
176
+ assert ALIAS_MAP["gemini-mini"] == "gemini-3.8-flash"
177
+ assert GEMINI_MINI == "gemini-3.8-flash"
178
+ cost = estimate_cost_usd(GEMINI_MINI, input_tokens=1000, output_tokens=500)
179
+ assert cost > 0.0
180
+
166
181
 
167
182
  class TestResolveOverrides:
168
183
  def test_resolve_claude_default_honors_env_override(