forge-autonomy 2.7.39__tar.gz → 2.12.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {forge_autonomy-2.7.39/forge_autonomy.egg-info → forge_autonomy-2.12.2}/PKG-INFO +6 -3
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/__main__.py +65 -0
- forge_autonomy-2.12.2/forge/action_frontier.py +140 -0
- forge_autonomy-2.12.2/forge/advisory_candidate_cli.py +30 -0
- forge_autonomy-2.12.2/forge/advisory_candidate_contract.py +78 -0
- forge_autonomy-2.12.2/forge/advisory_candidate_grant.py +107 -0
- forge_autonomy-2.12.2/forge/advisory_candidate_service.py +197 -0
- forge_autonomy-2.12.2/forge/advisory_cli.py +35 -0
- forge_autonomy-2.12.2/forge/advisory_context.py +100 -0
- forge_autonomy-2.12.2/forge/advisory_contract.py +66 -0
- forge_autonomy-2.12.2/forge/advisory_grant.py +148 -0
- forge_autonomy-2.12.2/forge/advisory_provider.py +88 -0
- forge_autonomy-2.12.2/forge/advisory_service.py +274 -0
- forge_autonomy-2.12.2/forge/api/advisory-candidate-v1.json +939 -0
- forge_autonomy-2.12.2/forge/api/advisory-conversation-v1.json +1032 -0
- forge_autonomy-2.12.2/forge/api/approved-workset-release-v1.json +2421 -0
- forge_autonomy-2.12.2/forge/api/candidate-decisions-v1.json +1585 -0
- forge_autonomy-2.12.2/forge/api/mission-concepts-v1.json +5102 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/api/operations-read-openapi-v1.json +97 -1
- forge_autonomy-2.12.2/forge/api/parallel-action-peer-graph-v1.json +54 -0
- forge_autonomy-2.12.2/forge/api/server-openapi-v1.json +3471 -0
- forge_autonomy-2.12.2/forge/api/server-postman-v1.json +1868 -0
- forge_autonomy-2.12.2/forge/api/workspace-review-inbox-v1.json +161 -0
- forge_autonomy-2.12.2/forge/api/workspace-status-read-v1.json +65 -0
- forge_autonomy-2.12.2/forge/api/workspace-worklist-control-v1.json +413 -0
- forge_autonomy-2.12.2/forge/api/workspace-worklist-v1.json +443 -0
- forge_autonomy-2.12.2/forge/approved_worklist.py +356 -0
- forge_autonomy-2.12.2/forge/candidate_decision_cli.py +36 -0
- forge_autonomy-2.12.2/forge/candidate_decision_contract.py +81 -0
- forge_autonomy-2.12.2/forge/candidate_decision_grant.py +183 -0
- forge_autonomy-2.12.2/forge/candidate_decision_service.py +248 -0
- forge_autonomy-2.12.2/forge/completion/effect_report_observer.py +64 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/completion/mission.py +55 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/ep_simulator.py +219 -28
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/execution/loop.py +90 -3
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/execution_host_configuration.py +99 -70
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/governance_authority.py +41 -3
- forge_autonomy-2.12.2/forge/governed_candidate_intake.py +304 -0
- forge_autonomy-2.12.2/forge/governed_continuation.py +756 -0
- forge_autonomy-2.12.2/forge/installation_pairing.py +193 -0
- forge_autonomy-2.12.2/forge/installation_peer_detach.py +157 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/intake.py +5 -1
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/lifecycle/store.py +304 -34
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/mission_cli.py +51 -6
- forge_autonomy-2.12.2/forge/mission_concept_approval.py +224 -0
- forge_autonomy-2.12.2/forge/mission_concept_continuity.py +122 -0
- forge_autonomy-2.12.2/forge/mission_concept_contract.py +123 -0
- forge_autonomy-2.12.2/forge/mission_concept_planning.py +194 -0
- forge_autonomy-2.12.2/forge/mission_concept_provider.py +49 -0
- forge_autonomy-2.12.2/forge/mission_concept_readiness.py +58 -0
- forge_autonomy-2.12.2/forge/mission_concept_registration.py +73 -0
- forge_autonomy-2.12.2/forge/mission_concept_resolver.py +120 -0
- forge_autonomy-2.12.2/forge/mission_concept_service.py +455 -0
- forge_autonomy-2.12.2/forge/mission_concept_setup.py +133 -0
- forge_autonomy-2.12.2/forge/mission_lifecycle.py +290 -0
- forge_autonomy-2.12.2/forge/mission_lifecycle_cli.py +63 -0
- forge_autonomy-2.12.2/forge/mission_no_dispatch.py +42 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/architecture_mission.py +23 -1
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/criterion_assessment.py +9 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/criterion_observation.py +2 -1
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/execution_host.py +9 -0
- forge_autonomy-2.12.2/forge/models/mission_effect.py +140 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/producer.py +9 -0
- forge_autonomy-2.12.2/forge/operations_read_api.py +868 -0
- forge_autonomy-2.12.2/forge/parallel_action_contract.py +103 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/planner/codex_cli_session.py +47 -13
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/planner/openai_responses.py +3 -3
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/qualification/criterion_completion.py +41 -2
- forge_autonomy-2.12.2/forge/qualification/effect_fixture_conformance.py +141 -0
- forge_autonomy-2.12.2/forge/qualification/effect_simulator_fixture.py +146 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/architecture_design_only-evidence_only.json +881 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/architecture_design_only-git.json +1223 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/bounded_repository_change-git.json +1200 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/documentation_only-git.json +1158 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/effect-report-envelope-v1.schema.json +331 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/effect-request-v1.schema.json +125 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/effect-result-v1.1.schema.json +904 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/effect-result-v1.schema.json +772 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/effect-validation-profile-v1.schema.json +133 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/errors.json +32 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/manifest.json +45 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/read_only_assessment-evidence_only.json +779 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/terminal-evidence-v1.5.schema.json +589 -0
- forge_autonomy-2.12.2/forge/qualification/fixtures/fme-producer-v1/terminal-evidence-v1.6.schema.json +721 -0
- forge_autonomy-2.12.2/forge/qualification/producer_fixture_conformance.py +489 -0
- forge_autonomy-2.12.2/forge/root_identity.py +26 -0
- forge_autonomy-2.12.2/forge/runtime/action_authority.py +157 -0
- forge_autonomy-2.12.2/forge/runtime/action_intents.py +573 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/runtime/bootstrap.py +44 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/runtime/database.py +633 -8
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/runtime/dynamic_mission.py +549 -20
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/runtime/operational_reset.py +18 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/runtime/runner.py +74 -5
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/runtime/service.py +22 -3
- forge_autonomy-2.12.2/forge/scheduler/ep_effect_v15.py +493 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/scheduler/ep_http_adapter.py +178 -22
- forge_autonomy-2.12.2/forge/schemas/ep-producer-readback-v1.2.schema.json +46 -0
- forge_autonomy-2.12.2/forge/schemas/ep-producer-readback-v1.3.schema.json +103 -0
- forge_autonomy-2.12.2/forge/serial_correlation_projection.py +69 -0
- forge_autonomy-2.12.2/forge/server_runtime.py +1333 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/state/mission_state.py +99 -3
- forge_autonomy-2.12.2/forge/worklist_activation.py +171 -0
- forge_autonomy-2.12.2/forge/worklist_conditions.py +77 -0
- forge_autonomy-2.12.2/forge/worklist_control.py +279 -0
- forge_autonomy-2.12.2/forge/workset_release_cli.py +69 -0
- forge_autonomy-2.12.2/forge/workset_release_grant.py +212 -0
- forge_autonomy-2.12.2/forge/workset_release_journal.py +53 -0
- forge_autonomy-2.12.2/forge/workset_release_package.py +67 -0
- forge_autonomy-2.12.2/forge/workset_release_service.py +231 -0
- forge_autonomy-2.12.2/forge/workset_release_subjects.py +82 -0
- forge_autonomy-2.12.2/forge/workspace_read_grant.py +265 -0
- forge_autonomy-2.12.2/forge/workspace_review_grant.py +343 -0
- forge_autonomy-2.12.2/forge/workspace_review_inbox.py +202 -0
- forge_autonomy-2.12.2/forge/workspace_worklist_control_grant.py +131 -0
- forge_autonomy-2.12.2/forge/workspace_worklist_grant.py +112 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2/forge_autonomy.egg-info}/PKG-INFO +6 -3
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge_autonomy.egg-info/SOURCES.txt +136 -1
- forge_autonomy-2.12.2/forge_autonomy.egg-info/entry_points.txt +17 -0
- forge_autonomy-2.12.2/forge_autonomy.egg-info/requires.txt +4 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/product-version.json +1 -1
- forge_autonomy-2.12.2/pyproject.toml +59 -0
- forge_autonomy-2.12.2/tests/test_action_authority.py +257 -0
- forge_autonomy-2.12.2/tests/test_action_frontier.py +95 -0
- forge_autonomy-2.12.2/tests/test_action_intents.py +324 -0
- forge_autonomy-2.12.2/tests/test_advisory_candidate_http.py +309 -0
- forge_autonomy-2.12.2/tests/test_advisory_http.py +247 -0
- forge_autonomy-2.12.2/tests/test_approved_worklist.py +178 -0
- forge_autonomy-2.12.2/tests/test_candidate_decision_contract.py +12 -0
- forge_autonomy-2.12.2/tests/test_candidate_decisions_http.py +296 -0
- forge_autonomy-2.12.2/tests/test_changed_product_coverage.py +30 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_codex_cli_session.py +86 -1
- forge_autonomy-2.12.2/tests/test_criterion_completion_release_qualification.py +29 -0
- forge_autonomy-2.12.2/tests/test_effect_completion.py +105 -0
- forge_autonomy-2.12.2/tests/test_effect_fixture_conformance.py +35 -0
- forge_autonomy-2.12.2/tests/test_ep_effect_v15.py +288 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_ep_simulator.py +180 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_execution_host_configuration.py +17 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_existing_release_reconciliation.py +4 -0
- forge_autonomy-2.12.2/tests/test_four_lane_planning.py +142 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_governance_authority.py +21 -0
- forge_autonomy-2.12.2/tests/test_governed_candidate_intake.py +363 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_host_control_completion.py +55 -3
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_inner_loop_ci_contract.py +39 -9
- forge_autonomy-2.12.2/tests/test_installation_pairing.py +206 -0
- forge_autonomy-2.12.2/tests/test_installation_peer_detach.py +323 -0
- forge_autonomy-2.12.2/tests/test_installed_dynamic_mission_runtime.py +2044 -0
- forge_autonomy-2.12.2/tests/test_installed_forge_preservation_2739_281.py +76 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_installed_forge_update.py +18 -14
- forge_autonomy-2.12.2/tests/test_installed_http_successor_qualification.py +181 -0
- forge_autonomy-2.12.2/tests/test_mission_concept_continuity.py +266 -0
- forge_autonomy-2.12.2/tests/test_mission_concept_contract.py +77 -0
- forge_autonomy-2.12.2/tests/test_mission_concept_dependencies.py +160 -0
- forge_autonomy-2.12.2/tests/test_mission_concept_output_boundaries.py +56 -0
- forge_autonomy-2.12.2/tests/test_mission_concept_planning.py +108 -0
- forge_autonomy-2.12.2/tests/test_mission_concept_provider.py +132 -0
- forge_autonomy-2.12.2/tests/test_mission_concept_readiness.py +95 -0
- forge_autonomy-2.12.2/tests/test_mission_concept_ready_http.py +234 -0
- forge_autonomy-2.12.2/tests/test_mission_concept_recovery.py +79 -0
- forge_autonomy-2.12.2/tests/test_mission_concept_resolver.py +110 -0
- forge_autonomy-2.12.2/tests/test_mission_effect.py +105 -0
- forge_autonomy-2.12.2/tests/test_mission_lifecycle_cli.py +67 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_mission_state_store.py +31 -0
- forge_autonomy-2.12.2/tests/test_operations_read_api.py +1488 -0
- forge_autonomy-2.12.2/tests/test_parallel_action_contract.py +65 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_production_release_workflow.py +18 -3
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_recovered_partial_completion.py +1 -1
- forge_autonomy-2.12.2/tests/test_root_identity.py +36 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_runtime_service.py +27 -0
- forge_autonomy-2.12.2/tests/test_serial_correlation_projection.py +89 -0
- forge_autonomy-2.12.2/tests/test_server_api_contract.py +82 -0
- forge_autonomy-2.12.2/tests/test_server_project_dag_capability.py +109 -0
- forge_autonomy-2.12.2/tests/test_server_route_qualification.py +365 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_server_runtime.py +305 -0
- forge_autonomy-2.12.2/tests/test_tde_observe_report.py +67 -0
- forge_autonomy-2.12.2/tests/test_worklist_activation.py +45 -0
- forge_autonomy-2.12.2/tests/test_worklist_conditions.py +57 -0
- forge_autonomy-2.12.2/tests/test_worklist_control.py +23 -0
- forge_autonomy-2.12.2/tests/test_workset_release_chain.py +41 -0
- forge_autonomy-2.12.2/tests/test_workset_release_concurrency.py +18 -0
- forge_autonomy-2.12.2/tests/test_workset_release_denials.py +112 -0
- forge_autonomy-2.12.2/tests/test_workset_release_http.py +75 -0
- forge_autonomy-2.12.2/tests/test_workset_release_integrity.py +101 -0
- forge_autonomy-2.12.2/tests/test_workset_release_recovery.py +26 -0
- forge_autonomy-2.12.2/tests/test_workset_release_selection.py +114 -0
- forge_autonomy-2.12.2/tests/test_workset_release_subjects.py +35 -0
- forge_autonomy-2.12.2/tests/test_workspace_read_grant.py +153 -0
- forge_autonomy-2.12.2/tests/test_workspace_review_inbox.py +569 -0
- forge_autonomy-2.7.39/forge/api/server-openapi-v1.json +0 -532
- forge_autonomy-2.7.39/forge/api/server-postman-v1.json +0 -498
- forge_autonomy-2.7.39/forge/operations_read_api.py +0 -456
- forge_autonomy-2.7.39/forge/server_runtime.py +0 -758
- forge_autonomy-2.7.39/forge_autonomy.egg-info/entry_points.txt +0 -2
- forge_autonomy-2.7.39/pyproject.toml +0 -41
- forge_autonomy-2.7.39/tests/test_installed_dynamic_mission_runtime.py +0 -707
- forge_autonomy-2.7.39/tests/test_operations_read_api.py +0 -364
- forge_autonomy-2.7.39/tests/test_server_api_contract.py +0 -45
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/MANIFEST.in +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/README.md +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/_version.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/action_derivation_canary_closure.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/action_derivation_evidence.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/action_derivation_qualification.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/action_derivation_reattempt.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/ai_architect/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/ai_architect/provider_registry.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/api/installed-health-component-registry-1.0.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/api/operations-read-postman-v1.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/architecture/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/architecture/advisor.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/architecture/presentation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/architecture/workspace.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/autonomous_orchestrator.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/business/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/business/advisor.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/business/ingress.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/business/presentation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/business/workspace.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/canary.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/capabilities/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/capabilities/delegation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/completion/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/completion/assessor.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/completion/host_control_observer.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/completion/repository_observer.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/constitutional/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/constitutional/assessor.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/core/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/core/json_store.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/decision_evidence/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/decision_evidence/repository.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/dispatcher/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/dispatcher/dispatcher.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/execution/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/execution/presentation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/foundation/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/foundation/loader.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/generation_two.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/generation_two_execution.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/governance/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/governance/execution_policy.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/governance/profiles.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/installed_health.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/installed_lifecycle.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/integration/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/integration/coordinator.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/integration/repository.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/knowledge/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/knowledge/consumer.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/knowledge/registry.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/lifecycle/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/mission_amendment.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/mission_scheduler.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/action.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/action_derivation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/agent_policy.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/ai_architect_provider.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/ai_architect_session.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/ai_provider_registry.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/architecture_reasoning.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/architecture_review.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/codex_runtime_prompt.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/constitutional_validation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/decision_evidence.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/foundation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/historical_intent.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/integration.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/intent.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/intent_authoring.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/mission.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/mission_candidate.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/mission_completion.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/mission_planner.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/mission_recommendation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/phase_completion.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/planning.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/prompt_artifact.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/proposal.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/runtime_prompt.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/models/solution_template.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/operator_identity.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/planner/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/planner/action_derivation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/planner/durable_derivation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/planner/engine.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/planner/provider_adapter.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/planning/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/planning/loader.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/planning/registry.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/portfolio_intelligence.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/preserved_lifecycle.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/programme_authorization.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/prompts/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/prompts/codex_cli.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/prompts/generator.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/proposals/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/proposals/generator.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/provider_context.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/provider_security.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/qualification/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/qualification/bootstrap_sequence.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/qualification/generation_one.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/qualification/installed_smoke.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/qualification/server_runtime.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/recommendations/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/recommendations/engine.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/repository_truth.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/review/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/review/engine.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/runtime/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/runtime/data_root.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/runtime/evidence.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/runtime/execution_context.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/runtime/health.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/runtime/mission_controller.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/scheduler/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/scheduler/adapter.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/scheduler/ep_v12.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/scheduler/scheduler.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/capability-registry-1.0.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/capability.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/common.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/decision-evidence-1.0.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/engineering-goal-0.5.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/engineering-increment-proposal-0.5.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/engineering-mode.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/engineering-plan-0.5.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/engineering-platform-peer-configuration-1.0.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/engineering-platform-peer-configuration-1.1.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/engineering-prompt-artifact-0.7.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/engineering-proposal-0.6.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/evidence-reference-0.5.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/foundation-document.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/governance-profile.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/knowledge-source-0.4.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/knowledge-source.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/mission-candidate-1.0.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/mission-candidate-1.1.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/phase-completion-1.0.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/planning-document-0.5.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/repository-catalog.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/repository.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/solution-template-1.0.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/schemas/workspace.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/secure_store.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/solutions/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/solutions/catalogue.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/solutions/generator.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/state/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge/workspace/__init__.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge_autonomy.egg-info/dependency_links.txt +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/forge_autonomy.egg-info/top_level.txt +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/capability-registry-1.0.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/capability.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/common.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/decision-evidence-1.0.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/engineering-goal-0.5.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/engineering-increment-proposal-0.5.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/engineering-mode.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/engineering-plan-0.5.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/engineering-prompt-artifact-0.7.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/engineering-proposal-0.6.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/evidence-reference-0.5.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/foundation-document.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/governance-profile.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/knowledge-source-0.4.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/knowledge-source.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/mission-candidate-1.0.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/mission-candidate-1.1.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/phase-completion-1.0.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/planning-document-0.5.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/repository-catalog.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/repository.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/solution-template-1.0.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/schemas/workspace.schema.json +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/setup.cfg +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_action_derivation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_action_derivation_canary_closure.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_action_derivation_evidence.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_action_derivation_qualification.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_adaptive_action_sizing_design.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_agent_policy.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_aggregate_health_roadmap.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_ai_architect_provider.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_ai_architect_session.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_ai_development_projection.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_ai_provider_registry.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_architecture_reasoning.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_architecture_review_engine.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_architecture_workspace.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_autonomous_orchestrator.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_bootstrap_adapter.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_bootstrap_mission_canary.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_bootstrap_mission_runner.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_bootstrap_mission_scheduler.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_bootstrap_sequence_qualification.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_business_governance_ingress.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_business_workspace.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_canonical_data_root.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_capability_delegation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_cli_transport.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_codex_cli_runtime_prompt.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_constitutional_validation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_criterion_assessment_contract.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_criterion_ep_http_boundary.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_criterion_planning_context.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_decision_evidence.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_default_project_quality_policy.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_distribution_identity.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_durable_action_derivation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_dynamic_mission_capability.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_engineering_action_architecture.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_engineering_intent_authoring.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_engineering_intent_lifecycle.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_engineering_mission.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_engineering_planning.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_engineering_prompt_artifacts.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_engineering_proposals.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_ep_http_adapter.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_ep_simulator_rolling_planning.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_execution_context.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_execution_host_contract.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_execution_loop.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_forge_console_admin_parity_contract.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_forge_console_configuration_contract.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_forge_console_hosting_contract.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_forge_operations_console_roadmap.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_forge_outer_loop_ci_roadmap.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_forge_v1_bootstrap_scheduler_contract.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_forge_v1_implementation_dag.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_foundation_loader.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_foundation_models.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_generation_one_bootstrap_qualification.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_generation_two_execution.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_generation_two_mission_intake.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_governed_coverage.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_historical_engineering_intent.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_installed_lifecycle.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_integration_coordination.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_knowledge_consumption.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_live_project_roadmap_contract.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_mission_completion_evaluator.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_mission_controller.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_mission_dispatcher.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_mission_planner.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_mission_recommendation_engine.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_mission_recommendation_lifecycle.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_mission_runtime_projection.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_mission_runtime_scheduler.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_mission_status.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_openai_action_derivation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_operational_reset.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_operations_health.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_operator_identity.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_phase_completion.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_platform_contract_documents.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_portfolio_intelligence_operation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_preserved_lifecycle.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_producer_contract.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_product_version_operations.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_productization_reconciliation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_programme_authorization.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_provider_context.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_provider_security.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_pypi_distribution_readback.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_release_operation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_repository_truth.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_role_aware_conversations_contract.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_runtime_bootstrap.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_runtime_database.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_runtime_evidence.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_runtime_health.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_runtime_instance_persistence.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_runtime_prompt_generation.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_runtime_status_projection.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_scheduler_dependency_boundary.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_schemas.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_secure_store.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_solution_templates.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_substantive_mission_completion.py +0 -0
- {forge_autonomy-2.7.39 → forge_autonomy-2.12.2}/tests/test_terminal_continuation_replay.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: forge-autonomy
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.12.2
|
|
4
4
|
Summary: Forge mission planning, producer contracts, and evidence interpretation runtime.
|
|
5
5
|
Author: Forge maintainers
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -11,9 +11,12 @@ Classifier: Development Status :: 4 - Beta
|
|
|
11
11
|
Classifier: Intended Audience :: Developers
|
|
12
12
|
Classifier: Programming Language :: Python :: 3
|
|
13
13
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.
|
|
15
|
-
Requires-Python:
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
15
|
+
Requires-Python: <3.15,>=3.14
|
|
16
16
|
Description-Content-Type: text/markdown
|
|
17
|
+
Provides-Extra: validation
|
|
18
|
+
Requires-Dist: coverage<8,>=7; extra == "validation"
|
|
19
|
+
Requires-Dist: jsonschema<5,>=4; extra == "validation"
|
|
17
20
|
|
|
18
21
|
# Forge
|
|
19
22
|
|
|
@@ -219,6 +219,36 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
219
219
|
if name in {"run", "reopen"}:
|
|
220
220
|
command.add_argument("--poll-seconds", type=float, default=1.0)
|
|
221
221
|
command.add_argument("--maximum-wait-seconds", type=float, default=3600.0)
|
|
222
|
+
progression_policy = mission_commands.add_parser(
|
|
223
|
+
"progression-policy", help="bind one versioned Mission progression policy")
|
|
224
|
+
progression_policy.add_argument("--mission-id", required=True)
|
|
225
|
+
progression_policy.add_argument("--input", required=True)
|
|
226
|
+
progression_decide = mission_commands.add_parser(
|
|
227
|
+
"progression-decide", help="record one exact post-Action progression decision")
|
|
228
|
+
progression_decide.add_argument("--mission-id", required=True)
|
|
229
|
+
progression_decide.add_argument("--input", required=True)
|
|
230
|
+
progression_status = mission_commands.add_parser(
|
|
231
|
+
"progression-status", help="read the current post-Action progression fence")
|
|
232
|
+
progression_status.add_argument("--mission-id", required=True)
|
|
233
|
+
final_acceptance = mission_commands.add_parser(
|
|
234
|
+
"accept-final-completion", help="record Business acceptance of proven Mission completion")
|
|
235
|
+
final_acceptance.add_argument("--mission-id", required=True)
|
|
236
|
+
final_acceptance.add_argument("--input", required=True)
|
|
237
|
+
installation = subparsers.add_parser("installation-peer", help="manage project-independent EP installation connectivity")
|
|
238
|
+
installation_commands = installation.add_subparsers(dest="installation_peer_command", required=True)
|
|
239
|
+
configure_installation = installation_commands.add_parser("configure")
|
|
240
|
+
for flag in ("operation-id", "binding-id", "endpoint", "expected-instance-id", "consumer-id", "credential-reference"):
|
|
241
|
+
configure_installation.add_argument("--"+flag, required=True)
|
|
242
|
+
configure_installation.add_argument("--allow-loopback-http",action="store_true")
|
|
243
|
+
configure_installation.add_argument("--timeout-seconds",type=float,default=10.0)
|
|
244
|
+
installation_commands.add_parser("show")
|
|
245
|
+
installation_commands.add_parser("preflight")
|
|
246
|
+
detach_installation = installation_commands.add_parser("detach")
|
|
247
|
+
detach_installation.add_argument("--operation-id", required=True)
|
|
248
|
+
detach_installation.add_argument("--expected-binding-id", required=True)
|
|
249
|
+
detach_installation.add_argument("--expected-configuration-revision", type=int, required=True)
|
|
250
|
+
installation_detach_status = installation_commands.add_parser("detach-status")
|
|
251
|
+
installation_detach_status.add_argument("--operation-id", required=True)
|
|
222
252
|
execution_host = subparsers.add_parser("execution-host", help="manage the selected Execution Host peer")
|
|
223
253
|
execution_host_commands = execution_host.add_subparsers(dest="execution_host_command", required=True)
|
|
224
254
|
configure = execution_host_commands.add_parser("configure", help="persist one explicit EP peer binding")
|
|
@@ -427,6 +457,22 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
427
457
|
result = mission_cli.admit(args.data_root, args.input)
|
|
428
458
|
elif command == "status":
|
|
429
459
|
result = mission_cli.status(args.data_root, args.mission_id)
|
|
460
|
+
elif command == "progression-policy":
|
|
461
|
+
if args.data_root is None:
|
|
462
|
+
raise ValueError("--data-root is required for progression policy")
|
|
463
|
+
result = mission_cli.progression_policy(args.data_root, args.mission_id, args.input)
|
|
464
|
+
elif command == "progression-status":
|
|
465
|
+
if args.data_root is None:
|
|
466
|
+
raise ValueError("--data-root is required for progression status")
|
|
467
|
+
result = mission_cli.progression_status(args.data_root, args.mission_id)
|
|
468
|
+
elif command == "progression-decide":
|
|
469
|
+
if args.data_root is None:
|
|
470
|
+
raise ValueError("--data-root is required for progression decision")
|
|
471
|
+
result = mission_cli.progression_decide(args.data_root, args.mission_id, args.input)
|
|
472
|
+
elif command == "accept-final-completion":
|
|
473
|
+
if args.data_root is None:
|
|
474
|
+
raise ValueError("--data-root is required for final Business acceptance")
|
|
475
|
+
result = mission_cli.accept_final_completion(args.data_root, args.mission_id, args.input)
|
|
430
476
|
elif command == "stop":
|
|
431
477
|
result = mission_cli.stop(args.data_root, args.mission_id)
|
|
432
478
|
else:
|
|
@@ -511,6 +557,25 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
511
557
|
}
|
|
512
558
|
print(json.dumps(envelope, sort_keys=True))
|
|
513
559
|
return 1
|
|
560
|
+
elif args.command == "installation-peer":
|
|
561
|
+
from .installation_pairing import InstallationPairingService, InstallationPairingError
|
|
562
|
+
try:
|
|
563
|
+
service = InstallationPairingService(args.data_root)
|
|
564
|
+
if args.installation_peer_command == "configure":
|
|
565
|
+
result = service.configure(operation_id=args.operation_id,binding_id=args.binding_id,
|
|
566
|
+
endpoint=args.endpoint,ep_instance_id=args.expected_instance_id,consumer_id=args.consumer_id,
|
|
567
|
+
credential_reference=args.credential_reference,allow_loopback_http=args.allow_loopback_http,
|
|
568
|
+
timeout_seconds=args.timeout_seconds)
|
|
569
|
+
elif args.installation_peer_command == "detach":
|
|
570
|
+
result = service.detach(operation_id=args.operation_id,
|
|
571
|
+
expected_binding_id=args.expected_binding_id,
|
|
572
|
+
expected_configuration_revision=args.expected_configuration_revision)
|
|
573
|
+
elif args.installation_peer_command == "detach-status": result = service.detach_status(args.operation_id)
|
|
574
|
+
elif args.installation_peer_command == "show": result = service.show()
|
|
575
|
+
else: result = service.preflight()
|
|
576
|
+
print(json.dumps(result,sort_keys=True))
|
|
577
|
+
except (RuntimeError,PermissionError,ValueError,sqlite3.Error,OSError):
|
|
578
|
+
return _failure("installation-peer",InstallationPairingError("INSTALLATION_PAIRING_REJECTED"))
|
|
514
579
|
elif args.command == "execution-host":
|
|
515
580
|
try:
|
|
516
581
|
if args.execution_host_command == "credential-access":
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"""Bounded, read-only logical Action frontier for an installed Mission.
|
|
2
|
+
|
|
3
|
+
This projection never decides host admission. A stored Action has no durable
|
|
4
|
+
per-Action target or predecessor evidence predicate in the serial schema, so
|
|
5
|
+
the result must not be interpreted as a dispatchable parallel workset.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from collections.abc import Mapping, Sequence
|
|
10
|
+
import re
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
FRONTIER_CONTRACT_VERSION = "parallel-action-frontier/v2"
|
|
15
|
+
MAX_FRONTIER_ACTIONS = 256
|
|
16
|
+
_STATUSES = frozenset({"READY", "ACTIVE", "WAITING_FOR_RESULT", "COMPLETE", "BLOCKED", "FAILED"})
|
|
17
|
+
_DIGEST = re.compile(r"sha256:[0-9a-f]{64}\Z")
|
|
18
|
+
_BINDING_RESOLUTIONS = frozenset({"MATCHED_SELECTED_BINDING", "MISMATCH", "UNCONFIGURED"})
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ActionFrontierError(ValueError):
|
|
22
|
+
"""The installed Action graph cannot be safely represented as a DAG."""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def project_action_frontier(actions: Sequence[Mapping[str, Any]], *, mission_revision: int,
|
|
26
|
+
pinned_slots: Mapping[str, Any] | None = None) -> dict[str, Any]:
|
|
27
|
+
"""Return a deterministic logical frontier without claiming execution eligibility."""
|
|
28
|
+
if len(actions) > MAX_FRONTIER_ACTIONS:
|
|
29
|
+
raise ActionFrontierError("Mission Action graph exceeds the bounded read limit")
|
|
30
|
+
if not isinstance(mission_revision, int) or isinstance(mission_revision, bool) or mission_revision < 1:
|
|
31
|
+
raise ActionFrontierError("Mission graph revision is invalid")
|
|
32
|
+
nodes: dict[str, dict[str, Any]] = {}
|
|
33
|
+
orders: set[int] = set()
|
|
34
|
+
for action in actions:
|
|
35
|
+
if not isinstance(action, Mapping):
|
|
36
|
+
raise ActionFrontierError("Mission Action record is invalid")
|
|
37
|
+
action_id = action.get("id")
|
|
38
|
+
order = action.get("order")
|
|
39
|
+
status = action.get("status")
|
|
40
|
+
edges = action.get("dependencies", ())
|
|
41
|
+
if (not isinstance(action_id, str) or not action_id or action_id in nodes
|
|
42
|
+
or not isinstance(order, int) or isinstance(order, bool) or order < 1 or order in orders
|
|
43
|
+
or not isinstance(status, str) or status not in _STATUSES
|
|
44
|
+
or not isinstance(edges, (list, tuple))
|
|
45
|
+
or any(not isinstance(edge, str) or not edge for edge in edges)
|
|
46
|
+
or len(edges) != len(set(edges))):
|
|
47
|
+
raise ActionFrontierError("Mission Action identity, order, status or edges are invalid")
|
|
48
|
+
orders.add(order)
|
|
49
|
+
nodes[action_id] = {"action_id": action_id, "order": order, "status": status,
|
|
50
|
+
"dependencies": tuple(edges)}
|
|
51
|
+
for node in nodes.values():
|
|
52
|
+
if node["action_id"] in node["dependencies"] or any(
|
|
53
|
+
edge not in nodes for edge in node["dependencies"]
|
|
54
|
+
):
|
|
55
|
+
raise ActionFrontierError("Mission Action graph has an unresolved edge")
|
|
56
|
+
active: set[str] = set()
|
|
57
|
+
complete: set[str] = set()
|
|
58
|
+
|
|
59
|
+
def visit(action_id: str) -> None:
|
|
60
|
+
if action_id in active:
|
|
61
|
+
raise ActionFrontierError("Mission Action graph has a cycle")
|
|
62
|
+
if action_id in complete:
|
|
63
|
+
return
|
|
64
|
+
active.add(action_id)
|
|
65
|
+
for predecessor in nodes[action_id]["dependencies"]:
|
|
66
|
+
visit(predecessor)
|
|
67
|
+
active.remove(action_id)
|
|
68
|
+
complete.add(action_id)
|
|
69
|
+
|
|
70
|
+
for action_id in nodes:
|
|
71
|
+
visit(action_id)
|
|
72
|
+
target_slots: dict[str, Mapping[str, Any]] = {}
|
|
73
|
+
source_slot_digest = None
|
|
74
|
+
if pinned_slots is not None:
|
|
75
|
+
if not isinstance(pinned_slots, Mapping):
|
|
76
|
+
raise ActionFrontierError("Mission Action target slots are invalid")
|
|
77
|
+
entries = pinned_slots.get("actions")
|
|
78
|
+
digest = pinned_slots.get("document_digest")
|
|
79
|
+
if (pinned_slots.get("freshness") != "CURRENT"
|
|
80
|
+
or not isinstance(pinned_slots.get("mission_revision"), int)
|
|
81
|
+
or isinstance(pinned_slots["mission_revision"], bool)
|
|
82
|
+
or pinned_slots["mission_revision"] != mission_revision
|
|
83
|
+
or pinned_slots.get("target_verification") != "UNVERIFIED"
|
|
84
|
+
or pinned_slots.get("dispatch_authorized") is not False
|
|
85
|
+
or not isinstance(digest, str) or _DIGEST.fullmatch(digest) is None
|
|
86
|
+
or not isinstance(entries, list) or len(entries) != len(nodes)):
|
|
87
|
+
raise ActionFrontierError("Mission Action target slots are not current and pinned")
|
|
88
|
+
for entry in entries:
|
|
89
|
+
if not isinstance(entry, Mapping):
|
|
90
|
+
raise ActionFrontierError("Mission Action target slot is invalid")
|
|
91
|
+
action_id = entry.get("action_id")
|
|
92
|
+
target = entry.get("target")
|
|
93
|
+
if (not isinstance(action_id, str) or action_id not in nodes or action_id in target_slots
|
|
94
|
+
or not isinstance(target, Mapping)
|
|
95
|
+
or not isinstance(target.get("repository_id"), str)
|
|
96
|
+
or not target["repository_id"]
|
|
97
|
+
or entry.get("baseline_verification") != "UNVERIFIED"
|
|
98
|
+
or not isinstance(entry.get("selected_binding_resolution"), str)
|
|
99
|
+
or entry["selected_binding_resolution"] not in _BINDING_RESOLUTIONS):
|
|
100
|
+
raise ActionFrontierError("Mission Action target slot is invalid")
|
|
101
|
+
target_slots[action_id] = entry
|
|
102
|
+
source_slot_digest = digest
|
|
103
|
+
ordered = sorted(nodes.values(), key=lambda node: (node["order"], node["action_id"]))
|
|
104
|
+
frontier: list[str] = []
|
|
105
|
+
projected: list[dict[str, Any]] = []
|
|
106
|
+
for node in ordered:
|
|
107
|
+
dependencies = node["dependencies"]
|
|
108
|
+
if node["status"] != "READY":
|
|
109
|
+
logical_state = node["status"]
|
|
110
|
+
elif any(nodes[edge]["status"] in {"FAILED", "BLOCKED"} for edge in dependencies):
|
|
111
|
+
logical_state = "BLOCKED_BY_PREDECESSOR"
|
|
112
|
+
elif any(nodes[edge]["status"] != "COMPLETE" for edge in dependencies):
|
|
113
|
+
logical_state = "WAITING_FOR_PREDECESSOR"
|
|
114
|
+
elif dependencies:
|
|
115
|
+
# Serial storage does not bind a verified predicate to each edge.
|
|
116
|
+
logical_state = "WAITING_FOR_VERIFIED_EVIDENCE"
|
|
117
|
+
else:
|
|
118
|
+
logical_state = "LOGICALLY_ELIGIBLE"
|
|
119
|
+
frontier.append(node["action_id"])
|
|
120
|
+
slot = target_slots.get(node["action_id"])
|
|
121
|
+
projected.append({
|
|
122
|
+
"action_id": node["action_id"], "order": node["order"], "status": node["status"],
|
|
123
|
+
"dependencies": list(dependencies), "logical_state": logical_state,
|
|
124
|
+
"target_repository_id": slot["target"]["repository_id"] if slot else None,
|
|
125
|
+
"target_resolution": "PINNED_UNVERIFIED" if slot else "UNAVAILABLE",
|
|
126
|
+
"selected_binding_resolution": slot["selected_binding_resolution"] if slot else "UNAVAILABLE",
|
|
127
|
+
"baseline_verification": "UNVERIFIED" if slot else "UNAVAILABLE",
|
|
128
|
+
"dependency_evidence_resolution": "UNAVAILABLE" if dependencies else "NOT_REQUIRED",
|
|
129
|
+
"dispatchable": False,
|
|
130
|
+
})
|
|
131
|
+
return {
|
|
132
|
+
"contract_version": FRONTIER_CONTRACT_VERSION,
|
|
133
|
+
"source_mission_revision": mission_revision,
|
|
134
|
+
"source_slot_digest": source_slot_digest,
|
|
135
|
+
"graph_kind": "STORED_ACTION_LOGICAL_DAG",
|
|
136
|
+
"logical_frontier_action_ids": frontier,
|
|
137
|
+
"actions": projected,
|
|
138
|
+
"parallel_execution": "NOT_QUALIFIED",
|
|
139
|
+
"read_only": True,
|
|
140
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""Private-token HTTP-equivalent Candidate commands; no admin fallback."""
|
|
2
|
+
import argparse,json
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from .advisory_candidate_contract import CONTRACT
|
|
5
|
+
from .advisory_candidate_grant import AdvisoryCandidateGrant
|
|
6
|
+
from .advisory_candidate_service import AdvisoryCandidateService
|
|
7
|
+
from .workspace_review_grant import _private_bytes
|
|
8
|
+
|
|
9
|
+
def main(argv=None):
|
|
10
|
+
p=argparse.ArgumentParser(prog='forge-advisory-candidate');p.add_argument('--data-root',required=True);p.add_argument('--token-file',required=True);c=p.add_subparsers(dest='action',required=True);c.add_parser('capability')
|
|
11
|
+
source=c.add_parser('source');source.add_argument('--conversation-id',required=True);source.add_argument('--turn-id',required=True)
|
|
12
|
+
preview=c.add_parser('preview');preview.add_argument('--conversation-id',required=True);preview.add_argument('--proposal-id',required=True);preview.add_argument('--revision',type=int)
|
|
13
|
+
op=c.add_parser('operation');op.add_argument('--conversation-id',required=True);op.add_argument('--proposal-id',required=True);op.add_argument('--operation-id',required=True)
|
|
14
|
+
for name in ['save','register']:s=c.add_parser(name);s.add_argument('--request-file',required=True)
|
|
15
|
+
a=p.parse_args(argv)
|
|
16
|
+
try:
|
|
17
|
+
from .server_runtime import existing_instance
|
|
18
|
+
i=existing_instance(a.data_root);g=AdvisoryCandidateGrant(i.data_root,i.instance_id);t=Path(a.token_file)
|
|
19
|
+
if t.is_symlink() or t.stat().st_mode&0o077 or t.stat().st_size>256:raise ValueError('private token file required')
|
|
20
|
+
token='Bearer '+t.read_text().strip();service=AdvisoryCandidateService(i.data_root,g);method='GET';body=None
|
|
21
|
+
if a.action=='capability':target='/v1/advisory-candidates/capability'
|
|
22
|
+
elif a.action=='source':target='/v1/advisory-candidates/'+a.conversation_id+'/source/'+a.turn_id
|
|
23
|
+
elif a.action=='preview':target='/v1/advisory-candidates/'+a.conversation_id+'/proposals/'+a.proposal_id+('' if a.revision is None else '?revision='+str(a.revision))
|
|
24
|
+
elif a.action=='operation':target='/v1/advisory-candidates/'+a.conversation_id+'/proposals/'+a.proposal_id+'/registrations/'+a.operation_id
|
|
25
|
+
else:
|
|
26
|
+
body=json.loads(_private_bytes(Path(a.request_file)));method='POST';target='/v1/advisory-candidates/'+body['conversation_id']+'/proposals'+('' if a.action=='save' else '/'+body['proposal_id']+'/registrations')
|
|
27
|
+
status,out=service.handle(method,target,token,body);print(json.dumps(out,sort_keys=True));return 0 if status==200 else 1
|
|
28
|
+
except (OSError,ValueError,KeyError,RuntimeError):print(json.dumps({'contract_version':CONTRACT,'error':{'code':'CANDIDATE_CLI_UNAVAILABLE'}}));return 1
|
|
29
|
+
|
|
30
|
+
if __name__=='__main__':raise SystemExit(main())
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""Explicit user-authored Candidate fields and immutable advice provenance."""
|
|
2
|
+
from .advisory_contract import digest,text,AdvisoryConflict
|
|
3
|
+
from .approved_worklist import identifier
|
|
4
|
+
from .models.mission_effect import MissionEffectPolicy
|
|
5
|
+
from .lifecycle import MissionCandidate,MissionRecommendation
|
|
6
|
+
|
|
7
|
+
CONTRACT='forge-advisory-candidate/v1'
|
|
8
|
+
|
|
9
|
+
def revision(value):
|
|
10
|
+
if type(value) is not int or value<0:raise ValueError('invalid revision')
|
|
11
|
+
return value
|
|
12
|
+
|
|
13
|
+
def hash_reference(value):
|
|
14
|
+
if not isinstance(value,str) or len(value)!=71 or not value.startswith('sha256:') or any(c not in '0123456789abcdef' for c in value[7:]):raise ValueError('invalid digest')
|
|
15
|
+
return value
|
|
16
|
+
|
|
17
|
+
def exact(value,fields):
|
|
18
|
+
if not isinstance(value,dict) or set(value)!=set(fields.split()) or value.get('contract_version')!=CONTRACT:raise ValueError('closed Candidate contract required')
|
|
19
|
+
return value
|
|
20
|
+
|
|
21
|
+
def fields(value):
|
|
22
|
+
names='title objective business_value engineering_value architectural_value rationale confidence scope exclusions acceptance_criteria architecture_constraints dependencies effect_policy'
|
|
23
|
+
if not isinstance(value,dict) or set(value)!=set(names.split()):raise ValueError('explicit structured fields required')
|
|
24
|
+
for k in ['title','objective','business_value','engineering_value','architectural_value','rationale']:text(value[k],1000 if k!='title' else 256)
|
|
25
|
+
if type(value['confidence']) is not int or not 0<=value['confidence']<=100:raise ValueError('explicit confidence required')
|
|
26
|
+
for k in ['scope','exclusions','acceptance_criteria','architecture_constraints','dependencies']:
|
|
27
|
+
a=value[k]
|
|
28
|
+
if not isinstance(a,list) or len(a)>8 or len(a)!=len(set(a)):raise ValueError('bounded unique fields required')
|
|
29
|
+
for v in a:text(v,1000)
|
|
30
|
+
if not value['scope'] or not value['acceptance_criteria'] or any(len(v.strip())<20 for v in value['acceptance_criteria']):raise ValueError('substantive scope and criteria required')
|
|
31
|
+
policy=MissionEffectPolicy.from_dict(value['effect_policy'])
|
|
32
|
+
if policy.mode in {'DOCUMENTATION_ONLY','ARCHITECTURE_DESIGN_ONLY'} and any(v.endswith('/') for v in policy.write_paths):raise ValueError('document proposals require exact document paths')
|
|
33
|
+
return value
|
|
34
|
+
|
|
35
|
+
def proposal_request(value):
|
|
36
|
+
exact(value,'contract_version instance_id project_id repository_id conversation_id proposal_id turn_id expected_revision expected_conversation_revision context_revision fields')
|
|
37
|
+
for k in ['instance_id','project_id','repository_id','conversation_id','proposal_id','turn_id']:identifier(value[k])
|
|
38
|
+
revision(value['expected_revision']);revision(value['expected_conversation_revision']);hash_reference(value['context_revision']);fields(value['fields'])
|
|
39
|
+
return value
|
|
40
|
+
|
|
41
|
+
def registration_request(value):
|
|
42
|
+
exact(value,'contract_version operation_id instance_id project_id repository_id conversation_id proposal_id proposal_revision proposal_digest expected_conversation_revision context_revision confirm')
|
|
43
|
+
for k in ['operation_id','instance_id','project_id','repository_id','conversation_id','proposal_id']:identifier(value[k])
|
|
44
|
+
if revision(value['proposal_revision'])<1:raise ValueError('proposal revision required')
|
|
45
|
+
revision(value['expected_conversation_revision']);hash_reference(value['proposal_digest']);hash_reference(value['context_revision'])
|
|
46
|
+
if value['confirm'] is not True:raise ValueError('explicit confirmation required')
|
|
47
|
+
return value
|
|
48
|
+
|
|
49
|
+
def candidate_objects(proposal,key,occurred_at):
|
|
50
|
+
"""Only declared user fields populate the existing governance models."""
|
|
51
|
+
if proposal.get('contract_version') == 'forge-chat-first-mission/v1':
|
|
52
|
+
from .mission_concept_registration import candidate_objects as generated_objects
|
|
53
|
+
return generated_objects(proposal,key,occurred_at)
|
|
54
|
+
f=fields(proposal['fields']);source=proposal['source'];rec_id='advice-recommendation-'+key[7:39];can_id='advice-candidate-'+key[7:39]
|
|
55
|
+
rec=MissionRecommendation(id=rec_id,title=f['title'],mission_origin=source['advisor_kind'].lower(),
|
|
56
|
+
business_summary=f['objective'],engineering_summary=f['objective'],business_value=f['business_value'],
|
|
57
|
+
engineering_value=f['engineering_value'],architectural_value=f['architectural_value'],
|
|
58
|
+
repository_evidence=tuple(source['evidence_references']),decision_evidence_reference=source['result_digest'],
|
|
59
|
+
dependencies=tuple(f['dependencies']),alternatives=(),confidence=f['confidence'],recommendation_timestamp=occurred_at,
|
|
60
|
+
known_constraints=tuple(f['exclusions']),evidence_references=(source['request_digest'],source['context_revision']))
|
|
61
|
+
candidate=MissionCandidate(id=can_id,recommendation_id=rec.id,title=f['title'],objective=f['objective'],
|
|
62
|
+
scope=tuple(f['scope']),acceptance_criteria=tuple(f['acceptance_criteria']),
|
|
63
|
+
architecture_constraints=tuple(f['architecture_constraints'])+tuple('EXCLUDED: '+v for v in f['exclusions']),
|
|
64
|
+
dependencies=tuple(f['dependencies']),effect_policy=MissionEffectPolicy.from_dict(f['effect_policy']))
|
|
65
|
+
return rec,candidate
|
|
66
|
+
|
|
67
|
+
def registration_key(principal,proposal):
|
|
68
|
+
return digest([principal,proposal['project_id'],proposal['repository_id'],proposal['conversation_id'],proposal['proposal_id'],proposal['proposal_revision']])
|
|
69
|
+
|
|
70
|
+
def registration_receipt(principal,operation_id,key,proposal,occurred_at):
|
|
71
|
+
if proposal.get('contract_version') == 'forge-chat-first-mission/v1':
|
|
72
|
+
from .mission_concept_registration import registration_receipt as generated_receipt
|
|
73
|
+
return generated_receipt(principal,operation_id,key,proposal,occurred_at)
|
|
74
|
+
from .approved_worklist import timestamp
|
|
75
|
+
timestamp(occurred_at)
|
|
76
|
+
if proposal['principal_reference']!=principal or registration_key(principal,proposal)!=key:raise ValueError('registration correlation differs')
|
|
77
|
+
rec,can=candidate_objects(proposal,key,occurred_at)
|
|
78
|
+
return {'contract_version':CONTRACT,'operation_id':identifier(operation_id),'principal_reference':principal,'registration_key':key,'proposal_digest':proposal['proposal_digest'],'proposal_revision':proposal['proposal_revision'],'source':proposal['source'],'candidate':can.to_dict(),'recommendation_id':rec.id,'candidate_digest':digest(can.to_dict()),'recommendation_digest':digest(rec.to_dict()),'registered_at':occurred_at,'status_at_registration':'RECOMMENDED','rationale':proposal['fields']['rationale']}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""Separate owner capability for one conversation and exact Candidate proposal IDs."""
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from datetime import UTC,datetime,timedelta
|
|
5
|
+
from hashlib import sha256
|
|
6
|
+
import argparse,json,secrets
|
|
7
|
+
from .advisory_candidate_contract import CONTRACT
|
|
8
|
+
from .advisory_grant import project_scope,conversation_path
|
|
9
|
+
from .approved_worklist import identifier,timestamp
|
|
10
|
+
from .workspace_review_grant import _locked,_private_bytes,_write_private,_new_token
|
|
11
|
+
from .workspace_worklist_control_grant import current_operator
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class CandidatePrincipal:
|
|
15
|
+
principal_id:str
|
|
16
|
+
instance_id:str
|
|
17
|
+
project_id:str
|
|
18
|
+
repository_id:str
|
|
19
|
+
conversation_id:str
|
|
20
|
+
proposal_ids:tuple
|
|
21
|
+
grant_id:str
|
|
22
|
+
maximum_registrations:int
|
|
23
|
+
@property
|
|
24
|
+
def reference(self):return self.instance_id+':'+self.principal_id
|
|
25
|
+
@property
|
|
26
|
+
def conversation_ids(self):return (self.conversation_id,)
|
|
27
|
+
@property
|
|
28
|
+
def maximum_turns(self):return 8
|
|
29
|
+
|
|
30
|
+
class AdvisoryCandidateGrant:
|
|
31
|
+
def __init__(self,root,instance_id):
|
|
32
|
+
self.root=Path(root);self.instance_id=identifier(instance_id);self.path=self.root/'credentials'/'advisory-candidate'/'grants.json'
|
|
33
|
+
def _records(self,missing=False):
|
|
34
|
+
if missing and not self.path.exists() and not self.path.is_symlink():return []
|
|
35
|
+
v=json.loads(_private_bytes(self.path));names=set('principal_id instance_id project_id repository_id conversation_id proposal_ids grant_id maximum_registrations expires_at state token_digest'.split())
|
|
36
|
+
if not isinstance(v,dict) or set(v)!={'contract_version','instance_id','records'} or v['contract_version']!=CONTRACT or v['instance_id']!=self.instance_id or not isinstance(v['records'],list) or len(v['records'])>64:raise ValueError('invalid Candidate grant store')
|
|
37
|
+
records=v['records'];seen=set()
|
|
38
|
+
for r in records:
|
|
39
|
+
if not isinstance(r,dict) or set(r)!=names:raise ValueError('invalid Candidate grant')
|
|
40
|
+
for k in ['principal_id','instance_id','project_id','repository_id','conversation_id','grant_id']:identifier(r[k])
|
|
41
|
+
timestamp(r['expires_at'])
|
|
42
|
+
if r['instance_id']!=self.instance_id or r['grant_id'] in seen or r['state'] not in {'ACTIVE','REVOKED'} or type(r['maximum_registrations']) is not int or not 1<=r['maximum_registrations']<=8:raise ValueError('invalid grant binding')
|
|
43
|
+
if not isinstance(r['proposal_ids'],list) or not 1<=len(r['proposal_ids'])<=16 or sorted(set(r['proposal_ids']))!=r['proposal_ids']:raise ValueError('bounded proposal identities required')
|
|
44
|
+
for v in r['proposal_ids']:identifier(v)
|
|
45
|
+
h=r['token_digest']
|
|
46
|
+
if not isinstance(h,str) or len(h)!=64 or any(c not in '0123456789abcdef' for c in h):raise ValueError('invalid token digest')
|
|
47
|
+
seen.add(r['grant_id'])
|
|
48
|
+
return records
|
|
49
|
+
def _save(self,records):
|
|
50
|
+
raw=json.dumps({'contract_version':CONTRACT,'instance_id':self.instance_id,'records':records},sort_keys=True).encode()
|
|
51
|
+
if len(raw)>65536:raise ValueError('grant capacity exhausted')
|
|
52
|
+
_write_private(self.path,raw)
|
|
53
|
+
def issue(self,*,principal_id,project_id,repository_id,conversation_id,proposal_ids,expires_at,maximum_registrations,token_path):
|
|
54
|
+
for v in [principal_id,project_id,repository_id,conversation_id]:identifier(v)
|
|
55
|
+
if not isinstance(proposal_ids,(tuple,list)) or not 1<=len(proposal_ids)<=16 or len(set(proposal_ids))!=len(proposal_ids):raise ValueError('bounded proposals required')
|
|
56
|
+
for v in proposal_ids:identifier(v)
|
|
57
|
+
if type(maximum_registrations) is not int or not 1<=maximum_registrations<=8 or not datetime.now(UTC)<timestamp(expires_at)<=datetime.now(UTC)+timedelta(days=30):raise ValueError('bounded grant required')
|
|
58
|
+
token_path=Path(token_path)
|
|
59
|
+
if token_path.resolve()==self.path.resolve():raise ValueError('token/store collision')
|
|
60
|
+
with _locked(self.path):
|
|
61
|
+
current_operator(self.root,self.instance_id);scope=project_scope(self.root,self.instance_id)
|
|
62
|
+
if (scope['project_id'],scope['repository_id'])!=(project_id,repository_id):raise PermissionError('foreign project')
|
|
63
|
+
path=conversation_path(self.root,self.instance_id,project_id,repository_id,conversation_id)
|
|
64
|
+
if path.exists() or path.is_symlink():
|
|
65
|
+
if json.loads(_private_bytes(path))['principal_reference']!=self.instance_id+':'+principal_id:raise PermissionError('foreign advice owner')
|
|
66
|
+
records=self._records(True)
|
|
67
|
+
if len(records)>=64:raise ValueError('grant capacity exhausted')
|
|
68
|
+
token=secrets.token_urlsafe(48);r={**scope,'principal_id':principal_id,'conversation_id':conversation_id,'proposal_ids':sorted(proposal_ids),'grant_id':'candidate-'+secrets.token_hex(16),'maximum_registrations':maximum_registrations,'expires_at':expires_at,'state':'ACTIVE','token_digest':sha256(token.encode()).hexdigest()}
|
|
69
|
+
_new_token(token_path,token)
|
|
70
|
+
try:self._save([*records,r])
|
|
71
|
+
except Exception:token_path.unlink(missing_ok=True);raise
|
|
72
|
+
return {k:v for k,v in r.items() if k!='token_digest'}
|
|
73
|
+
def revoke(self,grant_id):
|
|
74
|
+
identifier(grant_id)
|
|
75
|
+
with _locked(self.path):
|
|
76
|
+
current_operator(self.root,self.instance_id);records=self._records();r=next((r for r in records if r['grant_id']==grant_id),None)
|
|
77
|
+
if r is None:raise ValueError('unknown grant')
|
|
78
|
+
r['state']='REVOKED';self._save(records);return {'grant_id':grant_id,'state':'REVOKED'}
|
|
79
|
+
def authenticate(self,authorization):
|
|
80
|
+
if not isinstance(authorization,str) or not authorization.startswith('Bearer '):return None
|
|
81
|
+
token=authorization[7:]
|
|
82
|
+
if not token or len(token)>256 or any(ord(c)<33 or ord(c)>126 for c in token):return None
|
|
83
|
+
try:
|
|
84
|
+
r=next((r for r in self._records() if secrets.compare_digest(r['token_digest'],sha256(token.encode()).hexdigest())),None)
|
|
85
|
+
if r is None or r['state']!='ACTIVE' or timestamp(r['expires_at'])<=datetime.now(UTC):return None
|
|
86
|
+
return CandidatePrincipal(**{k:r[k] for k in CandidatePrincipal.__dataclass_fields__ if k!='proposal_ids'},proposal_ids=tuple(r['proposal_ids']))
|
|
87
|
+
except (OSError,ValueError,KeyError,TypeError):return None
|
|
88
|
+
def authorize(self,authorization,conversation_id=None,proposal_id=None):
|
|
89
|
+
p=self.authenticate(authorization)
|
|
90
|
+
if p is None:raise PermissionError('Candidate credential unavailable')
|
|
91
|
+
current_operator(self.root,self.instance_id)
|
|
92
|
+
if project_scope(self.root,self.instance_id)!={k:getattr(p,k) for k in ['instance_id','project_id','repository_id']}:raise PermissionError('project changed')
|
|
93
|
+
if conversation_id is not None and conversation_id!=p.conversation_id or proposal_id is not None and proposal_id not in p.proposal_ids:raise PermissionError('foreign proposal scope')
|
|
94
|
+
return p
|
|
95
|
+
|
|
96
|
+
def main(argv=None):
|
|
97
|
+
parser=argparse.ArgumentParser(prog='forge-advisory-candidate-grant');parser.add_argument('--data-root',required=True);c=parser.add_subparsers(dest='action',required=True);i=c.add_parser('issue')
|
|
98
|
+
for k in ['principal-id','project-id','repository-id','conversation-id','expires-at','token-file']:i.add_argument('--'+k,required=True)
|
|
99
|
+
i.add_argument('--proposal-id',action='append',required=True);i.add_argument('--maximum-registrations',type=int,default=1);r=c.add_parser('revoke');r.add_argument('--grant-id',required=True);a=parser.parse_args(argv)
|
|
100
|
+
try:
|
|
101
|
+
from .server_runtime import existing_instance
|
|
102
|
+
instance=existing_instance(a.data_root);g=AdvisoryCandidateGrant(instance.data_root,instance.instance_id)
|
|
103
|
+
out=g.revoke(a.grant_id) if a.action=='revoke' else g.issue(principal_id=a.principal_id,project_id=a.project_id,repository_id=a.repository_id,conversation_id=a.conversation_id,proposal_ids=a.proposal_id,expires_at=a.expires_at,maximum_registrations=a.maximum_registrations,token_path=a.token_file)
|
|
104
|
+
print(json.dumps(out,sort_keys=True));return 0
|
|
105
|
+
except (OSError,ValueError,RuntimeError,PermissionError):print(json.dumps({'contract_version':CONTRACT,'error':{'code':'CANDIDATE_GRANT_UNAVAILABLE'}}));return 1
|
|
106
|
+
|
|
107
|
+
if __name__=='__main__':raise SystemExit(main())
|