maintainability-agent 3.7.3__tar.gz → 3.7.4__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-3.7.3/src/maintainability_agent.egg-info → maintainability_agent-3.7.4}/PKG-INFO +2 -2
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/README.md +1 -1
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/pyproject.toml +1 -1
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4/src/maintainability_agent.egg-info}/PKG-INFO +2 -2
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_agent.egg-info/SOURCES.txt +4 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/__init__.py +1 -1
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_html_view.py +7 -2
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_mcp_audit.py +6 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_prompt_sections.py +13 -6
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_scan_view.py +8 -2
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_security_delegate.py +13 -2
- maintainability_agent-3.7.4/src/maintainability_audit/_security_work_order.py +120 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_work_order.py +24 -6
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_work_order_view.py +31 -7
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/config.py +1 -1
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/mcp_server.py +4 -1
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/renderers.py +7 -2
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/report.py +35 -18
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_analyzer_pinning.py +6 -3
- maintainability_agent-3.7.4/tests/test_security_findings_keep_their_handoff.py +156 -0
- maintainability_agent-3.7.4/tests/test_semantic_findings_stay_inside_the_audited_files.py +66 -0
- maintainability_agent-3.7.4/tests/test_withheld_work_keeps_its_boundary.py +107 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/LICENSE +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/setup.cfg +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_agent.egg-info/dependency_links.txt +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_agent.egg-info/entry_points.txt +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_agent.egg-info/requires.txt +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_agent.egg-info/top_level.txt +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/__main__.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_adapters.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_analysis.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_analyzer_sections.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_anchor.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_arguments.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_aspects.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_assets/analyzer-catalog.json +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_assets/standard.md +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_attestation.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_backfill.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_bands.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_banner.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_built_ins.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_calibration.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_catalog.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_charts.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_cognitive.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_config_defaults.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_conformance.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_corroborate.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_coverage_notes.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_criteria_scope.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_delegated_pillar.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_derive.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_discovery.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_documents.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_economics.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_economics_view.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_environment.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_evidence_reader.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_evidence_view.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_finding_match.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_first_run.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_formula.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_gates.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_generic.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_grammar.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_grant_ledger.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_history_view.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_hostile_prompt.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_hotspots.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_html_report_sections.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_identity.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_in_loop.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_in_loop_view.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_jvm_adapters.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_markdown_sections.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_masking.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_mcp_gate.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_mcp_grants.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_mcp_refusals.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_mcp_resources.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_mcp_setup.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_metric_adapters.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_metrics_types.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_operator_reads.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_pillars.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_practice.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_precommit.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_precommit_install.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_precommit_view.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_pressures.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ranges_c.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ranges_cobol.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ranges_core.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ranges_cpp.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ranges_csharp.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ranges_fortran.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ranges_go.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ranges_java.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ranges_js.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ranges_php.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ranges_ruby.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ranges_rust.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ranges_swift.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ratchet.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_ratio_adapters.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_recurrence.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_run_comparison.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_runner.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_safe_write.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_scan_history.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_second_source.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_selection.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_semantic.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_semantic_policy.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_semantic_ts.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_semantic_view.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_setup_errors.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_setup_persist.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_skill_data/SKILL.md +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_skill_data/agents/anthropic.yaml +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_skill_data/agents/copilot.yaml +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_skill_data/agents/openai.yaml +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_skill_data/copilot/maintainability-agent.prompt.md +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_skill_data/references/finding-taxonomy.md +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_skill_install.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_stored_grants.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_tdd_view.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_test_commands.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_test_execution.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_test_pairing.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_tokens.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_tool_adapters.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_trends.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_user_config.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_verdict_adapters.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_verification.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_work_order_weights.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_xml.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/baseline.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/cli.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/deadcode.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/declarations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/duplication.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/evidence.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/git_tools.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/history.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/idioms.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/instructions.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/metrics.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/prompts.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/sarif.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/scoring.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/similarity.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/source.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_acquisition_trust.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_adapter_docs.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_adapter_recordings.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_adapters.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_added_lines.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_analysis_coverage.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_analysis_execution.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_analyzer_bridge.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_analyzer_config_isolation.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_analyzer_estimate_claims.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_analyzer_primary_estimate.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_analyzer_provenance.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_analyzer_provenance_exclusions.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_analyzer_scoring_path.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_analyzer_spread_range.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_analyzer_xml_bounds.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_anchor_and_mode.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_anchor_caveat_and_counts_follow_the_run.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_anchor_disclosure.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_annotations_match_behaviour.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_anticipated_refusals.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_architecture.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_artifact_write_route_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_aspect_coverage.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_asset_snapshot_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_ast_reading_resolves_spellings.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_attestation.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_audit_components.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_authorization_freshness.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_authorship_gates.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_backfill.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_band_concealment_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_band_concealment_p3.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_band_pressures.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_bands.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_body_or_signature_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_build_output_is_not_the_repositorys_code.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_c_declarations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_calibration_corpus.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_calibration_drift.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_calibration_tooling.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_catalog_selection.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_catalog_tier_promise.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_chat_leads_with_the_work_order.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_chat_primary_docs.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_check_refuses_plus_only_fragments.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_checkstyle_adapter.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_checkstyle_catalog.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_child_sandbox.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_ci_history_recipe.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_ci_installs_the_analyzer_pool.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_claimed_languages.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_cli.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_clone_group_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_cobol_declarations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_cognitive_complexity.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_cohort_statistics.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_concealment_properties.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_config_shape.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_consent_and_grant.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_consumer_migration.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_contract_claims.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_corroborate.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_coverage_by_language.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_cpp_declarations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_criteria_completion.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_csharp_declarations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_d15_composition.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_d15_goal_directed.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_dead_code.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_declaration_criteria_scope.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_declaration_edge_cases.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_declaration_grading.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_declaration_ranges.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_declaration_source.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_declarative_parsers.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_declared_authorship.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_declared_imports.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_delegated_security_pillar.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_demo_tree.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_derivation_mix.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_determinism.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_dimension_ratchet.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_direct_runner_availability_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_discovery.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_doc_claims.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_docs_links.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_economic_context.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_empty_output_not_clean.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_empty_output_not_clean_adapters.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_environment_work_order.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_every_surface_says_what_the_run_found.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_evidence_invariants.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_evidence_normalization.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_evidence_properties.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_example_config_opens_claimed_languages.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_exclusion_dialects.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_exposure_never_outranks_band.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_falsifier_standard.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_file_list_cap_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_finding_identity.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_first_run_elicitation.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_first_run_prompt.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_first_run_reelicitation.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_fix_breadth_window.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_fixed_form_fortran.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_format_ask.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_fortran_declarations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_fortran_metrics.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_fortran_practice.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_git_argv.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_git_read_only.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_git_readonly_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_go_declarations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_grammar_constructs.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_grammar_token_coverage.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_grant_only_user_tier.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_history.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_history_boundary.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_history_manifest.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_history_schema2.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_history_window.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_hostile_prompt.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_html_executive.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_html_section_parity_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_identity_docs.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_identity_resolution.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_idiom_divergence.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_in_loop_budgets.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_in_loop_check.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_installed_wheel_runtime.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_instruction_targets.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_java_range_guard.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_java_ranges.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_java_scored.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_java_wiring.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_js_complexity_operators.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_js_declarations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_language_coverage.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_language_support_honesty.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_mcp_baseline_payload.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_mcp_format_contract.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_mcp_history.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_mcp_server.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_mcp_start_failure_names_what_is_installed.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_migration_1_0.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_near_duplicates.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_network_disclosure.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_one_setup_across_surfaces_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_operator_named_paths.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_operator_named_reads.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_pairing_reads_imports.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_pattern_budget.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_phase6_claims.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_php_declarations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_pillars_and_practice.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_platform_claim.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_pmd_adapter.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_pmd_audit_closures.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_policy_claims.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_pool_runs_by_config.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_population_floors.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_practice_nested_gates_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_precommit_staged.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_presentation_refusals.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_promises.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_prompt_does_not_issue_rates_when_unscored.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_prompt_escalation_once.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_prompt_honesty.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_prompt_location_escalation_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_prove_falsifiers.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_python_complexity.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_python_declarations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_read_boundary.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_readme_claims.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_recurrence.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_release_needs_an_empty_ledger.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_release_plan.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_release_plan_status.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_report_remedy_copy.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_roles_recorded.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_root_grants.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_rubric_ignores_project_lint_config.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_ruby_declarations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_run_comparison.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_runner.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_rust_declarations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_sarif.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_scan_history.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_scan_scope.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_scanner_unsafe_direction.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_scanning.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_schema_fidelity.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_scope_conformance.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_scoring_calibration.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_security_delegate_versions_agree.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_security_pillar_runs_and_shows.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_semantic_policy.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_setup_gate_completeness.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_setup_gate_independent_contract.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_setup_precondition.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_skill_install.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_sonar_resolve.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_source_index.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_spotbugs_adapter.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_spotbugs_catalog.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_stage8_contract.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_stdout_outputs.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_suite_isolation.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_swift_declarations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_tdd_structure.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_terminal_asks_the_same_questions.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_test_commands.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_test_execution_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_three_presentations.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_tool_resolution.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_tree_cannot_opt_the_host_in.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_tree_chosen_spawn.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_tree_reads_use_the_primitive.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_trends.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_type_fields_not_functions_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_uat_falsifiers.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_unanchored_set_matches_corpus.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_unread_code.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_user_config_tier.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_verification_audit_closures.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_verified_grade.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_version_claim.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_wheel_contents.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_work_items_state_their_own_finding.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_work_order.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_work_order_binds_to_this_interpreter.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_work_order_items.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_work_order_selection.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_workflow_supply_chain.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_write_boundary.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_write_route_class.py +0 -0
- {maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/tests/test_written_record.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: maintainability-agent
|
|
3
|
-
Version: 3.7.
|
|
3
|
+
Version: 3.7.4
|
|
4
4
|
Summary: Maintainability gate and AI remediation prompt generator for CI.
|
|
5
5
|
Author: Marshall Guillory
|
|
6
6
|
License: MIT
|
|
@@ -46,7 +46,7 @@ Dynamic: license-file
|
|
|
46
46
|
**A deterministic, offline maintainability audit whose output is a _bounded
|
|
47
47
|
work order_ for an AI coding agent** — a copy-paste prompt, per finding, that
|
|
48
48
|
says *fix exactly these and refactor nothing else*. Chat-primary; CLI for CI.
|
|
49
|
-
Version **3.7.
|
|
49
|
+
Version **3.7.4**.
|
|
50
50
|
|
|
51
51
|
**Languages parsed:** Python, Java, C, C++, C#, Go, Rust, PHP, Ruby, Swift,
|
|
52
52
|
COBOL, Fortran (free-form *and* fixed-form), and the JS/TS/HTML family — each
|
|
@@ -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 **3.7.
|
|
8
|
+
Version **3.7.4**.
|
|
9
9
|
|
|
10
10
|
**Languages parsed:** Python, Java, C, C++, C#, Go, Rust, PHP, Ruby, Swift,
|
|
11
11
|
COBOL, Fortran (free-form *and* fixed-form), and the JS/TS/HTML family — each
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "maintainability-agent"
|
|
7
|
-
version = "3.7.
|
|
7
|
+
version = "3.7.4"
|
|
8
8
|
description = "Maintainability gate and AI remediation prompt generator for CI."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
# 3.11, not 3.10. `_discovery`, `_pillars` and `_runner` all import
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: maintainability-agent
|
|
3
|
-
Version: 3.7.
|
|
3
|
+
Version: 3.7.4
|
|
4
4
|
Summary: Maintainability gate and AI remediation prompt generator for CI.
|
|
5
5
|
Author: Marshall Guillory
|
|
6
6
|
License: MIT
|
|
@@ -46,7 +46,7 @@ Dynamic: license-file
|
|
|
46
46
|
**A deterministic, offline maintainability audit whose output is a _bounded
|
|
47
47
|
work order_ for an AI coding agent** — a copy-paste prompt, per finding, that
|
|
48
48
|
says *fix exactly these and refactor nothing else*. Chat-primary; CLI for CI.
|
|
49
|
-
Version **3.7.
|
|
49
|
+
Version **3.7.4**.
|
|
50
50
|
|
|
51
51
|
**Languages parsed:** Python, Java, C, C++, C#, Go, Rust, PHP, Ruby, Swift,
|
|
52
52
|
COBOL, Fortran (free-form *and* fixed-form), and the JS/TS/HTML family — each
|
|
@@ -95,6 +95,7 @@ src/maintainability_audit/_scan_history.py
|
|
|
95
95
|
src/maintainability_audit/_scan_view.py
|
|
96
96
|
src/maintainability_audit/_second_source.py
|
|
97
97
|
src/maintainability_audit/_security_delegate.py
|
|
98
|
+
src/maintainability_audit/_security_work_order.py
|
|
98
99
|
src/maintainability_audit/_selection.py
|
|
99
100
|
src/maintainability_audit/_semantic.py
|
|
100
101
|
src/maintainability_audit/_semantic_policy.py
|
|
@@ -343,7 +344,9 @@ tests/test_schema_fidelity.py
|
|
|
343
344
|
tests/test_scope_conformance.py
|
|
344
345
|
tests/test_scoring_calibration.py
|
|
345
346
|
tests/test_security_delegate_versions_agree.py
|
|
347
|
+
tests/test_security_findings_keep_their_handoff.py
|
|
346
348
|
tests/test_security_pillar_runs_and_shows.py
|
|
349
|
+
tests/test_semantic_findings_stay_inside_the_audited_files.py
|
|
347
350
|
tests/test_semantic_policy.py
|
|
348
351
|
tests/test_setup_gate_completeness.py
|
|
349
352
|
tests/test_setup_gate_independent_contract.py
|
|
@@ -376,6 +379,7 @@ tests/test_verification_audit_closures.py
|
|
|
376
379
|
tests/test_verified_grade.py
|
|
377
380
|
tests/test_version_claim.py
|
|
378
381
|
tests/test_wheel_contents.py
|
|
382
|
+
tests/test_withheld_work_keeps_its_boundary.py
|
|
379
383
|
tests/test_work_items_state_their_own_finding.py
|
|
380
384
|
tests/test_work_order.py
|
|
381
385
|
tests/test_work_order_binds_to_this_interpreter.py
|
{maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_html_view.py
RENAMED
|
@@ -26,7 +26,9 @@ from . import _charts
|
|
|
26
26
|
from . import _evidence_view as view
|
|
27
27
|
from ._grammar import agreement
|
|
28
28
|
from ._html_report_sections import coverage_section, remaining_sections, trend_section
|
|
29
|
+
from ._security_work_order import complete_html as security_work_order_html
|
|
29
30
|
from ._semantic_view import semantic_class_label
|
|
31
|
+
from ._work_order import escalated_fingerprints
|
|
30
32
|
from ._work_order_view import prompt_body_lines
|
|
31
33
|
|
|
32
34
|
_SEVERITY_BY_RISK = {5: "Severe", 4: "High", 3: "Medium"}
|
|
@@ -82,6 +84,7 @@ def render_html(report: dict[str, Any], records: list[Any]) -> str:
|
|
|
82
84
|
*trend_section(report),
|
|
83
85
|
*remaining_sections(report),
|
|
84
86
|
*_work_order_section(report),
|
|
87
|
+
*security_work_order_html(report),
|
|
85
88
|
*_hard_gate_section(report),
|
|
86
89
|
*_unidentified_paths_section(report),
|
|
87
90
|
*_semantic_section(report),
|
|
@@ -290,10 +293,12 @@ def _work_order_section(report: dict[str, Any]) -> list[str]:
|
|
|
290
293
|
rows.extend([
|
|
291
294
|
"<h3>Copy-paste prompts</h3>",
|
|
292
295
|
"<p>One self-contained prompt per item — copy any block into a coding "
|
|
293
|
-
"agent
|
|
296
|
+
"agent. A block for an item that needs a design decision asks for that "
|
|
297
|
+
"decision, not a patch.</p>",
|
|
294
298
|
])
|
|
299
|
+
escalated = escalated_fingerprints(report)
|
|
295
300
|
for item in items:
|
|
296
|
-
body = "\n".join(prompt_body_lines(item, root_label))
|
|
301
|
+
body = "\n".join(prompt_body_lines(item, root_label, escalated))
|
|
297
302
|
rows.append(f"<h4>{escape(str(item.get('title') or ''))}</h4>")
|
|
298
303
|
rows.append(f"<pre>{escape(body)}</pre>")
|
|
299
304
|
return rows
|
{maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_mcp_audit.py
RENAMED
|
@@ -37,6 +37,7 @@ from ._scan_history import (
|
|
|
37
37
|
record_of,
|
|
38
38
|
segments,
|
|
39
39
|
)
|
|
40
|
+
from ._security_work_order import KEY as SECURITY_WORK_ORDER
|
|
40
41
|
from ._stored_grants import (
|
|
41
42
|
StaleStandingGrant,
|
|
42
43
|
refuse_a_stale_standing_grant,
|
|
@@ -301,6 +302,11 @@ def _top_level_result(report: dict[str, Any], root: Path, status: str,
|
|
|
301
302
|
# travels only for json, so the remedy cannot live only inside it.
|
|
302
303
|
if report.get("environment_work_order"):
|
|
303
304
|
result["environment_work_order"] = report["environment_work_order"]
|
|
305
|
+
# D179, on the same reasoning: the bounded chat view has no room for
|
|
306
|
+
# secure-code-agent's whole work order, and the report dict travels only
|
|
307
|
+
# for json, so it rides every format at the top level.
|
|
308
|
+
if report.get(SECURITY_WORK_ORDER):
|
|
309
|
+
result[SECURITY_WORK_ORDER] = report[SECURITY_WORK_ORDER]
|
|
304
310
|
if include_prompt:
|
|
305
311
|
result["remediation_prompt"] = render_ai_prompt(report)
|
|
306
312
|
return result
|
|
@@ -24,8 +24,10 @@ from typing import Any
|
|
|
24
24
|
|
|
25
25
|
from . import _evidence_view as view
|
|
26
26
|
from ._hotspots import hotspot_measure, hotspot_name
|
|
27
|
+
from ._security_work_order import KEY as SECURITY_WORK_ORDER
|
|
28
|
+
from ._security_work_order import severity_counts
|
|
27
29
|
from ._tdd_view import tdd_sentences
|
|
28
|
-
from ._work_order import prompt_items
|
|
30
|
+
from ._work_order import escalated_fingerprints, prompt_items
|
|
29
31
|
|
|
30
32
|
|
|
31
33
|
def prompt_tdd_section(report: dict[str, Any]) -> list[str]:
|
|
@@ -134,10 +136,18 @@ def prompt_security_pillar(report: dict[str, Any]) -> list[str]:
|
|
|
134
136
|
producer = entry.get("delegated_to") or "the delegated tool"
|
|
135
137
|
version = f" {entry['producer_version']}" if entry.get("producer_version") else ""
|
|
136
138
|
condition = "not graded" if entry.get("condition") is None else f"{entry['condition']:.1f}"
|
|
139
|
+
counts = severity_counts(entry)
|
|
140
|
+
found = f" Findings: {counts}." if counts else ""
|
|
141
|
+
# Where that tool's work order is, when this run kept it (D179). The
|
|
142
|
+
# prompt names it rather than absorbing it: the security findings are
|
|
143
|
+
# not this prompt's task, and are not re-ranked into it.
|
|
144
|
+
where = (f" Its own work order for them is `{SECURITY_WORK_ORDER}`, in the report."
|
|
145
|
+
if report.get(SECURITY_WORK_ORDER) else "")
|
|
137
146
|
return [
|
|
138
147
|
f"**Security pillar (measured by {producer}{version}):** posture "
|
|
139
148
|
f"{entry.get('posture')}, practice level {entry.get('practice')}, condition "
|
|
140
|
-
f"{condition}. Its findings are that tool's work order, not this
|
|
149
|
+
f"{condition}.{found} Its findings are that tool's work order, not this "
|
|
150
|
+
f"one.{where}",
|
|
141
151
|
"",
|
|
142
152
|
]
|
|
143
153
|
|
|
@@ -188,10 +198,7 @@ def _prompt_work_items(report: dict[str, Any]) -> list[dict[str, Any]]:
|
|
|
188
198
|
# Withhold anything the history shows was fixed and came back
|
|
189
199
|
# twice. Naming it as a design candidate while asking an agent to
|
|
190
200
|
# patch it a third time would change nothing.
|
|
191
|
-
escalated
|
|
192
|
-
item["fingerprint"] for item in report.get("design_review_candidates") or []
|
|
193
|
-
}
|
|
194
|
-
return prompt_items(report.get("work_order") or [], escalated=escalated)
|
|
201
|
+
return prompt_items(report.get("work_order") or [], escalated=escalated_fingerprints(report))
|
|
195
202
|
|
|
196
203
|
|
|
197
204
|
def prompt_has_work(report: dict[str, Any]) -> bool:
|
{maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_scan_view.py
RENAMED
|
@@ -19,6 +19,7 @@ from __future__ import annotations
|
|
|
19
19
|
from typing import Any
|
|
20
20
|
|
|
21
21
|
from ._coverage_notes import coverage_notes
|
|
22
|
+
from ._security_work_order import severity_counts
|
|
22
23
|
|
|
23
24
|
|
|
24
25
|
def _by_language_rows(coverage: dict[str, Any]) -> list[str]:
|
|
@@ -364,15 +365,20 @@ def pillar_cells(entry: dict[str, Any]) -> tuple[str, str]:
|
|
|
364
365
|
condition = "—" if entry["condition"] is None else f"{entry['condition']:.1f}"
|
|
365
366
|
if entry["posture"] is None:
|
|
366
367
|
return condition, "not measured — see below"
|
|
368
|
+
# What the producer found, in both states: an ungraded pillar still
|
|
369
|
+
# counted its findings, and printing only why no grade was issued hid
|
|
370
|
+
# five critical ones behind "scanner coverage is partial" (D179).
|
|
371
|
+
counts = severity_counts(entry)
|
|
372
|
+
found = f"; findings: {counts}" if counts else ""
|
|
367
373
|
if entry["condition"] is None:
|
|
368
374
|
# An ungraded pillar is `unverified` because nothing could be graded,
|
|
369
375
|
# not because a clean scan lacks enforcement — the note for that cell
|
|
370
376
|
# told a reader of secure-code-agent's partial-coverage pillar that
|
|
371
377
|
# its scan was clean (D176). Say why no grade was issued instead.
|
|
372
378
|
why = (entry.get("evidence_reasons") or [None])[0] or "the evidence could not support a grade"
|
|
373
|
-
return condition, f"{entry['posture']}: not graded — {why}"
|
|
379
|
+
return condition, f"{entry['posture']}: not graded — {why}{found}"
|
|
374
380
|
note = POSTURE_NOTE.get(entry["posture"], entry["posture"])
|
|
375
|
-
return condition, f"{entry['posture']}: {note}"
|
|
381
|
+
return condition, f"{entry['posture']}: {note}{found}"
|
|
376
382
|
|
|
377
383
|
|
|
378
384
|
def _pillar_row(entry: dict[str, Any]) -> str:
|
|
@@ -11,7 +11,8 @@ Marshall: the pillar is complete, so the audit runs it.
|
|
|
11
11
|
**What the child writes.** Every report `secure-code-agent` can produce is
|
|
12
12
|
redirected into a temporary directory this process owns: the Markdown and
|
|
13
13
|
JSON reports, SARIF, the PR comment, the remediation prompt and the pillar
|
|
14
|
-
document itself. The
|
|
14
|
+
document itself. The pillar document and the remediation prompt — that
|
|
15
|
+
tool's work order — are read back before the directory goes (D179). The one write that cannot be redirected is its append-only
|
|
15
16
|
trend, `.secure-code/history.jsonl` in the audited tree, which it writes on
|
|
16
17
|
every run from its own configuration. Turning that off would mean handing
|
|
17
18
|
it a configuration from outside the tree, and `secure-code-agent` trusts an
|
|
@@ -71,6 +72,9 @@ class DelegateRun:
|
|
|
71
72
|
document: dict[str, Any] | None
|
|
72
73
|
reason: str | None = None
|
|
73
74
|
environment: list[dict[str, str]] = field(default_factory=list)
|
|
75
|
+
#: The delegate's own remediation prompt — its work order — read before
|
|
76
|
+
#: the directory it was written into is deleted (D179).
|
|
77
|
+
work_order: str | None = None
|
|
74
78
|
|
|
75
79
|
|
|
76
80
|
def _install_remedy(reason: str) -> dict[str, str]:
|
|
@@ -120,7 +124,7 @@ def run_security_delegate(
|
|
|
120
124
|
), timeout_seconds=timeout_seconds)
|
|
121
125
|
document = read_produced(pillar)
|
|
122
126
|
if document is not None:
|
|
123
|
-
return DelegateRun(document)
|
|
127
|
+
return DelegateRun(document, work_order=_read_text(out / "prompt.md"))
|
|
124
128
|
if result.outcome is Outcome.TIMED_OUT:
|
|
125
129
|
return DelegateRun(None, f"secure-code-agent did not finish within {timeout_seconds}s")
|
|
126
130
|
detail = _last_line(result.stderr) or _last_line(result.stdout) or result.detail
|
|
@@ -158,6 +162,13 @@ def _installed_version() -> tuple[int, ...] | None:
|
|
|
158
162
|
return tuple(parts) or None
|
|
159
163
|
|
|
160
164
|
|
|
165
|
+
def _read_text(path: Path) -> str | None:
|
|
166
|
+
try:
|
|
167
|
+
return path.read_text(encoding="utf-8")
|
|
168
|
+
except (OSError, UnicodeDecodeError):
|
|
169
|
+
return None
|
|
170
|
+
|
|
171
|
+
|
|
161
172
|
def _last_line(text: str | None) -> str:
|
|
162
173
|
lines = [line.strip() for line in (text or "").splitlines() if line.strip()]
|
|
163
174
|
return lines[-1][:200] if lines else ""
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"""What secure-code-agent found, and its own work order for it (D179).
|
|
2
|
+
|
|
3
|
+
3.7.0 made every audit run secure-code-agent (D177), and then kept one
|
|
4
|
+
thing from that run: the pillar document. An audit of this repository
|
|
5
|
+
recorded five critical findings and one high, and every skin printed
|
|
6
|
+
"unverified: not graded — scanner coverage is partial" with no count. The
|
|
7
|
+
remediation prompt secure-code-agent had written — 74 findings to fix, 5 to
|
|
8
|
+
review, each located and constrained — sat in a temporary directory that
|
|
9
|
+
was deleted before the report was built. The run measured the work and the
|
|
10
|
+
reader was handed neither its size nor its instructions.
|
|
11
|
+
|
|
12
|
+
**Two things, each where it is read.** The severity counts come from the
|
|
13
|
+
pillar document and appear wherever the pillar does. The work order is
|
|
14
|
+
secure-code-agent's own text, carried unchanged under `security_work_order`
|
|
15
|
+
and printed whole in the complete reports. It stays that tool's work order,
|
|
16
|
+
not this one's: this tool does not re-rank, merge or reword security
|
|
17
|
+
findings (ADR 007 §1), so the maintainability prompt names it and does not
|
|
18
|
+
absorb it.
|
|
19
|
+
"""
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
from html import escape
|
|
23
|
+
from typing import Any
|
|
24
|
+
|
|
25
|
+
#: The report key, and the chat door's top-level key, that carries it.
|
|
26
|
+
KEY = "security_work_order"
|
|
27
|
+
|
|
28
|
+
_ORDER = ("critical", "high", "medium", "low", "informational")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def severity_counts(entry: dict[str, Any]) -> str | None:
|
|
32
|
+
"""`5 critical, 1 high, …` from a measured pillar, or `None` when it carries none.
|
|
33
|
+
|
|
34
|
+
A pillar document with an empty count reads "no findings": that is the
|
|
35
|
+
producer's statement, and it is different from a pillar with no count at
|
|
36
|
+
all, which says nothing and is printed as nothing.
|
|
37
|
+
"""
|
|
38
|
+
counts = entry.get("findings_by_severity")
|
|
39
|
+
if not isinstance(counts, dict):
|
|
40
|
+
return None
|
|
41
|
+
named = [name for name in _ORDER if counts.get(name)]
|
|
42
|
+
named += sorted(name for name in counts if name not in _ORDER and counts[name])
|
|
43
|
+
if not named:
|
|
44
|
+
return "no findings"
|
|
45
|
+
return ", ".join(f"{counts[name]} {name}" for name in named)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def carried(markdown: str | None, entry: dict[str, Any]) -> dict[str, Any] | None:
|
|
49
|
+
"""The report entry for a work order the delegate wrote, or `None`."""
|
|
50
|
+
if not markdown or not markdown.strip():
|
|
51
|
+
return None
|
|
52
|
+
return {
|
|
53
|
+
"producer": entry.get("delegated_to"),
|
|
54
|
+
"producer_version": entry.get("producer_version"),
|
|
55
|
+
"markdown": markdown,
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _source(work_order: dict[str, Any]) -> str:
|
|
60
|
+
version = f" {work_order['producer_version']}" if work_order.get("producer_version") else ""
|
|
61
|
+
return f"{work_order.get('producer') or 'the delegated tool'}{version}"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def pointer_markdown(report: dict[str, Any]) -> list[str]:
|
|
65
|
+
"""The bounded view's line: the work order exists, and where it is."""
|
|
66
|
+
work_order = report.get(KEY)
|
|
67
|
+
if not work_order:
|
|
68
|
+
return []
|
|
69
|
+
return [
|
|
70
|
+
f"**Security work order.** {_source(work_order)} wrote its own work order "
|
|
71
|
+
f"for these findings. It is carried whole as `{KEY}` and printed in the "
|
|
72
|
+
"complete Markdown and HTML reports.",
|
|
73
|
+
"",
|
|
74
|
+
]
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _demoted(markdown: str) -> list[str]:
|
|
78
|
+
"""The delegate's headings two levels down, so they nest under this report's.
|
|
79
|
+
|
|
80
|
+
Lines inside a fence are left alone: a `#` there is a comment in a quoted
|
|
81
|
+
snippet, not a heading.
|
|
82
|
+
"""
|
|
83
|
+
lines = []
|
|
84
|
+
fenced = False
|
|
85
|
+
for line in markdown.rstrip("\n").splitlines():
|
|
86
|
+
if line.lstrip().startswith("```"):
|
|
87
|
+
fenced = not fenced
|
|
88
|
+
elif not fenced and line.startswith("#"):
|
|
89
|
+
line = "##" + line
|
|
90
|
+
lines.append(line)
|
|
91
|
+
return lines
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _intro(work_order: dict[str, Any]) -> str:
|
|
95
|
+
return (
|
|
96
|
+
f"Written by {_source(work_order)} and reproduced as it wrote it. It is "
|
|
97
|
+
"that tool's work order, not this one's: its findings are not re-ranked "
|
|
98
|
+
"or merged into the maintainability work order above."
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def complete_markdown(report: dict[str, Any]) -> list[str]:
|
|
103
|
+
"""The complete report's section: the delegate's work order, whole."""
|
|
104
|
+
work_order = report.get(KEY)
|
|
105
|
+
if not work_order:
|
|
106
|
+
return []
|
|
107
|
+
return ["## Security Work Order", "", _intro(work_order), "",
|
|
108
|
+
*_demoted(work_order["markdown"]), ""]
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def complete_html(report: dict[str, Any]) -> list[str]:
|
|
112
|
+
"""The HTML report's section: the same text, preformatted."""
|
|
113
|
+
work_order = report.get(KEY)
|
|
114
|
+
if not work_order:
|
|
115
|
+
return []
|
|
116
|
+
return [
|
|
117
|
+
"<h2>Security Work Order</h2>",
|
|
118
|
+
f"<p>{escape(_intro(work_order))}</p>",
|
|
119
|
+
f"<pre>{escape(work_order['markdown'])}</pre>",
|
|
120
|
+
]
|
{maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/_work_order.py
RENAMED
|
@@ -479,6 +479,29 @@ def combined_delta(report: dict[str, Any], items: list[dict[str, Any]]) -> float
|
|
|
479
479
|
return round(max(0.0, (after or before) - before), 3)
|
|
480
480
|
|
|
481
481
|
|
|
482
|
+
def escalated_fingerprints(report: dict[str, Any]) -> set[str]:
|
|
483
|
+
"""The findings history shows were fixed and came back, as fingerprints."""
|
|
484
|
+
return {item["fingerprint"] for item in report.get("design_review_candidates") or []}
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
def withheld_reason(item: dict[str, Any], escalated: set[str] | None = None) -> str | None:
|
|
488
|
+
"""Why no agent is handed this item as a patch, or `None` when one is (D180).
|
|
489
|
+
|
|
490
|
+
The one rule the bounded prompt and every copy-paste block read. The
|
|
491
|
+
prompt withheld the demo's two duplicated blocks as needing a design
|
|
492
|
+
decision while the report's standalone block for each said "Task: remove
|
|
493
|
+
the duplicated block" — the same run authorising and forbidding the same
|
|
494
|
+
change, depending on which text was pasted.
|
|
495
|
+
"""
|
|
496
|
+
if item["band"] == Band.MAJOR_PROJECT.value:
|
|
497
|
+
return ("it is a Major Project — the change it needs is a design "
|
|
498
|
+
"decision before code moves, not one reviewable patch")
|
|
499
|
+
if item.get("fingerprint") in (escalated or set()):
|
|
500
|
+
return ("it was fixed before and came back, so the same edit is known "
|
|
501
|
+
"not to hold and the surrounding design needs a decision")
|
|
502
|
+
return None
|
|
503
|
+
|
|
504
|
+
|
|
482
505
|
def prompt_items(items: list[dict[str, Any]], limit: int = 12,
|
|
483
506
|
escalated: set[str] | None = None) -> list[dict[str, Any]]:
|
|
484
507
|
"""Agent subset: no major projects, no escalated returns; Severe leads.
|
|
@@ -487,12 +510,7 @@ def prompt_items(items: list[dict[str, Any]], limit: int = 12,
|
|
|
487
510
|
so a risk-5 item can still sit below hotter Quick Wins of other classes.
|
|
488
511
|
The table can stay exposure-ordered; the paste of 12 cannot drop Severe.
|
|
489
512
|
"""
|
|
490
|
-
|
|
491
|
-
eligible = [
|
|
492
|
-
item for item in items
|
|
493
|
-
if item["band"] != Band.MAJOR_PROJECT.value
|
|
494
|
-
and item.get("fingerprint") not in blocked
|
|
495
|
-
]
|
|
513
|
+
eligible = [item for item in items if withheld_reason(item, escalated) is None]
|
|
496
514
|
severe = [item for item in eligible if item.get("risk") == 5]
|
|
497
515
|
rest = [item for item in eligible if item.get("risk") != 5]
|
|
498
516
|
return _one_per_class(severe + rest)[:limit]
|
|
@@ -21,7 +21,7 @@ from __future__ import annotations
|
|
|
21
21
|
|
|
22
22
|
from typing import Any
|
|
23
23
|
|
|
24
|
-
from ._work_order import work_order_rows
|
|
24
|
+
from ._work_order import withheld_reason, work_order_rows
|
|
25
25
|
from ._work_order_weights import AUDIT_VERIFICATION
|
|
26
26
|
|
|
27
27
|
# The report lists the whole backlog; these caps apply only to the bounded
|
|
@@ -40,7 +40,9 @@ def item_location(item: dict[str, Any]) -> str:
|
|
|
40
40
|
return item["path"] + (f":{item['line']}" if item.get("line") else "")
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
def prompt_body_lines(
|
|
43
|
+
def prompt_body_lines(
|
|
44
|
+
item: dict[str, Any], root_label: str = ".", escalated: set[str] | None = None,
|
|
45
|
+
) -> list[str]:
|
|
44
46
|
"""The copy-paste prompt text for one item, skin-agnostic.
|
|
45
47
|
|
|
46
48
|
Deterministic: built entirely from the item's own fields, so the same
|
|
@@ -48,7 +50,26 @@ def prompt_body_lines(item: dict[str, Any], root_label: str = ".") -> list[str]:
|
|
|
48
50
|
Markdown fences it as ``text`` and HTML wraps it in ``<pre>``; the text
|
|
49
51
|
between is identical, so the two skins can never disagree about what an
|
|
50
52
|
agent is being asked to do.
|
|
53
|
+
|
|
54
|
+
**A block travels alone, so it carries its own boundary (D180).** An
|
|
55
|
+
item the bounded prompt withholds is still listed with a block — a
|
|
56
|
+
human deciding on a forty-file deduplication needs to see it — but the
|
|
57
|
+
block asks for the decision, never the patch.
|
|
51
58
|
"""
|
|
59
|
+
withheld = withheld_reason(item, escalated)
|
|
60
|
+
if withheld:
|
|
61
|
+
return [
|
|
62
|
+
f"Repository: {root_label}",
|
|
63
|
+
f"Design decision needed, not a patch: {item['title']}.",
|
|
64
|
+
f"Location: {item_location(item)}",
|
|
65
|
+
f"Why: {item['rationale']}",
|
|
66
|
+
f"Direction once decided: {item['target']}.",
|
|
67
|
+
"",
|
|
68
|
+
f"Do not change code for this item, because {withheld}. Lay out the "
|
|
69
|
+
"options for the surrounding design — what each would change, and "
|
|
70
|
+
"where — then stop for a human decision. If this is a false "
|
|
71
|
+
"positive, say so.",
|
|
72
|
+
]
|
|
52
73
|
verify = item.get("verification") or AUDIT_VERIFICATION
|
|
53
74
|
return [
|
|
54
75
|
f"Repository: {root_label}",
|
|
@@ -63,7 +84,9 @@ def prompt_body_lines(item: dict[str, Any], root_label: str = ".") -> list[str]:
|
|
|
63
84
|
]
|
|
64
85
|
|
|
65
86
|
|
|
66
|
-
def item_prompt_block(
|
|
87
|
+
def item_prompt_block(
|
|
88
|
+
item: dict[str, Any], root_label: str = ".", escalated: set[str] | None = None,
|
|
89
|
+
) -> list[str]:
|
|
67
90
|
"""One item's copy-paste prompt as Markdown: heading, then a fenced block.
|
|
68
91
|
|
|
69
92
|
Fenced as ``text`` so a reader copies the whole thing into a coding
|
|
@@ -76,7 +99,7 @@ def item_prompt_block(item: dict[str, Any], root_label: str = ".") -> list[str]:
|
|
|
76
99
|
f"`{item_location(item)}` · {item['band']}",
|
|
77
100
|
"",
|
|
78
101
|
"```text",
|
|
79
|
-
*prompt_body_lines(item, root_label),
|
|
102
|
+
*prompt_body_lines(item, root_label, escalated),
|
|
80
103
|
"```",
|
|
81
104
|
"",
|
|
82
105
|
]
|
|
@@ -114,7 +137,7 @@ _BAND_IS_PER_CLASS = (
|
|
|
114
137
|
|
|
115
138
|
def work_order_markdown(
|
|
116
139
|
items: list[dict[str, Any]] | None, *, complete: bool = False, root_label: str = ".",
|
|
117
|
-
exposure_ordered: bool = False,
|
|
140
|
+
exposure_ordered: bool = False, escalated: set[str] | None = None,
|
|
118
141
|
) -> list[str]:
|
|
119
142
|
"""The ordered work, worth first, with a copy-paste prompt for each item.
|
|
120
143
|
|
|
@@ -149,10 +172,11 @@ def work_order_markdown(
|
|
|
149
172
|
lines.extend([
|
|
150
173
|
"### Copy-paste prompts", "",
|
|
151
174
|
"One self-contained prompt per item — paste any block whole into a "
|
|
152
|
-
"coding agent.
|
|
175
|
+
"coding agent. A block for an item that needs a design decision asks "
|
|
176
|
+
"for that decision, not a patch.", "",
|
|
153
177
|
])
|
|
154
178
|
for item in items[:limit]:
|
|
155
|
-
lines.extend(item_prompt_block(item, root_label))
|
|
179
|
+
lines.extend(item_prompt_block(item, root_label, escalated))
|
|
156
180
|
return lines
|
|
157
181
|
|
|
158
182
|
|
{maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/config.py
RENAMED
|
@@ -20,7 +20,7 @@ from ._operator_reads import (
|
|
|
20
20
|
# still the door every caller comes through.
|
|
21
21
|
__all__ = ["DEFAULT_CONFIG", "DEFAULT_IDIOM_GROUPS", "PROJECT_URL", "VERSION"]
|
|
22
22
|
|
|
23
|
-
VERSION = "3.7.
|
|
23
|
+
VERSION = "3.7.4"
|
|
24
24
|
|
|
25
25
|
PROJECT_URL = "https://github.com/marshallguillory86/maintainability-agent"
|
|
26
26
|
|
{maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/mcp_server.py
RENAMED
|
@@ -94,7 +94,10 @@ SERVER_INSTRUCTIONS = (
|
|
|
94
94
|
"from one, because none was computed. When a result carries "
|
|
95
95
|
"environment_work_order, surface it to the user: each entry names a "
|
|
96
96
|
"selected analyzer that could not run, its install command, and the "
|
|
97
|
-
"concepts installing it restores.
|
|
97
|
+
"concepts installing it restores. When a result carries "
|
|
98
|
+
"security_work_order, it is secure-code-agent's own work order for the "
|
|
99
|
+
"security findings the pillar counts: show it as that tool wrote it, "
|
|
100
|
+
"and keep it apart from the maintainability remediation_prompt. It never edits source, "
|
|
98
101
|
"and it never writes a report into the "
|
|
99
102
|
"tree — report text is returned for the host to show or save. Treat "
|
|
100
103
|
"missing or insufficient evidence as an audit limitation, not a code "
|
{maintainability_agent-3.7.3 → maintainability_agent-3.7.4}/src/maintainability_audit/renderers.py
RENAMED
|
@@ -30,8 +30,11 @@ from ._scan_view import (
|
|
|
30
30
|
undetected_declarations_markdown,
|
|
31
31
|
unread_source_markdown,
|
|
32
32
|
)
|
|
33
|
+
from ._security_work_order import complete_markdown as security_work_order_markdown
|
|
34
|
+
from ._security_work_order import pointer_markdown as security_work_order_pointer
|
|
33
35
|
from ._semantic_view import semantic_markdown, without_semantic_suffixes
|
|
34
36
|
from ._tdd_view import tdd_structure_markdown
|
|
37
|
+
from ._work_order import escalated_fingerprints
|
|
35
38
|
from ._work_order_view import NOTHING_TO_DO, work_order_markdown, work_order_selection_markdown
|
|
36
39
|
|
|
37
40
|
|
|
@@ -209,7 +212,7 @@ def _bounded_markdown(report: dict[str, Any], score: dict[str, Any],
|
|
|
209
212
|
lines.extend(_hard_gate_lines(report))
|
|
210
213
|
work_order = work_order_markdown(
|
|
211
214
|
report.get("work_order"), complete=False, root_label=root_label,
|
|
212
|
-
exposure_ordered=_exposure_ordered(report))
|
|
215
|
+
exposure_ordered=_exposure_ordered(report), escalated=escalated_fingerprints(report))
|
|
213
216
|
lines.extend(work_order or _no_work_order_lines())
|
|
214
217
|
lines.extend(summary)
|
|
215
218
|
lines.extend(render_grade_blockers(report))
|
|
@@ -220,6 +223,7 @@ def _bounded_markdown(report: dict[str, Any], score: dict[str, Any],
|
|
|
220
223
|
# view printed nothing about security at all, measured or not, and a
|
|
221
224
|
# missing pillar read exactly like a clean one (ADR 007).
|
|
222
225
|
lines.extend(pillars_markdown(report.get("pillars"), report.get("practice")))
|
|
226
|
+
lines.extend(security_work_order_pointer(report))
|
|
223
227
|
lines.extend([
|
|
224
228
|
"---", "",
|
|
225
229
|
"This is the bounded UI view. The complete report — every finding, "
|
|
@@ -254,7 +258,8 @@ def _complete_markdown(report: dict[str, Any], score: dict[str, Any],
|
|
|
254
258
|
else:
|
|
255
259
|
lines.extend(work_order_markdown(
|
|
256
260
|
report.get("work_order"), complete=True, root_label=root_label,
|
|
257
|
-
exposure_ordered=_exposure_ordered(report)))
|
|
261
|
+
exposure_ordered=_exposure_ordered(report), escalated=escalated_fingerprints(report)))
|
|
262
|
+
lines.extend(security_work_order_markdown(report))
|
|
258
263
|
lines.extend(economic_impact_markdown(report.get("economic_impact")))
|
|
259
264
|
lines.extend(tdd_structure_markdown(report.get("tdd_structure")))
|
|
260
265
|
lines.extend(test_suite_markdown(report))
|