engineering-platform 2.3.67__tar.gz → 2.3.70__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 (162) hide show
  1. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/PKG-INFO +1 -1
  2. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/pyproject.toml +1 -1
  3. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json +1 -1
  4. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json +4 -4
  5. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/assets/dashboard.js +18 -0
  6. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/assets/dashboard_locales.mjs +10 -0
  7. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_executor.py +10 -3
  8. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_host.py +14 -6
  9. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/platform_version.py +1 -1
  10. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/templates/workspace-config.json +1 -1
  11. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform.egg-info/PKG-INFO +1 -1
  12. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/README.md +0 -0
  13. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/setup.cfg +0 -0
  14. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/__init__.py +0 -0
  15. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/__main__.py +0 -0
  16. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/agent_state.py +0 -0
  17. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/agent_trust.py +0 -0
  18. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/assets/dashboard.css +0 -0
  19. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/assets/dashboard_status_store.mjs +0 -0
  20. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/assets/dashboard_translation.mjs +0 -0
  21. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/assets/operations-console/apple-touch-icon-dark.png +0 -0
  22. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/assets/operations-console/apple-touch-icon-light.png +0 -0
  23. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/assets/operations-console/icon-dark.png +0 -0
  24. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/assets/operations-console/icon-light.png +0 -0
  25. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/assets/operations-console/icon-transparent.png +0 -0
  26. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/assets/operations-console/manifest.webmanifest +0 -0
  27. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/capability_preflight.py +0 -0
  28. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/capability_review.py +0 -0
  29. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/central_data_transfer.py +0 -0
  30. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/central_database.py +0 -0
  31. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/central_store_migration.py +0 -0
  32. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/codex_capacity.py +0 -0
  33. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/codex_chat.py +0 -0
  34. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/codex_observability.py +0 -0
  35. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/component_lock.py +0 -0
  36. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/component_logging.py +0 -0
  37. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/console_presentation.py +0 -0
  38. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/console_route_ownership.py +0 -0
  39. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/contracts/__init__.py +0 -0
  40. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/contracts/ep_consumer.py +0 -0
  41. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/contracts/models.py +0 -0
  42. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/contracts/projection.py +0 -0
  43. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/dashboard_browser_validation.py +0 -0
  44. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/dashboard_state.py +0 -0
  45. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/dashboard_supervisor.swift +0 -0
  46. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/dashboard_translation.py +0 -0
  47. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/dependabot_producer.py +0 -0
  48. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/development_profile.py +0 -0
  49. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/drift_diagnostics.py +0 -0
  50. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/emergency_recovery.py +0 -0
  51. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/engineering_memory.py +0 -0
  52. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/ep_consumer_credentials.py +0 -0
  53. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/evidence_projection.py +0 -0
  54. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_activity.py +0 -0
  55. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_context.py +0 -0
  56. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_errors.py +0 -0
  57. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_evidence.py +0 -0
  58. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_finalization.py +0 -0
  59. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_host_evidence.py +0 -0
  60. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_lease.py +0 -0
  61. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_lifecycle.py +0 -0
  62. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_models.py +0 -0
  63. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_readiness.py +0 -0
  64. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_reporting.py +0 -0
  65. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_repository.py +0 -0
  66. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_timeout_policy.py +0 -0
  67. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_timing.py +0 -0
  68. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/execution_transaction.py +0 -0
  69. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/external_producer_binding.py +0 -0
  70. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/file_inbox.py +0 -0
  71. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/forensic_attribution.py +0 -0
  72. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/forensic_attribution_v2.py +0 -0
  73. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/forensic_delta.py +0 -0
  74. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/golden_scenario.py +0 -0
  75. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/historical_dashboard_configuration.py +0 -0
  76. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/host_admin.py +0 -0
  77. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/host_preflight.py +0 -0
  78. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/installation_relocation.py +0 -0
  79. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/installation_update_activation.py +0 -0
  80. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/installation_update_admission.py +0 -0
  81. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/installation_update_backup.py +0 -0
  82. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/installation_update_composition.py +0 -0
  83. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/installation_update_executor.py +0 -0
  84. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/installation_update_migration.py +0 -0
  85. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/installation_update_operation.py +0 -0
  86. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/installation_update_plan.py +0 -0
  87. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/installation_update_preparation.py +0 -0
  88. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/investigation_ledger.py +0 -0
  89. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/legacy_inbox_migration.py +0 -0
  90. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/legacy_installation_adoption.py +0 -0
  91. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/lifecycle_worker.py +0 -0
  92. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/live_status.py +0 -0
  93. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/local_api.py +0 -0
  94. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/local_api_keychain.py +0 -0
  95. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/local_repository_binding.py +0 -0
  96. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/managed_autonomy.py +0 -0
  97. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/managed_codex_runtime.py +0 -0
  98. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/operational_installation.py +0 -0
  99. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/operational_installation_lock.py +0 -0
  100. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/operational_installation_record.py +0 -0
  101. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/owner_credential_recovery.py +0 -0
  102. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/parity_context.py +0 -0
  103. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/parity_lifecycle_dispatcher.py +0 -0
  104. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/platform_admin.py +0 -0
  105. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/platform_api.py +0 -0
  106. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/platform_bootstrap.py +0 -0
  107. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/platform_components.py +0 -0
  108. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/pr_check_repair.py +0 -0
  109. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/pr_evidence_backfill.py +0 -0
  110. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/producer.py +0 -0
  111. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/product_installation_readback.py +0 -0
  112. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/project_agent.py +0 -0
  113. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/project_agent_service.py +0 -0
  114. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/project_topology.py +0 -0
  115. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/prompt_history.py +0 -0
  116. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/provider_context.py +0 -0
  117. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/provider_context_benchmark.py +0 -0
  118. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/provider_context_scope.py +0 -0
  119. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/provider_interruption.py +0 -0
  120. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/provider_process_identity.py +0 -0
  121. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/provider_readiness.py +0 -0
  122. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/provider_recovery.py +0 -0
  123. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/provider_usage.py +0 -0
  124. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/providers.py +0 -0
  125. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/qualification.py +0 -0
  126. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/qualification_runtime.py +0 -0
  127. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/recommendation_handoff.py +0 -0
  128. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/release_operation.py +0 -0
  129. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/report_analysis.py +0 -0
  130. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/repository_attachment.py +0 -0
  131. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/repository_handoff.py +0 -0
  132. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/resources.py +0 -0
  133. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/reviewer_evidence.py +0 -0
  134. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/revision_binding.py +0 -0
  135. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/schemas/producer-readback-v1.2.schema.json +0 -0
  136. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/schemas/producer-readback-v1.schema.json +0 -0
  137. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/schemas/repository-attachment.schema.json +0 -0
  138. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/server.py +0 -0
  139. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/server_console_services.py +0 -0
  140. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/server_relay.py +0 -0
  141. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/server_service.py +0 -0
  142. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/status_model.py +0 -0
  143. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/status_reconciliation.py +0 -0
  144. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/storage.py +0 -0
  145. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/submission_cli.py +0 -0
  146. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/submission_intake.py +0 -0
  147. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/submission_service.py +0 -0
  148. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/system_installation_topology.py +0 -0
  149. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/system_server_service.py +0 -0
  150. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/telemetry.py +0 -0
  151. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/validation_identity.py +0 -0
  152. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/validation_profile.py +0 -0
  153. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/version_preparation_delivery.py +0 -0
  154. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/workspace_preflight.py +0 -0
  155. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/worktree_provenance.py +0 -0
  156. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform/worktree_tooling.py +0 -0
  157. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform.egg-info/SOURCES.txt +0 -0
  158. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform.egg-info/dependency_links.txt +0 -0
  159. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform.egg-info/entry_points.txt +0 -0
  160. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/src/engineering_platform.egg-info/top_level.txt +0 -0
  161. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/tests/test_adaptive_action_sizing_design.py +0 -0
  162. {engineering_platform-2.3.67 → engineering_platform-2.3.70}/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.67
