code-standards 8.130.0__tar.gz → 8.131.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 (205) hide show
  1. {code_standards-8.130.0 → code_standards-8.131.2}/PKG-INFO +5 -5
  2. {code_standards-8.130.0 → code_standards-8.131.2}/pyproject.toml +5 -5
  3. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/cli-reference.v1.json +2 -2
  4. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/rule-calibration-campaign.v1.json +14 -6
  5. code_standards-8.131.2/src/sarj_standards/configs/rule-inventory.v1.json +1 -0
  6. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/rule-ledger.json +3 -1
  7. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/external.py +13 -9
  8. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/rollout.py +2 -2
  9. code_standards-8.131.2/src/sarj_standards/libs/repository/cli_examples.py +50 -0
  10. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/docs.py +22 -11
  11. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/schemas/rule-catalog.v1.json +1 -1
  12. code_standards-8.130.0/src/sarj_standards/configs/rule-inventory.v1.json +0 -1
  13. {code_standards-8.130.0 → code_standards-8.131.2}/.gitignore +0 -0
  14. {code_standards-8.130.0 → code_standards-8.131.2}/LICENSE +0 -0
  15. {code_standards-8.130.0 → code_standards-8.131.2}/README.md +0 -0
  16. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/__init__.py +0 -0
  17. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/__main__.py +0 -0
  18. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/_meta.py +0 -0
  19. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/api.py +0 -0
  20. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/cli/__init__.py +0 -0
  21. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/cli/main.py +0 -0
  22. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/Mintfile.mobile.strict +0 -0
  23. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/action-parser/LICENSE.actions +0 -0
  24. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/action-parser/LICENSE.cronstrue +0 -0
  25. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/action-parser/LICENSE.yaml +0 -0
  26. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/action-parser/generate.mts +0 -0
  27. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/action-parser/index.mts +0 -0
  28. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/action-parser/package-lock.json +0 -0
  29. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/action-parser/package.json +0 -0
  30. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/action-parser/upstream.json +0 -0
  31. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/action-parser.cjs +0 -0
  32. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/actionlint.strict.yaml +0 -0
  33. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/basedpyright.python315-watch.json +0 -0
  34. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/basedpyright.strict.json +0 -0
  35. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/checkov.strict.yml +0 -0
  36. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/compile-eslint.mts +0 -0
  37. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/detekt.strict.yml +0 -0
  38. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/devops-verification.v1.json +0 -0
  39. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/doctor.config.json +0 -0
  40. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/eslint-compact-formatter.mts +0 -0
  41. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/eslint-required-policy.mts +0 -0
  42. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/eslint-selected-rules.mts +0 -0
  43. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/eslint.application.mjs +0 -0
  44. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/eslint.peers.json +0 -0
  45. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/eslint.strict.mjs +0 -0
  46. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/eslint.strict.ts +0 -0
  47. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/hadolint.strict.yaml +0 -0
  48. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/ktlint.strict.editorconfig +0 -0
  49. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/markdownlint.strict.yaml +0 -0
  50. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/mobile-tools.versions.json +0 -0
  51. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/mobsf.strict.yml +0 -0
  52. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/pyright.strict.json +0 -0
  53. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/ruff.application.toml +0 -0
  54. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/ruff.cast.toml +0 -0
  55. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/ruff.python315-watch.toml +0 -0
  56. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/ruff.required.toml +0 -0
  57. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/ruff.strict.toml +0 -0
  58. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/rule-level-source.mts +0 -0
  59. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/schemas/SKAFFOLD-LICENSE +0 -0
  60. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/schemas/google-build-v1-schema.json +0 -0
  61. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/schemas/google-build-v1.LICENSE +0 -0
  62. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/schemas/skaffold-v4beta7.json +0 -0
  63. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/schemas/upstream-schemas.json +0 -0
  64. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/semgrep-overrides.txt +0 -0
  65. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/shellcheck.strict.rc +0 -0
  66. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/swiftformat.strict +0 -0
  67. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/swiftlint.strict.yml +0 -0
  68. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/taplo.strict.toml +0 -0
  69. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/tflint.strict.hcl +0 -0
  70. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/tflint.version.hcl +0 -0
  71. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/tool-json.mts +0 -0
  72. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/yamllint.strict.yaml +0 -0
  73. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/configs/zizmor.strict.yml +0 -0
  74. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/__init__.py +0 -0
  75. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/__init__.py +0 -0
  76. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/age_transition.py +0 -0
  77. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/configs.py +0 -0
  78. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/devops.py +0 -0
  79. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/doctor.py +0 -0
  80. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/exclusions.py +0 -0
  81. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/hooks.py +0 -0
  82. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/launcher.py +0 -0
  83. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/lifecycle.py +0 -0
  84. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/manifest.py +0 -0
  85. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/native_bootstrap.py +0 -0
  86. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/packagemanager.py +0 -0
  87. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/repository_baseline.py +0 -0
  88. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/retired_suppressions.py +0 -0
  89. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/scaffold.py +0 -0
  90. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/service.py +0 -0
  91. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/transaction.py +0 -0
  92. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/upgrade.py +0 -0
  93. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/adoption/uvtool.py +0 -0
  94. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/catalogs/__init__.py +0 -0
  95. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/catalogs/slack_automations.py +0 -0
  96. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/corpus/__init__.py +0 -0
  97. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/corpus/manifest.py +0 -0
  98. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/corpus/snapshot.py +0 -0
  99. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/diagnostics/__init__.py +0 -0
  100. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/diagnostics/analysis.schema.json +0 -0
  101. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/diagnostics/baseline.py +0 -0
  102. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/diagnostics/models.py +0 -0
  103. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/diagnostics/serialize.py +0 -0
  104. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/diagnostics/source.py +0 -0
  105. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/filesystem.py +0 -0
  106. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/json_boundary.py +0 -0
  107. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/__init__.py +0 -0
  108. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/_cloudbuild_autofix.py +0 -0
  109. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/action_metadata.py +0 -0
  110. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/analysis.py +0 -0
  111. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/autofix.py +0 -0
  112. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/chart_schemas.py +0 -0
  113. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/cloudbuild.py +0 -0
  114. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/cloudbuild_schema.py +0 -0
  115. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/complexity_baseline.py +0 -0
  116. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/devops_programs.py +0 -0
  117. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/devops_schema.py +0 -0
  118. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/devops_source.py +0 -0
  119. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/devops_tools.py +0 -0
  120. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/duplicate_code.py +0 -0
  121. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/embedded_shell.py +0 -0
  122. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/kubernetes_context.py +0 -0
  123. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/library_policy.py +0 -0
  124. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/mobile_tools.py +0 -0
  125. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/policy.py +0 -0
  126. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/prepared_devops.py +0 -0
  127. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/prepared_kubernetes.py +0 -0
  128. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/prepared_native.py +0 -0
  129. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/python_fixes.py +0 -0
  130. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/repo_standards.py +0 -0
  131. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/runner.py +0 -0
  132. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/scheduling.py +0 -0
  133. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/security_tools.py +0 -0
  134. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/shell_ast.py +0 -0
  135. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/shell_format.py +0 -0
  136. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/shell_policy.py +0 -0
  137. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/test_value.py +0 -0
  138. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/text_rule_base.py +0 -0
  139. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/text_rules/__init__.py +0 -0
  140. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/text_rules/_registry.py +0 -0
  141. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/text_rules/cloudbuild_contract.py +0 -0
  142. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/textlint.py +0 -0
  143. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/toml_literals.py +0 -0
  144. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/linting/unused_modules.py +0 -0
  145. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/__init__.py +0 -0
  146. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/_values.py +0 -0
  147. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/artifacts.py +0 -0
  148. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/causality.py +0 -0
  149. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/changes.py +0 -0
  150. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/ci_artifacts.py +0 -0
  151. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/make_checks.py +0 -0
  152. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/metadata_verification.py +0 -0
  153. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/native_test_setup.py +0 -0
  154. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/process.py +0 -0
  155. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/publish.py +0 -0
  156. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/registry.py +0 -0
  157. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/release_age.py +0 -0
  158. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/release_detect.py +0 -0
  159. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/retirement.py +0 -0
  160. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/reviewed_analysis.py +0 -0
  161. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/status.py +0 -0
  162. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/tags.py +0 -0
  163. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/test_selection.py +0 -0
  164. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/typescript.py +0 -0
  165. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/verification_process.py +0 -0
  166. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/release/wheel_tests.py +0 -0
  167. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/__init__.py +0 -0
  168. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/cli_reference_artifact.py +0 -0
  169. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/cloudbuild_schema_projection.py +0 -0
  170. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/comment_corpus.py +0 -0
  171. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/config_generation.py +0 -0
  172. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/hooks.py +0 -0
  173. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/immutable_git.py +0 -0
  174. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/ledger.py +0 -0
  175. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/repository.py +0 -0
  176. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/ruff_freshness.py +0 -0
  177. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/rule_authoring.py +0 -0
  178. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/rule_catalog_artifact.py +0 -0
  179. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/rule_changes.py +0 -0
  180. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/rule_checkout.py +0 -0
  181. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/rule_dependencies.py +0 -0
  182. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/rule_examples.py +0 -0
  183. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/rule_imports.mts +0 -0
  184. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/rule_inventory_artifact.py +0 -0
  185. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/rule_level_source.py +0 -0
  186. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/rule_lifecycle.py +0 -0
  187. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/rule_maintenance.py +0 -0
  188. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/rule_registration.py +0 -0
  189. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/shell_checks.py +0 -0
  190. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/repository/third_party_catalog_artifact.py +0 -0
  191. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/rules/__init__.py +0 -0
  192. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/rules/catalog.py +0 -0
  193. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/rules/contracts.py +0 -0
  194. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/rules/corpus_runner.py +0 -0
  195. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/rules/evaluation.py +0 -0
  196. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/schema_boundary.py +0 -0
  197. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/setup/__init__.py +0 -0
  198. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/setup/repository.py +0 -0
  199. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/typed_containers.py +0 -0
  200. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/libs/yaml_boundary.py +0 -0
  201. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/py.typed +0 -0
  202. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/schemas/__init__.py +0 -0
  203. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/schemas/_paths.py +0 -0
  204. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/schemas/rule-catalog.v1.schema.json +0 -0
  205. {code_standards-8.130.0 → code_standards-8.131.2}/src/sarj_standards/schemas/slack-automations.v1.schema.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: code-standards
3
- Version: 8.130.0
3
+ Version: 8.131.2
4
4
  Summary: One deterministic quality gate for Sarj Python, TypeScript, Swift, Kotlin, shell, SQL, IaC, and repository policy.
5
5
  Project-URL: Homepage, https://code-standards.sarj.ai/
6
6
  Project-URL: Documentation, https://code-standards.sarj.ai/cli/
@@ -30,10 +30,10 @@ Requires-Dist: pyyaml==6.0.3
30
30
  Requires-Dist: referencing==0.37.0
31
31
  Requires-Dist: repo-standards==6.12.9
32
32
  Requires-Dist: ruff==0.17.2
33
- Requires-Dist: sarj-iac-lint==0.30.0
34
- Requires-Dist: sarj-python-lint==1.75.0
35
- Requires-Dist: sarj-rule-contracts==0.4.0
36
- Requires-Dist: sarj-sql-lint==0.26.0
33
+ Requires-Dist: sarj-iac-lint==0.30.1
34
+ Requires-Dist: sarj-python-lint==1.76.0
35
+ Requires-Dist: sarj-rule-contracts==0.4.1
36
+ Requires-Dist: sarj-sql-lint==0.26.1
37
37
  Requires-Dist: shellcheck-py==0.11.0.1; (sys_platform == 'darwin' and platform_machine == 'arm64') or (sys_platform == 'darwin' and platform_machine == 'x86_64') or (sys_platform == 'linux' and platform_machine == 'x86_64') or (sys_platform == 'win32' and platform_machine == 'AMD64')
38
38
  Requires-Dist: typer==0.27.3
39
39
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "code-standards"
3
- version = "8.130.0"
3
+ version = "8.131.2"
4
4
  description = "One deterministic quality gate for Sarj Python, TypeScript, Swift, Kotlin, shell, SQL, IaC, and repository policy."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.14"
@@ -17,7 +17,7 @@ classifiers = [
17
17
  "Topic :: Software Development :: Quality Assurance",
18
18
  ]
19
19
  dependencies = [
20
- "sarj-rule-contracts==0.4.0",
20
+ "sarj-rule-contracts==0.4.1",
21
21
  "pathspec==1.1.1",
22
22
  "basedpyright==1.40.2",
23
23
  "deptry==0.25.1",
@@ -31,9 +31,9 @@ dependencies = [
31
31
  "repo-standards==6.12.9",
32
32
  "ruff==0.17.2",
33
33
  "shellcheck-py==0.11.0.1; (sys_platform == 'darwin' and platform_machine == 'arm64') or (sys_platform == 'darwin' and platform_machine == 'x86_64') or (sys_platform == 'linux' and platform_machine == 'x86_64') or (sys_platform == 'win32' and platform_machine == 'AMD64')",
34
- "sarj-iac-lint==0.30.0",
35
- "sarj-python-lint==1.75.0",
36
- "sarj-sql-lint==0.26.0",
34
+ "sarj-iac-lint==0.30.1",
35
+ "sarj-python-lint==1.76.0",
36
+ "sarj-sql-lint==0.26.1",
37
37
  "typer==0.27.3",
38
38
  ]
39
39
 
@@ -3316,6 +3316,6 @@
3316
3316
  },
3317
3317
  "program": "code-standards",
3318
3318
  "schemaVersion": 1,
3319
- "summary": "Adopt, check, fix, diagnose, and update sarj-ai standards (v8.130.0).",
3320
- "version": "8.130.0"
3319
+ "summary": "Adopt, check, fix, diagnose, and update sarj-ai standards (v8.131.2).",
3320
+ "version": "8.131.2"
3321
3321
  }
@@ -805,8 +805,8 @@
805
805
  "family": "python",
806
806
  "ruleId": "prefer-fstring-over-concat",
807
807
  "state": "complete",
808
- "evidence": "Three independent reviews ran 75 focused cases and scanned 7,098 tracked first-party Python files across 85 repositories plus a normalized 462-file Pygments and pytest corpus. The original broad rule produced 39 first-party findings with 17 bad recommendations and 130 popular-source findings dominated by regex, style-table, ANSI, path, identifier, and protocol fragments. Final calibration produced seven first-party and eleven popular-source warnings; all 18 were inspected as defensible human-readable interpolation improvements, with zero observed false positives or scanner errors. Additional strict-policy campaign (2026-10-13): pass 10 of 30 is hold-warning. Annotated str may be a subclass with different __add__ and __format__ behavior; current broad detector does not prove builtin-string operands. Reproducible final calibration, judge and performance evidence is recorded in packages/python/benchmarks/error-promotion-third-30-passes.json.",
809
- "outcome": "Kept the compatible prefer-fstring-over-concat name and staged SARJ068 as a warning. Narrowed it to short prose-like interpolation inside callable scopes with proven string operands; added conservative binding and import provenance, late-rebinding kills, and exclusions for generated code, logging, common SQL and regex forms, long literals, module and class declarations, URL and path fragments, units, filenames, identifiers, protocol punctuation, lazy strings, and ORM expressions. Removed arbitrary operand-count join advice and comment bypasses. The UI now preserves explicit str and repr semantics with !s and !r instead of claiming wrappers can disappear."
808
+ "evidence": "Three independent reviews ran 75 focused cases and scanned 7,098 tracked first-party Python files across 85 repositories plus a normalized 462-file Pygments and pytest corpus. The original broad rule produced 39 first-party findings with 17 bad recommendations and 130 popular-source findings dominated by regex, style-table, ANSI, path, identifier, and protocol fragments. Final calibration produced seven first-party and eleven popular-source warnings; all 18 were inspected as defensible human-readable interpolation improvements, with zero observed false positives or scanner errors. Additional strict-policy campaign (2026-10-13): pass 10 of 30 is hold-warning. Annotated str may be a subclass with different __add__ and __format__ behavior; current broad detector does not prove builtin-string operands. Reproducible final calibration, judge and performance evidence is recorded in packages/python/benchmarks/error-promotion-third-30-passes.json. Follow-up: packages/python/benchmarks/service-contracts-and-ids-100-passes.json records 100 distinct semantic cases (39 true positives, 61 true negatives, no labeled false positives/negatives), five exact motivating blocking findings, deterministic three-trial cold/warm measurements on 296 guarded sample files, and completed local canonical gates. Private source and identifying pins remain local. Exact-head CI and broader review remain separate gates.",
809
+ "outcome": "Enforce supported short human-readable interpolation at ERROR, including stable named literal prefixes. This is a stricter reviewed style policy; str annotations do not prove custom operator/formatting equivalence, so required custom semantics retain exact reasoned exceptions. Source/configuration fragments, stable join aliases and other documented structural exclusions remain valid. Keep only the proven native-primitive builtin-conversion safe-fix subset; other repairs are manual."
810
810
  },
