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.
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/PKG-INFO +1 -1
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/codex_cli_session.py +16 -6
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/openai_responses.py +31 -3
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge_autonomy.egg-info/PKG-INFO +1 -1
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/product-version.json +1 -1
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_codex_cli_session.py +37 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_criterion_planning_context.py +4 -1
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_installed_forge_update.py +26 -3
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/MANIFEST.in +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/README.md +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/__main__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/_version.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/action_derivation_canary_closure.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/action_derivation_evidence.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/action_derivation_qualification.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/action_derivation_reattempt.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/ai_architect/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/ai_architect/provider_registry.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/api/operations-read-openapi-v1.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/api/operations-read-postman-v1.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/architecture/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/architecture/advisor.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/architecture/presentation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/architecture/workspace.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/autonomous_orchestrator.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/business/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/business/advisor.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/business/ingress.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/business/presentation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/business/workspace.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/canary.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/capabilities/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/capabilities/delegation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/completion/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/completion/assessor.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/completion/host_control_observer.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/completion/mission.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/completion/repository_observer.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/constitutional/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/constitutional/assessor.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/core/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/core/json_store.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/decision_evidence/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/decision_evidence/repository.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/dispatcher/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/dispatcher/dispatcher.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/execution/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/execution/loop.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/execution/presentation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/execution_host_configuration.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/foundation/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/foundation/loader.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/generation_two.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/generation_two_execution.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/governance/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/governance/execution_policy.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/governance/profiles.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/governance_authority.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/intake.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/integration/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/integration/coordinator.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/integration/repository.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/knowledge/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/knowledge/consumer.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/knowledge/registry.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/lifecycle/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/lifecycle/store.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/mission_amendment.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/mission_cli.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/mission_scheduler.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/action.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/action_derivation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/agent_policy.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/ai_architect_provider.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/ai_architect_session.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/ai_provider_registry.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/architecture_mission.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/architecture_reasoning.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/architecture_review.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/codex_runtime_prompt.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/constitutional_validation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/criterion_assessment.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/criterion_observation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/decision_evidence.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/execution_host.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/foundation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/historical_intent.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/integration.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/intent.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/intent_authoring.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/mission.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/mission_candidate.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/mission_completion.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/mission_planner.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/mission_recommendation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/phase_completion.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/planning.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/producer.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/prompt_artifact.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/proposal.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/runtime_prompt.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/models/solution_template.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/operations_read_api.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/operator_identity.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/action_derivation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/durable_derivation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/engine.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planner/provider_adapter.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planning/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planning/loader.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/planning/registry.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/portfolio_intelligence.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/programme_authorization.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/prompts/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/prompts/codex_cli.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/prompts/generator.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/proposals/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/proposals/generator.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/provider_security.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/qualification/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/qualification/bootstrap_sequence.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/qualification/criterion_completion.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/qualification/generation_one.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/qualification/installed_smoke.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/recommendations/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/recommendations/engine.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/repository_truth.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/review/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/review/engine.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/bootstrap.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/data_root.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/database.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/dynamic_mission.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/evidence.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/execution_context.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/health.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/mission_controller.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/operational_reset.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/runner.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/runtime/service.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/scheduler/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/scheduler/adapter.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/scheduler/ep_http_adapter.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/scheduler/ep_v12.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/scheduler/scheduler.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/capability-registry-1.0.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/capability.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/common.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/decision-evidence-1.0.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-goal-0.5.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-increment-proposal-0.5.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-mode.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-plan-0.5.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-platform-peer-configuration-1.0.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-platform-peer-configuration-1.1.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-prompt-artifact-0.7.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/engineering-proposal-0.6.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/evidence-reference-0.5.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/foundation-document.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/governance-profile.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/knowledge-source-0.4.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/knowledge-source.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/mission-candidate-1.0.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/mission-candidate-1.1.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/phase-completion-1.0.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/planning-document-0.5.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/repository-catalog.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/repository.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/solution-template-1.0.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/schemas/workspace.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/secure_store.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/solutions/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/solutions/catalogue.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/solutions/generator.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/state/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/state/mission_state.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge/workspace/__init__.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge_autonomy.egg-info/SOURCES.txt +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge_autonomy.egg-info/dependency_links.txt +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge_autonomy.egg-info/entry_points.txt +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/forge_autonomy.egg-info/top_level.txt +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/pyproject.toml +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/capability-registry-1.0.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/capability.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/common.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/decision-evidence-1.0.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/engineering-goal-0.5.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/engineering-increment-proposal-0.5.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/engineering-mode.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/engineering-plan-0.5.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/engineering-prompt-artifact-0.7.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/engineering-proposal-0.6.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/evidence-reference-0.5.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/foundation-document.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/governance-profile.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/knowledge-source-0.4.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/knowledge-source.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/mission-candidate-1.0.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/mission-candidate-1.1.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/phase-completion-1.0.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/planning-document-0.5.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/repository-catalog.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/repository.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/solution-template-1.0.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/schemas/workspace.schema.json +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/setup.cfg +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_action_derivation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_action_derivation_canary_closure.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_action_derivation_evidence.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_action_derivation_qualification.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_adaptive_action_sizing_design.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_agent_policy.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_aggregate_health_roadmap.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_ai_architect_provider.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_ai_architect_session.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_ai_development_projection.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_ai_provider_registry.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_architecture_reasoning.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_architecture_review_engine.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_architecture_workspace.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_autonomous_orchestrator.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_bootstrap_adapter.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_bootstrap_mission_canary.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_bootstrap_mission_runner.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_bootstrap_mission_scheduler.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_bootstrap_sequence_qualification.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_business_governance_ingress.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_business_workspace.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_canonical_data_root.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_capability_delegation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_codex_cli_runtime_prompt.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_constitutional_validation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_criterion_assessment_contract.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_criterion_ep_http_boundary.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_decision_evidence.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_default_project_quality_policy.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_distribution_identity.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_durable_action_derivation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_dynamic_mission_capability.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_action_architecture.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_intent_authoring.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_intent_lifecycle.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_mission.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_planning.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_prompt_artifacts.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_engineering_proposals.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_ep_http_adapter.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_execution_context.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_execution_host_configuration.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_execution_host_contract.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_execution_loop.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_existing_release_reconciliation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_console_admin_parity_contract.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_console_configuration_contract.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_console_hosting_contract.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_operations_console_roadmap.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_outer_loop_ci_roadmap.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_v1_bootstrap_scheduler_contract.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_forge_v1_implementation_dag.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_foundation_loader.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_foundation_models.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_generation_one_bootstrap_qualification.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_generation_two_execution.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_generation_two_mission_intake.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_governance_authority.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_governed_coverage.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_historical_engineering_intent.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_host_control_completion.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_inner_loop_ci_contract.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_installed_dynamic_mission_runtime.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_integration_coordination.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_knowledge_consumption.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_live_project_roadmap_contract.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_completion_evaluator.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_controller.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_dispatcher.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_planner.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_recommendation_engine.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_recommendation_lifecycle.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_runtime_projection.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_runtime_scheduler.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_state_store.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_mission_status.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_openai_action_derivation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_operational_reset.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_operations_read_api.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_operator_identity.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_phase_completion.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_platform_contract_documents.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_portfolio_intelligence_operation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_producer_contract.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_product_version_operations.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_production_release_workflow.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_productization_reconciliation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_programme_authorization.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_provider_security.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_pypi_distribution_readback.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_recovered_partial_completion.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_release_operation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_repository_truth.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_role_aware_conversations_contract.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_bootstrap.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_database.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_evidence.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_health.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_instance_persistence.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_prompt_generation.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_service.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_runtime_status_projection.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_scheduler_dependency_boundary.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_schemas.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_secure_store.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_solution_templates.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_substantive_mission_completion.py +0 -0
- {forge_autonomy-2.7.30 → forge_autonomy-2.7.31}/tests/test_terminal_continuation_replay.py +0 -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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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]
|
|
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
|
-
|
|
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
|
|
@@ -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(
|
|
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()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|