code-standards 8.147.0__tar.gz → 8.147.21__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 (207) hide show
  1. {code_standards-8.147.0 → code_standards-8.147.21}/PKG-INFO +1 -1
  2. {code_standards-8.147.0 → code_standards-8.147.21}/pyproject.toml +1 -1
  3. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/cli-reference.v1.json +2 -2
  4. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/json_boundary.py +14 -0
  5. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/rollout.py +159 -36
  6. {code_standards-8.147.0 → code_standards-8.147.21}/.gitignore +0 -0
  7. {code_standards-8.147.0 → code_standards-8.147.21}/LICENSE +0 -0
  8. {code_standards-8.147.0 → code_standards-8.147.21}/README.md +0 -0
  9. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/__init__.py +0 -0
  10. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/__main__.py +0 -0
  11. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/_meta.py +0 -0
  12. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/api.py +0 -0
  13. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/cli/__init__.py +0 -0
  14. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/cli/main.py +0 -0
  15. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/Mintfile.mobile.strict +0 -0
  16. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/action-parser/LICENSE.actions +0 -0
  17. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/action-parser/LICENSE.cronstrue +0 -0
  18. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/action-parser/LICENSE.yaml +0 -0
  19. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/action-parser/generate.mts +0 -0
  20. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/action-parser/index.mts +0 -0
  21. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/action-parser/package-lock.json +0 -0
  22. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/action-parser/package.json +0 -0
  23. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/action-parser/upstream.json +0 -0
  24. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/action-parser.cjs +0 -0
  25. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/actionlint.strict.yaml +0 -0
  26. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/basedpyright.python315-watch.json +0 -0
  27. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/basedpyright.strict.json +0 -0
  28. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/checkov.strict.yml +0 -0
  29. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/compile-eslint.mts +0 -0
  30. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/detekt.strict.yml +0 -0
  31. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/devops-verification.v1.json +0 -0
  32. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/doctor.config.json +0 -0
  33. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/eslint-compact-formatter.mts +0 -0
  34. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/eslint-required-policy.mts +0 -0
  35. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/eslint-selected-rules.mts +0 -0
  36. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/eslint.application.mjs +0 -0
  37. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/eslint.peers.json +0 -0
  38. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/eslint.strict.mjs +0 -0
  39. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/eslint.strict.ts +0 -0
  40. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/hadolint.strict.yaml +0 -0
  41. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/ktlint.strict.editorconfig +0 -0
  42. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/markdownlint.strict.yaml +0 -0
  43. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/mobile-tools.versions.json +0 -0
  44. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/mobsf.strict.yml +0 -0
  45. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/pyright.strict.json +0 -0
  46. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/ruff.application.toml +0 -0
  47. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/ruff.cast.toml +0 -0
  48. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/ruff.python315-watch.toml +0 -0
  49. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/ruff.required.toml +0 -0
  50. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/ruff.strict.toml +0 -0
  51. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/rule-calibration-campaign.v1.json +0 -0
  52. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/rule-inventory.v1.json +0 -0
  53. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/rule-ledger.json +0 -0
  54. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/rule-level-source.mts +0 -0
  55. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/schemas/SKAFFOLD-LICENSE +0 -0
  56. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/schemas/google-build-v1-schema.json +0 -0
  57. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/schemas/google-build-v1.LICENSE +0 -0
  58. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/schemas/skaffold-v4beta7.json +0 -0
  59. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/schemas/upstream-schemas.json +0 -0
  60. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/semgrep-overrides.txt +0 -0
  61. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/shellcheck.strict.rc +0 -0
  62. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/swiftformat.strict +0 -0
  63. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/swiftlint.strict.yml +0 -0
  64. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/taplo.strict.toml +0 -0
  65. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/tflint.strict.hcl +0 -0
  66. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/tflint.version.hcl +0 -0
  67. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/tool-json.mts +0 -0
  68. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/yamllint.strict.yaml +0 -0
  69. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/configs/zizmor.strict.yml +0 -0
  70. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/__init__.py +0 -0
  71. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/__init__.py +0 -0
  72. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/age_transition.py +0 -0
  73. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/configs.py +0 -0
  74. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/devops.py +0 -0
  75. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/doctor.py +0 -0
  76. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/exclusions.py +0 -0
  77. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/hooks.py +0 -0
  78. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/launcher.py +0 -0
  79. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/lifecycle.py +0 -0
  80. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/manifest.py +0 -0
  81. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/native_bootstrap.py +0 -0
  82. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/packagemanager.py +0 -0
  83. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/repository_baseline.py +0 -0
  84. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/retired_suppressions.py +0 -0
  85. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/scaffold.py +0 -0
  86. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/service.py +0 -0
  87. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/transaction.py +0 -0
  88. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/upgrade.py +0 -0
  89. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/adoption/uvtool.py +0 -0
  90. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/catalogs/__init__.py +0 -0
  91. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/catalogs/slack_automations.py +0 -0
  92. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/corpus/__init__.py +0 -0
  93. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/corpus/manifest.py +0 -0
  94. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/corpus/snapshot.py +0 -0
  95. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/diagnostics/__init__.py +0 -0
  96. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/diagnostics/analysis.schema.json +0 -0
  97. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/diagnostics/baseline.py +0 -0
  98. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/diagnostics/initial_import.py +0 -0
  99. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/diagnostics/models.py +0 -0
  100. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/diagnostics/serialize.py +0 -0
  101. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/diagnostics/source.py +0 -0
  102. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/filesystem.py +0 -0
  103. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/__init__.py +0 -0
  104. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/_cloudbuild_autofix.py +0 -0
  105. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/action_metadata.py +0 -0
  106. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/analysis.py +0 -0
  107. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/autofix.py +0 -0
  108. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/chart_schemas.py +0 -0
  109. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/cloudbuild.py +0 -0
  110. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/cloudbuild_schema.py +0 -0
  111. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/complexity_baseline.py +0 -0
  112. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/devops_programs.py +0 -0
  113. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/devops_schema.py +0 -0
  114. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/devops_source.py +0 -0
  115. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/devops_tools.py +0 -0
  116. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/duplicate_code.py +0 -0
  117. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/embedded_shell.py +0 -0
  118. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/external.py +0 -0
  119. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/kubernetes_context.py +0 -0
  120. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/library_policy.py +0 -0
  121. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/mobile_tools.py +0 -0
  122. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/policy.py +0 -0
  123. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/prepared_devops.py +0 -0
  124. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/prepared_kubernetes.py +0 -0
  125. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/prepared_native.py +0 -0
  126. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/python_fixes.py +0 -0
  127. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/repo_standards.py +0 -0
  128. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/runner.py +0 -0
  129. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/scheduling.py +0 -0
  130. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/security_tools.py +0 -0
  131. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/shell_ast.py +0 -0
  132. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/shell_format.py +0 -0
  133. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/shell_policy.py +0 -0
  134. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/test_value.py +0 -0
  135. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/text_rule_base.py +0 -0
  136. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/text_rules/__init__.py +0 -0
  137. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/text_rules/_registry.py +0 -0
  138. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/text_rules/_slack_payload.py +0 -0
  139. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/text_rules/cloudbuild_contract.py +0 -0
  140. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/text_rules/slack_event_text_in_mrkdwn.py +0 -0
  141. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/textlint.py +0 -0
  142. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/toml_literals.py +0 -0
  143. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/linting/unused_modules.py +0 -0
  144. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/__init__.py +0 -0
  145. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/_values.py +0 -0
  146. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/artifacts.py +0 -0
  147. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/causality.py +0 -0
  148. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/changes.py +0 -0
  149. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/ci_artifacts.py +0 -0
  150. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/make_checks.py +0 -0
  151. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/metadata_verification.py +0 -0
  152. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/native_test_setup.py +0 -0
  153. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/process.py +0 -0
  154. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/publish.py +0 -0
  155. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/registry.py +0 -0
  156. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/release_age.py +0 -0
  157. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/release_detect.py +0 -0
  158. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/retirement.py +0 -0
  159. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/reviewed_analysis.py +0 -0
  160. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/status.py +0 -0
  161. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/tags.py +0 -0
  162. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/test_selection.py +0 -0
  163. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/typescript.py +0 -0
  164. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/verification_process.py +0 -0
  165. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/release/wheel_tests.py +0 -0
  166. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/__init__.py +0 -0
  167. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/cli_examples.py +0 -0
  168. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/cli_reference_artifact.py +0 -0
  169. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/cloudbuild_schema_projection.py +0 -0
  170. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/comment_corpus.py +0 -0
  171. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/config_generation.py +0 -0
  172. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/docs.py +0 -0
  173. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/hooks.py +0 -0
  174. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/immutable_git.py +0 -0
  175. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/ledger.py +0 -0
  176. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/repository.py +0 -0
  177. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/ruff_freshness.py +0 -0
  178. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/rule_authoring.py +0 -0
  179. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/rule_catalog_artifact.py +0 -0
  180. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/rule_changes.py +0 -0
  181. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/rule_checkout.py +0 -0
  182. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/rule_dependencies.py +0 -0
  183. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/rule_examples.py +0 -0
  184. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/rule_imports.mts +0 -0
  185. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/rule_inventory_artifact.py +0 -0
  186. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/rule_level_source.py +0 -0
  187. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/rule_lifecycle.py +0 -0
  188. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/rule_maintenance.py +0 -0
  189. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/rule_registration.py +0 -0
  190. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/shell_checks.py +0 -0
  191. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/repository/third_party_catalog_artifact.py +0 -0
  192. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/rules/__init__.py +0 -0
  193. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/rules/catalog.py +0 -0
  194. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/rules/contracts.py +0 -0
  195. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/rules/corpus_runner.py +0 -0
  196. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/rules/evaluation.py +0 -0
  197. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/schema_boundary.py +0 -0
  198. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/setup/__init__.py +0 -0
  199. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/setup/repository.py +0 -0
  200. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/typed_containers.py +0 -0
  201. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/libs/yaml_boundary.py +0 -0
  202. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/py.typed +0 -0
  203. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/schemas/__init__.py +0 -0
  204. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/schemas/_paths.py +0 -0
  205. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/schemas/rule-catalog.v1.json +0 -0
  206. {code_standards-8.147.0 → code_standards-8.147.21}/src/sarj_standards/schemas/rule-catalog.v1.schema.json +0 -0
  207. {code_standards-8.147.0 → code_standards-8.147.21}/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.147.0