811
811
  {
812
812
  "task": "rule-audit/python/prefer-immutable-module-constant",
@@ -893,8 +893,8 @@
893
893
  "family": "python",
894
894
  "ruleId": "prefer-nominal-id-types",
895
895
  "state": "complete",
896
- "evidence": "Three independent reviews ran the original 73 focused cases plus precedence coverage and scanned up to 7,120 tracked Python files plus a 443-file Pygments, packaging, and pytest corpus. The original matcher produced 373 fleet findings and reproduced false positives for unlike carriers, scalar versus collection roles, shadowed primitives, unrelated UUID and wrapper types, raw TypedDict and Pydantic wire models, decorated overrides, private boundaries, SQLAlchemy Mapped fields, and operational logging payloads. Post-change validation ran 78 focused cases and 87 with precedence; the broad fleet scan fell to 199 warning candidates, a focused three-repository scan fell from 120 to 21 manually reviewed credible domain boundaries, and the popular corpus remained at zero findings. September 2026 expansion: 58 focused cases (24 positive and 34 negative, zero unexpected matches or misses) plus 17 precedence cases cover imported carriers, declared-dependency and workspace isolation, canonical non-ID roles, shadowing, suppression, and error preservation. Pinned isolated evaluation scanned 2,624 tracked Python files (21,650,669 bytes) in two private corpora with fresh processes and at most 250 files per batch. All 41 existing errors retained their locations, severity, and messages; 100 additional warnings were inspected as credible nominal-domain opportunities, with no duplicate locations or known false positives. Calibration rejected 14 earlier cross-workspace candidates: matching distribution names do not establish a shared domain. This is local consumer evidence, not fleet-wide or public-project calibration. Final rule-only baseline/candidate passes took 5.61/18.40 seconds, with peak process memory 62.3/115.6 MiB. Alternating all-rule passes over the deterministic first 250 tracked files from each corpus took 23.325/21.907 seconds for baseline and 24.710/24.577 seconds for candidate (median ratio 1.090, below the 1.25 budget); peaks were 419.8/459.8 MiB. Shared host load remains a measurement limitation. Follow-up expert type-design fifty-pass review2026-10-16: source-proven literal/domain contract gaps and inherited, runtime-factory or compiler-policy boundaries were reviewed. packages/standards/benchmarks/expert-type-design-50-passes.json records decisions, finite calibration, exact pins, robustness closures, performance scope and validation. Conservative withdrawals of legacy policy diagnostics are not counts of demonstrated runtime defects.",
897
- "outcome": "Promoted SARJ093 to error and expanded it to private, decorated, method, fake, override, and test boundaries after the motivating regressions escaped the former narrow scope. Primitive, UUID, wrapper, NewType, TypeAliasType, SQLAlchemy, Pydantic, and TypedDict decisions still require import provenance; unlike carrier shapes do not report. Generated, operational, raw-schema, SQLAlchemy Mapped, and direct Pydantic wire aliases remain excluded. Imported carrier and established non-ID coverage is staged per diagnostic as warning; shipped file-local errors, fingerprint messages, and default error metadata are unchanged. Candidate types are bounded to the owning distribution and unambiguous explicitly declared first-party dependencies, respecting nearest uv workspace members and exclusions. Canonical candidates require real typing.NewType provenance, exact role/carrier agreement, and unique production declarations. Conditional/relative imports, optional/transitive dependencies, unsupported workspace layouts, unresolved ownership, cycles, and ambiguous or mutated bindings deliberately remain unresolved. Imports are resolved only when demanded by carrier annotations or alias definitions. No autofix."
896
+ "evidence": "Three independent reviews ran the original 73 focused cases plus precedence coverage and scanned up to 7,120 tracked Python files plus a 443-file Pygments, packaging, and pytest corpus. The original matcher produced 373 fleet findings and reproduced false positives for unlike carriers, scalar versus collection roles, shadowed primitives, unrelated UUID and wrapper types, raw TypedDict and Pydantic wire models, decorated overrides, private boundaries, SQLAlchemy Mapped fields, and operational logging payloads. Post-change validation ran 78 focused cases and 87 with precedence; the broad fleet scan fell to 199 warning candidates, a focused three-repository scan fell from 120 to 21 manually reviewed credible domain boundaries, and the popular corpus remained at zero findings. September 2026 expansion: 58 focused cases (24 positive and 34 negative, zero unexpected matches or misses) plus 17 precedence cases cover imported carriers, declared-dependency and workspace isolation, canonical non-ID roles, shadowing, suppression, and error preservation. Pinned isolated evaluation scanned 2,624 tracked Python files (21,650,669 bytes) in two private corpora with fresh processes and at most 250 files per batch. All 41 existing errors retained their locations, severity, and messages; 100 additional warnings were inspected as credible nominal-domain opportunities, with no duplicate locations or known false positives. Calibration rejected 14 earlier cross-workspace candidates: matching distribution names do not establish a shared domain. This is local consumer evidence, not fleet-wide or public-project calibration. Final rule-only baseline/candidate passes took 5.61/18.40 seconds, with peak process memory 62.3/115.6 MiB. Alternating all-rule passes over the deterministic first 250 tracked files from each corpus took 23.325/21.907 seconds for baseline and 24.710/24.577 seconds for candidate (median ratio 1.090, below the 1.25 budget); peaks were 419.8/459.8 MiB. Shared host load remains a measurement limitation. Follow-up expert type-design fifty-pass review2026-10-16: source-proven literal/domain contract gaps and inherited, runtime-factory or compiler-policy boundaries were reviewed. packages/standards/benchmarks/expert-type-design-50-passes.json records decisions, finite calibration, exact pins, robustness closures, performance scope and validation. Conservative withdrawals of legacy policy diagnostics are not counts of demonstrated runtime defects. Follow-up: packages/python/benchmarks/service-contracts-and-ids-100-passes.json records 100 distinct semantic cases (39 true positives, 61 true negatives, no labeled false positives/negatives), five exact motivating blocking findings, deterministic three-trial cold/warm measurements on 296 guarded sample files, and completed local canonical gates. Private source and identifying pins remain local. Exact-head CI and broader review remain separate gates.",
897
+ "outcome": "Enforce SARJ093 at ERROR for existing two-role coverage, previously advisory imported/established-domain coverage and raw singleton IDs with a unique matching established nominal type. Preserve exact carrier and distribution/dependency ownership proof, ambiguity/shadowing/escape guards, inherited APIs, raw schemas and operational boundaries. No autofix."
898
898
  },
899
899
  {
900
900
  "task": "rule-audit/python/prefer-non-nullable-collection",
@@ -2485,8 +2485,8 @@
2485
2485
  "family": "python",
2486
2486
  "ruleId": "require-explicit-service-contract",
2487
2487
  "state": "pending",
2488
- "evidence": "Precision follow-up (2026-10-02): two independent policy/contract reviews reproduced existing Protocol, ABCMeta, abstract-declaration, value-dependency and unreachable-call misclassification. The refined rule passes 466 focused cases with SARJ071/466/467, full Python type checking, Ruff and all registered native rules on its source/tests. Generic adversarial regressions preserve services backed by stores and pools, a single operation and no substitution consumer. Private corpus evaluation is scoped separately; no fleet-wide precision claim. The pinned local-code reviewer caught a false negative where child-state assignment was mistaken for collaborator replacement; the fix preserves direct injected identity and four additional mutation regressions. The 96-case focused/combined/precedence suite passes after that correction. Follow-up 2026-10-12 additional thirty-pass campaign: Five judge rounds review strict typing and maintainability admission; bounded native WARNING tiers preserve runtime special signatures, source-visible model effects, variance/Self and frame/regex lifetime where relevant. Exact verification, corpus controls, sampling, performance and CI gate evidence is recorded in packages/python/benchmarks/error-promotion-next-30-passes.json.",
2489
- "outcome": "Retain SARJ465 as an explicitly requested proactive service-interface warning, without autofix or consumer-count gating. Reuse resolvable ABC or Protocol surfaces, including private, generic, inherited and imported aliased contracts; signatures remain the type checker responsibility. Only retained behavioral constructor collaborators and reachable public operations establish a candidate. Proven value/logging types, abstract declarations, static/class helpers and uncertain rewriting decorators/metaclasses are excluded. Structural Protocols visible only at external consumer/factory sites and dynamic aliases remain documented limits; do not manufacture a nominal duplicate or unnecessary public export. Promotion follow-up 2026-10-12: Enable the supported default at ERROR in Python 1.33.0 / TypeScript 16.8.0 / Standards 8.52.0. A retained collaborator and invoked public operations establish a service boundary whose operations lack a declared ABC or Protocol; reuse or declare a focused contract. No unsafe autofix or universal semantic-precision claim; preserve required contracts with the documented alternative or reasoned exact-code exception."
2488
+ "evidence": "Precision follow-up (2026-10-02): two independent policy/contract reviews reproduced existing Protocol, ABCMeta, abstract-declaration, value-dependency and unreachable-call misclassification. The refined rule passes 466 focused cases with SARJ071/466/467, full Python type checking, Ruff and all registered native rules on its source/tests. Generic adversarial regressions preserve services backed by stores and pools, a single operation and no substitution consumer. Private corpus evaluation is scoped separately; no fleet-wide precision claim. The pinned local-code reviewer caught a false negative where child-state assignment was mistaken for collaborator replacement; the fix preserves direct injected identity and four additional mutation regressions. The 96-case focused/combined/precedence suite passes after that correction. Follow-up 2026-10-12 additional thirty-pass campaign: Five judge rounds review strict typing and maintainability admission; bounded native WARNING tiers preserve runtime special signatures, source-visible model effects, variance/Self and frame/regex lifetime where relevant. Exact verification, corpus controls, sampling, performance and CI gate evidence is recorded in packages/python/benchmarks/error-promotion-next-30-passes.json. Follow-up: packages/python/benchmarks/service-contracts-and-ids-100-passes.json records 100 distinct semantic cases (39 true positives, 61 true negatives, no labeled false positives/negatives), five exact motivating blocking findings, deterministic three-trial cold/warm measurements on 296 guarded sample files, and completed local canonical gates. Private source and identifying pins remain local. Exact-head CI and broader review remain separate gates.",
2489
+ "outcome": "Retain SARJ465 at ERROR without autofix. Native retained-callback dispatch and per-call HTTP operations establish a service boundary regardless of Queue/Client suffixes. Reuse an ABC or Protocol that covers the operations. Preserve value/lifecycle exclusions, proven contract ancestry and unresolved/escaping ownership guards."
2490
2490
  },
2491
2491
  {
2492
2492
  "task": "rule-audit/typescript/require-explicit-service-contract",
@@ -2853,6 +2853,14 @@
2853
2853
  "state": "complete",
2854
2854
  "evidence": "Final supported-scope evaluation scans 2,830 pinned TypeScript files across nine isolated sources, capped at 250 files per fresh process with four cold/warm scans. All 74 target warnings are exhaustively inspected: 65 JSX, three dependency and six union findings, all labeled synthetic positives; zero confirmed false positives in the inspected final set and zero new real-code findings across 2,673 real files. Sixty-four ordinary-function JSX false negatives and 128 accepted explicit-forwarding sites remain recorded separately. The run has no parser failures and deterministic complete diagnostics. Its 7,440 missing-information occurrences are not unique dependencies or files and do not constitute a clean semantic scan. Generated, suppressed, incomplete, escaping, contextual and domain cases remain separate exclusions or unsupported cases. Three earlier fresh trials on 2,829 files remain historical evidence; their candidate was not qualified after an additional optional-covering-property counterexample was confirmed. The final narrower proof preserves every inspected warning tuple and accepts the separately appended regression. Exact source, corpus pins and raw evidence remain local; public reports omit private identities, source and identifying pins. Performance, full native verification, independent review and exact-head CI remain separate merge gates. Finite inspected precision is not universal absence of false positives. Native TypeScript 6.0.3 probes establish proper Dog-to-Animal coverage and independently reproduce Extract, in-narrowing and fresh-literal changes. Native assignability alone is insufficient: a covering-only optional property rejects an existing identifier, and global Object Any can supply an implicit witness. The corrected rule requires every covering member, including optional members, in the covered declared surface. Two ordinary/implicit-Any regressions and the shared erased-eval controls pass.",
2855
2855
  "outcome": "Ship the initial scope as WARNING without fixes or suggestions: an inline binary parameter union in the same proven private scalar-consumer boundary, complete readonly broad primitive object surfaces, proper one-way native assignability and all covering members explicitly present in the covered surface. Retain the covering type, never blindly the narrower subtype. Preserve public/type-level alternatives, producers, Any, unknown, generics, variance/callbacks, overloads, nominal/branded and incomplete contracts. General union simplification and Python imported-subtype approximation are withdrawn; error promotion needs a separate qualified change."
2856
+ },
2857
+ {
2858
+ "task": "rule-audit/python/prefer-grouped-settings",
2859
+ "family": "python",
2860
+ "ruleId": "prefer-grouped-settings",
2861
+ "state": "pending",
2862
+ "evidence": "Twenty-eight focused settings checks cover repeated Python field namespaces, environment-alias independence, owned and inherited fields, ClassVar and Final metadata, private fields, generated and test exclusions, imported BaseSettings ancestry, stable locations and exact suppressions. Private source, paths and identifying pins stay outside public artifacts. Follow-up: packages/python/benchmarks/service-contracts-and-ids-100-passes.json records 100 distinct semantic cases (39 true positives, 61 true negatives, no labeled false positives/negatives), five exact motivating blocking findings, deterministic three-trial cold/warm measurements on 296 guarded sample files, and completed local canonical gates. Private source and identifying pins remain local. Exact-head CI and broader review remain separate gates.",
2863
+ "outcome": "Stage SARJ532 at WARNING without autofix. At least two directly owned public BaseSettings fields must share a complete Python namespace token; environment aliases alone do not qualify. Forty-four matching groups in the private sample remain API/environment review advisories. Preserve existing loading, aliases, defaults and source precedence when grouping manually."
2856
2864
  }
2857
2865
  ]
2858
2866
  }
