engineering-platform 2.3.75__tar.gz → 2.3.77__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 (164) hide show
  1. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/PKG-INFO +1 -1
  2. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/pyproject.toml +1 -1
  3. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json +1 -1
  4. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json +4 -4
  5. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/assets/dashboard.js +29 -0
  6. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/platform_version.py +1 -1
  7. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/server.py +112 -14
  8. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/templates/workspace-config.json +1 -1
  9. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform.egg-info/PKG-INFO +1 -1
  10. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/README.md +0 -0
  11. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/setup.cfg +0 -0
  12. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/__init__.py +0 -0
  13. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/__main__.py +0 -0
  14. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/agent_state.py +0 -0
  15. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/agent_trust.py +0 -0
  16. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/assets/dashboard.css +0 -0
  17. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/assets/dashboard_locales.mjs +0 -0
  18. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/assets/dashboard_status_store.mjs +0 -0
  19. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/assets/dashboard_translation.mjs +0 -0
  20. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/assets/operations-console/apple-touch-icon-dark.png +0 -0
  21. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/assets/operations-console/apple-touch-icon-light.png +0 -0
  22. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/assets/operations-console/icon-dark.png +0 -0
  23. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/assets/operations-console/icon-light.png +0 -0
  24. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/assets/operations-console/icon-transparent.png +0 -0
  25. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/assets/operations-console/manifest.webmanifest +0 -0
  26. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/capability_preflight.py +0 -0
  27. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/capability_review.py +0 -0
  28. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/central_data_transfer.py +0 -0
  29. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/central_database.py +0 -0
  30. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/central_store_migration.py +0 -0
  31. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/codex_capacity.py +0 -0
  32. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/codex_chat.py +0 -0
  33. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/codex_observability.py +0 -0
  34. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/component_lock.py +0 -0
  35. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/component_logging.py +0 -0
  36. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/console_presentation.py +0 -0
  37. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/console_route_ownership.py +0 -0
  38. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/contracts/__init__.py +0 -0
  39. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/contracts/ep_consumer.py +0 -0
  40. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/contracts/models.py +0 -0
  41. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/contracts/projection.py +0 -0
  42. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/dashboard_browser_validation.py +0 -0
  43. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/dashboard_state.py +0 -0
  44. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/dashboard_supervisor.swift +0 -0
  45. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/dashboard_translation.py +0 -0
  46. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/dependabot_producer.py +0 -0
  47. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/development_profile.py +0 -0
  48. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/drift_diagnostics.py +0 -0
  49. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/emergency_recovery.py +0 -0
  50. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/engineering_memory.py +0 -0
  51. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/ep_consumer_credentials.py +0 -0
  52. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/evidence_projection.py +0 -0
  53. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_activity.py +0 -0
  54. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_context.py +0 -0
  55. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_errors.py +0 -0
  56. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_evidence.py +0 -0
  57. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_executor.py +0 -0
  58. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_finalization.py +0 -0
  59. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_host.py +0 -0
  60. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_host_evidence.py +0 -0
  61. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_lease.py +0 -0
  62. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_lifecycle.py +0 -0
  63. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_models.py +0 -0
  64. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_readiness.py +0 -0
  65. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_reporting.py +0 -0
  66. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_repository.py +0 -0
  67. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_timeout_policy.py +0 -0
  68. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_timing.py +0 -0
  69. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/execution_transaction.py +0 -0
  70. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/external_producer_binding.py +0 -0
  71. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/file_inbox.py +0 -0
  72. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/forensic_attribution.py +0 -0
  73. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/forensic_attribution_v2.py +0 -0
  74. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/forensic_delta.py +0 -0
  75. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/golden_scenario.py +0 -0
  76. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/historical_dashboard_configuration.py +0 -0
  77. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/host_admin.py +0 -0
  78. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/host_preflight.py +0 -0
  79. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/installation_relocation.py +0 -0
  80. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/installation_update_activation.py +0 -0
  81. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/installation_update_admission.py +0 -0
  82. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/installation_update_backup.py +0 -0
  83. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/installation_update_composition.py +0 -0
  84. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/installation_update_executor.py +0 -0
  85. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/installation_update_migration.py +0 -0
  86. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/installation_update_operation.py +0 -0
  87. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/installation_update_plan.py +0 -0
  88. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/installation_update_preparation.py +0 -0
  89. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/investigation_ledger.py +0 -0
  90. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/legacy_inbox_migration.py +0 -0
  91. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/legacy_installation_adoption.py +0 -0
  92. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/lifecycle_worker.py +0 -0
  93. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/live_status.py +0 -0
  94. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/local_api.py +0 -0
  95. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/local_api_keychain.py +0 -0
  96. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/local_repository_binding.py +0 -0
  97. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/managed_autonomy.py +0 -0
  98. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/managed_codex_runtime.py +0 -0
  99. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/operational_installation.py +0 -0
  100. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/operational_installation_lock.py +0 -0
  101. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/operational_installation_record.py +0 -0
  102. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/owner_credential_recovery.py +0 -0
  103. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/parity_context.py +0 -0
  104. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/parity_lifecycle_dispatcher.py +0 -0
  105. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/platform_admin.py +0 -0
  106. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/platform_api.py +0 -0
  107. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/platform_bootstrap.py +0 -0
  108. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/platform_components.py +0 -0
  109. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/pr_check_repair.py +0 -0
  110. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/pr_evidence_backfill.py +0 -0
  111. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/producer.py +0 -0
  112. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/product_installation_readback.py +0 -0
  113. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/project_agent.py +0 -0
  114. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/project_agent_service.py +0 -0
  115. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/project_topology.py +0 -0
  116. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/prompt_history.py +0 -0
  117. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/provider_context.py +0 -0
  118. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/provider_context_benchmark.py +0 -0
  119. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/provider_context_scope.py +0 -0
  120. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/provider_interruption.py +0 -0
  121. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/provider_process_identity.py +0 -0
  122. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/provider_readiness.py +0 -0
  123. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/provider_recovery.py +0 -0
  124. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/provider_usage.py +0 -0
  125. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/providers.py +0 -0
  126. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/qualification.py +0 -0
  127. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/qualification_runtime.py +0 -0
  128. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/recommendation_handoff.py +0 -0
  129. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/reconciliation_adoption.py +0 -0
  130. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/release_operation.py +0 -0
  131. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/report_analysis.py +0 -0
  132. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/repository_attachment.py +0 -0
  133. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/repository_handoff.py +0 -0
  134. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/resources.py +0 -0
  135. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/reviewer_evidence.py +0 -0
  136. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/revision_binding.py +0 -0
  137. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/schemas/producer-readback-v1.2.schema.json +0 -0
  138. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/schemas/producer-readback-v1.schema.json +0 -0
  139. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/schemas/repository-attachment.schema.json +0 -0
  140. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/server_console_services.py +0 -0
  141. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/server_relay.py +0 -0
  142. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/server_service.py +0 -0
  143. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/status_model.py +0 -0
  144. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/status_reconciliation.py +0 -0
  145. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/storage.py +0 -0
  146. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/submission_cli.py +0 -0
  147. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/submission_intake.py +0 -0
  148. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/submission_service.py +0 -0
  149. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/system_installation_topology.py +0 -0
  150. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/system_server_service.py +0 -0
  151. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/telemetry.py +0 -0
  152. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/terminal_evidence_reconciliation.py +0 -0
  153. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/validation_identity.py +0 -0
  154. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/validation_profile.py +0 -0
  155. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/version_preparation_delivery.py +0 -0
  156. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/workspace_preflight.py +0 -0
  157. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/worktree_provenance.py +0 -0
  158. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform/worktree_tooling.py +0 -0
  159. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform.egg-info/SOURCES.txt +0 -0
  160. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform.egg-info/dependency_links.txt +0 -0
  161. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform.egg-info/entry_points.txt +0 -0
  162. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/src/engineering_platform.egg-info/top_level.txt +0 -0
  163. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/tests/test_adaptive_action_sizing_design.py +0 -0
  164. {engineering_platform-2.3.75 → engineering_platform-2.3.77}/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.75
