maintainability-agent 4.4.1__tar.gz → 4.4.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 (481) hide show
  1. {maintainability_agent-4.4.1/src/maintainability_agent.egg-info → maintainability_agent-4.4.2}/PKG-INFO +10 -5
  2. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/README.md +9 -4
  3. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2/src/maintainability_agent.egg-info}/PKG-INFO +10 -5
  4. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/SOURCES.txt +4 -0
  5. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/__init__.py +1 -1
  6. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_arguments.py +18 -0
  7. maintainability_agent-4.4.2/src/maintainability_audit/_self_update.py +126 -0
  8. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/cli.py +9 -0
  9. maintainability_agent-4.4.2/tests/test_ci_runs_once.py +98 -0
  10. maintainability_agent-4.4.2/tests/test_local_gate.py +187 -0
  11. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_operator_named_reads.py +3 -0
  12. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_platform_claim.py +58 -50
  13. maintainability_agent-4.4.2/tests/test_self_update.py +239 -0
  14. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_suite_isolation.py +65 -0
  15. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_workflow_supply_chain.py +29 -0
  16. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/LICENSE +0 -0
  17. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/pyproject.toml +0 -0
  18. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/setup.cfg +0 -0
  19. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/dependency_links.txt +0 -0
  20. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/entry_points.txt +0 -0
  21. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/requires.txt +0 -0
  22. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/top_level.txt +0 -0
  23. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/__main__.py +0 -0
  24. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_adapters.py +0 -0
  25. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_analysis.py +0 -0
  26. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_analyzer_sections.py +0 -0
  27. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_anchor.py +0 -0
  28. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_aspects.py +0 -0
  29. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_assets/analyzer-catalog.json +0 -0
  30. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_assets/standard.md +0 -0
  31. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_attestation.py +0 -0
  32. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_backfill.py +0 -0
  33. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_bands.py +0 -0
  34. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_banner.py +0 -0
  35. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_built_ins.py +0 -0
  36. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_calibration.py +0 -0
  37. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_catalog.py +0 -0
  38. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_changed_code_policy.py +0 -0
  39. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_charts.py +0 -0
  40. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_cognitive.py +0 -0
  41. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_config_defaults.py +0 -0
  42. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_conformance.py +0 -0
  43. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_corroborate.py +0 -0
  44. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_coverage_notes.py +0 -0
  45. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_criteria_scope.py +0 -0
  46. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_delegated_pillar.py +0 -0
  47. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_derive.py +0 -0
  48. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_discovery.py +0 -0
  49. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_documents.py +0 -0
  50. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_economics.py +0 -0
  51. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_economics_view.py +0 -0
  52. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_environment.py +0 -0
  53. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_evidence_reader.py +0 -0
  54. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_evidence_view.py +0 -0
  55. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_finding_match.py +0 -0
  56. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_first_run.py +0 -0
  57. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_formula.py +0 -0
  58. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_gates.py +0 -0
  59. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_generic.py +0 -0
  60. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_grammar.py +0 -0
  61. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_grant_ledger.py +0 -0
  62. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_handoff.py +0 -0
  63. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_history_view.py +0 -0
  64. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_hostile_prompt.py +0 -0
  65. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_hotspots.py +0 -0
  66. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_html_report_sections.py +0 -0
  67. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_html_view.py +0 -0
  68. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_identity.py +0 -0
  69. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_in_loop.py +0 -0
  70. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_in_loop_view.py +0 -0
  71. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_jvm_adapters.py +0 -0
  72. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_markdown_sections.py +0 -0
  73. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_masking.py +0 -0
  74. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_audit.py +0 -0
  75. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_gate.py +0 -0
  76. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_grants.py +0 -0
  77. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_refusals.py +0 -0
  78. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_resources.py +0 -0
  79. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_setup.py +0 -0
  80. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_metric_adapters.py +0 -0
  81. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_metrics_types.py +0 -0
  82. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_operator_reads.py +0 -0
  83. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_oracle.py +0 -0
  84. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_pillars.py +0 -0
  85. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_pipeline_results.py +0 -0
  86. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_practice.py +0 -0
  87. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_precommit.py +0 -0
  88. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_precommit_install.py +0 -0
  89. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_precommit_view.py +0 -0
  90. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_pressures.py +0 -0
  91. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_prompt_sections.py +0 -0
  92. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_c.py +0 -0
  93. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_cobol.py +0 -0
  94. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_core.py +0 -0
  95. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_cpp.py +0 -0
  96. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_csharp.py +0 -0
  97. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_fortran.py +0 -0
  98. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_go.py +0 -0
  99. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_java.py +0 -0
  100. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_js.py +0 -0
  101. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_kotlin.py +0 -0
  102. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_php.py +0 -0
  103. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_ruby.py +0 -0
  104. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_rust.py +0 -0
  105. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_shell.py +0 -0
  106. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_swift.py +0 -0
  107. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ratchet.py +0 -0
  108. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ratio_adapters.py +0 -0
  109. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_recurrence.py +0 -0
  110. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_run_comparison.py +0 -0
  111. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_runner.py +0 -0
  112. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_running_version.py +0 -0
  113. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_safe_write.py +0 -0
  114. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_scan_history.py +0 -0
  115. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_scan_view.py +0 -0
  116. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_second_source.py +0 -0
  117. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_security_delegate.py +0 -0
  118. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_security_work_order.py +0 -0
  119. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_selection.py +0 -0
  120. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic.py +0 -0
  121. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic_policy.py +0 -0
  122. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic_ts.py +0 -0
  123. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic_view.py +0 -0
  124. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_setup_errors.py +0 -0
  125. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_setup_persist.py +0 -0
  126. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/SKILL.md +0 -0
  127. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/agents/anthropic.yaml +0 -0
  128. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/agents/copilot.yaml +0 -0
  129. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/agents/openai.yaml +0 -0
  130. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/copilot/maintainability-agent.prompt.md +0 -0
  131. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/references/finding-taxonomy.md +0 -0
  132. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_install.py +0 -0
  133. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_stored_grants.py +0 -0
  134. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_tdd_view.py +0 -0
  135. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_test_commands.py +0 -0
  136. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_test_execution.py +0 -0
  137. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_test_pairing.py +0 -0
  138. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_tokens.py +0 -0
  139. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_tool_adapters.py +0 -0
  140. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_trends.py +0 -0
  141. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_user_config.py +0 -0
  142. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_verdict_adapters.py +0 -0
  143. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_verification.py +0 -0
  144. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_work_order.py +0 -0
  145. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_work_order_view.py +0 -0
  146. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_work_order_weights.py +0 -0
  147. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_xml.py +0 -0
  148. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/baseline.py +0 -0
  149. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/config.py +0 -0
  150. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/deadcode.py +0 -0
  151. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/declarations.py +0 -0
  152. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/duplication.py +0 -0
  153. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/evidence.py +0 -0
  154. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/git_tools.py +0 -0
  155. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/history.py +0 -0
  156. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/idioms.py +0 -0
  157. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/instructions.py +0 -0
  158. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/mcp_server.py +0 -0
  159. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/metrics.py +0 -0
  160. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/prompts.py +0 -0
  161. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/renderers.py +0 -0
  162. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/report.py +0 -0
  163. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/sarif.py +0 -0
  164. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/scoring.py +0 -0
  165. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/similarity.py +0 -0
  166. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/source.py +0 -0
  167. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_clone_names_every_copy.py +0 -0
  168. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_dangling_source_link_is_named_not_fatal.py +0 -0
  169. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_format_override_is_disclosed.py +0 -0
  170. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_matching_format_stays_silent.py +0 -0
  171. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_published_question_offers_what_it_accepts.py +0 -0
  172. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_rendered_docs_site_is_not_scored_as_source.py +0 -0
  173. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_setup_question_keeps_its_contract.py +0 -0
  174. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_acquisition_trust.py +0 -0
  175. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_adapter_docs.py +0 -0
  176. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_adapter_recordings.py +0 -0
  177. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_adapters.py +0 -0
  178. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_added_lines.py +0 -0
  179. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_an_absent_work_order_renders_nothing.py +0 -0
  180. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_an_unmeasured_pillar_reports_no_number.py +0 -0
  181. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analysis_coverage.py +0 -0
  182. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analysis_execution.py +0 -0
  183. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_bridge.py +0 -0
  184. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_config_isolation.py +0 -0
  185. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_estimate_claims.py +0 -0
  186. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_file_lists_are_batched.py +0 -0
  187. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_pinning.py +0 -0
  188. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_primary_estimate.py +0 -0
  189. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_provenance.py +0 -0
  190. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_provenance_exclusions.py +0 -0
  191. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_scoring_path.py +0 -0
  192. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_spread_range.py +0 -0
  193. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_xml_bounds.py +0 -0
  194. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzers_against_the_real_tools.py +0 -0
  195. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzers_never_write.py +0 -0
  196. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzers_report_what_actually_failed.py +0 -0
  197. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_anchor_and_mode.py +0 -0
  198. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_anchor_caveat_and_counts_follow_the_run.py +0 -0
  199. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_anchor_disclosure.py +0 -0
  200. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_annotations_match_behaviour.py +0 -0
  201. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_anticipated_refusals.py +0 -0
  202. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_architecture.py +0 -0
  203. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_artifact_write_route_class.py +0 -0
  204. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_aspect_coverage.py +0 -0
  205. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_asset_snapshot_class.py +0 -0
  206. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_ast_reading_resolves_spellings.py +0 -0
  207. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_attestation.py +0 -0
  208. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_audit_components.py +0 -0
  209. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_authorization_freshness.py +0 -0
  210. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_authorship_gates.py +0 -0
  211. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_backfill.py +0 -0
  212. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_band_concealment_class.py +0 -0
  213. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_band_concealment_p3.py +0 -0
  214. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_band_pressures.py +0 -0
  215. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_bands.py +0 -0
  216. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_behaviour_suites_are_tests.py +0 -0
  217. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_body_or_signature_class.py +0 -0
  218. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_both_setup_paths_ask_the_same_stage.py +0 -0
  219. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_build_output_is_not_the_repositorys_code.py +0 -0
  220. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_c_declarations.py +0 -0
  221. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_calibration_corpus.py +0 -0
  222. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_calibration_drift.py +0 -0
  223. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_calibration_tooling.py +0 -0
  224. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_catalog_selection.py +0 -0
  225. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_catalog_tier_promise.py +0 -0
  226. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_changed_code_policy.py +0 -0
  227. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_chat_leads_with_the_work_order.py +0 -0
  228. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_chat_primary_docs.py +0 -0
  229. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_check_refuses_plus_only_fragments.py +0 -0
  230. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_checkstyle_adapter.py +0 -0
  231. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_checkstyle_catalog.py +0 -0
  232. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_child_sandbox.py +0 -0
  233. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_ci_history_recipe.py +0 -0
  234. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_ci_installs_the_analyzer_pool.py +0 -0
  235. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_claimed_languages.py +0 -0
  236. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_clean_sees_the_weakened_oracle.py +0 -0
  237. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_cli.py +0 -0
  238. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_clone_group_class.py +0 -0
  239. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_cobol_declarations.py +0 -0
  240. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_code_scanning_gets_alerts_not_the_record.py +0 -0
  241. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_cognitive_complexity.py +0 -0
  242. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_cohesion_with_nothing_to_read_is_not_applicable.py +0 -0
  243. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_cohort_statistics.py +0 -0
  244. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_concealment_properties.py +0 -0
  245. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_config_shape.py +0 -0
  246. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_conformance_reads_the_operators_ask.py +0 -0
  247. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_consent_and_grant.py +0 -0
  248. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_consent_is_per_repository.py +0 -0
  249. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_consent_survives_setup_and_is_asked.py +0 -0
  250. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_consent_without_command_has_a_remedy.py +0 -0
  251. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_consumer_migration.py +0 -0
  252. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_contract_claims.py +0 -0
  253. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_corpus_note_counts_come_from_the_corpus.py +0 -0
  254. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_corroborate.py +0 -0
  255. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_coverage_by_language.py +0 -0
  256. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_coverage_config_reaches_children.py +0 -0
  257. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_coverage_formats.py +0 -0
  258. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_cpp_declarations.py +0 -0
  259. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_criteria_completion.py +0 -0
  260. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_csharp_declarations.py +0 -0
  261. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_current_state_docs_name_every_parsed_language.py +0 -0
  262. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_d15_composition.py +0 -0
  263. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_d15_goal_directed.py +0 -0
  264. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_dead_code.py +0 -0
  265. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declaration_criteria_scope.py +0 -0
  266. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declaration_edge_cases.py +0 -0
  267. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declaration_grading.py +0 -0
  268. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declaration_ranges.py +0 -0
  269. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declaration_source.py +0 -0
  270. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declarative_parsers.py +0 -0
  271. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declared_capabilities_match_the_delegate.py +0 -0
  272. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declared_imports.py +0 -0
  273. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_delegated_security_pillar.py +0 -0
  274. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_demo_tree.py +0 -0
  275. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_derivation_mix.py +0 -0
  276. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_determinism.py +0 -0
  277. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_dimension_ratchet.py +0 -0
  278. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_direct_runner_availability_class.py +0 -0
  279. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_discovery.py +0 -0
  280. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_doc_claims.py +0 -0
  281. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_docs_links.py +0 -0
  282. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_economic_context.py +0 -0
  283. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_empty_output_not_clean.py +0 -0
  284. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_empty_output_not_clean_adapters.py +0 -0
  285. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_environment_work_order.py +0 -0
  286. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_built_presentation_is_offered.py +0 -0
  287. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_job_tests_the_pinned_oracle.py +0 -0
  288. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_language_counts_its_own_loop.py +0 -0
  289. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_language_has_a_loop_fixture.py +0 -0
  290. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_pool_install_is_the_same_pool.py +0 -0
  291. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_question_can_be_answered.py +0 -0
  292. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_surface_says_what_the_run_found.py +0 -0
  293. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_evidence_invariants.py +0 -0
  294. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_evidence_normalization.py +0 -0
  295. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_evidence_properties.py +0 -0
  296. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_example_config_opens_claimed_languages.py +0 -0
  297. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_exclude_additional_keeps_the_defaults.py +0 -0
  298. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_exclusion_dialects.py +0 -0
  299. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_exposure_never_outranks_band.py +0 -0
  300. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_falsifier_standard.py +0 -0
  301. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_file_list_cap_class.py +0 -0
  302. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_finding_identity.py +0 -0
  303. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_first_run_elicitation.py +0 -0
  304. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_first_run_prompt.py +0 -0
  305. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_first_run_reelicitation.py +0 -0
  306. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_first_stage_setup_wording_holds.py +0 -0
  307. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_fix_breadth_window.py +0 -0
  308. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_fixed_form_fortran.py +0 -0
  309. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_format_ask.py +0 -0
  310. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_fortran_declarations.py +0 -0
  311. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_fortran_metrics.py +0 -0
  312. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_fortran_practice.py +0 -0
  313. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_git_argv.py +0 -0
  314. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_git_read_only.py +0 -0
  315. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_git_readonly_class.py +0 -0
  316. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_go_declarations.py +0 -0
  317. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_grammar_constructs.py +0 -0
  318. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_grammar_token_coverage.py +0 -0
  319. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_grant_only_user_tier.py +0 -0
  320. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_grok_audit_of_3_11.py +0 -0
  321. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_history.py +0 -0
  322. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_history_boundary.py +0 -0
  323. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_history_manifest.py +0 -0
  324. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_history_schema2.py +0 -0
  325. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_history_window.py +0 -0
  326. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_hostile_prompt.py +0 -0
  327. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_html_executive.py +0 -0
  328. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_html_section_parity_class.py +0 -0
  329. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_identity_docs.py +0 -0
  330. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_identity_resolution.py +0 -0
  331. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_idiom_divergence.py +0 -0
  332. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_in_loop_budgets.py +0 -0
  333. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_in_loop_check.py +0 -0
  334. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_installed_wheel_runtime.py +0 -0
  335. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_instruction_targets.py +0 -0
  336. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_java_range_guard.py +0 -0
  337. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_java_ranges.py +0 -0
  338. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_java_scored.py +0 -0
  339. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_java_wiring.py +0 -0
  340. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_js_complexity_operators.py +0 -0
  341. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_js_declarations.py +0 -0
  342. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_kotlin_declarations.py +0 -0
  343. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_kotlin_metrics.py +0 -0
  344. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_language_coverage.py +0 -0
  345. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_language_support_honesty.py +0 -0
  346. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_list_tools_publishes_the_answer_path.py +0 -0
  347. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_maintenance_signals.py +0 -0
  348. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_mcp_baseline_payload.py +0 -0
  349. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_mcp_format_contract.py +0 -0
  350. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_mcp_history.py +0 -0
  351. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_mcp_server.py +0 -0
  352. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_mcp_start_failure_names_what_is_installed.py +0 -0
  353. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_migration_1_0.py +0 -0
  354. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_missing_security_scanners_are_named_before_the_run.py +0 -0
  355. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_mutation_recorded.py +0 -0
  356. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_near_duplicates.py +0 -0
  357. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_network_disclosure.py +0 -0
  358. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_no_private_names.py +0 -0
  359. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_one_setup_across_surfaces_class.py +0 -0
  360. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_operator_named_paths.py +0 -0
  361. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_oracle_weakening_precision_bar.py +0 -0
  362. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pairing_reads_imports.py +0 -0
  363. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pattern_budget.py +0 -0
  364. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_phase6_claims.py +0 -0
  365. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_php_declarations.py +0 -0
  366. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pillars_and_practice.py +0 -0
  367. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pipeline_results.py +0 -0
  368. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pmd_adapter.py +0 -0
  369. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pmd_audit_closures.py +0 -0
  370. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_policy_claims.py +0 -0
  371. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pool_runs_by_config.py +0 -0
  372. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_population_floors.py +0 -0
  373. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_practice_nested_gates_class.py +0 -0
  374. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_precommit_staged.py +0 -0
  375. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_preflight_before_consent_runs_nothing_from_the_tree.py +0 -0
  376. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_presentation_refusals.py +0 -0
  377. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_previous_release_reached_pypi.py +0 -0
  378. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_promises.py +0 -0
  379. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_prompt_does_not_issue_rates_when_unscored.py +0 -0
  380. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_prompt_escalation_once.py +0 -0
  381. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_prompt_honesty.py +0 -0
  382. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_prompt_location_escalation_class.py +0 -0
  383. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_prove_falsifiers.py +0 -0
  384. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_python_complexity.py +0 -0
  385. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_python_declarations.py +0 -0
  386. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_read_boundary.py +0 -0
  387. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_readme_claims.py +0 -0
  388. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_recurrence.py +0 -0
  389. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_regular_file_reads_work_without_o_nonblock.py +0 -0
  390. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_release_needs_an_empty_ledger.py +0 -0
  391. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_release_plan.py +0 -0
  392. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_release_plan_status.py +0 -0
  393. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_rendered_docs.py +0 -0
  394. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_report_remedy_copy.py +0 -0
  395. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_reported_but_not_scored.py +0 -0
  396. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_root_grants.py +0 -0
  397. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_rubric_ignores_project_lint_config.py +0 -0
  398. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_ruby_declarations.py +0 -0
  399. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_run_comparison.py +0 -0
  400. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_runner.py +0 -0
  401. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_rust_declarations.py +0 -0
  402. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_sarif.py +0 -0
  403. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scan_history.py +0 -0
  404. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scan_scope.py +0 -0
  405. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scanner_fingerprint_covers_the_measurement_path.py +0 -0
  406. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scanner_unsafe_direction.py +0 -0
  407. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scanning.py +0 -0
  408. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_schema_fidelity.py +0 -0
  409. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scope_conformance.py +0 -0
  410. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scoring_calibration.py +0 -0
  411. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_security_delegate_versions_agree.py +0 -0
  412. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_security_findings_keep_their_handoff.py +0 -0
  413. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_security_pillar_asserts_a_scanner_set.py +0 -0
  414. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_security_pillar_runs_and_shows.py +0 -0
  415. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_selection_covers_every_parsed_language.py +0 -0
  416. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_semantic_findings_stay_inside_the_audited_files.py +0 -0
  417. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_semantic_policy.py +0 -0
  418. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_setup_answers_are_the_same_setup.py +0 -0
  419. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_setup_gate_completeness.py +0 -0
  420. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_setup_gate_independent_contract.py +0 -0
  421. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_setup_instruction_describes_its_own_reply.py +0 -0
  422. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_setup_precondition.py +0 -0
  423. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_setup_writes_a_valid_config.py +0 -0
  424. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_shell_declarations.py +0 -0
  425. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_shell_metrics.py +0 -0
  426. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_skill_install.py +0 -0
  427. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_sonar_resolve.py +0 -0
  428. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_source_index.py +0 -0
  429. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_spotbugs_adapter.py +0 -0
  430. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_spotbugs_catalog.py +0 -0
  431. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_stage8_contract.py +0 -0
  432. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_stamped_documents_stay_honest.py +0 -0
  433. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_stdout_outputs.py +0 -0
  434. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_swift_declarations.py +0 -0
  435. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_tdd_structure.py +0 -0
  436. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_terminal_asks_the_same_questions.py +0 -0
  437. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_test_commands.py +0 -0
  438. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_test_execution_class.py +0 -0
  439. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_agent_knows_when_it_is_stale.py +0 -0
  440. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_changelog_covers_the_shipping_version.py +0 -0
  441. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_chat_payload_has_a_budget.py +0 -0
  442. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_condition_says_what_it_measured.py +0 -0
  443. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_handoff_rules_are_their_own_module.py +0 -0
  444. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_pillar_row_reads_cleanly.py +0 -0
  445. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_presentation_question_stays_answerable.py +0 -0
  446. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_previous_release_was_tagged.py +0 -0
  447. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_prompt_does_not_take_back_what_it_withheld.py +0 -0
  448. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_prompt_keeps_listing_what_it_did_not_withhold.py +0 -0
  449. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_release_process_describes_itself.py +0 -0
  450. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_release_record_stays_well_formed.py +0 -0
  451. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_report_is_saved_not_sent.py +0 -0
  452. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_security_run_has_a_configurable_limit.py +0 -0
  453. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_security_work_order_is_drawn.py +0 -0
  454. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_suite_names_the_program_it_ran.py +0 -0
  455. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_tree_cannot_redirect_a_read.py +0 -0
  456. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_version_has_one_source.py +0 -0
  457. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_three_presentations.py +0 -0
  458. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_tool_resolution.py +0 -0
  459. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_tree_cannot_opt_the_host_in.py +0 -0
  460. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_tree_chosen_spawn.py +0 -0
  461. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_tree_reads_use_the_primitive.py +0 -0
  462. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_trends.py +0 -0
  463. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_type_fields_not_functions_class.py +0 -0
  464. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_uat_falsifiers.py +0 -0
  465. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_unanchored_set_matches_corpus.py +0 -0
  466. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_unread_code.py +0 -0
  467. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_user_config_tier.py +0 -0
  468. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_verification_audit_closures.py +0 -0
  469. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_verified_grade.py +0 -0
  470. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_version_claim.py +0 -0
  471. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_version_stamping.py +0 -0
  472. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_wheel_contents.py +0 -0
  473. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_withheld_work_keeps_its_boundary.py +0 -0
  474. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_work_items_state_their_own_finding.py +0 -0
  475. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_work_order.py +0 -0
  476. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_work_order_binds_to_this_interpreter.py +0 -0
  477. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_work_order_items.py +0 -0
  478. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_work_order_selection.py +0 -0
  479. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_write_boundary.py +0 -0
  480. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_write_route_class.py +0 -0
  481. {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_written_record.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maintainability-agent
3
- Version: 4.4.1
3
+ Version: 4.4.2
4
4
  Summary: Maintainability gate and AI remediation prompt generator for CI.
5
5
  Author: Marshall Guillory
6
6
  License: MIT
@@ -47,7 +47,7 @@ Dynamic: license-file
47
47
  **A deterministic, offline maintainability audit whose output is a _bounded
48
48
  work order_ for an AI coding agent** — a copy-paste prompt, per finding, that
49
49
  says *fix exactly these and refactor nothing else*. Chat-primary; CLI for CI.
50
- Version **4.4.1**.
50
+ Version **4.4.2**.
51
51
 
52
52
  > ## **Calibrated against 201 mature open-source repositories in fifteen languages.**
53
53
  >
@@ -488,7 +488,8 @@ and is now the dominant failure in the probe, which is why the count moved. The
488
488
  bounded, symlink-refusing write works through a *file descriptor*, so a validated
489
489
  path cannot be swapped for a symlink before the write lands — Windows has no
490
490
  equivalent and the portable rewrite is the hole. **An unsupported platform never
491
- buys green by weakening the supported ones.**
491
+ buys green by weakening the supported ones.** Windows is not run in CI at all
492
+ (Decision 18); a Windows user who hits a problem can open an issue or a pull request.
492
493
 
493
494
  ## Invokable skill / slash command
494
495
 
@@ -501,7 +502,11 @@ Copilot Chat:
501
502
  maintainability-agent --install-skill # writes ~/.claude/skills
502
503
  ```
503
504
 
504
- Re-run it after every upgrade — a drifted skill teaches agents a dead workflow,
505
+ `maintainability-agent --update` upgrades the install to the newest release —
506
+ never a downgrade — re-syncs the skill, and says when the MCP server needs a
507
+ restart; `maintainability-agent --install-updater` runs it hourly (macOS launch
508
+ agent). Run `--install-skill` by hand after any other upgrade — a drifted skill
509
+ teaches agents a dead workflow,
505
510
  so a differing installed copy is refused with the list of differences. Per-host
506
511
  install destinations, and `--init-agent-standards` for always-on guidance
507
512
  instead of an invokable skill:
@@ -512,7 +517,7 @@ instead of an invokable skill:
512
517
  This repo ships `action.yml`, usable as a composite action:
513
518
 
514
519
  ```yaml
515
- - uses: marshallguillory86/maintainability-agent@v4.4.1
520
+ - uses: marshallguillory86/maintainability-agent@v4.4.2
516
521
  with:
517
522
  config: maintainability-agent.json
518
523
  changed-only: main...HEAD
@@ -5,7 +5,7 @@
5
5
  **A deterministic, offline maintainability audit whose output is a _bounded
6
6
  work order_ for an AI coding agent** — a copy-paste prompt, per finding, that
7
7
  says *fix exactly these and refactor nothing else*. Chat-primary; CLI for CI.
8
- Version **4.4.1**.
8
+ Version **4.4.2**.
9
9
 
10
10
  > ## **Calibrated against 201 mature open-source repositories in fifteen languages.**
11
11
  >
@@ -446,7 +446,8 @@ and is now the dominant failure in the probe, which is why the count moved. The
446
446
  bounded, symlink-refusing write works through a *file descriptor*, so a validated
447
447
  path cannot be swapped for a symlink before the write lands — Windows has no
448
448
  equivalent and the portable rewrite is the hole. **An unsupported platform never
449
- buys green by weakening the supported ones.**
449
+ buys green by weakening the supported ones.** Windows is not run in CI at all
450
+ (Decision 18); a Windows user who hits a problem can open an issue or a pull request.
450
451
 
451
452
  ## Invokable skill / slash command
452
453
 
@@ -459,7 +460,11 @@ Copilot Chat:
459
460
  maintainability-agent --install-skill # writes ~/.claude/skills
460
461
  ```
461
462
 
462
- Re-run it after every upgrade — a drifted skill teaches agents a dead workflow,
463
+ `maintainability-agent --update` upgrades the install to the newest release —
464
+ never a downgrade — re-syncs the skill, and says when the MCP server needs a
465
+ restart; `maintainability-agent --install-updater` runs it hourly (macOS launch
466
+ agent). Run `--install-skill` by hand after any other upgrade — a drifted skill
467
+ teaches agents a dead workflow,
463
468
  so a differing installed copy is refused with the list of differences. Per-host
464
469
  install destinations, and `--init-agent-standards` for always-on guidance
465
470
  instead of an invokable skill:
@@ -470,7 +475,7 @@ instead of an invokable skill:
470
475
  This repo ships `action.yml`, usable as a composite action:
471
476
 
472
477
  ```yaml
473
- - uses: marshallguillory86/maintainability-agent@v4.4.1
478
+ - uses: marshallguillory86/maintainability-agent@v4.4.2
474
479
  with:
475
480
  config: maintainability-agent.json
476
481
  changed-only: main...HEAD
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maintainability-agent
3
- Version: 4.4.1
3
+ Version: 4.4.2
4
4
  Summary: Maintainability gate and AI remediation prompt generator for CI.
5
5
  Author: Marshall Guillory
6
6
  License: MIT
@@ -47,7 +47,7 @@ Dynamic: license-file
47
47
  **A deterministic, offline maintainability audit whose output is a _bounded
48
48
  work order_ for an AI coding agent** — a copy-paste prompt, per finding, that
49
49
  says *fix exactly these and refactor nothing else*. Chat-primary; CLI for CI.
50
- Version **4.4.1**.
50
+ Version **4.4.2**.
51
51
 
52
52
  > ## **Calibrated against 201 mature open-source repositories in fifteen languages.**
53
53
  >
@@ -488,7 +488,8 @@ and is now the dominant failure in the probe, which is why the count moved. The
488
488
  bounded, symlink-refusing write works through a *file descriptor*, so a validated
489
489
  path cannot be swapped for a symlink before the write lands — Windows has no
490
490
  equivalent and the portable rewrite is the hole. **An unsupported platform never
491
- buys green by weakening the supported ones.**
491
+ buys green by weakening the supported ones.** Windows is not run in CI at all
492
+ (Decision 18); a Windows user who hits a problem can open an issue or a pull request.
492
493
 
493
494
  ## Invokable skill / slash command
494
495
 
@@ -501,7 +502,11 @@ Copilot Chat:
501
502
  maintainability-agent --install-skill # writes ~/.claude/skills
502
503
  ```
503
504
 
504
- Re-run it after every upgrade — a drifted skill teaches agents a dead workflow,
505
+ `maintainability-agent --update` upgrades the install to the newest release —
506
+ never a downgrade — re-syncs the skill, and says when the MCP server needs a
507
+ restart; `maintainability-agent --install-updater` runs it hourly (macOS launch
508
+ agent). Run `--install-skill` by hand after any other upgrade — a drifted skill
509
+ teaches agents a dead workflow,
505
510
  so a differing installed copy is refused with the list of differences. Per-host
506
511
  install destinations, and `--init-agent-standards` for always-on guidance
507
512
  instead of an invokable skill:
@@ -512,7 +517,7 @@ instead of an invokable skill:
512
517
  This repo ships `action.yml`, usable as a composite action:
513
518
 
514
519
  ```yaml
515
- - uses: marshallguillory86/maintainability-agent@v4.4.1
520
+ - uses: marshallguillory86/maintainability-agent@v4.4.2
516
521
  with:
517
522
  config: maintainability-agent.json
518
523
  changed-only: main...HEAD
@@ -104,6 +104,7 @@ src/maintainability_audit/_second_source.py
104
104
  src/maintainability_audit/_security_delegate.py
105
105
  src/maintainability_audit/_security_work_order.py
106
106
  src/maintainability_audit/_selection.py
107
+ src/maintainability_audit/_self_update.py
107
108
  src/maintainability_audit/_semantic.py
108
109
  src/maintainability_audit/_semantic_policy.py
109
110
  src/maintainability_audit/_semantic_ts.py
@@ -222,6 +223,7 @@ tests/test_checkstyle_catalog.py
222
223
  tests/test_child_sandbox.py
223
224
  tests/test_ci_history_recipe.py
224
225
  tests/test_ci_installs_the_analyzer_pool.py
226
+ tests/test_ci_runs_once.py
225
227
  tests/test_claimed_languages.py
226
228
  tests/test_clean_sees_the_weakened_oracle.py
227
229
  tests/test_cli.py
@@ -334,6 +336,7 @@ tests/test_kotlin_metrics.py
334
336
  tests/test_language_coverage.py
335
337
  tests/test_language_support_honesty.py
336
338
  tests/test_list_tools_publishes_the_answer_path.py
339
+ tests/test_local_gate.py
337
340
  tests/test_maintenance_signals.py
338
341
  tests/test_mcp_baseline_payload.py
339
342
  tests/test_mcp_format_contract.py
@@ -405,6 +408,7 @@ tests/test_security_findings_keep_their_handoff.py
405
408
  tests/test_security_pillar_asserts_a_scanner_set.py
406
409
  tests/test_security_pillar_runs_and_shows.py
407
410
  tests/test_selection_covers_every_parsed_language.py
411
+ tests/test_self_update.py
408
412
  tests/test_semantic_findings_stay_inside_the_audited_files.py
409
413
  tests/test_semantic_policy.py
410
414
  tests/test_setup_answers_are_the_same_setup.py
@@ -1,3 +1,3 @@
1
1
  """Maintainability Audit CI."""
2
2
 
3
- __version__ = "4.4.1"
3
+ __version__ = "4.4.2"
@@ -212,6 +212,24 @@ def _add_setup_actions(parser: argparse.ArgumentParser) -> None:
212
212
  "own without asking, because that is an upgrade. Honours "
213
213
  "core.hooksPath.",
214
214
  )
