engineering-platform 2.3.71__tar.gz → 2.3.73__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 (163) hide show
  1. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/PKG-INFO +1 -1
  2. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/pyproject.toml +1 -1
  3. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json +1 -1
  4. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json +4 -4
  5. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_repository.py +9 -0
  6. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/parity_lifecycle_dispatcher.py +72 -9
  7. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/platform_version.py +1 -1
  8. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/storage.py +22 -0
  9. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/templates/workspace-config.json +1 -1
  10. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform.egg-info/PKG-INFO +1 -1
  11. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/README.md +0 -0
  12. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/setup.cfg +0 -0
  13. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/__init__.py +0 -0
  14. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/__main__.py +0 -0
  15. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/agent_state.py +0 -0
  16. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/agent_trust.py +0 -0
  17. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/assets/dashboard.css +0 -0
  18. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/assets/dashboard.js +0 -0
  19. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/assets/dashboard_locales.mjs +0 -0
  20. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/assets/dashboard_status_store.mjs +0 -0
  21. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/assets/dashboard_translation.mjs +0 -0
  22. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/assets/operations-console/apple-touch-icon-dark.png +0 -0
  23. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/assets/operations-console/apple-touch-icon-light.png +0 -0
  24. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/assets/operations-console/icon-dark.png +0 -0
  25. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/assets/operations-console/icon-light.png +0 -0
  26. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/assets/operations-console/icon-transparent.png +0 -0
  27. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/assets/operations-console/manifest.webmanifest +0 -0
  28. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/capability_preflight.py +0 -0
  29. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/capability_review.py +0 -0
  30. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/central_data_transfer.py +0 -0
  31. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/central_database.py +0 -0
  32. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/central_store_migration.py +0 -0
  33. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/codex_capacity.py +0 -0
  34. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/codex_chat.py +0 -0
  35. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/codex_observability.py +0 -0
  36. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/component_lock.py +0 -0
  37. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/component_logging.py +0 -0
  38. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/console_presentation.py +0 -0
  39. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/console_route_ownership.py +0 -0
  40. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/contracts/__init__.py +0 -0
  41. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/contracts/ep_consumer.py +0 -0
  42. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/contracts/models.py +0 -0
  43. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/contracts/projection.py +0 -0
  44. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/dashboard_browser_validation.py +0 -0
  45. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/dashboard_state.py +0 -0
  46. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/dashboard_supervisor.swift +0 -0
  47. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/dashboard_translation.py +0 -0
  48. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/dependabot_producer.py +0 -0
  49. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/development_profile.py +0 -0
  50. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/drift_diagnostics.py +0 -0
  51. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/emergency_recovery.py +0 -0
  52. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/engineering_memory.py +0 -0
  53. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/ep_consumer_credentials.py +0 -0
  54. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/evidence_projection.py +0 -0
  55. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_activity.py +0 -0
  56. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_context.py +0 -0
  57. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_errors.py +0 -0
  58. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_evidence.py +0 -0
  59. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_executor.py +0 -0
  60. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_finalization.py +0 -0
  61. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_host.py +0 -0
  62. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_host_evidence.py +0 -0
  63. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_lease.py +0 -0
  64. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_lifecycle.py +0 -0
  65. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_models.py +0 -0
  66. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_readiness.py +0 -0
  67. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_reporting.py +0 -0
  68. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_timeout_policy.py +0 -0
  69. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_timing.py +0 -0
  70. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/execution_transaction.py +0 -0
  71. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/external_producer_binding.py +0 -0
  72. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/file_inbox.py +0 -0
  73. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/forensic_attribution.py +0 -0
  74. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/forensic_attribution_v2.py +0 -0
  75. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/forensic_delta.py +0 -0
  76. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/golden_scenario.py +0 -0
  77. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/historical_dashboard_configuration.py +0 -0
  78. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/host_admin.py +0 -0
  79. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/host_preflight.py +0 -0
  80. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/installation_relocation.py +0 -0
  81. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/installation_update_activation.py +0 -0
  82. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/installation_update_admission.py +0 -0
  83. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/installation_update_backup.py +0 -0
  84. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/installation_update_composition.py +0 -0
  85. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/installation_update_executor.py +0 -0
  86. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/installation_update_migration.py +0 -0
  87. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/installation_update_operation.py +0 -0
  88. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/installation_update_plan.py +0 -0
  89. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/installation_update_preparation.py +0 -0
  90. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/investigation_ledger.py +0 -0
  91. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/legacy_inbox_migration.py +0 -0
  92. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/legacy_installation_adoption.py +0 -0
  93. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/lifecycle_worker.py +0 -0
  94. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/live_status.py +0 -0
  95. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/local_api.py +0 -0
  96. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/local_api_keychain.py +0 -0
  97. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/local_repository_binding.py +0 -0
  98. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/managed_autonomy.py +0 -0
  99. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/managed_codex_runtime.py +0 -0
  100. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/operational_installation.py +0 -0
  101. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/operational_installation_lock.py +0 -0
  102. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/operational_installation_record.py +0 -0
  103. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/owner_credential_recovery.py +0 -0
  104. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/parity_context.py +0 -0
  105. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/platform_admin.py +0 -0
  106. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/platform_api.py +0 -0
  107. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/platform_bootstrap.py +0 -0
  108. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/platform_components.py +0 -0
  109. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/pr_check_repair.py +0 -0
  110. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/pr_evidence_backfill.py +0 -0
  111. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/producer.py +0 -0
  112. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/product_installation_readback.py +0 -0
  113. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/project_agent.py +0 -0
  114. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/project_agent_service.py +0 -0
  115. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/project_topology.py +0 -0
  116. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/prompt_history.py +0 -0
  117. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/provider_context.py +0 -0
  118. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/provider_context_benchmark.py +0 -0
  119. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/provider_context_scope.py +0 -0
  120. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/provider_interruption.py +0 -0
  121. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/provider_process_identity.py +0 -0
  122. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/provider_readiness.py +0 -0
  123. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/provider_recovery.py +0 -0
  124. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/provider_usage.py +0 -0
  125. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/providers.py +0 -0
  126. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/qualification.py +0 -0
  127. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/qualification_runtime.py +0 -0
  128. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/recommendation_handoff.py +0 -0
  129. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/reconciliation_adoption.py +0 -0
  130. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/release_operation.py +0 -0
  131. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/report_analysis.py +0 -0
  132. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/repository_attachment.py +0 -0
  133. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/repository_handoff.py +0 -0
  134. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/resources.py +0 -0
  135. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/reviewer_evidence.py +0 -0
  136. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/revision_binding.py +0 -0
  137. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/schemas/producer-readback-v1.2.schema.json +0 -0
  138. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/schemas/producer-readback-v1.schema.json +0 -0
  139. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/schemas/repository-attachment.schema.json +0 -0
  140. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/server.py +0 -0
  141. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/server_console_services.py +0 -0
  142. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/server_relay.py +0 -0
  143. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/server_service.py +0 -0
  144. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/status_model.py +0 -0
  145. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/status_reconciliation.py +0 -0
  146. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/submission_cli.py +0 -0
  147. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/submission_intake.py +0 -0
  148. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/submission_service.py +0 -0
  149. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/system_installation_topology.py +0 -0
  150. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/system_server_service.py +0 -0
  151. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/telemetry.py +0 -0
  152. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/validation_identity.py +0 -0
  153. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/validation_profile.py +0 -0
  154. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/version_preparation_delivery.py +0 -0
  155. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/workspace_preflight.py +0 -0
  156. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/worktree_provenance.py +0 -0
  157. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform/worktree_tooling.py +0 -0
  158. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform.egg-info/SOURCES.txt +0 -0
  159. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform.egg-info/dependency_links.txt +0 -0
  160. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform.egg-info/entry_points.txt +0 -0
  161. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/src/engineering_platform.egg-info/top_level.txt +0 -0
  162. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/tests/test_adaptive_action_sizing_design.py +0 -0
  163. {engineering_platform-2.3.71 → engineering_platform-2.3.73}/tests/test_role_task_model_policy_design.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: engineering-platform
