engineering-platform 2.3.76__tar.gz → 2.3.78__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 (167) hide show
  1. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/PKG-INFO +1 -1
  2. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/pyproject.toml +1 -1
  3. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json +1 -1
  4. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json +4 -4
  5. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/dashboard.css +1 -0
  6. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/dashboard.js +291 -72
  7. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/dashboard_locales.mjs +16 -0
  8. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/codex_observability.py +8 -2
  9. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_executor.py +31 -12
  10. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_host.py +2 -1
  11. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_reporting.py +110 -40
  12. engineering_platform-2.3.78/src/engineering_platform/execution_timing.py +668 -0
  13. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/platform_version.py +1 -1
  14. engineering_platform-2.3.78/src/engineering_platform/provider_usage.py +894 -0
  15. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/server.py +308 -19
  16. engineering_platform-2.3.78/src/engineering_platform/telemetry_contract.py +346 -0
  17. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/templates/workspace-config.json +1 -1
  18. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform.egg-info/PKG-INFO +1 -1
  19. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform.egg-info/SOURCES.txt +1 -0
  20. engineering_platform-2.3.76/src/engineering_platform/execution_timing.py +0 -442
  21. engineering_platform-2.3.76/src/engineering_platform/provider_usage.py +0 -497
  22. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/README.md +0 -0
  23. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/setup.cfg +0 -0
  24. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/__init__.py +0 -0
  25. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/__main__.py +0 -0
  26. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/agent_state.py +0 -0
  27. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/agent_trust.py +0 -0
  28. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/dashboard_status_store.mjs +0 -0
  29. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/dashboard_translation.mjs +0 -0
  30. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/operations-console/apple-touch-icon-dark.png +0 -0
  31. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/operations-console/apple-touch-icon-light.png +0 -0
  32. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/operations-console/icon-dark.png +0 -0
  33. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/operations-console/icon-light.png +0 -0
  34. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/operations-console/icon-transparent.png +0 -0
  35. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/assets/operations-console/manifest.webmanifest +0 -0
  36. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/capability_preflight.py +0 -0
  37. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/capability_review.py +0 -0
  38. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/central_data_transfer.py +0 -0
  39. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/central_database.py +0 -0
  40. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/central_store_migration.py +0 -0
  41. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/codex_capacity.py +0 -0
  42. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/codex_chat.py +0 -0
  43. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/component_lock.py +0 -0
  44. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/component_logging.py +0 -0
  45. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/console_presentation.py +0 -0
  46. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/console_route_ownership.py +0 -0
  47. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/contracts/__init__.py +0 -0
  48. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/contracts/ep_consumer.py +0 -0
  49. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/contracts/models.py +0 -0
  50. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/contracts/projection.py +0 -0
  51. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/dashboard_browser_validation.py +0 -0
  52. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/dashboard_state.py +0 -0
  53. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/dashboard_supervisor.swift +0 -0
  54. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/dashboard_translation.py +0 -0
  55. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/dependabot_producer.py +0 -0
  56. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/development_profile.py +0 -0
  57. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/drift_diagnostics.py +0 -0
  58. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/emergency_recovery.py +0 -0
  59. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/engineering_memory.py +0 -0
  60. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/ep_consumer_credentials.py +0 -0
  61. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/evidence_projection.py +0 -0
  62. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_activity.py +0 -0
  63. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_context.py +0 -0
  64. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_errors.py +0 -0
  65. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_evidence.py +0 -0
  66. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_finalization.py +0 -0
  67. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_host_evidence.py +0 -0
  68. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_lease.py +0 -0
  69. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_lifecycle.py +0 -0
  70. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_models.py +0 -0
  71. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_readiness.py +0 -0
  72. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_repository.py +0 -0
  73. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_timeout_policy.py +0 -0
  74. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/execution_transaction.py +0 -0
  75. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/external_producer_binding.py +0 -0
  76. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/file_inbox.py +0 -0
  77. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/forensic_attribution.py +0 -0
  78. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/forensic_attribution_v2.py +0 -0
  79. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/forensic_delta.py +0 -0
  80. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/golden_scenario.py +0 -0
  81. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/historical_dashboard_configuration.py +0 -0
  82. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/host_admin.py +0 -0
  83. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/host_preflight.py +0 -0
  84. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_relocation.py +0 -0
  85. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_activation.py +0 -0
  86. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_admission.py +0 -0
  87. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_backup.py +0 -0
  88. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_composition.py +0 -0
  89. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_executor.py +0 -0
  90. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_migration.py +0 -0
  91. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_operation.py +0 -0
  92. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_plan.py +0 -0
  93. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/installation_update_preparation.py +0 -0
  94. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/investigation_ledger.py +0 -0
  95. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/legacy_inbox_migration.py +0 -0
  96. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/legacy_installation_adoption.py +0 -0
  97. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/lifecycle_worker.py +0 -0
  98. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/live_status.py +0 -0
  99. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/local_api.py +0 -0
  100. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/local_api_keychain.py +0 -0
  101. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/local_repository_binding.py +0 -0
  102. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/managed_autonomy.py +0 -0
  103. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/managed_codex_runtime.py +0 -0
  104. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/operational_installation.py +0 -0
  105. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/operational_installation_lock.py +0 -0
  106. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/operational_installation_record.py +0 -0
  107. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/owner_credential_recovery.py +0 -0
  108. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/parity_context.py +0 -0
  109. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/parity_lifecycle_dispatcher.py +0 -0
  110. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/platform_admin.py +0 -0
  111. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/platform_api.py +0 -0
  112. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/platform_bootstrap.py +0 -0
  113. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/platform_components.py +0 -0
  114. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/pr_check_repair.py +0 -0
  115. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/pr_evidence_backfill.py +0 -0
  116. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/producer.py +0 -0
  117. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/product_installation_readback.py +0 -0
  118. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/project_agent.py +0 -0
  119. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/project_agent_service.py +0 -0
  120. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/project_topology.py +0 -0
  121. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/prompt_history.py +0 -0
  122. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_context.py +0 -0
  123. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_context_benchmark.py +0 -0
  124. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_context_scope.py +0 -0
  125. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_interruption.py +0 -0
  126. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_process_identity.py +0 -0
  127. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_readiness.py +0 -0
  128. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/provider_recovery.py +0 -0
  129. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/providers.py +0 -0
  130. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/qualification.py +0 -0
  131. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/qualification_runtime.py +0 -0
  132. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/recommendation_handoff.py +0 -0
  133. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/reconciliation_adoption.py +0 -0
  134. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/release_operation.py +0 -0
  135. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/report_analysis.py +0 -0
  136. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/repository_attachment.py +0 -0
  137. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/repository_handoff.py +0 -0
  138. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/resources.py +0 -0
  139. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/reviewer_evidence.py +0 -0
  140. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/revision_binding.py +0 -0
  141. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/schemas/producer-readback-v1.2.schema.json +0 -0
  142. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/schemas/producer-readback-v1.schema.json +0 -0
  143. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/schemas/repository-attachment.schema.json +0 -0
  144. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/server_console_services.py +0 -0
  145. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/server_relay.py +0 -0
  146. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/server_service.py +0 -0
  147. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/status_model.py +0 -0
  148. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/status_reconciliation.py +0 -0
  149. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/storage.py +0 -0
  150. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/submission_cli.py +0 -0
  151. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/submission_intake.py +0 -0
  152. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/submission_service.py +0 -0
  153. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/system_installation_topology.py +0 -0
  154. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/system_server_service.py +0 -0
  155. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/telemetry.py +0 -0
  156. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/terminal_evidence_reconciliation.py +0 -0
  157. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/validation_identity.py +0 -0
  158. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/validation_profile.py +0 -0
  159. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/version_preparation_delivery.py +0 -0
  160. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/workspace_preflight.py +0 -0
  161. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/worktree_provenance.py +0 -0
  162. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform/worktree_tooling.py +0 -0
  163. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform.egg-info/dependency_links.txt +0 -0
  164. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform.egg-info/entry_points.txt +0 -0
  165. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/src/engineering_platform.egg-info/top_level.txt +0 -0
  166. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/tests/test_adaptive_action_sizing_design.py +0 -0
  167. {engineering_platform-2.3.76 → engineering_platform-2.3.78}/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.76
3
+ Version: 2.3.78
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.76"
7
+ version = "2.3.78"
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.76",
6
+ "version": "2.3.78",
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.76",
4
+ "dashboard_version": "2.3.78",
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.76",
9
+ "platform_version": "2.3.78",
10
10
  "report_format": 2,
11
- "runner_version": "2.3.76",
11
+ "runner_version": "2.3.78",
12
12
  "status_model": 1,
13
13
  "storage_schema": 45,
14
- "watcher_version": "2.3.76"
14
+ "watcher_version": "2.3.78"
15
15
  }
