forge-autonomy 2.7.30__tar.gz → 2.7.31__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.30 → forge_autonomy-2.7.31}/PKG-INFO +1 -1
  2. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/codex_cli_session.py +16 -6
  3. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/openai_responses.py +31 -3
  4. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge_autonomy.egg-info/PKG-INFO +1 -1
  5. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/product-version.json +1 -1
  6. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_codex_cli_session.py +37 -0
  7. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_criterion_planning_context.py +4 -1
  8. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_installed_forge_update.py +26 -3
  9. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/MANIFEST.in +0 -0
  10. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/README.md +0 -0
  11. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/__init__.py +0 -0
  12. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/__main__.py +0 -0
  13. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/_version.py +0 -0
  14. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/action_derivation_canary_closure.py +0 -0
  15. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/action_derivation_evidence.py +0 -0
  16. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/action_derivation_qualification.py +0 -0
  17. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/action_derivation_reattempt.py +0 -0
  18. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/ai_architect/__init__.py +0 -0
  19. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/ai_architect/provider_registry.py +0 -0
  20. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/api/operations-read-openapi-v1.json +0 -0
  21. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/api/operations-read-postman-v1.json +0 -0
  22. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/architecture/__init__.py +0 -0
  23. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/architecture/advisor.py +0 -0
  24. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/architecture/presentation.py +0 -0
  25. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/architecture/workspace.py +0 -0
  26. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/autonomous_orchestrator.py +0 -0
  27. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/business/__init__.py +0 -0
  28. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/business/advisor.py +0 -0
  29. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/business/ingress.py +0 -0
  30. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/business/presentation.py +0 -0
  31. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/business/workspace.py +0 -0
  32. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/canary.py +0 -0
  33. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/capabilities/__init__.py +0 -0
  34. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/capabilities/delegation.py +0 -0
  35. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/completion/__init__.py +0 -0
  36. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/completion/assessor.py +0 -0
  37. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/completion/host_control_observer.py +0 -0
  38. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/completion/mission.py +0 -0
  39. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/completion/repository_observer.py +0 -0
  40. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/constitutional/__init__.py +0 -0
  41. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/constitutional/assessor.py +0 -0
  42. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/core/__init__.py +0 -0
  43. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/core/json_store.py +0 -0
  44. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/decision_evidence/__init__.py +0 -0
  45. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/decision_evidence/repository.py +0 -0
  46. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/dispatcher/__init__.py +0 -0
  47. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/dispatcher/dispatcher.py +0 -0
  48. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/execution/__init__.py +0 -0
  49. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/execution/loop.py +0 -0
  50. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/execution/presentation.py +0 -0
  51. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/execution_host_configuration.py +0 -0
  52. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/foundation/__init__.py +0 -0
  53. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/foundation/loader.py +0 -0
  54. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/generation_two.py +0 -0
  55. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/generation_two_execution.py +0 -0
  56. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/governance/__init__.py +0 -0
  57. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/governance/execution_policy.py +0 -0
  58. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/governance/profiles.py +0 -0
  59. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/governance_authority.py +0 -0
  60. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/intake.py +0 -0
  61. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/integration/__init__.py +0 -0
  62. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/integration/coordinator.py +0 -0
  63. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/integration/repository.py +0 -0
  64. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/knowledge/__init__.py +0 -0
  65. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/knowledge/consumer.py +0 -0
  66. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/knowledge/registry.py +0 -0
  67. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/lifecycle/__init__.py +0 -0
  68. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/lifecycle/store.py +0 -0
  69. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/mission_amendment.py +0 -0
  70. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/mission_cli.py +0 -0
  71. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/mission_scheduler.py +0 -0
  72. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/__init__.py +0 -0
  73. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/action.py +0 -0
  74. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/action_derivation.py +0 -0
  75. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/agent_policy.py +0 -0
  76. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/ai_architect_provider.py +0 -0
  77. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/ai_architect_session.py +0 -0
  78. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/ai_provider_registry.py +0 -0
  79. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/architecture_mission.py +0 -0
  80. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/architecture_reasoning.py +0 -0
  81. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/architecture_review.py +0 -0
  82. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/codex_runtime_prompt.py +0 -0
  83. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/constitutional_validation.py +0 -0
  84. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/criterion_assessment.py +0 -0
  85. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/criterion_observation.py +0 -0
  86. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/decision_evidence.py +0 -0
  87. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/execution_host.py +0 -0
  88. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/foundation.py +0 -0
  89. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/historical_intent.py +0 -0
  90. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/integration.py +0 -0
  91. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/intent.py +0 -0
  92. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/intent_authoring.py +0 -0
  93. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/mission.py +0 -0
  94. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/mission_candidate.py +0 -0
  95. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/mission_completion.py +0 -0
  96. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/mission_planner.py +0 -0
  97. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/mission_recommendation.py +0 -0
  98. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/phase_completion.py +0 -0
  99. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/planning.py +0 -0
  100. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/producer.py +0 -0
  101. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/prompt_artifact.py +0 -0
  102. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/proposal.py +0 -0
  103. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/runtime_prompt.py +0 -0
  104. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/solution_template.py +0 -0
  105. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/operations_read_api.py +0 -0
  106. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/operator_identity.py +0 -0
  107. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/__init__.py +0 -0
  108. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/action_derivation.py +0 -0
  109. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/durable_derivation.py +0 -0
  110. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/engine.py +0 -0
  111. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/provider_adapter.py +0 -0
  112. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planning/__init__.py +0 -0
  113. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planning/loader.py +0 -0
  114. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planning/registry.py +0 -0
  115. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/portfolio_intelligence.py +0 -0
  116. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/programme_authorization.py +0 -0
  117. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/prompts/__init__.py +0 -0
  118. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/prompts/codex_cli.py +0 -0
  119. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/prompts/generator.py +0 -0
  120. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/proposals/__init__.py +0 -0
  121. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/proposals/generator.py +0 -0
  122. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/provider_security.py +0 -0
  123. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/qualification/__init__.py +0 -0
  124. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/qualification/bootstrap_sequence.py +0 -0
  125. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/qualification/criterion_completion.py +0 -0
  126. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/qualification/generation_one.py +0 -0
  127. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/qualification/installed_smoke.py +0 -0
  128. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/recommendations/__init__.py +0 -0
  129. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/recommendations/engine.py +0 -0
  130. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/repository_truth.py +0 -0
  131. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/review/__init__.py +0 -0
  132. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/review/engine.py +0 -0
  133. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/__init__.py +0 -0
  134. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/bootstrap.py +0 -0
  135. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/data_root.py +0 -0
  136. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/database.py +0 -0
  137. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/dynamic_mission.py +0 -0
  138. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/evidence.py +0 -0
  139. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/execution_context.py +0 -0
  140. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/health.py +0 -0
  141. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/mission_controller.py +0 -0
  142. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/operational_reset.py +0 -0
  143. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/runner.py +0 -0
  144. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/service.py +0 -0
  145. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/scheduler/__init__.py +0 -0
  146. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/scheduler/adapter.py +0 -0
  147. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/scheduler/ep_http_adapter.py +0 -0
  148. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/scheduler/ep_v12.py +0 -0
  149. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/scheduler/scheduler.py +0 -0
  150. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/capability-registry-1.0.schema.json +0 -0
  151. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/capability.schema.json +0 -0
  152. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/common.schema.json +0 -0
  153. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/decision-evidence-1.0.schema.json +0 -0
  154. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-goal-0.5.schema.json +0 -0
  155. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-increment-proposal-0.5.schema.json +0 -0
  156. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-mode.schema.json +0 -0
  157. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-plan-0.5.schema.json +0 -0
  158. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-platform-peer-configuration-1.0.schema.json +0 -0
  159. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-platform-peer-configuration-1.1.schema.json +0 -0
  160. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-prompt-artifact-0.7.schema.json +0 -0
  161. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-proposal-0.6.schema.json +0 -0
  162. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/evidence-reference-0.5.schema.json +0 -0
  163. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/foundation-document.schema.json +0 -0
  164. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/governance-profile.schema.json +0 -0
  165. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/knowledge-source-0.4.schema.json +0 -0
  166. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/knowledge-source.schema.json +0 -0
  167. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/mission-candidate-1.0.schema.json +0 -0
  168. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/mission-candidate-1.1.schema.json +0 -0
  169. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/phase-completion-1.0.schema.json +0 -0
  170. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/planning-document-0.5.schema.json +0 -0
  171. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/repository-catalog.schema.json +0 -0
  172. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/repository.schema.json +0 -0
  173. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/solution-template-1.0.schema.json +0 -0
  174. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/workspace.schema.json +0 -0
  175. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/secure_store.py +0 -0
  176. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/solutions/__init__.py +0 -0
  177. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/solutions/catalogue.py +0 -0
  178. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/solutions/generator.py +0 -0
  179. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/state/__init__.py +0 -0
  180. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/state/mission_state.py +0 -0
  181. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/workspace/__init__.py +0 -0
  182. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge_autonomy.egg-info/SOURCES.txt +0 -0
  183. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge_autonomy.egg-info/dependency_links.txt +0 -0
  184. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge_autonomy.egg-info/entry_points.txt +0 -0
  185. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge_autonomy.egg-info/top_level.txt +0 -0
  186. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/pyproject.toml +0 -0
  187. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/capability-registry-1.0.schema.json +0 -0
  188. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/capability.schema.json +0 -0
  189. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/common.schema.json +0 -0
  190. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/decision-evidence-1.0.schema.json +0 -0
  191. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/engineering-goal-0.5.schema.json +0 -0
  192. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/engineering-increment-proposal-0.5.schema.json +0 -0
  193. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/engineering-mode.schema.json +0 -0
  194. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/engineering-plan-0.5.schema.json +0 -0
  195. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/engineering-prompt-artifact-0.7.schema.json +0 -0
  196. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/engineering-proposal-0.6.schema.json +0 -0
  197. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/evidence-reference-0.5.schema.json +0 -0
  198. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/foundation-document.schema.json +0 -0
  199. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/governance-profile.schema.json +0 -0
  200. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/knowledge-source-0.4.schema.json +0 -0
  201. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/knowledge-source.schema.json +0 -0
  202. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/mission-candidate-1.0.schema.json +0 -0
  203. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/mission-candidate-1.1.schema.json +0 -0
  204. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/phase-completion-1.0.schema.json +0 -0
  205. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/planning-document-0.5.schema.json +0 -0
  206. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/repository-catalog.schema.json +0 -0
  207. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/repository.schema.json +0 -0
  208. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/solution-template-1.0.schema.json +0 -0
  209. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/workspace.schema.json +0 -0
  210. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/setup.cfg +0 -0
  211. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_action_derivation.py +0 -0
  212. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_action_derivation_canary_closure.py +0 -0
  213. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_action_derivation_evidence.py +0 -0
  214. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_action_derivation_qualification.py +0 -0
  215. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_adaptive_action_sizing_design.py +0 -0
  216. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_agent_policy.py +0 -0
  217. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_aggregate_health_roadmap.py +0 -0
  218. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_ai_architect_provider.py +0 -0
  219. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_ai_architect_session.py +0 -0
  220. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_ai_development_projection.py +0 -0
  221. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_ai_provider_registry.py +0 -0
  222. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_architecture_reasoning.py +0 -0
  223. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_architecture_review_engine.py +0 -0
  224. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_architecture_workspace.py +0 -0
  225. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_autonomous_orchestrator.py +0 -0
  226. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_bootstrap_adapter.py +0 -0
  227. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_bootstrap_mission_canary.py +0 -0
  228. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_bootstrap_mission_runner.py +0 -0
  229. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_bootstrap_mission_scheduler.py +0 -0
  230. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_bootstrap_sequence_qualification.py +0 -0
  231. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_business_governance_ingress.py +0 -0
  232. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_business_workspace.py +0 -0
  233. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_canonical_data_root.py +0 -0
  234. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_capability_delegation.py +0 -0
  235. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_codex_cli_runtime_prompt.py +0 -0
  236. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_constitutional_validation.py +0 -0
  237. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_criterion_assessment_contract.py +0 -0
  238. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_criterion_ep_http_boundary.py +0 -0
  239. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_decision_evidence.py +0 -0
  240. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_default_project_quality_policy.py +0 -0
  241. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_distribution_identity.py +0 -0
  242. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_durable_action_derivation.py +0 -0
  243. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_dynamic_mission_capability.py +0 -0
  244. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_action_architecture.py +0 -0
  245. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_intent_authoring.py +0 -0
  246. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_intent_lifecycle.py +0 -0
  247. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_mission.py +0 -0
  248. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_planning.py +0 -0
  249. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_prompt_artifacts.py +0 -0
  250. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_proposals.py +0 -0
  251. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_ep_http_adapter.py +0 -0
  252. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_execution_context.py +0 -0
  253. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_execution_host_configuration.py +0 -0
  254. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_execution_host_contract.py +0 -0
  255. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_execution_loop.py +0 -0
  256. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_existing_release_reconciliation.py +0 -0
  257. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_console_admin_parity_contract.py +0 -0
  258. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_console_configuration_contract.py +0 -0
  259. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_console_hosting_contract.py +0 -0
  260. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_operations_console_roadmap.py +0 -0
  261. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_outer_loop_ci_roadmap.py +0 -0
  262. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_v1_bootstrap_scheduler_contract.py +0 -0
  263. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_v1_implementation_dag.py +0 -0
  264. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_foundation_loader.py +0 -0
  265. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_foundation_models.py +0 -0
  266. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_generation_one_bootstrap_qualification.py +0 -0
  267. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_generation_two_execution.py +0 -0
  268. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_generation_two_mission_intake.py +0 -0
  269. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_governance_authority.py +0 -0
  270. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_governed_coverage.py +0 -0
  271. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_historical_engineering_intent.py +0 -0
  272. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_host_control_completion.py +0 -0
  273. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_inner_loop_ci_contract.py +0 -0
  274. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_installed_dynamic_mission_runtime.py +0 -0
  275. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_integration_coordination.py +0 -0
  276. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_knowledge_consumption.py +0 -0
  277. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_live_project_roadmap_contract.py +0 -0
  278. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_completion_evaluator.py +0 -0
  279. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_controller.py +0 -0
  280. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_dispatcher.py +0 -0
  281. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_planner.py +0 -0
  282. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_recommendation_engine.py +0 -0
  283. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_recommendation_lifecycle.py +0 -0
  284. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_runtime_projection.py +0 -0
  285. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_runtime_scheduler.py +0 -0
  286. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_state_store.py +0 -0
  287. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_status.py +0 -0
  288. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_openai_action_derivation.py +0 -0
  289. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_operational_reset.py +0 -0
  290. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_operations_read_api.py +0 -0
  291. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_operator_identity.py +0 -0
  292. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_phase_completion.py +0 -0
  293. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_platform_contract_documents.py +0 -0
  294. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_portfolio_intelligence_operation.py +0 -0
  295. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_producer_contract.py +0 -0
  296. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_product_version_operations.py +0 -0
  297. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_production_release_workflow.py +0 -0
  298. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_productization_reconciliation.py +0 -0
  299. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_programme_authorization.py +0 -0
  300. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_provider_security.py +0 -0
  301. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_pypi_distribution_readback.py +0 -0
  302. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_recovered_partial_completion.py +0 -0
  303. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_release_operation.py +0 -0
  304. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_repository_truth.py +0 -0
  305. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_role_aware_conversations_contract.py +0 -0
  306. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_bootstrap.py +0 -0
  307. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_database.py +0 -0
  308. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_evidence.py +0 -0
  309. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_health.py +0 -0
  310. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_instance_persistence.py +0 -0
  311. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_prompt_generation.py +0 -0
  312. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_service.py +0 -0
  313. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_status_projection.py +0 -0
  314. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_scheduler_dependency_boundary.py +0 -0
  315. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_schemas.py +0 -0
  316. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_secure_store.py +0 -0
  317. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_solution_templates.py +0 -0
  318. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_substantive_mission_completion.py +0 -0
  319. {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_terminal_continuation_replay.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forge-autonomy
3
- Version: 2.7.30
3
+ Version: 2.7.31
4
4
  Summary: Forge mission planning, producer contracts, and evidence interpretation runtime.
5
5
  Author: Forge maintainers
6
6
  License-Expression: Apache-2.0
@@ -32,7 +32,10 @@ from forge.provider_security import (
32
32
  ProviderAuthenticationMode,
33
33
  )
34
34
  from forge.runtime.database import _timestamp
35
- from .openai_responses import ProviderSubmissionAmbiguous, _mission_gap, _schema_for_approved_contract
35
+ from .openai_responses import (
36
+ ProviderSubmissionAmbiguous, _canonical_required_policy_values, _mission_gap,
37
+ _schema_for_approved_contract,
38
+ )
36
39
  from .provider_adapter import BoundedActionDerivationProvider, ProviderDerivationRequest, ProviderDerivationResponse
37
40
 
38
41
 
@@ -407,7 +410,9 @@ class CodexCliChatGPTSessionPlanningProvider:
407
410
  diagnostic = _replace_diagnostic(run.diagnostic, CodexCliInvocationClassification.COMPLETED_CONTRACT_INVALID)
408
411
  else:
409
412
  try:
410
- proposals, refinement = _parse_response(request, document, self.adapter_version)
413
+ proposals, refinement = _parse_response(
414
+ request, document, self.adapter_version, derivation_policy
415
+ )
411
416
  status = "completed"
412
417
  diagnostic = _replace_diagnostic(run.diagnostic, CodexCliInvocationClassification.COMPLETED_VALID)
413
418
  except (KeyError, TypeError, ValueError, json.JSONDecodeError):
@@ -737,7 +742,7 @@ def _output_schema(scopes: tuple[str, ...], policy: DerivationPolicy,
737
742
 
738
743
 
739
744
  def _parse_response(request: ProviderDerivationRequest, document: object,
740
- adapter_version: str) -> tuple[tuple[DerivedActionProposal, ...] | None, GovernanceRefinementRequired | None]:
745
+ adapter_version: str, derivation_policy: DerivationPolicy) -> tuple[tuple[DerivedActionProposal, ...] | None, GovernanceRefinementRequired | None]:
741
746
  if not isinstance(document, dict) or set(document) != {"result"} or not isinstance(document.get("result"), dict):
742
747
  raise ValueError("structured response is not an object")
743
748
  document = document["result"]
@@ -750,12 +755,12 @@ def _parse_response(request: ProviderDerivationRequest, document: object,
750
755
  items = document.get("proposals")
751
756
  if not isinstance(items, list) or not items:
752
757
  raise ValueError("structured response lacks proposals")
753
- proposals = tuple(_proposal(request, item, adapter_version) for item in items)
758
+ proposals = tuple(_proposal(request, item, adapter_version, derivation_policy) for item in items)
754
759
  return proposals, None
755
760
 
756
761
 
757
762
  def _proposal(request: ProviderDerivationRequest, item: object,
758
- adapter_version: str) -> DerivedActionProposal:
763
+ adapter_version: str, derivation_policy: DerivationPolicy) -> DerivedActionProposal:
759
764
  if not isinstance(item, dict) or set(item) != _PROPOSAL_FIELDS:
760
765
  raise ValueError("proposal contains missing or extra fields")
761
766
  for key in ("logical_action_id", "scope", "objective"):
@@ -772,7 +777,12 @@ def _proposal(request: ProviderDerivationRequest, item: object,
772
777
  item["logical_action_id"], item["scope"], item["objective"], _unique_strings(item["dependencies"]),
773
778
  _unique_strings(item["write_scopes"]), _unique_strings(item["expected_evidence"]),
774
779
  _unique_strings(item["validation_strategy"]), item["priority"], item["postponed"],
775
- _unique_strings(item["human_gates"]), _unique_strings(item["risk_inputs"]),
780
+ _canonical_required_policy_values(
781
+ item["human_gates"], derivation_policy.required_human_gates, field="human_gates"
782
+ ),
783
+ _canonical_required_policy_values(
784
+ item["risk_inputs"], derivation_policy.required_risk_inputs, field="risk_inputs"
785
+ ),
776
786
  ProposalProvenance(request.derivation_id, request.snapshot.id, request.snapshot.digest, adapter_version,
777
787
  request.provider_id, request.model, _unique_strings(item["source_evidence_refs"])),
778
788
  _mission_gap(item["mission_gap"]),
@@ -385,7 +385,14 @@ class OpenAIResponsesPlanningProvider:
385
385
  secret = None
386
386
  self.configuration.policy_service._release_generation_permit(permit)
387
387
  try:
388
- proposals, refinement = self._parse(request, document)
388
+ write_scopes, human_gates, risk_inputs = (
389
+ self.configuration.preflight_authority.approved_derivation_policy_for(
390
+ request.snapshot.mission_id
391
+ )
392
+ )
393
+ proposals, refinement = self._parse(
394
+ request, document, DerivationPolicy(write_scopes, human_gates, risk_inputs)
395
+ )
389
396
  return ProviderDerivationResponse(self._evidence(request, document, ProviderSideEffectState.HAPPENED_AND_CONFIRMED, started, str(document.get("status", "completed"))), proposals=proposals, governance_refinement=refinement)
390
397
  except (KeyError, TypeError, ValueError, json.JSONDecodeError):
391
398
  # A confirmed invalid response is never passed to deterministic validation.
@@ -541,7 +548,8 @@ class OpenAIResponsesPlanningProvider:
541
548
  if input_tokens + output_tokens > policy.context_token_bound:
542
549
  raise ValueError("bounded planning request exceeds canonical G011 context token bound")
543
550
 
544
- def _parse(self, request: ProviderDerivationRequest, document: dict[str, object]) -> tuple[tuple[DerivedActionProposal, ...] | None, GovernanceRefinementRequired | None]:
551
+ def _parse(self, request: ProviderDerivationRequest, document: dict[str, object],
552
+ derivation_policy: DerivationPolicy) -> tuple[tuple[DerivedActionProposal, ...] | None, GovernanceRefinementRequired | None]:
545
553
  if document.get("status") != "completed": raise ValueError("response was not completed")
546
554
  text = _structured_output_text(document)
547
555
  parsed = json.loads(text)
@@ -553,7 +561,10 @@ class OpenAIResponsesPlanningProvider:
553
561
  str(item["logical_action_id"]), str(item["scope"]), str(item["objective"]),
554
562
  tuple(item["dependencies"]), tuple(item["write_scopes"]), tuple(item["expected_evidence"]),
555
563
  tuple(item["validation_strategy"]), int(item["priority"]), bool(item["postponed"]),
556
- tuple(item["human_gates"]), tuple(item["risk_inputs"]),
564
+ _canonical_required_policy_values(item["human_gates"], derivation_policy.required_human_gates,
565
+ field="human_gates"),
566
+ _canonical_required_policy_values(item["risk_inputs"], derivation_policy.required_risk_inputs,
567
+ field="risk_inputs"),
557
568
  ProposalProvenance(request.derivation_id, request.snapshot.id, request.snapshot.digest,
558
569
  self.adapter_version, request.provider_id, request.model,
559
570
  tuple(item["source_evidence_refs"])),
@@ -731,3 +742,20 @@ def _required_enum_array(values: tuple[str, ...]) -> dict[str, object]:
731
742
  raise ValueError("canonical derivation constraint set is invalid")
732
743
  return {"type": "array", "items": {"type": "string", "enum": list(values)},
733
744
  "minItems": len(values), "maxItems": len(values)}
745
+
746
+
747
+ def _canonical_required_policy_values(raw: object, required: tuple[str, ...], *, field: str) -> tuple[str, ...]:
748
+ """Bind required governance annotations to the canonical approved policy.
749
+
750
+ The supported strict schemas can constrain array length and enum members,
751
+ but cannot require every enum member exactly once. A provider can
752
+ therefore repeat one allowed member and omit another while still
753
+ satisfying the transport schema. The provider does not own these
754
+ annotations: after checking the same bounded shape and allow-list, bind
755
+ the proposal to the complete approved set. The downstream validator
756
+ remains the final fail-closed authority check.
757
+ """
758
+ if (not isinstance(raw, list) or len(raw) != len(required)
759
+ or any(not isinstance(value, str) or value not in required for value in raw)):
760
+ raise ValueError(f"proposal {field} does not match the approved policy shape")
761
+ return required
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forge-autonomy
3
- Version: 2.7.30
3
+ Version: 2.7.31
4
4
  Summary: Forge mission planning, producer contracts, and evidence interpretation runtime.
5
5
  Author: Forge maintainers
6
6
  License-Expression: Apache-2.0
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "product": "forge",
3
3
  "schema_version": 1,
4
- "version": "2.7.30"
4
+ "version": "2.7.31"
5
5
  }
@@ -339,6 +339,43 @@ class CodexCliSessionTests(unittest.TestCase):
339
339
  self.assertEqual(response.proposals[0].validation_strategy, ("unit test",))
340
340
  self.assertEqual(response.proposals[0].provenance.source_evidence_refs, ("mission_state",))
341
341
 
342
+ def test_required_governance_arrays_bind_to_complete_approved_policy(self):
343
+ self.configure()
344
+ policy = DerivationPolicy(
345
+ self.policy.allowed_write_scopes,
346
+ ("architecture-review", "security-review"),
347
+ ("provider-ambiguity", "scope-drift"),
348
+ )
349
+ repeated = document()
350
+ proposal = repeated["result"]["proposals"][0]
351
+ proposal["human_gates"] = ["architecture-review", "architecture-review"]
352
+ proposal["risk_inputs"] = ["scope-drift", "scope-drift"]
353
+ response = self.provider(Runner(repeated)).invoke(
354
+ self.request(), approved_scopes=("planner-contract",), derivation_policy=policy,
355
+ )
356
+ self.assertEqual(response.evidence.status, "completed")
357
+ self.assertEqual(
358
+ response.proposals[0].human_gates,
359
+ ("architecture-review", "security-review"),
360
+ )
361
+ self.assertEqual(
362
+ response.proposals[0].risk_inputs,
363
+ ("provider-ambiguity", "scope-drift"),
364
+ )
365
+ ActionDerivationValidator().validate(
366
+ response.proposals or (), self.snapshot, self.input, policy,
367
+ )
368
+
369
+ def test_required_governance_arrays_reject_values_outside_approved_policy(self):
370
+ self.configure()
371
+ outside = document()
372
+ outside["result"]["proposals"][0]["risk_inputs"] = ["invented-risk"]
373
+ response = self.provider(Runner(outside)).invoke(
374
+ self.request(), approved_scopes=("planner-contract",), derivation_policy=self.policy,
375
+ )
376
+ self.assertIsNone(response.proposals)
377
+ self.assertEqual(response.evidence.status, "contract_invalid")
378
+
342
379
  def test_object_root_preserves_governance_refinement_without_permitting_mixed_variants(self):
343
380
  self.configure()
344
381
  refinement = {"result": {"kind": "governance_refinement", "reason": "needs architecture"}}
@@ -210,7 +210,10 @@ class CriterionPlanningContextTests(unittest.TestCase):
210
210
  "triggering_evidence_refs": ["receipt-a"], "planning_snapshot_digest": snapshot.digest,
211
211
  "causal_objective": "Realize K2 from the missing artifact assertion.", "mission_caused_by_action_ids": []},