3
- Version: 2.3.71
3
+ Version: 2.3.73
4
4
  Summary: Local-first Engineering Platform execution operations runtime
5
5
  Author: Peter van Tol
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "engineering-platform"
7
- version = "2.3.71"
7
+ version = "2.3.73"
8
8
  description = "Local-first Engineering Platform execution operations runtime"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.14,<3.15"
@@ -3,7 +3,7 @@
3
3
  "platform": {
4
4
  "id": "engineering-platform",
5
5
  "name": "Engineering Platform",
6
- "version": "2.3.71",
6
+ "version": "2.3.73",
7
7
  "generation": 2,
8
8
  "documentation_namespace": "engineering-platform",
9
9
  "capability_registry_version": 1
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "bootstrap_contract": "2026.12",
3
3
  "checkpoint_format": 1,
4
- "dashboard_version": "2.3.71",
4
+ "dashboard_version": "2.3.73",
5
5
  "handoff_protocol": 1,
6
6
  "memory_format": 2,
7
7
  "minimum_codex_cli": "0.146.0",
8
8
  "inbox_protocol": 1,
9
- "platform_version": "2.3.71",
9
+ "platform_version": "2.3.73",
10
10
  "report_format": 2,
11
- "runner_version": "2.3.71",
11
+ "runner_version": "2.3.73",
12
12
  "status_model": 1,
13
13
  "storage_schema": 45,
14
- "watcher_version": "2.3.71"
14
+ "watcher_version": "2.3.73"
15
15
  }
