engineering-platform 2.3.97__tar.gz → 2.3.100__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 (173) hide show
  1. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/PKG-INFO +1 -1
  2. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/pyproject.toml +1 -1
  3. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json +1 -1
  4. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json +4 -4
  5. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/agent_state.py +1 -1
  6. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/assets/dashboard.css +4 -0
  7. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/assets/dashboard.js +45 -17
  8. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/capability_review.py +8 -1
  9. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_executor.py +47 -26
  10. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_host.py +12 -1
  11. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/platform_version.py +1 -1
  12. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/templates/workspace-config.json +1 -1
  13. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform.egg-info/PKG-INFO +1 -1
  14. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/README.md +0 -0
  15. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/setup.cfg +0 -0
  16. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/__init__.py +0 -0
  17. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/__main__.py +0 -0
  18. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/agent_trust.py +0 -0
  19. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/assets/dashboard_locales.mjs +0 -0
  20. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/assets/dashboard_status_store.mjs +0 -0
  21. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/assets/dashboard_translation.mjs +0 -0
  22. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/assets/operations-console/apple-touch-icon-dark.png +0 -0
  23. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/assets/operations-console/apple-touch-icon-light.png +0 -0
  24. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/assets/operations-console/icon-dark.png +0 -0
  25. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/assets/operations-console/icon-light.png +0 -0
  26. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/assets/operations-console/icon-transparent.png +0 -0
  27. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/assets/operations-console/manifest.webmanifest +0 -0
  28. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/assurance_scope.py +0 -0
  29. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/capability_preflight.py +0 -0
  30. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/central_data_transfer.py +0 -0
  31. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/central_database.py +0 -0
  32. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/central_operational_reset.py +0 -0
  33. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/central_store_migration.py +0 -0
  34. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/codex_capacity.py +0 -0
  35. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/codex_chat.py +0 -0
  36. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/codex_observability.py +0 -0
  37. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/component_lock.py +0 -0
  38. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/component_logging.py +0 -0
  39. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/console_presentation.py +0 -0
  40. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/console_route_ownership.py +0 -0
  41. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/contracts/__init__.py +0 -0
  42. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/contracts/ep_consumer.py +0 -0
  43. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/contracts/models.py +0 -0
  44. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/contracts/projection.py +0 -0
  45. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/dashboard_browser_validation.py +0 -0
  46. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/dashboard_state.py +0 -0
  47. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/dashboard_supervisor.swift +0 -0
  48. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/dashboard_translation.py +0 -0
  49. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/dependabot_producer.py +0 -0
  50. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/development_profile.py +0 -0
  51. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/drift_diagnostics.py +0 -0
  52. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/emergency_recovery.py +0 -0
  53. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/engineering_memory.py +0 -0
  54. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/ep_consumer_credentials.py +0 -0
  55. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/evidence_projection.py +0 -0
  56. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_activity.py +0 -0
  57. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_context.py +0 -0
  58. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_errors.py +0 -0
  59. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_evidence.py +0 -0
  60. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_finalization.py +0 -0
  61. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_host_evidence.py +0 -0
  62. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_lease.py +0 -0
  63. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_lifecycle.py +0 -0
  64. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_models.py +0 -0
  65. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_readiness.py +0 -0
  66. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_reporting.py +0 -0
  67. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_repository.py +0 -0
  68. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_timeout_policy.py +0 -0
  69. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_timing.py +0 -0
  70. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/execution_transaction.py +0 -0
  71. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/external_producer_binding.py +0 -0
  72. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/file_inbox.py +0 -0
  73. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/forensic_attribution.py +0 -0
  74. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/forensic_attribution_v2.py +0 -0
  75. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/forensic_delta.py +0 -0
  76. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/golden_scenario.py +0 -0
  77. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/historical_dashboard_configuration.py +0 -0
  78. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/host_admin.py +0 -0
  79. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/host_preflight.py +0 -0
  80. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/installation_relocation.py +0 -0
  81. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/installation_update_activation.py +0 -0
  82. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/installation_update_admission.py +0 -0
  83. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/installation_update_backup.py +0 -0
  84. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/installation_update_composition.py +0 -0
  85. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/installation_update_executor.py +0 -0
  86. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/installation_update_migration.py +0 -0
  87. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/installation_update_operation.py +0 -0
  88. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/installation_update_plan.py +0 -0
  89. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/installation_update_preparation.py +0 -0
  90. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/investigation_ledger.py +0 -0
  91. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/legacy_inbox_migration.py +0 -0
  92. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/legacy_installation_adoption.py +0 -0
  93. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/lifecycle_worker.py +0 -0
  94. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/live_status.py +0 -0
  95. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/local_api.py +0 -0
  96. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/local_api_keychain.py +0 -0
  97. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/local_repository_binding.py +0 -0
  98. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/managed_autonomy.py +0 -0
  99. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/managed_codex_runtime.py +0 -0
  100. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/managed_workspace_readiness.py +0 -0
  101. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/managed_workspace_recovery.py +0 -0
  102. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/merge_delegation.py +0 -0
  103. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/operational_installation.py +0 -0
  104. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/operational_installation_lock.py +0 -0
  105. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/operational_installation_record.py +0 -0
  106. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/owner_credential_recovery.py +0 -0
  107. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/parity_context.py +0 -0
  108. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/parity_lifecycle_dispatcher.py +0 -0
  109. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/platform_admin.py +0 -0
  110. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/platform_api.py +0 -0
  111. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/platform_bootstrap.py +0 -0
  112. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/platform_components.py +0 -0
  113. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/pr_check_repair.py +0 -0
  114. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/pr_evidence_backfill.py +0 -0
  115. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/producer.py +0 -0
  116. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/product_installation_readback.py +0 -0
  117. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/project_agent.py +0 -0
  118. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/project_agent_service.py +0 -0
  119. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/project_topology.py +0 -0
  120. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/prompt_history.py +0 -0
  121. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/provider_context.py +0 -0
  122. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/provider_context_benchmark.py +0 -0
  123. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/provider_context_scope.py +0 -0
  124. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/provider_interruption.py +0 -0
  125. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/provider_process_identity.py +0 -0
  126. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/provider_readiness.py +0 -0
  127. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/provider_recovery.py +0 -0
  128. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/provider_usage.py +0 -0
  129. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/providers.py +0 -0
  130. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/qualification.py +0 -0
  131. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/qualification_runtime.py +0 -0
  132. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/recommendation_handoff.py +0 -0
  133. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/reconciliation_adoption.py +0 -0
  134. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/release_operation.py +0 -0
  135. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/report_analysis.py +0 -0
  136. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/repository_attachment.py +0 -0
  137. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/repository_handoff.py +0 -0
  138. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/resources.py +0 -0
  139. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/reviewer_evidence.py +0 -0
  140. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/revision_binding.py +0 -0
  141. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/schemas/producer-readback-v1.2.schema.json +0 -0
  142. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/schemas/producer-readback-v1.3.schema.json +0 -0
  143. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/schemas/producer-readback-v1.schema.json +0 -0
  144. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/schemas/repository-attachment.schema.json +0 -0
  145. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/server.py +0 -0
  146. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/server_console_services.py +0 -0
  147. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/server_relay.py +0 -0
  148. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/server_service.py +0 -0
  149. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/status_model.py +0 -0
  150. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/status_reconciliation.py +0 -0
  151. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/storage.py +0 -0
  152. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/submission_cli.py +0 -0
  153. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/submission_intake.py +0 -0
  154. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/submission_service.py +0 -0
  155. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/system_installation_topology.py +0 -0
  156. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/system_server_service.py +0 -0
  157. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/telemetry.py +0 -0
  158. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/telemetry_contract.py +0 -0
  159. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/telemetry_export.py +0 -0
  160. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/telemetry_metrics.py +0 -0
  161. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/terminal_evidence_reconciliation.py +0 -0
  162. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/validation_identity.py +0 -0
  163. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/validation_profile.py +0 -0
  164. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/version_preparation_delivery.py +0 -0
  165. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/workspace_preflight.py +0 -0
  166. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/worktree_provenance.py +0 -0
  167. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform/worktree_tooling.py +0 -0
  168. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform.egg-info/SOURCES.txt +0 -0
  169. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform.egg-info/dependency_links.txt +0 -0
  170. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform.egg-info/entry_points.txt +0 -0
  171. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/src/engineering_platform.egg-info/top_level.txt +0 -0
  172. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/tests/test_adaptive_action_sizing_design.py +0 -0
  173. {engineering_platform-2.3.97 → engineering_platform-2.3.100}/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.97
