engineering-platform 2.3.103__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.103 → engineering_platform-2.3.105}/PKG-INFO +1 -1
  2. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/pyproject.toml +1 -1
  3. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json +1 -1
  4. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json +4 -4
  5. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/platform_version.py +1 -1
  6. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/system_instance_lifecycle.py +75 -18
  7. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/system_instance_provisioner.py +1 -2
  8. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/templates/workspace-config.json +1 -1
  9. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/PKG-INFO +1 -1
  10. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/README.md +0 -0
  11. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/setup.cfg +0 -0
  12. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/__init__.py +0 -0
  13. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/__main__.py +0 -0
  14. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/agent_state.py +0 -0
  15. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/agent_trust.py +0 -0
  16. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard.css +0 -0
  17. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard.js +0 -0
  18. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard_locales.mjs +0 -0
  19. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard_status_store.mjs +0 -0
  20. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard_translation.mjs +0 -0
  21. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/apple-touch-icon-dark.png +0 -0
  22. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/apple-touch-icon-light.png +0 -0
  23. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/icon-dark.png +0 -0
  24. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/icon-light.png +0 -0
  25. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/icon-transparent.png +0 -0
  26. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/manifest.webmanifest +0 -0
  27. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assurance_scope.py +0 -0
  28. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/capability_preflight.py +0 -0
  29. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/capability_review.py +0 -0
  30. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/central_data_transfer.py +0 -0
  31. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/central_database.py +0 -0
  32. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/central_operational_reset.py +0 -0
  33. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/central_store_migration.py +0 -0
  34. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/codex_capacity.py +0 -0
  35. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/codex_chat.py +0 -0
  36. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/codex_observability.py +0 -0
  37. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/component_lock.py +0 -0
  38. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/component_logging.py +0 -0
  39. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/console_presentation.py +0 -0
  40. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/console_route_ownership.py +0 -0
  41. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/contracts/__init__.py +0 -0
  42. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/contracts/ep_consumer.py +0 -0
  43. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/contracts/models.py +0 -0
  44. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/contracts/projection.py +0 -0
  45. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/dashboard_browser_validation.py +0 -0
  46. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/dashboard_state.py +0 -0
  47. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/dashboard_supervisor.swift +0 -0
  48. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/dashboard_translation.py +0 -0
  49. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/dependabot_producer.py +0 -0
  50. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/development_profile.py +0 -0
  51. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/drift_diagnostics.py +0 -0
  52. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/emergency_recovery.py +0 -0
  53. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/engineering_memory.py +0 -0
  54. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/ep_consumer_credentials.py +0 -0
  55. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/evidence_projection.py +0 -0
  56. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_activity.py +0 -0
  57. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_context.py +0 -0
  58. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_errors.py +0 -0
  59. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_evidence.py +0 -0
  60. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_executor.py +0 -0
  61. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_finalization.py +0 -0
  62. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_host.py +0 -0
  63. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_host_evidence.py +0 -0
  64. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_lease.py +0 -0
  65. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_lifecycle.py +0 -0
  66. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_models.py +0 -0
  67. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_readiness.py +0 -0
  68. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_reporting.py +0 -0
  69. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_repository.py +0 -0
  70. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_timeout_policy.py +0 -0
  71. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_timing.py +0 -0
  72. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_transaction.py +0 -0
  73. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/external_producer_binding.py +0 -0
  74. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/file_inbox.py +0 -0
  75. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/forensic_attribution.py +0 -0
  76. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/forensic_attribution_v2.py +0 -0
  77. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/forensic_delta.py +0 -0
  78. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/golden_scenario.py +0 -0
  79. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/historical_dashboard_configuration.py +0 -0
  80. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/host_admin.py +0 -0
  81. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/host_preflight.py +0 -0
  82. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_relocation.py +0 -0
  83. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_activation.py +0 -0
  84. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_admission.py +0 -0
  85. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_backup.py +0 -0
  86. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_composition.py +0 -0
  87. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_executor.py +0 -0
  88. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_migration.py +0 -0
  89. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_operation.py +0 -0
  90. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_plan.py +0 -0
  91. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_preparation.py +0 -0
  92. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/investigation_ledger.py +0 -0
  93. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/legacy_inbox_migration.py +0 -0
  94. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/legacy_installation_adoption.py +0 -0
  95. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/lifecycle_worker.py +0 -0
  96. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/live_status.py +0 -0
  97. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/local_api.py +0 -0
  98. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/local_api_keychain.py +0 -0
  99. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/local_repository_binding.py +0 -0
  100. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/managed_autonomy.py +0 -0
  101. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/managed_codex_runtime.py +0 -0
  102. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/managed_workspace_readiness.py +0 -0
  103. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/managed_workspace_recovery.py +0 -0
  104. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/merge_delegation.py +0 -0
  105. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/operational_installation.py +0 -0
  106. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/operational_installation_lock.py +0 -0
  107. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/operational_installation_record.py +0 -0
  108. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/owner_credential_recovery.py +0 -0
  109. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/parity_context.py +0 -0
  110. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/parity_lifecycle_dispatcher.py +0 -0
  111. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/platform_admin.py +0 -0
  112. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/platform_api.py +0 -0
  113. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/platform_bootstrap.py +0 -0
  114. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/platform_components.py +0 -0
  115. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/pr_check_repair.py +0 -0
  116. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/pr_evidence_backfill.py +0 -0
  117. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/producer.py +0 -0
  118. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/product_installation_readback.py +0 -0
  119. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/project_agent.py +0 -0
  120. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/project_agent_service.py +0 -0
  121. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/project_topology.py +0 -0
  122. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/prompt_history.py +0 -0
  123. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_context.py +0 -0
  124. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_context_benchmark.py +0 -0
  125. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_context_scope.py +0 -0
  126. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_interruption.py +0 -0
  127. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_process_identity.py +0 -0
  128. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_readiness.py +0 -0
  129. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_recovery.py +0 -0
  130. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_usage.py +0 -0
  131. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/providers.py +0 -0
  132. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/qualification.py +0 -0
  133. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/qualification_runtime.py +0 -0
  134. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/recommendation_handoff.py +0 -0
  135. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/reconciliation_adoption.py +0 -0
  136. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/release_operation.py +0 -0
  137. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/report_analysis.py +0 -0
  138. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/repository_attachment.py +0 -0
  139. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/repository_handoff.py +0 -0
  140. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/resources.py +0 -0
  141. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/reviewer_evidence.py +0 -0
  142. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/revision_binding.py +0 -0
  143. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/schemas/producer-readback-v1.2.schema.json +0 -0
  144. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/schemas/producer-readback-v1.3.schema.json +0 -0
  145. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/schemas/producer-readback-v1.schema.json +0 -0
  146. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/schemas/repository-attachment.schema.json +0 -0
  147. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/server.py +0 -0
  148. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/server_console_services.py +0 -0
  149. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/server_relay.py +0 -0
  150. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/server_service.py +0 -0
  151. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/status_model.py +0 -0
  152. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/status_reconciliation.py +0 -0
  153. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/storage.py +0 -0
  154. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/submission_cli.py +0 -0
  155. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/submission_intake.py +0 -0
  156. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/submission_service.py +0 -0
  157. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/system_installation_topology.py +0 -0
  158. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/system_provider_context.py +0 -0
  159. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/system_server_service.py +0 -0
  160. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/telemetry.py +0 -0
  161. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/telemetry_contract.py +0 -0
  162. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/telemetry_export.py +0 -0
  163. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/telemetry_metrics.py +0 -0
  164. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/terminal_evidence_reconciliation.py +0 -0
  165. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/validation_identity.py +0 -0
  166. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/validation_profile.py +0 -0
  167. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/version_preparation_delivery.py +0 -0
  168. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/workspace_preflight.py +0 -0
  169. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/worktree_provenance.py +0 -0
  170. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/worktree_tooling.py +0 -0
  171. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/SOURCES.txt +0 -0
  172. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/dependency_links.txt +0 -0
  173. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/entry_points.txt +0 -0
  174. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/top_level.txt +0 -0
  175. {engineering_platform-2.3.103 → engineering_platform-2.3.105}/tests/test_adaptive_action_sizing_design.py +0 -0
  176. {engineering_platform-2.3.103 → 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.103
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.103"
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.103",
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.103",
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.103",
9
+ "platform_version": "2.3.105",
10
10
  "report_format": 2,
11
- "runner_version": "2.3.103",
11
+ "runner_version": "2.3.105",
12
12
  "status_model": 1,
13
13
  "storage_schema": 45,
14
- "watcher_version": "2.3.103"
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.103"
15
+ CURRENT_PLATFORM_VERSION = "2.3.105"
16
16
  MANIFEST_FIELDS = frozenset(
17
17
  {
18
18
  "platform_version",
@@ -97,10 +97,22 @@ def _atomic_json(path: Path, value: Mapping[str, object]) -> None:
97
97
  temporary.unlink(missing_ok=True)
98
98
 
99
99
 
100
+ def _assert_owned_mode(path: Path, details: os.stat_result) -> None:
101
+ if stat.S_IMODE(details.st_mode) & 0o022:
102
+ raise SystemInstanceLifecycleError(
103
+ f"EP preserved instance contains group/world-writable entry: {path}"
104
+ )
105
+
106
+
100
107
  def _regular_digest(path: Path) -> str:
101
108
  details = path.lstat()
102
109
  if path.is_symlink() or not stat.S_ISREG(details.st_mode):
103
110
  raise SystemInstanceLifecycleError(f"EP preserved instance contains unsafe entry: {path}")
111
+ _assert_owned_mode(path, details)
112
+ if details.st_nlink != 1:
113
+ raise SystemInstanceLifecycleError(
114
+ f"EP preserved instance contains non-exclusive hardlink: {path}"
115
+ )
104
116
  digest = hashlib.sha256()
105
117
  with path.open("rb") as stream:
106
118
  while True:
@@ -118,6 +130,7 @@ def _tree_digest(root: Path, *, ignored_roots: tuple[Path, ...] = ()) -> str:
118
130
  raise SystemInstanceLifecycleError("EP preserved instance root is unavailable") from error
119
131
  if root.is_symlink() or not stat.S_ISDIR(details.st_mode):
120
132
  raise SystemInstanceLifecycleError("EP preserved instance root is unsafe")
133
+ _assert_owned_mode(root, details)
121
134
  ignored: tuple[tuple[str, ...], ...] = tuple(
122
135
  path.relative_to(root).parts for path in ignored_roots
123
136
  )
@@ -137,6 +150,7 @@ def _tree_digest(root: Path, *, ignored_roots: tuple[Path, ...] = ()) -> str:
137
150
  info = path.lstat()
138
151
  if stat.S_ISLNK(info.st_mode) or not stat.S_ISDIR(info.st_mode):
139
152
  raise SystemInstanceLifecycleError(f"EP preserved instance contains unsafe entry: {path}")
153
+ _assert_owned_mode(path, info)
140
154
  entries.append({
141
155
  "path": str(path.relative_to(root)),
142
156
  "kind": "DIRECTORY",
@@ -327,6 +341,7 @@ class SystemInstanceLifecycle:
327
341
  raise SystemInstanceLifecycleError("EP preserved instance changed after terminal preserve")
328
342
  return receipt
329
343
  with _Lock(instance.lifecycle_lock):
344
+ _tree_digest(instance.root)
330
345
  self.controller.remove(instance)
331
346
  if self.controller.loaded(instance) or self.service_interpreter(instance) is not None:
332
347
  raise SystemInstanceLifecycleError("EP preserved service was not fully removed")
@@ -441,6 +456,10 @@ class SystemInstanceLifecycle:
441
456
  if state.get("phase") == "COMPLETE":
442
457
  return state
443
458
  with _Lock(instance.lifecycle_lock):
459
+ _tree_digest(
460
+ instance.root,
461
+ ignored_roots=(instance.operations_root / operation_id,),
462
+ )
444
463
  self.controller.remove(instance)
445
464
  if self.controller.loaded(instance) or self.service_interpreter(instance) is not None:
446
465
  raise SystemInstanceLifecycleError("EP purge service was not fully removed")
@@ -458,40 +477,78 @@ class SystemInstanceLifecycle:
458
477
  "PURGE_READY",
459
478
  mutable_instance_data_digest=tree_digest,
460
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,
461
488
  )
462
489
 
463
490
  def resume_purge_target(
464
491
  self,
465
- instance: system_installation_topology.SystemInstanceTopology,
466
- descriptor: Mapping[str, object],
492
+ instance_id: str,
467
493
  operation_id: str,
494
+ remove_receipt: Mapping[str, object],
468
495
  ) -> None:
469
- root = self._operation_root(instance.instance_id, operation_id)
496
+ root = self._operation_root(instance_id, operation_id)
470
497
  state = _read_json(root / "state.json")
471
498
  if (
472
499
  state.get("contract") != CONTRACT
473
500
  or state.get("operation") != "PURGE"
474
501
  or state.get("phase") != "PURGE_READY"
475
- or state.get("instance_id") != instance.instance_id
476
- 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")
477
513
  ):
478
514
  raise SystemInstanceLifecycleError("EP purge recovery evidence is invalid")
479
- 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()
480
542
  self.controller.remove(instance)
481
543
  if self.controller.loaded(instance) or self.service_interpreter(instance) is not None:
482
544
  raise SystemInstanceLifecycleError("EP purge recovery service was not fully removed")
483
- if _tree_digest(
484
- instance.root,
485
- ignored_roots=(instance.operations_root / operation_id,),
486
- ) != state.get("mutable_instance_data_digest"):
487
- raise SystemInstanceLifecycleError("EP purge recovery target changed after preparation")
488
- expected = self.product.system_root / "instances" / instance.instance_id
489
- if (
490
- instance.root != expected
491
- or instance.root.is_symlink()
492
- or not instance.root.is_relative_to(self.product.system_root / "instances")
493
- ):
494
- 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")
495
552
  shutil.rmtree(instance.root)
496
553
 
497
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.103",
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.103
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