@@ -1328,3 +1328,4 @@ button:where(:not(.theme-toggle,.section-state-toggle,.local-folder-link,.teleme
1328
1328
  html[data-theme="light"] :is(.dashboard-status-banner--provider-auth_required .provider-readiness-banner__action,.configuration-provider-status__row[data-provider-state="AUTH_REQUIRED"] .configuration-provider-status__repair){
1329
1329
  background-color:color-mix(in srgb,#b89025 14%,#fff)!important;
1330
1330
  }
1331
+ .telemetry-note{color:var(--dashboard-muted,#b9b6c0);font-size:12px;line-height:1.45;margin:0 0 10px}.telemetry-run-detail{border-top:1px solid color-mix(in srgb,var(--category-color,#fb7185) 45%,transparent);display:grid;gap:16px;margin-top:16px;padding-top:16px}.telemetry-run-detail h4{color:var(--category-color,#fb7185);font-size:14px;margin:14px 0 8px}.telemetry-scope-switcher{display:flex;flex-wrap:wrap;gap:8px}.telemetry-scope-switcher button{background:var(--dashboard-expanded-content-surface,#24242d);border:1px solid color-mix(in srgb,var(--category-color,#fb7185) 72%,transparent);border-radius:7px;color:inherit;cursor:pointer;font:400 12px/1.2 system-ui;min-height:32px;padding:5px 9px}.telemetry-scope-switcher button:hover{background:color-mix(in srgb,var(--category-color,#fb7185) 14%,var(--dashboard-expanded-content-surface,#24242d));border-color:var(--category-color,#fb7185)}.telemetry-scope-switcher button[aria-selected="true"]{background:color-mix(in srgb,var(--category-color,#fb7185) 24%,var(--dashboard-expanded-content-surface,#24242d));border-color:var(--category-color,#fb7185);box-shadow:inset 3px 0 0 var(--category-color,#fb7185)}.telemetry-scope-switcher button:focus:not(:focus-visible){box-shadow:none!important;outline:0!important}.telemetry-scope-switcher button[aria-selected="true"]:focus:not(:focus-visible){box-shadow:inset 3px 0 0 var(--category-color,#fb7185)!important}.telemetry-timeline{display:grid;gap:5px;list-style:none;margin:0;padding:0}.telemetry-timeline li{border-left:2px solid color-mix(in srgb,var(--category-color,#fb7185) 60%,transparent);margin-left:calc(var(--timeline-depth,0) * 14px);padding:6px 8px;word-break:break-word}@media(max-width:620px){.telemetry-detail-modal__content .technical-grid{grid-template-columns:minmax(0,1fr)}.telemetry-scope-switcher{position:sticky;top:0;background:var(--dashboard-expanded-content-surface,#24242d);padding-block:6px;z-index:2}.telemetry-timeline li{margin-left:min(calc(var(--timeline-depth,0) * 9px),45px)}}
@@ -4337,6 +4337,7 @@ function renderLegacyExecutionTelemetry(rows) {
4337
4337
  }
4338
4338
  function telemetryDuration(seconds) {
4339
4339
  if (typeof seconds !== "number" || seconds < 0) return "—";
4340
+ if (seconds > 0 && seconds < 1) return t("telemetry.less_than_one_second");
4340
4341
  const minutes = Math.floor(seconds / 60),
4341
4342
  remaining = Math.round(seconds % 60);
4342
4343
  return (minutes ? minutes + " min " : "") + remaining + " sec";
@@ -4619,6 +4620,23 @@ function executionTelemetry(rows) {
4619
4620
  }
4620
4621
  let telemetryDetailTrigger = null, telemetryDetailPayload = null, telemetryDetailDate = null, telemetryDetailRequestId = 0;
4621
4622
  function telemetryMs(value) { return typeof value === "number" && value >= 0 ? telemetryDuration(value / 1000) : t("format.unavailable"); }
4623
+ function telemetryNumber(value) {
4624
+ return typeof value === "number" && Number.isFinite(value)
4625
+ ? locale.number(value, { maximumFractionDigits: 3 })
4626
+ : t("format.unavailable");
4627
+ }
4628
+ function telemetryCoverage(metric) {
4629
+ if (!metric || typeof metric !== "object") return t("format.unavailable");
4630
+ const state = t("telemetry.coverage." + String(metric.coverage || metric.state || "UNAVAILABLE").toLowerCase(), {}, metric.coverage || metric.state || "UNAVAILABLE");
4631
+ const observed = metric.observed_observations, expected = metric.expected_observations;
4632
+ return Number.isFinite(observed) && Number.isFinite(expected) ? `${state} (${observed}/${expected})` : state;
4633
+ }
4634
+ function telemetryMetricValue(metric) {
4635
+ if (!metric || typeof metric !== "object" || metric.value == null) {
4636
+ return metric?.missing_reason ? `${t("format.unavailable")} — ${metric.missing_reason}` : t("format.unavailable");
4637
+ }
4638
+ return `${telemetryNumber(metric.value)} · ${telemetryCoverage(metric)}`;
4639
+ }
4622
4640
  function telemetryPercent(value) {
4623
4641
  const percent = Number(value);
4624
4642
  return Number.isFinite(percent)
@@ -4708,39 +4726,71 @@ function telemetryMarkdownTable(headings, rows) {
4708
4726
  ].join("\n");
4709
4727
  }
4710
4728
  function telemetryDetailMarkdown(detail, date) {
4711
- const summary = detail?.summary || {}, phases = Array.isArray(detail?.phases) ? detail.phases : [];
4729
+ const summary = detail?.summary || {}, phases = Array.isArray(detail?.inclusive_phases) ? detail.inclusive_phases : Array.isArray(detail?.phases) ? detail.phases : [];
4730
+ const exclusive = Array.isArray(detail?.exclusive_distribution) ? detail.exclusive_distribution : [];
4712
4731
  const runs = Array.isArray(detail?.runs) ? detail.runs : [], bottlenecks = detail?.bottlenecks || {};
4732
+ const usage = summary.usage || {};
4713
4733
  const summaryRows = [
4714
4734
  [t("telemetry.executions"), summary.executions ?? 0], [t("telemetry.complete"), summary.completed ?? 0],
4715
4735
  [t("telemetry.blocked"), summary.blocked ?? 0], [t("telemetry.failed"), summary.failed ?? 0],
4716
- [t("telemetry.average_total"), telemetryMs(summary.total_wall_time?.average_ms)],
4717
- [t("telemetry.median_total"), telemetryMs(summary.total_wall_time?.median_ms)],
4718
- [t("telemetry.active_processing"), telemetryMs(summary.active_processing_time?.average_ms)],
4719
- [t("telemetry.average_wait"), telemetryMs(summary.queue_wait?.average_ms)],
4720
- [t("telemetry.provider"), telemetryMs(summary.provider_execution?.average_ms)],
4721
- [t("telemetry.validation"), telemetryMs(summary.validation?.average_ms)],
4736
+ [t("telemetry.population"), `N=${summary.population ?? summary.executions ?? 0}`],
4737
+ [t("telemetry.elapsed"), telemetryMs(summary.total_wall_time?.average_ms)],
4738
+ [t("telemetry.provider_unique_coverage"), telemetryMs(summary.provider_unique_coverage?.average_ms)],
4739
+ [t("telemetry.provider_cumulative_process"), telemetryMs(summary.provider_cumulative_process?.average_ms)],
4722
4740
  [t("telemetry.external_wait"), telemetryMs(summary.external_wait?.average_ms)],
4723
- [t("telemetry.overhead"), telemetryMs(summary.overhead?.average_ms)],
4741
+ [t("telemetry.unassigned"), telemetryMs(summary.unassigned?.average_ms)],
4742
+ [t("telemetry.observed_input"), telemetryMetricValue(usage.input_tokens)],
4743
+ [t("telemetry.observed_output"), telemetryMetricValue(usage.output_tokens)],
4744
+ [t("telemetry.cache_ratio"), telemetryPercent(summary.cache_ratio_percent)],
4745
+ [t("telemetry.contract_version"), detail?.contract_version || t("format.unavailable")],
4724
4746
  ];
4725
4747
  const phaseRows = phases.map((phase) => [telemetryLabel(phase.phase), telemetryMs(phase.average_ms), telemetryMs(phase.median_ms), telemetryMs(phase.total_ms), telemetryPercent(phase.share_percent), phase.runs]);
4748
+ const exclusiveRows = exclusive.map((row) => [telemetryLabel(row.category), telemetryMs(row.duration_ms), telemetryPercent(row.share_percent)]);
4726
4749
  const runRows = runs.map((run) => [
4727
4750
  run.run_id, run.started_at ? locale.dateTime(new Date(run.started_at)) : t("format.unavailable"), translate(run.status),
4728
- telemetryMs(run.total_duration_ms), telemetryRunMetric(run.queue_wait_ms, run.phase_telemetry), telemetryRunMetric(run.provider_duration_ms, run.phase_telemetry),
4729
- telemetryRunMetric(run.validation_duration_ms, run.phase_telemetry), telemetryRunMetric(run.external_wait_ms, run.phase_telemetry),
4751
+ telemetryMs(run.total_duration_ms), telemetryRunMetric(run.provider_duration_ms, run.phase_telemetry),
4752
+ telemetryRunMetric(run.external_wait_ms, run.phase_telemetry), telemetryRunMetric(run.unassigned_ms, run.phase_telemetry),
4753
+ telemetryNumber(run.input_tokens), telemetryNumber(run.output_tokens), telemetryPercent(run.cache_ratio_percent),
4730
4754
  run.largest_phase ? telemetryLabel(run.largest_phase) : telemetryRunMetric(null, run.phase_telemetry), run.producer_type,
4731
4755
  run.repository, run.model,
4732
4756
  ]);
4733
4757
  const bottleneckLines = [
4734
4758
  `${t("telemetry.longest_average_phase")}: ${bottlenecks.longest_average_phase ? telemetryLabel(bottlenecks.longest_average_phase.phase) : t("format.unavailable")}`,
4735
4759
  `${t("telemetry.largest_accumulated_phase")}: ${bottlenecks.largest_accumulated_phase ? telemetryLabel(bottlenecks.largest_accumulated_phase.phase) : t("format.unavailable")}`,
4760
+ `${t("telemetry.longest_individual_span")}: ${bottlenecks.longest_individual_span ? bottlenecks.longest_individual_span.label || telemetryLabel(bottlenecks.longest_individual_span.phase) : t("format.unavailable")}`,
4736
4761
  ...(Array.isArray(bottlenecks.top_time_consumers) ? bottlenecks.top_time_consumers.map((item) => `${telemetryLabel(item.phase)} — ${telemetryPercent(item.share_percent)}`) : []),
4737
4762
  ];
4763
+ const runDetails = [];
4764
+ for (const run of runs) {
4765
+ const snapshot = run.telemetry_snapshot || {}, attempt = snapshot.attempt || {}, chain = snapshot.chain || {};
4766
+ const invocations = Array.isArray(attempt.usage?.invocations) ? attempt.usage.invocations : [];
4767
+ runDetails.push(`## ${t("telemetry.scope_attempt")} — ${run.run_id}`, "",
4768
+ `${t("telemetry.measurement_coverage")}: ${attempt.timing?.coverage?.state || t("format.unavailable")}`, "",
4769
+ invocations.length ? telemetryMarkdownTable(
4770
+ [t("telemetry.phase"), t("telemetry.role"), t("telemetry.model"), t("telemetry.duration"), t("telemetry.input"), t("telemetry.cached_input"), t("telemetry.uncached_input"), t("telemetry.output"), t("telemetry.usage_coverage"), t("telemetry.invocation_id")],
4771
+ invocations.map((item) => [telemetryLabel(item.phase), item.role, `${item.model || t("format.unavailable")} (${item.model_provenance || t("format.unavailable")})`, telemetryMs(item.duration_ms), telemetryNumber(item.input_tokens), telemetryNumber(item.cached_input_tokens), telemetryNumber(item.uncached_input_tokens), telemetryNumber(item.output_tokens), item.usage_coverage, item.invocation_id]),
4772
+ ) : t("format.unavailable"), "",
4773
+ `### ${t("telemetry.scope_chain")}`, "",
4774
+ telemetryMarkdownTable([t("table.details"), t("history.markdown_value")], [
4775
+ [t("telemetry.chain_coverage"), chain.coverage || t("format.unavailable")],
4776
+ [t("telemetry.chain_attempts"), chain.attempt_count ?? t("format.unavailable")],
4777
+ [t("telemetry.original_attempts"), chain.original_attempt_count ?? t("format.unavailable")],
4778
+ [t("telemetry.retries"), chain.retry_count ?? t("format.unavailable")],
4779
+ [t("telemetry.resumes"), chain.resume_count ?? t("format.unavailable")],
4780
+ [t("telemetry.chain_elapsed"), telemetryMs(chain.elapsed_ms)],
4781
+ [t("telemetry.chain_processing"), telemetryMs(chain.processing_time_ms)],
4782
+ [t("telemetry.inter_attempt_gaps"), telemetryMs(chain.inter_attempt_gap_ms)],
4783
+ [t("telemetry.outside_window"), chain.outside_selected_window_count ?? 0],
4784
+ ]), "");
4785
+ }
4738
4786
  return [
4739
4787
  `# ${t("telemetry.detail_title", { date: telemetryDate(date) })}`, "", t("telemetry.detail_description"), "",
4740
4788
  `## ${t("telemetry.summary")}`, "", telemetryMarkdownTable([t("table.details"), t("history.markdown_value")], summaryRows), "",
4741
- `## ${t("telemetry.phase_timing")}`, "", phaseRows.length ? telemetryMarkdownTable([t("telemetry.phase"), t("telemetry.average"), t("telemetry.median"), t("telemetry.accumulated"), t("telemetry.share"), t("telemetry.runs")], phaseRows) : t("telemetry.not_recorded"), "",
4789
+ `## ${t("telemetry.inclusive_title")}`, "", t("telemetry.inclusive_help"), "", phaseRows.length ? telemetryMarkdownTable([t("telemetry.phase"), t("telemetry.average"), t("telemetry.median"), t("telemetry.accumulated"), t("telemetry.share"), t("telemetry.runs")], phaseRows) : t("telemetry.not_recorded"), "",
4790
+ `## ${t("telemetry.exclusive_title")}`, "", t("telemetry.exclusive_help"), "", exclusiveRows.length ? telemetryMarkdownTable([t("telemetry.category"), t("telemetry.duration"), t("telemetry.share")], exclusiveRows) : t("telemetry.not_recorded"), "",
4742
4791
  `## ${t("telemetry.bottlenecks")}`, "", ...bottleneckLines.map((line) => `- ${line}`), "",
4743
- `## ${t("telemetry.runs")}`, "", runRows.length ? telemetryMarkdownTable([t("telemetry.run_id"), t("telemetry.start_time"), t("telemetry.status"), t("telemetry.average_total"), t("telemetry.average_wait"), t("telemetry.provider"), t("telemetry.validation"), t("telemetry.external_wait"), t("telemetry.largest_phase"), t("telemetry.producer_type"), t("telemetry.target_repository"), t("telemetry.model")], runRows) : t("format.unavailable"), "",
4792
+ `## ${t("telemetry.runs")}`, "", runRows.length ? telemetryMarkdownTable([t("telemetry.run_id"), t("telemetry.start_time"), t("telemetry.status"), t("telemetry.duration"), t("telemetry.provider_unique_coverage"), t("telemetry.external_wait"), t("telemetry.unassigned"), t("telemetry.input"), t("telemetry.output"), t("telemetry.cache_ratio"), t("telemetry.largest_phase"), t("telemetry.producer_type"), t("telemetry.target_repository"), t("telemetry.model")], runRows) : t("format.unavailable"), "",
4793
+ ...runDetails,
4744
4794
  ].join("\n");
4745
4795
  }
4746
4796
  function downloadTelemetryDetail(format) {
@@ -4790,77 +4840,190 @@ function openTelemetryDetail(date, trigger) {
4790
4840
  })
4791
4841
  .catch(() => { if (requestId === telemetryDetailRequestId) content.textContent = t("telemetry.details_unavailable"); });
4792
4842
  }
4793
- function renderTelemetryDetail(detail, content) {
4794
- content.replaceChildren(); const summary = detail?.summary || {};
4795
- const metrics = document.createElement("section"); metrics.className = "telemetry-detail-metrics";
4796
- metrics.append(Object.assign(document.createElement("h3"), { textContent: t("telemetry.summary") }));
4797
- const grid = document.createElement("div"); grid.className = "technical-grid";
4798
- for (const [label, value] of [[t("telemetry.executions"), summary.executions], [t("telemetry.complete"), summary.completed], [t("telemetry.blocked"), summary.blocked], [t("telemetry.failed"), summary.failed]]) grid.append(Object.assign(document.createElement("div"), { className: "field", textContent: `${label}: ${value ?? 0}` }));
4799
- for (const [label, key] of [["telemetry.average_total", "total_wall_time"], ["telemetry.median_total", "total_wall_time"], ["telemetry.active_processing", "active_processing_time"], ["telemetry.average_wait", "queue_wait"], ["telemetry.provider", "provider_execution"], ["telemetry.validation", "validation"], ["telemetry.external_wait", "external_wait"], ["telemetry.overhead", "overhead"]]) grid.append(telemetryMetric(t(label), key === "total_wall_time" && label === "telemetry.median_total" ? summary[key]?.median_ms : summary[key]?.average_ms));
4800
- metrics.append(grid); content.append(metrics);
4801
- const phases = Array.isArray(detail?.phases) ? detail.phases : [];
4802
- const phaseSection = document.createElement("section"); phaseSection.append(Object.assign(document.createElement("h3"), { textContent: t("telemetry.phase_timing") }));
4803
- if (!phases.length) phaseSection.append(Object.assign(document.createElement("p"), { textContent: detail?.phase_telemetry_available ? t("telemetry.not_executed") : t("telemetry.not_recorded") }));
4804
- else {
4805
- const phaseColumns = [
4806
- ["phase", "telemetry.phase"], ["average_ms", "telemetry.average"], ["median_ms", "telemetry.median"],
4807
- ["total_ms", "telemetry.accumulated"], ["share_percent", "telemetry.share"], ["runs", "telemetry.runs"],
4808
- ].map(([key, label]) => ({ key, label, value: (phase) => key === "phase" ? telemetryLabel(phase.phase) : Number(phase[key]) || 0 }));
4809
- const phaseTable = telemetryDetailSortableTable(phaseColumns, phases, { key: "phase", direction: "asc" }, (phase, body) => {
4843
+ function telemetryTextField(label, value, title) {
4844
+ const field = document.createElement("div"); field.className = "field";
4845
+ const name = document.createElement("span"); name.className = "label"; name.textContent = label;
4846
+ const strong = document.createElement("strong"); strong.textContent = value == null ? t("format.unavailable") : String(value);
4847
+ if (title) { strong.title = title; strong.tabIndex = 0; }
4848
+ field.append(name, strong); return field;
4849
+ }
4850
+ function renderCanonicalRunDetail(run, host) {
4851
+ host.replaceChildren();
4852
+ const snapshot = run?.telemetry_snapshot || {}, attempt = snapshot.attempt || {}, chain = snapshot.chain || {};
4853
+ const timing = attempt.timing || {}, usage = attempt.usage || {}, invocations = Array.isArray(usage.invocations) ? usage.invocations : [];
4854
+ const attemptPanel = document.createElement("div"), chainPanel = document.createElement("div"), switcher = document.createElement("div");
4855
+ switcher.className = "telemetry-scope-switcher"; switcher.setAttribute("role", "tablist");
4856
+ const attemptButton = Object.assign(document.createElement("button"), { type: "button", textContent: t("telemetry.scope_attempt") });
4857
+ const chainButton = Object.assign(document.createElement("button"), { type: "button", textContent: t("telemetry.scope_chain") });
4858
+ attemptButton.setAttribute("role", "tab"); chainButton.setAttribute("role", "tab");
4859
+ const select = (showChain) => {
4860
+ attemptPanel.hidden = showChain; chainPanel.hidden = !showChain;
4861
+ attemptButton.setAttribute("aria-selected", String(!showChain)); chainButton.setAttribute("aria-selected", String(showChain));
4862
+ };
4863
+ attemptButton.addEventListener("click", () => select(false)); chainButton.addEventListener("click", () => select(true));
4864
+ switcher.append(attemptButton, chainButton); select(false); host.append(switcher);
4865
+
4866
+ const attemptGrid = document.createElement("div"); attemptGrid.className = "technical-grid";
4867
+ const metric = (name) => usage.metrics?.[name];
4868
+ attemptGrid.append(
4869
+ telemetryTextField(t("telemetry.duration"), telemetryMs(timing.total_wall_time_ms)),
4870
+ telemetryTextField(t("telemetry.provider_unique_coverage"), telemetryMs(timing.provider_unique_coverage_ms)),
4871
+ telemetryTextField(t("telemetry.provider_cumulative_process"), telemetryMs(timing.provider_cumulative_process_duration_ms)),
4872
+ telemetryTextField(t("telemetry.external_wait"), telemetryMs(timing.external_wait_time_ms)),
4873
+ telemetryTextField(t("telemetry.unassigned"), telemetryMs(timing.unassigned_time_ms)),
4874
+ telemetryTextField(t("telemetry.observed_input"), telemetryMetricValue(metric("input_tokens")), metric("input_tokens")?.missing_reason),
4875
+ telemetryTextField(t("telemetry.observed_output"), telemetryMetricValue(metric("output_tokens")), metric("output_tokens")?.missing_reason),
4876
+ telemetryTextField(t("telemetry.cache_ratio"), telemetryPercent(usage.cache_ratio_percent), telemetryCoverage(usage.cache_ratio_population)),
4877
+ telemetryTextField(t("telemetry.measurement_coverage"), timing.coverage?.state || t("format.unavailable"), timing.coverage?.reason),
4878
+ telemetryTextField(t("telemetry.technical_completion"), translate(run.status)),
4879
+ telemetryTextField(t("telemetry.qualification_status"), run.qualification_status || t("format.unavailable")),
4880
+ telemetryTextField(t("telemetry.autonomy_acceptance"), run.autonomy_acceptance || t("format.unavailable")),
4881
+ telemetryTextField(t("telemetry.producer_type"), run.producer_type || t("format.unavailable")),
4882
+ telemetryTextField(t("telemetry.target_repository"), run.repository || t("format.unavailable")),
4883
+ );
4884
+ attemptPanel.append(attemptGrid);
4885
+
4886
+ const timeline = Array.isArray(timing.timeline) ? timing.timeline : [];
4887
+ const timelineSection = document.createElement("section");
4888
+ timelineSection.append(Object.assign(document.createElement("h4"), { textContent: t("telemetry.timeline") }));
4889
+ if (timeline.length) {
4890
+ const byId = new Map(timeline.map((span) => [span.phase_id, span]));
4891
+ const depth = (span) => { let value = 0, parent = span.parent_phase_id, seen = new Set(); while (parent && byId.has(parent) && !seen.has(parent)) { seen.add(parent); value += 1; parent = byId.get(parent).parent_phase_id; } return value; };
4892
+ const list = document.createElement("ol"); list.className = "telemetry-timeline";
4893
+ timeline.forEach((span) => {
4894
+ const item = document.createElement("li"); item.style.setProperty("--timeline-depth", String(depth(span)));
4895
+ item.textContent = `${telemetryLabel(span.phase_name)} · ${telemetryMs(span.duration_ms)} · ${translate(span.outcome)}`;
4896
+ item.title = String(span.phase_id || ""); list.append(item);
4897
+ });
4898
+ timelineSection.append(list);
4899
+ if (timing.timeline_truncated) timelineSection.append(Object.assign(document.createElement("p"), { className: "telemetry-note", textContent: t("telemetry.timeline_truncated", { count: timing.timeline_limit }) }));
4900
+ } else timelineSection.append(Object.assign(document.createElement("p"), { textContent: t("telemetry.not_recorded") }));
4901
+ attemptPanel.append(timelineSection);
4902
+
4903
+ const invocationSection = document.createElement("section");
4904
+ invocationSection.append(Object.assign(document.createElement("h4"), { textContent: `${t("telemetry.invocations")} (${invocations.length})` }));
4905
+ if (invocations.length) {
4906
+ const columns = [
4907
+ ["phase", "telemetry.phase"], ["role", "telemetry.role"], ["model", "telemetry.model"], ["duration_ms", "telemetry.duration", "desc"],
4908
+ ["input_tokens", "telemetry.input", "desc"], ["cached_input_tokens", "telemetry.cached_input"], ["uncached_input_tokens", "telemetry.uncached_input"],
4909
+ ["output_tokens", "telemetry.output"], ["usage_coverage", "telemetry.usage_coverage"], ["invocation_id", "telemetry.invocation_id"], ["retry_ordinal", "telemetry.retry_identity"],
4910
+ ].map(([key, label, defaultDirection]) => ({ key, label, defaultDirection, value: (item) => key === "phase" ? telemetryLabel(item.phase) : Number.isFinite(Number(item[key])) ? Number(item[key]) : String(item[key] || "") }));
4911
+ const table = telemetryDetailSortableTable(columns, invocations, { key: "input_tokens", direction: "desc" }, (item, body) => {
4810
4912
  const row = document.createElement("tr");
4811
- [telemetryLabel(phase.phase), telemetryMs(phase.average_ms), telemetryMs(phase.median_ms), telemetryMs(phase.total_ms), telemetryPercent(phase.share_percent), phase.runs]
4913
+ const model = item.model ? `${item.model} (${item.model_provenance || t("format.unavailable")})` : t("format.unavailable");
4914
+ [telemetryLabel(item.phase), item.role || t("format.unavailable"), model, telemetryMs(item.duration_ms), telemetryNumber(item.input_tokens), telemetryNumber(item.cached_input_tokens), telemetryNumber(item.uncached_input_tokens), telemetryNumber(item.output_tokens), item.usage_coverage || t("format.unavailable"), item.invocation_id || t("format.unavailable"), item.retry_ordinal ?? t("format.unavailable")]
4812
4915
  .forEach((value) => row.append(Object.assign(document.createElement("td"), { textContent: String(value) })));
4813
4916
  body.append(row);
4814
4917
  });
4815
- phaseTable.classList.add("telemetry-phase-table");
4816
- phaseSection.append(telemetryDetailTableScroll(phaseTable, t("telemetry.phase_timing")));
4918
+ invocationSection.append(telemetryDetailTableScroll(table, t("telemetry.invocations")));
4919
+ } else invocationSection.append(Object.assign(document.createElement("p"), { textContent: t("telemetry.not_recorded") }));
4920
+ attemptPanel.append(invocationSection);
4921
+
4922
+ const chainGrid = document.createElement("div"); chainGrid.className = "technical-grid";
4923
+ chainGrid.append(
4924
+ telemetryTextField(t("telemetry.chain_coverage"), chain.coverage, Array.isArray(chain.reasons) ? chain.reasons.join("; ") : chain.reason),
4925
+ telemetryTextField(t("telemetry.chain_attempts"), chain.attempt_count),
4926
+ telemetryTextField(t("telemetry.original_attempts"), chain.original_attempt_count),
4927
+ telemetryTextField(t("telemetry.retries"), chain.retry_count),
4928
+ telemetryTextField(t("telemetry.resumes"), chain.resume_count),
4929
+ telemetryTextField(t("telemetry.chain_elapsed"), telemetryMs(chain.elapsed_ms)),
4930
+ telemetryTextField(t("telemetry.chain_processing"), telemetryMs(chain.processing_time_ms)),
4931
+ telemetryTextField(t("telemetry.inter_attempt_gaps"), telemetryMs(chain.inter_attempt_gap_ms)),
4932
+ telemetryTextField(t("telemetry.outside_window"), chain.outside_selected_window_count ?? 0),
4933
+ telemetryTextField(t("telemetry.mission_scope"), chain.mission_scope_label || t("format.unavailable")),
4934
+ );
4935
+ chainPanel.append(chainGrid);
4936
+ const chainRuns = Array.isArray(chain.runs) ? chain.runs : [];
4937
+ if (chainRuns.length) {
4938
+ const table = document.createElement("table"); table.className = "telemetry-table";
4939
+ const head = document.createElement("thead"), headRow = document.createElement("tr"), body = document.createElement("tbody");
4940
+ ["telemetry.run_id", "telemetry.relation", "telemetry.status", "telemetry.start_time", "telemetry.invocations"].forEach((key) => headRow.append(Object.assign(document.createElement("th"), { scope: "col", textContent: t(key) })));
4941
+ for (const item of chainRuns) {
4942
+ const row = document.createElement("tr");
4943
+ [item.run_id, item.relation, translate(item.state), item.started_at ? locale.dateTime(new Date(item.started_at)) : t("format.unavailable"), item.provider_invocation_count]
4944
+ .forEach((value) => row.append(Object.assign(document.createElement("td"), { textContent: String(value ?? t("format.unavailable")) })));
4945
+ body.append(row);
4946
+ }
4947
+ head.append(headRow); table.append(head, body); chainPanel.append(telemetryDetailTableScroll(table, t("telemetry.scope_chain")));
4817
4948
  }
4818
- content.append(phaseSection);
4819
- const bottlenecks = document.createElement("section"), top = detail?.bottlenecks?.top_time_consumers || [];
4820
- bottlenecks.append(Object.assign(document.createElement("h3"), { textContent: t("telemetry.bottlenecks") }));
4949
+ host.append(attemptPanel, chainPanel);
4950
+ }
4951
+ function renderTelemetryDetail(detail, content) {
4952
+ content.replaceChildren(); const summary = detail?.summary || {}, usage = summary.usage || {};
4953
+ const metrics = document.createElement("section"); metrics.className = "telemetry-detail-metrics";
4954
+ metrics.append(Object.assign(document.createElement("h3"), { textContent: t("telemetry.summary") }));
4955
+ const grid = document.createElement("div"); grid.className = "technical-grid";
4956
+ grid.append(
4957
+ telemetryTextField(t("telemetry.population"), `N=${summary.population ?? summary.executions ?? 0}`),
4958
+ telemetryTextField(t("telemetry.elapsed"), telemetryMs(summary.total_wall_time?.average_ms)),
4959
+ telemetryTextField(t("telemetry.external_wait"), telemetryMs(summary.external_wait?.average_ms)),
4960
+ telemetryTextField(t("telemetry.provider_unique_coverage"), telemetryMs(summary.provider_unique_coverage?.average_ms)),
4961
+ telemetryTextField(t("telemetry.unassigned"), telemetryMs(summary.unassigned?.average_ms)),
4962
+ telemetryTextField(t("telemetry.observed_input"), telemetryMetricValue(usage.input_tokens), usage.input_tokens?.missing_reason),
4963
+ telemetryTextField(t("telemetry.observed_output"), telemetryMetricValue(usage.output_tokens), usage.output_tokens?.missing_reason),
4964
+ telemetryTextField(t("telemetry.cache_ratio"), telemetryPercent(summary.cache_ratio_percent)),
4965
+ );
4966
+ metrics.append(grid); content.append(metrics);
4967
+
4968
+ const addDistribution = (titleKey, helpKey, values, categoryKey, durationKey, columns) => {
4969
+ const section = document.createElement("section");
4970
+ section.append(Object.assign(document.createElement("h3"), { textContent: t(titleKey) }), Object.assign(document.createElement("p"), { className: "telemetry-note", textContent: t(helpKey) }));
4971
+ if (!values.length) section.append(Object.assign(document.createElement("p"), { textContent: t("telemetry.not_recorded") }));
4972
+ else {
4973
+ const columnKeys = durationKey === "total_ms"
4974
+ ? [categoryKey, "average_ms", "median_ms", "total_ms", "share_percent", "runs"]
4975
+ : [categoryKey, "duration_ms", "share_percent"];
4976
+ const table = telemetryDetailSortableTable(columns.map((label, index) => ({
4977
+ key: columnKeys[index], label,
4978
+ value: (item) => index === 0 ? telemetryLabel(item[categoryKey]) : Number(item[columnKeys[index]]) || 0,
4979
+ })), values, { key: categoryKey, direction: "asc" }, (item, body) => {
4980
+ const row = document.createElement("tr"), category = telemetryLabel(item[categoryKey]);
4981
+ const rendered = durationKey === "total_ms"
4982
+ ? [category, telemetryMs(item.average_ms), telemetryMs(item.median_ms), telemetryMs(item.total_ms), telemetryPercent(item.share_percent), item.runs]
4983
+ : [category, telemetryMs(item.duration_ms), telemetryPercent(item.share_percent)];
4984
+ rendered.forEach((value) => row.append(Object.assign(document.createElement("td"), { textContent: String(value) }))); body.append(row);
4985
+ });
4986
+ table.classList.add("telemetry-phase-table"); section.append(telemetryDetailTableScroll(table, t(titleKey)));
4987
+ }
4988
+ content.append(section);
4989
+ };
4990
+ addDistribution("telemetry.inclusive_title", "telemetry.inclusive_help", Array.isArray(detail?.inclusive_phases) ? detail.inclusive_phases : Array.isArray(detail?.phases) ? detail.phases : [], "phase", "total_ms", ["telemetry.phase", "telemetry.average", "telemetry.median", "telemetry.accumulated", "telemetry.share", "telemetry.runs"]);
4991
+ addDistribution("telemetry.exclusive_title", "telemetry.exclusive_help", Array.isArray(detail?.exclusive_distribution) ? detail.exclusive_distribution : [], "category", "duration_ms", ["telemetry.category", "telemetry.duration", "telemetry.share"]);
4992
+
4993
+ const bottlenecks = document.createElement("section"); bottlenecks.append(Object.assign(document.createElement("h3"), { textContent: t("telemetry.bottlenecks") }));
4821
4994
  const fields = document.createElement("div"); fields.className = "technical-grid";
4822
- for (const [label, item] of [["telemetry.longest_average_phase", detail?.bottlenecks?.longest_average_phase], ["telemetry.largest_accumulated_phase", detail?.bottlenecks?.largest_accumulated_phase]]) fields.append(Object.assign(document.createElement("div"), { className: "field", textContent: `${t(label)}: ${item ? telemetryLabel(item.phase) : t("format.unavailable")}` }));
4823
- for (const [label, value] of Object.entries(detail?.bottlenecks?.shares || {})) fields.append(Object.assign(document.createElement("div"), { className: "field", textContent: `${t("telemetry.share." + label)}: ${telemetryPercent(value)}` }));
4995
+ const longest = detail?.bottlenecks?.longest_individual_span;
4996
+ fields.append(
4997
+ telemetryTextField(t("telemetry.longest_average_phase"), detail?.bottlenecks?.longest_average_phase ? telemetryLabel(detail.bottlenecks.longest_average_phase.phase) : t("format.unavailable")),
4998
+ telemetryTextField(t("telemetry.largest_accumulated_phase"), detail?.bottlenecks?.largest_accumulated_phase ? telemetryLabel(detail.bottlenecks.largest_accumulated_phase.phase) : t("format.unavailable")),
4999
+ telemetryTextField(t("telemetry.longest_individual_span"), longest ? `${longest.label || telemetryLabel(longest.phase)} · ${telemetryMs(longest.duration_ms)}` : t("format.unavailable")),
5000
+ );
5001
+ for (const [label, value] of Object.entries(detail?.bottlenecks?.shares || {})) fields.append(telemetryTextField(t("telemetry.share." + label), telemetryPercent(value)));
4824
5002
  bottlenecks.append(fields);
4825
- const list = document.createElement("ol"); for (const item of top) list.append(Object.assign(document.createElement("li"), { textContent: `${telemetryLabel(item.phase)} — ${telemetryPercent(item.share_percent)}` })); bottlenecks.append(list); content.append(bottlenecks);
4826
- const runSection = document.createElement("section"), runs = Array.isArray(detail?.runs) ? detail.runs : [];
5003
+ const top = Array.isArray(detail?.bottlenecks?.top_time_consumers) ? detail.bottlenecks.top_time_consumers : [];
5004
+ if (top.length) { const list = document.createElement("ol"); top.forEach((item) => list.append(Object.assign(document.createElement("li"), { textContent: `${telemetryLabel(item.phase)} — ${telemetryPercent(item.share_percent)}` }))); bottlenecks.append(list); }
5005
+ content.append(bottlenecks);
5006
+
5007
+ const runSection = document.createElement("section"), runs = Array.isArray(detail?.runs) ? detail.runs : [], runDetailHost = document.createElement("div");
5008
+ runDetailHost.className = "telemetry-run-detail";
4827
5009
  runSection.append(Object.assign(document.createElement("h3"), { textContent: t("telemetry.runs") }));
4828
5010
  const runColumns = [
4829
- ["run_id", "telemetry.run_id"], ["started_at", "telemetry.start_time", "desc"], ["status", "telemetry.status"],
4830
- ["total_duration_ms", "telemetry.average_total"], ["queue_wait_ms", "telemetry.average_wait"], ["provider_duration_ms", "telemetry.provider"],
4831
- ["validation_duration_ms", "telemetry.validation"], ["external_wait_ms", "telemetry.external_wait"], ["largest_phase", "telemetry.largest_phase"],
4832
- ["producer_type", "telemetry.producer_type"], ["repository", "telemetry.target_repository"], ["model", "telemetry.model"],
5011
+ ["run_id", "telemetry.run_id"], ["started_at", "telemetry.start_time", "desc"], ["status", "telemetry.status"], ["total_duration_ms", "telemetry.duration"],
5012
+ ["provider_duration_ms", "telemetry.provider_unique_coverage"], ["external_wait_ms", "telemetry.external_wait"], ["unassigned_ms", "telemetry.unassigned"],
5013
+ ["input_tokens", "telemetry.input"], ["output_tokens", "telemetry.output"], ["cache_ratio_percent", "telemetry.cache_ratio"], ["largest_phase", "telemetry.largest_phase"],
5014
+ ["model", "telemetry.model"],
4833
5015
  ].map(([key, label, defaultDirection]) => ({ key, label, defaultDirection, value: (run) => key === "largest_phase" ? telemetryLabel(run[key]) : key === "started_at" ? Date.parse(run[key]) || 0 : Number.isFinite(Number(run[key])) ? Number(run[key]) : String(run[key] || "") }));
4834
5016
  const runTable = telemetryDetailSortableTable(runColumns, runs, { key: "started_at", direction: "desc" }, (run, runBody) => {
4835
- const row = document.createElement("tr"), id = document.createElement("button");
4836
- row.className = "telemetry-row";
4837
- row.tabIndex = 0;
4838
- row.setAttribute("role", "button");
4839
- row.setAttribute("aria-label", String(run.run_id || t("format.unavailable")));
4840
- id.type = "button";
4841
- id.className = "telemetry-run-link";
4842
- id.textContent = run.run_id;
4843
- const open = () => {
4844
- runBody.querySelectorAll('.telemetry-row[data-selected="true"]')
4845
- .forEach((candidate) => { candidate.dataset.selected = "false"; });
4846
- row.dataset.selected = "true";
4847
- openPromptHistoryDetail({ run_id: run.run_id, title: run.run_id });
4848
- };
4849
- row.addEventListener("click", open);
4850
- row.addEventListener("keydown", (event) => {
4851
- if (event.key === "Enter" || event.key === " ") { event.preventDefault(); open(); }
4852
- });
4853
- id.addEventListener("click", (event) => { event.stopPropagation(); open(); });
4854
- const phaseTelemetry = run.phase_telemetry;
4855
- const values = [id, run.started_at ? locale.dateTime(new Date(run.started_at)) : t("format.unavailable"), translate(run.status), telemetryMs(run.total_duration_ms), telemetryRunMetric(run.queue_wait_ms, phaseTelemetry), telemetryRunMetric(run.provider_duration_ms, phaseTelemetry), telemetryRunMetric(run.validation_duration_ms, phaseTelemetry), telemetryRunMetric(run.external_wait_ms, phaseTelemetry), run.largest_phase ? telemetryLabel(run.largest_phase) : (phaseTelemetry === "RECORDED" ? t("telemetry.not_executed") : t("telemetry.not_recorded_short")), run.producer_type || t("format.unavailable"), run.repository || t("format.unavailable"), run.model || t("format.unavailable")];
4856
- values.forEach((value) => {
4857
- const cell = document.createElement("td");
4858
- if (value instanceof Element) cell.append(value); else cell.textContent = String(value);
4859
- row.append(cell);
4860
- });
5017
+ const row = document.createElement("tr"), id = document.createElement("button"); row.className = "telemetry-row"; row.tabIndex = 0; row.setAttribute("role", "button");
5018
+ row.setAttribute("aria-label", String(run.run_id || t("format.unavailable"))); id.type = "button"; id.className = "telemetry-run-link"; id.textContent = run.run_id;
5019
+ const selectRun = () => { runBody.querySelectorAll('.telemetry-row[data-selected="true"]').forEach((candidate) => { candidate.dataset.selected = "false"; }); row.dataset.selected = "true"; renderCanonicalRunDetail(run, runDetailHost); };
5020
+ row.addEventListener("click", selectRun); row.addEventListener("keydown", (event) => { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); selectRun(); } });
5021
+ id.addEventListener("click", (event) => { event.stopPropagation(); selectRun(); openPromptHistoryDetail({ run_id: run.run_id, title: run.run_id }); });
5022
+ [id, run.started_at ? locale.dateTime(new Date(run.started_at)) : t("format.unavailable"), translate(run.status), telemetryMs(run.total_duration_ms), telemetryMs(run.provider_duration_ms), telemetryMs(run.external_wait_ms), telemetryMs(run.unassigned_ms), telemetryNumber(run.input_tokens), telemetryNumber(run.output_tokens), telemetryPercent(run.cache_ratio_percent), run.largest_phase ? telemetryLabel(run.largest_phase) : t("format.unavailable"), run.model || t("format.unavailable")].forEach((value) => { const cell = document.createElement("td"); if (value instanceof Element) cell.append(value); else cell.textContent = String(value); row.append(cell); });
4861
5023
  runBody.append(row);
4862
5024
  });
4863
- runSection.append(telemetryDetailTableScroll(runTable, t("telemetry.runs"))); content.append(runSection);
5025
+ runSection.append(telemetryDetailTableScroll(runTable, t("telemetry.runs")), runDetailHost); content.append(runSection);
5026
+ if (runs.length) renderCanonicalRunDetail(runs[0], runDetailHost);
4864
5027
  }
4865
5028
  $("telemetryDetailClose").addEventListener("click", closeTelemetryDetail);
4866
5029
  $("telemetryDetailDownloadMarkdown").addEventListener("click", () => downloadTelemetryDetail("markdown"));
@@ -6156,11 +6319,29 @@ function updateLocalePicker() {
6156
6319
  option.setAttribute("aria-selected", String(selected));
6157
6320
  });
6158
6321
  }
6322
+ let lastOpenModalFocus = null;
6323
+ document.addEventListener("focusin", (event) => {
6324
+ if (event.target instanceof HTMLElement && event.target.closest("dialog[open]"))
6325
+ lastOpenModalFocus = event.target;
6326
+ });
6159
6327
  function changeDashboardLocale(value) {
6160
- const scroll = { x: window.scrollX, y: window.scrollY }, focused = document.activeElement;
6328
+ const active = document.activeElement;
6329
+ const priorModalFocus = lastOpenModalFocus instanceof HTMLElement
6330
+ && lastOpenModalFocus.isConnected
6331
+ && lastOpenModalFocus.closest("dialog[open]")
6332
+ ? lastOpenModalFocus
6333
+ : null;
6334
+ const focused = active?.closest?.("dialog[open]") ? active : priorModalFocus || active;
6335
+ const scroll = { x: window.scrollX, y: window.scrollY };
6161
6336
  const focusable = "button:not(:disabled), a[href], input:not(:disabled), select:not(:disabled), textarea:not(:disabled), summary, [tabindex='0']";
6162
6337
  const focusedModal = focused?.closest("dialog[open]");
6163
6338
  const focusedIndex = focusedModal ? [...focusedModal.querySelectorAll(focusable)].indexOf(focused) : -1;
6339
+ const focusedIdentity = focusedModal && focused instanceof HTMLElement ? {
6340
+ tag: focused.localName,
6341
+ testId: focused.getAttribute("data-testid"),
6342
+ name: focused.getAttribute("name"),
6343
+ classes: [...focused.classList],
6344
+ } : null;
6164
6345
  const controls = [...document.querySelectorAll("input[id], textarea[id], select[id]")]
6165
6346
  .filter((element) => element.id !== "dashboardLocale" && element.type !== "file")
6166
6347
  .map((element) => ({ id: element.id, value: element.value, checked: element.checked }));
@@ -6211,8 +6392,17 @@ function changeDashboardLocale(value) {
6211
6392
  if (focused?.isConnected) focused.focus({ preventScroll: true });
6212
6393
  else {
6213
6394
  // Rebuilt modal content needs an equivalent focus target, not the removed
6214
- // node. Keep keyboard navigation inside the same open context.
6395
+ // node. Prefer semantic control identity over DOM position so adding a
6396
+ // translated field cannot move keyboard focus to a different control.
6397
+ const semanticSelector = focusedIdentity?.testId
6398
+ ? `[data-testid="${CSS.escape(focusedIdentity.testId)}"]`
6399
+ : focusedIdentity?.name
6400
+ ? `${focusedIdentity.tag}[name="${CSS.escape(focusedIdentity.name)}"]`
6401
+ : focusedIdentity?.classes.length
6402
+ ? `${focusedIdentity.tag}.${focusedIdentity.classes.map((value) => CSS.escape(value)).join(".")}`
6403
+ : null;
6215
6404
  const replacement = (focused?.id && $(focused.id))
6405
+ || (semanticSelector && focusedModal?.querySelector(semanticSelector))
6216
6406
  || (focusedIndex >= 0 && focusedModal?.querySelectorAll(focusable)[focusedIndex])
6217
6407
  || focusedModal?.querySelector(focusable);
6218
6408
  replacement?.focus({ preventScroll: true });
@@ -8209,6 +8399,29 @@ function promptDetailReviewersSection(reviewers, { wide = true } = {}) {
8209
8399
  );
8210
8400
  return promptDetailCard(t("detail.specialist_reviews"), fields, wide, "prompt-detail-card--reviewers");
8211
8401
  }
8402
+ function promptDetailAssuranceReviewsSection(reviews) {
8403
+ if (!reviews.length) return null;
8404
+ const fields = reviews.map((review) => {
8405
+ const findings = Array.isArray(review.findings) ? review.findings : [];
8406
+ const candidate = String(review.candidate_sha || "").trim();
8407
+ const lines = [
8408
+ assuranceStatusLabel(review.status || "UNRESOLVED"),
8409
+ candidate ? t("detail.candidate_sha") + ": " + candidate : null,
8410
+ ...(findings.length
8411
+ ? findings.map((finding) => String(finding?.observation || "").trim()).filter(Boolean)
8412
+ : [t("lifecycle.assurance_no_findings")]),
8413
+ ].filter(Boolean);
8414
+ return detailField(
8415
+ reviewerLabel(review.reviewer, t("detail.specialist_review")),
8416
+ lines.join("\n"),
8417
+ true,
8418
+ );
8419
+ });
8420
+ return promptDetailCard(
8421
+ t("lifecycle.detail_assurance"), fields, true,
8422
+ "prompt-detail-card--assurance-reviews",
8423
+ );
8424
+ }
8212
8425
  function promptDetailProviderReviewSections(usage, reviewers, commitTimeline) {
8213
8426
  const usageCard = promptDetailUsageSection(usage);
8214
8427
  const reviewerCard = promptDetailReviewersSection(reviewers, { wide: false });
@@ -8242,6 +8455,11 @@ function renderPromptHistoryDetail(payload) {
8242
8455
  commitTimeline = payload?.commit_timeline || [],
8243
8456
  evidence = Array.isArray(payload?.evidence) ? payload.evidence : [],
8244
8457
  reviewers = Array.isArray(payload?.reviewers) ? payload.reviewers : [],
8458
+ assuranceReviews = Array.isArray(payload?.assurance_reviews)
8459
+ ? payload.assurance_reviews
8460
+ : (Array.isArray(payload?.lifecycle?.steps)
8461
+ ? payload.lifecycle.steps.find((step) => step?.id === "QUALITY_CONTROL_AGENT")?.assurance_reviews || []
8462
+ : []),
8245
8463
  activity = history.execution_activity_summary,
8246
8464
  recommendationHandoff = payload?.recommendation_handoff;
8247
8465
  const [executionSummary, executionContext] = promptDetailExecutionSections(history);
@@ -8266,6 +8484,7 @@ function renderPromptHistoryDetail(payload) {
8266
8484
  lifecycleFlow(payload?.lifecycle, { historical: true }),
8267
8485
  statusReconciliationCard(payload?.lifecycle?.recovery),
8268
8486
  promptDetailProviderReviewSections(usage, reviewers, commitTimeline),
8487
+ promptDetailAssuranceReviewsSection(assuranceReviews),
8269
8488
  promptDetailRecommendationHandoff(recommendationHandoff),
8270
8489
  ].filter(Boolean),
8271
8490
  );
@@ -4212,3 +4212,19 @@ Object.assign(DASHBOARD_MESSAGES.nl, {"translation.source_unavailable":"Originee
4212
4212
  Object.assign(DASHBOARD_MESSAGES.de, {"translation.source_unavailable":"Originalnachweis wird angezeigt; die Übersetzung ist vorübergehend nicht verfügbar."});
4213
4213
  Object.assign(DASHBOARD_MESSAGES.fr, {"translation.source_unavailable":"La preuve originale est affichée ; la traduction est temporairement indisponible."});
4214
4214
  Object.assign(DASHBOARD_MESSAGES.es, {"translation.source_unavailable":"Se muestra la evidencia original; la traducción no está disponible temporalmente."});
4215
+
4216
+ Object.assign(DASHBOARD_MESSAGES.en, {
4217
+ "telemetry.less_than_one_second":"<1 sec","telemetry.population":"Measured population","telemetry.elapsed":"Elapsed time","telemetry.provider_unique_coverage":"Provider coverage in elapsed time","telemetry.provider_cumulative_process":"Cumulative provider process duration","telemetry.unassigned":"Unassigned time","telemetry.observed_input":"Observed input","telemetry.observed_output":"Observed output","telemetry.cache_ratio":"Cache ratio","telemetry.measurement_coverage":"Measurement coverage","telemetry.contract_version":"Calculation contract","telemetry.inclusive_title":"Inclusive phase workload","telemetry.inclusive_help":"Inclusive phase times may overlap and their shares are not additive.","telemetry.exclusive_title":"Exclusive elapsed-time distribution","telemetry.exclusive_help":"Non-overlapping partition of measured elapsed time; concurrent independent work is shown as parallel/overlap.","telemetry.category":"Category","telemetry.duration":"Duration","telemetry.longest_individual_span":"Longest individual span","telemetry.scope_attempt":"This attempt","telemetry.scope_chain":"Full execution chain","telemetry.chain_coverage":"Chain coverage","telemetry.chain_attempts":"Attempts in chain","telemetry.original_attempts":"Original attempts","telemetry.retries":"Retries","telemetry.resumes":"Resumes","telemetry.chain_elapsed":"Chain elapsed time","telemetry.chain_processing":"Measured processing time","telemetry.inter_attempt_gaps":"Gaps between attempts","telemetry.outside_window":"Related attempts outside selected date","telemetry.mission_scope":"Mission scope","telemetry.timeline":"Timing timeline","telemetry.timeline_truncated":"Timeline limited to {count} observations.","telemetry.invocations":"Provider invocations","telemetry.role":"Role","telemetry.cached_input":"Cached input","telemetry.uncached_input":"Uncached input","telemetry.usage_coverage":"Usage coverage","telemetry.invocation_id":"Invocation ID","telemetry.retry_identity":"Retry ordinal","telemetry.relation":"Relation","telemetry.technical_completion":"Technical completion","telemetry.qualification_status":"Qualification","telemetry.autonomy_acceptance":"Autonomy acceptance","telemetry.coverage.complete":"Complete","telemetry.coverage.partial":"Partial","telemetry.coverage.unavailable":"Unavailable","telemetry.coverage.conflict":"Conflicting","telemetry.phase.parallel_overlap":"Parallel / overlap","telemetry.phase.unassigned":"Unassigned"
4218
+ });
4219
+ Object.assign(DASHBOARD_MESSAGES.nl, {
4220
+ "telemetry.less_than_one_second":"<1 sec","telemetry.population":"Gemeten populatie","telemetry.elapsed":"Doorlooptijd","telemetry.provider_unique_coverage":"Providerdekking in doorlooptijd","telemetry.provider_cumulative_process":"Cumulatieve providerprocesduur","telemetry.unassigned":"Niet-toegewezen tijd","telemetry.observed_input":"Waargenomen input","telemetry.observed_output":"Waargenomen output","telemetry.cache_ratio":"Cacheratio","telemetry.measurement_coverage":"Meetdekking","telemetry.contract_version":"Rekencontract","telemetry.inclusive_title":"Inclusieve fasewerklast","telemetry.inclusive_help":"Inclusieve fasetijden mogen overlappen; de aandelen zijn niet optelbaar.","telemetry.exclusive_title":"Exclusieve doorlooptijdverdeling","telemetry.exclusive_help":"Niet-overlappende verdeling van de gemeten doorlooptijd; gelijktijdig onafhankelijk werk staat als parallel/overlap.","telemetry.category":"Categorie","telemetry.duration":"Duur","telemetry.longest_individual_span":"Langste individuele span","telemetry.scope_attempt":"Deze poging","telemetry.scope_chain":"Hele uitvoeringsketen","telemetry.chain_coverage":"Ketendekking","telemetry.chain_attempts":"Pogingen in keten","telemetry.original_attempts":"Oorspronkelijke pogingen","telemetry.retries":"Retries","telemetry.resumes":"Hervattingen","telemetry.chain_elapsed":"Doorlooptijd keten","telemetry.chain_processing":"Gemeten verwerkingstijd","telemetry.inter_attempt_gaps":"Gaten tussen pogingen","telemetry.outside_window":"Bijbehorende pogingen buiten gekozen datum","telemetry.mission_scope":"Missionscope","telemetry.timeline":"Tijdlijn","telemetry.timeline_truncated":"Tijdlijn begrensd op {count} observaties.","telemetry.invocations":"Providerinvocations","telemetry.role":"Rol","telemetry.cached_input":"Cached input","telemetry.uncached_input":"Uncached input","telemetry.usage_coverage":"Usagedekking","telemetry.invocation_id":"Invocation-ID","telemetry.retry_identity":"Retryvolgnummer","telemetry.relation":"Relatie","telemetry.technical_completion":"Technische completion","telemetry.qualification_status":"Kwalificatie","telemetry.autonomy_acceptance":"Autonomieacceptatie","telemetry.coverage.complete":"Volledig","telemetry.coverage.partial":"Gedeeltelijk","telemetry.coverage.unavailable":"Niet beschikbaar","telemetry.coverage.conflict":"Tegenstrijdig","telemetry.phase.parallel_overlap":"Parallel / overlap","telemetry.phase.unassigned":"Niet toegewezen"
4221
+ });
4222
+ Object.assign(DASHBOARD_MESSAGES.de, {
4223
+ "telemetry.less_than_one_second":"<1 Sek.","telemetry.population":"Gemessene Population","telemetry.elapsed":"Durchlaufzeit","telemetry.provider_unique_coverage":"Provider-Abdeckung in der Durchlaufzeit","telemetry.provider_cumulative_process":"Kumulierte Provider-Prozessdauer","telemetry.unassigned":"Nicht zugeordnete Zeit","telemetry.observed_input":"Beobachtete Eingabe","telemetry.observed_output":"Beobachtete Ausgabe","telemetry.cache_ratio":"Cache-Anteil","telemetry.measurement_coverage":"Messabdeckung","telemetry.contract_version":"Berechnungsvertrag","telemetry.inclusive_title":"Inklusive Phasenarbeitslast","telemetry.inclusive_help":"Inklusive Phasenzeiten können sich überschneiden; die Anteile sind nicht addierbar.","telemetry.exclusive_title":"Exklusive Durchlaufzeitverteilung","telemetry.exclusive_help":"Nicht überlappende Verteilung der gemessenen Durchlaufzeit; parallele unabhängige Arbeit erscheint als Parallel/Überlappung.","telemetry.category":"Kategorie","telemetry.duration":"Dauer","telemetry.longest_individual_span":"Längste einzelne Zeitspanne","telemetry.scope_attempt":"Dieser Versuch","telemetry.scope_chain":"Gesamte Ausführungskette","telemetry.chain_coverage":"Kettenabdeckung","telemetry.chain_attempts":"Versuche in der Kette","telemetry.original_attempts":"Ursprüngliche Versuche","telemetry.retries":"Wiederholungen","telemetry.resumes":"Fortsetzungen","telemetry.chain_elapsed":"Durchlaufzeit der Kette","telemetry.chain_processing":"Gemessene Verarbeitungszeit","telemetry.inter_attempt_gaps":"Lücken zwischen Versuchen","telemetry.outside_window":"Zugehörige Versuche außerhalb des Datums","telemetry.mission_scope":"Mission-Umfang","telemetry.timeline":"Zeitachse","telemetry.timeline_truncated":"Zeitachse auf {count} Beobachtungen begrenzt.","telemetry.invocations":"Provider-Aufrufe","telemetry.role":"Rolle","telemetry.cached_input":"Gecachte Eingabe","telemetry.uncached_input":"Nicht gecachte Eingabe","telemetry.usage_coverage":"Nutzungsabdeckung","telemetry.invocation_id":"Aufruf-ID","telemetry.retry_identity":"Wiederholungsnummer","telemetry.relation":"Beziehung","telemetry.technical_completion":"Technischer Abschluss","telemetry.qualification_status":"Qualifizierung","telemetry.autonomy_acceptance":"Autonomieabnahme","telemetry.coverage.complete":"Vollständig","telemetry.coverage.partial":"Teilweise","telemetry.coverage.unavailable":"Nicht verfügbar","telemetry.coverage.conflict":"Widersprüchlich","telemetry.phase.parallel_overlap":"Parallel / Überlappung","telemetry.phase.unassigned":"Nicht zugeordnet"
4224
+ });
4225
+ Object.assign(DASHBOARD_MESSAGES.fr, {
4226
+ "telemetry.less_than_one_second":"<1 s","telemetry.population":"Population mesurée","telemetry.elapsed":"Durée écoulée","telemetry.provider_unique_coverage":"Couverture fournisseur dans le temps écoulé","telemetry.provider_cumulative_process":"Durée cumulée du processus fournisseur","telemetry.unassigned":"Temps non attribué","telemetry.observed_input":"Entrée observée","telemetry.observed_output":"Sortie observée","telemetry.cache_ratio":"Taux de cache","telemetry.measurement_coverage":"Couverture de mesure","telemetry.contract_version":"Contrat de calcul","telemetry.inclusive_title":"Charge de phase inclusive","telemetry.inclusive_help":"Les durées inclusives peuvent se chevaucher ; leurs parts ne sont pas additives.","telemetry.exclusive_title":"Répartition exclusive du temps écoulé","telemetry.exclusive_help":"Répartition sans chevauchement du temps mesuré ; le travail indépendant simultané apparaît comme parallèle/chevauchement.","telemetry.category":"Catégorie","telemetry.duration":"Durée","telemetry.longest_individual_span":"Intervalle individuel le plus long","telemetry.scope_attempt":"Cette tentative","telemetry.scope_chain":"Chaîne d’exécution complète","telemetry.chain_coverage":"Couverture de la chaîne","telemetry.chain_attempts":"Tentatives dans la chaîne","telemetry.original_attempts":"Tentatives initiales","telemetry.retries":"Nouvelles tentatives","telemetry.resumes":"Reprises","telemetry.chain_elapsed":"Temps écoulé de la chaîne","telemetry.chain_processing":"Temps de traitement mesuré","telemetry.inter_attempt_gaps":"Intervalles entre tentatives","telemetry.outside_window":"Tentatives liées hors date sélectionnée","telemetry.mission_scope":"Périmètre de Mission","telemetry.timeline":"Chronologie","telemetry.timeline_truncated":"Chronologie limitée à {count} observations.","telemetry.invocations":"Invocations fournisseur","telemetry.role":"Rôle","telemetry.cached_input":"Entrée en cache","telemetry.uncached_input":"Entrée hors cache","telemetry.usage_coverage":"Couverture d’usage","telemetry.invocation_id":"ID d’invocation","telemetry.retry_identity":"Numéro de nouvelle tentative","telemetry.relation":"Relation","telemetry.technical_completion":"Achèvement technique","telemetry.qualification_status":"Qualification","telemetry.autonomy_acceptance":"Acceptation de l’autonomie","telemetry.coverage.complete":"Complète","telemetry.coverage.partial":"Partielle","telemetry.coverage.unavailable":"Indisponible","telemetry.coverage.conflict":"Contradictoire","telemetry.phase.parallel_overlap":"Parallèle / chevauchement","telemetry.phase.unassigned":"Non attribué"
4227
+ });
4228
+ Object.assign(DASHBOARD_MESSAGES.es, {
4229
+ "telemetry.less_than_one_second":"<1 s","telemetry.population":"Población medida","telemetry.elapsed":"Tiempo transcurrido","telemetry.provider_unique_coverage":"Cobertura del proveedor en el tiempo transcurrido","telemetry.provider_cumulative_process":"Duración acumulada del proceso proveedor","telemetry.unassigned":"Tiempo no asignado","telemetry.observed_input":"Entrada observada","telemetry.observed_output":"Salida observada","telemetry.cache_ratio":"Proporción de caché","telemetry.measurement_coverage":"Cobertura de medición","telemetry.contract_version":"Contrato de cálculo","telemetry.inclusive_title":"Carga de fase inclusiva","telemetry.inclusive_help":"Los tiempos inclusivos pueden solaparse; sus porcentajes no son aditivos.","telemetry.exclusive_title":"Distribución exclusiva del tiempo transcurrido","telemetry.exclusive_help":"Distribución sin solapamiento del tiempo medido; el trabajo independiente simultáneo aparece como paralelo/solapamiento.","telemetry.category":"Categoría","telemetry.duration":"Duración","telemetry.longest_individual_span":"Tramo individual más largo","telemetry.scope_attempt":"Este intento","telemetry.scope_chain":"Cadena de ejecución completa","telemetry.chain_coverage":"Cobertura de la cadena","telemetry.chain_attempts":"Intentos en la cadena","telemetry.original_attempts":"Intentos originales","telemetry.retries":"Reintentos","telemetry.resumes":"Reanudaciones","telemetry.chain_elapsed":"Tiempo transcurrido de la cadena","telemetry.chain_processing":"Tiempo de procesamiento medido","telemetry.inter_attempt_gaps":"Intervalos entre intentos","telemetry.outside_window":"Intentos relacionados fuera de la fecha","telemetry.mission_scope":"Ámbito de Mission","telemetry.timeline":"Cronología","telemetry.timeline_truncated":"Cronología limitada a {count} observaciones.","telemetry.invocations":"Invocaciones del proveedor","telemetry.role":"Rol","telemetry.cached_input":"Entrada en caché","telemetry.uncached_input":"Entrada sin caché","telemetry.usage_coverage":"Cobertura de uso","telemetry.invocation_id":"ID de invocación","telemetry.retry_identity":"Número de reintento","telemetry.relation":"Relación","telemetry.technical_completion":"Finalización técnica","telemetry.qualification_status":"Calificación","telemetry.autonomy_acceptance":"Aceptación de autonomía","telemetry.coverage.complete":"Completa","telemetry.coverage.partial":"Parcial","telemetry.coverage.unavailable":"No disponible","telemetry.coverage.conflict":"En conflicto","telemetry.phase.parallel_overlap":"Paralelo / solapamiento","telemetry.phase.unassigned":"No asignado"
4230
+ });