maintainability-agent 4.4.0__tar.gz → 4.4.1__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.
- {maintainability_agent-4.4.0/src/maintainability_agent.egg-info → maintainability_agent-4.4.1}/PKG-INFO +4 -4
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/README.md +2 -2
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/pyproject.toml +4 -1
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1/src/maintainability_agent.egg-info}/PKG-INFO +4 -4
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_agent.egg-info/SOURCES.txt +1 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_agent.egg-info/requires.txt +1 -1
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/__init__.py +1 -1
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_analysis.py +49 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_mcp_refusals.py +6 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_verdict_adapters.py +4 -2
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_adapters.py +54 -0
- maintainability_agent-4.4.1/tests/test_analyzers_never_write.py +128 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/LICENSE +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/setup.cfg +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_agent.egg-info/dependency_links.txt +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_agent.egg-info/entry_points.txt +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_agent.egg-info/top_level.txt +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/__main__.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_adapters.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_analyzer_sections.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_anchor.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_arguments.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_aspects.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_assets/analyzer-catalog.json +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_assets/standard.md +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_attestation.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_backfill.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_bands.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_banner.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_built_ins.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_calibration.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_catalog.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_changed_code_policy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_charts.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_cognitive.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_config_defaults.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_conformance.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_corroborate.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_coverage_notes.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_criteria_scope.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_delegated_pillar.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_derive.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_discovery.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_documents.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_economics.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_economics_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_environment.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_evidence_reader.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_evidence_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_finding_match.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_first_run.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_formula.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_gates.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_generic.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_grammar.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_grant_ledger.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_handoff.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_history_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_hostile_prompt.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_hotspots.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_html_report_sections.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_html_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_identity.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_in_loop.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_in_loop_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_jvm_adapters.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_markdown_sections.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_masking.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_mcp_audit.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_mcp_gate.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_mcp_grants.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_mcp_resources.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_mcp_setup.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_metric_adapters.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_metrics_types.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_operator_reads.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_oracle.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_pillars.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_pipeline_results.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_practice.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_precommit.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_precommit_install.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_precommit_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_pressures.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_prompt_sections.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_c.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_cobol.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_core.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_cpp.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_csharp.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_fortran.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_go.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_java.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_js.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_kotlin.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_php.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_ruby.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_rust.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_shell.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ranges_swift.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ratchet.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_ratio_adapters.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_recurrence.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_run_comparison.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_runner.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_running_version.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_safe_write.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_scan_history.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_scan_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_second_source.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_security_delegate.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_security_work_order.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_selection.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_semantic.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_semantic_policy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_semantic_ts.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_semantic_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_setup_errors.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_setup_persist.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_skill_data/SKILL.md +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_skill_data/agents/anthropic.yaml +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_skill_data/agents/copilot.yaml +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_skill_data/agents/openai.yaml +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_skill_data/copilot/maintainability-agent.prompt.md +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_skill_data/references/finding-taxonomy.md +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_skill_install.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_stored_grants.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_tdd_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_test_commands.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_test_execution.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_test_pairing.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_tokens.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_tool_adapters.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_trends.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_user_config.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_verification.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_work_order.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_work_order_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_work_order_weights.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_xml.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/baseline.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/cli.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/config.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/deadcode.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/duplication.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/evidence.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/git_tools.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/history.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/idioms.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/instructions.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/mcp_server.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/metrics.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/prompts.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/renderers.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/report.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/sarif.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/scoring.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/similarity.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/source.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_a_clone_names_every_copy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_a_dangling_source_link_is_named_not_fatal.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_a_format_override_is_disclosed.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_a_matching_format_stays_silent.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_a_published_question_offers_what_it_accepts.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_a_rendered_docs_site_is_not_scored_as_source.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_a_setup_question_keeps_its_contract.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_acquisition_trust.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_adapter_docs.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_adapter_recordings.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_added_lines.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_an_absent_work_order_renders_nothing.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_an_unmeasured_pillar_reports_no_number.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analysis_coverage.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analysis_execution.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analyzer_bridge.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analyzer_config_isolation.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analyzer_estimate_claims.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analyzer_file_lists_are_batched.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analyzer_pinning.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analyzer_primary_estimate.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analyzer_provenance.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analyzer_provenance_exclusions.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analyzer_scoring_path.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analyzer_spread_range.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analyzer_xml_bounds.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analyzers_against_the_real_tools.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_analyzers_report_what_actually_failed.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_anchor_and_mode.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_anchor_caveat_and_counts_follow_the_run.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_anchor_disclosure.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_annotations_match_behaviour.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_anticipated_refusals.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_architecture.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_artifact_write_route_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_aspect_coverage.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_asset_snapshot_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_ast_reading_resolves_spellings.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_attestation.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_audit_components.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_authorization_freshness.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_authorship_gates.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_backfill.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_band_concealment_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_band_concealment_p3.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_band_pressures.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_bands.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_behaviour_suites_are_tests.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_body_or_signature_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_both_setup_paths_ask_the_same_stage.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_build_output_is_not_the_repositorys_code.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_c_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_calibration_corpus.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_calibration_drift.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_calibration_tooling.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_catalog_selection.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_catalog_tier_promise.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_changed_code_policy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_chat_leads_with_the_work_order.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_chat_primary_docs.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_check_refuses_plus_only_fragments.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_checkstyle_adapter.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_checkstyle_catalog.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_child_sandbox.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_ci_history_recipe.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_ci_installs_the_analyzer_pool.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_claimed_languages.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_clean_sees_the_weakened_oracle.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_cli.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_clone_group_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_cobol_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_code_scanning_gets_alerts_not_the_record.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_cognitive_complexity.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_cohesion_with_nothing_to_read_is_not_applicable.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_cohort_statistics.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_concealment_properties.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_config_shape.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_conformance_reads_the_operators_ask.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_consent_and_grant.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_consent_is_per_repository.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_consent_survives_setup_and_is_asked.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_consent_without_command_has_a_remedy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_consumer_migration.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_contract_claims.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_corpus_note_counts_come_from_the_corpus.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_corroborate.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_coverage_by_language.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_coverage_config_reaches_children.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_coverage_formats.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_cpp_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_criteria_completion.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_csharp_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_current_state_docs_name_every_parsed_language.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_d15_composition.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_d15_goal_directed.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_dead_code.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_declaration_criteria_scope.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_declaration_edge_cases.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_declaration_grading.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_declaration_ranges.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_declaration_source.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_declarative_parsers.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_declared_capabilities_match_the_delegate.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_declared_imports.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_delegated_security_pillar.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_demo_tree.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_derivation_mix.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_determinism.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_dimension_ratchet.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_direct_runner_availability_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_discovery.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_doc_claims.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_docs_links.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_economic_context.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_empty_output_not_clean.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_empty_output_not_clean_adapters.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_environment_work_order.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_every_built_presentation_is_offered.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_every_job_tests_the_pinned_oracle.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_every_language_counts_its_own_loop.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_every_language_has_a_loop_fixture.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_every_pool_install_is_the_same_pool.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_every_question_can_be_answered.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_every_surface_says_what_the_run_found.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_evidence_invariants.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_evidence_normalization.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_evidence_properties.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_example_config_opens_claimed_languages.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_exclude_additional_keeps_the_defaults.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_exclusion_dialects.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_exposure_never_outranks_band.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_falsifier_standard.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_file_list_cap_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_finding_identity.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_first_run_elicitation.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_first_run_prompt.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_first_run_reelicitation.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_first_stage_setup_wording_holds.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_fix_breadth_window.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_fixed_form_fortran.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_format_ask.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_fortran_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_fortran_metrics.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_fortran_practice.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_git_argv.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_git_read_only.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_git_readonly_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_go_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_grammar_constructs.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_grammar_token_coverage.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_grant_only_user_tier.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_grok_audit_of_3_11.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_history.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_history_boundary.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_history_manifest.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_history_schema2.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_history_window.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_hostile_prompt.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_html_executive.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_html_section_parity_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_identity_docs.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_identity_resolution.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_idiom_divergence.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_in_loop_budgets.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_in_loop_check.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_installed_wheel_runtime.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_instruction_targets.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_java_range_guard.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_java_ranges.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_java_scored.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_java_wiring.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_js_complexity_operators.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_js_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_kotlin_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_kotlin_metrics.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_language_coverage.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_language_support_honesty.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_list_tools_publishes_the_answer_path.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_maintenance_signals.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_mcp_baseline_payload.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_mcp_format_contract.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_mcp_history.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_mcp_server.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_mcp_start_failure_names_what_is_installed.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_migration_1_0.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_missing_security_scanners_are_named_before_the_run.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_mutation_recorded.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_near_duplicates.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_network_disclosure.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_no_private_names.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_one_setup_across_surfaces_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_operator_named_paths.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_operator_named_reads.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_oracle_weakening_precision_bar.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_pairing_reads_imports.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_pattern_budget.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_phase6_claims.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_php_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_pillars_and_practice.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_pipeline_results.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_platform_claim.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_pmd_adapter.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_pmd_audit_closures.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_policy_claims.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_pool_runs_by_config.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_population_floors.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_practice_nested_gates_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_precommit_staged.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_preflight_before_consent_runs_nothing_from_the_tree.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_presentation_refusals.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_previous_release_reached_pypi.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_promises.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_prompt_does_not_issue_rates_when_unscored.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_prompt_escalation_once.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_prompt_honesty.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_prompt_location_escalation_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_prove_falsifiers.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_python_complexity.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_python_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_read_boundary.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_readme_claims.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_recurrence.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_regular_file_reads_work_without_o_nonblock.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_release_needs_an_empty_ledger.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_release_plan.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_release_plan_status.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_rendered_docs.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_report_remedy_copy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_reported_but_not_scored.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_root_grants.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_rubric_ignores_project_lint_config.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_ruby_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_run_comparison.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_runner.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_rust_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_sarif.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_scan_history.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_scan_scope.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_scanner_fingerprint_covers_the_measurement_path.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_scanner_unsafe_direction.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_scanning.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_schema_fidelity.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_scope_conformance.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_scoring_calibration.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_security_delegate_versions_agree.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_security_findings_keep_their_handoff.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_security_pillar_asserts_a_scanner_set.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_security_pillar_runs_and_shows.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_selection_covers_every_parsed_language.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_semantic_findings_stay_inside_the_audited_files.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_semantic_policy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_setup_answers_are_the_same_setup.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_setup_gate_completeness.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_setup_gate_independent_contract.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_setup_instruction_describes_its_own_reply.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_setup_precondition.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_setup_writes_a_valid_config.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_shell_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_shell_metrics.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_skill_install.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_sonar_resolve.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_source_index.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_spotbugs_adapter.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_spotbugs_catalog.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_stage8_contract.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_stamped_documents_stay_honest.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_stdout_outputs.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_suite_isolation.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_swift_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_tdd_structure.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_terminal_asks_the_same_questions.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_test_commands.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_test_execution_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_agent_knows_when_it_is_stale.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_changelog_covers_the_shipping_version.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_chat_payload_has_a_budget.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_condition_says_what_it_measured.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_handoff_rules_are_their_own_module.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_pillar_row_reads_cleanly.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_presentation_question_stays_answerable.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_previous_release_was_tagged.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_prompt_does_not_take_back_what_it_withheld.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_prompt_keeps_listing_what_it_did_not_withhold.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_release_process_describes_itself.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_release_record_stays_well_formed.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_report_is_saved_not_sent.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_security_run_has_a_configurable_limit.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_security_work_order_is_drawn.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_suite_names_the_program_it_ran.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_tree_cannot_redirect_a_read.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_the_version_has_one_source.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_three_presentations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_tool_resolution.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_tree_cannot_opt_the_host_in.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_tree_chosen_spawn.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_tree_reads_use_the_primitive.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_trends.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_type_fields_not_functions_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_uat_falsifiers.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_unanchored_set_matches_corpus.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_unread_code.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_user_config_tier.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_verification_audit_closures.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_verified_grade.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_version_claim.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_version_stamping.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_wheel_contents.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_withheld_work_keeps_its_boundary.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_work_items_state_their_own_finding.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_work_order.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_work_order_binds_to_this_interpreter.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_work_order_items.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_work_order_selection.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_workflow_supply_chain.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_write_boundary.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/tests/test_write_route_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/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.
|
|
3
|
+
Version: 4.4.1
|
|
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
|
|
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.
|
|
50
|
+
Version **4.4.1**.
|
|
51
51
|
|
|
52
52
|
> ## **Calibrated against 201 mature open-source repositories in fifteen languages.**
|
|
53
53
|
>
|
|
@@ -512,7 +512,7 @@ instead of an invokable skill:
|
|
|
512
512
|
This repo ships `action.yml`, usable as a composite action:
|
|
513
513
|
|
|
514
514
|
```yaml
|
|
515
|
-
- uses: marshallguillory86/maintainability-agent@v4.4.
|
|
515
|
+
- uses: marshallguillory86/maintainability-agent@v4.4.1
|
|
516
516
|
with:
|
|
517
517
|
config: maintainability-agent.json
|
|
518
518
|
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.
|
|
8
|
+
Version **4.4.1**.
|
|
9
9
|
|
|
10
10
|
> ## **Calibrated against 201 mature open-source repositories in fifteen languages.**
|
|
11
11
|
>
|
|
@@ -470,7 +470,7 @@ instead of an invokable skill:
|
|
|
470
470
|
This repo ships `action.yml`, usable as a composite action:
|
|
471
471
|
|
|
472
472
|
```yaml
|
|
473
|
-
- uses: marshallguillory86/maintainability-agent@v4.4.
|
|
473
|
+
- uses: marshallguillory86/maintainability-agent@v4.4.1
|
|
474
474
|
with:
|
|
475
475
|
config: maintainability-agent.json
|
|
476
476
|
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
|
-
|
|
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.
|
|
3
|
+
Version: 4.4.1
|
|
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
|
|
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.
|
|
50
|
+
Version **4.4.1**.
|
|
51
51
|
|
|
52
52
|
> ## **Calibrated against 201 mature open-source repositories in fifteen languages.**
|
|
53
53
|
>
|
|
@@ -512,7 +512,7 @@ instead of an invokable skill:
|
|
|
512
512
|
This repo ships `action.yml`, usable as a composite action:
|
|
513
513
|
|
|
514
514
|
```yaml
|
|
515
|
-
- uses: marshallguillory86/maintainability-agent@v4.4.
|
|
515
|
+
- uses: marshallguillory86/maintainability-agent@v4.4.1
|
|
516
516
|
with:
|
|
517
517
|
config: maintainability-agent.json
|
|
518
518
|
changed-only: main...HEAD
|
|
@@ -182,6 +182,7 @@ tests/test_analyzer_scoring_path.py
|
|
|
182
182
|
tests/test_analyzer_spread_range.py
|
|
183
183
|
tests/test_analyzer_xml_bounds.py
|
|
184
184
|
tests/test_analyzers_against_the_real_tools.py
|
|
185
|
+
tests/test_analyzers_never_write.py
|
|
185
186
|
tests/test_analyzers_report_what_actually_failed.py
|
|
186
187
|
tests/test_anchor_and_mode.py
|
|
187
188
|
tests/test_anchor_caveat_and_counts_follow_the_run.py
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_analysis.py
RENAMED
|
@@ -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)
|
|
@@ -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"]
|
|
@@ -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
|
-
|
|
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:
|
|
@@ -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
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"""Written by the Claude Sonnet test seat (Codex at its usage limit); Codex reviews.
|
|
2
|
+
|
|
3
|
+
Defect: an analyzer rewrote the audited repository (2026-10-14).
|
|
4
|
+
|
|
5
|
+
MA's contract is that it never edits source. The ruff adapter ran
|
|
6
|
+
`ruff check` in the audited repository, ruff honoured that repository's own
|
|
7
|
+
`fix = true`, and 102 files were rewritten. Three layers are specified:
|
|
8
|
+
|
|
9
|
+
1. the ruff and fortitude argv carry `--no-fix`;
|
|
10
|
+
2. no registered adapter's argv carries a write-enabling token (the bug
|
|
11
|
+
class, swept over the registry so a new adapter is covered);
|
|
12
|
+
3. the structural block: if a tracked file of the audited git repository
|
|
13
|
+
changes while an analyzer runs, the audit raises `RepositoryModifiedError`
|
|
14
|
+
from `_analysis._run_batches` (the function that runs an adapter's
|
|
15
|
+
invocations) naming the changed path, instead of succeeding quietly;
|
|
16
|
+
4. end to end with the real ruff.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import subprocess
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
|
|
24
|
+
import pytest
|
|
25
|
+
|
|
26
|
+
from maintainability_audit import _analysis, _runner
|
|
27
|
+
from maintainability_audit._adapters import BaseAdapter
|
|
28
|
+
from maintainability_audit._runner import Outcome, ToolResult
|
|
29
|
+
from maintainability_audit._tool_adapters import ADAPTERS
|
|
30
|
+
|
|
31
|
+
WRITE_TOKENS = ("--fix", "--write", "--in-place", "-i", "--apply", "--fix-only", "--unsafe-fixes")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _tree(root: Path) -> list[str]:
|
|
35
|
+
"""A few files of several kinds, so file-list adapters have targets."""
|
|
36
|
+
names = ("mod.py", "Main.java", "main.f90", "app.js", "lib.c", "x.go", "y.rs", "z.ts")
|
|
37
|
+
for name in names:
|
|
38
|
+
(root / name).write_text("x\n", encoding="utf-8")
|
|
39
|
+
return [str(root / name) for name in names]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _argvs(slug: str, root: Path) -> list[tuple[str, ...]]:
|
|
43
|
+
adapter = ADAPTERS[slug]()
|
|
44
|
+
files = _tree(root)
|
|
45
|
+
runs = list(adapter.invocations(root, ()))
|
|
46
|
+
runs.append(adapter.invocation(root, files))
|
|
47
|
+
return [tuple(run.argv) for run in runs]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@pytest.mark.parametrize("slug", ["ruff", "fortitude"])
|
|
51
|
+
def test_the_linters_that_can_fix_are_told_not_to(slug: str, tmp_path: Path) -> None:
|
|
52
|
+
for argv in _argvs(slug, tmp_path):
|
|
53
|
+
assert "--no-fix" in argv, f"{slug} may rewrite the audited repository: {argv}"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# --- the structural block -------------------------------------------------
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _git(root: Path, *args: str) -> None:
|
|
60
|
+
subprocess.run(["git", *args], cwd=root, check=True, capture_output=True)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _repo(root: Path) -> Path:
|
|
64
|
+
_git(root, "init", "-q")
|
|
65
|
+
_git(root, "config", "user.email", "t@example.com")
|
|
66
|
+
_git(root, "config", "user.name", "t")
|
|
67
|
+
(root / "mod.py").write_text("import os\n", encoding="utf-8")
|
|
68
|
+
(root / "other.py").write_text("y = 1\n", encoding="utf-8")
|
|
69
|
+
_git(root, "add", ".")
|
|
70
|
+
_git(root, "commit", "-q", "-m", "init")
|
|
71
|
+
return root
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class _Probe(BaseAdapter):
|
|
75
|
+
def __init__(self) -> None:
|
|
76
|
+
super().__init__(slug="fake", emits="verdict", executable="fake", concepts=("style",))
|
|
77
|
+
|
|
78
|
+
def _read(self, result: ToolResult): # pragma: no cover - parse is not the subject
|
|
79
|
+
from maintainability_audit._adapters import Extraction
|
|
80
|
+
return Extraction()
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _fake_run(monkeypatch: pytest.MonkeyPatch, effect) -> None:
|
|
84
|
+
def fake(slug, invocation, **kwargs):
|
|
85
|
+
effect()
|
|
86
|
+
return ToolResult(slug=slug, outcome=Outcome.RAN, stdout="[]", exit_code=0)
|
|
87
|
+
|
|
88
|
+
monkeypatch.setattr(_analysis, "run", fake)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def test_an_analyzer_that_edits_a_tracked_file_is_an_integrity_failure(
|
|
92
|
+
tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
|
|
93
|
+
root = _repo(tmp_path)
|
|
94
|
+
_fake_run(monkeypatch, lambda: (root / "mod.py").write_text("", encoding="utf-8"))
|
|
95
|
+
|
|
96
|
+
with pytest.raises(_analysis.RepositoryModifiedError) as raised:
|
|
97
|
+
_analysis._run_batches(_Probe(), root, (), 60)
|
|
98
|
+
|
|
99
|
+
assert "mod.py" in str(raised.value)
|
|
100
|
+
assert "other.py" not in str(raised.value)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
# --- end to end with the real tool ----------------------------------------
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@pytest.mark.skipif(_runner.locate("ruff") is None, reason="ruff is not installed here")
|
|
107
|
+
def test_real_ruff_with_fix_true_leaves_the_audited_repository_untouched(
|
|
108
|
+
tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
|
|
109
|
+
root = tmp_path
|
|
110
|
+
# ruff reads `fix` from the config found from its working directory, not
|
|
111
|
+
# from the audited file's directory, so the defect only shows when the
|
|
112
|
+
# audit runs from inside the repository (the CLI's case, and the incident's).
|
|
113
|
+
monkeypatch.chdir(root)
|
|
114
|
+
(root / "ruff.toml").write_text('fix = true\n[lint]\nselect = ["F"]\n', encoding="utf-8")
|
|
115
|
+
(root / "mod.py").write_text("import os\n", encoding="utf-8")
|
|
116
|
+
_git(root, "init", "-q")
|
|
117
|
+
_git(root, "config", "user.email", "t@example.com")
|
|
118
|
+
_git(root, "config", "user.name", "t")
|
|
119
|
+
_git(root, "add", ".")
|
|
120
|
+
_git(root, "commit", "-q", "-m", "init")
|
|
121
|
+
before = (root / "mod.py").read_bytes()
|
|
122
|
+
|
|
123
|
+
_analysis._run_batches(ADAPTERS["ruff"](), root, (), 60)
|
|
124
|
+
|
|
125
|
+
assert (root / "mod.py").read_bytes() == before
|
|
126
|
+
status = subprocess.run(["git", "status", "--porcelain"], cwd=root, check=True,
|
|
127
|
+
capture_output=True, text=True).stdout
|
|
128
|
+
assert status == ""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/__main__.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_adapters.py
RENAMED
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_anchor.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_arguments.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_aspects.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_backfill.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_bands.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_banner.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_built_ins.py
RENAMED
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_catalog.py
RENAMED
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_charts.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_cognitive.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_derive.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_discovery.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_documents.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_economics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_first_run.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_formula.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_gates.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_generic.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_grammar.py
RENAMED
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_handoff.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_hotspots.py
RENAMED
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_html_view.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_identity.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_in_loop.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_masking.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_mcp_audit.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_mcp_gate.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_mcp_grants.py
RENAMED
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_mcp_setup.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_oracle.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_pillars.py
RENAMED
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_practice.py
RENAMED
|
File without changes
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.1}/src/maintainability_audit/_precommit.py
RENAMED
|
File without changes
|