devagent-ai 0.8.3__tar.gz → 0.8.5__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.
- {devagent_ai-0.8.3/devagent_ai.egg-info → devagent_ai-0.8.5}/PKG-INFO +36 -1
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/README.md +33 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/__init__.py +1 -1
- devagent_ai-0.8.5/devagent/__main__.py +4 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/cli.py +91 -4
- devagent_ai-0.8.5/devagent/entrypoint.py +22 -0
- devagent_ai-0.8.5/devagent/plc/__init__.py +185 -0
- devagent_ai-0.8.5/devagent/plc/agent_harness_install_v15.py +27 -0
- devagent_ai-0.8.5/devagent/plc/agent_harness_v15.py +208 -0
- devagent_ai-0.8.5/devagent/plc/analysis.py +650 -0
- devagent_ai-0.8.5/devagent/plc/cli.py +320 -0
- devagent_ai-0.8.5/devagent/plc/execution_trust.py +176 -0
- devagent_ai-0.8.5/devagent/plc/fat_procedure_v12.py +165 -0
- devagent_ai-0.8.5/devagent/plc/four_contract_v13.py +196 -0
- devagent_ai-0.8.5/devagent/plc/inspect_cli.py +164 -0
- devagent_ai-0.8.5/devagent/plc/models.py +332 -0
- devagent_ai-0.8.5/devagent/plc/plc_dispatch.py +41 -0
- devagent_ai-0.8.5/devagent/plc/production.py +480 -0
- devagent_ai-0.8.5/devagent/plc/production_ai.py +440 -0
- devagent_ai-0.8.5/devagent/plc/production_evidence.py +159 -0
- devagent_ai-0.8.5/devagent/plc/production_models.py +220 -0
- devagent_ai-0.8.5/devagent/plc/production_readiness.py +223 -0
- devagent_ai-0.8.5/devagent/plc/production_readiness_v5.py +279 -0
- devagent_ai-0.8.5/devagent/plc/production_regression.py +306 -0
- devagent_ai-0.8.5/devagent/plc/production_report.py +325 -0
- devagent_ai-0.8.5/devagent/plc/production_review.py +253 -0
- devagent_ai-0.8.5/devagent/plc/production_utils.py +57 -0
- devagent_ai-0.8.5/devagent/plc/production_v5.py +412 -0
- devagent_ai-0.8.5/devagent/plc/production_verification.py +397 -0
- devagent_ai-0.8.5/devagent/plc/professional_report_install_v14.py +37 -0
- devagent_ai-0.8.5/devagent/plc/professional_report_v14.py +252 -0
- devagent_ai-0.8.5/devagent/plc/release_policy.py +230 -0
- devagent_ai-0.8.5/devagent/plc/report.py +114 -0
- devagent_ai-0.8.5/devagent/plc/report_clarity_install_v16.py +65 -0
- devagent_ai-0.8.5/devagent/plc/requirements.py +260 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_action_requirements.py +146 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_alias_hardening.py +273 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_branch_coverage_v16.py +90 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_closeout.py +307 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_closeout_gate_hardening.py +224 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_compare.py +489 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_compare_hardening.py +466 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_compare_reachability_hardening.py +127 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_core_review_v12.py +226 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_echo.py +483 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_echo_gate.py +42 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_entrypoint_hardening.py +227 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_general_actions.py +387 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_l5x.py +509 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_motion_runtime_v11.py +149 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_regression_case_compat_v12.py +86 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_regression_evidence_hardening.py +583 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_requirement_hardening.py +127 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_risk_hardening.py +155 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_semantic_capabilities.py +92 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_st_case_v11.py +215 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_st_v10.py +52 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_standard_catalog.py +146 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_state_machine_v11.py +219 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_stateful_runtime.py +288 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_structure.py +260 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_system_service_install_v17.py +147 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_system_service_report_install_v17.py +51 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_system_service_v17.py +363 -0
- devagent_ai-0.8.5/devagent/plc/rockwell_v10_semantics.py +352 -0
- devagent_ai-0.8.5/devagent/plc/safe_analysis.py +247 -0
- devagent_ai-0.8.5/devagent/plc/semantic_coverage.py +238 -0
- devagent_ai-0.8.5/devagent/plc/semantic_coverage_report.py +197 -0
- devagent_ai-0.8.5/devagent/plc/siemens_call_graph_v3.py +1719 -0
- devagent_ai-0.8.5/devagent/plc/siemens_cli_install_v1.py +38 -0
- devagent_ai-0.8.5/devagent/plc/siemens_flgnet_extended_hardening_v4.py +257 -0
- devagent_ai-0.8.5/devagent/plc/siemens_flgnet_extended_v4.py +916 -0
- devagent_ai-0.8.5/devagent/plc/siemens_flgnet_hardening_v4.py +128 -0
- devagent_ai-0.8.5/devagent/plc/siemens_flgnet_v4.py +1284 -0
- devagent_ai-0.8.5/devagent/plc/siemens_integration_v1.py +526 -0
- devagent_ai-0.8.5/devagent/plc/siemens_interlock_permissive_v6.py +694 -0
- devagent_ai-0.8.5/devagent/plc/siemens_recovery_v7.py +567 -0
- devagent_ai-0.8.5/devagent/plc/siemens_scl_control_flow_hardening_v2.py +97 -0
- devagent_ai-0.8.5/devagent/plc/siemens_scl_control_flow_v2.py +588 -0
- devagent_ai-0.8.5/devagent/plc/siemens_state_machine_hardening_v5.py +206 -0
- devagent_ai-0.8.5/devagent/plc/siemens_state_machine_v5.py +1067 -0
- devagent_ai-0.8.5/devagent/plc/siemens_tia_v1.py +1050 -0
- devagent_ai-0.8.5/devagent/plc/siemens_v5_bindings_v1.py +32 -0
- devagent_ai-0.8.5/devagent/plc/siemens_v6_v7_token_hardening.py +155 -0
- devagent_ai-0.8.5/devagent/plc/signature_trust.py +212 -0
- devagent_ai-0.8.5/devagent/plc/trusted_snapshot.py +333 -0
- devagent_ai-0.8.5/devagent/plc/v2_guardrails.py +234 -0
- devagent_ai-0.8.5/devagent/plc/v2_semantics.py +780 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5/devagent_ai.egg-info}/PKG-INFO +36 -1
- devagent_ai-0.8.5/devagent_ai.egg-info/SOURCES.txt +222 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent_ai.egg-info/entry_points.txt +1 -1
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent_ai.egg-info/requires.txt +1 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/pyproject.toml +4 -2
- devagent_ai-0.8.5/tests/test_cli_progress.py +91 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_packaging_metadata.py +1 -1
- devagent_ai-0.8.5/tests/test_plc_agent_harness_trace_v15.py +91 -0
- devagent_ai-0.8.5/tests/test_plc_agent_harness_v15.py +259 -0
- devagent_ai-0.8.5/tests/test_plc_execution_trust.py +63 -0
- devagent_ai-0.8.5/tests/test_plc_four_contract_v13.py +179 -0
- devagent_ai-0.8.5/tests/test_plc_product_contract_v12.py +190 -0
- devagent_ai-0.8.5/tests/test_plc_production.py +453 -0
- devagent_ai-0.8.5/tests/test_plc_production_v5.py +358 -0
- devagent_ai-0.8.5/tests/test_plc_release_policy.py +78 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_boolean_alias_proof.py +92 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_canonical_risks.py +82 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_closeout_v9.py +180 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_closeout_v9_guardrails.py +85 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_closeout_v9_review_regressions.py +78 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_compare_v8.py +227 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_compare_v8_aliases.py +147 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_compare_v8_hardening.py +122 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_compare_v8_identity_assertions.py +185 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_compare_v8_review_regressions.py +145 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_echo_cli_v6.py +47 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_echo_v6.py +337 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_hardening.py +207 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_semantics_v7.py +140 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v1.py +218 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v10_action_requirements.py +78 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v10_arbitrary_project_qualification.py +142 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v10_echo_compatibility.py +119 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v10_general_actions.py +110 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v10_general_semantics.py +264 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v10_inspect_cli.py +92 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v10_semantic_coverage.py +144 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v10_st_safe_functions.py +46 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v10_stateful_runtime.py +67 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v11_reporting.py +53 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v11_st_motion.py +106 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v11_state_machine.py +68 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v16_semantic_hardening.py +99 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v17_system_service_fat.py +150 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v17_system_service_generic.py +61 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v2.py +242 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v9_entry_edgecases.py +105 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v9_final_codex.py +319 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v9_merge_gates.py +125 -0
- devagent_ai-0.8.5/tests/test_plc_rockwell_v9_reachable_writers.py +186 -0
- devagent_ai-0.8.5/tests/test_plc_siemens_v1.py +240 -0
- devagent_ai-0.8.5/tests/test_plc_siemens_v2.py +251 -0
- devagent_ai-0.8.5/tests/test_plc_siemens_v3_call_graph.py +636 -0
- devagent_ai-0.8.5/tests/test_plc_siemens_v4_extended.py +335 -0
- devagent_ai-0.8.5/tests/test_plc_siemens_v4_flgnet.py +412 -0
- devagent_ai-0.8.5/tests/test_plc_siemens_v5_state_machine.py +307 -0
- devagent_ai-0.8.5/tests/test_plc_siemens_v6_v7.py +415 -0
- devagent_ai-0.8.5/tests/test_plc_signature_trust.py +167 -0
- devagent_ai-0.8.5/tests/test_plc_v5_security_floor.py +101 -0
- devagent_ai-0.8.5/tests/test_plc_v5_toctou.py +116 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_production_v040.py +1 -1
- devagent_ai-0.8.3/devagent/__main__.py +0 -4
- devagent_ai-0.8.3/devagent_ai.egg-info/SOURCES.txt +0 -85
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/LICENSE +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/NOTICE +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/agent/__init__.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/agent/llm.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/agent/loop.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/agent/memory.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/agent/prompts.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/agent/tools.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/artifacts.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/automations.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/autonomy.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/browser.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/config.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/discovery.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/evaluation.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/memory.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/models.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/orchestrator.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/provider_benchmark.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/providers.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/qualification.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/realworld.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/report.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/retrieval.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/routing.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/runtime.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/safety.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/skills.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/source_control.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/state_machine.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/tasking.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/technical_review.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/workspace.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent/worktree.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent_ai.egg-info/dependency_links.txt +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/devagent_ai.egg-info/top_level.txt +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/setup.cfg +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_acceptance_contract.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_benchmark_catalog.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_browser_verification.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_capability_discovery.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_cli.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_developer_review_report.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_discovery_memory.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_e2e_fake_provider.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_evaluation_harness.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_evaluation_matrix.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_evaluation_regression_evidence.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_functional_qualification.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_huge_monorepo_v070.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_migration_e2e_v070.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_model_routing.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_multilang_technical_review.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_multistack_devagent_e2e.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_multistack_qualification.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_plan_verification_normalization.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_preservation_contradiction.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_production_hardening.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_realworld_benchmark.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_requirement_compiler_v082.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_requirement_intelligence_v083.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_retrieval.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_runtime_sandbox.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_safety_workspace.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_source_control_publish.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_structural_devagent_e2e_v070.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_structural_operations.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_structured_provider_contract.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_tasking_state.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_v070_engineering_breadth.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_v080_autonomy.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_v080_provider_benchmark.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_v080_skills_automations.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_workspace_environment.py +0 -0
- {devagent_ai-0.8.3 → devagent_ai-0.8.5}/tests/test_worktree.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devagent-ai
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.5
|
|
4
4
|
Summary: Evidence-driven local autonomous software engineering agent
|
|
5
5
|
Author: Tom Ha
|
|
6
6
|
Maintainer: Tom Ha
|
|
@@ -9,6 +9,7 @@ Project-URL: Homepage, https://github.com/tomha85/devagent
|
|
|
9
9
|
Project-URL: Repository, https://github.com/tomha85/devagent
|
|
10
10
|
Project-URL: Issues, https://github.com/tomha85/devagent/issues
|
|
11
11
|
Project-URL: Changelog, https://github.com/tomha85/devagent/blob/main/CHANGELOG.md
|
|
12
|
+
Project-URL: Sponsor, https://github.com/sponsors/tomha85
|
|
12
13
|
Keywords: ai,agent,developer-tools,software-engineering,verification,local-first
|
|
13
14
|
Classifier: Development Status :: 4 - Beta
|
|
14
15
|
Classifier: Intended Audience :: Developers
|
|
@@ -23,6 +24,7 @@ License-File: LICENSE
|
|
|
23
24
|
License-File: NOTICE
|
|
24
25
|
Requires-Dist: openai>=1.40.0
|
|
25
26
|
Requires-Dist: anthropic>=0.34.0
|
|
27
|
+
Requires-Dist: cryptography>=42.0.0
|
|
26
28
|
Requires-Dist: tomli>=2.0.0; python_version < "3.11"
|
|
27
29
|
Provides-Extra: dev
|
|
28
30
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
@@ -152,6 +154,39 @@ reviewer → independently review final diff
|
|
|
152
154
|
|
|
153
155
|
The deterministic harness remains responsible for safety, tool execution, verification validity, acceptance adjudication, final status, reporting, and source-control publication regardless of which model handles a role.
|
|
154
156
|
|
|
157
|
+
#### Example: use multiple AI models in one DevAgent run
|
|
158
|
+
|
|
159
|
+
You do not have to use one AI model for every reasoning step. If you believe different models are better suited to different engineering roles, configure a default model plus any role-specific overrides. Roles that are not explicitly configured fall back to the default model.
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
# Keep credentials in environment variables; DevAgent does not store the keys.
|
|
163
|
+
export OPENAI_API_KEY=...
|
|
164
|
+
export GEMINI_API_KEY=...
|
|
165
|
+
export ANTHROPIC_API_KEY=...
|
|
166
|
+
export XAI_API_KEY=...
|
|
167
|
+
|
|
168
|
+
# Default/fallback model.
|
|
169
|
+
devagent setup --provider openai --model YOUR_OPENAI_MODEL
|
|
170
|
+
|
|
171
|
+
# Optional per-role models.
|
|
172
|
+
devagent setup --role investigator --provider gemini --model YOUR_GEMINI_MODEL
|
|
173
|
+
devagent setup --role planner --provider anthropic --model YOUR_CLAUDE_MODEL
|
|
174
|
+
devagent setup --role implementer --provider openai --model YOUR_OPENAI_MODEL
|
|
175
|
+
devagent setup --role reviewer --provider xai --model YOUR_GROK_MODEL
|
|
176
|
+
|
|
177
|
+
# Inspect routing and optionally probe every configured cloud model.
|
|
178
|
+
devagent models
|
|
179
|
+
devagent doctor --live
|
|
180
|
+
|
|
181
|
+
# Run normally; saved role routing is applied automatically.
|
|
182
|
+
cd my-repo
|
|
183
|
+
devagent "Fix the checkout race condition and add regression coverage."
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
For example, a user may choose a fast or lower-cost model for repository investigation, a different model for planning, a preferred coding model for implementation, and another provider for independent review. This can be useful for cost, latency, provider diversity, or model-strength preferences, but it does not guarantee a better result. DevAgent still requires the same repository evidence, acceptance gates, deterministic verification, and publication rules.
|
|
187
|
+
|
|
188
|
+
When using saved role routing, run the task without run-level `--provider`, `--model`, or `--base-url` overrides. Supplying those flags explicitly selects one provider/model for that run instead of the saved per-role routing.
|
|
189
|
+
|
|
155
190
|
## Run
|
|
156
191
|
|
|
157
192
|
From the application repository:
|
|
@@ -121,6 +121,39 @@ reviewer → independently review final diff
|
|
|
121
121
|
|
|
122
122
|
The deterministic harness remains responsible for safety, tool execution, verification validity, acceptance adjudication, final status, reporting, and source-control publication regardless of which model handles a role.
|
|
123
123
|
|
|
124
|
+
#### Example: use multiple AI models in one DevAgent run
|
|
125
|
+
|
|
126
|
+
You do not have to use one AI model for every reasoning step. If you believe different models are better suited to different engineering roles, configure a default model plus any role-specific overrides. Roles that are not explicitly configured fall back to the default model.
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# Keep credentials in environment variables; DevAgent does not store the keys.
|
|
130
|
+
export OPENAI_API_KEY=...
|
|
131
|
+
export GEMINI_API_KEY=...
|
|
132
|
+
export ANTHROPIC_API_KEY=...
|
|
133
|
+
export XAI_API_KEY=...
|
|
134
|
+
|
|
135
|
+
# Default/fallback model.
|
|
136
|
+
devagent setup --provider openai --model YOUR_OPENAI_MODEL
|
|
137
|
+
|
|
138
|
+
# Optional per-role models.
|
|
139
|
+
devagent setup --role investigator --provider gemini --model YOUR_GEMINI_MODEL
|
|
140
|
+
devagent setup --role planner --provider anthropic --model YOUR_CLAUDE_MODEL
|
|
141
|
+
devagent setup --role implementer --provider openai --model YOUR_OPENAI_MODEL
|
|
142
|
+
devagent setup --role reviewer --provider xai --model YOUR_GROK_MODEL
|
|
143
|
+
|
|
144
|
+
# Inspect routing and optionally probe every configured cloud model.
|
|
145
|
+
devagent models
|
|
146
|
+
devagent doctor --live
|
|
147
|
+
|
|
148
|
+
# Run normally; saved role routing is applied automatically.
|
|
149
|
+
cd my-repo
|
|
150
|
+
devagent "Fix the checkout race condition and add regression coverage."
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
For example, a user may choose a fast or lower-cost model for repository investigation, a different model for planning, a preferred coding model for implementation, and another provider for independent review. This can be useful for cost, latency, provider diversity, or model-strength preferences, but it does not guarantee a better result. DevAgent still requires the same repository evidence, acceptance gates, deterministic verification, and publication rules.
|
|
154
|
+
|
|
155
|
+
When using saved role routing, run the task without run-level `--provider`, `--model`, or `--base-url` overrides. Supplying those flags explicitly selects one provider/model for that run instead of the saved per-role routing.
|
|
156
|
+
|
|
124
157
|
## Run
|
|
125
158
|
|
|
126
159
|
From the application repository:
|
|
@@ -4,10 +4,11 @@ import argparse
|
|
|
4
4
|
import importlib.util
|
|
5
5
|
import json
|
|
6
6
|
import os
|
|
7
|
+
import re
|
|
7
8
|
import shutil
|
|
8
9
|
import sys
|
|
9
10
|
from pathlib import Path
|
|
10
|
-
from typing import Sequence
|
|
11
|
+
from typing import Callable, Sequence
|
|
11
12
|
|
|
12
13
|
from devagent import __version__
|
|
13
14
|
from devagent.config import (
|
|
@@ -37,6 +38,84 @@ _LIVE_PROBE_SCHEMA = {
|
|
|
37
38
|
"additionalProperties": False,
|
|
38
39
|
}
|
|
39
40
|
|
|
41
|
+
_PROGRESS_STAGES: dict[str, tuple[int, str]] = {
|
|
42
|
+
"DISCOVER": (1, "DISCOVER / UNDERSTAND"),
|
|
43
|
+
"UNDERSTAND": (1, "DISCOVER / UNDERSTAND"),
|
|
44
|
+
"TASK_SPEC": (2, "REQUIREMENTS / PLAN"),
|
|
45
|
+
"BASELINE": (2, "REQUIREMENTS / PLAN"),
|
|
46
|
+
"PLAN": (2, "REQUIREMENTS / PLAN"),
|
|
47
|
+
"GATHER_CONTEXT": (2, "REQUIREMENTS / PLAN"),
|
|
48
|
+
"REPRODUCE": (2, "REQUIREMENTS / PLAN"),
|
|
49
|
+
"IMPLEMENT": (3, "IMPLEMENT"),
|
|
50
|
+
"VERIFY_TARGETED": (4, "VERIFY / REPAIR IF NEEDED"),
|
|
51
|
+
"VERIFY_BROAD": (4, "VERIFY / REPAIR IF NEEDED"),
|
|
52
|
+
"REVIEW": (5, "INDEPENDENT REVIEW"),
|
|
53
|
+
"QUALITY_CHECK": (6, "FINAL VERIFICATION"),
|
|
54
|
+
"FINAL_VERIFY": (6, "FINAL VERIFICATION"),
|
|
55
|
+
}
|
|
56
|
+
_STATE_LINE = re.compile(r"^\[([A-Z_]+)\]$")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class _ProgressStatus:
|
|
60
|
+
"""Render stable user-facing milestones while keeping full diagnostics opt-in."""
|
|
61
|
+
|
|
62
|
+
def __init__(
|
|
63
|
+
self,
|
|
64
|
+
sink: Callable[[str], None] = print,
|
|
65
|
+
*,
|
|
66
|
+
verbose: bool = False,
|
|
67
|
+
) -> None:
|
|
68
|
+
self.sink = sink
|
|
69
|
+
self.verbose = verbose
|
|
70
|
+
self._last_stage = 0
|
|
71
|
+
self._plan_seen = False
|
|
72
|
+
self._implement_seen = False
|
|
73
|
+
self._review_seen = False
|
|
74
|
+
|
|
75
|
+
def __call__(self, message: str) -> None:
|
|
76
|
+
if self.verbose:
|
|
77
|
+
self.sink(message)
|
|
78
|
+
return
|
|
79
|
+
|
|
80
|
+
match = _STATE_LINE.fullmatch(message)
|
|
81
|
+
if match is None:
|
|
82
|
+
return
|
|
83
|
+
state = match.group(1)
|
|
84
|
+
|
|
85
|
+
if state == "DIAGNOSE":
|
|
86
|
+
self.sink(" ↳ DIAGNOSE")
|
|
87
|
+
return
|
|
88
|
+
if state == "PLAN":
|
|
89
|
+
if self._plan_seen:
|
|
90
|
+
self.sink(" ↳ REPLAN")
|
|
91
|
+
return
|
|
92
|
+
self._plan_seen = True
|
|
93
|
+
if state == "IMPLEMENT":
|
|
94
|
+
if self._implement_seen:
|
|
95
|
+
label = "APPLY REVIEW FIXES" if self._review_seen else "APPLY CORRECTION"
|
|
96
|
+
self.sink(f" ↳ {label}")
|
|
97
|
+
return
|
|
98
|
+
self._implement_seen = True
|
|
99
|
+
if state == "REVIEW":
|
|
100
|
+
self._review_seen = True
|
|
101
|
+
|
|
102
|
+
stage = _PROGRESS_STAGES.get(state)
|
|
103
|
+
if stage is None:
|
|
104
|
+
return
|
|
105
|
+
number, label = stage
|
|
106
|
+
if number <= self._last_stage:
|
|
107
|
+
return
|
|
108
|
+
self._last_stage = number
|
|
109
|
+
self.sink(f"[{number}/7] {label}")
|
|
110
|
+
|
|
111
|
+
def report(self) -> None:
|
|
112
|
+
if self.verbose:
|
|
113
|
+
self.sink("[ENGINEERING_REPORT]")
|
|
114
|
+
return
|
|
115
|
+
if self._last_stage < 7:
|
|
116
|
+
self._last_stage = 7
|
|
117
|
+
self.sink("[7/7] ENGINEERING REPORT")
|
|
118
|
+
|
|
40
119
|
|
|
41
120
|
def _top_parser() -> argparse.ArgumentParser:
|
|
42
121
|
parser = argparse.ArgumentParser(prog="devagent", description="Evidence-driven local software engineering agent")
|
|
@@ -53,7 +132,11 @@ def _top_parser() -> argparse.ArgumentParser:
|
|
|
53
132
|
parser.add_argument("--provider", choices=_PROVIDER_CHOICES)
|
|
54
133
|
parser.add_argument("--model")
|
|
55
134
|
parser.add_argument("--base-url")
|
|
56
|
-
parser.add_argument(
|
|
135
|
+
parser.add_argument(
|
|
136
|
+
"--verbose",
|
|
137
|
+
action="store_true",
|
|
138
|
+
help="Show internal state transitions and diagnostics instead of concise progress stages",
|
|
139
|
+
)
|
|
57
140
|
parser.add_argument("--no-isolation", action="store_true", help="Work in place instead of creating a local detached worktree")
|
|
58
141
|
parser.add_argument(
|
|
59
142
|
"--publish",
|
|
@@ -337,11 +420,14 @@ def _run(argv: Sequence[str]) -> int:
|
|
|
337
420
|
from devagent.orchestrator import DevAgent
|
|
338
421
|
from devagent.report import recommendations_for, render_report
|
|
339
422
|
|
|
423
|
+
progress = _ProgressStatus(print, verbose=args.verbose)
|
|
340
424
|
result = DevAgent(
|
|
341
425
|
model_provider,
|
|
342
426
|
isolate=not args.no_isolation,
|
|
343
|
-
|
|
344
|
-
|
|
427
|
+
# Internal status events are always emitted. The progress reporter keeps normal
|
|
428
|
+
# CLI output concise and passes the full state/diagnostic stream only in --verbose.
|
|
429
|
+
verbose=True,
|
|
430
|
+
status=progress,
|
|
345
431
|
base_commit=publication_plan.base_commit if publication_plan else None,
|
|
346
432
|
).run(args.repo, requirement)
|
|
347
433
|
|
|
@@ -361,6 +447,7 @@ def _run(argv: Sequence[str]) -> int:
|
|
|
361
447
|
|
|
362
448
|
# The full engineering report is intentionally emitted before any Git commit/push.
|
|
363
449
|
result.recommendations = recommendations_for(result)
|
|
450
|
+
progress.report()
|
|
364
451
|
print(render_report(result))
|
|
365
452
|
|
|
366
453
|
if publish_requested:
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
from typing import Sequence
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def main(argv: Sequence[str] | None = None) -> int:
|
|
8
|
+
"""Route domain subcommands without changing the existing software CLI."""
|
|
9
|
+
|
|
10
|
+
arguments = list(sys.argv[1:] if argv is None else argv)
|
|
11
|
+
if len(arguments) >= 2 and arguments[0] == "plc" and arguments[1] == "inspect":
|
|
12
|
+
from devagent.plc.inspect_cli import main as plc_inspect_main
|
|
13
|
+
|
|
14
|
+
return plc_inspect_main(arguments[2:])
|
|
15
|
+
if arguments and arguments[0] == "plc":
|
|
16
|
+
from devagent.plc.cli import main as plc_main
|
|
17
|
+
|
|
18
|
+
return plc_main(arguments[1:])
|
|
19
|
+
|
|
20
|
+
from devagent.cli import main as software_main
|
|
21
|
+
|
|
22
|
+
return software_main(arguments)
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"""Vendor-neutral PLC engineering and production verification foundations for DevAgent."""
|
|
2
|
+
|
|
3
|
+
from devagent.plc import analysis as _analysis
|
|
4
|
+
from devagent.plc.rockwell_compare_hardening import install as _install_rockwell_compare_hardening
|
|
5
|
+
from devagent.plc.rockwell_alias_hardening import install as _install_rockwell_alias_hardening
|
|
6
|
+
from devagent.plc.rockwell_entrypoint_hardening import install as _install_rockwell_entrypoint_hardening
|
|
7
|
+
from devagent.plc.rockwell_st_v10 import install as _install_rockwell_st_v10
|
|
8
|
+
|
|
9
|
+
# Install fail-closed compare, alias, controller-entrypoint, and ST guards before
|
|
10
|
+
# production verification is imported. Every downstream Rockwell proof must
|
|
11
|
+
# share the same canonical writer identity and executable-entrypoint model.
|
|
12
|
+
_install_rockwell_compare_hardening()
|
|
13
|
+
_install_rockwell_alias_hardening()
|
|
14
|
+
_install_rockwell_entrypoint_hardening()
|
|
15
|
+
_install_rockwell_st_v10()
|
|
16
|
+
|
|
17
|
+
from devagent.plc.rockwell_compare_reachability_hardening import (
|
|
18
|
+
install as _install_rockwell_compare_reachability_hardening,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
# The typed-compare theorem/FAT path is independent from boolean output-logic
|
|
22
|
+
# normalization, so explicitly bind it to the same executable routine closure.
|
|
23
|
+
_install_rockwell_compare_reachability_hardening()
|
|
24
|
+
|
|
25
|
+
from devagent.plc.rockwell_requirement_hardening import install as _install_rockwell_requirement_hardening
|
|
26
|
+
from devagent.plc.rockwell_v10_semantics import install as _install_rockwell_v10_semantics
|
|
27
|
+
from devagent.plc.rockwell_action_requirements import install as _install_rockwell_action_requirements
|
|
28
|
+
from devagent.plc.rockwell_risk_hardening import install as _install_rockwell_risk_hardening
|
|
29
|
+
from devagent.plc.rockwell_closeout_gate_hardening import install as _install_rockwell_closeout_gate_hardening
|
|
30
|
+
|
|
31
|
+
_install_rockwell_requirement_hardening()
|
|
32
|
+
# V10 extends the already-hardened V9 theorem. It proves bounded OTL/OTU action
|
|
33
|
+
# effects and may prove final retained scan state only inside the deliberately
|
|
34
|
+
# narrow same-active-Main-RLL-routine ordering theorem. Wider scheduling remains
|
|
35
|
+
# fail-closed until explicitly modeled.
|
|
36
|
+
_install_rockwell_v10_semantics()
|
|
37
|
+
# Explicit natural-language requirements may bind to deterministic MOV/COPY/
|
|
38
|
+
# CLR/RES local action effects, but never to final scan/process behavior.
|
|
39
|
+
_install_rockwell_action_requirements()
|
|
40
|
+
_install_rockwell_risk_hardening()
|
|
41
|
+
# Install the V9 support-contract guard before importing regression/production
|
|
42
|
+
# modules. Those modules import safe_analysis by value, so the patched support
|
|
43
|
+
# check must already be visible when safe_analysis is first loaded.
|
|
44
|
+
_install_rockwell_closeout_gate_hardening()
|
|
45
|
+
|
|
46
|
+
from devagent.plc.rockwell_core_review_v12 import install as _install_rockwell_core_review_v12
|
|
47
|
+
|
|
48
|
+
# V12 makes the commercial engineering-review contract explicit: cause/effect,
|
|
49
|
+
# unreachable logic, contradictory linear paths, and sequence-branch risks are
|
|
50
|
+
# deterministic review outputs. They remain evidence-backed findings, not AI
|
|
51
|
+
# guesses and not runtime PASS claims.
|
|
52
|
+
_install_rockwell_core_review_v12()
|
|
53
|
+
|
|
54
|
+
from devagent.plc.fat_procedure_v12 import install as _install_fat_procedure_v12
|
|
55
|
+
|
|
56
|
+
# Every FAT candidate, including tests created later by requirement mapping,
|
|
57
|
+
# must be an engineer-ready manual procedure. DevAgent plans the FAT; it does not
|
|
58
|
+
# connect to or execute the engineer's external simulator/HIL/controller.
|
|
59
|
+
_install_fat_procedure_v12()
|
|
60
|
+
|
|
61
|
+
from devagent.plc.rockwell_regression_evidence_hardening import (
|
|
62
|
+
install as _install_rockwell_regression_evidence_hardening,
|
|
63
|
+
install_domain_evidence as _install_rockwell_regression_domain_evidence,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
_install_rockwell_regression_evidence_hardening()
|
|
67
|
+
|
|
68
|
+
from devagent.plc.rockwell_regression_case_compat_v12 import (
|
|
69
|
+
install as _install_rockwell_regression_case_compat_v12,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
# FAT-plan regression is semantic and case-insensitive. Studio 5000 identifier
|
|
73
|
+
# spelling changes alone must not force a retest or create a false regression.
|
|
74
|
+
_install_rockwell_regression_case_compat_v12()
|
|
75
|
+
|
|
76
|
+
from devagent.plc.rockwell_branch_coverage_v16 import install as _install_rockwell_branch_coverage_v16
|
|
77
|
+
|
|
78
|
+
# V16 reconciles branch coverage with the full deterministic theorem set. A
|
|
79
|
+
# neutral-text branch proven by the bounded data/compute action theorem counts
|
|
80
|
+
# as modeled even when it is not an OTE/OTL/OTU boolean-output branch. Mixed or
|
|
81
|
+
# partially understood branch grammars remain fail-closed and withheld.
|
|
82
|
+
_install_rockwell_branch_coverage_v16()
|
|
83
|
+
|
|
84
|
+
from devagent.plc.rockwell_system_service_install_v17 import (
|
|
85
|
+
install as _install_rockwell_system_service_v17,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
# V17 does not widen static proof. Reachable GSV/SSV system-service logic stays
|
|
89
|
+
# PARTIAL, but every such runtime-dependent gap receives an evidence-linked,
|
|
90
|
+
# engineer-executed FAT procedure and a specific commissioning risk. The install
|
|
91
|
+
# happens before production imports capture analysis/risk functions by value.
|
|
92
|
+
_install_rockwell_system_service_v17()
|
|
93
|
+
|
|
94
|
+
from devagent.plc.semantic_coverage_report import install as _install_semantic_coverage_report
|
|
95
|
+
|
|
96
|
+
# Ensure any later CLI import of render_production_report receives the
|
|
97
|
+
# reachability-aware semantic coverage augmentation.
|
|
98
|
+
_install_semantic_coverage_report()
|
|
99
|
+
|
|
100
|
+
from devagent.plc.rockwell_system_service_report_install_v17 import (
|
|
101
|
+
install as _install_rockwell_system_service_report_v17,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# Keep the public report renderer identity stable while adding an explicit V17
|
|
105
|
+
# system-service runtime boundary inside the semantic coverage section.
|
|
106
|
+
_install_rockwell_system_service_report_v17()
|
|
107
|
+
|
|
108
|
+
from devagent.plc.four_contract_v13 import install as _install_four_contract_v13
|
|
109
|
+
|
|
110
|
+
# V13 makes the commercial four-core contract explicit and testable:
|
|
111
|
+
# engineering analysis, logic/risk review, five-area optimization recommendations,
|
|
112
|
+
# and engineer-ready FAT planning. All optimization output is advisory only.
|
|
113
|
+
_install_four_contract_v13()
|
|
114
|
+
|
|
115
|
+
from devagent.plc.professional_report_install_v14 import install as _install_professional_report_v14
|
|
116
|
+
|
|
117
|
+
# V14 adds a customer-facing executive layer while preserving every detailed
|
|
118
|
+
# engineering/evidence section and the established public renderer identity.
|
|
119
|
+
# This is presentation-only: it cannot change deterministic verdicts/readiness.
|
|
120
|
+
_install_professional_report_v14()
|
|
121
|
+
|
|
122
|
+
from devagent.plc.report_clarity_install_v16 import install as _install_report_clarity_v16
|
|
123
|
+
|
|
124
|
+
# V16 clarifies project-only review and coverage terminology without changing
|
|
125
|
+
# deterministic engineering, risk, FAT, or release-readiness decisions.
|
|
126
|
+
_install_report_clarity_v16()
|
|
127
|
+
|
|
128
|
+
from devagent.plc.agent_harness_install_v15 import install as _install_agent_harness_v15
|
|
129
|
+
|
|
130
|
+
# V15 applies modern agent orchestration only to the probabilistic assistance
|
|
131
|
+
# layer: bounded propose/critic/revise graphs, deterministic evidence guards, and
|
|
132
|
+
# per-run trace capture. The PLC proof/risk/readiness core stays authoritative.
|
|
133
|
+
_install_agent_harness_v15()
|
|
134
|
+
|
|
135
|
+
from devagent.plc.siemens_integration_v1 import install as _install_siemens_integration_v1
|
|
136
|
+
|
|
137
|
+
# Siemens V1 is a vendor branch over the already-qualified production contract.
|
|
138
|
+
# It accepts offline TIA Portal Openness/XML and generated-source exports, proves
|
|
139
|
+
# only bounded top-level SCL semantics, and leaves control-flow/LAD/FBD/GRAPH/STL
|
|
140
|
+
# or protected behavior PARTIAL/OPAQUE. Qualified Rockwell dispatch still enters
|
|
141
|
+
# the exact guarded Rockwell analyzer above.
|
|
142
|
+
_install_siemens_integration_v1()
|
|
143
|
+
|
|
144
|
+
from devagent.plc.siemens_scl_control_flow_v2 import install as _install_siemens_scl_control_flow_v2
|
|
145
|
+
|
|
146
|
+
# Siemens V2 adds a deliberately bounded deterministic theorem for complete,
|
|
147
|
+
# single-level IF/ELSIF/ELSE Boolean assignment chains. Missing/incomplete branch
|
|
148
|
+
# assignments, nesting, CASE/loops, calls, cyclic/self-references, and unsupported
|
|
149
|
+
# expressions stay fail-closed and require engineer-executed FAT evidence.
|
|
150
|
+
_install_siemens_scl_control_flow_v2()
|
|
151
|
+
|
|
152
|
+
from devagent.plc.siemens_scl_control_flow_hardening_v2 import (
|
|
153
|
+
install as _install_siemens_scl_control_flow_hardening_v2,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# A syntactically complete inner IF is still nested control flow. Do not allow an
|
|
157
|
+
# inner chain to become independently FULL when its enclosing region is outside
|
|
158
|
+
# the V2 single-level theorem.
|
|
159
|
+
_install_siemens_scl_control_flow_hardening_v2()
|
|
160
|
+
|
|
161
|
+
from devagent.plc.production_v5 import run_production_verification_v5
|
|
162
|
+
from devagent.plc.siemens_v5_bindings_v1 import install as _install_siemens_v5_bindings_v1
|
|
163
|
+
|
|
164
|
+
# Agent Harness V15 loads Production V5 before Siemens integration. Refresh only
|
|
165
|
+
# V5's by-value shared production/evidence/review bindings after Siemens installs.
|
|
166
|
+
# Siemens then reaches the vendor dispatcher while Rockwell remains behind the
|
|
167
|
+
# exact qualified Rockwell functions selected by those vendor-aware wrappers.
|
|
168
|
+
_install_siemens_v5_bindings_v1()
|
|
169
|
+
|
|
170
|
+
# Production is now loaded; bind the stage-14 baseline evidence augmentation.
|
|
171
|
+
_install_rockwell_regression_domain_evidence()
|
|
172
|
+
from devagent.plc.safe_analysis import analyze_rockwell_l5x
|
|
173
|
+
from devagent.plc.plc_dispatch import analyze_plc_project
|
|
174
|
+
from devagent.plc.siemens_cli_install_v1 import install as _install_siemens_cli_v1
|
|
175
|
+
|
|
176
|
+
# CLI parsing is loaded only after production_v5 exists, avoiding circular
|
|
177
|
+
# imports while exposing both vendor input contracts through `devagent plc`.
|
|
178
|
+
_install_siemens_cli_v1()
|
|
179
|
+
|
|
180
|
+
# Keep existing imports from ``devagent.plc.analysis`` on the guarded Rockwell
|
|
181
|
+
# public path. The base module remains reusable by ``safe_analysis`` without
|
|
182
|
+
# recursive calls; vendor-neutral callers should use analyze_plc_project.
|
|
183
|
+
_analysis.analyze_rockwell_l5x = analyze_rockwell_l5x
|
|
184
|
+
|
|
185
|
+
__all__ = ["analyze_plc_project", "analyze_rockwell_l5x", "run_production_verification_v5"]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any, Callable
|
|
4
|
+
|
|
5
|
+
from devagent.plc.agent_harness_v15 import begin_run_trace, end_run_trace
|
|
6
|
+
from devagent.plc import production_v5
|
|
7
|
+
|
|
8
|
+
_ORIGINAL: Callable[..., Any] = production_v5.run_production_verification_v5
|
|
9
|
+
_INSTALLED = False
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _run_with_harness_trace(*args: Any, **kwargs: Any):
|
|
13
|
+
trace, token = begin_run_trace()
|
|
14
|
+
try:
|
|
15
|
+
result = _ORIGINAL(*args, **kwargs)
|
|
16
|
+
result.ai_harness_trace = list(trace)
|
|
17
|
+
return result
|
|
18
|
+
finally:
|
|
19
|
+
end_run_trace(token)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def install() -> None:
|
|
23
|
+
global _INSTALLED
|
|
24
|
+
if _INSTALLED:
|
|
25
|
+
return
|
|
26
|
+
production_v5.run_production_verification_v5 = _run_with_harness_trace
|
|
27
|
+
_INSTALLED = True
|