212
212
  }]}}
213
- proposals, refinement = _parse_response(request, response, "1.0")
213
+ proposals, refinement = _parse_response(
214
+ request, response, "1.0",
215
+ DerivationPolicy(("evidence",), ("protected delivery",), ("scope-drift",)),
216
+ )
214
217
  self.assertIsNone(refinement)
215
218
  class ParsedProvider:
216
219
  def derive(self, actual_snapshot):
@@ -295,7 +295,7 @@ class InstalledForgeUpdateTests(unittest.TestCase):
295
295
  "github_release": {"draft": False},
296
296
  },
297
297
  }, sort_keys=True), encoding="utf-8")
298
- if version in {"2.7.25", "2.7.26", "2.7.27", "2.7.28", "2.7.29", "2.7.30"}:
298
+ if version in {"2.7.25", "2.7.26", "2.7.27", "2.7.28", "2.7.29", "2.7.30", "2.7.31"}:
299
299
  # Captured from the actual installed-composition command used by
300
300
  # both workflow stages; only the synthetic wheel binding changes.
301
301
  summary = json.loads((Path(__file__).parent / "fixtures" /
@@ -1516,6 +1516,29 @@ class InstalledForgeUpdateTests(unittest.TestCase):
1516
1516
  with self.assertRaisesRegex(update.InstalledForgeUpdateError, "noncanonical"):
1517
1517
  update.validate_qualified_artifact(changed)
1518
1518
 
1519
+ def test_2730_to_2731_same_schema_release_preserves_history_and_requires_composition(self):
1520
+ before = self._same_schema39_transition(existing_version="2.7.30", target_version="2.7.31")
1521
+ self.assertEqual(update.transition_schemas(self.request), (39, 39))
1522
+ self.assertEqual(update.validate_qualified_artifact(self.request)["release_route"], "NORMAL")
1523
+ controller = self._controller()
1524
+ self.assertEqual(controller.backup_path.name, "forge-schema39.sqlite3")
1525
+ after = self._qualified_schema39_copy(controller, before)
1526
+ for table, evidence in before["tables"].items():
1527
+ if table != "runtime_metadata":
1528
+ self.assertEqual(after["tables"][table], evidence, table)
1529
+ self.assertEqual(after["protected_metadata_digest"], before["protected_metadata_digest"])
1530
+ self.assertEqual(after["schema_digest"], before["schema_digest"])
1531
+ update.verify_preservation(before, after, self.request)
1532
+ receipt = Path(self.request.qualification_receipt)
1533
+ document = json.loads(receipt.read_text())
1534
+ del document["qualification"]["criterion_completion"]
1535
+ receipt.write_text(json.dumps(document, sort_keys=True))
1536
+ changed = update.UpdateRequest(**{
1537
+ **self.request.__dict__, "qualification_receipt_sha256": update.file_digest(receipt),
1538
+ })
1539
+ with self.assertRaisesRegex(update.InstalledForgeUpdateError, "noncanonical"):
1540
+ update.validate_qualified_artifact(changed)
1541
+
1519
1542
  def test_schema39_same_schema_replay_preserves_database_and_fences_after_activation_boundary(self):
1520
1543
  before = self._same_schema39_transition()
1521
1544
  controller = self._controller()
@@ -1581,10 +1604,10 @@ class InstalledForgeUpdateTests(unittest.TestCase):
1581
1604
  receipt = Path(receipt_value).resolve()
1582
1605
  release = json.loads(receipt.read_text(encoding="utf-8"))
1583
1606
  target_version = release["version"]
1584
- target_schema = 39 if target_version in {"2.7.25", "2.7.26", "2.7.27", "2.7.28", "2.7.29", "2.7.30"} else 38
1607
+ target_schema = 39 if target_version in {"2.7.25", "2.7.26", "2.7.27", "2.7.28", "2.7.29", "2.7.30", "2.7.31"} else 38
1585
1608
  previous_version = {
1586
1609
  "2.7.26": "2.7.25", "2.7.27": "2.7.26", "2.7.28": "2.7.27",
1587
- "2.7.29": "2.7.28", "2.7.30": "2.7.29",
1610
+ "2.7.29": "2.7.28", "2.7.30": "2.7.29", "2.7.31": "2.7.30",
1588
1611
  }.get(target_version)
1589
1612
  if previous_version is not None:
1590
1613
  RuntimeBootstrap(data_root=self.data_root, forge_version=previous_version).open().close()