engineering-platform 2.3.71__tar.gz → 2.3.72__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.72}/PKG-INFO +1 -1
  2. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/pyproject.toml +1 -1
  3. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json +1 -1
  4. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json +4 -4
  5. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_repository.py +9 -0
  6. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/parity_lifecycle_dispatcher.py +72 -9
  7. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/platform_version.py +1 -1
  8. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/templates/workspace-config.json +1 -1
  9. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform.egg-info/PKG-INFO +1 -1
  10. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/README.md +0 -0
  11. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/setup.cfg +0 -0
  12. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/__init__.py +0 -0
  13. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/__main__.py +0 -0
  14. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/agent_state.py +0 -0
  15. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/agent_trust.py +0 -0
  16. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/assets/dashboard.css +0 -0
  17. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/assets/dashboard.js +0 -0
  18. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/assets/dashboard_locales.mjs +0 -0
  19. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/assets/dashboard_status_store.mjs +0 -0
  20. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/assets/dashboard_translation.mjs +0 -0
  21. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/assets/operations-console/apple-touch-icon-dark.png +0 -0
  22. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/assets/operations-console/apple-touch-icon-light.png +0 -0
  23. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/assets/operations-console/icon-dark.png +0 -0
  24. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/assets/operations-console/icon-light.png +0 -0
  25. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/assets/operations-console/icon-transparent.png +0 -0
  26. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/assets/operations-console/manifest.webmanifest +0 -0
  27. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/capability_preflight.py +0 -0
  28. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/capability_review.py +0 -0
  29. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/central_data_transfer.py +0 -0
  30. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/central_database.py +0 -0
  31. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/central_store_migration.py +0 -0
  32. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/codex_capacity.py +0 -0
  33. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/codex_chat.py +0 -0
  34. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/codex_observability.py +0 -0
  35. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/component_lock.py +0 -0
  36. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/component_logging.py +0 -0
  37. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/console_presentation.py +0 -0
  38. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/console_route_ownership.py +0 -0
  39. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/contracts/__init__.py +0 -0
  40. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/contracts/ep_consumer.py +0 -0
  41. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/contracts/models.py +0 -0
  42. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/contracts/projection.py +0 -0
  43. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/dashboard_browser_validation.py +0 -0
  44. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/dashboard_state.py +0 -0
  45. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/dashboard_supervisor.swift +0 -0
  46. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/dashboard_translation.py +0 -0
  47. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/dependabot_producer.py +0 -0
  48. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/development_profile.py +0 -0
  49. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/drift_diagnostics.py +0 -0
  50. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/emergency_recovery.py +0 -0
  51. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/engineering_memory.py +0 -0
  52. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/ep_consumer_credentials.py +0 -0
  53. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/evidence_projection.py +0 -0
  54. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_activity.py +0 -0
  55. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_context.py +0 -0
  56. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_errors.py +0 -0
  57. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_evidence.py +0 -0
  58. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_executor.py +0 -0
  59. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_finalization.py +0 -0
  60. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_host.py +0 -0
  61. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_host_evidence.py +0 -0
  62. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_lease.py +0 -0
  63. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_lifecycle.py +0 -0
  64. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_models.py +0 -0
  65. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_readiness.py +0 -0
  66. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_reporting.py +0 -0
  67. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_timeout_policy.py +0 -0
  68. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_timing.py +0 -0
  69. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/execution_transaction.py +0 -0
  70. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/external_producer_binding.py +0 -0
  71. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/file_inbox.py +0 -0
  72. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/forensic_attribution.py +0 -0
  73. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/forensic_attribution_v2.py +0 -0
  74. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/forensic_delta.py +0 -0
  75. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/golden_scenario.py +0 -0
  76. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/historical_dashboard_configuration.py +0 -0
  77. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/host_admin.py +0 -0
  78. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/host_preflight.py +0 -0
  79. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/installation_relocation.py +0 -0
  80. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/installation_update_activation.py +0 -0
  81. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/installation_update_admission.py +0 -0
  82. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/installation_update_backup.py +0 -0
  83. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/installation_update_composition.py +0 -0
  84. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/installation_update_executor.py +0 -0
  85. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/installation_update_migration.py +0 -0
  86. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/installation_update_operation.py +0 -0
  87. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/installation_update_plan.py +0 -0
  88. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/installation_update_preparation.py +0 -0
  89. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/investigation_ledger.py +0 -0
  90. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/legacy_inbox_migration.py +0 -0
  91. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/legacy_installation_adoption.py +0 -0
  92. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/lifecycle_worker.py +0 -0
  93. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/live_status.py +0 -0
  94. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/local_api.py +0 -0
  95. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/local_api_keychain.py +0 -0
  96. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/local_repository_binding.py +0 -0
  97. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/managed_autonomy.py +0 -0
  98. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/managed_codex_runtime.py +0 -0
  99. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/operational_installation.py +0 -0
  100. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/operational_installation_lock.py +0 -0
  101. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/operational_installation_record.py +0 -0
  102. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/owner_credential_recovery.py +0 -0
  103. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/parity_context.py +0 -0
  104. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/platform_admin.py +0 -0
  105. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/platform_api.py +0 -0
  106. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/platform_bootstrap.py +0 -0
  107. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/platform_components.py +0 -0
  108. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/pr_check_repair.py +0 -0
  109. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/pr_evidence_backfill.py +0 -0
  110. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/producer.py +0 -0
  111. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/product_installation_readback.py +0 -0
  112. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/project_agent.py +0 -0
  113. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/project_agent_service.py +0 -0
  114. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/project_topology.py +0 -0
  115. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/prompt_history.py +0 -0
  116. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/provider_context.py +0 -0
  117. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/provider_context_benchmark.py +0 -0
  118. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/provider_context_scope.py +0 -0
  119. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/provider_interruption.py +0 -0
  120. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/provider_process_identity.py +0 -0
  121. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/provider_readiness.py +0 -0
  122. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/provider_recovery.py +0 -0
  123. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/provider_usage.py +0 -0
  124. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/providers.py +0 -0
  125. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/qualification.py +0 -0
  126. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/qualification_runtime.py +0 -0
  127. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/recommendation_handoff.py +0 -0
  128. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/reconciliation_adoption.py +0 -0
  129. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/release_operation.py +0 -0
  130. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/report_analysis.py +0 -0
  131. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/repository_attachment.py +0 -0
  132. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/repository_handoff.py +0 -0
  133. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/resources.py +0 -0
  134. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/reviewer_evidence.py +0 -0
  135. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/revision_binding.py +0 -0
  136. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/schemas/producer-readback-v1.2.schema.json +0 -0
  137. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/schemas/producer-readback-v1.schema.json +0 -0
  138. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/schemas/repository-attachment.schema.json +0 -0
  139. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/server.py +0 -0
  140. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/server_console_services.py +0 -0
  141. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/server_relay.py +0 -0
  142. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/server_service.py +0 -0
  143. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/status_model.py +0 -0
  144. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/status_reconciliation.py +0 -0
  145. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/storage.py +0 -0
  146. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/submission_cli.py +0 -0
  147. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/submission_intake.py +0 -0
  148. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/submission_service.py +0 -0
  149. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/system_installation_topology.py +0 -0
  150. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/system_server_service.py +0 -0
  151. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/telemetry.py +0 -0
  152. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/validation_identity.py +0 -0
  153. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/validation_profile.py +0 -0
  154. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/version_preparation_delivery.py +0 -0
  155. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/workspace_preflight.py +0 -0
  156. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/worktree_provenance.py +0 -0
  157. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform/worktree_tooling.py +0 -0
  158. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform.egg-info/SOURCES.txt +0 -0
  159. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform.egg-info/dependency_links.txt +0 -0
  160. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform.egg-info/entry_points.txt +0 -0
  161. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/src/engineering_platform.egg-info/top_level.txt +0 -0
  162. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/tests/test_adaptive_action_sizing_design.py +0 -0
  163. {engineering_platform-2.3.71 → engineering_platform-2.3.72}/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.72
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.72"
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.72",
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.72",
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.72",
10
10
  "report_format": 2,
11
- "runner_version": "2.3.71",
11
+ "runner_version": "2.3.72",
12
12
  "status_model": 1,
13
13
  "storage_schema": 45,
14
- "watcher_version": "2.3.71"
14
+ "watcher_version": "2.3.72"
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.72"
16
16
  MANIFEST_FIELDS = frozenset(
17
17
  {
18
18
  "platform_version",
@@ -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.72",
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.72
4
4
  Summary: Local-first Engineering Platform execution operations runtime
5
5
  Author: Peter van Tol
6
6
  License: MIT