@@ -0,0 +1 @@
1
+ {"rules":[{"code":"SARJ202","family":"iac","id":"no-comment-cruft","source":"packages/iac/src/sarj_iac_lint/rules/no_comment_cruft.py","test":"packages/iac/tests/rules/test_no_comment_cruft.py"},{"code":"SARJ205","family":"iac","id":"no-dead-environment-input","source":"packages/iac/src/sarj_iac_lint/rules/no_dead_environment_input.py","test":"packages/iac/tests/rules/test_no_dead_environment_input.py"},{"code":"SARJ204","family":"iac","id":"no-environment-conditional","source":"packages/iac/src/sarj_iac_lint/rules/no_environment_conditional.py","test":"packages/iac/tests/rules/test_no_environment_conditional.py"},{"code":"SARJ211","family":"iac","id":"no-managed-service-account-key","source":"packages/iac/src/sarj_iac_lint/rules/no_managed_service_account_key.py","test":"packages/iac/tests/rules/test_no_managed_service_account_key.py"},{"code":"SARJ206","family":"iac","id":"no-mocked-terraform-test-oracle","source":"packages/iac/src/sarj_iac_lint/rules/no_mocked_terraform_test_oracle.py","test":"packages/iac/tests/rules/test_no_mocked_terraform_test_oracle.py"},{"code":"SARJ215","family":"iac","id":"no-nested-conditional","source":"packages/iac/src/sarj_iac_lint/rules/no_nested_conditional.py","test":"packages/iac/tests/rules/test_no_nested_conditional.py"},{"code":"SARJ214","family":"iac","id":"no-plaintext-secret-env","source":"packages/iac/src/sarj_iac_lint/rules/no_plaintext_secret_env.py","test":"packages/iac/tests/rules/test_no_plaintext_secret_env.py"},{"code":"SARJ212","family":"iac","id":"no-project-basic-privilege","source":"packages/iac/src/sarj_iac_lint/rules/no_project_basic_privilege.py","test":"packages/iac/tests/rules/test_no_project_basic_privilege.py"},{"code":"SARJ213","family":"iac","id":"no-project-secret-access-for-service-account","source":"packages/iac/src/sarj_iac_lint/rules/no_project_secret_access_for_service_account.py","test":"packages/iac/tests/rules/test_no_project_secret_access_for_service_account.py"},{"code":"SARJ209","family":"iac","id":"no-redundant-variable-validation","source":"packages/iac/src/sarj_iac_lint/rules/no_redundant_variable_validation.py","test":"packages/iac/tests/rules/test_no_redundant_variable_validation.py"},{"code":"SARJ207","family":"iac","id":"no-restated-comment","source":"packages/iac/src/sarj_iac_lint/rules/no_restated_comment.py","test":"packages/iac/tests/rules/test_no_restated_comment.py"},{"code":"SARJ210","family":"iac","id":"no-terraform-data-condition","source":"packages/iac/src/sarj_iac_lint/rules/no_terraform_data_condition.py","test":"packages/iac/tests/rules/test_no_terraform_data_condition.py"},{"code":"SARJ201","family":"iac","id":"require-deletion-protection","source":"packages/iac/src/sarj_iac_lint/rules/require_deletion_protection.py","test":"packages/iac/tests/rules/test_require_deletion_protection.py"},{"code":"SARJ203","family":"iac","id":"require-prevent-destroy-on-irreplaceable","source":"packages/iac/src/sarj_iac_lint/rules/require_prevent_destroy.py","test":"packages/iac/tests/rules/test_require_prevent_destroy.py"},{"code":"SARJ463","family":"python","id":"async-cleanup-registered-synchronously","source":"packages/python/src/sarj_python_lint/rules/async_cleanup_registered_synchronously.py","test":"packages/python/tests/rules/test_async_cleanup_registered_synchronously.py"},{"code":"SARJ456","family":"python","id":"async-mock-call-without-await-assertion","source":"packages/python/src/sarj_python_lint/rules/async_mock_call_without_await_assertion.py","test":"packages/python/tests/rules/test_async_mock_call_without_await_assertion.py"},{"code":"SARJ437","family":"python","id":"complex-postgres-query-requires-architecture-review","source":"packages/python/src/sarj_python_lint/rules/complex_postgres_query_requires_architecture_review.py","test":"packages/python/tests/rules/test_complex_postgres_query_requires_architecture_review.py"},{"code":"SARJ046","family":"python","id":"defect-xfail-requires-explicit-strict","source":"packages/python/src/sarj_python_lint/rules/defect_xfail_requires_explicit_strict.py","test":"packages/python/tests/rules/test_defect_xfail_requires_explicit_strict.py"},{"code":"SARJ506","family":"python","id":"delete-route-returns-no-content","source":"packages/python/src/sarj_python_lint/rules/delete_route_returns_no_content.py","test":"packages/python/tests/rules/test_delete_route_returns_no_content.py"},{"code":"SARJ086","family":"python","id":"docstring-args-restate-signature","source":"packages/python/src/sarj_python_lint/rules/docstring_args_restate_signature.py","test":"packages/python/tests/rules/test_docstring_args_restate_signature.py"},{"code":"SARJ087","family":"python","id":"docstring-returns-restate-signature","source":"packages/python/src/sarj_python_lint/rules/docstring_returns_restate_signature.py","test":"packages/python/tests/rules/test_docstring_returns_restate_signature.py"},{"code":"SARJ488","family":"python","id":"duplicate-adjacent-exception-handler","source":"packages/python/src/sarj_python_lint/rules/duplicate_adjacent_exception_handler.py","test":"packages/python/tests/rules/test_duplicate_adjacent_exception_handler.py"},{"code":"SARJ489","family":"python","id":"duplicate-closed-pure-helper","source":"packages/python/src/sarj_python_lint/rules/duplicate_closed_pure_helper.py","test":"packages/python/tests/rules/test_duplicate_closed_pure_helper.py"},{"code":"SARJ524","family":"python","id":"duplicate-pytest-fixture-params","source":"packages/python/src/sarj_python_lint/rules/duplicate_pytest_fixture_params.py","test":"packages/python/tests/rules/test_duplicate_pytest_fixture_params.py"},{"code":"SARJ434","family":"python","id":"excessive-commentary","source":"packages/python/src/sarj_python_lint/rules/excessive_commentary.py","test":"packages/python/tests/rules/test_excessive_commentary.py"},{"code":"SARJ428","family":"python","id":"fakes-in-shared-location","source":"packages/python/src/sarj_python_lint/rules/fakes_in_shared_location.py","test":"packages/python/tests/rules/test_fakes_in_shared_location.py"},{"code":"SARJ451","family":"python","id":"fastapi-class-router-contract","source":"packages/python/src/sarj_python_lint/rules/fastapi_class_router_contract.py","test":"packages/python/tests/rules/test_fastapi_class_router_contract.py"},{"code":"SARJ094","family":"python","id":"fastapi-explicit-openapi-contract","source":"packages/python/src/sarj_python_lint/rules/fastapi_explicit_openapi_contract.py","test":"packages/python/tests/rules/test_fastapi_explicit_openapi_contract.py"},{"code":"SARJ412","family":"python","id":"iac-source-coupled-test","source":"packages/python/src/sarj_python_lint/rules/iac_source_coupled_test.py","test":"packages/python/tests/rules/test_iac_source_coupled_test.py"},{"code":"SARJ400","family":"python","id":"invalid-pydantic-field-default","source":"packages/python/src/sarj_python_lint/rules/invalid_pydantic_field_default.py","test":"packages/python/tests/rules/test_invalid_pydantic_field_default.py"},{"code":"SARJ040","family":"python","id":"mock-without-spec","source":"packages/python/src/sarj_python_lint/rules/mock_without_spec.py","test":"packages/python/tests/rules/test_mock_without_spec.py"},{"code":"SARJ008","family":"python","id":"named-record-at-boundaries","source":"packages/python/src/sarj_python_lint/rules/named_record_at_boundaries.py","test":"packages/python/tests/rules/test_named_record_at_boundaries.py"},{"code":"SARJ408","family":"python","id":"negative-only-http-status-assertion","source":"packages/python/src/sarj_python_lint/rules/negative_only_http_status_assertion.py","test":"packages/python/tests/rules/test_negative_only_http_status_assertion.py"},{"code":"SARJ020","family":"python","id":"no-analytical-aggregation-in-postgres-store","source":"packages/python/src/sarj_python_lint/rules/no_analytical_aggregation_in_postgres_store.py","test":"packages/python/tests/rules/test_no_analytical_aggregation_in_postgres_store.py"},{"code":"SARJ447","family":"python","id":"no-any-mapping-types","source":"packages/python/src/sarj_python_lint/rules/no_any_mapping_types.py","test":"packages/python/tests/rules/test_no_any_mapping_types.py"},{"code":"SARJ507","family":"python","id":"no-async-function-cache","source":"packages/python/src/sarj_python_lint/rules/no_async_function_cache.py","test":"packages/python/tests/rules/test_no_async_function_cache.py"},{"code":"SARJ089","family":"python","id":"no-bare-test-phase-comments","source":"packages/python/src/sarj_python_lint/rules/phase_label_comment.py","test":"packages/python/tests/rules/test_phase_label_comment.py"},{"code":"SARJ482","family":"python","id":"no-before-validator-input-mutation","source":"packages/python/src/sarj_python_lint/rules/no_before_validator_input_mutation.py","test":"packages/python/tests/rules/test_no_before_validator_input_mutation.py"},{"code":"SARJ523","family":"python","id":"no-blanket-suppression","source":"packages/python/src/sarj_python_lint/rules/no_blanket_suppression.py","test":"packages/python/tests/rules/test_no_blanket_suppression.py"},{"code":"SARJ477","family":"python","id":"no-broad-keyword-capture","source":"packages/python/src/sarj_python_lint/rules/no_broad_keyword_capture.py","test":"packages/python/tests/rules/test_no_broad_keyword_capture.py"},{"code":"SARJ016","family":"python","id":"no-comment-cruft","source":"packages/python/src/sarj_python_lint/rules/no_comment_cruft.py","test":"packages/python/tests/rules/test_no_comment_cruft.py"},{"code":"SARJ493","family":"python","id":"no-conflicting-pydantic-alias-validation","source":"packages/python/src/sarj_python_lint/rules/no_conflicting_pydantic_alias_validation.py","test":"packages/python/tests/rules/test_no_conflicting_pydantic_alias_validation.py"},{"code":"SARJ426","family":"python","id":"no-conftest-test-module-import","source":"packages/python/src/sarj_python_lint/rules/no_conftest_test_module_import.py","test":"packages/python/tests/rules/test_no_conftest_test_module_import.py"},{"code":"SARJ513","family":"python","id":"no-contradictory-type-guard","source":"packages/python/src/sarj_python_lint/rules/no_contradictory_type_guard.py","test":"packages/python/tests/rules/test_no_contradictory_type_guard.py"},{"code":"SARJ084","family":"python","id":"no-copied-inherited-docstring","source":"packages/python/src/sarj_python_lint/rules/no_copied_inherited_docstring.py","test":"packages/python/tests/rules/test_no_copied_inherited_docstring.py"},{"code":"SARJ028","family":"python","id":"no-cors-wildcard-with-credentials","source":"packages/python/src/sarj_python_lint/rules/no_cors_wildcard_with_credentials.py","test":"packages/python/tests/rules/test_no_cors_wildcard_with_credentials.py"},{"code":"SARJ500","family":"python","id":"no-create-verb-in-post-path","source":"packages/python/src/sarj_python_lint/rules/no_create_verb_in_post_path.py","test":"packages/python/tests/rules/test_no_create_verb_in_post_path.py"},{"code":"SARJ470","family":"python","id":"no-database-programmability","source":"packages/python/src/sarj_python_lint/rules/no_database_programmability.py","test":"packages/python/tests/rules/test_no_database_programmability.py"},{"code":"SARJ497","family":"python","id":"no-defaulted-environment-setting","source":"packages/python/src/sarj_python_lint/rules/no_defaulted_environment_setting.py","test":"packages/python/tests/rules/test_no_defaulted_environment_setting.py"},{"code":"SARJ442","family":"python","id":"no-delete-statement","source":"packages/python/src/sarj_python_lint/rules/no_delete_statement.py","test":"packages/python/tests/rules/test_no_delete_statement.py"},{"code":"SARJ519","family":"python","id":"no-discarded-validation-result","source":"packages/python/src/sarj_python_lint/rules/no_discarded_validation_result.py","test":"packages/python/tests/rules/test_no_discarded_validation_result.py"},{"code":"SARJ092","family":"python","id":"no-docstring-type-restatement","source":"packages/python/src/sarj_python_lint/rules/no_typed_doc_sections.py","test":"packages/python/tests/rules/test_no_typed_doc_sections.py"},{"code":"SARJ522","family":"python","id":"no-dual-shape-model-field-reader","source":"packages/python/src/sarj_python_lint/rules/no_dual_shape_model_field_reader.py","test":"packages/python/tests/rules/test_no_dual_shape_model_field_reader.py"},{"code":"SARJ438","family":"python","id":"no-dunder-all","source":"packages/python/src/sarj_python_lint/rules/no_dunder_all.py","test":"packages/python/tests/rules/test_no_dunder_all.py"},{"code":"SARJ098","family":"python","id":"no-duplicate-dunder-all-entry","source":"packages/python/src/sarj_python_lint/rules/no_duplicate_dunder_all_entry.py","test":"packages/python/tests/rules/test_no_duplicate_dunder_all_entry.py"},{"code":"SARJ496","family":"python","id":"no-duplicate-field-validator-body","source":"packages/python/src/sarj_python_lint/rules/no_duplicate_field_validator_body.py","test":"packages/python/tests/rules/test_no_duplicate_field_validator_body.py"},{"code":"SARJ505","family":"python","id":"no-exception-text-in-500-detail","source":"packages/python/src/sarj_python_lint/rules/no_exception_text_in_500_detail.py","test":"packages/python/tests/rules/test_no_exception_text_in_500_detail.py"},{"code":"SARJ444","family":"python","id":"no-excessive-cognitive-complexity","source":"packages/python/src/sarj_python_lint/rules/no_excessive_cognitive_complexity.py","test":"packages/python/tests/rules/test_no_excessive_cognitive_complexity.py"},{"code":"SARJ427","family":"python","id":"no-fastapi-on-event","source":"packages/python/src/sarj_python_lint/rules/no_fastapi_on_event.py","test":"packages/python/tests/rules/test_no_fastapi_on_event.py"},{"code":"SARJ054","family":"python","id":"no-file-level-escape-hatch-suppression","source":"packages/python/src/sarj_python_lint/rules/no_file_level_escape_hatch_suppression.py","test":"packages/python/tests/rules/test_no_file_level_escape_hatch_suppression.py"},{"code":"SARJ048","family":"python","id":"no-first-party-private-import","source":"packages/python/src/sarj_python_lint/rules/no_first_party_private_import.py","test":"packages/python/tests/rules/test_no_first_party_private_import.py"},{"code":"SARJ455","family":"python","id":"no-fixed-sleep-before-assert","source":"packages/python/src/sarj_python_lint/rules/no_fixed_sleep_before_assert.py","test":"packages/python/tests/rules/test_no_fixed_sleep_before_assert.py"},{"code":"SARJ485","family":"python","id":"no-fixed-sleep-in-loop","source":"packages/python/src/sarj_python_lint/rules/no_fixed_sleep_in_loop.py","test":"packages/python/tests/rules/test_no_fixed_sleep_in_loop.py"},{"code":"SARJ498","family":"python","id":"no-folded-bad-request-not-found","source":"packages/python/src/sarj_python_lint/rules/no_folded_bad_request_not_found.py","test":"packages/python/tests/rules/test_no_folded_bad_request_not_found.py"},{"code":"SARJ401","family":"python","id":"no-frozen-after-validator-field-write","source":"packages/python/src/sarj_python_lint/rules/no_frozen_after_validator_field_write.py","test":"packages/python/tests/rules/test_no_frozen_after_validator_field_write.py"},{"code":"SARJ022","family":"python","id":"no-generic-single-export-module","source":"packages/python/src/sarj_python_lint/rules/no_generic_single_export_module.py","test":"packages/python/tests/rules/test_no_generic_single_export_module.py"},{"code":"SARJ499","family":"python","id":"no-hasattr","source":"packages/python/src/sarj_python_lint/rules/no_hasattr.py","test":"packages/python/tests/rules/test_no_hasattr.py"},{"code":"SARJ095","family":"python","id":"no-hidden-constructor-fallback","source":"packages/python/src/sarj_python_lint/rules/no_hidden_constructor_fallback.py","test":"packages/python/tests/rules/test_no_hidden_constructor_fallback.py"},{"code":"SARJ491","family":"python","id":"no-impossible-pydantic-field-bounds","source":"packages/python/src/sarj_python_lint/rules/no_impossible_pydantic_field_bounds.py","test":"packages/python/tests/rules/test_no_impossible_pydantic_field_bounds.py"},{"code":"SARJ471","family":"python","id":"no-injected-module-loader","source":"packages/python/src/sarj_python_lint/rules/no_injected_module_loader.py","test":"packages/python/tests/rules/test_no_injected_module_loader.py"},{"code":"SARJ481","family":"python","id":"no-input-model-mutation","source":"packages/python/src/sarj_python_lint/rules/no_input_model_mutation.py","test":"packages/python/tests/rules/test_no_input_model_mutation.py"},{"code":"SARJ484","family":"python","id":"no-interpreter-source-arguments","source":"packages/python/src/sarj_python_lint/rules/no_interpreter_source_arguments.py","test":"packages/python/tests/rules/test_no_interpreter_source_arguments.py"},{"code":"SARJ448","family":"python","id":"no-invalid-argument-name-suppression","source":"packages/python/src/sarj_python_lint/rules/no_invalid_argument_name_suppression.py","test":"packages/python/tests/rules/test_no_invalid_argument_name_suppression.py"},{"code":"SARJ511","family":"python","id":"no-invalid-pydantic-bypass","source":"packages/python/src/sarj_python_lint/rules/no_invalid_pydantic_bypass.py","test":"packages/python/tests/rules/test_no_invalid_pydantic_bypass.py"},{"code":"SARJ515","family":"python","id":"no-invalid-pydantic-validator-return","source":"packages/python/src/sarj_python_lint/rules/no_invalid_pydantic_validator_return.py","test":"packages/python/tests/rules/test_no_invalid_pydantic_validator_return.py"},{"code":"SARJ508","family":"python","id":"no-loguru-exc-info","source":"packages/python/src/sarj_python_lint/rules/no_loguru_exc_info.py","test":"packages/python/tests/rules/test_no_loguru_exc_info.py"},{"code":"SARJ509","family":"python","id":"no-loguru-printf-format","source":"packages/python/src/sarj_python_lint/rules/no_loguru_printf_format.py","test":"packages/python/tests/rules/test_no_loguru_printf_format.py"},{"code":"SARJ479","family":"python","id":"no-mocked-pydantic-value-object","source":"packages/python/src/sarj_python_lint/rules/no_mocked_pydantic_value_object.py","test":"packages/python/tests/rules/test_no_mocked_pydantic_value_object.py"},{"code":"SARJ520","family":"python","id":"no-mutating-container-transform","source":"packages/python/src/sarj_python_lint/rules/no_mutating_container_transform.py","test":"packages/python/tests/rules/test_no_mutating_container_transform.py"},{"code":"SARJ425","family":"python","id":"no-nested-pydantic-field-validator","source":"packages/python/src/sarj_python_lint/rules/no_nested_pydantic_field_validator.py","test":"packages/python/tests/rules/test_no_nested_pydantic_field_validator.py"},{"code":"SARJ469","family":"python","id":"no-nullable-dependency-fallback","source":"packages/python/src/sarj_python_lint/rules/no_nullable_dependency_fallback.py","test":"packages/python/tests/rules/test_no_nullable_dependency_fallback.py"},{"code":"SARJ025","family":"python","id":"no-offset-pagination","source":"packages/python/src/sarj_python_lint/rules/no_offset_pagination.py","test":"packages/python/tests/rules/test_no_offset_pagination.py"},{"code":"SARJ512","family":"python","id":"no-partial-type-is","source":"packages/python/src/sarj_python_lint/rules/no_partial_type_is.py","test":"packages/python/tests/rules/test_no_partial_type_is.py"},{"code":"SARJ414","family":"python","id":"no-positional-psycopg-row-escape","source":"packages/python/src/sarj_python_lint/rules/no_positional_psycopg_row_escape.py","test":"packages/python/tests/rules/test_no_positional_psycopg_row_escape.py"},{"code":"SARJ026","family":"python","id":"no-positional-tuple-record","source":"packages/python/src/sarj_python_lint/rules/prefer_namedtuple_over_tuple_return.py","test":"packages/python/tests/rules/test_prefer_namedtuple_over_tuple_return.py"},{"code":"SARJ067","family":"python","id":"no-provably-dead-mock-configuration","source":"packages/python/src/sarj_python_lint/rules/unused_mock_setup.py","test":"packages/python/tests/rules/test_unused_mock_setup.py"},{"code":"SARJ415","family":"python","id":"no-psycopg-execution-outside-injected-owner","source":"packages/python/src/sarj_python_lint/rules/no_psycopg_execution_outside_injected_owner.py","test":"packages/python/tests/rules/test_no_psycopg_execution_outside_injected_owner.py"},{"code":"SARJ053","family":"python","id":"no-random-uuid-in-sql","source":"packages/python/src/sarj_python_lint/rules/no_random_uuid_in_sql.py","test":"packages/python/tests/rules/test_no_random_uuid_in_sql.py"},{"code":"SARJ429","family":"python","id":"no-raw-connection-in-tests","source":"packages/python/src/sarj_python_lint/rules/no_raw_connection_in_tests.py","test":"packages/python/tests/rules/test_no_raw_connection_in_tests.py"},{"code":"SARJ402","family":"python","id":"no-raw-source-text-test-oracle","source":"packages/python/src/sarj_python_lint/rules/no_raw_source_text_test_oracle.py","test":"packages/python/tests/rules/test_no_raw_source_text_test_oracle.py"},{"code":"SARJ531","family":"python","id":"no-redundant-local-alias","source":"packages/python/src/sarj_python_lint/rules/no_redundant_local_alias.py","test":"packages/python/tests/rules/test_no_redundant_local_alias.py"},{"code":"SARJ440","family":"python","id":"no-redundant-module-alias-exports","source":"packages/python/src/sarj_python_lint/rules/no_redundant_module_alias_exports.py","test":"packages/python/tests/rules/test_no_redundant_module_alias_exports.py"},{"code":"SARJ024","family":"python","id":"no-repeated-structured-string-literal","source":"packages/python/src/sarj_python_lint/rules/no_repeated_string_literal.py","test":"packages/python/tests/rules/test_no_repeated_string_literal.py"},{"code":"SARJ066","family":"python","id":"no-repeated-test-body","source":"packages/python/src/sarj_python_lint/rules/no_repeated_test_body.py","test":"packages/python/tests/rules/test_no_repeated_test_body.py"},{"code":"SARJ410","family":"python","id":"no-repeated-unseeded-stdlib-random-in-test","source":"packages/python/src/sarj_python_lint/rules/uncontrolled_randomness_in_test.py","test":"packages/python/tests/rules/test_uncontrolled_randomness_in_test.py"},{"code":"SARJ423","family":"python","id":"no-restated-closed-domain-description","source":"packages/python/src/sarj_python_lint/rules/no_redundant_literal_description.py","test":"packages/python/tests/rules/test_no_redundant_literal_description.py"},{"code":"SARJ049","family":"python","id":"no-restated-comment","source":"packages/python/src/sarj_python_lint/rules/no_restated_comment.py","test":"packages/python/tests/rules/test_no_restated_comment.py"},{"code":"SARJ012","family":"python","id":"no-secret-in-log","source":"packages/python/src/sarj_python_lint/rules/no_secret_in_log.py","test":"packages/python/tests/rules/test_no_secret_in_log.py"},{"code":"SARJ021","family":"python","id":"no-select-star","source":"packages/python/src/sarj_python_lint/rules/no_select_star.py","test":"packages/python/tests/rules/test_no_select_star.py"},{"code":"SARJ441","family":"python","id":"no-service-behavior-in-settings","source":"packages/python/src/sarj_python_lint/rules/no_service_behavior_in_settings.py","test":"packages/python/tests/rules/test_no_service_behavior_in_settings.py"},{"code":"SARJ472","family":"python","id":"no-shallow-container-type-guard","source":"packages/python/src/sarj_python_lint/rules/no_shallow_container_type_guard.py","test":"packages/python/tests/rules/test_no_shallow_container_type_guard.py"},{"code":"SARJ514","family":"python","id":"no-shallow-record-type-guard","source":"packages/python/src/sarj_python_lint/rules/no_shallow_record_type_guard.py","test":"packages/python/tests/rules/test_no_shallow_record_type_guard.py"},{"code":"SARJ503","family":"python","id":"no-slash-collection-root-under-prefix","source":"packages/python/src/sarj_python_lint/rules/no_slash_collection_root_under_prefix.py","test":"packages/python/tests/rules/test_no_slash_collection_root_under_prefix.py"},{"code":"SARJ057","family":"python","id":"no-statically-truthy-assertion","source":"packages/python/src/sarj_python_lint/rules/no_tautological_expect.py","test":"packages/python/tests/rules/test_no_tautological_expect.py"},{"code":"SARJ002","family":"python","id":"no-string-concat-in-loop","source":"packages/python/src/sarj_python_lint/rules/no_string_concat_in_loop.py","test":"packages/python/tests/rules/test_no_string_concat_in_loop.py"},{"code":"SARJ458","family":"python","id":"no-swallowed-asyncio-cancellation","source":"packages/python/src/sarj_python_lint/rules/no_swallowed_asyncio_cancellation.py","test":"packages/python/tests/rules/test_no_swallowed_asyncio_cancellation.py"},{"code":"SARJ478","family":"python","id":"no-test-method-grafting","source":"packages/python/src/sarj_python_lint/rules/no_test_method_grafting.py","test":"packages/python/tests/rules/test_no_test_method_grafting.py"},{"code":"SARJ051","family":"python","id":"no-trailing-numeric-unit-assignment-comment","source":"packages/python/src/sarj_python_lint/rules/trailing_value_narration.py","test":"packages/python/tests/rules/test_trailing_value_narration.py"},{"code":"SARJ404","family":"python","id":"no-unique-violation-message-match","source":"packages/python/src/sarj_python_lint/rules/no_unique_violation_message_match.py","test":"packages/python/tests/rules/test_no_unique_violation_message_match.py"},{"code":"SARJ492","family":"python","id":"no-unknown-pydantic-validator-field","source":"packages/python/src/sarj_python_lint/rules/no_unknown_pydantic_validator_field.py","test":"packages/python/tests/rules/test_no_unknown_pydantic_validator_field.py"},{"code":"SARJ420","family":"python","id":"no-unnecessary-docstring","source":"packages/python/src/sarj_python_lint/rules/no_unnecessary_docstring.py","test":"packages/python/tests/rules/test_no_unnecessary_docstring.py"},{"code":"SARJ483","family":"python","id":"no-unused-copy-result","source":"packages/python/src/sarj_python_lint/rules/no_unused_copy_result.py","test":"packages/python/tests/rules/test_no_unused_copy_result.py"},{"code":"SARJ475","family":"python","id":"no-unused-underscored-keyword-parameter","source":"packages/python/src/sarj_python_lint/rules/no_unused_underscored_keyword_parameter.py","test":"packages/python/tests/rules/test_no_unused_underscored_keyword_parameter.py"},{"code":"SARJ452","family":"python","id":"no-unused-value-marker","source":"packages/python/src/sarj_python_lint/rules/no_unused_value_marker.py","test":"packages/python/tests/rules/test_no_unused_value_marker.py"},{"code":"SARJ419","family":"python","id":"no-vague-suppression-description","source":"packages/python/src/sarj_python_lint/rules/no_vague_suppression_description.py","test":"packages/python/tests/rules/test_no_vague_suppression_description.py"},{"code":"SARJ436","family":"python","id":"no-whole-request-response-payload-in-log","source":"packages/python/src/sarj_python_lint/rules/no_whole_request_response_payload_in_log.py","test":"packages/python/tests/rules/test_no_whole_request_response_payload_in_log.py"},{"code":"SARJ502","family":"python","id":"no-work-verb-get-route","source":"packages/python/src/sarj_python_lint/rules/no_work_verb_get_route.py","test":"packages/python/tests/rules/test_no_work_verb_get_route.py"},{"code":"SARJ042","family":"python","id":"opaque-parametrize-case-needs-id","source":"packages/python/src/sarj_python_lint/rules/opaque_parametrize_case_needs_id.py","test":"packages/python/tests/rules/test_opaque_parametrize_case_needs_id.py"},{"code":"SARJ062","family":"python","id":"over-mocked-test","source":"packages/python/src/sarj_python_lint/rules/over_mocked_test.py","test":"packages/python/tests/rules/test_over_mocked_test.py"},{"code":"SARJ474","family":"python","id":"prefer-autospec-for-callable-mock","source":"packages/python/src/sarj_python_lint/rules/prefer_autospec_for_callable_mock.py","test":"packages/python/tests/rules/test_prefer_autospec_for_callable_mock.py"},{"code":"SARJ516","family":"python","id":"prefer-bulk-upsert","source":"packages/python/src/sarj_python_lint/rules/prefer_bulk_upsert.py","test":"packages/python/tests/rules/test_prefer_bulk_upsert.py"},{"code":"SARJ013","family":"python","id":"prefer-class-row","source":"packages/python/src/sarj_python_lint/rules/prefer_class_row.py","test":"packages/python/tests/rules/test_prefer_class_row.py"},{"code":"SARJ430","family":"python","id":"prefer-collection-comprehension","source":"packages/python/src/sarj_python_lint/rules/prefer_collection_comprehension.py","test":"packages/python/tests/rules/test_prefer_collection_comprehension.py"},{"code":"SARJ011","family":"python","id":"prefer-constant-time-secret-compare","source":"packages/python/src/sarj_python_lint/rules/prefer_constant_time_secret_compare.py","test":"packages/python/tests/rules/test_prefer_constant_time_secret_compare.py"},{"code":"SARJ494","family":"python","id":"prefer-declarative-batch-validation","source":"packages/python/src/sarj_python_lint/rules/prefer_declarative_batch_validation.py","test":"packages/python/tests/rules/test_prefer_declarative_batch_validation.py"},{"code":"SARJ529","family":"python","id":"prefer-direct-import-module","source":"packages/python/src/sarj_python_lint/rules/prefer_direct_import_module.py","test":"packages/python/tests/rules/test_prefer_direct_import_module.py"},{"code":"SARJ510","family":"python","id":"prefer-discriminated-model-union","source":"packages/python/src/sarj_python_lint/rules/prefer_discriminated_model_union.py","test":"packages/python/tests/rules/test_prefer_discriminated_model_union.py"},{"code":"SARJ068","family":"python","id":"prefer-fstring-over-concat","source":"packages/python/src/sarj_python_lint/rules/prefer_fstring_over_concat.py","test":"packages/python/tests/rules/test_prefer_fstring_over_concat.py"},{"code":"SARJ532","family":"python","id":"prefer-grouped-settings","source":"packages/python/src/sarj_python_lint/rules/prefer_grouped_settings.py","test":"packages/python/tests/rules/test_prefer_grouped_settings.py"},{"code":"SARJ096","family":"python","id":"prefer-immutable-module-constant","source":"packages/python/src/sarj_python_lint/rules/prefer_immutable_module_constant.py","test":"packages/python/tests/rules/test_prefer_immutable_module_constant.py"},{"code":"SARJ445","family":"python","id":"prefer-injected-dependency-over-monkeypatch","source":"packages/python/src/sarj_python_lint/rules/prefer_injected_dependency_over_monkeypatch.py","test":"packages/python/tests/rules/test_prefer_injected_dependency_over_monkeypatch.py"},{"code":"SARJ059","family":"python","id":"prefer-library-fake","source":"packages/python/src/sarj_python_lint/rules/prefer_library_fake.py","test":"packages/python/tests/rules/test_prefer_library_fake.py"},{"code":"SARJ032","family":"python","id":"prefer-match-assert-never","source":"packages/python/src/sarj_python_lint/rules/prefer_match_assert_never.py","test":"packages/python/tests/rules/test_prefer_match_assert_never.py"},{"code":"SARJ453","family":"python","id":"prefer-match-exception-dispatch","source":"packages/python/src/sarj_python_lint/rules/prefer_match_exception_dispatch.py","test":"packages/python/tests/rules/test_prefer_match_exception_dispatch.py"},{"code":"SARJ080","family":"python","id":"prefer-match-type-dispatch","source":"packages/python/src/sarj_python_lint/rules/prefer_match_type_dispatch.py","test":"packages/python/tests/rules/test_prefer_match_type_dispatch.py"},{"code":"SARJ439","family":"python","id":"prefer-match-value-dispatch","source":"packages/python/src/sarj_python_lint/rules/prefer_match_value_dispatch.py","test":"packages/python/tests/rules/test_prefer_match_value_dispatch.py"},{"code":"SARJ039","family":"python","id":"prefer-module-level-constant","source":"packages/python/src/sarj_python_lint/rules/prefer_module_level_constant.py","test":"packages/python/tests/rules/test_prefer_module_level_constant.py"},{"code":"SARJ446","family":"python","id":"prefer-monkeypatch-for-process-state-in-test","source":"packages/python/src/sarj_python_lint/rules/prefer_monkeypatch_for_process_state_in_test.py","test":"packages/python/tests/rules/test_prefer_monkeypatch_for_process_state_in_test.py"},{"code":"SARJ461","family":"python","id":"prefer-monotonic-for-elapsed-time","source":"packages/python/src/sarj_python_lint/rules/prefer_monotonic_for_elapsed_time.py","test":"packages/python/tests/rules/test_prefer_monotonic_for_elapsed_time.py"},{"code":"SARJ480","family":"python","id":"prefer-native-string-check","source":"packages/python/src/sarj_python_lint/rules/prefer_native_string_check.py","test":"packages/python/tests/rules/test_prefer_native_string_check.py"},{"code":"SARJ093","family":"python","id":"prefer-nominal-id-types","source":"packages/python/src/sarj_python_lint/rules/prefer_nominal_id_types.py","test":"packages/python/tests/rules/test_prefer_nominal_id_types.py"},{"code":"SARJ082","family":"python","id":"prefer-non-nullable-collection","source":"packages/python/src/sarj_python_lint/rules/prefer_non_nullable_collection.py","test":"packages/python/tests/rules/test_prefer_non_nullable_collection.py"},{"code":"SARJ070","family":"python","id":"prefer-or-pattern","source":"packages/python/src/sarj_python_lint/rules/prefer_or_pattern.py","test":"packages/python/tests/rules/test_prefer_or_pattern.py"},{"code":"SARJ528","family":"python","id":"prefer-precise-object-contract","source":"packages/python/src/sarj_python_lint/rules/prefer_precise_object_contract.py","test":"packages/python/tests/rules/test_prefer_precise_object_contract.py"},{"code":"SARJ518","family":"python","id":"prefer-psycopg-executemany","source":"packages/python/src/sarj_python_lint/rules/prefer_psycopg_executemany.py","test":"packages/python/tests/rules/test_prefer_psycopg_executemany.py"},{"code":"SARJ454","family":"python","id":"prefer-pydantic-json-value","source":"packages/python/src/sarj_python_lint/rules/prefer_pydantic_json_value.py","test":"packages/python/tests/rules/test_prefer_pydantic_json_value.py"},{"code":"SARJ527","family":"python","id":"prefer-pydantic-model-assertion","source":"packages/python/src/sarj_python_lint/rules/prefer_pydantic_model_assertion.py","test":"packages/python/tests/rules/test_prefer_pydantic_model_assertion.py"},{"code":"SARJ526","family":"python","id":"prefer-pytest-dependency-fixtures","source":"packages/python/src/sarj_python_lint/rules/prefer_pytest_dependency_fixtures.py","test":"packages/python/tests/rules/test_prefer_pytest_dependency_fixtures.py"},{"code":"SARJ476","family":"python","id":"prefer-pytest-fixture-injection","source":"packages/python/src/sarj_python_lint/rules/prefer_pytest_fixture_injection.py","test":"packages/python/tests/rules/test_prefer_pytest_fixture_injection.py"},{"code":"SARJ460","family":"python","id":"prefer-regex-fullmatch","source":"packages/python/src/sarj_python_lint/rules/prefer_regex_fullmatch.py","test":"packages/python/tests/rules/test_prefer_regex_fullmatch.py"},{"code":"SARJ468","family":"python","id":"prefer-required-constructor-parameters","source":"packages/python/src/sarj_python_lint/rules/prefer_required_constructor_parameters.py","test":"packages/python/tests/rules/test_prefer_required_constructor_parameters.py"},{"code":"SARJ097","family":"python","id":"prefer-self-documenting-constant","source":"packages/python/src/sarj_python_lint/rules/prefer_self_documenting_constant.py","test":"packages/python/tests/rules/test_prefer_self_documenting_constant.py"},{"code":"SARJ078","family":"python","id":"prefer-self-type-annotation","source":"packages/python/src/sarj_python_lint/rules/prefer_self_type_annotation.py","test":"packages/python/tests/rules/test_prefer_self_type_annotation.py"},{"code":"SARJ431","family":"python","id":"prefer-set-isdisjoint","source":"packages/python/src/sarj_python_lint/rules/prefer_set_isdisjoint.py","test":"packages/python/tests/rules/test_prefer_set_isdisjoint.py"},{"code":"SARJ006","family":"python","id":"prefer-str-enum","source":"packages/python/src/sarj_python_lint/rules/prefer_str_enum.py","test":"packages/python/tests/rules/test_prefer_str_enum.py"},{"code":"SARJ015","family":"python","id":"prefer-struct-over-namedtuple","source":"packages/python/src/sarj_python_lint/rules/prefer_struct_over_namedtuple.py","test":"packages/python/tests/rules/test_prefer_struct_over_namedtuple.py"},{"code":"SARJ530","family":"python","id":"prefer-typed-settings-field","source":"packages/python/src/sarj_python_lint/rules/prefer_typed_settings_field.py","test":"packages/python/tests/rules/test_prefer_typed_settings_field.py"},{"code":"SARJ432","family":"python","id":"prefer-walrus-awaited-none-guard","source":"packages/python/src/sarj_python_lint/rules/prefer_walrus_awaited_none_guard.py","test":"packages/python/tests/rules/test_prefer_walrus_awaited_none_guard.py"},{"code":"SARJ076","family":"python","id":"prefer-walrus-comprehension-filter","source":"packages/python/src/sarj_python_lint/rules/prefer_walrus_comprehension_filter.py","test":"packages/python/tests/rules/test_prefer_walrus_comprehension_filter.py"},{"code":"SARJ081","family":"python","id":"prefer-walrus-regex-match","source":"packages/python/src/sarj_python_lint/rules/prefer_walrus_regex_match.py","test":"packages/python/tests/rules/test_prefer_walrus_regex_match.py"},{"code":"SARJ077","family":"python","id":"prefer-walrus-stream-loop","source":"packages/python/src/sarj_python_lint/rules/prefer_walrus_stream_loop.py","test":"packages/python/tests/rules/test_prefer_walrus_stream_loop.py"},{"code":"SARJ409","family":"python","id":"production-derived-test-cases","source":"packages/python/src/sarj_python_lint/rules/production_derived_test_cases.py","test":"packages/python/tests/rules/test_production_derived_test_cases.py"},{"code":"SARJ044","family":"python","id":"pytest-fixture-returns-bare-tuple","source":"packages/python/src/sarj_python_lint/rules/pytest_fixture_returns_bare_tuple.py","test":"packages/python/tests/rules/test_pytest_fixture_returns_bare_tuple.py"},{"code":"SARJ525","family":"python","id":"pytest-fixture-returns-closed-resource","source":"packages/python/src/sarj_python_lint/rules/pytest_fixture_returns_closed_resource.py","test":"packages/python/tests/rules/test_pytest_fixture_returns_closed_resource.py"},{"code":"SARJ085","family":"python","id":"redundant-class-docstring","source":"packages/python/src/sarj_python_lint/rules/redundant_class_docstring.py","test":"packages/python/tests/rules/test_redundant_class_docstring.py"},{"code":"SARJ050","family":"python","id":"redundant-docstring","source":"packages/python/src/sarj_python_lint/rules/redundant_docstring.py","test":"packages/python/tests/rules/test_redundant_docstring.py"},{"code":"SARJ099","family":"python","id":"redundant-module-docstring","source":"packages/python/src/sarj_python_lint/rules/redundant_module_docstring.py","test":"packages/python/tests/rules/test_redundant_module_docstring.py"},{"code":"SARJ487","family":"python","id":"redundant-test-constructor-forwarder","source":"packages/python/src/sarj_python_lint/rules/redundant_test_constructor_forwarder.py","test":"packages/python/tests/rules/test_redundant_test_constructor_forwarder.py"},{"code":"SARJ045","family":"python","id":"repeated-kwarg-heavy-call-in-test","source":"packages/python/src/sarj_python_lint/rules/repeated_kwarg_heavy_call_in_test.py","test":"packages/python/tests/rules/test_repeated_kwarg_heavy_call_in_test.py"},{"code":"SARJ413","family":"python","id":"repeated-static-call-cases","source":"packages/python/src/sarj_python_lint/rules/repeated_static_call_cases.py","test":"packages/python/tests/rules/test_repeated_static_call_cases.py"},{"code":"SARJ457","family":"python","id":"repeated-test-composition","source":"packages/python/src/sarj_python_lint/rules/repeated_test_composition.py","test":"packages/python/tests/rules/test_repeated_test_composition.py"},{"code":"SARJ490","family":"python","id":"repeated-unimplemented-test-contract","source":"packages/python/src/sarj_python_lint/rules/repeated_unimplemented_test_contract.py","test":"packages/python/tests/rules/test_repeated_unimplemented_test_contract.py"},{"code":"SARJ018","family":"python","id":"replay-contract-insert-requires-duplicate-policy","source":"packages/python/src/sarj_python_lint/rules/store_insert_requires_on_conflict.py","test":"packages/python/tests/rules/test_store_insert_requires_on_conflict.py"},{"code":"SARJ504","family":"python","id":"require-exp-on-jwt-decode","source":"packages/python/src/sarj_python_lint/rules/require_exp_on_jwt_decode.py","test":"packages/python/tests/rules/test_require_exp_on_jwt_decode.py"},{"code":"SARJ467","family":"python","id":"require-explicit-contract-implementation","source":"packages/python/src/sarj_python_lint/rules/require_explicit_contract_implementation.py","test":"packages/python/tests/rules/test_require_explicit_contract_implementation.py"},{"code":"SARJ462","family":"python","id":"require-explicit-psycopg-transaction","source":"packages/python/src/sarj_python_lint/rules/require_explicit_psycopg_transaction.py","test":"packages/python/tests/rules/test_require_explicit_psycopg_transaction.py"},{"code":"SARJ465","family":"python","id":"require-explicit-service-contract","source":"packages/python/src/sarj_python_lint/rules/require_explicit_service_contract.py","test":"packages/python/tests/rules/test_require_explicit_service_contract.py"},{"code":"SARJ486","family":"python","id":"require-injectable-retry-sleep","source":"packages/python/src/sarj_python_lint/rules/require_injectable_retry_sleep.py","test":"packages/python/tests/rules/test_require_injectable_retry_sleep.py"},{"code":"SARJ034","family":"python","id":"require-keyword-only-swap-prone-params","source":"packages/python/src/sarj_python_lint/rules/require_keyword_only_swap_prone_params.py","test":"packages/python/tests/rules/test_require_keyword_only_swap_prone_params.py"},{"code":"SARJ424","family":"python","id":"require-nodecode-for-splitting-settings-field","source":"packages/python/src/sarj_python_lint/rules/require_nodecode_for_splitting_settings_field.py","test":"packages/python/tests/rules/test_require_nodecode_for_splitting_settings_field.py"},{"code":"SARJ071","family":"python","id":"require-port-for-service","source":"packages/python/src/sarj_python_lint/rules/require_port_for_service.py","test":"packages/python/tests/rules/test_require_port_for_service.py"},{"code":"SARJ473","family":"python","id":"require-precise-factory-signature","source":"packages/python/src/sarj_python_lint/rules/require_precise_factory_signature.py","test":"packages/python/tests/rules/test_require_precise_factory_signature.py"},{"code":"SARJ466","family":"python","id":"require-public-dependency-contract","source":"packages/python/src/sarj_python_lint/rules/require_public_dependency_contract.py","test":"packages/python/tests/rules/test_require_public_dependency_contract.py"},{"code":"SARJ411","family":"python","id":"require-pydantic-for-external-json","source":"packages/python/src/sarj_python_lint/rules/require_pydantic_for_external_json.py","test":"packages/python/tests/rules/test_require_pydantic_for_external_json.py"},{"code":"SARJ521","family":"python","id":"require-pydantic-for-mapping-shape","source":"packages/python/src/sarj_python_lint/rules/require_pydantic_for_mapping_shape.py","test":"packages/python/tests/rules/test_require_pydantic_for_mapping_shape.py"},{"code":"SARJ450","family":"python","id":"require-pydantic-for-structured-payload","source":"packages/python/src/sarj_python_lint/rules/require_pydantic_for_structured_payload.py","test":"packages/python/tests/rules/test_require_pydantic_for_structured_payload.py"},{"code":"SARJ418","family":"python","id":"require-pydantic-ordinal-lower-bound","source":"packages/python/src/sarj_python_lint/rules/require_pydantic_ordinal_lower_bound.py","test":"packages/python/tests/rules/test_require_pydantic_ordinal_lower_bound.py"},{"code":"SARJ088","family":"python","id":"restated-test-docstring","source":"packages/python/src/sarj_python_lint/rules/restated_test_docstring.py","test":"packages/python/tests/rules/test_restated_test_docstring.py"},{"code":"SARJ459","family":"python","id":"shared-mutable-pydantic-factory","source":"packages/python/src/sarj_python_lint/rules/shared_mutable_pydantic_factory.py","test":"packages/python/tests/rules/test_shared_mutable_pydantic_factory.py"},{"code":"SARJ023","family":"python","id":"stepdown","source":"packages/python/src/sarj_python_lint/rules/stepdown.py","test":"packages/python/tests/rules/test_stepdown.py"},{"code":"SARJ517","family":"python","id":"store-field-update-reuses-upsert","source":"packages/python/src/sarj_python_lint/rules/store_field_update_reuses_upsert.py","test":"packages/python/tests/rules/test_store_field_update_reuses_upsert.py"},{"code":"SARJ421","family":"python","id":"store-get-delegates-to-bulk-read","source":"packages/python/src/sarj_python_lint/rules/store_get_delegates_to_bulk_read.py","test":"packages/python/tests/rules/test_store_get_delegates_to_bulk_read.py"},{"code":"SARJ464","family":"python","id":"subprocess-kill-without-reap","source":"packages/python/src/sarj_python_lint/rules/subprocess_kill_without_reap.py","test":"packages/python/tests/rules/test_subprocess_kill_without_reap.py"},{"code":"SARJ495","family":"python","id":"test-without-explicit-oracle","source":"packages/python/src/sarj_python_lint/rules/test_without_explicit_oracle.py","test":"packages/python/tests/rules/test_test_without_explicit_oracle.py"},{"code":"SARJ407","family":"python","id":"timestamp-order-requires-tiebreaker","source":"packages/python/src/sarj_python_lint/rules/timestamp_order_requires_tiebreaker.py","test":"packages/python/tests/rules/test_timestamp_order_requires_tiebreaker.py"},{"code":"SARJ435","family":"python","id":"typed-error-reasons","source":"packages/python/src/sarj_python_lint/rules/typed_error_reasons.py","test":"packages/python/tests/rules/test_typed_error_reasons.py"},{"code":"SARJ443","family":"python","id":"unused-test-factory-option","source":"packages/python/src/sarj_python_lint/rules/unused_test_factory_option.py","test":"packages/python/tests/rules/test_unused_test_factory_option.py"},{"code":"SARJ101","family":"sql","id":"enforce-timestamptz","source":"packages/sql/src/sarj_sql_lint/rules/enforce_timestamptz.py","test":"packages/sql/tests/rules/test_enforce_timestamptz.py"},{"code":"SARJ116","family":"sql","id":"excess-migration-index-requires-justification","source":"packages/sql/src/sarj_sql_lint/rules/index_budget.py","test":"packages/sql/tests/rules/test_index_budget.py"},{"code":"SARJ111","family":"sql","id":"existing-table-check-or-foreign-key-requires-not-valid","source":"packages/sql/src/sarj_sql_lint/rules/add_constraint_requires_not_valid.py","test":"packages/sql/tests/rules/test_add_constraint_requires_not_valid.py"},{"code":"SARJ102","family":"sql","id":"idempotent-ddl","source":"packages/sql/src/sarj_sql_lint/rules/idempotent_ddl.py","test":"packages/sql/tests/rules/test_idempotent_ddl.py"},{"code":"SARJ108","family":"sql","id":"index-concurrently","source":"packages/sql/src/sarj_sql_lint/rules/index_concurrently.py","test":"packages/sql/tests/rules/test_index_concurrently.py"},{"code":"SARJ105","family":"sql","id":"insert-requires-replay-policy","source":"packages/sql/src/sarj_sql_lint/rules/insert_requires_on_conflict.py","test":"packages/sql/tests/rules/test_insert_requires_on_conflict.py"},{"code":"SARJ119","family":"sql","id":"mixed-migration-phases","source":"packages/sql/src/sarj_sql_lint/rules/mixed_migration_phases.py","test":"packages/sql/tests/rules/test_mixed_migration_phases.py"},{"code":"SARJ118","family":"sql","id":"no-application-schema-check","source":"packages/sql/src/sarj_sql_lint/rules/no_application_schema_check.py","test":"packages/sql/tests/rules/test_no_application_schema_check.py"},{"code":"SARJ120","family":"sql","id":"no-database-functions","source":"packages/sql/src/sarj_sql_lint/rules/no_database_functions.py","test":"packages/sql/tests/rules/test_no_database_functions.py"},{"code":"SARJ114","family":"sql","id":"no-database-triggers","source":"packages/sql/src/sarj_sql_lint/rules/no_create_trigger.py","test":"packages/sql/tests/rules/test_no_create_trigger.py"},{"code":"SARJ117","family":"sql","id":"no-duplicate-index","source":"packages/sql/src/sarj_sql_lint/rules/no_duplicate_index.py","test":"packages/sql/tests/rules/test_no_duplicate_index.py"},{"code":"SARJ115","family":"sql","id":"no-long-migration-narration","source":"packages/sql/src/sarj_sql_lint/rules/excessive_commentary.py","test":"packages/sql/tests/rules/test_excessive_commentary.py"},{"code":"SARJ113","family":"sql","id":"no-migration-comment-cruft","source":"packages/sql/src/sarj_sql_lint/rules/no_comment_cruft.py","test":"packages/sql/tests/rules/test_no_comment_cruft.py"},{"code":"SARJ107","family":"sql","id":"no-offset-pagination","source":"packages/sql/src/sarj_sql_lint/rules/no_offset_pagination.py","test":"packages/sql/tests/rules/test_no_offset_pagination.py"},{"code":"SARJ103","family":"sql","id":"no-pg-enum","source":"packages/sql/src/sarj_sql_lint/rules/no_pg_enum.py","test":"packages/sql/tests/rules/test_no_pg_enum.py"},{"code":"SARJ106","family":"sql","id":"prefer-jsonb","source":"packages/sql/src/sarj_sql_lint/rules/prefer_jsonb.py","test":"packages/sql/tests/rules/test_prefer_jsonb.py"},{"code":"SARJ104","family":"sql","id":"prefer-text-over-varchar","source":"packages/sql/src/sarj_sql_lint/rules/prefer_text_over_varchar.py","test":"packages/sql/tests/rules/test_prefer_text_over_varchar.py"},{"code":"SARJ109","family":"sql","id":"prefer-uuidv7-default","source":"packages/sql/src/sarj_sql_lint/rules/prefer_uuidv7_default.py","test":"packages/sql/tests/rules/test_prefer_uuidv7_default.py"},{"code":"SARJ112","family":"sql","id":"require-fk-index","source":"packages/sql/src/sarj_sql_lint/rules/require_fk_index.py","test":"packages/sql/tests/rules/test_require_fk_index.py"},{"code":"SARJ110","family":"sql","id":"require-lock-timeout","source":"packages/sql/src/sarj_sql_lint/rules/require_lock_timeout.py","test":"packages/sql/tests/rules/test_require_lock_timeout.py"},{"code":"SARJ315","family":"text","id":"cloudbuild-contract","source":"packages/standards/src/sarj_standards/libs/linting/text_rules/cloudbuild_contract.py","test":"packages/standards/tests/text_rules/test_cloudbuild_contract.py"},{"code":"SARJ301","family":"text","id":"commented-out-config","source":"packages/standards/src/sarj_standards/libs/linting/textlint.py","test":"packages/standards/tests/test_textlint.py"},{"code":"SARJ300","family":"text","id":"config-comment-wall","source":"packages/standards/src/sarj_standards/libs/linting/textlint.py","test":"packages/standards/tests/test_textlint.py"},{"code":"SARJ309","family":"text","id":"declarative-deployment-boundary","source":"packages/standards/src/sarj_standards/libs/linting/textlint.py","test":"packages/standards/tests/test_textlint.py"},{"code":"SARJ302","family":"text","id":"ephemeral-execution-artifact","source":"packages/standards/src/sarj_standards/libs/linting/textlint.py","test":"packages/standards/tests/test_textlint.py"},{"code":"SARJ306","family":"text","id":"exact-config-comment-restatement","source":"packages/standards/src/sarj_standards/libs/linting/textlint.py","test":"packages/standards/tests/test_textlint.py"},{"code":"SARJ305","family":"text","id":"hidden-markdown-heading","source":"packages/standards/src/sarj_standards/libs/linting/textlint.py","test":"packages/standards/tests/test_textlint.py"},{"code":"SARJ304","family":"text","id":"iac-source-coupled-test","source":"packages/standards/src/sarj_standards/libs/linting/textlint.py","test":"packages/standards/tests/test_textlint.py"},{"code":"SARJ311","family":"text","id":"large-shell-program","source":"packages/standards/src/sarj_standards/libs/linting/textlint.py","test":"packages/standards/tests/test_textlint.py"},{"code":"SARJ307","family":"text","id":"no-unsafe-command-argument-interpolation","source":"packages/standards/src/sarj_standards/libs/linting/textlint.py","test":"packages/standards/tests/test_textlint.py"},{"code":"SARJ308","family":"text","id":"no-wildcard-secret-read-permission","source":"packages/standards/src/sarj_standards/libs/linting/textlint.py","test":"packages/standards/tests/test_textlint.py"},{"code":"SARJ310","family":"text","id":"workflow-embedded-program","source":"packages/standards/src/sarj_standards/libs/linting/textlint.py","test":"packages/standards/tests/test_textlint.py"},{"code":"@sarj/duplicate-test-body","family":"typescript","id":"duplicate-test-body","source":"packages/typescript/src/rules/duplicate-test-body.ts","test":"packages/typescript/tests/rules/duplicate-test-body.test.ts"},{"code":"@sarj/enforce-file-structure","family":"typescript","id":"enforce-file-structure","source":"packages/typescript/src/rules/enforce-file-structure.ts","test":"packages/typescript/tests/rules/enforce-file-structure.test.ts"},{"code":"@sarj/excessive-commentary","family":"typescript","id":"excessive-commentary","source":"packages/typescript/src/rules/excessive-commentary.ts","test":"packages/typescript/tests/rules/excessive-commentary.test.ts"},{"code":"@sarj/iac-source-coupled-test","family":"typescript","id":"iac-source-coupled-test","source":"packages/typescript/src/rules/iac-source-coupled-test.ts","test":"packages/typescript/tests/rules/iac-source-coupled-test.test.ts"},{"code":"@sarj/interface-contract-members-private","family":"typescript","id":"interface-contract-members-private","source":"packages/typescript/src/rules/interface-contract-members-private.ts","test":"packages/typescript/tests/rules/interface-contract-members-private.test.ts"},{"code":"@sarj/named-child-schema-type","family":"typescript","id":"named-child-schema-type","source":"packages/typescript/src/rules/named-child-schema-type.ts","test":"packages/typescript/tests/rules/named-child-schema-type.test.ts"},{"code":"@sarj/no-bare-return-from-test-catch","family":"typescript","id":"no-bare-return-from-test-catch","source":"packages/typescript/src/rules/no-bare-return-from-test-catch.ts","test":"packages/typescript/tests/rules/no-bare-return-from-test-catch.test.ts"},{"code":"@sarj/no-bespoke-api-case-conversion","family":"typescript","id":"no-bespoke-api-case-conversion","source":"packages/typescript/src/rules/no-bespoke-api-case-conversion.ts","test":"packages/typescript/tests/rules/no-bespoke-api-case-conversion.test.ts"},{"code":"@sarj/no-boolean-selector-parameter","family":"typescript","id":"no-boolean-selector-parameter","source":"packages/typescript/src/rules/no-boolean-selector-parameter.ts","test":"packages/typescript/tests/rules/no-boolean-selector-parameter.test.ts"},{"code":"@sarj/no-broad-return-type","family":"typescript","id":"no-broad-return-type","source":"packages/typescript/src/rules/no-broad-return-type.ts","test":"packages/typescript/tests/rules/no-broad-return-type.test.ts"},{"code":"@sarj/no-client-side-data-fetching","family":"typescript","id":"no-client-side-data-fetching","source":"packages/typescript/src/rules/no-client-side-data-fetching.ts","test":"packages/typescript/tests/rules/no-client-side-data-fetching.test.ts"},{"code":"@sarj/no-comment-cruft","family":"typescript","id":"no-comment-cruft","source":"packages/typescript/src/rules/no-comment-cruft.ts","test":"packages/typescript/tests/rules/no-comment-cruft.test.ts"},{"code":"@sarj/no-conditional-empty-object-spread","family":"typescript","id":"no-conditional-empty-object-spread","source":"packages/typescript/src/rules/no-conditional-empty-object-spread.ts","test":"packages/typescript/tests/rules/no-conditional-empty-object-spread.test.ts"},{"code":"@sarj/no-contradictory-overload-return","family":"typescript","id":"no-contradictory-overload-return","source":"packages/typescript/src/rules/no-contradictory-overload-return.ts","test":"packages/typescript/tests/rules/no-contradictory-overload-return.test.ts"},{"code":"@sarj/no-contradictory-type-predicate","family":"typescript","id":"no-contradictory-type-predicate","source":"packages/typescript/src/rules/no-contradictory-type-predicate.ts","test":"packages/typescript/tests/rules/no-contradictory-type-predicate.test.ts"},{"code":"@sarj/no-cors-wildcard-with-credentials","family":"typescript","id":"no-cors-wildcard-with-credentials","source":"packages/typescript/src/rules/no-cors-wildcard-with-credentials.ts","test":"packages/typescript/tests/rules/no-cors-wildcard-with-credentials.test.ts"},{"code":"@sarj/no-credential-in-browser-storage","family":"typescript","id":"no-credential-in-browser-storage","source":"packages/typescript/src/rules/no-credential-in-browser-storage.ts","test":"packages/typescript/tests/rules/no-credential-in-browser-storage.test.ts"},{"code":"@sarj/no-dangerously-allow-svg","family":"typescript","id":"no-dangerously-allow-svg","source":"packages/typescript/src/rules/no-dangerously-allow-svg.ts","test":"packages/typescript/tests/rules/no-dangerously-allow-svg.test.ts"},{"code":"@sarj/no-declaration-comment-wall","family":"typescript","id":"no-declaration-comment-wall","source":"packages/typescript/src/rules/no-declaration-comment-wall.ts","test":"packages/typescript/tests/rules/no-declaration-comment-wall.test.ts"},{"code":"@sarj/no-detached-global-fetch","family":"typescript","id":"no-detached-global-fetch","source":"packages/typescript/src/rules/no-detached-global-fetch.ts","test":"packages/typescript/tests/rules/no-detached-global-fetch.test.ts"},{"code":"@sarj/no-duplicate-lifecycle-refresh-listeners","family":"typescript","id":"no-duplicate-lifecycle-refresh-listeners","source":"packages/typescript/src/rules/no-duplicate-lifecycle-refresh-listeners.ts","test":"packages/typescript/tests/rules/no-duplicate-lifecycle-refresh-listeners.test.ts"},{"code":"@sarj/no-duplicate-test-case","family":"typescript","id":"no-duplicate-test-case","source":"packages/typescript/src/rules/no-duplicate-test-case.ts","test":"packages/typescript/tests/rules/no-duplicate-test-case.test.ts"},{"code":"@sarj/no-dynamic-sql","family":"typescript","id":"no-dynamic-sql","source":"packages/typescript/src/rules/no-dynamic-sql.ts","test":"packages/typescript/tests/rules/no-dynamic-sql.test.ts"},{"code":"@sarj/no-enum","family":"typescript","id":"no-enum","source":"packages/typescript/src/rules/no-enum.ts","test":"packages/typescript/tests/rules/no-enum.test.ts"},{"code":"@sarj/no-exception-text-in-5xx-response","family":"typescript","id":"no-exception-text-in-5xx-response","source":"packages/typescript/src/rules/no-exception-text-in-5xx-response.ts","test":"packages/typescript/tests/rules/no-exception-text-in-5xx-response.test.ts"},{"code":"@sarj/no-excess-jsx-props","family":"typescript","id":"no-excess-jsx-props","source":"packages/typescript/src/rules/no-excess-jsx-props.ts","test":"packages/typescript/tests/rules/no-excess-jsx-props.test.ts"},{"code":"@sarj/no-excessive-cognitive-complexity","family":"typescript","id":"no-excessive-cognitive-complexity","source":"packages/typescript/src/rules/no-excessive-cognitive-complexity.ts","test":"packages/typescript/tests/rules/no-excessive-cognitive-complexity.test.ts"},{"code":"@sarj/no-fat-try-blocks","family":"typescript","id":"no-fat-try-blocks","source":"packages/typescript/src/rules/no-fat-try-blocks.ts","test":"packages/typescript/tests/rules/no-fat-try-blocks.test.ts"},{"code":"@sarj/no-first-party-module-mock","family":"typescript","id":"no-first-party-module-mock","source":"packages/typescript/src/rules/no-first-party-module-mock.ts","test":"packages/typescript/tests/rules/no-first-party-module-mock.test.ts"},{"code":"@sarj/no-generic-single-export-module","family":"typescript","id":"no-generic-single-export-module","source":"packages/typescript/src/rules/no-generic-single-export-module.ts","test":"packages/typescript/tests/rules/no-generic-single-export-module.test.ts"},{"code":"@sarj/no-hand-rolled-sleep","family":"typescript","id":"no-hand-rolled-sleep","source":"packages/typescript/src/rules/no-hand-rolled-sleep.ts","test":"packages/typescript/tests/rules/no-hand-rolled-sleep.test.ts"},{"code":"@sarj/no-hand-rolled-spinner","family":"typescript","id":"no-hand-rolled-spinner","source":"packages/typescript/src/rules/no-hand-rolled-spinner.ts","test":"packages/typescript/tests/rules/no-hand-rolled-spinner.test.ts"},{"code":"@sarj/no-impossible-zod-literal-bounds","family":"typescript","id":"no-impossible-zod-literal-bounds","source":"packages/typescript/src/rules/no-impossible-zod-literal-bounds.ts","test":"packages/typescript/tests/rules/no-impossible-zod-literal-bounds.test.ts"},{"code":"@sarj/no-in-operator-on-built-in-collections","family":"typescript","id":"no-in-operator-on-built-in-collections","source":"packages/typescript/src/rules/no-in-operator-on-built-in-collections.ts","test":"packages/typescript/tests/rules/no-in-operator-on-built-in-collections.test.ts"},{"code":"@sarj/no-insecure-random-id","family":"typescript","id":"no-insecure-random-id","source":"packages/typescript/src/rules/no-insecure-random-id.ts","test":"packages/typescript/tests/rules/no-insecure-random-id.test.ts"},{"code":"@sarj/no-invalid-typed-mutation","family":"typescript","id":"no-invalid-typed-mutation","source":"packages/typescript/src/rules/no-invalid-typed-mutation.ts","test":"packages/typescript/tests/rules/no-invalid-typed-mutation.test.ts"},{"code":"@sarj/no-invalid-zod-custom-parse","family":"typescript","id":"no-invalid-zod-custom-parse","source":"packages/typescript/src/rules/no-invalid-zod-custom-parse.ts","test":"packages/typescript/tests/rules/no-invalid-zod-custom-parse.test.ts"},{"code":"@sarj/no-json-stringify-error","family":"typescript","id":"no-json-stringify-error","source":"packages/typescript/src/rules/no-json-stringify-error.ts","test":"packages/typescript/tests/rules/no-json-stringify-error.test.ts"},{"code":"@sarj/no-json-stringify-object-equality","family":"typescript","id":"no-json-stringify-object-equality","source":"packages/typescript/src/rules/no-json-stringify-object-equality.ts","test":"packages/typescript/tests/rules/no-json-stringify-object-equality.test.ts"},{"code":"@sarj/no-known-value-widening","family":"typescript","id":"no-known-value-widening","source":"packages/typescript/src/rules/no-known-value-widening.ts","test":"packages/typescript/tests/rules/no-known-value-widening.test.ts"},{"code":"@sarj/no-log-only-catch","family":"typescript","id":"no-log-only-catch","source":"packages/typescript/src/rules/no-log-only-catch.ts","test":"packages/typescript/tests/rules/no-log-only-catch.test.ts"},{"code":"@sarj/no-long-comment","family":"typescript","id":"no-long-comment","source":"packages/typescript/src/rules/no-long-comment.ts","test":"packages/typescript/tests/rules/no-long-comment.test.ts"},{"code":"@sarj/no-numeric-search-param-coercion","family":"typescript","id":"no-numeric-search-param-coercion","source":"packages/typescript/src/rules/no-numeric-search-param-coercion.ts","test":"packages/typescript/tests/rules/no-numeric-search-param-coercion.test.ts"},{"code":"@sarj/no-offset-pagination","family":"typescript","id":"no-offset-pagination","source":"packages/typescript/src/rules/no-offset-pagination.ts","test":"packages/typescript/tests/rules/no-offset-pagination.test.ts"},{"code":"@sarj/no-partial-type-predicate","family":"typescript","id":"no-partial-type-predicate","source":"packages/typescript/src/rules/no-partial-type-predicate.ts","test":"packages/typescript/tests/rules/no-partial-type-predicate.test.ts"},{"code":"@sarj/no-positional-tuple-return","family":"typescript","id":"no-positional-tuple-return","source":"packages/typescript/src/rules/no-positional-tuple-return.ts","test":"packages/typescript/tests/rules/no-positional-tuple-return.test.ts"},{"code":"@sarj/no-production-browser-source-maps","family":"typescript","id":"no-production-browser-source-maps","source":"packages/typescript/src/rules/no-production-browser-source-maps.ts","test":"packages/typescript/tests/rules/no-production-browser-source-maps.test.ts"},{"code":"@sarj/no-raw-env","family":"typescript","id":"no-raw-env","source":"packages/typescript/src/rules/no-raw-env.ts","test":"packages/typescript/tests/rules/no-raw-env.test.ts"},{"code":"@sarj/no-raw-fetch-outside-clients","family":"typescript","id":"no-raw-fetch-outside-clients","source":"packages/typescript/src/rules/no-raw-fetch-outside-clients.ts","test":"packages/typescript/tests/rules/no-raw-fetch-outside-clients.test.ts"},{"code":"@sarj/no-reduce-accumulator-copy","family":"typescript","id":"no-reduce-accumulator-copy","source":"packages/typescript/src/rules/no-reduce-accumulator-copy.ts","test":"packages/typescript/tests/rules/no-reduce-accumulator-copy.test.ts"},{"code":"@sarj/no-redundant-consumer-union","family":"typescript","id":"no-redundant-consumer-union","source":"packages/typescript/src/rules/no-redundant-consumer-union.ts","test":"packages/typescript/tests/rules/no-redundant-consumer-union.test.ts"},{"code":"@sarj/no-redundant-optional-array-default","family":"typescript","id":"no-redundant-optional-array-default","source":"packages/typescript/src/rules/no-redundant-optional-array-default.ts","test":"packages/typescript/tests/rules/no-redundant-optional-array-default.test.ts"},{"code":"@sarj/no-repeated-string-literal","family":"typescript","id":"no-repeated-string-literal","source":"packages/typescript/src/rules/no-repeated-string-literal.ts","test":"packages/typescript/tests/rules/no-repeated-string-literal.test.ts"},{"code":"@sarj/no-restated-comment","family":"typescript","id":"no-restated-comment","source":"packages/typescript/src/rules/no-restated-comment.ts","test":"packages/typescript/tests/rules/no-restated-comment.test.ts"},{"code":"@sarj/no-restated-jsdoc","family":"typescript","id":"no-restated-jsdoc","source":"packages/typescript/src/rules/no-restated-jsdoc.ts","test":"packages/typescript/tests/rules/no-restated-jsdoc.test.ts"},{"code":"@sarj/no-restricted-library-load","family":"typescript","id":"no-restricted-library-load","source":"packages/typescript/src/rules/no-restricted-library-load.ts","test":"packages/typescript/tests/rules/no-restricted-library-load.test.ts"},{"code":"@sarj/no-router-refresh-polling","family":"typescript","id":"no-router-refresh-polling","source":"packages/typescript/src/rules/no-router-refresh-polling.ts","test":"packages/typescript/tests/rules/no-router-refresh-polling.test.ts"},{"code":"@sarj/no-secret-in-log","family":"typescript","id":"no-secret-in-log","source":"packages/typescript/src/rules/no-secret-in-log.ts","test":"packages/typescript/tests/rules/no-secret-in-log.test.ts"},{"code":"@sarj/no-select-star","family":"typescript","id":"no-select-star","source":"packages/typescript/src/rules/no-select-star.ts","test":"packages/typescript/tests/rules/no-select-star.test.ts"},{"code":"@sarj/no-sentinel-return-on-catch","family":"typescript","id":"no-sentinel-return-on-catch","source":"packages/typescript/src/rules/no-sentinel-return-on-catch.ts","test":"packages/typescript/tests/rules/no-sentinel-return-on-catch.test.ts"},{"code":"@sarj/no-server-env-in-client-component","family":"typescript","id":"no-server-env-in-client-component","source":"packages/typescript/src/rules/no-server-env-in-client-component.ts","test":"packages/typescript/tests/rules/no-server-env-in-client-component.test.ts"},{"code":"@sarj/no-silent-promise-catch","family":"typescript","id":"no-silent-promise-catch","source":"packages/typescript/src/rules/no-silent-promise-catch.ts","test":"packages/typescript/tests/rules/no-silent-promise-catch.test.ts"},{"code":"@sarj/no-sleep-in-test-body","family":"typescript","id":"no-sleep-in-test-body","source":"packages/typescript/src/rules/no-sleep-in-test-body.ts","test":"packages/typescript/tests/rules/no-sleep-in-test-body.test.ts"},{"code":"@sarj/no-storage-in-stateless-modules","family":"typescript","id":"no-storage-in-stateless-modules","source":"packages/typescript/src/rules/no-storage-in-stateless-modules.ts","test":"packages/typescript/tests/rules/no-storage-in-stateless-modules.test.ts"},{"code":"@sarj/no-string-concat-in-loop","family":"typescript","id":"no-string-concat-in-loop","source":"packages/typescript/src/rules/no-string-concat-in-loop.ts","test":"packages/typescript/tests/rules/no-string-concat-in-loop.test.ts"},{"code":"@sarj/no-tautological-expect","family":"typescript","id":"no-tautological-expect","source":"packages/typescript/src/rules/no-tautological-expect.ts","test":"packages/typescript/tests/rules/no-tautological-expect.test.ts"},{"code":"@sarj/no-trailing-value-narration","family":"typescript","id":"no-trailing-value-narration","source":"packages/typescript/src/rules/no-trailing-value-narration.ts","test":"packages/typescript/tests/rules/no-trailing-value-narration.test.ts"},{"code":"@sarj/no-type-member-comment-wall","family":"typescript","id":"no-type-member-comment-wall","source":"packages/typescript/src/rules/no-type-member-comment-wall.ts","test":"packages/typescript/tests/rules/no-type-member-comment-wall.test.ts"},{"code":"@sarj/no-typed-doc-sections","family":"typescript","id":"no-typed-doc-sections","source":"packages/typescript/src/rules/no-typed-doc-sections.ts","test":"packages/typescript/tests/rules/no-typed-doc-sections.test.ts"},{"code":"@sarj/no-union-in-comment","family":"typescript","id":"no-union-in-comment","source":"packages/typescript/src/rules/no-union-in-comment.ts","test":"packages/typescript/tests/rules/no-union-in-comment.test.ts"},{"code":"@sarj/no-unlocalized-jsx-attributes","family":"typescript","id":"no-unlocalized-jsx-attributes","source":"packages/typescript/src/rules/no-unlocalized-jsx-attributes.ts","test":"packages/typescript/tests/rules/no-unlocalized-jsx-attributes.test.ts"},{"code":"@sarj/no-unlocalized-jsx-text","family":"typescript","id":"no-unlocalized-jsx-text","source":"packages/typescript/src/rules/no-unlocalized-jsx-text.ts","test":"packages/typescript/tests/rules/no-unlocalized-jsx-text.test.ts"},{"code":"@sarj/no-unlocalized-toast","family":"typescript","id":"no-unlocalized-toast","source":"packages/typescript/src/rules/no-unlocalized-toast.ts","test":"packages/typescript/tests/rules/no-unlocalized-toast.test.ts"},{"code":"@sarj/no-unnecessary-use-client","family":"typescript","id":"no-unnecessary-use-client","source":"packages/typescript/src/rules/no-unnecessary-use-client.ts","test":"packages/typescript/tests/rules/no-unnecessary-use-client.test.ts"},{"code":"@sarj/no-unsafe-mock-casting","family":"typescript","id":"no-unsafe-mock-casting","source":"packages/typescript/src/rules/no-unsafe-mock-casting.ts","test":"packages/typescript/tests/rules/no-unsafe-mock-casting.test.ts"},{"code":"@sarj/no-unsafe-test-double-cast","family":"typescript","id":"no-unsafe-test-double-cast","source":"packages/typescript/src/rules/no-unsafe-test-double-cast.ts","test":"packages/typescript/tests/rules/no-unsafe-test-double-cast.test.ts"},{"code":"@sarj/no-vague-suppression-description","family":"typescript","id":"no-vague-suppression-description","source":"packages/typescript/src/rules/no-vague-suppression-description.ts","test":"packages/typescript/tests/rules/no-vague-suppression-description.test.ts"},{"code":"@sarj/no-zod-native-enum","family":"typescript","id":"no-zod-native-enum","source":"packages/typescript/src/rules/no-zod-native-enum.ts","test":"packages/typescript/tests/rules/no-zod-native-enum.test.ts"},{"code":"@sarj/prefer-await-in-async-return","family":"typescript","id":"prefer-await-in-async-return","source":"packages/typescript/src/rules/prefer-await-in-async-return.ts","test":"packages/typescript/tests/rules/prefer-await-in-async-return.test.ts"},{"code":"@sarj/prefer-constant-time-secret-compare","family":"typescript","id":"prefer-constant-time-secret-compare","source":"packages/typescript/src/rules/prefer-constant-time-secret-compare.ts","test":"packages/typescript/tests/rules/prefer-constant-time-secret-compare.test.ts"},{"code":"@sarj/prefer-discriminated-union","family":"typescript","id":"prefer-discriminated-union","source":"packages/typescript/src/rules/prefer-discriminated-union.ts","test":"packages/typescript/tests/rules/prefer-discriminated-union.test.ts"},{"code":"@sarj/prefer-ecmascript-private-members","family":"typescript","id":"prefer-ecmascript-private-members","source":"packages/typescript/src/rules/prefer-ecmascript-private-members.ts","test":"packages/typescript/tests/rules/prefer-ecmascript-private-members.test.ts"},{"code":"@sarj/prefer-immutable-module-constant","family":"typescript","id":"prefer-immutable-module-constant","source":"packages/typescript/src/rules/prefer-immutable-module-constant.ts","test":"packages/typescript/tests/rules/prefer-immutable-module-constant.test.ts"},{"code":"@sarj/prefer-input-group-search","family":"typescript","id":"prefer-input-group-search","source":"packages/typescript/src/rules/prefer-input-group-search.ts","test":"packages/typescript/tests/rules/prefer-input-group-search.test.ts"},{"code":"@sarj/prefer-logical-tailwind-utilities","family":"typescript","id":"prefer-logical-tailwind-utilities","source":"packages/typescript/src/rules/prefer-logical-tailwind-utilities.ts","test":"packages/typescript/tests/rules/prefer-logical-tailwind-utilities.test.ts"},{"code":"@sarj/prefer-millisecond-control-duration-schema","family":"typescript","id":"prefer-millisecond-control-duration-schema","source":"packages/typescript/src/rules/prefer-millisecond-control-duration-schema.ts","test":"packages/typescript/tests/rules/prefer-millisecond-control-duration-schema.test.ts"},{"code":"@sarj/prefer-minimal-parameter-contract","family":"typescript","id":"prefer-minimal-parameter-contract","source":"packages/typescript/src/rules/prefer-minimal-parameter-contract.ts","test":"packages/typescript/tests/rules/prefer-minimal-parameter-contract.test.ts"},{"code":"@sarj/prefer-module-level-constant","family":"typescript","id":"prefer-module-level-constant","source":"packages/typescript/src/rules/prefer-module-level-constant.ts","test":"packages/typescript/tests/rules/prefer-module-level-constant.test.ts"},{"code":"@sarj/prefer-module-level-refined-schema","family":"typescript","id":"prefer-module-level-refined-schema","source":"packages/typescript/src/rules/prefer-module-level-refined-schema.ts","test":"packages/typescript/tests/rules/prefer-module-level-refined-schema.test.ts"},{"code":"@sarj/prefer-module-level-schema","family":"typescript","id":"prefer-module-level-schema","source":"packages/typescript/src/rules/prefer-module-level-schema.ts","test":"packages/typescript/tests/rules/prefer-module-level-schema.test.ts"},{"code":"@sarj/prefer-multi-value-zod-literal","family":"typescript","id":"prefer-multi-value-zod-literal","source":"packages/typescript/src/rules/prefer-multi-value-zod-literal.ts","test":"packages/typescript/tests/rules/prefer-multi-value-zod-literal.test.ts"},{"code":"@sarj/prefer-named-callback-domain","family":"typescript","id":"prefer-named-callback-domain","source":"packages/typescript/src/rules/prefer-named-callback-domain.ts","test":"packages/typescript/tests/rules/prefer-named-callback-domain.test.ts"},{"code":"@sarj/prefer-named-complex-return-type","family":"typescript","id":"prefer-named-complex-return-type","source":"packages/typescript/src/rules/prefer-named-complex-return-type.ts","test":"packages/typescript/tests/rules/prefer-named-complex-return-type.test.ts"},{"code":"@sarj/prefer-native-fetch-in-server-actions","family":"typescript","id":"prefer-native-fetch-in-server-actions","source":"packages/typescript/src/rules/prefer-native-fetch-in-server-actions.ts","test":"packages/typescript/tests/rules/prefer-native-fetch-in-server-actions.test.ts"},{"code":"@sarj/prefer-native-random-uuid","family":"typescript","id":"prefer-native-random-uuid","source":"packages/typescript/src/rules/prefer-native-random-uuid.ts","test":"packages/typescript/tests/rules/prefer-native-random-uuid.test.ts"},{"code":"@sarj/prefer-node-crypto-hash","family":"typescript","id":"prefer-node-crypto-hash","source":"packages/typescript/src/rules/prefer-node-crypto-hash.ts","test":"packages/typescript/tests/rules/prefer-node-crypto-hash.test.ts"},{"code":"@sarj/prefer-node-fs-promises","family":"typescript","id":"prefer-node-fs-promises","source":"packages/typescript/src/rules/prefer-node-fs-promises.ts","test":"packages/typescript/tests/rules/prefer-node-fs-promises.test.ts"},{"code":"@sarj/prefer-nominal-id-types","family":"typescript","id":"prefer-nominal-id-types","source":"packages/typescript/src/rules/prefer-nominal-id-types.ts","test":"packages/typescript/tests/rules/prefer-nominal-id-types.test.ts"},{"code":"@sarj/prefer-non-nullable-collection","family":"typescript","id":"prefer-non-nullable-collection","source":"packages/typescript/src/rules/prefer-non-nullable-collection.ts","test":"packages/typescript/tests/rules/prefer-non-nullable-collection.test.ts"},{"code":"@sarj/prefer-nullish-filter-predicate","family":"typescript","id":"prefer-nullish-filter-predicate","source":"packages/typescript/src/rules/prefer-nullish-filter-predicate.ts","test":"packages/typescript/tests/rules/prefer-nullish-filter-predicate.test.ts"},{"code":"@sarj/prefer-schema-for-api-payload","family":"typescript","id":"prefer-schema-for-api-payload","source":"packages/typescript/src/rules/prefer-schema-for-api-payload.ts","test":"packages/typescript/tests/rules/prefer-schema-for-api-payload.test.ts"},{"code":"@sarj/prefer-semantic-colors","family":"typescript","id":"prefer-semantic-colors","source":"packages/typescript/src/rules/prefer-semantic-colors.ts","test":"packages/typescript/tests/rules/prefer-semantic-colors.test.ts"},{"code":"@sarj/prefer-server-actions","family":"typescript","id":"prefer-server-actions","source":"packages/typescript/src/rules/prefer-server-actions.ts","test":"packages/typescript/tests/rules/prefer-server-actions.test.ts"},{"code":"@sarj/prefer-shadcn-primitives","family":"typescript","id":"prefer-shadcn-primitives","source":"packages/typescript/src/rules/prefer-shadcn-primitives.ts","test":"packages/typescript/tests/rules/prefer-shadcn-primitives.test.ts"},{"code":"@sarj/prefer-shared-zod-enum","family":"typescript","id":"prefer-shared-zod-enum","source":"packages/typescript/src/rules/prefer-shared-zod-enum.ts","test":"packages/typescript/tests/rules/prefer-shared-zod-enum.test.ts"},{"code":"@sarj/prefer-switch-for-repeated-equality","family":"typescript","id":"prefer-switch-for-repeated-equality","source":"packages/typescript/src/rules/prefer-switch-for-repeated-equality.ts","test":"packages/typescript/tests/rules/prefer-switch-for-repeated-equality.test.ts"},{"code":"@sarj/prefer-typed-reflection","family":"typescript","id":"prefer-typed-reflection","source":"packages/typescript/src/rules/prefer-typed-reflection.ts","test":"packages/typescript/tests/rules/prefer-typed-reflection.test.ts"},{"code":"@sarj/prefer-whole-object-assertion","family":"typescript","id":"prefer-whole-object-assertion","source":"packages/typescript/src/rules/prefer-whole-object-assertion.ts","test":"packages/typescript/tests/rules/prefer-whole-object-assertion.test.ts"},{"code":"@sarj/prefer-zod-infer","family":"typescript","id":"prefer-zod-infer","source":"packages/typescript/src/rules/prefer-zod-infer.ts","test":"packages/typescript/tests/rules/prefer-zod-infer.test.ts"},{"code":"@sarj/prefer-zod-parse-output-type","family":"typescript","id":"prefer-zod-parse-output-type","source":"packages/typescript/src/rules/prefer-zod-parse-output-type.ts","test":"packages/typescript/tests/rules/prefer-zod-parse-output-type.test.ts"},{"code":"@sarj/repeated-static-call-cases","family":"typescript","id":"repeated-static-call-cases","source":"packages/typescript/src/rules/repeated-static-call-cases.ts","test":"packages/typescript/tests/rules/repeated-static-call-cases.test.ts"},{"code":"@sarj/require-assert-never","family":"typescript","id":"require-assert-never","source":"packages/typescript/src/rules/require-assert-never.ts","test":"packages/typescript/tests/rules/require-assert-never.test.ts"},{"code":"@sarj/require-button-accessible-name","family":"typescript","id":"require-button-accessible-name","source":"packages/typescript/src/rules/require-button-accessible-name.ts","test":"packages/typescript/tests/rules/require-button-accessible-name.test.ts"},{"code":"@sarj/require-camelcase-properties","family":"typescript","id":"require-camelcase-properties","source":"packages/typescript/src/rules/require-camelcase-properties.ts","test":"packages/typescript/tests/rules/require-camelcase-properties.test.ts"},{"code":"@sarj/require-explicit-contract-implementation","family":"typescript","id":"require-explicit-contract-implementation","source":"packages/typescript/src/rules/require-explicit-contract-implementation.ts","test":"packages/typescript/tests/rules/require-explicit-contract-implementation.test.ts"},{"code":"@sarj/require-explicit-service-contract","family":"typescript","id":"require-explicit-service-contract","source":"packages/typescript/src/rules/require-explicit-service-contract.ts","test":"packages/typescript/tests/rules/require-explicit-service-contract.test.ts"},{"code":"@sarj/require-fetch-timeout","family":"typescript","id":"require-fetch-timeout","source":"packages/typescript/src/rules/require-fetch-timeout.ts","test":"packages/typescript/tests/rules/require-fetch-timeout.test.ts"},{"code":"@sarj/require-interface-for-exported-class","family":"typescript","id":"require-interface-for-exported-class","source":"packages/typescript/src/rules/require-interface-for-exported-class.ts","test":"packages/typescript/tests/rules/require-interface-for-exported-class.test.ts"},{"code":"@sarj/require-pascal-case-zod-schema-name","family":"typescript","id":"require-pascal-case-zod-schema-name","source":"packages/typescript/src/rules/require-pascal-case-zod-schema-name.ts","test":"packages/typescript/tests/rules/require-pascal-case-zod-schema-name.test.ts"},{"code":"@sarj/require-port-for-service","family":"typescript","id":"require-port-for-service","source":"packages/typescript/src/rules/require-port-for-service.ts","test":"packages/typescript/tests/rules/require-port-for-service.test.ts"},{"code":"@sarj/require-sql-access-class","family":"typescript","id":"require-sql-access-class","source":"packages/typescript/src/rules/require-sql-access-class.ts","test":"packages/typescript/tests/rules/require-sql-access-class.test.ts"},{"code":"@sarj/require-static-next-matcher","family":"typescript","id":"require-static-next-matcher","source":"packages/typescript/src/rules/require-static-next-matcher.ts","test":"packages/typescript/tests/rules/require-static-next-matcher.test.ts"},{"code":"@sarj/require-svg-accessible-name","family":"typescript","id":"require-svg-accessible-name","source":"packages/typescript/src/rules/require-svg-accessible-name.ts","test":"packages/typescript/tests/rules/require-svg-accessible-name.test.ts"},{"code":"@sarj/require-use-form-default-values","family":"typescript","id":"require-use-form-default-values","source":"packages/typescript/src/rules/require-use-form-default-values.ts","test":"packages/typescript/tests/rules/require-use-form-default-values.test.ts"},{"code":"@sarj/require-use-server-in-actions-file","family":"typescript","id":"require-use-server-in-actions-file","source":"packages/typescript/src/rules/require-use-server-in-actions-file.ts","test":"packages/typescript/tests/rules/require-use-server-in-actions-file.test.ts"},{"code":"@sarj/require-zod-form-validation","family":"typescript","id":"require-zod-form-validation","source":"packages/typescript/src/rules/require-zod-form-validation.ts","test":"packages/typescript/tests/rules/require-zod-form-validation.test.ts"},{"code":"@sarj/sole-export-matches-filename","family":"typescript","id":"sole-export-matches-filename","source":"packages/typescript/src/rules/sole-export-matches-filename.ts","test":"packages/typescript/tests/rules/sole-export-matches-filename.test.ts"},{"code":"@sarj/source-coupled-test","family":"typescript","id":"source-coupled-test","source":"packages/typescript/src/rules/source-coupled-test.ts","test":"packages/typescript/tests/rules/source-coupled-test.test.ts"},{"code":"@sarj/stepdown","family":"typescript","id":"stepdown","source":"packages/typescript/src/rules/stepdown.ts","test":"packages/typescript/tests/rules/stepdown.test.ts"},{"code":"@sarj/store-insert-requires-on-conflict","family":"typescript","id":"store-insert-requires-on-conflict","source":"packages/typescript/src/rules/store-insert-requires-on-conflict.ts","test":"packages/typescript/tests/rules/store-insert-requires-on-conflict.test.ts"},{"code":"@sarj/test-loops-over-literal-cases","family":"typescript","id":"test-loops-over-literal-cases","source":"packages/typescript/src/rules/test-loops-over-literal-cases.ts","test":"packages/typescript/tests/rules/test-loops-over-literal-cases.test.ts"},{"code":"@sarj/test-phase-label-comment","family":"typescript","id":"test-phase-label-comment","source":"packages/typescript/src/rules/test-phase-label-comment.ts","test":"packages/typescript/tests/rules/test-phase-label-comment.test.ts"}],"schemaVersion":1}
@@ -138,6 +138,7 @@
138
138
  "prefer-direct-import-module",