3
+ Version: 2.3.70
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.67"
7
+ version = "2.3.70"
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.67",
6
+ "version": "2.3.70",
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.67",
4
+ "dashboard_version": "2.3.70",
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.67",
9
+ "platform_version": "2.3.70",
10
10
  "report_format": 2,
11
- "runner_version": "2.3.67",
11
+ "runner_version": "2.3.70",
12
12
  "status_model": 1,
13
13
  "storage_schema": 44,
14
- "watcher_version": "2.3.67"
14
+ "watcher_version": "2.3.70"
15
15
  }
@@ -349,10 +349,22 @@ function phaseAwareRange(estimate) {
349
349
  if (estimate?.phase_aware !== true || samples < 2 || !Number.isFinite(lower) || !Number.isFinite(upper)) return null;
350
350
  return [Math.max(1, Math.round(lower / 60)), Math.max(1, Math.ceil(upper / 60))];
351
351
  }
352
+ function exceededEstimateContext(durationEstimate, elapsedContext = "") {
353
+ const values = [elapsedContext, t("estimate.exceeded_context")];
354
+ if (hasHistoricalEstimate(durationEstimate)) values.push(historicalContext(durationEstimate, ""));
355
+ return values.filter(Boolean).join("\n");
356
+ }
352
357
  function estimate(x, durationEstimate = {}) {
353
358
  const phase = x.current_phase || "";
354
359
  const phaseRange = phaseAwareRange(durationEstimate);
355
360
  if (["INITIALIZE", "EXECUTE_AGENT", "REPAIR_AGENT", "FINALIZATION_REPAIR_AGENT", "FINALIZE_AGENT", "REPOSITORY_CLEANUP"].includes(phase) && phaseRange) {
361
+ const remainingUpperSeconds = Number(durationEstimate?.remaining_upper_seconds);
362
+ if (Number.isFinite(remainingUpperSeconds) && remainingUpperSeconds <= 0) {
363
+ return {
364
+ summary: t("estimate.exceeded"),
365
+ context: exceededEstimateContext(durationEstimate),
366
+ };
367
+ }
356
368
  const [minimum, maximum] = phaseRange;
357
369
  return {
358
370
  summary: t("estimate.remaining", { minimum, maximum }),
@@ -375,6 +387,12 @@ function estimate(x, durationEstimate = {}) {
375
387
  remainingMinimum = Math.max(1, minimum - elapsed),
376
388
  remainingMaximum = Math.max(remainingMinimum, maximum - elapsed);
377
389
  const elapsedContext = t("estimate.elapsed", { elapsed, minutes: pluralMinutes(elapsed) });
390
+ if (maximum - elapsed <= 0) {
391
+ return {
392
+ summary: t("estimate.exceeded"),
393
+ context: exceededEstimateContext(durationEstimate, elapsedContext),
394
+ };
395
+ }
378
396
  return {
379
397
  summary: t("estimate.remaining", { minimum: remainingMinimum, maximum: remainingMaximum }),
380
398
  context: hasHistoricalEstimate(durationEstimate)
@@ -251,6 +251,8 @@ export const DASHBOARD_MESSAGES = {
251
251
  "estimate.cleanup": "Cleanup in progress",
252
252
  "estimate.cleanup_context": "Remaining time depends on the local repository.",
253
253
  "estimate.elapsed": "{elapsed} {minutes} elapsed.\nBased on execution size, phase and elapsed time. No live Codex progress or token usage.",
254
+ "estimate.exceeded": "Estimate exceeded; remaining time uncertain",
255
+ "estimate.exceeded_context": "The prior range has elapsed; no reliable remaining time is available.",
254
256
  "estimate.finalizing": "Finalization in progress",
255
257
  "estimate.finalizing_context": "Remaining time is only reliable with live Codex progress.",
256
258
  "estimate.historical_context": "Refined with {count} comparable completed executions using the same reported runtime settings.",
@@ -899,6 +901,8 @@ export const DASHBOARD_MESSAGES = {
899
901
  "estimate.cleanup": "Opschoning in uitvoering",
900
902
  "estimate.cleanup_context": "De resterende tijd hangt af van de lokale repository.",
901
903
  "estimate.elapsed": "{elapsed} {minutes} verstreken.\nGebaseerd op opdrachtomvang, fase en verstreken tijd. Geen live Codex-voortgang of tokenverbruik.",
904
+ "estimate.exceeded": "Schatting overschreden; resterende tijd onzeker",
905
+ "estimate.exceeded_context": "De eerdere bandbreedte is verstreken; er is geen betrouwbare resterende tijd beschikbaar.",
902
906
  "estimate.finalizing": "Finalisatie in uitvoering",
903
907
  "estimate.finalizing_context": "De resterende tijd is pas betrouwbaar met live Codex-voortgang.",
904
908
  "estimate.historical_context": "Verfijnd met {count} vergelijkbare voltooide uitvoeringen met dezelfde gerapporteerde runtime-instellingen.",
@@ -1547,6 +1551,8 @@ export const DASHBOARD_MESSAGES = {
1547
1551
  "estimate.cleanup": "Bereinigung läuft",
1548
1552
  "estimate.cleanup_context": "Die Restzeit hängt vom lokalen Repository ab.",
1549
1553
  "estimate.elapsed": "{elapsed} {minutes} vergangen.\nBasierend auf Auftragsumfang, Phase und verstrichener Zeit. Kein Live-Codex-Fortschritt oder Tokenverbrauch.",
1554
+ "estimate.exceeded": "Schätzung überschritten; Restzeit ungewiss",
1555
+ "estimate.exceeded_context": "Die bisherige Zeitspanne ist verstrichen; es ist keine verlässliche Restzeit verfügbar.",
1550
1556
  "estimate.finalizing": "Finalisierung läuft",
1551
1557
  "estimate.finalizing_context": "Die Restzeit ist nur mit Live-Codex-Fortschritt zuverlässig.",
1552
1558
  "estimate.historical_context": "Verfeinert mit {count} vergleichbaren abgeschlossenen Ausführungen mit denselben gemeldeten Laufzeiteinstellungen.",
@@ -2129,6 +2135,8 @@ export const DASHBOARD_MESSAGES = {
2129
2135
  "estimate.cleanup": "Nettoyage en cours",
2130
2136
  "estimate.cleanup_context": "Le temps restant dépend du dépôt local.",
2131
2137
  "estimate.elapsed": "{elapsed} {minutes} écoulées.\nBasé sur la périmètre de l’exécution, la phase et le temps écoulé. Aucune progression Codex en direct ni consommation de jetons.",
2138
+ "estimate.exceeded": "Estimation dépassée ; temps restant incertain",
2139
+ "estimate.exceeded_context": "La plage précédente est écoulée ; aucun temps restant fiable n’est disponible.",
2132
2140
  "estimate.finalizing": "Finalisation en cours",
2133
2141
  "estimate.finalizing_context": "Le temps restant n’est fiable qu’avec la progression Codex en direct.",
2134
2142
  "estimate.historical_context": "Affiné à partir de {count} exécutions terminées comparables utilisant les mêmes paramètres d’exécution signalés.",
@@ -2711,6 +2719,8 @@ export const DASHBOARD_MESSAGES = {
2711
2719
  "estimate.cleanup": "Limpieza en curso",
2712
2720
  "estimate.cleanup_context": "El tiempo restante depende del repositorio local.",
2713
2721
  "estimate.elapsed": "{elapsed} {minutes} transcurridos.\nBasado en el alcance de la ejecución, la fase y el tiempo transcurrido. Sin progreso en directo de Codex ni consumo de tokens.",
2722
+ "estimate.exceeded": "Estimación superada; tiempo restante incierto",
2723
+ "estimate.exceeded_context": "El intervalo anterior ya transcurrió; no hay un tiempo restante fiable.",
2714
2724
  "estimate.finalizing": "Finalización en curso",
2715
2725
  "estimate.finalizing_context": "El tiempo restante solo es fiable con progreso de Codex en directo.",
2716
2726
  "estimate.historical_context": "Afinado con {count} ejecuciones completadas comparables que usan la misma configuración de ejecución informada.",
@@ -26,7 +26,7 @@ from .codex_observability import codex_final_message as _codex_final_message, ex
26
26
  from .evidence_projection import ToolProxyEnvironment
27
27
  from .execution_context import additional_workspace_write_roots
28
28
  from .execution_errors import CodexHandoffTimeout, CodexInvocationError, RunnerError
29
- from .execution_timeout_policy import SPECIALIST_REVIEW
29
+ from .execution_timeout_policy import AUTONOMOUS_QUALITY_CONTROL, SPECIALIST_REVIEW
30
30
  from .execution_models import AgentResult
31
31
  from .platform_version import detected_codex_cli_version
32
32
  from .provider_usage import churn_from_jsonl, usage_from_jsonl, usage_snapshots_from_jsonl
@@ -44,7 +44,7 @@ _CODEX_USAGE_LIMIT = re.compile(
44
44
  )
45
45
  _QUALITY_EVIDENCE_ACTIVITIES = frozenset({"REFACTOR", "TEST_COVERAGE", "DOCUMENTATION", "VALIDATION", "NO_CHANGE_REQUIRED"})
46
46
  MAX_RETAINED_VALIDATION_OUTPUT_CHARACTERS = 8_000
47
- REVIEWER_INVOCATION_TIMEOUT_SECONDS = SPECIALIST_REVIEW.seconds
47
+ MANDATORY_ASSURANCE_REVIEWERS = frozenset({"quality", "security"})
48
48
  _VALIDATION_STREAM_LIMIT = MAX_RETAINED_VALIDATION_OUTPUT_CHARACTERS // 2
49
49
  _UNITTEST_FAILURE = re.compile(r"^(?:FAIL|ERROR): [^(]+ \(([^)]+)\)$", re.MULTILINE)
50
50
  _UNITTEST_COUNTS = re.compile(r"FAILED \((?P<details>[^)]*)\)")
@@ -53,6 +53,13 @@ _TURN_ABORTED = re.compile(r'"type"\s*:\s*"turn_aborted"[^\n]*"reason"\s*:\s*"in
53
53
  _ASSESSMENT_STATES = frozenset({"COMPLETE", "WAITING", "FAILED", "BLOCKED"})
54
54
 
55
55
 
56
+ def _reviewer_invocation_timeout_seconds(selection: ReviewerSelection) -> int:
57
+ """Apply the autonomous assurance boundary only to mandatory reviewers."""
58
+ if selection.reviewer in MANDATORY_ASSURANCE_REVIEWERS:
59
+ return AUTONOMOUS_QUALITY_CONTROL.seconds
60
+ return SPECIALIST_REVIEW.seconds
61
+
62
+
56
63
  def _parse_validation_assessment(raw: object) -> AgentResult:
57
64
  """Validate the small read-only contract before projecting AgentResult.
58
65
 
@@ -490,7 +497,7 @@ class CodexCliClient:
490
497
  "--output-schema",
491
498
  str(schema_path),
492
499
  reviewer_prompt(selection, objective, evidence),
493
- ), environment=environment, timeout=REVIEWER_INVOCATION_TIMEOUT_SECONDS,
500
+ ), environment=environment, timeout=_reviewer_invocation_timeout_seconds(selection),
494
501
  )
495
502
  self.last_context_escalations = proxy.context_escalations()
496
503
  self.last_execution_seconds = round(time.monotonic() - started, 3)
@@ -1418,12 +1418,20 @@ class EngineeringRunner:
1418
1418
  """Return whether an agent supplied bounded evidence of a failed local check."""
1419
1419
  if not result.validation_evidence:
1420
1420
  return False
1421
- summaries = " ".join(
1422
- item.get("result", "").casefold()
1423
- for item in result.validation_evidence
1424
- if isinstance(item, dict)
1425
- )
1426
- return any(token in summaries for token in ("fail", "failed", "timeout", "timed out", "error"))
1421
+ for item in result.validation_evidence:
1422
+ if not isinstance(item, dict):
1423
+ continue
1424
+ summary = item.get("result", "").strip().casefold()
1425
+ # Result summaries are dispositions followed by bounded detail.
1426
+ # A passing disposition takes precedence over words such as
1427
+ # "fail-closed" or "failure mode" in that descriptive detail.
1428
+ if re.match(r"^(?:pass(?:ed)?|success(?:ful|fully)?|succeeded)\b", summary):
1429
+ continue
1430
+ if re.match(r"^(?:fail(?:ed|ure)?|error|timeout|timed\s+out)\b", summary):
1431
+ return True
1432
+ if re.search(r"\b(?:failed|failure|error|timeout|timed\s+out)\b", summary):
1433
+ return True
1434
+ return False
1427
1435
 
1428
1436
  @staticmethod
1429
1437
  def _is_external_agent_block(result: AgentResult) -> bool:
@@ -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.67"
15
+ CURRENT_PLATFORM_VERSION = "2.3.70"
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.67",
6
+ "version": "2.3.70",
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.67
3
+ Version: 2.3.70
4
4
  Summary: Local-first Engineering Platform execution operations runtime
5
5
  Author: Peter van Tol
6
6
  License: MIT