@@ -33,6 +33,7 @@ def github_repository_slug(remote: str) -> str:
33
33
  class RepositoryClient(Protocol):
34
34
  def inspect(self, root: Path) -> RepositoryEvidence: ...
35
35
  def main_contains(self, root: Path, sha: str) -> bool: ...
36
+ def protected_main_revision(self, root: Path) -> str: ...
36
37
  def refresh_main_reference(self, root: Path) -> None: ...
37
38
  def remote_main_contains(self, root: Path, sha: str) -> bool: ...
38
39
  def synchronize_main(self, root: Path) -> None: ...
@@ -77,6 +78,14 @@ class SubprocessRepositoryClient:
77
78
  """Refresh remote main evidence without changing the shared checkout."""
78
79
  self._synchronize_command(root, "git", "fetch", "origin", "main")
79
80
 
81
+ def protected_main_revision(self, root: Path) -> str:
82
+ """Return the freshly observed protected-main revision without checkout mutation."""
83
+ self.refresh_main_reference(root)
84
+ revision = self._run(root, "git", "rev-parse", "--verify", "origin/main")
85
+ if re.fullmatch(r"[0-9a-f]{40}", revision) is None:
86
+ raise RunnerError("protected main revision is unavailable")
87
+ return revision
88
+
80
89
  def remote_main_contains(self, root: Path, sha: str) -> bool:
81
90
  return self.provider.execute(root, "git", "merge-base", "--is-ancestor", sha, "origin/main").returncode == 0
82
91
 
@@ -47,6 +47,7 @@ from .storage import (
47
47
  )
48
48
  from .prompt_history import prompt_history, record_terminal_report
49
49
  from .report_analysis import analyze as analyze_terminal_report
50
+ from .revision_binding import CONSTRAINT_KEY, parse_repository_revision_binding
50
51
 
51
52
 
52
53
  TERMINAL_STATES = frozenset({"COMPLETE", "BLOCKED", "FAILED"})
@@ -83,9 +84,76 @@ def dismiss_operator_gate(data_root: Path, *, project_id: str, run_id: str) -> d
83
84
  return {"run_id": run_id, "handling_state": OPERATOR_RESOLUTION_DISMISSED}
84
85
 
85
86
 