3
+ Version: 2.3.77
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.75"
7
+ version = "2.3.77"
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.75",
6
+ "version": "2.3.77",
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.75",
4
+ "dashboard_version": "2.3.77",
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.75",
9
+ "platform_version": "2.3.77",
10
10
  "report_format": 2,
11
- "runner_version": "2.3.75",
11
+ "runner_version": "2.3.77",
12
12
  "status_model": 1,
13
13
  "storage_schema": 45,
14
- "watcher_version": "2.3.75"
14
+ "watcher_version": "2.3.77"
15
15
  }
@@ -8209,6 +8209,29 @@ function promptDetailReviewersSection(reviewers, { wide = true } = {}) {
8209
8209
  );
8210
8210
  return promptDetailCard(t("detail.specialist_reviews"), fields, wide, "prompt-detail-card--reviewers");
8211
8211
  }
8212
+ function promptDetailAssuranceReviewsSection(reviews) {
8213
+ if (!reviews.length) return null;
8214
+ const fields = reviews.map((review) => {
8215
+ const findings = Array.isArray(review.findings) ? review.findings : [];
8216
+ const candidate = String(review.candidate_sha || "").trim();
8217
+ const lines = [
8218
+ assuranceStatusLabel(review.status || "UNRESOLVED"),
8219
+ candidate ? t("detail.candidate_sha") + ": " + candidate : null,
8220
+ ...(findings.length
8221
+ ? findings.map((finding) => String(finding?.observation || "").trim()).filter(Boolean)
8222
+ : [t("lifecycle.assurance_no_findings")]),
8223
+ ].filter(Boolean);
8224
+ return detailField(
8225
+ reviewerLabel(review.reviewer, t("detail.specialist_review")),
8226
+ lines.join("\n"),
8227
+ true,
8228
+ );
8229
+ });
8230
+ return promptDetailCard(
8231
+ t("lifecycle.detail_assurance"), fields, true,
8232
+ "prompt-detail-card--assurance-reviews",
8233
+ );
8234
+ }
8212
8235
  function promptDetailProviderReviewSections(usage, reviewers, commitTimeline) {
8213
8236
  const usageCard = promptDetailUsageSection(usage);
8214
8237
  const reviewerCard = promptDetailReviewersSection(reviewers, { wide: false });
@@ -8242,6 +8265,11 @@ function renderPromptHistoryDetail(payload) {
8242
8265
  commitTimeline = payload?.commit_timeline || [],
8243
8266
  evidence = Array.isArray(payload?.evidence) ? payload.evidence : [],
8244
8267
  reviewers = Array.isArray(payload?.reviewers) ? payload.reviewers : [],
8268
+ assuranceReviews = Array.isArray(payload?.assurance_reviews)
8269
+ ? payload.assurance_reviews
8270
+ : (Array.isArray(payload?.lifecycle?.steps)
8271
+ ? payload.lifecycle.steps.find((step) => step?.id === "QUALITY_CONTROL_AGENT")?.assurance_reviews || []
8272
+ : []),
8245
8273
  activity = history.execution_activity_summary,
8246
8274
  recommendationHandoff = payload?.recommendation_handoff;
8247
8275
  const [executionSummary, executionContext] = promptDetailExecutionSections(history);
@@ -8266,6 +8294,7 @@ function renderPromptHistoryDetail(payload) {
8266
8294
  lifecycleFlow(payload?.lifecycle, { historical: true }),
8267
8295
  statusReconciliationCard(payload?.lifecycle?.recovery),
8268
8296
  promptDetailProviderReviewSections(usage, reviewers, commitTimeline),
8297
+ promptDetailAssuranceReviewsSection(assuranceReviews),
8269
8298
  promptDetailRecommendationHandoff(recommendationHandoff),
8270
8299
  ].filter(Boolean),
8271
8300
  );
@@ -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.75"
15
+ CURRENT_PLATFORM_VERSION = "2.3.77"
16
16
  MANIFEST_FIELDS = frozenset(
17
17
  {
18
18
  "platform_version",
@@ -87,7 +87,11 @@ from .component_logging import (
87
87
  component_logger,
88
88
  log_event,
89
89
  )
90
- from .agent_state import redact_diagnostic
90
+ from .agent_state import (
91
+ MAX_COMMIT_EVIDENCE_RECORDS,
92
+ is_valid_commit_evidence_record,
93
+ redact_diagnostic,
94
+ )
91
95
  from .codex_chat import (
92
96
  CHAT_RETENTION_DAYS,
93
97
  MAX_HISTORY_ITEMS,
@@ -3429,15 +3433,58 @@ def _central_console_validation_evidence(
3429
3433
  return projected
3430
3434
 
3431
3435
 
3436
+ def _central_console_checkpoint_commit_timeline(
3437
+ data_root: Path, project_id: str, submission_id: str, run_id: str, outcome: str,
3438
+ ) -> list[dict[str, str]]:
3439
+ """Project strict phase commits from one exactly bound terminal checkpoint."""
3440
+ try:
3441
+ with storage.sqlite_connection(data_root / SERVER_DATABASE_FILENAME) as connection:
3442
+ row = connection.execute(
3443
+ """SELECT t.payload,t.phase,d.state
3444
+ FROM engineering_transactions AS t
3445
+ JOIN ep_parity_lifecycle_dispatches AS d ON d.run_id=t.run_id
3446
+ WHERE d.project_id=? AND d.submission_id=? AND d.run_id=?""",
3447
+ (project_id, submission_id, run_id),
3448
+ ).fetchone()
3449
+ except sqlite3.Error:
3450
+ return []
3451
+ if row is None or row[1] != outcome or row[2] != outcome:
3452
+ return []
3453
+ try:
3454
+ checkpoint = json.loads(str(row[0]))
3455
+ except (TypeError, ValueError, json.JSONDecodeError):
3456
+ return []
3457
+ if (
3458
+ not isinstance(checkpoint, Mapping)
3459
+ or checkpoint.get("run_id") != run_id
3460
+ or checkpoint.get("phase") != outcome
3461
+ or checkpoint.get("terminal") is not True
3462
+ ):
3463
+ return []
3464
+ raw = checkpoint.get("commit_evidence")
3465
+ if (
3466
+ not isinstance(raw, list)
3467
+ or len(raw) > MAX_COMMIT_EVIDENCE_RECORDS
3468
+ or any(not is_valid_commit_evidence_record(item) for item in raw)
3469
+ ):
3470
+ return []
3471
+ events = [dict(item) for item in raw]
3472
+ identities = {(item["phase"], item["commit_sha"]) for item in events}
3473
+ if len(identities) != len(events):
3474
+ return []
3475
+ return sorted(events, key=lambda item: item["observed_at"])
3476
+
3477
+
3432
3478
  def _central_console_terminal_revision_timeline(
3433
3479
  data_root: Path, project_id: str, run_id: str,
3434
3480
  ) -> list[dict[str, str]]:
3435
- """Project an exact terminal artifact's verified repository revision.
3481
+ """Project verified phase commits plus an exact terminal revision fallback.
3436
3482
 
3437
- A successful no-change run has no phase commit to display, but its
3438
- integrity-verified terminal artifact can still attest the final repository
3439
- revision. This stays distinct from a phase commit: malformed or tampered
3440
- payloads never become Console evidence.
3483
+ The immutable terminal artifact first proves the project/submission/run
3484
+ binding. The terminal CENTRAL checkpoint then supplies the append-only
3485
+ phase commit records that the execution host actually verified. A
3486
+ successful no-change run has no phase commit, so its artifact revision is
3487
+ retained as a distinct fallback rather than being called a phase commit.
3441
3488
  """
3442
3489
  try:
3443
3490
  with storage.sqlite_connection(data_root / SERVER_DATABASE_FILENAME) as connection:
@@ -3449,6 +3496,7 @@ def _central_console_terminal_revision_timeline(
3449
3496
  WHERE d.project_id=? AND d.run_id=?
3450
3497
  AND a.artifact_type='EP_TERMINAL_EVIDENCE'
3451
3498
  AND a.integrity_status='VERIFIED'
3499
+ AND a.projection_status='AVAILABLE'
3452
3500
  ORDER BY a.created_at DESC,a.artifact_id DESC LIMIT 1""",
3453
3501
  (project_id, run_id),
3454
3502
  ).fetchone()
@@ -3472,25 +3520,31 @@ def _central_console_terminal_revision_timeline(
3472
3520
  repository = evidence.get("repository")
3473
3521
  if not all(isinstance(value, Mapping) for value in (submission, terminal_run, repository)):
3474
3522
  return []
3523
+ submission_id = submission.get("id")
3475
3524
  revision = repository.get("revision")
3476
3525
  outcome = terminal_run.get("outcome")
3477
3526
  if (
3478
3527
  submission.get("project_id") != project_id
3528
+ or not isinstance(submission_id, str)
3479
3529
  or terminal_run.get("id") != run_id
3480
3530
  or outcome not in {"COMPLETE", "BLOCKED", "FAILED"}
3481
- or not isinstance(revision, str)
3482
- or re.fullmatch(r"[0-9a-f]{40}", revision) is None
3483
3531
  ):
3484
3532
  return []
3485
3533
  observed_at = row[1]
3486
3534
  if not isinstance(observed_at, str) or not observed_at.strip():
3487
3535
  return []
3488
- return [{
3489
- "phase": "TERMINAL",
3490
- "observed_at": observed_at,
3491
- "commit_sha": revision,
3492
- "description": "terminal_repository_revision_verified",
3493
- }]
3536
+ events = _central_console_checkpoint_commit_timeline(
3537
+ data_root, project_id, submission_id, run_id, str(outcome),
3538
+ )
3539
+ if isinstance(revision, str) and re.fullmatch(r"[0-9a-f]{40}", revision):
3540
+ if not any(item["commit_sha"] == revision for item in events):
3541
+ events.append({
3542
+ "phase": "TERMINAL",
3543
+ "observed_at": observed_at,
3544
+ "commit_sha": revision,
3545
+ "description": "terminal_repository_revision_verified",
3546
+ })
3547
+ return sorted(events, key=lambda item: item["observed_at"])
3494
3548
 
3495
3549
 
3496
3550
  def _central_console_current_execution_diagnostic(data_root: Path, project_id: str) -> str | None:
@@ -3616,6 +3670,48 @@ def _central_console_reviewer_agents(
3616
3670
  return from_report or _central_console_invocation_reviewers(data_root, run_id)
3617
3671
 
3618
3672
 
3673
+ def _central_console_assurance_reviews(
3674
+ lifecycle: Mapping[str, object],
3675
+ ) -> list[dict[str, object]]:
3676
+ """Project the candidate-bound Quality/Security evidence separately.
3677
+
3678
+ Capability reviewers explain why a specialist was selected. Mandatory
3679
+ post-implementation assurance instead proves Quality and Security against
3680
+ one exact candidate. Keeping these contracts separate prevents terminal
3681
+ detail from hiding assurance or presenting a PASS as a recommendation.
3682
+ """
3683
+ steps = lifecycle.get("steps")
3684
+ if not isinstance(steps, list):
3685
+ return []
3686
+ quality_step = next((
3687
+ step for step in steps
3688
+ if isinstance(step, Mapping) and step.get("id") == "QUALITY_CONTROL_AGENT"
3689
+ ), None)
3690
+ reviews = quality_step.get("assurance_reviews") if isinstance(quality_step, Mapping) else None
3691
+ if not isinstance(reviews, list) or len(reviews) > 16:
3692
+ return []
3693
+ projected: list[dict[str, object]] = []
3694
+ for review in reviews:
3695
+ if not isinstance(review, Mapping):
3696
+ continue
3697
+ reviewer = review.get("reviewer")
3698
+ status = review.get("status")
3699
+ candidate_sha = review.get("candidate_sha")
3700
+ findings = review.get("findings")
3701
+ if (
3702
+ reviewer not in {"quality", "security"}
3703
+ or status not in {"PASS", "FAIL", "UNRESOLVED"}
3704
+ or not isinstance(candidate_sha, str)
3705
+ or re.fullmatch(r"[0-9a-f]{40}", candidate_sha) is None
3706
+ or not isinstance(findings, list)
3707
+ or len(findings) > 12
3708
+ or any(not isinstance(finding, Mapping) for finding in findings)
3709
+ ):
3710
+ continue
3711
+ projected.append(dict(review))
3712
+ return projected
3713
+
3714
+
3619
3715
  def _central_console_project_snapshot(data_root: Path, project_id: str) -> dict[str, object]:
3620
3716
  """Return the project status and terminal-history projections from CENTRAL.
3621
3717
 
@@ -3759,6 +3855,7 @@ def _central_console_run_detail(data_root: Path, project_id: str, run_id: str) -
3759
3855
  "runtime": runtime,
3760
3856
  "usage": _central_console_provider_usage(data_root, run_id),
3761
3857
  "reviewers": _central_console_reviewer_agents(data_root, project_id, run_id),
3858
+ "assurance_reviews": _central_console_assurance_reviews(lifecycle),
3762
3859
  "evidence": _central_console_validation_evidence(data_root, project_id, run_id),
3763
3860
  # The historical detail dialog uses the same read-only bubble flow as
3764
3861
  # the active card. Terminal history remains separate in the table,
@@ -5682,6 +5779,7 @@ class _HealthHandler(http.server.BaseHTTPRequestHandler):
5682
5779
  "execution": detail.get("execution", {}),
5683
5780
  "runtime": detail.get("runtime", {}),
5684
5781
  "reviewers": detail.get("reviewers", []),
5782
+ "assurance_reviews": detail.get("assurance_reviews", []),
5685
5783
  "commits": {},
5686
5784
  "commit_timeline": detail.get("commit_timeline", []),
5687
5785
  "pull_requests": [],
@@ -3,7 +3,7 @@
3
3
  "platform": {
4
4
  "id": "engineering-platform",
5
5
  "name": "Engineering Platform",
6
- "version": "2.3.75",
6
+ "version": "2.3.77",
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.75
3
+ Version: 2.3.77
4
4
  Summary: Local-first Engineering Platform execution operations runtime
5
5
  Author: Peter van Tol
6
6
  License: MIT