3
+ Version: 8.147.21
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/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "code-standards"
3
- version = "8.147.0"
3
+ version = "8.147.21"
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"
@@ -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.147.0).",
3320
- "version": "8.147.0"
3319
+ "summary": "Adopt, check, fix, diagnose, and update sarj-ai standards (v8.147.21).",
3320
+ "version": "8.147.21"
3321
3321
  }
@@ -15,6 +15,20 @@ def parse_json(text: str) -> JsonValue:
15
15
  return json.loads(text) # pyright: ignore[reportAny] -- untyped parser boundary.
16
16
 
17
17
 
18
+ def parse_json_documents(text: str) -> list[JsonValue]:
19
+ decoder = json.JSONDecoder()
20
+ documents: list[JsonValue] = []
21
+ offset = 0
22
+ while offset < len(text):
23
+ if text[offset] in " \t\r\n":
24
+ offset += 1
25
+ continue
26
+ decoded: tuple[JsonValue, int] = decoder.raw_decode(text, offset)
27
+ document, offset = decoded
28
+ documents.append(document)
29
+ return documents
30
+
31
+
18
32
  def parse_unique_json(text: str) -> JsonValue:
19
33
  return json.loads(text, object_pairs_hook=_unique_pairs, parse_constant=_reject_json_constant) # pyright: ignore[reportAny] -- untyped parser boundary.