3
+ Version: 2.3.100
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.97"
7
+ version = "2.3.100"
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.97",
6
+ "version": "2.3.100",
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.97",
4
+ "dashboard_version": "2.3.100",
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.97",
9
+ "platform_version": "2.3.100",
10
10
  "report_format": 2,
11
- "runner_version": "2.3.97",
11
+ "runner_version": "2.3.100",
12
12
  "status_model": 1,
13
13
  "storage_schema": 45,
14
- "watcher_version": "2.3.97"
14
+ "watcher_version": "2.3.100"
15
15
  }
@@ -490,7 +490,7 @@ class TransactionState:
490
490
  or not isinstance(review.get("completed_at"), str)
491
491
  ))
492
492
  or (set(review) == integral_review_fields and (
493
- review.get("contract_version") != "2.0"
493
+ review.get("contract_version") not in {"2.0", "3.0"}
494
494
  or not isinstance(review.get("started_at"), str)
495
495
  or not isinstance(review.get("completed_at"), str)
496
496
  or not isinstance(review.get("coverage"), list)
@@ -280,6 +280,7 @@ html[data-theme="light"] :is(#rateLimitReset,#codexCliUpdate){background:#e8fff5
280
280
  .prompt-detail-provider-review{display:grid;gap:18px;grid-column:1/-1;grid-template-columns:minmax(0,1fr) minmax(320px,.78fr)}@media (max-width:760px){.prompt-detail-provider-review{grid-template-columns:1fr}}
281
281
  .prompt-detail-provider-review-stack{display:grid;gap:18px;grid-column:1/-1}.prompt-detail-provider-review>.prompt-detail-card{align-self:stretch;box-sizing:border-box}.prompt-detail-card--commit-timeline{display:flex;flex-direction:column;min-height:0}.prompt-detail-commit-timeline__list{align-content:start;display:grid;flex:1;gap:10px;list-style:none;margin:0;max-height:none;min-height:0;overflow:auto;padding:0 8px 0 0;scrollbar-gutter:stable}.prompt-detail-commit-timeline__item{border-top:1px solid color-mix(in srgb,var(--category-color) 38%,transparent);display:grid;gap:3px;padding-top:10px}.prompt-detail-commit-timeline__item:first-child{border-top:0;padding-top:0}.prompt-detail-commit-timeline__meta{color:var(--dashboard-modal-muted);font-size:12px;line-height:1.35}.prompt-detail-commit-timeline__item code{font-size:12px;overflow-wrap:normal;white-space:nowrap}.prompt-detail-commit-timeline__item>span{font-size:13px;line-height:1.4;overflow-wrap:anywhere}
282
282
  .prompt-detail-card--evidence pre,.prompt-detail-card--reviewers pre,.prompt-detail-card--assurance-reviews pre{font-family:inherit}
283
+ .prompt-detail-assurance-review__content{display:grid;gap:5px;margin:0;white-space:normal}.prompt-detail-assurance-review__line{display:block;overflow-wrap:anywhere;white-space:pre-wrap}.assurance-review-status{align-items:center;display:inline-flex;gap:8px;width:max-content}.assurance-review-status__text{line-height:18px}
283
284
  .reviewer-agent__status--failed{background:#ff6b6b;box-shadow:0 0 8px #ff6b6b66;color:#351313;font:800 14px/1 system-ui;height:16px;width:16px}
284
285
  .prompt-detail-reviewer{border-top:1px solid color-mix(in srgb,var(--category-color) 45%,transparent);display:grid;gap:7px;padding-top:14px}.prompt-detail-reviewer:first-of-type{border-top:0;padding-top:0}.prompt-detail-reviewer h4{color:var(--category-color);font-size:16px;margin:0 0 4px}.prompt-detail-reviewer>.field{margin:2px 0 0}.prompt-detail-reviewer__status{align-items:center;display:inline-flex;gap:8px}.prompt-detail-reviewer__status-icon{align-items:center;border-radius:50%;display:inline-flex;flex:0 0 18px;font:800 12px/1 system-ui;height:18px;justify-content:center}.prompt-detail-reviewer__status-icon--completed{background:#51d88a;box-shadow:0 0 8px #51d88a66;color:#11261d}.prompt-detail-reviewer__status-icon--failed{background:#ff6b6b;box-shadow:0 0 8px #ff6b6b66;color:#351313}.prompt-detail-reviewer__status-icon--neutral{background:#9a9aa3;color:#202027}
285
286
  .prompt-detail-commit-timeline__phase{border-top:1px solid color-mix(in srgb,var(--category-color) 52%,transparent);list-style:none;padding:13px 0 0}.prompt-detail-commit-timeline__phase:first-child{border-top:0;padding-top:0}.prompt-detail-commit-timeline__phase h4{color:var(--category-color);font-size:12px;letter-spacing:.04em;margin:0 0 9px;text-transform:uppercase}.prompt-detail-commit-timeline__phase-entries{display:grid;gap:10px;list-style:none;margin:0;padding:0 0 2px}.prompt-detail-commit-timeline__phase-entries .prompt-detail-commit-timeline__item{border-top:0;padding-top:0}
@@ -886,6 +887,8 @@ html:not([data-theme="light"]) .dashboard-modal-shell{--modal-header-surface:col
886
887
  .dashboard-action--download:hover:not(:disabled){background:#f0b66a!important;border-color:#f0b66a!important;color:#201812!important}
887
888
  .dashboard-action--copy{background:#34283f!important;border-color:#d0a4ff!important;color:#eadcff!important}
888
889
  .dashboard-action--copy:hover:not(:disabled){background:#d0a4ff!important;border-color:#d0a4ff!important;color:#17151a!important}
890
+ .report-view-modal__reload{background:#3b281b!important;border-color:#f0b66a!important;color:#fff0dc!important;font-size:21px!important}
891
+ .report-view-modal__reload:hover:not(:disabled){background:#f0b66a!important;border-color:#f0b66a!important;color:#201812!important}
889
892
  .dashboard-action--destructive{background:#3a2028!important;border-color:#ff718f!important;color:#ffd9e1!important}
890
893
  .dashboard-action--destructive:hover:not(:disabled){background:#ff718f!important;border-color:#ff718f!important;color:#23131a!important}
891
894
  .operator-merge-wait{grid-column:1/-1}.operator-merge-wait__actions{align-items:stretch;display:flex;flex-wrap:wrap;gap:10px}.operator-merge-wait__actions .dashboard-action{border-radius:10px;flex:1 1 15rem;font:700 15px/1.25 system-ui;height:auto;justify-content:center;min-height:40px;min-width:0;padding:8px 14px;text-align:center;text-decoration:none;width:auto}.operator-merge-wait__actions .dashboard-action--primary{background:#3b281b!important;border-color:#f0b66a!important;color:#fff0dc!important}.operator-merge-wait__actions .dashboard-action--primary:hover:not(:disabled){background:#f0b66a!important;border-color:#f0b66a!important;color:#201812!important}
@@ -900,6 +903,7 @@ html[data-theme="light"] .operator-merge-wait__actions .dashboard-action--primar
900
903
  .operator-merge-wait__actions .dashboard-action--destructive::before,#operatorMergeWaitModal .dashboard-modal-shell__action--destructive::before{text-shadow:.35px 0 currentColor,-.35px 0 currentColor}
901
904
  html[data-theme="light"] .dashboard-action--copy{background:#fff7ff!important;border-color:#b99ae5!important;color:#68498a!important}
902
905
  html[data-theme="light"] .dashboard-action--copy:hover:not(:disabled){background:#d0a4ff!important;border-color:#d0a4ff!important;color:#17151a!important}
906
+ html[data-theme="light"] .report-view-modal__reload{background:#fff8ef!important;border-color:#d68b23!important;color:#643a13!important}
903
907
  html[data-theme="light"] .dashboard-action--destructive{background:#fff1f4!important;border-color:#ff718f!important;color:#b32649!important}
904
908
 
905
909
  /* Keep late modal-family rules from drifting the shared title scale. */
@@ -144,6 +144,32 @@ function assuranceStatusLabel(value, fallback = t("format.not_available")) {
144
144
  if (!raw) return fallback;
145
145
  return t(`lifecycle.assurance_status.${reviewerKey(raw)}`, {}, raw);
146
146
  }
147
+ function assuranceStatusPresentation(value) {
148
+ const status = String(value || "UNRESOLVED").toUpperCase();
149
+ const passed = status === "PASS", failed = ["FAIL", "FAILED", "UNRESOLVED"].includes(status);
150
+ return {
151
+ glyph: passed ? "✓" : failed ? "×" : "•",
152
+ label: assuranceStatusLabel(status, status),
153
+ tone: passed ? "passed" : failed ? "failed" : "neutral",
154
+ };
155
+ }
156
+ function assuranceStatusIcon(presentation) {
157
+ const icon = document.createElement("span");
158
+ icon.className = "assurance-review-status__icon assurance-review-status__icon--" + presentation.tone
159
+ + " lifecycle-detail-modal__assurance-status lifecycle-detail-modal__assurance-status--" + presentation.tone;
160
+ icon.setAttribute("aria-hidden", "true");
161
+ icon.textContent = presentation.glyph;
162
+ return icon;
163
+ }
164
+ function assuranceStatusRow(value) {
165
+ const presentation = assuranceStatusPresentation(value), row = document.createElement("span"),
166
+ text = document.createElement("span");
167
+ row.className = "assurance-review-status";
168
+ text.className = "assurance-review-status__text";
169
+ text.textContent = presentation.label;
170
+ row.append(assuranceStatusIcon(presentation), text);
171
+ return row;
172
+ }
147
173
  function reviewerCapabilityLabel(value, fallback = t("format.not_available")) {
148
174
  const raw = String(value || "").trim();
149
175
  return raw ? enumLabel(raw.toUpperCase(), raw) : fallback;
@@ -2166,17 +2192,11 @@ function lifecycleAssuranceEvidence(step) {
2166
2192
  if (!review || typeof review !== "object") continue;
2167
2193
  const findings = Array.isArray(review.findings) ? review.findings : [];
2168
2194
  const item = document.createElement("li"), heading = document.createElement("strong"),
2169
- statusIcon = document.createElement("span"), status = String(review.status || "UNRESOLVED"),
2170
- normalizedStatus = status.toUpperCase();
2195
+ status = String(review.status || "UNRESOLVED"), statusPresentation = assuranceStatusPresentation(status);
2171
2196
  const role = String(review.reviewer || "");
2172
- const passed = normalizedStatus === "PASS", failed = ["FAIL", "FAILED", "UNRESOLVED"].includes(normalizedStatus);
2173
2197
  heading.className = "lifecycle-detail-modal__assurance-heading";
2174
- statusIcon.className = "lifecycle-detail-modal__assurance-status lifecycle-detail-modal__assurance-status--"
2175
- + (passed ? "passed" : failed ? "failed" : "neutral");
2176
- statusIcon.setAttribute("aria-hidden", "true");
2177
- statusIcon.textContent = passed ? "✓" : failed ? "×" : "•";
2178
- heading.append(statusIcon, Object.assign(document.createElement("span"), {
2179
- textContent: `${reviewerLabel(role, role)} · ${assuranceStatusLabel(status, status)}`,
2198
+ heading.append(assuranceStatusIcon(statusPresentation), Object.assign(document.createElement("span"), {
2199
+ textContent: `${reviewerLabel(role, role)} · ${statusPresentation.label}`,
2180
2200
  }));
2181
2201
  item.append(heading);
2182
2202
  const summary = findings.map((finding) => String(finding?.observation || "").trim()).filter(Boolean).join("; ");
@@ -8021,11 +8041,13 @@ function promptHistoryReportReloadButton() {
8021
8041
  let button = $("promptHistoryReportReload");
8022
8042
  if (button) return button;
8023
8043
  button = document.createElement("button");
8024
- button.className = "dashboard-action dashboard-action--primary report-analysis-retry";
8044
+ button.className = "dashboard-action report-view-modal__reload report-analysis-retry";
8025
8045
  button.id = "promptHistoryReportReload";
8026
8046
  button.type = "button";
8027
8047
  button.hidden = true;
8028
- button.textContent = t("history.retry_report_load");
8048
+ button.textContent = "↻";
8049
+ button.setAttribute("aria-label", t("history.retry_report_load"));
8050
+ button.title = t("history.retry_report_load");
8029
8051
  button.addEventListener("click", () => { void reloadPromptHistoryReport(); });
8030
8052
  $("promptHistoryReportDownload").before(button);
8031
8053
  return button;
@@ -8643,18 +8665,24 @@ function promptDetailAssuranceReviewsSection(reviews) {
8643
8665
  const fields = reviews.map((review) => {
8644
8666
  const findings = Array.isArray(review.findings) ? review.findings : [];
8645
8667
  const candidate = String(review.candidate_sha || "").trim();
8668
+ const field = detailField(
8669
+ reviewerLabel(review.reviewer, t("detail.specialist_review")),
8670
+ "",
8671
+ true,
8672
+ );
8673
+ const content = field.lastElementChild;
8674
+ content.className = "prompt-detail-assurance-review__content";
8675
+ content.replaceChildren(assuranceStatusRow(review.status || "UNRESOLVED"));
8646
8676
  const lines = [
8647
- assuranceStatusLabel(review.status || "UNRESOLVED"),
8648
8677
  candidate ? t("detail.candidate_sha") + ": " + candidate : null,
8649
8678
  ...(findings.length
8650
8679
  ? findings.map((finding) => String(finding?.observation || "").trim()).filter(Boolean)
8651
8680
  : [t("lifecycle.assurance_no_findings")]),
8652
8681
  ].filter(Boolean);
8653
- return detailField(
8654
- reviewerLabel(review.reviewer, t("detail.specialist_review")),
8655
- lines.join("\n"),
8656
- true,
8657
- );
8682
+ for (const line of lines) content.append(Object.assign(document.createElement("span"), {
8683
+ className: "prompt-detail-assurance-review__line", textContent: line,
8684
+ }));
8685
+ return field;
8658
8686
  });
8659
8687
  return promptDetailCard(
8660
8688
  t("lifecycle.detail_assurance"), fields, true,
@@ -45,7 +45,7 @@ REVIEWER_LABELS = {
45
45
  "finalization": "Finalization Reviewer",
46
46
  }
47
47
  ADVISORY_REVIEW_OUTPUT_CONTRACT_VERSION = "1.0"
48
- MANDATORY_REVIEW_OUTPUT_CONTRACT_VERSION = "2.0"
48
+ MANDATORY_REVIEW_OUTPUT_CONTRACT_VERSION = "3.0"
49
49
  MANDATORY_FINDING_FIELDS = frozenset({
50
50
  "id", "observation", "category", "criterion", "severity", "confidence", "evidence_ref",
51
51
  })
@@ -103,6 +103,13 @@ class ReviewerSelection:
103
103
  selected_because: str
104
104
  confidence: float
105
105
  capability: str = "engineering"
106
+ # Mandatory assurance is selected by the host for one immutable delivery
107
+ # role and one exact set of still-open findings. Carry that host-owned
108
+ # contract across the provider boundary so the structured-output schema
109
+ # cannot admit a broader, incomplete response that the deterministic
110
+ # validator must subsequently reject.
111
+ required_coverage_surfaces: tuple[str, ...] = ()
112
+ required_finding_ids: tuple[str, ...] = ()
106
113
 
107
114
 
108
115
  @dataclass(frozen=True)
@@ -22,7 +22,6 @@ from .capability_review import (
22
22
  MANDATORY_REVIEW_OUTPUT_CONTRACT_VERSION,
23
23
  ReviewerResult,
24
24
  ReviewerSelection,
25
- mandatory_coverage_surfaces,
26
25
  reviewer_prompt,
27
26
  )
28
27
  from .codex_observability import codex_final_message as _codex_final_message, extract_codex_runtime_metadata, extract_codex_usage
@@ -544,34 +543,39 @@ class CodexCliClient:
544
543
  }
545
544
  if mandatory:
546
545
  required.extend(("coverage", "finding_dispositions"))
547
- surfaces = sorted({
548
- surface
549
- for role in ("IMPLEMENTATION", "FINALIZATION", "RECONCILIATION")
550
- for surface in mandatory_coverage_surfaces(selection.reviewer, role)
551
- })
546
+ surfaces = selection.required_coverage_surfaces
547
+ prior_finding_ids = selection.required_finding_ids
552
548
  properties.update({
553
549
  "coverage": {
554
- "type": "array", "maxItems": 16,
555
- "items": {
556
- "type": "object", "additionalProperties": False,
557
- "required": ["surface", "status", "evidence_ref"],
558
- "properties": {
559
- "surface": {"type": "string", "enum": surfaces},
560
- "status": {"type": "string", "enum": ["REVIEWED", "NOT_APPLICABLE"]},
561
- "evidence_ref": {"type": "string", "maxLength": 240},
562
- },
550
+ "type": "object",
551
+ "additionalProperties": False,
552
+ "required": list(surfaces),
553
+ "properties": {
554
+ surface: {
555
+ "type": "object", "additionalProperties": False,
556
+ "required": ["status", "evidence_ref"],
557
+ "properties": {
558
+ "status": {"type": "string", "enum": ["REVIEWED", "NOT_APPLICABLE"]},
559
+ "evidence_ref": {"type": "string", "maxLength": 240},
560
+ },
561
+ }
562
+ for surface in surfaces
563
563
  },
564
564
  },
565
565
  "finding_dispositions": {
566
- "type": "array", "maxItems": 64,
567
- "items": {
568
- "type": "object", "additionalProperties": False,
569
- "required": ["finding_id", "disposition", "evidence_ref"],
570
- "properties": {
571
- "finding_id": {"type": "string", "maxLength": 240},
572
- "disposition": {"type": "string", "enum": ["RESOLVED", "OPEN"]},
573
- "evidence_ref": {"type": "string", "maxLength": 240},
574
- },
566
+ "type": "object",
567
+ "additionalProperties": False,
568
+ "required": list(prior_finding_ids),
569
+ "properties": {
570
+ finding_id: {
571
+ "type": "object", "additionalProperties": False,
572
+ "required": ["disposition", "evidence_ref"],
573
+ "properties": {
574
+ "disposition": {"type": "string", "enum": ["RESOLVED", "OPEN"]},
575
+ "evidence_ref": {"type": "string", "maxLength": 240},
576
+ },
577
+ }
578
+ for finding_id in prior_finding_ids
575
579
  },
576
580
  },
577
581
  })
@@ -632,6 +636,23 @@ class CodexCliClient:
632
636
  )
633
637
  try:
634
638
  raw = json.loads(_codex_final_message(completed.stdout))
639
+ raw_coverage = raw.get("coverage", {})
640
+ raw_dispositions = raw.get("finding_dispositions", {})
641
+ if mandatory and (
642
+ not isinstance(raw_coverage, dict)
643
+ or set(raw_coverage) != set(selection.required_coverage_surfaces)
644
+ or not isinstance(raw_dispositions, dict)
645
+ or set(raw_dispositions) != set(selection.required_finding_ids)
646
+ ):
647
+ raise TypeError("mandatory assurance response does not match the host-owned contract")
648
+ coverage = tuple(
649
+ {"surface": surface, **dict(raw_coverage[surface])}
650
+ for surface in selection.required_coverage_surfaces
651
+ ) if mandatory else ()
652
+ finding_dispositions = tuple(
653
+ {"finding_id": finding_id, **dict(raw_dispositions[finding_id])}
654
+ for finding_id in selection.required_finding_ids
655
+ ) if mandatory else ()
635
656
  return ReviewerResult(
636
657
  selection.reviewer,
637
658
  str(raw["contribution"]),
@@ -641,8 +662,8 @@ class CodexCliClient:
641
662
  usage=dict(self.last_usage), runtime_metadata=dict(self.last_runtime_metadata),
642
663
  churn=dict(self.last_churn), duration_seconds=self.last_execution_seconds,
643
664
  usage_snapshots=self.last_usage_snapshots,
644
- coverage=tuple(dict(value) for value in raw.get("coverage", ())),
645
- finding_dispositions=tuple(dict(value) for value in raw.get("finding_dispositions", ())),
665
+ coverage=coverage,
666
+ finding_dispositions=finding_dispositions,
646
667
  )
647
668
  except (IndexError, KeyError, TypeError, json.JSONDecodeError):
648
669
  return ReviewerResult(
@@ -2530,6 +2530,11 @@ Host-owned validation evidence (candidate-bound, command-terminal receipts):
2530
2530
  prior_findings = self._unresolved_assurance_findings(quality, reviewer=selection.reviewer)
2531
2531
  prior_finding_ids = tuple(str(finding["id"]) for finding in prior_findings)
2532
2532
  required_surfaces = mandatory_coverage_surfaces(selection.reviewer, role)
2533
+ contracted_selection = replace(
2534
+ selection,
2535
+ required_coverage_surfaces=required_surfaces,
2536
+ required_finding_ids=prior_finding_ids,
2537
+ )
2533
2538
  assurance_objective = (
2534
2539
  f"Mandatory {selection.reviewer} assurance. Profile {profile_version} ({profile_digest}); "
2535
2540
  f"candidate {candidate.head_sha}. This is an integral candidate review, not a review of only the latest repair. "
@@ -2542,7 +2547,13 @@ Host-owned validation evidence (candidate-bound, command-terminal receipts):
2542
2547
  + criteria
2543
2548
  )
2544
2549
  started_at = datetime.now(timezone.utc).isoformat()
2545
- result = run_reviews(assurance_root or self.root, (selection,), assurance_objective, self.agent if hasattr(self.agent, "review") else None, evidence=evidence)[0]
2550
+ result = run_reviews(
2551
+ assurance_root or self.root,
2552
+ (contracted_selection,),
2553
+ assurance_objective,
2554
+ self.agent if hasattr(self.agent, "review") else None,
2555
+ evidence=evidence,
2556
+ )[0]
2546
2557
  completed_at = datetime.now(timezone.utc).isoformat()
2547
2558
  try:
2548
2559
  unchanged = self._inspect_assurance_candidate(candidate_root, state.execution_mode)
@@ -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.97"
15
+ CURRENT_PLATFORM_VERSION = "2.3.100"
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.97",
6
+ "version": "2.3.100",
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.97
3
+ Version: 2.3.100
4
4
  Summary: Local-first Engineering Platform execution operations runtime
5
5
  Author: Peter van Tol
6
6
  License: MIT