215
+ parser.add_argument(
216
+ "--update", action="store_true",
217
+ help="Upgrade this install to the newest release (never a downgrade), "
218
+ "re-sync the skill, and say when the MCP server needs a restart.",
219
+ )
220
+ parser.add_argument(
221
+ "--install-updater", action="store_true",
222
+ help="Write the hourly launch agent that runs --update (macOS), "
223
+ "replacing the legacy one.",
224
+ )
225
+ parser.add_argument(
226
+ "--home", default=None, metavar="DIR",
227
+ help="With --install-updater: the home directory to write into (default: ~).",
228
+ )
229
+ parser.add_argument(
230
+ "--no-launchctl", action="store_true",
231
+ help="With --install-updater: write the agent without loading it.",
232
+ )
215
233
  parser.add_argument(
216
234
  "--skills-dir", default=None, metavar="DIR",
217
235
  help="Where --install-skill writes (default: ~/.claude/skills).",
@@ -0,0 +1,126 @@
1
+ """Keep the local install current: ``--update`` and ``--install-updater``.
2
+
3
+ The updater used to be an untracked script beside the venv, run by a launch
4
+ agent. It trusted PyPI's ``info.version``, which lags a release, and on
5
+ 2026-09-22 it *downgraded* 3.7.29 to 3.7.19; it never re-synced the skill the
6
+ README says to sync after every upgrade; and nothing tested it (D230).
7
+
8
+ Now it is a product command. The installer resolves the version — ``pip
9
+ install --upgrade`` picks the highest release the index lists and never moves
10
+ backwards — so this module holds no HTTP client and reads no release feed
11
+ (P1: analysis touches no network; updating is an operator action, like tool
12
+ acquisition). Every child process goes through ``_runner.run`` (rule 7). A
13
+ version that comes back lower than before is reported, never accepted
14
+ silently; a higher one re-syncs the skill and records that the MCP server,
15
+ which holds the code it loaded at spawn, needs a restart.
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import plistlib
21
+ import re
22
+ import sys
23
+ from dataclasses import dataclass
24
+ from pathlib import Path
25
+
26
+ from . import _runner
27
+
28
+ PACKAGE = "maintainability-agent"
29
+ #: The launch agent, named for the product and the component (reverse DNS of
30
+ #: the project's home), replacing the personal-prefix label it had before.
31
+ LABEL = "io.github.marshallguillory86.maintainability-agent.update"
32
+ LEGACY_LABEL = "com.marshallguillory.maintainability-agent-update"
33
+ _VERSION_CODE = f"import importlib.metadata as m; print(m.version({PACKAGE!r}))"
34
+
35
+
36
+ @dataclass(frozen=True)
37
+ class UpdateResult:
38
+ before: str
39
+ after: str
40
+ skill_synced: bool
41
+ restart_needed: bool
42
+ error: str | None
43
+ message: str
44
+
45
+
46
+ def _key(version: str) -> tuple:
47
+ """Release ordering for plain ``N.N.N`` versions; a suffix sorts before
48
+ the release it precedes (``4.4.1rc1`` < ``4.4.1``)."""
49
+ parts = []
50
+ for piece in version.strip().split("."):
51
+ number = re.match(r"\d+", piece)
52
+ parts.append((int(number.group()) if number else 0, 1 if number and number.end() == len(piece) else 0))
53
+ return tuple(parts)
54
+
55
+
56
+ def _state_dir(home: Path) -> Path:
57
+ return home / ".local" / "share" / "maintainability-agent"
58
+
59
+
60
+ def _run(argv: list[str]) -> _runner.ToolResult:
61
+ return _runner.run("self-update", _runner.Invocation(argv=tuple(argv)), timeout_seconds=600)
62
+
63
+
64
+ def _installed(python: str) -> str:
65
+ return (_run([python, "-c", _VERSION_CODE]).stdout or "").strip()
66
+
67
+
68
+ def update(python: str, uv: str | None, home: Path) -> UpdateResult:
69
+ before = _installed(python)
70
+ if uv:
71
+ argv = [uv, "pip", "install", "--python", python, "--upgrade", PACKAGE]
72
+ else:
73
+ argv = [python, "-m", "pip", "install", "--upgrade", PACKAGE]
74
+ installed = _run(argv)
75
+ after = _installed(python)
76
+ if not installed.usable:
77
+ return UpdateResult(before, after, False, False, f"install failed: {installed.detail}",
78
+ f"Update failed; still on {before}.")
79
+ if _key(after) < _key(before):
80
+ return UpdateResult(before, after, False, False,
81
+ f"version went down from {before} to {after}",
82
+ f"Refused: the install moved {before} to {after}, a downgrade.")
83
+ if _key(after) == _key(before):
84
+ return UpdateResult(before, after, False, False, None, f"Already up to date ({after}).")
85
+ _run([python, "-m", "maintainability_audit", "--install-skill"])
86
+ state = _state_dir(home)
87
+ state.mkdir(parents=True, exist_ok=True)
88
+ (state / ".pending-restart").write_text(after + "\n", encoding="utf-8")
89
+ return UpdateResult(before, after, True, True, None,
90
+ f"Updated {before} -> {after}; skill re-synced. "
91
+ "Restart the MCP server to use it (/mcp in Claude Code).")
92
+
93
+
94
+ def update_action() -> int:
95
+ result = update(sys.executable, _runner.locate("uv"), Path.home())
96
+ print(result.message, file=sys.stderr if result.error else sys.stdout)
97
+ return 1 if result.error else 0
98
+
99
+
100
+ def install_updater(home: Path, *, launchctl: bool = True) -> int:
101
+ """Write the hourly launch agent that runs ``--update``; remove the
102
+ legacy one so two updaters never run."""
103
+ agents = home / "Library" / "LaunchAgents"
104
+ agents.mkdir(parents=True, exist_ok=True)
105
+ legacy = agents / f"{LEGACY_LABEL}.plist"
106
+ if legacy.exists():
107
+ if launchctl:
108
+ _run(["launchctl", "unload", str(legacy)])
109
+ legacy.unlink()
110
+ state = _state_dir(home)
111
+ state.mkdir(parents=True, exist_ok=True)
112
+ plist = agents / f"{LABEL}.plist"
113
+ plist.write_bytes(plistlib.dumps({
114
+ "Label": LABEL,
115
+ "ProgramArguments": [sys.executable, "-m", "maintainability_audit", "--update"],
116
+ "StartInterval": 3600,
117
+ "RunAtLoad": True,
118
+ "ProcessType": "Background",
119
+ "LowPriorityIO": True,
120
+ "StandardOutPath": str(state / "update.out.log"),
121
+ "StandardErrorPath": str(state / "update.err.log"),
122
+ }))
123
+ if launchctl:
124
+ _run(["launchctl", "load", str(plist)])
125
+ print(f"installed {plist}")
126
+ return 0
@@ -393,6 +393,15 @@ def _action_before_config(
393
393
  """
394
394
  if args.install_skill:
395
395
  return _install_skill_action(args)
396
+ if args.update:
397
+ from ._self_update import update_action
398
+
399
+ return update_action()
400
+ if args.install_updater:
401
+ from ._self_update import install_updater
402
+
403
+ home = Path(args.home).expanduser() if args.home else Path.home()
404
+ return install_updater(home, launchctl=not args.no_launchctl)
396
405
  if args.install_precommit_hook:
397
406
  from ._precommit_install import install_precommit_hook
398
407
 
@@ -0,0 +1,98 @@
1
+ """Written by the Claude Sonnet test seat (Codex at its usage limit); Codex reviews.
2
+
3
+ His words: 'The CI is ridiculously unacceptable'. The evidence: Quality Gates
4
+ ran twice per PR (push on every branch plus pull_request), MA audited itself
5
+ twice (maintainability.yml plus the Quality Gates audit job), a Windows probe
6
+ failed every run while blocking nothing, and Sonar ran on every PR.
7
+
8
+ The required checks must still run on every pull_request, or merges deadlock;
9
+ that guard lives in test_workflow_supply_chain.py.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import re
15
+ from pathlib import Path
16
+
17
+ from _workflow_text import jobs, triggers
18
+
19
+ WORKFLOWS = Path(__file__).resolve().parents[1] / ".github" / "workflows"
20
+
21
+
22
+ def test_quality_gates_push_is_limited_to_main_so_a_pr_runs_once() -> None:
23
+ """No push trigger at all (his pipeline lint: a merge never re-runs
24
+ tests), or one limited to main."""
25
+ push = triggers("quality-gates.yml").get("push")
26
+ if push is None:
27
+ return
28
+ body = " ".join(s.strip() for s in push)
29
+ assert re.search(r"branches:\s*\[\s*main\s*\]", body) or (
30
+ "branches:" in body and re.search(r"-\s*main\b", body)
31
+ ), f"push must be absent or restricted to branches: [main]; got {body!r}"
32
+
33
+
34
+ def test_maintainability_workflow_does_not_audit_every_pull_request_again() -> None:
35
+ assert "pull_request" not in triggers("maintainability.yml")
36
+
37
+
38
+ def test_no_windows_job_runs_at_all() -> None:
39
+ """Decision 18 (his words: "just turn this shit off"): Windows is not
40
+ tested in CI; Windows users report problems as issues or PRs."""
41
+ assert "probe-windows" not in jobs("quality-gates.yml")
42
+ for path in WORKFLOWS.glob("*.yml"):
43
+ assert "windows-" not in path.read_text(encoding="utf-8"), path.name
44
+
45
+
46
+ def test_sonar_does_not_run_on_pull_requests() -> None:
47
+ condition = jobs("quality-gates.yml")["sonar"]["if"]
48
+ assert condition, "sonar needs an `if:`"
49
+ assert "pull_request" not in condition
50
+
51
+
52
+ def _runs_on_pull_request(condition: str) -> bool:
53
+ """True when an `if:` leaves the job running on pull_request."""
54
+ if not condition:
55
+ return True
56
+ if "!= 'pull_request'" in condition:
57
+ return False
58
+ return "pull_request" in condition or "!= 'push'" in condition
59
+
60
+
61
+ def _job_bodies(workflow: str) -> dict[str, str]:
62
+ """Job id -> the job's raw text, so a test can read `runs-on` and steps."""
63
+ from _workflow_text import _code_lines, _sub_blocks, _top_block
64
+
65
+ blocks = _sub_blocks(_top_block(_code_lines(workflow), "jobs"), 2)
66
+ return {job_id: "\n".join(body) for job_id, body in blocks.items()}
67
+
68
+
69
+ def test_no_macos_job_runs_in_ci() -> None:
70
+ """His decision (2026-10-15, option 1): each test runs once, on Linux
71
+ `verify`. macOS is covered by the local gate on his Mac."""
72
+ assert "verify-macos" not in jobs("quality-gates.yml")
73
+ for path in WORKFLOWS.glob("*.yml"):
74
+ for job_id, job in jobs(path.name).items():
75
+ assert "macos" not in job["name"].lower(), f"{path.name}:{job_id} name"
76
+ for job_id, body in _job_bodies(path.name).items():
77
+ runs_on = re.findall(r"^\s*runs-on:\s*(.*)$", body, flags=re.M)
78
+ assert not any("macos" in value.lower() for value in runs_on), (
79
+ f"{path.name}:{job_id} runs on macOS"
80
+ )
81
+
82
+
83
+ def test_verify_does_not_run_on_a_merge_to_main() -> None:
84
+ """Tests run once, on the pull request; a push to main does not rerun them."""
85
+ condition = jobs("quality-gates.yml")["verify"]["if"]
86
+ assert condition, "verify needs an `if:` that excludes push"
87
+ assert "github.event_name != 'push'" in condition, condition
88
+
89
+
90
+ def test_exactly_one_job_runs_the_test_suite_on_pull_requests() -> None:
91
+ bodies = _job_bodies("quality-gates.yml")
92
+ conditions = jobs("quality-gates.yml")
93
+ runners = [
94
+ job_id
95
+ for job_id, body in bodies.items()
96
+ if "pytest" in body and _runs_on_pull_request(conditions[job_id]["if"])
97
+ ]
98
+ assert runners == ["verify"], f"jobs running pytest on pull_request: {runners}"
@@ -0,0 +1,187 @@
1
+ # Written by the Claude Sonnet test seat (Codex at its usage limit); Codex reviews.
2
+ # His decision 2026-10-15: macOS is verified by an enforced local gate, not a CI runner.
3
+ """The enforced local gate that is the macOS evidence.
4
+
5
+ `verify-macos` was removed from CI so each test runs once, on Linux. The
6
+ claim that macOS works now rests on a git pre-push hook that runs the
7
+ full suite on the maintainer's Mac. These tests pin the gate script, the
8
+ installer, and the contributor docs that point at them.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import os
14
+ import re
15
+ import shutil
16
+ import subprocess
17
+ from pathlib import Path
18
+
19
+ ROOT = Path(__file__).resolve().parents[1]
20
+ GATE = ROOT / "tools" / "local-gate.sh"
21
+ INSTALLER = ROOT / "tools" / "install-local-gate.sh"
22
+
23
+
24
+ def _logical_lines(path: Path) -> list[str]:
25
+ """Script lines with backslash continuations joined, comments dropped."""
26
+ text = path.read_text(encoding="utf-8").replace("\\\n", " ")
27
+ return [
28
+ " ".join(line.split()) for line in text.splitlines()
29
+ if line.strip() and not line.lstrip().startswith("#")
30
+ ]
31
+
32
+
33
+ def _git(cwd: Path, *args: str) -> subprocess.CompletedProcess[str]:
34
+ return subprocess.run(
35
+ ["git", *args], cwd=cwd, capture_output=True, text=True, check=False)
36
+
37
+
38
+ def _temp_repo(tmp_path: Path) -> Path:
39
+ repo = tmp_path / "repo"
40
+ (repo / "tools").mkdir(parents=True)
41
+ assert _git(repo, "init", "-q").returncode == 0
42
+ for script in (GATE, INSTALLER):
43
+ target = repo / "tools" / script.name
44
+ shutil.copy(script, target)
45
+ target.chmod(0o755)
46
+ return repo
47
+
48
+
49
+ def _install(repo: Path) -> subprocess.CompletedProcess[str]:
50
+ return subprocess.run(
51
+ ["bash", str(repo / "tools" / "install-local-gate.sh")],
52
+ cwd=repo, capture_output=True, text=True, check=False)
53
+
54
+
55
+ # -- 1. the gate script ---------------------------------------------------
56
+
57
+ def test_the_gate_script_exists_and_is_executable() -> None:
58
+ assert GATE.is_file(), "tools/local-gate.sh does not exist"
59
+ assert os.access(GATE, os.X_OK), "tools/local-gate.sh is not executable"
60
+
61
+
62
+ def test_the_gate_fails_fast() -> None:
63
+ lines = _logical_lines(GATE)
64
+ assert "set -euo pipefail" in lines
65
+
66
+
67
+ def test_the_gate_runs_from_the_repository_root() -> None:
68
+ text = GATE.read_text(encoding="utf-8")
69
+ assert re.search(r"^\s*cd\s.*\.\.", text, re.MULTILINE), (
70
+ "the gate must cd to the directory above its own location")
71
+ assert "BASH_SOURCE" in text or "$0" in text
72
+
73
+
74
+ def test_the_gate_lints_then_runs_the_whole_suite_with_coverage_floor() -> None:
75
+ lines = _logical_lines(GATE)
76
+ lint = [i for i, line in enumerate(lines) if line == "python3 -m ruff check src tests tools"]
77
+ suite = [i for i, line in enumerate(lines)
78
+ if re.search(r"python3 -m pytest\b", line)]
79
+ assert lint, f"no `python3 -m ruff check src tests tools` line: {lines}"
80
+ assert suite, f"no `python3 -m pytest` line: {lines}"
81
+ assert lint[0] < suite[0], "lint must run before the suite"
82
+ command = lines[suite[0]]
83
+ assert re.search(r"-n auto\b", command)
84
+ # Measure this tree by path. An installed copy of the package elsewhere on
85
+ # the machine (pip install --user) must never be measured: a package-name
86
+ # source counts both copies and reports a false low percentage.
87
+ tokens = command.split()
88
+ assert "--cov=src/maintainability_audit" in tokens
89
+ assert "--cov=maintainability_audit" not in tokens, (
90
+ "the gate must measure src/maintainability_audit by path, not by package name")
91
+ assert "--cov-fail-under=92" in command
92
+ assert not re.search(r"tests/\S+\.py", command), (
93
+ "the gate must run the whole suite, not named files")
94
+
95
+
96
+ # -- 2. the installer -----------------------------------------------------
97
+
98
+ def test_the_installer_exists_and_is_executable() -> None:
99
+ assert INSTALLER.is_file(), "tools/install-local-gate.sh does not exist"
100
+ assert os.access(INSTALLER, os.X_OK)
101
+
102
+
103
+ def test_the_installer_resolves_the_hooks_dir_through_git() -> None:
104
+ """`--git-common-dir`/hooks is the repository's own hooks folder in every
105
+ worktree. `--git-path hooks` follows a global core.hooksPath to a shared
106
+ dispatcher, which the installer must never write into; that dispatcher
107
+ runs `$(git rev-parse --git-common-dir)/hooks/<name>` itself."""
108
+ text = INSTALLER.read_text(encoding="utf-8")
109
+ assert "git rev-parse --git-common-dir" in text
110
+ assert "--git-path hooks" not in text
111
+
112
+
113
+ def test_the_installer_writes_an_executable_pre_push_hook(tmp_path: Path) -> None:
114
+ repo = _temp_repo(tmp_path)
115
+ result = _install(repo)
116
+ assert result.returncode == 0, result.stderr
117
+ hook = repo / ".git" / "hooks" / "pre-push"
118
+ assert hook.is_file()
119
+ assert os.access(hook, os.X_OK)
120
+ assert "tools/local-gate.sh" in hook.read_text(encoding="utf-8")
121
+
122
+
123
+ def test_the_installer_is_idempotent(tmp_path: Path) -> None:
124
+ repo = _temp_repo(tmp_path)
125
+ assert _install(repo).returncode == 0
126
+ hook = repo / ".git" / "hooks" / "pre-push"
127
+ first = hook.read_bytes()
128
+ again = _install(repo)
129
+ assert again.returncode == 0, again.stderr
130
+ assert hook.read_bytes() == first
131
+
132
+
133
+ def test_the_installer_will_not_overwrite_a_foreign_hook(tmp_path: Path) -> None:
134
+ repo = _temp_repo(tmp_path)
135
+ hooks = repo / ".git" / "hooks"
136
+ hooks.mkdir(exist_ok=True)
137
+ hook = hooks / "pre-push"
138
+ hook.write_text("#!/bin/sh\necho mine\n", encoding="utf-8")
139
+ hook.chmod(0o755)
140
+ before = hook.read_bytes()
141
+ result = _install(repo)
142
+ assert result.returncode != 0
143
+ assert hook.read_bytes() == before
144
+
145
+
146
+ def test_the_installed_hook_blocks_a_push_when_the_gate_fails(tmp_path: Path) -> None:
147
+ repo = _temp_repo(tmp_path)
148
+ assert _install(repo).returncode == 0
149
+ # Replace the copied gate with one that fails: the hook must propagate.
150
+ gate = repo / "tools" / "local-gate.sh"
151
+ gate.write_text("#!/usr/bin/env bash\nexit 7\n", encoding="utf-8")
152
+ gate.chmod(0o755)
153
+ hook = repo / ".git" / "hooks" / "pre-push"
154
+ result = subprocess.run(
155
+ [str(hook), "origin", "file:///nowhere"], cwd=repo, input="",
156
+ capture_output=True, text=True, check=False)
157
+ assert result.returncode != 0
158
+
159
+
160
+ def test_the_installed_hook_passes_when_the_gate_passes(tmp_path: Path) -> None:
161
+ repo = _temp_repo(tmp_path)
162
+ assert _install(repo).returncode == 0
163
+ gate = repo / "tools" / "local-gate.sh"
164
+ gate.write_text("#!/usr/bin/env bash\nexit 0\n", encoding="utf-8")
165
+ gate.chmod(0o755)
166
+ hook = repo / ".git" / "hooks" / "pre-push"
167
+ result = subprocess.run(
168
+ [str(hook), "origin", "file:///nowhere"], cwd=repo, input="",
169
+ capture_output=True, text=True, check=False)
170
+ assert result.returncode == 0, result.stderr
171
+
172
+
173
+ # -- 3. the contributor docs ---------------------------------------------
174
+
175
+ def test_contributing_tells_contributors_to_install_the_gate() -> None:
176
+ text = (ROOT / "CONTRIBUTING.md").read_text(encoding="utf-8")
177
+ assert "tools/install-local-gate.sh" in text
178
+
179
+
180
+ def test_contributing_says_the_pre_push_gate_verifies_macos() -> None:
181
+ text = (ROOT / "CONTRIBUTING.md").read_text(encoding="utf-8").lower()
182
+ assert "pre-push" in text
183
+ assert "macos" in text
184
+ assert any(
185
+ "pre-push" in para.lower() and "macos" in para.lower()
186
+ for para in text.split("\n\n")
187
+ ), "the pre-push gate and macOS must be stated together"
@@ -146,6 +146,8 @@ WRITES_A_FILE = {
146
146
  "--comment-output", "--prompt-output", "--attestation-output",
147
147
  "--agent-instructions-output", "--hostile-prompt-output",
148
148
  "--instructions-output-dir", "--skills-dir", "--target-path",
149
+ # The home --install-updater writes its launch agent into (D230).
150
+ "--home",
149
151
  }
150
152
  NOT_AN_OPERATOR_PATH = {
151
153
  # A revspec, not a file.
@@ -160,6 +162,7 @@ NOT_AN_OPERATOR_PATH = {
160
162
  "--fail-on-gate", "--fail-on-new", "--fail-on-out-of-scope",
161
163
  "--fail-on-regression", "--force-skill", "--format", "--help",
162
164
  "--init-agent-standards", "--install-precommit-hook", "--install-skill",
165
+ "--update", "--install-updater", "--no-launchctl",
163
166
  "--record-history", "--staged", "--target", "--transformation",
164
167
  "--version", "--work",
165
168
  }