20
34
 
@@ -23,6 +23,7 @@ from typing import TYPE_CHECKING, Annotated, NamedTuple, Protocol, TypeGuard, as
23
23
  from urllib.parse import quote
24
24
 
25
25
  from packaging.version import InvalidVersion, Version
26
+ from pydantic import AliasPath, BaseModel, Field, ValidationError
26
27
  from repo_standards.repository import parse_baseline_bytes as parse_repository_baseline
27
28
  import typer
28
29
  import yaml
@@ -37,7 +38,7 @@ from sarj_standards.libs.adoption import (
37
38
  scaffold as adoption_scaffold,
38
39
  uvtool as adoption_uvtool,
39
40
  )
40
- from sarj_standards.libs.json_boundary import parse_json
41
+ from sarj_standards.libs.json_boundary import parse_json, parse_json_documents
41
42
  from sarj_standards.libs.release import metadata_verification, retirement
42
43
  from sarj_standards.libs.release.verification_process import BaseWatch
43
44
  from sarj_standards.libs.repository import ledger as rule_ledger, rule_catalog_artifact
@@ -66,6 +67,7 @@ BOT_COMMIT_PREFIX = "chore(standards): adopt "
66
67
  MANIFEST = ".sarj-standards.toml"
67
68
  LS_REMOTE_FIELDS = 2
68
69
  COMMIT_WITH_PARENT_FIELDS = 2