86
- def retry_operator_gate(data_root: Path, *, project_id: str, run_id: str) -> submission_service.SubmissionResult:
87
+ def _retry_constraints_for_current_main(
88
+ constraints: dict[str, object], *, repository_root: Path | None,
89
+ repository: SubprocessRepositoryClient,
90
+ ) -> dict[str, object]:
91
+ """Bind one explicit retry to freshly observed protected main.
92
+
93
+ The producer's requested revision remains immutable history. The retry
94
+ gets one exact allowed baseline so the Execution Host can synchronize to
95
+ and re-verify the current repository state promised by the operator UI.
96
+ """
97
+ try:
98
+ binding = parse_repository_revision_binding(constraints)
99
+ except ValueError as error:
100
+ raise ParityLifecycleDispatchError("RETRY_CONSTRAINTS_INVALID") from error
101
+ if binding is None:
102
+ return constraints
103
+ if repository_root is None:
104
+ raise ParityLifecycleDispatchError("RETRY_BASELINE_UNAVAILABLE")
105
+ try:
106
+ evidence = repository.inspect(repository_root)
107
+ if not evidence.clean or evidence.branch != "main" or not evidence.main_contains_head:
108
+ raise ParityLifecycleDispatchError("RETRY_BASELINE_NOT_CLEAN_MAIN")
109
+ current_main = repository.protected_main_revision(repository_root)
110
+ if not repository.remote_main_contains(repository_root, binding.requested_revision):
111
+ raise ParityLifecycleDispatchError("RETRY_REQUESTED_REVISION_NOT_ON_MAIN")
112
+ except RunnerError as error:
113
+ raise ParityLifecycleDispatchError("RETRY_BASELINE_UNAVAILABLE") from error
114
+ rebound = json.loads(json.dumps(constraints))
115
+ rebound[CONSTRAINT_KEY] = {
116
+ "requested_revision": binding.requested_revision,
117
+ "allowed_baseline_revision": current_main,
118
+ }
119
+ return rebound
120
+
121
+
122
+ def retry_operator_gate(
123
+ data_root: Path, *, project_id: str, run_id: str,
124
+ repository: SubprocessRepositoryClient | None = None,
125
+ ) -> submission_service.SubmissionResult:
87
126
  """Create the only FIFO-successor allowed to resolve a failed run."""
88
- with sqlite_connection(central_database.path(data_root)) as connection:
127
+ repository = repository or SubprocessRepositoryClient()
128
+ database = central_database.path(data_root)
129
+ with sqlite_connection(database) as connection:
130
+ source = connection.execute(
131
+ """SELECT d.repository_id,s.producer_id,s.producer_type,s.producer_version,
132
+ s.prompt,s.transport,s.correlation_id,s.mission_id,s.engineering_action_id,s.constraints
133
+ FROM ep_parity_lifecycle_dispatches AS d
134
+ JOIN ep_submissions AS s ON s.submission_id=d.submission_id
135
+ WHERE d.project_id=? AND d.run_id=? AND d.state IN ('BLOCKED','FAILED')
136
+ AND d.operator_resolution=?""",
137
+ (project_id, run_id, OPERATOR_RESOLUTION_OPEN),
138
+ ).fetchone()
139
+ if source is None:
140
+ raise ParityLifecycleDispatchError("PROJECT_RUN_NOT_AWAITING_OPERATOR")
141
+ context = project_context(
142
+ connection, data_root=data_root, project_id=project_id,
143
+ repository_id=str(source[0]),
144
+ )
145
+ try:
146
+ constraints = json.loads(str(source[9]))
147
+ except (TypeError, ValueError, json.JSONDecodeError):
148
+ raise ParityLifecycleDispatchError("RETRY_CONSTRAINTS_INVALID") from None
149
+ if not isinstance(constraints, dict):
150
+ raise ParityLifecycleDispatchError("RETRY_CONSTRAINTS_INVALID")
151
+ constraints = _retry_constraints_for_current_main(
152
+ constraints,
153
+ repository_root=context.local_repository_root,
154
+ repository=repository,
155
+ )
156
+ with sqlite_connection(database) as connection:
89
157
  connection.execute("BEGIN IMMEDIATE")
