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.
Files changed (319) hide show
  1. {forge_autonomy-2.7.26/forge_autonomy.egg-info → forge_autonomy-2.7.28}/PKG-INFO +12 -1
  2. forge_autonomy-2.7.26/PKG-INFO → forge_autonomy-2.7.28/README.md +11 -17
  3. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/__main__.py +12 -0
  4. forge_autonomy-2.7.28/forge/api/operations-read-openapi-v1.json +416 -0
  5. forge_autonomy-2.7.28/forge/api/operations-read-postman-v1.json +60 -0
  6. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/execution/loop.py +45 -3
  7. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/mission_cli.py +20 -10
  8. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/execution_host.py +5 -0
  9. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/producer.py +5 -2
  10. forge_autonomy-2.7.28/forge/operations_read_api.py +444 -0
  11. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/action_derivation.py +5 -5
  12. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/codex_cli_session.py +5 -2
  13. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/qualification/installed_smoke.py +3 -3
  14. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/dynamic_mission.py +37 -7
  15. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/runner.py +6 -0
  16. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/scheduler/ep_http_adapter.py +34 -4
  17. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/scheduler/ep_v12.py +1 -1
  18. forge_autonomy-2.7.26/README.md → forge_autonomy-2.7.28/forge_autonomy.egg-info/PKG-INFO +28 -0
  19. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge_autonomy.egg-info/SOURCES.txt +4 -0
  20. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/product-version.json +1 -1
  21. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/pyproject.toml +1 -1
  22. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_action_derivation.py +4 -3
  23. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_dynamic_mission_capability.py +33 -17
  24. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_ep_http_adapter.py +56 -2
  25. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_installed_dynamic_mission_runtime.py +19 -0
  26. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_installed_forge_update.py +439 -13
  27. forge_autonomy-2.7.28/tests/test_operations_read_api.py +346 -0
  28. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_terminal_continuation_replay.py +5 -4
  29. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/MANIFEST.in +0 -0
  30. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/__init__.py +0 -0
  31. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/_version.py +0 -0
  32. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/action_derivation_canary_closure.py +0 -0
  33. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/action_derivation_evidence.py +0 -0
  34. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/action_derivation_qualification.py +0 -0
  35. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/action_derivation_reattempt.py +0 -0
  36. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/ai_architect/__init__.py +0 -0
  37. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/ai_architect/provider_registry.py +0 -0
  38. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/architecture/__init__.py +0 -0
  39. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/architecture/advisor.py +0 -0
  40. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/architecture/presentation.py +0 -0
  41. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/architecture/workspace.py +0 -0
  42. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/autonomous_orchestrator.py +0 -0
  43. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/business/__init__.py +0 -0
  44. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/business/advisor.py +0 -0
  45. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/business/ingress.py +0 -0
  46. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/business/presentation.py +0 -0
  47. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/business/workspace.py +0 -0
  48. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/canary.py +0 -0
  49. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/capabilities/__init__.py +0 -0
  50. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/capabilities/delegation.py +0 -0
  51. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/completion/__init__.py +0 -0
  52. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/completion/assessor.py +0 -0
  53. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/completion/host_control_observer.py +0 -0
  54. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/completion/mission.py +0 -0
  55. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/completion/repository_observer.py +0 -0
  56. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/constitutional/__init__.py +0 -0
  57. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/constitutional/assessor.py +0 -0
  58. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/core/__init__.py +0 -0
  59. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/core/json_store.py +0 -0
  60. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/decision_evidence/__init__.py +0 -0
  61. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/decision_evidence/repository.py +0 -0
  62. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/dispatcher/__init__.py +0 -0
  63. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/dispatcher/dispatcher.py +0 -0
  64. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/execution/__init__.py +0 -0
  65. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/execution/presentation.py +0 -0
  66. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/execution_host_configuration.py +0 -0
  67. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/foundation/__init__.py +0 -0
  68. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/foundation/loader.py +0 -0
  69. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/generation_two.py +0 -0
  70. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/generation_two_execution.py +0 -0
  71. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/governance/__init__.py +0 -0
  72. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/governance/execution_policy.py +0 -0
  73. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/governance/profiles.py +0 -0
  74. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/governance_authority.py +0 -0
  75. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/intake.py +0 -0
  76. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/integration/__init__.py +0 -0
  77. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/integration/coordinator.py +0 -0
  78. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/integration/repository.py +0 -0
  79. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/knowledge/__init__.py +0 -0
  80. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/knowledge/consumer.py +0 -0
  81. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/knowledge/registry.py +0 -0
  82. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/lifecycle/__init__.py +0 -0
  83. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/lifecycle/store.py +0 -0
  84. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/mission_amendment.py +0 -0
  85. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/mission_scheduler.py +0 -0
  86. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/__init__.py +0 -0
  87. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/action.py +0 -0
  88. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/action_derivation.py +0 -0
  89. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/agent_policy.py +0 -0
  90. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/ai_architect_provider.py +0 -0
  91. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/ai_architect_session.py +0 -0
  92. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/ai_provider_registry.py +0 -0
  93. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/architecture_mission.py +0 -0
  94. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/architecture_reasoning.py +0 -0
  95. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/architecture_review.py +0 -0
  96. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/codex_runtime_prompt.py +0 -0
  97. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/constitutional_validation.py +0 -0
  98. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/criterion_assessment.py +0 -0
  99. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/criterion_observation.py +0 -0
  100. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/decision_evidence.py +0 -0
  101. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/foundation.py +0 -0
  102. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/historical_intent.py +0 -0
  103. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/integration.py +0 -0
  104. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/intent.py +0 -0
  105. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/intent_authoring.py +0 -0
  106. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/mission.py +0 -0
  107. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/mission_candidate.py +0 -0
  108. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/mission_completion.py +0 -0
  109. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/mission_planner.py +0 -0
  110. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/mission_recommendation.py +0 -0
  111. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/phase_completion.py +0 -0
  112. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/planning.py +0 -0
  113. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/prompt_artifact.py +0 -0
  114. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/proposal.py +0 -0
  115. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/runtime_prompt.py +0 -0
  116. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/models/solution_template.py +0 -0
  117. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/operator_identity.py +0 -0
  118. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/__init__.py +0 -0
  119. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/durable_derivation.py +0 -0
  120. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/engine.py +0 -0
  121. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/openai_responses.py +0 -0
  122. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planner/provider_adapter.py +0 -0
  123. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planning/__init__.py +0 -0
  124. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planning/loader.py +0 -0
  125. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/planning/registry.py +0 -0
  126. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/portfolio_intelligence.py +0 -0
  127. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/programme_authorization.py +0 -0
  128. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/prompts/__init__.py +0 -0
  129. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/prompts/codex_cli.py +0 -0
  130. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/prompts/generator.py +0 -0
  131. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/proposals/__init__.py +0 -0
  132. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/proposals/generator.py +0 -0
  133. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/provider_security.py +0 -0
  134. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/qualification/__init__.py +0 -0
  135. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/qualification/bootstrap_sequence.py +0 -0
  136. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/qualification/criterion_completion.py +0 -0
  137. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/qualification/generation_one.py +0 -0
  138. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/recommendations/__init__.py +0 -0
  139. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/recommendations/engine.py +0 -0
  140. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/repository_truth.py +0 -0
  141. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/review/__init__.py +0 -0
  142. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/review/engine.py +0 -0
  143. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/__init__.py +0 -0
  144. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/bootstrap.py +0 -0
  145. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/data_root.py +0 -0
  146. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/database.py +0 -0
  147. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/evidence.py +0 -0
  148. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/execution_context.py +0 -0
  149. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/health.py +0 -0
  150. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/mission_controller.py +0 -0
  151. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/operational_reset.py +0 -0
  152. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/runtime/service.py +0 -0
  153. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/scheduler/__init__.py +0 -0
  154. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/scheduler/adapter.py +0 -0
  155. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/scheduler/scheduler.py +0 -0
  156. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/capability-registry-1.0.schema.json +0 -0
  157. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/capability.schema.json +0 -0
  158. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/common.schema.json +0 -0
  159. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/decision-evidence-1.0.schema.json +0 -0
  160. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-goal-0.5.schema.json +0 -0
  161. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-increment-proposal-0.5.schema.json +0 -0
  162. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-mode.schema.json +0 -0
  163. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-plan-0.5.schema.json +0 -0
  164. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-platform-peer-configuration-1.0.schema.json +0 -0
  165. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-platform-peer-configuration-1.1.schema.json +0 -0
  166. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-prompt-artifact-0.7.schema.json +0 -0
  167. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/engineering-proposal-0.6.schema.json +0 -0
  168. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/evidence-reference-0.5.schema.json +0 -0
  169. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/foundation-document.schema.json +0 -0
  170. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/governance-profile.schema.json +0 -0
  171. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/knowledge-source-0.4.schema.json +0 -0
  172. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/knowledge-source.schema.json +0 -0
  173. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/mission-candidate-1.0.schema.json +0 -0
  174. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/mission-candidate-1.1.schema.json +0 -0
  175. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/phase-completion-1.0.schema.json +0 -0
  176. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/planning-document-0.5.schema.json +0 -0
  177. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/repository-catalog.schema.json +0 -0
  178. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/repository.schema.json +0 -0
  179. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/solution-template-1.0.schema.json +0 -0
  180. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/schemas/workspace.schema.json +0 -0
  181. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/secure_store.py +0 -0
  182. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/solutions/__init__.py +0 -0
  183. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/solutions/catalogue.py +0 -0
  184. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/solutions/generator.py +0 -0
  185. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/state/__init__.py +0 -0
  186. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/state/mission_state.py +0 -0
  187. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge/workspace/__init__.py +0 -0
  188. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge_autonomy.egg-info/dependency_links.txt +0 -0
  189. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge_autonomy.egg-info/entry_points.txt +0 -0
  190. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/forge_autonomy.egg-info/top_level.txt +0 -0
  191. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/capability-registry-1.0.schema.json +0 -0
  192. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/capability.schema.json +0 -0
  193. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/common.schema.json +0 -0
  194. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/decision-evidence-1.0.schema.json +0 -0
  195. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/engineering-goal-0.5.schema.json +0 -0
  196. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/engineering-increment-proposal-0.5.schema.json +0 -0
  197. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/engineering-mode.schema.json +0 -0
  198. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/engineering-plan-0.5.schema.json +0 -0
  199. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/engineering-prompt-artifact-0.7.schema.json +0 -0
  200. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/engineering-proposal-0.6.schema.json +0 -0
  201. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/evidence-reference-0.5.schema.json +0 -0
  202. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/foundation-document.schema.json +0 -0
  203. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/governance-profile.schema.json +0 -0
  204. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/knowledge-source-0.4.schema.json +0 -0
  205. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/knowledge-source.schema.json +0 -0
  206. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/mission-candidate-1.0.schema.json +0 -0
  207. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/mission-candidate-1.1.schema.json +0 -0
  208. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/phase-completion-1.0.schema.json +0 -0
  209. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/planning-document-0.5.schema.json +0 -0
  210. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/repository-catalog.schema.json +0 -0
  211. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/repository.schema.json +0 -0
  212. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/solution-template-1.0.schema.json +0 -0
  213. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/schemas/workspace.schema.json +0 -0
  214. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/setup.cfg +0 -0
  215. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_action_derivation_canary_closure.py +0 -0
  216. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_action_derivation_evidence.py +0 -0
  217. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_action_derivation_qualification.py +0 -0
  218. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_adaptive_action_sizing_design.py +0 -0
  219. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_agent_policy.py +0 -0
  220. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_aggregate_health_roadmap.py +0 -0
  221. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_ai_architect_provider.py +0 -0
  222. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_ai_architect_session.py +0 -0
  223. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_ai_development_projection.py +0 -0
  224. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_ai_provider_registry.py +0 -0
  225. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_architecture_reasoning.py +0 -0
  226. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_architecture_review_engine.py +0 -0
  227. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_architecture_workspace.py +0 -0
  228. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_autonomous_orchestrator.py +0 -0
  229. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_bootstrap_adapter.py +0 -0
  230. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_bootstrap_mission_canary.py +0 -0
  231. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_bootstrap_mission_runner.py +0 -0
  232. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_bootstrap_mission_scheduler.py +0 -0
  233. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_bootstrap_sequence_qualification.py +0 -0
  234. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_business_governance_ingress.py +0 -0
  235. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_business_workspace.py +0 -0
  236. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_canonical_data_root.py +0 -0
  237. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_capability_delegation.py +0 -0
  238. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_codex_cli_runtime_prompt.py +0 -0
  239. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_codex_cli_session.py +0 -0
  240. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_constitutional_validation.py +0 -0
  241. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_criterion_assessment_contract.py +0 -0
  242. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_criterion_ep_http_boundary.py +0 -0
  243. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_criterion_planning_context.py +0 -0
  244. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_decision_evidence.py +0 -0
  245. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_default_project_quality_policy.py +0 -0
  246. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_distribution_identity.py +0 -0
  247. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_durable_action_derivation.py +0 -0
  248. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_action_architecture.py +0 -0
  249. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_intent_authoring.py +0 -0
  250. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_intent_lifecycle.py +0 -0
  251. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_mission.py +0 -0
  252. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_planning.py +0 -0
  253. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_prompt_artifacts.py +0 -0
  254. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_engineering_proposals.py +0 -0
  255. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_execution_context.py +0 -0
  256. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_execution_host_configuration.py +0 -0
  257. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_execution_host_contract.py +0 -0
  258. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_execution_loop.py +0 -0
  259. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_existing_release_reconciliation.py +0 -0
  260. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_console_admin_parity_contract.py +0 -0
  261. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_console_configuration_contract.py +0 -0
  262. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_console_hosting_contract.py +0 -0
  263. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_operations_console_roadmap.py +0 -0
  264. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_outer_loop_ci_roadmap.py +0 -0
  265. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_v1_bootstrap_scheduler_contract.py +0 -0
  266. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_forge_v1_implementation_dag.py +0 -0
  267. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_foundation_loader.py +0 -0
  268. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_foundation_models.py +0 -0
  269. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_generation_one_bootstrap_qualification.py +0 -0
  270. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_generation_two_execution.py +0 -0
  271. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_generation_two_mission_intake.py +0 -0
  272. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_governance_authority.py +0 -0
  273. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_governed_coverage.py +0 -0
  274. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_historical_engineering_intent.py +0 -0
  275. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_host_control_completion.py +0 -0
  276. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_inner_loop_ci_contract.py +0 -0
  277. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_integration_coordination.py +0 -0
  278. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_knowledge_consumption.py +0 -0
  279. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_live_project_roadmap_contract.py +0 -0
  280. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_completion_evaluator.py +0 -0
  281. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_controller.py +0 -0
  282. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_dispatcher.py +0 -0
  283. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_planner.py +0 -0
  284. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_recommendation_engine.py +0 -0
  285. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_recommendation_lifecycle.py +0 -0
  286. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_runtime_projection.py +0 -0
  287. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_runtime_scheduler.py +0 -0
  288. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_state_store.py +0 -0
  289. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_mission_status.py +0 -0
  290. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_openai_action_derivation.py +0 -0
  291. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_operational_reset.py +0 -0
  292. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_operator_identity.py +0 -0
  293. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_phase_completion.py +0 -0
  294. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_platform_contract_documents.py +0 -0
  295. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_portfolio_intelligence_operation.py +0 -0
  296. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_producer_contract.py +0 -0
  297. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_product_version_operations.py +0 -0
  298. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_production_release_workflow.py +0 -0
  299. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_productization_reconciliation.py +0 -0
  300. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_programme_authorization.py +0 -0
  301. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_provider_security.py +0 -0
  302. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_pypi_distribution_readback.py +0 -0
  303. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_recovered_partial_completion.py +0 -0
  304. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_release_operation.py +0 -0
  305. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_repository_truth.py +0 -0
  306. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_role_aware_conversations_contract.py +0 -0
  307. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_bootstrap.py +0 -0
  308. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_database.py +0 -0
  309. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_evidence.py +0 -0
  310. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_health.py +0 -0
  311. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_instance_persistence.py +0 -0
  312. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_prompt_generation.py +0 -0
  313. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_service.py +0 -0
  314. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_runtime_status_projection.py +0 -0
  315. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_scheduler_dependency_boundary.py +0 -0
  316. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_schemas.py +0 -0
  317. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_secure_store.py +0 -0
  318. {forge_autonomy-2.7.26 → forge_autonomy-2.7.28}/tests/test_solution_templates.py +0 -0
  319. {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.26
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": [proposal.logical_action_id for proposal in proposals],
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) and isinstance(item.get("work_fingerprint"), str)
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)