70
+ CLOSED_ROLLOUT_UNAVAILABLE = "closed managed rollout history is unavailable or incomplete; refusing automatic retry"
69
71
  PORCELAIN_RECORD_MINIMUM = 4
70
72
  MANAGED_TRAILER = "Standards-Rollout: managed/v1"
71
73
  MANAGED_TREE_TRAILER_PREFIX = "Standards-Rollout-Tree: "
@@ -615,7 +617,7 @@ def pull_request(consumer: Consumer, version: str, runner: CommandRunner) -> dic
615
617
  "--head",
616
618
  rollout_branch(version),
617
619
  "--json",
618
- "state,mergedAt,url,headRefName,baseRefName,headRefOid,body",
620
+ "state,mergedAt,url,headRefName,baseRefName,headRefOid,body,isCrossRepository,headRepository,headRepositoryOwner",
619
621
  "--limit",
620
622
  "2",
621
623
  )
@@ -638,6 +640,107 @@ def pull_identity_matches(consumer: Consumer, version: str, pull: Mapping[str, o
638
640
  )
639
641
 
640
642
 
643
+ def same_repository_pull(consumer: Consumer, pull: Mapping[str, JsonValue]) -> bool:
644
+ try:
645
+ origin = _OpenPullOrigin.model_validate(pull, strict=True)
646
+ except ValidationError:
647
+ return False
648
+ return (
649
+ origin.is_cross_repository is False
650
+ and f"{origin.owner_login}/{origin.repository_name}".casefold() == consumer.repository.casefold()
651
+ )
652
+
653
+
654
+ class _OpenPullOrigin(BaseModel, frozen=True):
655
+ is_cross_repository: bool = Field(validation_alias="isCrossRepository")
656
+ repository_name: str = Field(validation_alias=AliasPath("headRepository", "name"), min_length=1)
657
+ owner_login: str = Field(validation_alias=AliasPath("headRepositoryOwner", "login"), min_length=1)
658
+
659
+
660
+ def closed_rollout_decline(consumer: Consumer, version: str, runner: CommandRunner) -> Outcome | None:
661
+ head = quote(f"{consumer.repository.partition('/')[0]}:{rollout_branch(version)}", safe="")
662
+ endpoint = f"repos/{consumer.repository}/pulls?state=closed&head={head}&base={quote(consumer.branch, safe='')}&per_page=100"
663
+ try:
664
+ result = runner.run(("gh", "api", "--method", "GET", "--paginate", endpoint), check=False)
665
+ pages = parse_json_documents(stdout(result)) if result.returncode == 0 else None
666
+ return _closed_history_decline(consumer, version, pages)
667
+ except OSError, RolloutError, json.JSONDecodeError:
668
+ return Outcome(consumer, OutcomeState.BLOCKED, detail=CLOSED_ROLLOUT_UNAVAILABLE)
669
+
670
+
671
+ def _closed_history_decline(consumer: Consumer, version: str, pages: JsonValue) -> Outcome | None:
672
+ if not isinstance(pages, list) or not pages:
673
+ raise RolloutError(CLOSED_ROLLOUT_UNAVAILABLE)
674
+ for page in pages:
675
+ if not isinstance(page, list):
676
+ raise RolloutError(CLOSED_ROLLOUT_UNAVAILABLE)
677
+ for pull in page:
678
+ if (declined := _closed_pull_decline(consumer, version, pull)) is not None:
679
+ return declined
680
+ return None
681
+
682
+
683
+ def _closed_pull_decline(consumer: Consumer, version: str, pull: JsonValue) -> Outcome | None:
684
+ if not isinstance(pull, dict):
685
+ raise RolloutError(CLOSED_ROLLOUT_UNAVAILABLE)
686
+ head, base = pull.get("head"), pull.get("base")
687
+ repositories = (_closed_pull_repository(head), _closed_pull_repository(base))
688
+ references = (_closed_pull_ref(head), _closed_pull_ref(base))
689
+ if _closed_pull_has_foreign_reference(consumer, version, repositories, references):
690
+ return None
691
+ body_value = pull.get("body")
692
+ body = body_value if isinstance(body_value, str) else ""
693
+ if pr_marker(consumer, version) not in body:
694
+ return None
695
+ merged_at = pull.get("merged_at")
696
+ if isinstance(merged_at, str) and merged_at:
697
+ return None
698
+ ownership = [line for line in body.splitlines() if PR_MARKER_PREFIX in line]
699
+ if ownership != [pr_marker(consumer, version)]:
700
+ raise RolloutError(CLOSED_ROLLOUT_UNAVAILABLE)
701
+ if desired_version(body) != version:
702
+ return None
703
+ url = pull.get("html_url")
704
+ if not isinstance(url, str) or not url:
705
+ raise RolloutError(CLOSED_ROLLOUT_UNAVAILABLE)
706
+ if (
707
+ any(name is None for name in (*repositories, *references))
708
+ or pull.get("state") != "closed"
709
+ or "merged_at" not in pull
710
+ or merged_at is not None
711
+ ):
712
+ raise RolloutError(CLOSED_ROLLOUT_UNAVAILABLE)
713
+ return Outcome(
714
+ consumer,
715
+ OutcomeState.BLOCKED,
716
+ url,
717
+ "managed rollout was closed without merging for this version; reopen that PR to retry",
718
+ )
719
+
720
+
721
+ def _closed_pull_has_foreign_reference(
722
+ consumer: Consumer,
723
+ version: str,
724
+ repositories: tuple[str | None, str | None],
725
+ references: tuple[str | None, str | None],
726
+ ) -> bool:
727
+ expected_references = (rollout_branch(version), consumer.branch)
728
+ return any(name is not None and name.casefold() != consumer.repository.casefold() for name in repositories) or any(
729
+ name is not None and name != expected for name, expected in zip(references, expected_references, strict=True)
730
+ )
731
+
732
+
733
+ def _closed_pull_repository(reference: JsonValue) -> str | None:
734
+ repository = reference.get("repo") if isinstance(reference, dict) else None
735
+ name = repository.get("full_name") if isinstance(repository, dict) else None
736
+ return name if isinstance(name, str) and name else None
737
+
738
+
739
+ def _closed_pull_ref(reference: JsonValue) -> str | None:
740
+ name = reference.get("ref") if isinstance(reference, dict) else None
741
+ return name if isinstance(name, str) and name else None
742
+
743
+
641
744
  def live_consumer_base_sha(consumer: Consumer, runner: CommandRunner) -> str:
642
745
  ref = quote(f"heads/{consumer.branch}", safe="")
643
746
  result = runner.run(
@@ -722,39 +825,40 @@ def failed_verification_outcome(consumer: Consumer, pull: Mapping[str, object],
722
825
 
723
826
  def status_one(consumer: Consumer, version: str, runner: CommandRunner) -> Outcome:
724
827
  pull = pull_request(consumer, version, runner)
725
- if pull is not None:
726
- if not pull_identity_matches(consumer, version, pull):
727
- return Outcome(
728
- consumer,
729
- OutcomeState.BLOCKED,
730
- str(pull.get("url", "")),
731
- "rollout PR ownership marker, head, or base does not match",
732
- )
733
- try:
734
- desired = desired_version(str(pull.get("body", "")))
735
- reject_rollout_downgrade(desired, version)
736
- except RolloutError as exc:
737
- return Outcome(consumer, OutcomeState.BLOCKED, str(pull.get("url", "")), str(exc))
738
- if desired != version:
739
- return Outcome(
740
- consumer,
741
- OutcomeState.MISSING,
742
- str(pull.get("url", "")),
743
- "open managed PR targets an older Standards release",
744
- )
745
- if VERIFICATION_FAILED_MARKER in str(pull.get("body", "")):
746
- return failed_verification_outcome(consumer, pull, runner)
747
- if (
748
- pull.get("mergedAt") is None
749
- and (provenance := open_pull_commit_provenance(consumer, pull, runner)) is not None
750
- ):
751
- return provenance
752
- state = OutcomeState.MERGED if pull.get("mergedAt") else OutcomeState.PR_OPEN
753
- return Outcome(consumer, state, str(pull.get("url", "")))
754
- adopted = manifest_version(base_manifest(consumer, runner) or "")
755
- if adopted == version:
756
- return Outcome(consumer, OutcomeState.ALREADY_CURRENT)
757
- return Outcome(consumer, OutcomeState.MISSING, detail=f"base branch has {adopted or 'no readable manifest'}")
828
+ if pull is None:
829
+ adopted = manifest_version(base_manifest(consumer, runner) or "")
830
+ if adopted == version:
831
+ return Outcome(consumer, OutcomeState.ALREADY_CURRENT)
832
+ if (declined := closed_rollout_decline(consumer, version, runner)) is not None:
833
+ return declined
834
+ return Outcome(consumer, OutcomeState.MISSING, detail=f"base branch has {adopted or 'no readable manifest'}")
835
+ if not pull_identity_matches(consumer, version, pull):
836
+ return Outcome(
837
+ consumer,
838
+ OutcomeState.BLOCKED,
839
+ str(pull.get("url", "")),
840
+ "rollout PR ownership marker, head, or base does not match",
841
+ )
842
+ try:
843
+ desired = desired_version(str(pull.get("body", "")))
844
+ reject_rollout_downgrade(desired, version)
845
+ except RolloutError as exc:
846
+ return Outcome(consumer, OutcomeState.BLOCKED, str(pull.get("url", "")), str(exc))
847
+ if desired != version:
848
+ if (declined := closed_rollout_decline(consumer, version, runner)) is not None:
849
+ return declined
850
+ return Outcome(
851
+ consumer,
852
+ OutcomeState.MISSING,
853
+ str(pull.get("url", "")),
854
+ "open managed PR targets an older Standards release",
855
+ )
856
+ if VERIFICATION_FAILED_MARKER in str(pull.get("body", "")):
857
+ return failed_verification_outcome(consumer, pull, runner)
858
+ if pull.get("mergedAt") is None and (provenance := open_pull_commit_provenance(consumer, pull, runner)) is not None:
859
+ return provenance
860
+ state = OutcomeState.MERGED if pull.get("mergedAt") else OutcomeState.PR_OPEN
861
+ return Outcome(consumer, state, str(pull.get("url", "")))
758
862
 
759
863
 
760
864
  def status(version: str, consumers: Sequence[Consumer], runner: CommandRunner, *, jobs: int = 1) -> tuple[Outcome, ...]:
@@ -1693,7 +1797,9 @@ def _apply_one( # ruff: ignore[too-many-locals] - one transaction binds verific
1693
1797
  comparison=f"origin/{consumer.branch}...HEAD",
1694
1798
  )
1695
1799
  report("validating and pushing managed head")
1696
- pushed_head_sha = push_rollout_head(repo, consumer, preparation, base_sha, runner, environment=unauthenticated)
1800
+ pushed_head_sha = push_rollout_head(
1801
+ repo, consumer, preparation, base_sha, runner, version=version, environment=unauthenticated
1802
+ )
1697
1803
  report("publishing pull request")
1698
1804
  return _publish_rollout_pull(
1699
1805
  consumer,
@@ -1766,8 +1872,23 @@ def push_rollout_head(
1766
1872
  base_sha: str,
1767
1873
  runner: CommandRunner,
1768
1874
  *,
1875
+ version: str,
1769
1876
  environment: Mapping[str, str],
1770
1877
  ) -> str:
1878
+ # Verification can outlive a decline. Only an owned reopened PR for this
1879
+ # exact version overrides it; no Git transport runs before this read.
1880
+ declined = closed_rollout_decline(consumer, version, runner)
1881
+ if declined is not None:
1882
+ pull = pull_request(consumer, version, runner)
1883
+ if (
1884
+ pull is None
1885
+ or pull.get("state") != "OPEN"
1886
+ or not same_repository_pull(consumer, pull)
1887
+ or not pull_identity_matches(consumer, version, pull)
1888
+ or desired_version(str(pull.get("body", ""))) != version
1889
+ ):
1890
+ msg = f"{consumer.name}: {declined.detail}: {declined.url}"
1891
+ raise RolloutError(msg)
1771
1892
  assert_consumer_base_unchanged(repo, consumer, base_sha, runner)
1772
1893
  head_sha = stdout(runner.run(("git", "rev-parse", "HEAD"), cwd=repo))
1773
1894
  if re.fullmatch(r"[0-9a-f]{40}", head_sha) is None:
@@ -2417,6 +2538,8 @@ def _publish_rollout_pull(
2417
2538
  sleep: Callable[[float], None] = time.sleep,
2418
2539
  ) -> Outcome:
2419
2540
  pull = pull_request(consumer, version, runner)
2541
+ if pull is None and (declined := closed_rollout_decline(consumer, version, runner)) is not None:
2542
+ return declined
2420
2543
  if pull is not None:
2421
2544
  pull = _wait_for_pushed_pull_head(consumer, version, runner, pull, pushed_head_sha=pushed_head_sha, sleep=sleep)
2422
2545
  if pull is not None and pull.get("headRefOid") != pushed_head_sha: