maintainability-agent 4.4.0__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.0/src/maintainability_agent.egg-info → maintainability_agent-4.4.2}/PKG-INFO +11 -6
  2. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/README.md +9 -4
  3. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/pyproject.toml +4 -1
  4. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2/src/maintainability_agent.egg-info}/PKG-INFO +11 -6
  5. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/SOURCES.txt +5 -0
  6. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/requires.txt +1 -1
  7. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/__init__.py +1 -1
  8. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_analysis.py +49 -0
  9. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_arguments.py +18 -0
  10. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_refusals.py +6 -0
  11. maintainability_agent-4.4.2/src/maintainability_audit/_self_update.py +126 -0
  12. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_verdict_adapters.py +4 -2
  13. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/cli.py +9 -0
  14. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_adapters.py +54 -0
  15. maintainability_agent-4.4.2/tests/test_analyzers_never_write.py +128 -0
  16. maintainability_agent-4.4.2/tests/test_ci_runs_once.py +98 -0
  17. maintainability_agent-4.4.2/tests/test_local_gate.py +187 -0
  18. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_operator_named_reads.py +3 -0
  19. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_platform_claim.py +58 -50
  20. maintainability_agent-4.4.2/tests/test_self_update.py +239 -0
  21. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_suite_isolation.py +65 -0
  22. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_workflow_supply_chain.py +29 -0
  23. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/LICENSE +0 -0
  24. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/setup.cfg +0 -0
  25. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/dependency_links.txt +0 -0
  26. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/entry_points.txt +0 -0
  27. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/top_level.txt +0 -0
  28. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/__main__.py +0 -0
  29. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_adapters.py +0 -0
  30. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_analyzer_sections.py +0 -0
  31. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_anchor.py +0 -0
  32. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_aspects.py +0 -0
  33. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_assets/analyzer-catalog.json +0 -0
  34. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_assets/standard.md +0 -0
  35. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_attestation.py +0 -0
  36. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_backfill.py +0 -0
  37. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_bands.py +0 -0
  38. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_banner.py +0 -0
  39. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_built_ins.py +0 -0
  40. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_calibration.py +0 -0
  41. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_catalog.py +0 -0
  42. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_changed_code_policy.py +0 -0
  43. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_charts.py +0 -0
  44. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_cognitive.py +0 -0
  45. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_config_defaults.py +0 -0
  46. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_conformance.py +0 -0
  47. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_corroborate.py +0 -0
  48. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_coverage_notes.py +0 -0
  49. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_criteria_scope.py +0 -0
  50. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_delegated_pillar.py +0 -0
  51. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_derive.py +0 -0
  52. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_discovery.py +0 -0
  53. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_documents.py +0 -0
  54. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_economics.py +0 -0
  55. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_economics_view.py +0 -0
  56. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_environment.py +0 -0
  57. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_evidence_reader.py +0 -0
  58. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_evidence_view.py +0 -0
  59. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_finding_match.py +0 -0
  60. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_first_run.py +0 -0
  61. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_formula.py +0 -0
  62. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_gates.py +0 -0
  63. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_generic.py +0 -0
  64. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_grammar.py +0 -0
  65. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_grant_ledger.py +0 -0
  66. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_handoff.py +0 -0
  67. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_history_view.py +0 -0
  68. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_hostile_prompt.py +0 -0
  69. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_hotspots.py +0 -0
  70. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_html_report_sections.py +0 -0
  71. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_html_view.py +0 -0
  72. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_identity.py +0 -0
  73. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_in_loop.py +0 -0
  74. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_in_loop_view.py +0 -0
  75. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_jvm_adapters.py +0 -0
  76. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_markdown_sections.py +0 -0
  77. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_masking.py +0 -0
  78. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_audit.py +0 -0
  79. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_gate.py +0 -0
  80. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_grants.py +0 -0
  81. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_resources.py +0 -0
  82. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_setup.py +0 -0
  83. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_metric_adapters.py +0 -0
  84. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_metrics_types.py +0 -0
  85. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_operator_reads.py +0 -0
  86. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_oracle.py +0 -0
  87. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_pillars.py +0 -0
  88. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_pipeline_results.py +0 -0
  89. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_practice.py +0 -0
  90. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_precommit.py +0 -0
  91. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_precommit_install.py +0 -0
  92. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_precommit_view.py +0 -0
  93. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_pressures.py +0 -0
  94. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_prompt_sections.py +0 -0
  95. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_c.py +0 -0
  96. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_cobol.py +0 -0
  97. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_core.py +0 -0
  98. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_cpp.py +0 -0
  99. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_csharp.py +0 -0
  100. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_fortran.py +0 -0
  101. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_go.py +0 -0
  102. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_java.py +0 -0
  103. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_js.py +0 -0
  104. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_kotlin.py +0 -0
  105. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_php.py +0 -0
  106. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_ruby.py +0 -0
  107. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_rust.py +0 -0
  108. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_shell.py +0 -0
  109. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_swift.py +0 -0
  110. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ratchet.py +0 -0
  111. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ratio_adapters.py +0 -0
  112. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_recurrence.py +0 -0
  113. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_run_comparison.py +0 -0
  114. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_runner.py +0 -0
  115. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_running_version.py +0 -0
  116. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_safe_write.py +0 -0
  117. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_scan_history.py +0 -0
  118. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_scan_view.py +0 -0
  119. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_second_source.py +0 -0
  120. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_security_delegate.py +0 -0
  121. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_security_work_order.py +0 -0
  122. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_selection.py +0 -0
  123. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic.py +0 -0
  124. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic_policy.py +0 -0
  125. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic_ts.py +0 -0
  126. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic_view.py +0 -0
  127. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_setup_errors.py +0 -0
  128. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_setup_persist.py +0 -0
  129. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/SKILL.md +0 -0
  130. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/agents/anthropic.yaml +0 -0
  131. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/agents/copilot.yaml +0 -0
  132. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/agents/openai.yaml +0 -0
  133. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/copilot/maintainability-agent.prompt.md +0 -0
  134. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/references/finding-taxonomy.md +0 -0
  135. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_install.py +0 -0
  136. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_stored_grants.py +0 -0
  137. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_tdd_view.py +0 -0
  138. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_test_commands.py +0 -0
  139. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_test_execution.py +0 -0
  140. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_test_pairing.py +0 -0
  141. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_tokens.py +0 -0
  142. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_tool_adapters.py +0 -0
  143. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_trends.py +0 -0
  144. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_user_config.py +0 -0
  145. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_verification.py +0 -0
  146. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_work_order.py +0 -0
  147. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_work_order_view.py +0 -0
  148. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_work_order_weights.py +0 -0
  149. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_xml.py +0 -0
  150. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/baseline.py +0 -0
  151. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/config.py +0 -0
  152. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/deadcode.py +0 -0
  153. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/declarations.py +0 -0
  154. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/duplication.py +0 -0
  155. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/evidence.py +0 -0
  156. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/git_tools.py +0 -0
  157. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/history.py +0 -0
  158. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/idioms.py +0 -0
  159. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/instructions.py +0 -0
  160. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/mcp_server.py +0 -0
  161. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/metrics.py +0 -0
  162. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/prompts.py +0 -0
  163. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/renderers.py +0 -0
  164. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/report.py +0 -0
  165. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/sarif.py +0 -0
  166. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/scoring.py +0 -0
  167. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/similarity.py +0 -0
  168. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/source.py +0 -0
  169. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_clone_names_every_copy.py +0 -0
  170. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_dangling_source_link_is_named_not_fatal.py +0 -0
  171. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_format_override_is_disclosed.py +0 -0
  172. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_matching_format_stays_silent.py +0 -0
  173. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_published_question_offers_what_it_accepts.py +0 -0
  174. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_rendered_docs_site_is_not_scored_as_source.py +0 -0
  175. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_setup_question_keeps_its_contract.py +0 -0
  176. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_acquisition_trust.py +0 -0
  177. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_adapter_docs.py +0 -0
  178. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_adapter_recordings.py +0 -0
  179. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_added_lines.py +0 -0
  180. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_an_absent_work_order_renders_nothing.py +0 -0
  181. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_an_unmeasured_pillar_reports_no_number.py +0 -0
  182. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analysis_coverage.py +0 -0
  183. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analysis_execution.py +0 -0
  184. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_bridge.py +0 -0
  185. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_config_isolation.py +0 -0
  186. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_estimate_claims.py +0 -0
  187. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_file_lists_are_batched.py +0 -0
  188. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_pinning.py +0 -0
  189. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_primary_estimate.py +0 -0
  190. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_provenance.py +0 -0
  191. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_provenance_exclusions.py +0 -0
  192. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_scoring_path.py +0 -0
  193. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_spread_range.py +0 -0
  194. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_xml_bounds.py +0 -0
  195. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzers_against_the_real_tools.py +0 -0
  196. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzers_report_what_actually_failed.py +0 -0
  197. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_anchor_and_mode.py +0 -0
  198. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_anchor_caveat_and_counts_follow_the_run.py +0 -0
  199. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_anchor_disclosure.py +0 -0
  200. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_annotations_match_behaviour.py +0 -0
  201. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_anticipated_refusals.py +0 -0
  202. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_architecture.py +0 -0
  203. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_artifact_write_route_class.py +0 -0
  204. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_aspect_coverage.py +0 -0
  205. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_asset_snapshot_class.py +0 -0
  206. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_ast_reading_resolves_spellings.py +0 -0
  207. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_attestation.py +0 -0
  208. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_audit_components.py +0 -0
  209. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_authorization_freshness.py +0 -0
  210. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_authorship_gates.py +0 -0
  211. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_backfill.py +0 -0
  212. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_band_concealment_class.py +0 -0
  213. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_band_concealment_p3.py +0 -0
  214. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_band_pressures.py +0 -0
  215. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_bands.py +0 -0
  216. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_behaviour_suites_are_tests.py +0 -0
  217. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_body_or_signature_class.py +0 -0
  218. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_both_setup_paths_ask_the_same_stage.py +0 -0
  219. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_build_output_is_not_the_repositorys_code.py +0 -0
  220. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_c_declarations.py +0 -0
  221. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_calibration_corpus.py +0 -0
  222. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_calibration_drift.py +0 -0
  223. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_calibration_tooling.py +0 -0
  224. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_catalog_selection.py +0 -0
  225. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_catalog_tier_promise.py +0 -0
  226. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_changed_code_policy.py +0 -0
  227. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_chat_leads_with_the_work_order.py +0 -0
  228. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_chat_primary_docs.py +0 -0
  229. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_check_refuses_plus_only_fragments.py +0 -0
  230. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_checkstyle_adapter.py +0 -0
  231. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_checkstyle_catalog.py +0 -0
  232. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_child_sandbox.py +0 -0
  233. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_ci_history_recipe.py +0 -0
  234. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_ci_installs_the_analyzer_pool.py +0 -0
  235. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_claimed_languages.py +0 -0
  236. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_clean_sees_the_weakened_oracle.py +0 -0
  237. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_cli.py +0 -0
  238. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_clone_group_class.py +0 -0
  239. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_cobol_declarations.py +0 -0
  240. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_code_scanning_gets_alerts_not_the_record.py +0 -0
  241. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_cognitive_complexity.py +0 -0
  242. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_cohesion_with_nothing_to_read_is_not_applicable.py +0 -0
  243. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_cohort_statistics.py +0 -0
  244. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_concealment_properties.py +0 -0
  245. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_config_shape.py +0 -0
  246. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_conformance_reads_the_operators_ask.py +0 -0
  247. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_consent_and_grant.py +0 -0
  248. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_consent_is_per_repository.py +0 -0
  249. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_consent_survives_setup_and_is_asked.py +0 -0
  250. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_consent_without_command_has_a_remedy.py +0 -0
  251. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_consumer_migration.py +0 -0
  252. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_contract_claims.py +0 -0
  253. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_corpus_note_counts_come_from_the_corpus.py +0 -0
  254. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_corroborate.py +0 -0
  255. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_coverage_by_language.py +0 -0
  256. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_coverage_config_reaches_children.py +0 -0
  257. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_coverage_formats.py +0 -0
  258. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_cpp_declarations.py +0 -0
  259. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_criteria_completion.py +0 -0
  260. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_csharp_declarations.py +0 -0
  261. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_current_state_docs_name_every_parsed_language.py +0 -0
  262. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_d15_composition.py +0 -0
  263. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_d15_goal_directed.py +0 -0
  264. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_dead_code.py +0 -0
  265. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declaration_criteria_scope.py +0 -0
  266. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declaration_edge_cases.py +0 -0
  267. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declaration_grading.py +0 -0
  268. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declaration_ranges.py +0 -0
  269. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declaration_source.py +0 -0
  270. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declarative_parsers.py +0 -0
  271. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declared_capabilities_match_the_delegate.py +0 -0
  272. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declared_imports.py +0 -0
  273. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_delegated_security_pillar.py +0 -0
  274. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_demo_tree.py +0 -0
  275. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_derivation_mix.py +0 -0
  276. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_determinism.py +0 -0
  277. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_dimension_ratchet.py +0 -0
  278. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_direct_runner_availability_class.py +0 -0
  279. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_discovery.py +0 -0
  280. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_doc_claims.py +0 -0
  281. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_docs_links.py +0 -0
  282. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_economic_context.py +0 -0
  283. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_empty_output_not_clean.py +0 -0
  284. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_empty_output_not_clean_adapters.py +0 -0
  285. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_environment_work_order.py +0 -0
  286. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_built_presentation_is_offered.py +0 -0
  287. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_job_tests_the_pinned_oracle.py +0 -0
  288. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_language_counts_its_own_loop.py +0 -0
  289. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_language_has_a_loop_fixture.py +0 -0
  290. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_pool_install_is_the_same_pool.py +0 -0
  291. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_question_can_be_answered.py +0 -0
  292. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_surface_says_what_the_run_found.py +0 -0
  293. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_evidence_invariants.py +0 -0
  294. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_evidence_normalization.py +0 -0
  295. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_evidence_properties.py +0 -0
  296. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_example_config_opens_claimed_languages.py +0 -0
  297. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_exclude_additional_keeps_the_defaults.py +0 -0
  298. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_exclusion_dialects.py +0 -0
  299. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_exposure_never_outranks_band.py +0 -0
  300. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_falsifier_standard.py +0 -0
  301. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_file_list_cap_class.py +0 -0
  302. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_finding_identity.py +0 -0
  303. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_first_run_elicitation.py +0 -0
  304. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_first_run_prompt.py +0 -0
  305. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_first_run_reelicitation.py +0 -0
  306. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_first_stage_setup_wording_holds.py +0 -0
  307. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_fix_breadth_window.py +0 -0
  308. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_fixed_form_fortran.py +0 -0
  309. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_format_ask.py +0 -0
  310. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_fortran_declarations.py +0 -0
  311. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_fortran_metrics.py +0 -0
  312. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_fortran_practice.py +0 -0
  313. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_git_argv.py +0 -0
  314. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_git_read_only.py +0 -0
  315. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_git_readonly_class.py +0 -0
  316. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_go_declarations.py +0 -0
  317. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_grammar_constructs.py +0 -0
  318. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_grammar_token_coverage.py +0 -0
  319. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_grant_only_user_tier.py +0 -0
  320. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_grok_audit_of_3_11.py +0 -0
  321. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_history.py +0 -0
  322. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_history_boundary.py +0 -0
  323. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_history_manifest.py +0 -0
  324. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_history_schema2.py +0 -0
  325. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_history_window.py +0 -0
  326. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_hostile_prompt.py +0 -0
  327. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_html_executive.py +0 -0
  328. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_html_section_parity_class.py +0 -0
  329. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_identity_docs.py +0 -0
  330. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_identity_resolution.py +0 -0
  331. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_idiom_divergence.py +0 -0
  332. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_in_loop_budgets.py +0 -0
  333. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_in_loop_check.py +0 -0
  334. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_installed_wheel_runtime.py +0 -0
  335. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_instruction_targets.py +0 -0
  336. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_java_range_guard.py +0 -0
  337. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_java_ranges.py +0 -0
  338. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_java_scored.py +0 -0
  339. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_java_wiring.py +0 -0
  340. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_js_complexity_operators.py +0 -0
  341. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_js_declarations.py +0 -0
  342. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_kotlin_declarations.py +0 -0
  343. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_kotlin_metrics.py +0 -0
  344. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_language_coverage.py +0 -0
  345. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_language_support_honesty.py +0 -0
  346. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_list_tools_publishes_the_answer_path.py +0 -0
  347. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_maintenance_signals.py +0 -0
  348. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_mcp_baseline_payload.py +0 -0
  349. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_mcp_format_contract.py +0 -0
  350. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_mcp_history.py +0 -0
  351. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_mcp_server.py +0 -0
  352. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_mcp_start_failure_names_what_is_installed.py +0 -0
  353. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_migration_1_0.py +0 -0
  354. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_missing_security_scanners_are_named_before_the_run.py +0 -0
  355. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_mutation_recorded.py +0 -0
  356. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_near_duplicates.py +0 -0
  357. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_network_disclosure.py +0 -0
  358. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_no_private_names.py +0 -0
  359. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_one_setup_across_surfaces_class.py +0 -0
  360. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_operator_named_paths.py +0 -0
  361. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_oracle_weakening_precision_bar.py +0 -0
  362. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pairing_reads_imports.py +0 -0
  363. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pattern_budget.py +0 -0
  364. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_phase6_claims.py +0 -0
  365. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_php_declarations.py +0 -0
  366. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pillars_and_practice.py +0 -0
  367. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pipeline_results.py +0 -0
  368. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pmd_adapter.py +0 -0
  369. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pmd_audit_closures.py +0 -0
  370. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_policy_claims.py +0 -0
  371. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pool_runs_by_config.py +0 -0
  372. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_population_floors.py +0 -0
  373. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_practice_nested_gates_class.py +0 -0
  374. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_precommit_staged.py +0 -0
  375. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_preflight_before_consent_runs_nothing_from_the_tree.py +0 -0
  376. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_presentation_refusals.py +0 -0
  377. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_previous_release_reached_pypi.py +0 -0
  378. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_promises.py +0 -0
  379. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_prompt_does_not_issue_rates_when_unscored.py +0 -0
  380. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_prompt_escalation_once.py +0 -0
  381. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_prompt_honesty.py +0 -0
  382. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_prompt_location_escalation_class.py +0 -0
  383. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_prove_falsifiers.py +0 -0
  384. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_python_complexity.py +0 -0
  385. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_python_declarations.py +0 -0
  386. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_read_boundary.py +0 -0
  387. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_readme_claims.py +0 -0
  388. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_recurrence.py +0 -0
  389. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_regular_file_reads_work_without_o_nonblock.py +0 -0
  390. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_release_needs_an_empty_ledger.py +0 -0
  391. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_release_plan.py +0 -0
  392. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_release_plan_status.py +0 -0
  393. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_rendered_docs.py +0 -0
  394. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_report_remedy_copy.py +0 -0
  395. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_reported_but_not_scored.py +0 -0
  396. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_root_grants.py +0 -0
  397. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_rubric_ignores_project_lint_config.py +0 -0
  398. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_ruby_declarations.py +0 -0
  399. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_run_comparison.py +0 -0
  400. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_runner.py +0 -0
  401. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_rust_declarations.py +0 -0
  402. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_sarif.py +0 -0
  403. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scan_history.py +0 -0
  404. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scan_scope.py +0 -0
  405. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scanner_fingerprint_covers_the_measurement_path.py +0 -0
  406. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scanner_unsafe_direction.py +0 -0
  407. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scanning.py +0 -0
  408. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_schema_fidelity.py +0 -0
  409. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scope_conformance.py +0 -0
  410. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scoring_calibration.py +0 -0
  411. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_security_delegate_versions_agree.py +0 -0
  412. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_security_findings_keep_their_handoff.py +0 -0
  413. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_security_pillar_asserts_a_scanner_set.py +0 -0
  414. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_security_pillar_runs_and_shows.py +0 -0
  415. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_selection_covers_every_parsed_language.py +0 -0
  416. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_semantic_findings_stay_inside_the_audited_files.py +0 -0
  417. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_semantic_policy.py +0 -0
  418. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_setup_answers_are_the_same_setup.py +0 -0
  419. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_setup_gate_completeness.py +0 -0
  420. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_setup_gate_independent_contract.py +0 -0
  421. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_setup_instruction_describes_its_own_reply.py +0 -0
  422. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_setup_precondition.py +0 -0
  423. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_setup_writes_a_valid_config.py +0 -0
  424. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_shell_declarations.py +0 -0
  425. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_shell_metrics.py +0 -0
  426. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_skill_install.py +0 -0
  427. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_sonar_resolve.py +0 -0
  428. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_source_index.py +0 -0
  429. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_spotbugs_adapter.py +0 -0
  430. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_spotbugs_catalog.py +0 -0
  431. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_stage8_contract.py +0 -0
  432. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_stamped_documents_stay_honest.py +0 -0
  433. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_stdout_outputs.py +0 -0
  434. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_swift_declarations.py +0 -0
  435. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_tdd_structure.py +0 -0
  436. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_terminal_asks_the_same_questions.py +0 -0
  437. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_test_commands.py +0 -0
  438. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_test_execution_class.py +0 -0
  439. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_agent_knows_when_it_is_stale.py +0 -0
  440. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_changelog_covers_the_shipping_version.py +0 -0
  441. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_chat_payload_has_a_budget.py +0 -0
  442. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_condition_says_what_it_measured.py +0 -0
  443. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_handoff_rules_are_their_own_module.py +0 -0
  444. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_pillar_row_reads_cleanly.py +0 -0
  445. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_presentation_question_stays_answerable.py +0 -0
  446. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_previous_release_was_tagged.py +0 -0
  447. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_prompt_does_not_take_back_what_it_withheld.py +0 -0
  448. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_prompt_keeps_listing_what_it_did_not_withhold.py +0 -0
  449. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_release_process_describes_itself.py +0 -0
  450. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_release_record_stays_well_formed.py +0 -0
  451. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_report_is_saved_not_sent.py +0 -0
  452. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_security_run_has_a_configurable_limit.py +0 -0
  453. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_security_work_order_is_drawn.py +0 -0
  454. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_suite_names_the_program_it_ran.py +0 -0
  455. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_tree_cannot_redirect_a_read.py +0 -0
  456. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_version_has_one_source.py +0 -0
  457. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_three_presentations.py +0 -0
  458. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_tool_resolution.py +0 -0
  459. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_tree_cannot_opt_the_host_in.py +0 -0
  460. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_tree_chosen_spawn.py +0 -0
  461. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_tree_reads_use_the_primitive.py +0 -0
  462. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_trends.py +0 -0
  463. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_type_fields_not_functions_class.py +0 -0
  464. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_uat_falsifiers.py +0 -0
  465. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_unanchored_set_matches_corpus.py +0 -0
  466. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_unread_code.py +0 -0
  467. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_user_config_tier.py +0 -0
  468. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_verification_audit_closures.py +0 -0
  469. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_verified_grade.py +0 -0
  470. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_version_claim.py +0 -0
  471. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_version_stamping.py +0 -0
  472. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_wheel_contents.py +0 -0
  473. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_withheld_work_keeps_its_boundary.py +0 -0
  474. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_work_items_state_their_own_finding.py +0 -0
  475. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_work_order.py +0 -0
  476. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_work_order_binds_to_this_interpreter.py +0 -0
  477. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_work_order_items.py +0 -0
  478. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_work_order_selection.py +0 -0
  479. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_write_boundary.py +0 -0
  480. {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_write_route_class.py +0 -0
  481. {maintainability_agent-4.4.0 → 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.0
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
@@ -37,7 +37,7 @@ Requires-Dist: mcp<3,>=2; extra == "dev"
37
37
  Requires-Dist: PyYAML>=6; extra == "dev"
38
38
  Requires-Dist: setuptools>=70; extra == "dev"
39
39
  Requires-Dist: lizard>=1.17; extra == "dev"
40
- Requires-Dist: markdown>=3.5; extra == "dev"
40
+ Requires-Dist: markdown==3.11.1; extra == "dev"
41
41
  Dynamic: license-file
42
42
 
43
43
  # Maintainability Agent
@@ -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.0**.
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.0
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.0**.
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.0
478
+ - uses: marshallguillory86/maintainability-agent@v4.4.2
474
479
  with:
475
480
  config: maintainability-agent.json
476
481
  changed-only: main...HEAD
@@ -63,7 +63,10 @@ mcp = ["mcp>=2,<3"]
63
63
  # ships imports it, and the oracle exists so a measurement can be
64
64
  # checked against something other than its author. `markdown` renders the
65
65
  # docs/html reading copy (`tools/render_docs.py`); the product never does.
66
- dev = ["pytest>=8", "pytest-cov>=5", "pytest-xdist>=3.6", "jsonschema>=4", "ruff>=0.5", "pip-audit>=2.7", "mcp>=2,<3", "PyYAML>=6", "setuptools>=70", "lizard>=1.17", "markdown>=3.5"]
66
+ # It is pinned exactly: the committed copy is checked against a fresh render,
67
+ # and markdown 3.11 rendered two pages differently from 3.10, so an unpinned
68
+ # release failed CI on files nobody had touched (2026-10-14).
69
+ dev = ["pytest>=8", "pytest-cov>=5", "pytest-xdist>=3.6", "jsonschema>=4", "ruff>=0.5", "pip-audit>=2.7", "mcp>=2,<3", "PyYAML>=6", "setuptools>=70", "lizard>=1.17", "markdown==3.11.1"]
67
70
 
68
71
  [tool.pydocstyle]
69
72
  # D401 ("First line should be in imperative mood") is switched off, and the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maintainability-agent
3
- Version: 4.4.0
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
@@ -37,7 +37,7 @@ Requires-Dist: mcp<3,>=2; extra == "dev"
37
37
  Requires-Dist: PyYAML>=6; extra == "dev"
38
38
  Requires-Dist: setuptools>=70; extra == "dev"
39
39
  Requires-Dist: lizard>=1.17; extra == "dev"
40
- Requires-Dist: markdown>=3.5; extra == "dev"
40
+ Requires-Dist: markdown==3.11.1; extra == "dev"
41
41
  Dynamic: license-file
42
42
 
43
43
  # Maintainability Agent
@@ -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.0**.
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.0
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
@@ -182,6 +183,7 @@ tests/test_analyzer_scoring_path.py
182
183
  tests/test_analyzer_spread_range.py
183
184
  tests/test_analyzer_xml_bounds.py
184
185
  tests/test_analyzers_against_the_real_tools.py
186
+ tests/test_analyzers_never_write.py
185
187
  tests/test_analyzers_report_what_actually_failed.py
186
188
  tests/test_anchor_and_mode.py
187
189
  tests/test_anchor_caveat_and_counts_follow_the_run.py
@@ -221,6 +223,7 @@ tests/test_checkstyle_catalog.py
221
223
  tests/test_child_sandbox.py
222
224
  tests/test_ci_history_recipe.py
223
225
  tests/test_ci_installs_the_analyzer_pool.py
226
+ tests/test_ci_runs_once.py
224
227
  tests/test_claimed_languages.py
225
228
  tests/test_clean_sees_the_weakened_oracle.py
226
229
  tests/test_cli.py
@@ -333,6 +336,7 @@ tests/test_kotlin_metrics.py
333
336
  tests/test_language_coverage.py
334
337
  tests/test_language_support_honesty.py
335
338
  tests/test_list_tools_publishes_the_answer_path.py
339
+ tests/test_local_gate.py
336
340
  tests/test_maintenance_signals.py
337
341
  tests/test_mcp_baseline_payload.py
338
342
  tests/test_mcp_format_contract.py
@@ -404,6 +408,7 @@ tests/test_security_findings_keep_their_handoff.py
404
408
  tests/test_security_pillar_asserts_a_scanner_set.py
405
409
  tests/test_security_pillar_runs_and_shows.py
406
410
  tests/test_selection_covers_every_parsed_language.py
411
+ tests/test_self_update.py
407
412
  tests/test_semantic_findings_stay_inside_the_audited_files.py
408
413
  tests/test_semantic_policy.py
409
414
  tests/test_setup_answers_are_the_same_setup.py
@@ -10,7 +10,7 @@ mcp<3,>=2
10
10
  PyYAML>=6
11
11
  setuptools>=70
12
12
  lizard>=1.17
13
- markdown>=3.5
13
+ markdown==3.11.1
14
14
 
15
15
  [mcp]
16
16
  mcp<3,>=2
@@ -1,3 +1,3 @@
1
1
  """Maintainability Audit CI."""
2
2
 
3
- __version__ = "4.4.0"
3
+ __version__ = "4.4.2"
@@ -19,6 +19,7 @@ clean result.
19
19
 
20
20
  from __future__ import annotations
21
21
 
22
+ import hashlib
22
23
  from collections.abc import Sequence
23
24
  from dataclasses import dataclass, field, replace
24
25
  from pathlib import Path
@@ -40,6 +41,7 @@ from ._metrics_types import KNOWN_SOURCE_SUFFIXES, Finding, Measurement
40
41
  from ._runner import Outcome, Probe, ToolResult, run
41
42
  from ._selection import Selected, select_runnable
42
43
  from .config import acquisition_permitted
44
+ from .git_tools import GitCommandFailed, probe_git, run_git
43
45
 
44
46
  #: Sources outside this package: an analyzer it ran, or a file the
45
47
  #: developer's own pipeline wrote (Decision 17). Built-ins are not here.
@@ -356,6 +358,43 @@ def analyze(root: Path, config: dict[str, Any], probe: Probe | None = None) -> A
356
358
  return analysis
357
359
 
358
360
 
361
+ class RepositoryModifiedError(Exception):
362
+ """An analyzer changed the repository it was auditing.
363
+
364
+ The audit never edits source. A tool that writes to the audited tree
365
+ (ruff honouring a repository's `fix = true` rewrote 102 files of
366
+ an audited repository on 2026-10-14) fails the audit loudly rather than handing back
367
+ a grade for code that is no longer what was audited.
368
+ """
369
+
370
+
371
+ def _tracked_state(root: Path) -> dict[str, str] | None:
372
+ """Each tracked file that differs from HEAD, by a hash of its diff.
373
+
374
+ None when `root` is not a git work tree: there is nothing to compare
375
+ against, so nothing is claimed.
376
+ """
377
+ if not probe_git(["rev-parse", "--is-inside-work-tree"], root):
378
+ return None
379
+ try:
380
+ diff = run_git(["diff", "HEAD", "--no-ext-diff", "--binary"], root, strip=False)
381
+ except GitCommandFailed:
382
+ return None
383
+ state: dict[str, str] = {}
384
+ for block in diff.split("\ndiff --git "):
385
+ if not block.strip():
386
+ continue
387
+ header = block.split("\n", 1)[0].removeprefix("diff --git ")
388
+ name = header.split(" b/", 1)[-1]
389
+ state[name] = hashlib.sha256(block.encode("utf-8", "replace")).hexdigest()
390
+ return state
391
+
392
+
393
+ def _changed_paths(before: dict[str, str], after: dict[str, str]) -> list[str]:
394
+ return sorted(path for path in set(before) | set(after)
395
+ if before.get(path) != after.get(path))
396
+
397
+
359
398
  def _run_one(root: Path, adapter: Any, probe: Probe, timeout: int,
360
399
  analysis: Analysis, excludes: Sequence[str] = (),
361
400
  inventory: Any = None) -> ToolCoverage:
@@ -371,6 +410,9 @@ def _run_one(root: Path, adapter: Any, probe: Probe, timeout: int,
371
410
  """
372
411
  try:
373
412
  return _attempt(root, adapter, probe, timeout, analysis, excludes, inventory)
413
+ except RepositoryModifiedError:
414
+ # Not an adapter defect to record quietly: the audited tree changed.
415
+ raise
374
416
  except Exception as error: # noqa: BLE001 - the backstop is the point
375
417
  return ToolCoverage(
376
418
  slug=adapter.slug, outcome="failed", concepts=tuple(adapter.concepts),
@@ -494,12 +536,19 @@ def _run_batches(adapter: Any, root: Path, excludes: Sequence[str],
494
536
  invocations = planned(root, excludes) if planned else [adapter.invocation(root, excludes=excludes)]
495
537
  results: list[ToolResult] = []
496
538
  parsed: list[Extraction] = []
539
+ before = _tracked_state(root)
497
540
  for invocation in invocations:
498
541
  result = run(adapter.slug, invocation, timeout_seconds=timeout)
499
542
  results.append(result)
500
543
  parsed.append(adapter.parse(result))
501
544
  if not result.usable:
502
545
  break
546
+ after = _tracked_state(root) if before is not None else None
547
+ if before is not None and after is not None and after != before:
548
+ changed = _changed_paths(before, after)
549
+ raise RepositoryModifiedError(
550
+ f"{adapter.slug} modified the audited repository: {', '.join(changed)}. "
551
+ "The audit never edits source; restore these files and report the adapter.")
503
552
  if len(results) == 1:
504
553
  return results[0], parsed[0]
505
554
  return _merged_result(results, len(invocations)), _merged_extraction(parsed)
@@ -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).",
@@ -18,6 +18,7 @@ D48.
18
18
 
19
19
  from __future__ import annotations
20
20
 
21
+ from ._analysis import RepositoryModifiedError
21
22
  from ._catalog import PolicyError
22
23
  from ._mcp_audit import InvalidAuditArgument, PathNotAllowed
23
24
  from ._mcp_setup import SetupRequired
@@ -37,6 +38,11 @@ ANTICIPATED_REFUSALS = (
37
38
  # type and `PathNotAllowed` both derive from it alongside the
38
39
  # internal ones that must stay crashes.
39
40
  ConfigUnreadable,
41
+ # An analyzer changed the audited repository. The message names the
42
+ # changed files and says to report the adapter: actionable, and a
43
+ # grade must never be returned for code that is no longer what was
44
+ # audited.
45
+ RepositoryModifiedError,
40
46
  )
41
47
 
42
48
  __all__ = ["ANTICIPATED_REFUSALS"]
@@ -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
@@ -117,7 +117,9 @@ class RuffAdapter(BaseAdapter):
117
117
  concepts=("style", "complexity", "dead-code"),
118
118
  findings_exit_codes=(0, 1), exclude_flag="--exclude",
119
119
  exclude_dialect="gitignore",
120
- extra_args=("check", "--output-format", "json", "--no-cache"),
120
+ # --no-fix: a repository's `fix = true` must never turn an audit
121
+ # into a rewrite (it rewrote 102 files of an audited repository, 2026-10-14).
122
+ extra_args=("check", "--no-fix", "--output-format", "json", "--no-cache"),
121
123
  )
122
124
 
123
125
  def _read(self, result: ToolResult) -> Extraction:
@@ -169,7 +171,7 @@ class FortitudeAdapter(BaseAdapter):
169
171
  concepts=("style", "dead-code"),
170
172
  findings_exit_codes=(0, 1), exclude_flag="--exclude",
171
173
  exclude_dialect="fnmatch",
172
- extra_args=("check", "--output-format", "json"),
174
+ extra_args=("check", "--no-fix", "--output-format", "json"),
173
175
  )
174
176
 
175
177
  def _read(self, result: ToolResult) -> Extraction:
@@ -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
 
@@ -17,10 +17,12 @@ A+ one more time.
17
17
  from __future__ import annotations
18
18
 
19
19
  import json
20
+ import subprocess
20
21
  from pathlib import Path
21
22
 
22
23
  import pytest
23
24
 
25
+ from maintainability_audit import _analysis
24
26
  from maintainability_audit._adapters import BaseAdapter, Extraction, measurements_only
25
27
  from maintainability_audit._metrics_types import Measurement
26
28
  from maintainability_audit._runner import Outcome, ToolResult
@@ -489,3 +491,55 @@ def test_jscpd_paths_drop_the_embedded_format_tag() -> None:
489
491
 
490
492
  paths = [f.path for f in adapter.parse(result).findings]
491
493
  assert paths == ["docs/api/formik.md", "src/a.ts", "pkgs/v1.2/b.js"]
494
+
495
+
496
+ # --- Guards for D229 (an analyzer can never rewrite the audited repository) --
497
+ # Regression guards, not falsifiers: they pass on the code before the fix too,
498
+ # so they live here rather than in the falsifier file D229 cites.
499
+
500
+ _WRITE_TOKENS = ("--fix", "--write", "--in-place", "-i", "--apply", "--fix-only", "--unsafe-fixes")
501
+
502
+
503
+ def _write_guard_argvs(slug, root):
504
+ names = ("mod.py", "Main.java", "main.f90", "app.js", "lib.c", "x.go", "y.rs", "z.ts")
505
+ for name in names:
506
+ (root / name).write_text("x\n", encoding="utf-8")
507
+ adapter = ADAPTERS[slug]()
508
+ runs = list(adapter.invocations(root, ()))
509
+ runs.append(adapter.invocation(root, [str(root / name) for name in names]))
510
+ return [tuple(run.argv) for run in runs]
511
+
512
+
513
+ @pytest.mark.parametrize("slug", sorted(ADAPTERS))
514
+ def test_no_adapter_is_built_to_write(slug, tmp_path):
515
+ """Covers existing behaviour: no adapter has ever passed a write-enabling flag; D229's
516
+ rewrite came from repository config, and this keeps a future adapter from adding one."""
517
+ adapter = ADAPTERS[slug]()
518
+ for argv in _write_guard_argvs(slug, tmp_path):
519
+ found = [token for token in argv if token in _WRITE_TOKENS]
520
+ assert not found, f"{slug} argv carries write-enabling {found}: {argv}"
521
+ assert not adapter.extra_args or adapter.extra_args[0] != "format", (
522
+ f"{slug} runs a formatter, which rewrites files")
523
+
524
+
525
+ class _QuietProbe(BaseAdapter):
526
+ def __init__(self):
527
+ super().__init__(slug="fake", emits="verdict", executable="fake", concepts=("style",))
528
+
529
+ def _read(self, result): # pragma: no cover - parse is not the subject
530
+ return Extraction()
531
+
532
+
533
+ def test_an_analyzer_that_changes_nothing_reports_no_integrity_failure(tmp_path, monkeypatch):
534
+ """Covers existing behaviour: a clean run raised nothing before D229 either; this holds
535
+ that the integrity check never turns an unchanged tree into a failure."""
536
+ for args in (("init", "-q"), ("config", "user.email", "t@example.com"), ("config", "user.name", "t")):
537
+ subprocess.run(["git", *args], cwd=tmp_path, check=True, capture_output=True)
538
+ (tmp_path / "mod.py").write_text("import os\n", encoding="utf-8")
539
+ subprocess.run(["git", "add", "."], cwd=tmp_path, check=True, capture_output=True)
540
+ subprocess.run(["git", "commit", "-q", "-m", "init"], cwd=tmp_path, check=True, capture_output=True)
541
+ monkeypatch.setattr(_analysis, "run",
542
+ lambda slug, invocation, **kw: ToolResult(slug=slug, outcome=Outcome.RAN,
543
+ stdout="[]", exit_code=0))
544
+ result, _parsed = _analysis._run_batches(_QuietProbe(), tmp_path, (), 60)
545
+ assert result.outcome == Outcome.RAN