139
139
  "prefer-discriminated-model-union",
140
140
  "prefer-fstring-over-concat",
141
+ "prefer-grouped-settings",
141
142
  "prefer-immutable-module-constant",
142
143
  "prefer-injected-dependency-over-monkeypatch",
143
144
  "prefer-library-fake",
@@ -577,7 +578,8 @@
577
578
  "SARJ528",
578
579
  "SARJ529",
579
580
  "SARJ530",
580
- "SARJ531"
581
+ "SARJ531",
582
+ "SARJ532"
581
583
  ],
582
584
  "sql": [
583
585
  "SARJ101",
@@ -560,7 +560,7 @@ def analyze_external(
560
560
  runner=execute_eslint,
561
561
  parser=parse_eslint,
562
562
  validator=partial(_validate_eslint_coverage, selected_files=_eslint_selected_files(command)),
563
- invocation_id=invocation_id,
563
+ invocation_id=InvocationId(invocation_id),
564
564
  file_count=_argv_file_count(command.argv),
565
565
  )
566
566
  )
@@ -682,7 +682,7 @@ def _security_reports(
682
682
  runner=partial(_security_runner, runner, name="zizmor"),
683
683
  parser=security_tools.parse_zizmor,
684
684
  version=security_tools.VERSIONS["zizmor"],
685
- invocation_id=f"batch-{start // _ESLINT_BATCH_SIZE + 1}",
685
+ invocation_id=InvocationId(f"batch-{start // _ESLINT_BATCH_SIZE + 1}"),
686
686
  file_count=len(batch),
687
687
  )
