engineering-platform 2.3.104__tar.gz → 2.3.105__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 (176) hide show
  1. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/PKG-INFO +1 -1
  2. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/pyproject.toml +1 -1
  3. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json +1 -1
  4. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json +4 -4
  5. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/platform_version.py +1 -1
  6. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/system_instance_lifecycle.py +56 -18
  7. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/system_instance_provisioner.py +1 -2
  8. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/templates/workspace-config.json +1 -1
  9. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/PKG-INFO +1 -1
  10. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/README.md +0 -0
  11. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/setup.cfg +0 -0
  12. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/__init__.py +0 -0
  13. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/__main__.py +0 -0
  14. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/agent_state.py +0 -0
  15. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/agent_trust.py +0 -0
  16. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard.css +0 -0
  17. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard.js +0 -0
  18. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard_locales.mjs +0 -0
  19. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard_status_store.mjs +0 -0
  20. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard_translation.mjs +0 -0
  21. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/apple-touch-icon-dark.png +0 -0
  22. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/apple-touch-icon-light.png +0 -0
  23. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/icon-dark.png +0 -0
  24. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/icon-light.png +0 -0
  25. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/icon-transparent.png +0 -0
  26. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/manifest.webmanifest +0 -0
  27. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/assurance_scope.py +0 -0
  28. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/capability_preflight.py +0 -0
  29. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/capability_review.py +0 -0
  30. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/central_data_transfer.py +0 -0
  31. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/central_database.py +0 -0
  32. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/central_operational_reset.py +0 -0
  33. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/central_store_migration.py +0 -0
  34. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/codex_capacity.py +0 -0
  35. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/codex_chat.py +0 -0
  36. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/codex_observability.py +0 -0
  37. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/component_lock.py +0 -0
  38. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/component_logging.py +0 -0
  39. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/console_presentation.py +0 -0
  40. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/console_route_ownership.py +0 -0
  41. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/contracts/__init__.py +0 -0
  42. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/contracts/ep_consumer.py +0 -0
  43. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/contracts/models.py +0 -0
  44. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/contracts/projection.py +0 -0
  45. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/dashboard_browser_validation.py +0 -0
  46. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/dashboard_state.py +0 -0
  47. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/dashboard_supervisor.swift +0 -0
  48. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/dashboard_translation.py +0 -0
  49. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/dependabot_producer.py +0 -0
  50. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/development_profile.py +0 -0
  51. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/drift_diagnostics.py +0 -0
  52. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/emergency_recovery.py +0 -0
  53. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/engineering_memory.py +0 -0
  54. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/ep_consumer_credentials.py +0 -0
  55. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/evidence_projection.py +0 -0
  56. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_activity.py +0 -0
  57. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_context.py +0 -0
  58. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_errors.py +0 -0
  59. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_evidence.py +0 -0
  60. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_executor.py +0 -0
  61. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_finalization.py +0 -0
  62. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_host.py +0 -0
  63. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_host_evidence.py +0 -0
  64. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_lease.py +0 -0
  65. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_lifecycle.py +0 -0
  66. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_models.py +0 -0
  67. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_readiness.py +0 -0
  68. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_reporting.py +0 -0
  69. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_repository.py +0 -0
  70. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_timeout_policy.py +0 -0
  71. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_timing.py +0 -0
  72. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/execution_transaction.py +0 -0
  73. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/external_producer_binding.py +0 -0
  74. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/file_inbox.py +0 -0
  75. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/forensic_attribution.py +0 -0
  76. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/forensic_attribution_v2.py +0 -0
  77. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/forensic_delta.py +0 -0
  78. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/golden_scenario.py +0 -0
  79. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/historical_dashboard_configuration.py +0 -0
  80. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/host_admin.py +0 -0
  81. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/host_preflight.py +0 -0
  82. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/installation_relocation.py +0 -0
  83. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_activation.py +0 -0
  84. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_admission.py +0 -0
  85. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_backup.py +0 -0
  86. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_composition.py +0 -0
  87. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_executor.py +0 -0
  88. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_migration.py +0 -0
  89. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_operation.py +0 -0
  90. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_plan.py +0 -0
  91. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_preparation.py +0 -0
  92. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/investigation_ledger.py +0 -0
  93. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/legacy_inbox_migration.py +0 -0
  94. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/legacy_installation_adoption.py +0 -0
  95. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/lifecycle_worker.py +0 -0
  96. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/live_status.py +0 -0
  97. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/local_api.py +0 -0
  98. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/local_api_keychain.py +0 -0
  99. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/local_repository_binding.py +0 -0
  100. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/managed_autonomy.py +0 -0
  101. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/managed_codex_runtime.py +0 -0
  102. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/managed_workspace_readiness.py +0 -0
  103. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/managed_workspace_recovery.py +0 -0
  104. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/merge_delegation.py +0 -0
  105. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/operational_installation.py +0 -0
  106. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/operational_installation_lock.py +0 -0
  107. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/operational_installation_record.py +0 -0
  108. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/owner_credential_recovery.py +0 -0
  109. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/parity_context.py +0 -0
  110. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/parity_lifecycle_dispatcher.py +0 -0
  111. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/platform_admin.py +0 -0
  112. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/platform_api.py +0 -0
  113. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/platform_bootstrap.py +0 -0
  114. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/platform_components.py +0 -0
  115. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/pr_check_repair.py +0 -0
  116. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/pr_evidence_backfill.py +0 -0
  117. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/producer.py +0 -0
  118. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/product_installation_readback.py +0 -0
  119. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/project_agent.py +0 -0
  120. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/project_agent_service.py +0 -0
  121. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/project_topology.py +0 -0
  122. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/prompt_history.py +0 -0
  123. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/provider_context.py +0 -0
  124. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/provider_context_benchmark.py +0 -0
  125. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/provider_context_scope.py +0 -0
  126. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/provider_interruption.py +0 -0
  127. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/provider_process_identity.py +0 -0
  128. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/provider_readiness.py +0 -0
  129. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/provider_recovery.py +0 -0
  130. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/provider_usage.py +0 -0
  131. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/providers.py +0 -0
  132. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/qualification.py +0 -0
  133. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/qualification_runtime.py +0 -0
  134. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/recommendation_handoff.py +0 -0
  135. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/reconciliation_adoption.py +0 -0
  136. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/release_operation.py +0 -0
  137. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/report_analysis.py +0 -0
  138. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/repository_attachment.py +0 -0
  139. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/repository_handoff.py +0 -0
  140. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/resources.py +0 -0
  141. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/reviewer_evidence.py +0 -0
  142. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/revision_binding.py +0 -0
  143. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/schemas/producer-readback-v1.2.schema.json +0 -0
  144. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/schemas/producer-readback-v1.3.schema.json +0 -0
  145. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/schemas/producer-readback-v1.schema.json +0 -0
  146. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/schemas/repository-attachment.schema.json +0 -0
  147. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/server.py +0 -0
  148. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/server_console_services.py +0 -0
  149. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/server_relay.py +0 -0
  150. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/server_service.py +0 -0
  151. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/status_model.py +0 -0
  152. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/status_reconciliation.py +0 -0
  153. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/storage.py +0 -0
  154. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/submission_cli.py +0 -0
  155. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/submission_intake.py +0 -0
  156. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/submission_service.py +0 -0
  157. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/system_installation_topology.py +0 -0
  158. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/system_provider_context.py +0 -0
  159. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/system_server_service.py +0 -0
  160. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/telemetry.py +0 -0
  161. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/telemetry_contract.py +0 -0
  162. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/telemetry_export.py +0 -0
  163. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/telemetry_metrics.py +0 -0
  164. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/terminal_evidence_reconciliation.py +0 -0
  165. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/validation_identity.py +0 -0
  166. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/validation_profile.py +0 -0
  167. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/version_preparation_delivery.py +0 -0
  168. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/workspace_preflight.py +0 -0
  169. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/worktree_provenance.py +0 -0
  170. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform/worktree_tooling.py +0 -0
  171. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/SOURCES.txt +0 -0
  172. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/dependency_links.txt +0 -0
  173. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/entry_points.txt +0 -0
  174. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/top_level.txt +0 -0
  175. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/tests/test_adaptive_action_sizing_design.py +0 -0
  176. {engineering_platform-2.3.104 → engineering_platform-2.3.105}/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.104
3
+ Version: 2.3.105
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.104"
7
+ version = "2.3.105"
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.104",
6
+ "version": "2.3.105",
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.104",
4
+ "dashboard_version": "2.3.105",
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.104",
9
+ "platform_version": "2.3.105",
10
10
  "report_format": 2,
11
- "runner_version": "2.3.104",
11
+ "runner_version": "2.3.105",
12
12
  "status_model": 1,
13
13
  "storage_schema": 45,
14
- "watcher_version": "2.3.104"
14
+ "watcher_version": "2.3.105"
15
15
  }
@@ -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.104"
15
+ CURRENT_PLATFORM_VERSION = "2.3.105"
16
16
  MANIFEST_FIELDS = frozenset(
17
17
  {
18
18
  "platform_version",
@@ -477,40 +477,78 @@ class SystemInstanceLifecycle:
477
477
  "PURGE_READY",
478
478
  mutable_instance_data_digest=tree_digest,
479
479
  descriptor_digest=request["descriptor_digest"],
480
+ # REMOVE publishes its receipt before deleting this tree. A
481
+ # process kill can erase instance.json before rmtree finishes.
482
+ # Retain only the topology and root identity needed to resume
483
+ # that exact deletion without adopting a replacement root.
484
+ display_label=instance.display_label,
485
+ service_account=instance.service_account,
486
+ root_device=instance.root.stat(follow_symlinks=False).st_dev,
487
+ root_inode=instance.root.stat(follow_symlinks=False).st_ino,
480
488
  )
481
489
 
482
490
  def resume_purge_target(
483
491
  self,
484
- instance: system_installation_topology.SystemInstanceTopology,
485
- descriptor: Mapping[str, object],
492
+ instance_id: str,
486
493
  operation_id: str,
494
+ remove_receipt: Mapping[str, object],
487
495
  ) -> None:
488
- root = self._operation_root(instance.instance_id, operation_id)
496
+ root = self._operation_root(instance_id, operation_id)
489
497
  state = _read_json(root / "state.json")
490
498
  if (
491
499
  state.get("contract") != CONTRACT
492
500
  or state.get("operation") != "PURGE"
493
501
  or state.get("phase") != "PURGE_READY"
494
- or state.get("instance_id") != instance.instance_id
495
- or state.get("descriptor_digest") != _json_digest(dict(descriptor))
502
+ or state.get("instance_id") != instance_id
503
+ or state.get("request") != {
504
+ "instance_id": instance_id,
505
+ "descriptor_digest": state.get("descriptor_digest"),
506
+ }
507
+ or state.get("request_digest") != _json_digest(state["request"])
508
+ or remove_receipt.get("operation") != "REMOVE"
509
+ or remove_receipt.get("operation_id") != operation_id
510
+ or remove_receipt.get("instance_id") != instance_id
511
+ or not isinstance(remove_receipt.get("evidence"), Mapping)
512
+ or remove_receipt["evidence"].get("removed_descriptor_digest") != state.get("descriptor_digest")
496
513
  ):
497
514
  raise SystemInstanceLifecycleError("EP purge recovery evidence is invalid")
498
- with _Lock(instance.lifecycle_lock):
515
+ try:
516
+ instance = system_installation_topology.system_instance_topology(
517
+ self.product,
518
+ instance_id=instance_id,
519
+ display_label=state["display_label"],
520
+ service_account=state["service_account"],
521
+ )
522
+ except (KeyError, TypeError, ValueError) as error:
523
+ raise SystemInstanceLifecycleError("EP purge recovery topology is invalid") from error
524
+ expected = self.product.system_root / "instances" / instance.instance_id
525
+ if (
526
+ instance.root != expected
527
+ or instance.root.is_symlink()
528
+ or not instance.root.is_relative_to(self.product.system_root / "instances")
529
+ ):
530
+ raise SystemInstanceLifecycleError("EP purge recovery target is invalid")
531
+
532
+ def verify_original_root() -> None:
533
+ details = instance.root.stat(follow_symlinks=False)
534
+ if (details.st_dev, details.st_ino) != (state.get("root_device"), state.get("root_inode")):
535
+ raise SystemInstanceLifecycleError("EP purge recovery target was replaced")
536
+
537
+ # Check before opening the instance-owned lock, which may recreate a
538
+ # lock directory already erased by the interrupted deletion.
539
+ verify_original_root()
540
+ with _Lock(root / "purge-recovery.lock"), _Lock(instance.lifecycle_lock):
541
+ verify_original_root()
499
542
  self.controller.remove(instance)
500
543
  if self.controller.loaded(instance) or self.service_interpreter(instance) is not None:
501
544
  raise SystemInstanceLifecycleError("EP purge recovery service was not fully removed")
502
- if _tree_digest(
503
- instance.root,
504
- ignored_roots=(instance.operations_root / operation_id,),
505
- ) != state.get("mutable_instance_data_digest"):
506
- raise SystemInstanceLifecycleError("EP purge recovery target changed after preparation")
507
- expected = self.product.system_root / "instances" / instance.instance_id
508
- if (
509
- instance.root != expected
510
- or instance.root.is_symlink()
511
- or not instance.root.is_relative_to(self.product.system_root / "instances")
512
- ):
513
- raise SystemInstanceLifecycleError("EP purge recovery target is invalid")
545
+ # The exact root survives until rmtree's final step. Its contents
546
+ # may be a strict subset after SIGKILL, so the original whole-tree
547
+ # digest cannot be required here. Reject unsafe remaining entries.
548
+ _tree_digest(instance.root, ignored_roots=(instance.operations_root / operation_id,))
549
+ if instance.descriptor.exists():
550
+ if _json_digest(_read_json(instance.descriptor)) != state.get("descriptor_digest"):
551
+ raise SystemInstanceLifecycleError("EP purge recovery descriptor changed")
514
552
  shutil.rmtree(instance.root)
515
553
 
516
554
  def record_purge(
@@ -665,8 +665,7 @@ class SystemInstanceProvisioner:
665
665
  else:
666
666
  remove_receipt = prior_remove
667
667
  if instance_root.exists() or instance_root.is_symlink():
668
- instance, descriptor = self._instance_from_descriptor(instance_id)
669
- lifecycle.resume_purge_target(instance, descriptor, operation_id)
668
+ lifecycle.resume_purge_target(instance_id, operation_id, remove_receipt)
670
669
  receipt = lifecycle.record_purge(instance_id, operation_id, remove_receipt)
671
670
  return {
672
671
  "contract": system_instance_lifecycle.CONTRACT,
@@ -3,7 +3,7 @@
3
3
  "platform": {
4
4
  "id": "engineering-platform",
5
5
  "name": "Engineering Platform",
6
- "version": "2.3.104",
6
+ "version": "2.3.105",
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.104
3
+ Version: 2.3.105
4
4
  Summary: Local-first Engineering Platform execution operations runtime
5
5
  Author: Peter van Tol
6
6
  License: MIT