forge-autonomy 2.7.26__tar.gz → 2.7.28__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.26/forge_autonomy.egg-info → forge_autonomy-2.7.28}/PKG-INFO +12 -1
- forge_autonomy-2.7.26/PKG-INFO → forge_autonomy-2.7.28/README.md +11 -17
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/__main__.py +12 -0
- forge_autonomy-2.7.28/forge/api/operations-read-openapi-v1.json +416 -0
- forge_autonomy-2.7.28/forge/api/operations-read-postman-v1.json +60 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/execution/loop.py +45 -3
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/mission_cli.py +20 -10
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/execution_host.py +5 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/producer.py +5 -2
- forge_autonomy-2.7.28/forge/operations_read_api.py +444 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/action_derivation.py +5 -5
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/codex_cli_session.py +5 -2
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/qualification/installed_smoke.py +3 -3
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/dynamic_mission.py +37 -7
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/runner.py +6 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/scheduler/ep_http_adapter.py +34 -4
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/scheduler/ep_v12.py +1 -1
- forge_autonomy-2.7.26/README.md → forge_autonomy-2.7.28/forge_autonomy.egg-info/PKG-INFO +28 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge_autonomy.egg-info/SOURCES.txt +4 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/product-version.json +1 -1
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/pyproject.toml +1 -1
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_action_derivation.py +4 -3
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_dynamic_mission_capability.py +33 -17
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_ep_http_adapter.py +56 -2
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_installed_dynamic_mission_runtime.py +19 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_installed_forge_update.py +439 -13
- forge_autonomy-2.7.28/tests/test_operations_read_api.py +346 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_terminal_continuation_replay.py +5 -4
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/MANIFEST.in +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/_version.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/action_derivation_canary_closure.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/action_derivation_evidence.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/action_derivation_qualification.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/action_derivation_reattempt.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/ai_architect/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/ai_architect/provider_registry.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/architecture/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/architecture/advisor.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/architecture/presentation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/architecture/workspace.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/autonomous_orchestrator.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/business/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/business/advisor.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/business/ingress.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/business/presentation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/business/workspace.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/canary.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/capabilities/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/capabilities/delegation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/completion/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/completion/assessor.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/completion/host_control_observer.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/completion/mission.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/completion/repository_observer.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/constitutional/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/constitutional/assessor.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/core/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/core/json_store.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/decision_evidence/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/decision_evidence/repository.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/dispatcher/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/dispatcher/dispatcher.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/execution/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/execution/presentation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/execution_host_configuration.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/foundation/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/foundation/loader.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/generation_two.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/generation_two_execution.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/governance/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/governance/execution_policy.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/governance/profiles.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/governance_authority.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/intake.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/integration/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/integration/coordinator.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/integration/repository.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/knowledge/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/knowledge/consumer.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/knowledge/registry.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/lifecycle/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/lifecycle/store.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/mission_amendment.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/mission_scheduler.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/action.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/action_derivation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/agent_policy.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/ai_architect_provider.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/ai_architect_session.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/ai_provider_registry.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/architecture_mission.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/architecture_reasoning.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/architecture_review.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/codex_runtime_prompt.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/constitutional_validation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/criterion_assessment.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/criterion_observation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/decision_evidence.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/foundation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/historical_intent.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/integration.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/intent.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/intent_authoring.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/mission.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/mission_candidate.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/mission_completion.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/mission_planner.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/mission_recommendation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/phase_completion.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/planning.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/prompt_artifact.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/proposal.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/runtime_prompt.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/solution_template.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/operator_identity.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/durable_derivation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/engine.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/openai_responses.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/provider_adapter.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planning/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planning/loader.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planning/registry.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/portfolio_intelligence.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/programme_authorization.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/prompts/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/prompts/codex_cli.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/prompts/generator.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/proposals/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/proposals/generator.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/provider_security.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/qualification/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/qualification/bootstrap_sequence.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/qualification/criterion_completion.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/qualification/generation_one.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/recommendations/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/recommendations/engine.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/repository_truth.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/review/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/review/engine.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/bootstrap.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/data_root.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/database.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/evidence.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/execution_context.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/health.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/mission_controller.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/operational_reset.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/service.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/scheduler/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/scheduler/adapter.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/scheduler/scheduler.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/capability-registry-1.0.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/capability.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/common.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/decision-evidence-1.0.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-goal-0.5.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-increment-proposal-0.5.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-mode.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-plan-0.5.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-platform-peer-configuration-1.0.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-platform-peer-configuration-1.1.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-prompt-artifact-0.7.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-proposal-0.6.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/evidence-reference-0.5.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/foundation-document.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/governance-profile.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/knowledge-source-0.4.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/knowledge-source.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/mission-candidate-1.0.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/mission-candidate-1.1.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/phase-completion-1.0.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/planning-document-0.5.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/repository-catalog.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/repository.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/solution-template-1.0.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/workspace.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/secure_store.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/solutions/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/solutions/catalogue.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/solutions/generator.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/state/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/state/mission_state.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/workspace/__init__.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge_autonomy.egg-info/dependency_links.txt +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge_autonomy.egg-info/entry_points.txt +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge_autonomy.egg-info/top_level.txt +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/capability-registry-1.0.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/capability.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/common.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/decision-evidence-1.0.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/engineering-goal-0.5.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/engineering-increment-proposal-0.5.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/engineering-mode.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/engineering-plan-0.5.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/engineering-prompt-artifact-0.7.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/engineering-proposal-0.6.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/evidence-reference-0.5.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/foundation-document.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/governance-profile.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/knowledge-source-0.4.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/knowledge-source.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/mission-candidate-1.0.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/mission-candidate-1.1.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/phase-completion-1.0.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/planning-document-0.5.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/repository-catalog.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/repository.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/solution-template-1.0.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/workspace.schema.json +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/setup.cfg +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_action_derivation_canary_closure.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_action_derivation_evidence.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_action_derivation_qualification.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_adaptive_action_sizing_design.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_agent_policy.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_aggregate_health_roadmap.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_ai_architect_provider.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_ai_architect_session.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_ai_development_projection.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_ai_provider_registry.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_architecture_reasoning.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_architecture_review_engine.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_architecture_workspace.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_autonomous_orchestrator.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_bootstrap_adapter.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_bootstrap_mission_canary.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_bootstrap_mission_runner.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_bootstrap_mission_scheduler.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_bootstrap_sequence_qualification.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_business_governance_ingress.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_business_workspace.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_canonical_data_root.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_capability_delegation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_codex_cli_runtime_prompt.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_codex_cli_session.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_constitutional_validation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_criterion_assessment_contract.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_criterion_ep_http_boundary.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_criterion_planning_context.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_decision_evidence.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_default_project_quality_policy.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_distribution_identity.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_durable_action_derivation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_action_architecture.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_intent_authoring.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_intent_lifecycle.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_mission.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_planning.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_prompt_artifacts.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_proposals.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_execution_context.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_execution_host_configuration.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_execution_host_contract.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_execution_loop.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_existing_release_reconciliation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_console_admin_parity_contract.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_console_configuration_contract.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_console_hosting_contract.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_operations_console_roadmap.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_outer_loop_ci_roadmap.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_v1_bootstrap_scheduler_contract.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_v1_implementation_dag.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_foundation_loader.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_foundation_models.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_generation_one_bootstrap_qualification.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_generation_two_execution.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_generation_two_mission_intake.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_governance_authority.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_governed_coverage.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_historical_engineering_intent.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_host_control_completion.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_inner_loop_ci_contract.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_integration_coordination.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_knowledge_consumption.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_live_project_roadmap_contract.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_completion_evaluator.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_controller.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_dispatcher.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_planner.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_recommendation_engine.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_recommendation_lifecycle.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_runtime_projection.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_runtime_scheduler.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_state_store.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_status.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_openai_action_derivation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_operational_reset.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_operator_identity.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_phase_completion.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_platform_contract_documents.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_portfolio_intelligence_operation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_producer_contract.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_product_version_operations.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_production_release_workflow.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_productization_reconciliation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_programme_authorization.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_provider_security.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_pypi_distribution_readback.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_recovered_partial_completion.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_release_operation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_repository_truth.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_role_aware_conversations_contract.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_bootstrap.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_database.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_evidence.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_health.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_instance_persistence.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_prompt_generation.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_service.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_status_projection.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_scheduler_dependency_boundary.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_schemas.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_secure_store.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_solution_templates.py +0 -0
- {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_substantive_mission_completion.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: forge-autonomy
|
|
3
|
-
Version: 2.7.
|
|
3
|
+
Version: 2.7.28
|
|
4
4
|
Summary: Forge mission planning, producer contracts, and evidence interpretation runtime.
|
|
5
5
|
Author: Forge maintainers
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -134,6 +134,17 @@ and atomically activates a versioned slot. It is not packaged as a Forge
|
|
|
134
134
|
Runtime command and does not replace Forge Platform's normal installer/update
|
|
135
135
|
composition boundary.
|
|
136
136
|
|
|
137
|
+
The later [MISSION-0017 vertical release and installation completion](docs/operations/MISSION_0017_VERTICAL_RELEASE_INSTALLATION_COMPLETION.md)
|
|
138
|
+
records the isolated two-Action qualification, protected Forge and EP product
|
|
139
|
+
delivery, exact published artifacts, scoped CENTRAL installation and the
|
|
140
|
+
remaining Mission-3 policy boundary. It does not authorize a production reset
|
|
141
|
+
or Mission start.
|
|
142
|
+
|
|
143
|
+
The subsequent [repository-bound autonomous assurance delivery](docs/operations/REPOSITORY_BOUND_AUTONOMOUS_ASSURANCE_COMPLETION.md)
|
|
144
|
+
records EP's versioned owner profile, isolated protected delivery qualification,
|
|
145
|
+
release and CENTRAL target configuration. It keeps Mission 3 and the
|
|
146
|
+
clean-CENTRAL procedure separate.
|
|
147
|
+
|
|
137
148
|
## Mission 3 acceptance preflight
|
|
138
149
|
|
|
139
150
|
The [18 September 2026 Mission 3 preflight report](docs/operations/MISSION_3_PREFLIGHT_ACCEPTANCE_2026_09_18.md)
|
|
@@ -1,20 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: forge-autonomy
|
|
3
|
-
Version: 2.7.26
|
|
4
|
-
Summary: Forge mission planning, producer contracts, and evidence interpretation runtime.
|
|
5
|
-
Author: Forge maintainers
|
|
6
|
-
License-Expression: Apache-2.0
|
|
7
|
-
Project-URL: Homepage, https://github.com/pcvantol/forge
|
|
8
|
-
Project-URL: Repository, https://github.com/pcvantol/forge
|
|
9
|
-
Project-URL: Issues, https://github.com/pcvantol/forge/issues
|
|
10
|
-
Classifier: Development Status :: 4 - Beta
|
|
11
|
-
Classifier: Intended Audience :: Developers
|
|
12
|
-
Classifier: Programming Language :: Python :: 3
|
|
13
|
-
Classifier: Programming Language :: Python :: 3 :: Only
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
-
Requires-Python: >=3.11
|
|
16
|
-
Description-Content-Type: text/markdown
|
|
17
|
-
|
|
18
1
|
# Forge
|
|
19
2
|
|
|
20
3
|
## Python distribution
|
|
@@ -134,6 +117,17 @@ and atomically activates a versioned slot. It is not packaged as a Forge
|
|
|
134
117
|
Runtime command and does not replace Forge Platform's normal installer/update
|
|
135
118
|
composition boundary.
|
|
136
119
|
|
|
120
|
+
The later [MISSION-0017 vertical release and installation completion](docs/operations/MISSION_0017_VERTICAL_RELEASE_INSTALLATION_COMPLETION.md)
|
|
121
|
+
records the isolated two-Action qualification, protected Forge and EP product
|
|
122
|
+
delivery, exact published artifacts, scoped CENTRAL installation and the
|
|
123
|
+
remaining Mission-3 policy boundary. It does not authorize a production reset
|
|
124
|
+
or Mission start.
|
|
125
|
+
|
|
126
|
+
The subsequent [repository-bound autonomous assurance delivery](docs/operations/REPOSITORY_BOUND_AUTONOMOUS_ASSURANCE_COMPLETION.md)
|
|
127
|
+
records EP's versioned owner profile, isolated protected delivery qualification,
|
|
128
|
+
release and CENTRAL target configuration. It keeps Mission 3 and the
|
|
129
|
+
clean-CENTRAL procedure separate.
|
|
130
|
+
|
|
137
131
|
## Mission 3 acceptance preflight
|
|
138
132
|
|
|
139
133
|
The [18 September 2026 Mission 3 preflight report](docs/operations/MISSION_3_PREFLIGHT_ACCEPTANCE_2026_09_18.md)
|
|
@@ -181,6 +181,10 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
181
181
|
default=120.0,
|
|
182
182
|
help="bounded interactive setup timeout in seconds (maximum: 120)",
|
|
183
183
|
)
|
|
184
|
+
operations_api = subparsers.add_parser("operations-api", help="serve authenticated read-only runtime projections")
|
|
185
|
+
operations_api.add_argument("--credential-file", required=True)
|
|
186
|
+
operations_api.add_argument("--host", default="127.0.0.1")
|
|
187
|
+
operations_api.add_argument("--port", type=int, default=8765)
|
|
184
188
|
args = parser.parse_args(argv)
|
|
185
189
|
if args.command == "mission":
|
|
186
190
|
from . import mission_cli
|
|
@@ -338,6 +342,14 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
338
342
|
print(json.dumps(service.preflight(), sort_keys=True))
|
|
339
343
|
except (PeerConfigurationError, ValueError) as error:
|
|
340
344
|
return _failure(f"execution-host {args.execution_host_command}", error)
|
|
345
|
+
elif args.command == "operations-api":
|
|
346
|
+
if args.data_root is None:
|
|
347
|
+
return _failure("operations-api", ValueError("--data-root is required for operations-api"))
|
|
348
|
+
try:
|
|
349
|
+
from .operations_read_api import serve
|
|
350
|
+
serve(args.data_root, args.credential_file, host=args.host, port=args.port)
|
|
351
|
+
except (OSError, ValueError) as error:
|
|
352
|
+
return _failure("operations-api", error)
|
|
341
353
|
return 0
|
|
342
354
|
|
|
343
355
|
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
{
|
|
2
|
+
"components": {
|
|
3
|
+
"schemas": {
|
|
4
|
+
"ErrorResponse": {
|
|
5
|
+
"additionalProperties": false,
|
|
6
|
+
"properties": {
|
|
7
|
+
"api_version": {
|
|
8
|
+
"const": "1"
|
|
9
|
+
},
|
|
10
|
+
"error": {
|
|
11
|
+
"additionalProperties": false,
|
|
12
|
+
"properties": {
|
|
13
|
+
"code": {
|
|
14
|
+
"minLength": 1,
|
|
15
|
+
"type": "string"
|
|
16
|
+
},
|
|
17
|
+
"message": {
|
|
18
|
+
"minLength": 1,
|
|
19
|
+
"type": "string"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"required": [
|
|
23
|
+
"code",
|
|
24
|
+
"message"
|
|
25
|
+
],
|
|
26
|
+
"type": "object"
|
|
27
|
+
},
|
|
28
|
+
"read_only": {
|
|
29
|
+
"const": true
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"required": [
|
|
33
|
+
"api_version",
|
|
34
|
+
"error",
|
|
35
|
+
"read_only"
|
|
36
|
+
],
|
|
37
|
+
"type": "object"
|
|
38
|
+
},
|
|
39
|
+
"MissionResponse": {
|
|
40
|
+
"additionalProperties": false,
|
|
41
|
+
"properties": {
|
|
42
|
+
"api_version": {
|
|
43
|
+
"const": "1"
|
|
44
|
+
},
|
|
45
|
+
"availability": {
|
|
46
|
+
"const": "AVAILABLE"
|
|
47
|
+
},
|
|
48
|
+
"freshness": {
|
|
49
|
+
"enum": [
|
|
50
|
+
"CURRENT",
|
|
51
|
+
"STALE",
|
|
52
|
+
"UNKNOWN"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
"mission": {
|
|
56
|
+
"additionalProperties": true,
|
|
57
|
+
"properties": {
|
|
58
|
+
"action_ids": {
|
|
59
|
+
"items": {
|
|
60
|
+
"type": "string"
|
|
61
|
+
},
|
|
62
|
+
"type": "array"
|
|
63
|
+
},
|
|
64
|
+
"actions": {
|
|
65
|
+
"items": {
|
|
66
|
+
"additionalProperties": false,
|
|
67
|
+
"properties": {
|
|
68
|
+
"dependencies": {
|
|
69
|
+
"items": {
|
|
70
|
+
"type": "string"
|
|
71
|
+
},
|
|
72
|
+
"type": "array"
|
|
73
|
+
},
|
|
74
|
+
"expected_evidence": {
|
|
75
|
+
"items": {
|
|
76
|
+
"type": "string"
|
|
77
|
+
},
|
|
78
|
+
"type": "array"
|
|
79
|
+
},
|
|
80
|
+
"id": {
|
|
81
|
+
"type": "string"
|
|
82
|
+
},
|
|
83
|
+
"intent_id": {
|
|
84
|
+
"type": "string"
|
|
85
|
+
},
|
|
86
|
+
"intent_revision": {
|
|
87
|
+
"type": "string"
|
|
88
|
+
},
|
|
89
|
+
"objective": {
|
|
90
|
+
"type": "string"
|
|
91
|
+
},
|
|
92
|
+
"order": {
|
|
93
|
+
"minimum": 1,
|
|
94
|
+
"type": "integer"
|
|
95
|
+
},
|
|
96
|
+
"schema_version": {
|
|
97
|
+
"type": "string"
|
|
98
|
+
},
|
|
99
|
+
"status": {
|
|
100
|
+
"type": "string"
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"required": [
|
|
104
|
+
"schema_version",
|
|
105
|
+
"order",
|
|
106
|
+
"id",
|
|
107
|
+
"intent_id",
|
|
108
|
+
"intent_revision",
|
|
109
|
+
"dependencies",
|
|
110
|
+
"status",
|
|
111
|
+
"objective",
|
|
112
|
+
"expected_evidence"
|
|
113
|
+
],
|
|
114
|
+
"type": "object"
|
|
115
|
+
},
|
|
116
|
+
"type": "array"
|
|
117
|
+
},
|
|
118
|
+
"criteria": {
|
|
119
|
+
"items": {
|
|
120
|
+
"type": "string"
|
|
121
|
+
},
|
|
122
|
+
"type": "array"
|
|
123
|
+
},
|
|
124
|
+
"evidence_lineage": {
|
|
125
|
+
"additionalProperties": false,
|
|
126
|
+
"properties": {
|
|
127
|
+
"criterion_assessment": {
|
|
128
|
+
"type": [
|
|
129
|
+
"object",
|
|
130
|
+
"null"
|
|
131
|
+
]
|
|
132
|
+
},
|
|
133
|
+
"criterion_assessment_history": {
|
|
134
|
+
"items": {
|
|
135
|
+
"type": [
|
|
136
|
+
"object",
|
|
137
|
+
"null"
|
|
138
|
+
]
|
|
139
|
+
},
|
|
140
|
+
"type": "array"
|
|
141
|
+
},
|
|
142
|
+
"execution_attempts": {
|
|
143
|
+
"items": {
|
|
144
|
+
"type": [
|
|
145
|
+
"object",
|
|
146
|
+
"null"
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
"type": "array"
|
|
150
|
+
},
|
|
151
|
+
"execution_evidence": {
|
|
152
|
+
"type": [
|
|
153
|
+
"object",
|
|
154
|
+
"null"
|
|
155
|
+
]
|
|
156
|
+
},
|
|
157
|
+
"repository_truth": {
|
|
158
|
+
"type": [
|
|
159
|
+
"object",
|
|
160
|
+
"null"
|
|
161
|
+
]
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"required": [
|
|
165
|
+
"execution_evidence",
|
|
166
|
+
"execution_attempts",
|
|
167
|
+
"repository_truth",
|
|
168
|
+
"criterion_assessment",
|
|
169
|
+
"criterion_assessment_history"
|
|
170
|
+
],
|
|
171
|
+
"type": "object"
|
|
172
|
+
},
|
|
173
|
+
"mission_id": {
|
|
174
|
+
"minLength": 1,
|
|
175
|
+
"type": "string"
|
|
176
|
+
},
|
|
177
|
+
"revision": {
|
|
178
|
+
"minimum": 1,
|
|
179
|
+
"type": "integer"
|
|
180
|
+
},
|
|
181
|
+
"status": {
|
|
182
|
+
"minLength": 1,
|
|
183
|
+
"type": "string"
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
"required": [
|
|
187
|
+
"mission_id",
|
|
188
|
+
"status",
|
|
189
|
+
"revision",
|
|
190
|
+
"action_ids",
|
|
191
|
+
"criteria",
|
|
192
|
+
"actions",
|
|
193
|
+
"evidence_lineage"
|
|
194
|
+
],
|
|
195
|
+
"type": "object"
|
|
196
|
+
},
|
|
197
|
+
"read_only": {
|
|
198
|
+
"const": true
|
|
199
|
+
},
|
|
200
|
+
"source_observed_at": {
|
|
201
|
+
"format": "date-time",
|
|
202
|
+
"type": [
|
|
203
|
+
"string",
|
|
204
|
+
"null"
|
|
205
|
+
]
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
"required": [
|
|
209
|
+
"api_version",
|
|
210
|
+
"availability",
|
|
211
|
+
"freshness",
|
|
212
|
+
"source_observed_at",
|
|
213
|
+
"read_only",
|
|
214
|
+
"mission"
|
|
215
|
+
],
|
|
216
|
+
"type": "object"
|
|
217
|
+
},
|
|
218
|
+
"StatusResponse": {
|
|
219
|
+
"additionalProperties": false,
|
|
220
|
+
"properties": {
|
|
221
|
+
"api_version": {
|
|
222
|
+
"const": "1"
|
|
223
|
+
},
|
|
224
|
+
"availability": {
|
|
225
|
+
"enum": [
|
|
226
|
+
"AVAILABLE",
|
|
227
|
+
"UNAVAILABLE"
|
|
228
|
+
]
|
|
229
|
+
},
|
|
230
|
+
"freshness": {
|
|
231
|
+
"enum": [
|
|
232
|
+
"CURRENT",
|
|
233
|
+
"STALE",
|
|
234
|
+
"UNKNOWN",
|
|
235
|
+
"UNAVAILABLE"
|
|
236
|
+
]
|
|
237
|
+
},
|
|
238
|
+
"read_only": {
|
|
239
|
+
"const": true
|
|
240
|
+
},
|
|
241
|
+
"runtime": {
|
|
242
|
+
"additionalProperties": true,
|
|
243
|
+
"required": [
|
|
244
|
+
"product_version",
|
|
245
|
+
"data_root",
|
|
246
|
+
"initialized",
|
|
247
|
+
"runtime_status",
|
|
248
|
+
"execution_host_peer"
|
|
249
|
+
],
|
|
250
|
+
"type": "object"
|
|
251
|
+
},
|
|
252
|
+
"source_observed_at": {
|
|
253
|
+
"format": "date-time",
|
|
254
|
+
"type": [
|
|
255
|
+
"string",
|
|
256
|
+
"null"
|
|
257
|
+
]
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
"required": [
|
|
261
|
+
"api_version",
|
|
262
|
+
"availability",
|
|
263
|
+
"freshness",
|
|
264
|
+
"source_observed_at",
|
|
265
|
+
"read_only",
|
|
266
|
+
"runtime"
|
|
267
|
+
],
|
|
268
|
+
"type": "object"
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
"securitySchemes": {
|
|
272
|
+
"bearerAuth": {
|
|
273
|
+
"scheme": "bearer",
|
|
274
|
+
"type": "http"
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
"info": {
|
|
279
|
+
"title": "Forge Operations Read API",
|
|
280
|
+
"version": "1.0.0"
|
|
281
|
+
},
|
|
282
|
+
"openapi": "3.1.0",
|
|
283
|
+
"paths": {
|
|
284
|
+
"/v1/missions/{mission_id}": {
|
|
285
|
+
"get": {
|
|
286
|
+
"description": "Read one authoritative installed Mission projection without changing it.",
|
|
287
|
+
"parameters": [
|
|
288
|
+
{
|
|
289
|
+
"in": "path",
|
|
290
|
+
"name": "mission_id",
|
|
291
|
+
"required": true,
|
|
292
|
+
"schema": {
|
|
293
|
+
"maxLength": 128,
|
|
294
|
+
"minLength": 1,
|
|
295
|
+
"type": "string"
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
],
|
|
299
|
+
"responses": {
|
|
300
|
+
"200": {
|
|
301
|
+
"content": {
|
|
302
|
+
"application/json": {
|
|
303
|
+
"schema": {
|
|
304
|
+
"$ref": "#/components/schemas/MissionResponse"
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
"description": "Mission projection is available"
|
|
309
|
+
},
|
|
310
|
+
"400": {
|
|
311
|
+
"content": {
|
|
312
|
+
"application/json": {
|
|
313
|
+
"schema": {
|
|
314
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
},
|
|
318
|
+
"description": "Mission reference is invalid"
|
|
319
|
+
},
|
|
320
|
+
"401": {
|
|
321
|
+
"content": {
|
|
322
|
+
"application/json": {
|
|
323
|
+
"schema": {
|
|
324
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
"description": "Bearer authentication is missing or invalid"
|
|
329
|
+
},
|
|
330
|
+
"404": {
|
|
331
|
+
"content": {
|
|
332
|
+
"application/json": {
|
|
333
|
+
"schema": {
|
|
334
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
"description": "Mission is missing"
|
|
339
|
+
},
|
|
340
|
+
"409": {
|
|
341
|
+
"content": {
|
|
342
|
+
"application/json": {
|
|
343
|
+
"schema": {
|
|
344
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
"description": "Mission identity is ambiguous or inconsistent"
|
|
349
|
+
},
|
|
350
|
+
"503": {
|
|
351
|
+
"content": {
|
|
352
|
+
"application/json": {
|
|
353
|
+
"schema": {
|
|
354
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
"description": "Mission projection is unavailable"
|
|
359
|
+
}
|
|
360
|
+
},
|
|
361
|
+
"security": [
|
|
362
|
+
{
|
|
363
|
+
"bearerAuth": []
|
|
364
|
+
}
|
|
365
|
+
]
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
"/v1/status": {
|
|
369
|
+
"get": {
|
|
370
|
+
"description": "Read the authoritative installed Forge runtime status projection.",
|
|
371
|
+
"responses": {
|
|
372
|
+
"200": {
|
|
373
|
+
"content": {
|
|
374
|
+
"application/json": {
|
|
375
|
+
"schema": {
|
|
376
|
+
"$ref": "#/components/schemas/StatusResponse"
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
},
|
|
380
|
+
"description": "Status projection is available"
|
|
381
|
+
},
|
|
382
|
+
"401": {
|
|
383
|
+
"content": {
|
|
384
|
+
"application/json": {
|
|
385
|
+
"schema": {
|
|
386
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
},
|
|
390
|
+
"description": "Bearer authentication is missing or invalid"
|
|
391
|
+
},
|
|
392
|
+
"503": {
|
|
393
|
+
"content": {
|
|
394
|
+
"application/json": {
|
|
395
|
+
"schema": {
|
|
396
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
},
|
|
400
|
+
"description": "Installed runtime projection is unavailable"
|
|
401
|
+
}
|
|
402
|
+
},
|
|
403
|
+
"security": [
|
|
404
|
+
{
|
|
405
|
+
"bearerAuth": []
|
|
406
|
+
}
|
|
407
|
+
]
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
"servers": [
|
|
412
|
+
{
|
|
413
|
+
"url": "http://127.0.0.1:8765"
|
|
414
|
+
}
|
|
415
|
+
]
|
|
416
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"auth": {
|
|
3
|
+
"bearer": [{"key": "token", "type": "string", "value": "{{bearerCredential}}"}],
|
|
4
|
+
"type": "bearer"
|
|
5
|
+
},
|
|
6
|
+
"info": {
|
|
7
|
+
"name": "Forge Operations Read API V1",
|
|
8
|
+
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
|
|
9
|
+
},
|
|
10
|
+
"item": [
|
|
11
|
+
{
|
|
12
|
+
"name": "Installed status",
|
|
13
|
+
"request": {"method": "GET", "url": "{{baseUrl}}/v1/status"},
|
|
14
|
+
"response": [{"code": 200, "name": "Available"}, {"code": 503, "name": "Unavailable"}]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"auth": {"type": "noauth"},
|
|
18
|
+
"name": "Installed status requires authentication",
|
|
19
|
+
"request": {"method": "GET", "url": "{{baseUrl}}/v1/status"},
|
|
20
|
+
"response": [{"code": 401, "name": "Authentication required"}]
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "Mission detail",
|
|
24
|
+
"request": {"method": "GET", "url": "{{baseUrl}}/v1/missions/{{missionId}}"},
|
|
25
|
+
"response": [{"code": 200, "name": "Available"}]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"auth": {"type": "noauth"},
|
|
29
|
+
"name": "Mission detail requires authentication",
|
|
30
|
+
"request": {"method": "GET", "url": "{{baseUrl}}/v1/missions/{{missionId}}"},
|
|
31
|
+
"response": [{"code": 401, "name": "Authentication required"}]
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"name": "Mission reference invalid",
|
|
35
|
+
"request": {"method": "GET", "url": "{{baseUrl}}/v1/missions/%20"},
|
|
36
|
+
"response": [{"code": 400, "name": "Invalid"}]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"name": "Mission missing",
|
|
40
|
+
"request": {"method": "GET", "url": "{{baseUrl}}/v1/missions/MISSION-MISSING"},
|
|
41
|
+
"response": [{"code": 404, "name": "Missing"}]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"name": "Mission ambiguous",
|
|
45
|
+
"request": {"method": "GET", "url": "{{baseUrl}}/v1/missions/{{ambiguousMissionId}}"},
|
|
46
|
+
"response": [{"code": 409, "name": "Ambiguous"}]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "Mission unavailable",
|
|
50
|
+
"request": {"method": "GET", "url": "{{baseUrl}}/v1/missions/{{missionId}}"},
|
|
51
|
+
"response": [{"code": 503, "name": "Unavailable"}]
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"variable": [
|
|
55
|
+
{"key": "baseUrl", "value": "http://127.0.0.1:8765"},
|
|
56
|
+
{"key": "bearerCredential", "value": ""},
|
|
57
|
+
{"key": "missionId", "value": "MISSION-0004"},
|
|
58
|
+
{"key": "ambiguousMissionId", "value": "MISSION-AMBIGUOUS"}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
@@ -123,6 +123,7 @@ class ExecutionLoop:
|
|
|
123
123
|
workspace_id: str,
|
|
124
124
|
repository_id: str,
|
|
125
125
|
repository_identity: str | None = None,
|
|
126
|
+
origin_identity: str | None = None,
|
|
126
127
|
clock: Callable[[], str],
|
|
127
128
|
correlation_id_factory: Callable[[], str],
|
|
128
129
|
execution_policy: ExecutionPolicy | None = None,
|
|
@@ -142,6 +143,7 @@ class ExecutionLoop:
|
|
|
142
143
|
self._planning_input, self._prompt_factory, self._repository_truth = planning_input, prompt_factory, repository_truth
|
|
143
144
|
self._host_id, self._workspace_id, self._repository_id = host_id, workspace_id, repository_id
|
|
144
145
|
self._repository_identity = repository_identity or repository_id
|
|
146
|
+
self._origin_identity = origin_identity
|
|
145
147
|
self._clock, self._correlation_id_factory = clock, correlation_id_factory
|
|
146
148
|
self._execution_policy = execution_policy or execution_policy_for_profile(governance_profile)
|
|
147
149
|
self._capability_registry = capability_registry
|
|
@@ -366,6 +368,8 @@ class ExecutionLoop:
|
|
|
366
368
|
derivation: Mapping[str, Any] | None) -> MissionExecutionState:
|
|
367
369
|
if not self._keep_running():
|
|
368
370
|
return state
|
|
371
|
+
if derivation is not None:
|
|
372
|
+
plan, derivation = self._immediate_action_plan(plan, derivation, ())
|
|
369
373
|
actions = tuple(action for intent in plan.intents for action in intent.actions)
|
|
370
374
|
if not actions:
|
|
371
375
|
raise ExecutionLoopError("approved Mission planning produced no executable Engineering Actions")
|
|
@@ -488,11 +492,41 @@ class ExecutionLoop:
|
|
|
488
492
|
"validated_before_materialization": True,
|
|
489
493
|
"materialized_plan_id": result.plan.id,
|
|
490
494
|
"materialized_plan_digest": result.plan.input_digest,
|
|
491
|
-
"materialized_action_ids": [
|
|
495
|
+
"materialized_action_ids": [],
|
|
492
496
|
"proposals": list(proposal_documents),
|
|
493
497
|
"completed_action_ids_at_derivation": list(planning_input.mission_state.completed_action_ids),
|
|
494
498
|
}
|
|
495
499
|
|
|
500
|
+
@staticmethod
|
|
501
|
+
def _immediate_action_plan(
|
|
502
|
+
plan: MissionPlan, derivation: Mapping[str, Any], completed_ids: tuple[str, ...],
|
|
503
|
+
) -> tuple[MissionPlan, Mapping[str, Any]]:
|
|
504
|
+
"""Keep one executable Action; retain other hypotheses only as audit forecast.
|
|
505
|
+
|
|
506
|
+
Selection is deterministic for replay of a persisted provider result.
|
|
507
|
+
A forecast has no Action identity in Mission State and is reconsidered
|
|
508
|
+
against new Repository Truth and evidence by the next invocation.
|
|
509
|
+
"""
|
|
510
|
+
completed = set(completed_ids)
|
|
511
|
+
candidates = sorted(
|
|
512
|
+
(action for intent in plan.intents for action in intent.actions
|
|
513
|
+
if action.status is EngineeringActionStatus.READY
|
|
514
|
+
and set(action.dependencies) <= completed),
|
|
515
|
+
key=lambda action: (action.order, action.id),
|
|
516
|
+
)
|
|
517
|
+
if not candidates:
|
|
518
|
+
raise ExecutionLoopError("NO_IMMEDIATE_ACTION_AFTER_VALIDATED_FORECAST")
|
|
519
|
+
chosen = candidates[0]
|
|
520
|
+
intents = tuple(replace(intent, actions=(chosen,)) for intent in plan.intents
|
|
521
|
+
if any(action.id == chosen.id for action in intent.actions))
|
|
522
|
+
forecast = [item["logical_action_id"] for item in derivation.get("proposals", ())
|
|
523
|
+
if item["logical_action_id"] != chosen.id]
|
|
524
|
+
return replace(plan, intents=intents), {
|
|
525
|
+
**derivation,
|
|
526
|
+
"materialized_action_ids": [chosen.id],
|
|
527
|
+
"forecast_proposal_ids": forecast,
|
|
528
|
+
}
|
|
529
|
+
|
|
496
530
|
def _delegate_if_required(self, state: MissionExecutionState) -> MissionExecutionState:
|
|
497
531
|
if self._capability_registry is None:
|
|
498
532
|
return state
|
|
@@ -570,6 +604,7 @@ class ExecutionLoop:
|
|
|
570
604
|
return BootstrapMissionRunner(self._states, BootstrapMissionScheduler(), self._host, self._prompt_factory,
|
|
571
605
|
host_id=self._host_id, workspace_id=self._workspace_id, repository_id=self._repository_id,
|
|
572
606
|
repository_identity=self._repository_identity,
|
|
607
|
+
origin_identity=self._origin_identity,
|
|
573
608
|
clock=self._clock, correlation_id_factory=self._correlation_id_factory,
|
|
574
609
|
completion_context=completion, replan_after_evidence=self._replan_after_evidence,
|
|
575
610
|
evidence_progression_gate=self._pause_after_evidence,
|
|
@@ -639,12 +674,19 @@ class ExecutionLoop:
|
|
|
639
674
|
if not self._keep_running():
|
|
640
675
|
return state
|
|
641
676
|
assert derivation is not None
|
|
677
|
+
plan, derivation = self._immediate_action_plan(
|
|
678
|
+
plan, derivation, tuple(action.id for action in actions
|
|
679
|
+
if action.status is EngineeringActionStatus.COMPLETE),
|
|
680
|
+
)
|
|
642
681
|
previous_fingerprints = {
|
|
643
682
|
item["work_fingerprint"] for record in state.planning_history
|
|
644
683
|
for item in record.get("proposals", ())
|
|
645
|
-
if isinstance(item, Mapping)
|
|
684
|
+
if isinstance(item, Mapping)
|
|
685
|
+
and item.get("logical_action_id") in record.get("materialized_action_ids", ())
|
|
686
|
+
and isinstance(item.get("work_fingerprint"), str)
|
|
646
687
|
}
|
|
647
|
-
if any(item["work_fingerprint"] in previous_fingerprints for item in derivation["proposals"]
|
|
688
|
+
if any(item["work_fingerprint"] in previous_fingerprints for item in derivation["proposals"]
|
|
689
|
+
if item["logical_action_id"] in derivation["materialized_action_ids"]):
|
|
648
690
|
raise ExecutionLoopError("DUPLICATE_SUCCESSOR_WORK")
|
|
649
691
|
existing_ids = {action.id for action in actions}
|
|
650
692
|
proposed = tuple(action for intent in plan.intents for action in intent.actions)
|