688
688
  )
@@ -729,7 +729,7 @@ def _checkov_reports(
729
729
  runner=partial(_security_runner, runner, name="checkov"),
730
730
  parser=security_tools.parse_checkov,
731
731
  version=security_tools.VERSIONS["checkov"],
732
- invocation_id=f"{framework}:batch-{start // _ESLINT_BATCH_SIZE + 1}",
732
+ invocation_id=InvocationId(f"{framework}:batch-{start // _ESLINT_BATCH_SIZE + 1}"),
733
733
  file_count=len(batch),
734
734
  )
735
735
  )
@@ -1370,7 +1370,7 @@ def _invoke_react_doctor(
1370
1370
  root=root,
1371
1371
  runner=execution_runner,
1372
1372
  parser=parser,
1373
- invocation_id=project.relative_to(root).as_posix() or None,
1373
+ invocation_id=InvocationId(project.relative_to(root).as_posix()) or None,
1374
1374
  file_count=file_count,
1375
1375
  )
1376
1376
 
@@ -1891,7 +1891,7 @@ def _invoke_python_projects(
1891
1891
  reports: list[ToolReport] = []
1892
1892
  for project, scoped_files in projects:
1893
1893
  argv = _basedpyright_argv(project, scoped_files, project_mode=project_mode)
1894
- project_id = project.relative_to(root).as_posix() or None
1894
+ project_id = InvocationId(project.relative_to(root).as_posix()) or None
1895
1895
  report = _invoke(
1896
1896
  name,
1897
1897
  argv,
@@ -1945,7 +1945,7 @@ def _invoke_ruff_projects(
1945
1945
  ) -> tuple[ToolReport, ...]:
1946
1946
  reports: list[ToolReport] = []
1947
1947
  for project, config, scoped_files in ruff_project_groups(files, root):
1948
- project_id = None if project == root else project.relative_to(root).as_posix()
1948
+ project_id = None if project == root else InvocationId(project.relative_to(root).as_posix())
1949
1949
  report = _invoke(
1950
1950
  "ruff",
1951
1951
  _ruff_argv(scoped_files, config=config),
@@ -2221,11 +2221,15 @@ def _shellcheck_reports(
2221
2221
  return tuple(reports)
2222
2222
  for batch_number, start in enumerate(range(0, len(grouped.shellcheck), _SHELLCHECK_BATCH_SIZE), start=1):
2223
2223
  batch = tuple(sorted(grouped.shellcheck[start : start + _SHELLCHECK_BATCH_SIZE]))
2224
- reports.append(_invoke_shellcheck(batch, root=root, runner=runner, invocation_id=str(batch_number)))
2224
+ reports.append(
2225
+ _invoke_shellcheck(batch, root=root, runner=runner, invocation_id=InvocationId(str(batch_number)))
2226
+ )
2225
2227
  return tuple(reports)
2226
2228
 
2227
2229
 
2228
- def _invoke_shellcheck(files: Sequence[str], *, root: Path, runner: ProcessRunner, invocation_id: str) -> ToolReport:
2230
+ def _invoke_shellcheck(
2231
+ files: Sequence[str], *, root: Path, runner: ProcessRunner, invocation_id: InvocationId
2232
+ ) -> ToolReport:
2229
2233
  report = _invoke(
2230
2234
  "shellcheck",
2231
2235
  (
@@ -2725,7 +2729,7 @@ def _invoke(
2725
2729
  runner: ProcessRunner,
2726
2730
  parser: ProtocolParser,
2727
2731
  validator: ProtocolValidator | None = None,
2728
- invocation_id: str | None = None,
2732
+ invocation_id: InvocationId | None = None,
2729
2733
  file_count: int,
2730
2734
  version: str | None = None,
2731
2735
  ) -> ToolReport:
@@ -2454,7 +2454,7 @@ def _publish_rollout_pull(
2454
2454
  "--head",
2455
2455
  branch,
2456
2456
  "--title",
2457
- BOT_COMMIT_PREFIX + version,
2457
+ f"{BOT_COMMIT_PREFIX}{version}",
2458
2458
  "--body",
2459
2459
  body,
2460
2460
  )
@@ -2471,7 +2471,7 @@ def _publish_rollout_pull(
2471
2471
  consumer.repository,
2472
2472
  url,
2473
2473
  "--title",
2474
- BOT_COMMIT_PREFIX + version,
2474
+ f"{BOT_COMMIT_PREFIX}{version}",
2475
2475
  "--body",
2476
2476
  body,
2477
2477
  )