90
158
  row = connection.execute(
91
159
  """SELECT d.repository_id,s.producer_id,s.producer_type,s.producer_version,
@@ -99,14 +167,9 @@ def retry_operator_gate(data_root: Path, *, project_id: str, run_id: str) -> sub
99
167
  if row is None:
100
168
  connection.execute("ROLLBACK")
101
169
  raise ParityLifecycleDispatchError("PROJECT_RUN_NOT_AWAITING_OPERATOR")
102
- try:
103
- constraints = json.loads(str(row[9]))
104
- except (TypeError, ValueError, json.JSONDecodeError):
105
- connection.execute("ROLLBACK")
106
- raise ParityLifecycleDispatchError("RETRY_CONSTRAINTS_INVALID") from None
107
- if not isinstance(constraints, dict):
170
+ if tuple(row) != tuple(source):
108
171
  connection.execute("ROLLBACK")
109
- raise ParityLifecycleDispatchError("RETRY_CONSTRAINTS_INVALID")
172
+ raise ParityLifecycleDispatchError("PROJECT_RETRY_SOURCE_CHANGED")
110
173
  request = submission_service.SubmissionRequest(
111
174
  project_id=project_id, repository_id=str(row[0]), producer_id=str(row[1]),
112
175
  producer_type=str(row[2]), producer_version=str(row[3]) if row[3] is not None else None,
@@ -12,7 +12,7 @@ from .storage import ENGINEERING_STORAGE_SCHEMA_VERSION
12
12
 
13
13
  SEMVER = re.compile(r"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$")
14
14
  CONTRACT = re.compile(r"^(\d{4})\.(0[1-9]|1[0-2])$")
15
- CURRENT_PLATFORM_VERSION = "2.3.71"
15
+ CURRENT_PLATFORM_VERSION = "2.3.73"
16
16
  MANIFEST_FIELDS = frozenset(
17
17
  {
18
18
  "platform_version",
@@ -1969,6 +1969,7 @@ def load_forge_governance_handoff_snapshot(root: Path, run_id: str) -> dict[str,
1969
1969
  def load_submission_for_run(root: Path, run_id: str, *, central_database: Path | None = None) -> dict[str, object] | None:
1970
1970
  """Load immutable Producer provenance for one linked execution without prompt inspection."""
1971
1971
  connection = _evidence_connection(root, central_database)
1972
+ attempt_constraints_payload: object | None = None
1972
1973
  try:
1973
1974
  row = connection.execute(
1974
1975
  "SELECT submission.submission_id,submission.producer_id,submission.producer_type,"
@@ -1978,6 +1979,20 @@ def load_submission_for_run(root: Path, run_id: str, *, central_database: Path |
1978
1979
  "FROM execution_submissions AS submission JOIN execution_submission_run_links AS link "
1979
1980
  "ON link.submission_id=submission.submission_id WHERE link.run_id=?", (run_id,)
1980
1981
  ).fetchone()
1982
+ if row is not None and central_database is not None:
1983
+ # A correlated retry deliberately retains the canonical producer
1984
+ # submission while its execution attempt has its own immutable
1985
+ # CENTRAL request. Revision transitions are attempt-scoped, so
1986
+ # the Execution Host must consume the accepted attempt constraints
1987
+ # rather than silently falling back to the root submission's pin.
1988
+ attempt = connection.execute(
1989
+ "SELECT accepted.constraints FROM execution_submission_attempt_links AS link "
1990
+ "JOIN ep_submissions AS accepted ON accepted.submission_id=link.submission_id "
1991
+ "WHERE link.run_id=?",
1992
+ (run_id,),
1993
+ ).fetchone()
1994
+ if attempt is not None:
1995
+ attempt_constraints_payload = attempt[0]
1981
1996
  finally:
1982
1997
  connection.close()
1983
1998
  if not row:
@@ -1999,6 +2014,13 @@ def load_submission_for_run(root: Path, run_id: str, *, central_database: Path |
1999
2014
  constraints = prompt_metadata.get("constraints")
2000
2015
  if constraints is not None and not isinstance(constraints, dict):
2001
2016
  raise EngineeringStorageError("Persisted submission constraints are invalid.")
2017
+ if attempt_constraints_payload is not None:
2018
+ try:
2019
+ constraints = json.loads(str(attempt_constraints_payload))
2020
+ except (TypeError, json.JSONDecodeError) as error:
2021
+ raise EngineeringStorageError("Persisted submission attempt constraints are corrupt.") from error
2022
+ if not isinstance(constraints, dict):
2023
+ raise EngineeringStorageError("Persisted submission attempt constraints are invalid.")
2002
2024
  handoff = None
2003
2025
  if row[12] is not None:
2004
2026
  try:
@@ -3,7 +3,7 @@
3
3
  "platform": {
4
4
  "id": "engineering-platform",
5
5
  "name": "Engineering Platform",
6
- "version": "2.3.71",
6
+ "version": "2.3.73",
7
7
  "generation": 2,
8
8
  "documentation_namespace": "engineering-platform",
9
9
  "capability_registry_version": 1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: engineering-platform
3
- Version: 2.3.71
3
+ Version: 2.3.73
4
4
  Summary: Local-first Engineering Platform execution operations runtime
5
5
  Author: Peter van Tol
6
6
  License: MIT