engineering-platform 2.3.82__tar.gz → 2.3.87__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.
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/PKG-INFO +1 -1
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/pyproject.toml +1 -1
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json +1 -1
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json +4 -4
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/agent_state.py +30 -1
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/assets/dashboard.css +8 -4
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/assets/dashboard.js +98 -103
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/assets/dashboard_locales.mjs +45 -10
- engineering_platform-2.3.87/src/engineering_platform/assurance_scope.py +74 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/central_operational_reset.py +216 -15
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_executor.py +56 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_finalization.py +9 -3
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_host.py +683 -21
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_reporting.py +7 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_repository.py +233 -6
- engineering_platform-2.3.87/src/engineering_platform/merge_delegation.py +210 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/platform_version.py +1 -1
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/providers.py +10 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/repository_handoff.py +10 -10
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/server.py +222 -4
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/server_console_services.py +53 -20
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/storage.py +6 -1
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/submission_service.py +240 -4
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/templates/workspace-config.json +1 -1
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/validation_profile.py +33 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform.egg-info/PKG-INFO +1 -1
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform.egg-info/SOURCES.txt +2 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/README.md +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/setup.cfg +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/__init__.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/__main__.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/agent_trust.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/assets/dashboard_status_store.mjs +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/assets/dashboard_translation.mjs +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/assets/operations-console/apple-touch-icon-dark.png +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/assets/operations-console/apple-touch-icon-light.png +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/assets/operations-console/icon-dark.png +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/assets/operations-console/icon-light.png +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/assets/operations-console/icon-transparent.png +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/assets/operations-console/manifest.webmanifest +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/capability_preflight.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/capability_review.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/central_data_transfer.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/central_database.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/central_store_migration.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/codex_capacity.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/codex_chat.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/codex_observability.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/component_lock.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/component_logging.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/console_presentation.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/console_route_ownership.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/contracts/__init__.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/contracts/ep_consumer.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/contracts/models.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/contracts/projection.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/dashboard_browser_validation.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/dashboard_state.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/dashboard_supervisor.swift +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/dashboard_translation.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/dependabot_producer.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/development_profile.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/drift_diagnostics.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/emergency_recovery.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/engineering_memory.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/ep_consumer_credentials.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/evidence_projection.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_activity.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_context.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_errors.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_evidence.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_host_evidence.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_lease.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_lifecycle.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_models.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_readiness.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_timeout_policy.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_timing.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/execution_transaction.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/external_producer_binding.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/file_inbox.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/forensic_attribution.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/forensic_attribution_v2.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/forensic_delta.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/golden_scenario.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/historical_dashboard_configuration.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/host_admin.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/host_preflight.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/installation_relocation.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/installation_update_activation.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/installation_update_admission.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/installation_update_backup.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/installation_update_composition.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/installation_update_executor.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/installation_update_migration.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/installation_update_operation.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/installation_update_plan.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/installation_update_preparation.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/investigation_ledger.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/legacy_inbox_migration.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/legacy_installation_adoption.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/lifecycle_worker.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/live_status.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/local_api.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/local_api_keychain.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/local_repository_binding.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/managed_autonomy.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/managed_codex_runtime.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/operational_installation.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/operational_installation_lock.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/operational_installation_record.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/owner_credential_recovery.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/parity_context.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/parity_lifecycle_dispatcher.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/platform_admin.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/platform_api.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/platform_bootstrap.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/platform_components.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/pr_check_repair.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/pr_evidence_backfill.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/producer.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/product_installation_readback.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/project_agent.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/project_agent_service.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/project_topology.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/prompt_history.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/provider_context.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/provider_context_benchmark.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/provider_context_scope.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/provider_interruption.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/provider_process_identity.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/provider_readiness.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/provider_recovery.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/provider_usage.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/qualification.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/qualification_runtime.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/recommendation_handoff.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/reconciliation_adoption.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/release_operation.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/report_analysis.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/repository_attachment.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/resources.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/reviewer_evidence.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/revision_binding.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/schemas/producer-readback-v1.2.schema.json +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/schemas/producer-readback-v1.schema.json +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/schemas/repository-attachment.schema.json +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/server_relay.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/server_service.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/status_model.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/status_reconciliation.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/submission_cli.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/submission_intake.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/system_installation_topology.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/system_server_service.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/telemetry.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/telemetry_contract.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/telemetry_export.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/telemetry_metrics.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/terminal_evidence_reconciliation.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/validation_identity.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/version_preparation_delivery.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/workspace_preflight.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/worktree_provenance.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/worktree_tooling.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform.egg-info/dependency_links.txt +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform.egg-info/entry_points.txt +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform.egg-info/top_level.txt +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/tests/test_adaptive_action_sizing_design.py +0 -0
- {engineering_platform-2.3.82 → engineering_platform-2.3.87}/tests/test_role_task_model_policy_design.py +0 -0
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"bootstrap_contract": "2026.12",
|
|
3
3
|
"checkpoint_format": 1,
|
|
4
|
-
"dashboard_version": "2.3.
|
|
4
|
+
"dashboard_version": "2.3.87",
|
|
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.
|
|
9
|
+
"platform_version": "2.3.87",
|
|
10
10
|
"report_format": 2,
|
|
11
|
-
"runner_version": "2.3.
|
|
11
|
+
"runner_version": "2.3.87",
|
|
12
12
|
"status_model": 1,
|
|
13
13
|
"storage_schema": 45,
|
|
14
|
-
"watcher_version": "2.3.
|
|
14
|
+
"watcher_version": "2.3.87"
|
|
15
15
|
}
|
{engineering_platform-2.3.82 → engineering_platform-2.3.87}/src/engineering_platform/agent_state.py
RENAMED
|
@@ -140,6 +140,12 @@ class TransactionState:
|
|
|
140
140
|
finalization_head_sha: str | None = None
|
|
141
141
|
finalization_merge_commit: str | None = None
|
|
142
142
|
reconciliation_pull_request: int | None = None
|
|
143
|
+
reconciliation_head_sha: str | None = None
|
|
144
|
+
reconciliation_merge_commit: str | None = None
|
|
145
|
+
delivery_control_validation_required: bool = False
|
|
146
|
+
merge_delegation_id: str | None = None
|
|
147
|
+
delegated_merge_attempt: str | None = None
|
|
148
|
+
delegated_merge_actor_reference: str | None = None
|
|
143
149
|
latest_repository_evidence: str | None = None
|
|
144
150
|
latest_github_evidence: str | None = None
|
|
145
151
|
agent_execution_seconds: float | None = None
|
|
@@ -186,6 +192,12 @@ class TransactionState:
|
|
|
186
192
|
"finalization_branch": None, "finalization_pull_request": None,
|
|
187
193
|
"finalization_head_sha": None, "finalization_merge_commit": None,
|
|
188
194
|
"reconciliation_pull_request": None,
|
|
195
|
+
"reconciliation_head_sha": None,
|
|
196
|
+
"reconciliation_merge_commit": None,
|
|
197
|
+
"delivery_control_validation_required": False,
|
|
198
|
+
"merge_delegation_id": None,
|
|
199
|
+
"delegated_merge_attempt": None,
|
|
200
|
+
"delegated_merge_actor_reference": None,
|
|
189
201
|
"latest_repository_evidence": None, "latest_github_evidence": None,
|
|
190
202
|
"agent_execution_seconds": None,
|
|
191
203
|
"validation_evidence": (),
|
|
@@ -257,6 +269,16 @@ class TransactionState:
|
|
|
257
269
|
raise StateError("checkpoint diagnostic is invalid or unsafe")
|
|
258
270
|
if not isinstance(state.owner_authorized, bool) or state.transaction_kind not in {"IMPLEMENTATION", "FINALIZATION", "RECONCILIATION"} or state.execution_mode not in {"MANAGED", "GENESIS"} or state.action_intent not in {"MUTATING_DELIVERY", "VALIDATION_ONLY"}:
|
|
259
271
|
raise StateError("checkpoint authorization or transaction kind is invalid")
|
|
272
|
+
if not isinstance(state.delivery_control_validation_required, bool):
|
|
273
|
+
raise StateError("checkpoint delivery control validation flag is invalid")
|
|
274
|
+
if state.merge_delegation_id is not None and re.fullmatch(r"[0-9a-f]{32}", state.merge_delegation_id) is None:
|
|
275
|
+
raise StateError("checkpoint merge delegation identifier is invalid")
|
|
276
|
+
if state.delegated_merge_attempt is not None and re.fullmatch(r"[1-9][0-9]*:[0-9a-f]{40}", state.delegated_merge_attempt) is None:
|
|
277
|
+
raise StateError("checkpoint delegated merge attempt is invalid")
|
|
278
|
+
if state.delegated_merge_actor_reference is not None and re.fullmatch(r"local-uid:[0-9]+", state.delegated_merge_actor_reference) is None:
|
|
279
|
+
raise StateError("checkpoint delegated merge actor is invalid")
|
|
280
|
+
if state.reconciliation_head_sha is not None and re.fullmatch(r"[0-9a-f]{40}", state.reconciliation_head_sha) is None:
|
|
281
|
+
raise StateError("checkpoint reconciliation head is invalid")
|
|
260
282
|
if state.admission_decision not in {"NOT_STARTED", "PASS", "FAIL", "BLOCKED", "UNAVAILABLE"}:
|
|
261
283
|
raise StateError("checkpoint admission decision is invalid")
|
|
262
284
|
if state.admission_decision == "PASS" and not isinstance(state.admission_completed_at, str):
|
|
@@ -283,7 +305,7 @@ class TransactionState:
|
|
|
283
305
|
raise StateError("genesis repository path is invalid")
|
|
284
306
|
if state.genesis_commit_sha is not None and (not isinstance(state.genesis_commit_sha, str) or not re.fullmatch(r"[0-9a-f]{40}", state.genesis_commit_sha)):
|
|
285
307
|
raise StateError("genesis commit SHA is invalid")
|
|
286
|
-
optional_sha_fields = (state.implementation_head_sha, state.implementation_merge_commit, state.finalization_head_sha, state.finalization_merge_commit)
|
|
308
|
+
optional_sha_fields = (state.implementation_head_sha, state.implementation_merge_commit, state.finalization_head_sha, state.finalization_merge_commit, state.reconciliation_merge_commit)
|
|
287
309
|
if any(value is not None and (not isinstance(value, str) or not re.fullmatch(r"[0-9a-f]{40}", value)) for value in optional_sha_fields):
|
|
288
310
|
raise StateError("checkpoint lifecycle SHA is invalid")
|
|
289
311
|
optional_pr_fields = (state.implementation_pull_request, state.finalization_pull_request, state.reconciliation_pull_request)
|
|
@@ -411,14 +433,21 @@ class TransactionState:
|
|
|
411
433
|
profile_fields = {"version", "digest", "candidate_sha"}
|
|
412
434
|
current_profile_fields = profile_fields | {"criteria_digest"}
|
|
413
435
|
validation_bound_profile_fields = current_profile_fields | {"validation_profile_digest"}
|
|
436
|
+
base_bound_profile_fields = current_profile_fields | {"base_sha"}
|
|
437
|
+
fully_bound_profile_fields = validation_bound_profile_fields | {"base_sha"}
|
|
414
438
|
if state.assurance_profile is not None and (
|
|
415
439
|
not isinstance(state.assurance_profile, dict)
|
|
416
440
|
or set(state.assurance_profile) not in (
|
|
417
441
|
profile_fields, current_profile_fields, validation_bound_profile_fields,
|
|
442
|
+
base_bound_profile_fields, fully_bound_profile_fields,
|
|
418
443
|
)
|
|
419
444
|
or not all(isinstance(value, str) and value for value in state.assurance_profile.values())
|
|
420
445
|
or not re.fullmatch(r"sha256:[0-9a-f]{64}", state.assurance_profile["digest"])
|
|
421
446
|
or not re.fullmatch(r"[0-9a-f]{40}", state.assurance_profile["candidate_sha"])
|
|
447
|
+
or (
|
|
448
|
+
"base_sha" in state.assurance_profile
|
|
449
|
+
and not re.fullmatch(r"[0-9a-f]{40}", state.assurance_profile["base_sha"])
|
|
450
|
+
)
|
|
422
451
|
or (
|
|
423
452
|
"validation_profile_digest" in state.assurance_profile
|
|
424
453
|
and not re.fullmatch(
|
|
@@ -82,6 +82,8 @@ pre{white-space:pre-wrap;word-break:break-word;margin:5px 0 0;font:12px ui-monos
|
|
|
82
82
|
.chat-message--user{background:#243648;border:1px solid #8dc7ff}.chat-message--assistant{background:#34283f;border-color:#d0a4ff}
|
|
83
83
|
#reportContent,#reportAnalysisContent{box-sizing:border-box;max-height:50dvh;overflow:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;background:#18181f;border:1px solid var(--category-color);border-radius:8px;padding:10px;user-select:text}.markdown-document{font-family:system-ui,sans-serif;line-height:1.45}.markdown-document p{margin:0 0 10px}.markdown-document p:last-child{margin-bottom:0}.markdown-document h3,.markdown-document h4{color:var(--category-color);margin:0 0 10px}.markdown-document ul,.markdown-document ol{margin:0 0 10px;padding-left:24px}.markdown-document code,.markdown-document pre{font-family:"Unispace",ui-monospace,monospace}.markdown-document code{background:#24242d;border-radius:4px;padding:1px 4px}.markdown-document pre{background:#24242d;border-radius:6px;margin:0 0 10px;overflow:auto;padding:8px}
|
|
84
84
|
.markdown-copy-wrap{position:relative}.markdown-copy-wrap .markdown-document,.markdown-copy-wrap>#reportContent,.markdown-copy-wrap>#reportAnalysisContent{padding-right:108px}.copy.copy--glyph,.download.download--glyph{align-items:center;background:#24242de6;border-color:var(--category-color);border-radius:50%;box-shadow:0 2px 8px #0008;display:flex;float:none;font-size:0;height:32px;justify-content:center;min-height:32px;min-width:32px;padding:0;position:absolute;top:10px;width:32px;z-index:2}.copy.copy--glyph{right:14px}.download.download--glyph{right:54px}.copy.copy--glyph::before{content:"⧉";font:20px/1 system-ui}.download.download--glyph::before{content:"⇩";font:20px/1 system-ui}.copy.copy--glyph:hover,.download.download--glyph:hover{background:#353541}.copy.copy--glyph:focus-visible,.download.download--glyph:focus-visible{outline-color:var(--category-color)}
|
|
85
|
+
.markdown-document table,.chat-message__body table{border-collapse:collapse;display:block;margin:0 0 12px;max-width:100%;overflow-x:auto}.markdown-document :is(th,td),.chat-message__body :is(th,td){border:1px solid var(--category-color);padding:6px 9px;text-align:left;white-space:nowrap}.markdown-document th,.chat-message__body th{background:color-mix(in srgb,var(--category-color) 18%,transparent);font-weight:700}
|
|
86
|
+
.report-view-modal__content .markdown-code-block{border:1px solid #475569;line-height:1.5}.report-view-modal__content .markdown-code-block code{background:transparent;padding:0}.report-view-modal__content .markdown-json-key{color:#8dc7ff}.report-view-modal__content .markdown-json-string{color:#8ee4b4}.report-view-modal__content .markdown-json-number{color:#f3c985}.report-view-modal__content .markdown-json-literal{color:#d6b0ff}.report-view-modal__content .markdown-json-punctuation{color:#b7c5d6}
|
|
85
87
|
.chat-compose .chat-send{background:#121217;border-color:#d0a4ff;color:#d0a4ff}
|
|
86
88
|
#currentRun .current-run__title>.label{display:inline;color:var(--category-color);font-size:17px;font-weight:700;letter-spacing:.04em;line-height:1.25;text-transform:uppercase}.current-run__prompt-heading{margin:8px 0 0}.current-run__prompt-heading h2{margin:0}.execution-identity__run-id{align-items:center;display:flex;flex-wrap:wrap;gap:7px}.execution-identity__run-id>.label{flex-basis:100%;margin-bottom:0}.execution-identity__run-id>.indicator{margin:0}.current-run__category-description{color:#d6bdca;font-size:14px;line-height:1.4;margin:0 0 14px}#currentRun .current-run__grid{margin-top:0}#currentRun .card:has(#currentTime),#currentRun .card:has(#executionEstimate),#currentRun .card:has(#runId),#currentRun .card:has(#executionMode){--category-color:#f472b6;background:#241b25;border-color:#f472b6}
|
|
87
89
|
#report .field,#reportAnalysis .field{background:#18181f;border:1px solid var(--category-color);border-radius:8px;padding:10px}
|
|
@@ -275,10 +277,11 @@ html[data-theme="light"] :is(#rateLimitReset,#codexCliUpdate){background:#e8fff5
|
|
|
275
277
|
/* The shared modal shell owns the prompt-detail frame and header. This
|
|
276
278
|
component owns only its evidence layout and its inner document cards. */
|
|
277
279
|
.prompt-detail-modal__panel{display:grid;grid-template-rows:auto auto minmax(0,1fr);height:100%;overflow:hidden}.prompt-detail-modal__content{align-items:start;box-sizing:border-box;display:grid;gap:18px;grid-template-columns:minmax(0,1fr) minmax(280px,.82fr);min-height:0;overflow:auto;overscroll-behavior:contain;padding:0 12px 10px;scrollbar-gutter:stable both-edges}.prompt-detail-leftbar,.prompt-detail-rightbar{align-content:start;align-items:start;display:grid;gap:18px;grid-row:1;min-width:0}.prompt-detail-leftbar{grid-column:1}.prompt-detail-rightbar{grid-column:2}.prompt-detail-leftbar :is(.prompt-detail-card--execution-summary,.prompt-detail-sidebar),.prompt-detail-rightbar :is(.prompt-detail-card--execution-context,.prompt-detail-card--pull-requests){grid-column:auto;grid-row:auto}.prompt-detail-sidebar{align-content:start;align-items:start;display:grid;gap:18px}.prompt-detail-card{border:1px solid var(--category-color);border-radius:14px;padding:18px}.prompt-detail-card--wide{grid-column:1/-1}.prompt-detail-card h3{color:var(--category-color);font-size:18px;margin:0 0 14px}.prompt-detail-card .field{margin:0 0 14px}.prompt-detail-card .field:last-child{margin-bottom:0}.prompt-detail-card pre{overflow-wrap:anywhere;white-space:pre-wrap}.prompt-detail-diagnostic>span:last-child{white-space:pre-wrap}.prompt-detail-card--execution-context{min-width:0;overflow:hidden}.prompt-detail-card--execution-context :is(.field,.label,span,li){min-width:0;overflow-wrap:anywhere;word-break:break-word}.detail-list-field ul{margin:6px 0 0;padding-inline-start:22px}@media (max-width:620px){.prompt-detail-modal__content{grid-template-columns:1fr;padding-inline:8px}.prompt-detail-leftbar,.prompt-detail-rightbar{grid-column:1;grid-row:auto}}
|
|
278
|
-
.prompt-detail-provider-review{display:grid;gap:18px;grid-column:1/-1;grid-template-columns:minmax(0,1fr) minmax(
|
|
279
|
-
.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:
|
|
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
|
+
.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
|
+
.prompt-detail-card--evidence pre,.prompt-detail-card--reviewers pre,.prompt-detail-card--assurance-reviews pre{font-family:inherit}
|
|
280
283
|
.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}
|
|
281
|
-
.prompt-detail-commit-timeline__phase{--commit-kind-color:#8dc7ff;border-left:3px solid var(--commit-kind-color);padding-left:10px}.prompt-detail-commit-timeline__phase--implementation{--commit-kind-color:#65c5d9}.prompt-detail-commit-timeline__phase--validation{--commit-kind-color:#65d9a3}.prompt-detail-commit-timeline__phase--quality{--commit-kind-color:#c29aff}.prompt-detail-commit-timeline__phase--repair{--commit-kind-color:#f4c34f}.prompt-detail-commit-timeline__phase--finalization{--commit-kind-color:#ff99a7}.prompt-detail-commit-timeline__phase--implementation_merge,.prompt-detail-commit-timeline__phase--finalization_merge,.prompt-detail-commit-timeline__phase--reconciliation_merge{--commit-kind-color:#f3d36a}.prompt-detail-commit-timeline__phase--reconciliation{--commit-kind-color:#73d6b0}.prompt-detail-commit-timeline__phase h4{align-items:center;color:var(--commit-kind-color);display:flex;gap:7px}.prompt-detail-commit-timeline__kind{border:1px solid currentColor;border-radius:999px;font-size:10px;line-height:1;padding:4px 6px}.prompt-detail-commit-timeline__phase-name{color:var(--dashboard-modal-muted);font-size:11px;font-weight:500;letter-spacing:0;text-transform:none}
|
|
284
|
+
.prompt-detail-commit-timeline__phase{--commit-kind-color:#8dc7ff;border-left:3px solid var(--commit-kind-color);padding-left:10px}.prompt-detail-commit-timeline__phase--implementation{--commit-kind-color:#65c5d9}.prompt-detail-commit-timeline__phase--validation{--commit-kind-color:#65d9a3}.prompt-detail-commit-timeline__phase--quality{--commit-kind-color:#c29aff}.prompt-detail-commit-timeline__phase--repair{--commit-kind-color:#f4c34f}.prompt-detail-commit-timeline__phase--finalization{--commit-kind-color:#ff99a7}.prompt-detail-commit-timeline__phase--implementation_merge,.prompt-detail-commit-timeline__phase--finalization_merge,.prompt-detail-commit-timeline__phase--reconciliation_merge{--commit-kind-color:#f3d36a}.prompt-detail-commit-timeline__phase--reconciliation{--commit-kind-color:#73d6b0}.prompt-detail-commit-timeline__phase h4{align-items:center;color:var(--commit-kind-color);display:flex;gap:7px}.prompt-detail-commit-timeline__kind{border:1px solid currentColor;border-radius:999px;font-size:10px;line-height:1;padding:4px 6px}.prompt-detail-commit-timeline__phase-name{color:var(--dashboard-modal-muted);font-size:11px;font-weight:500;letter-spacing:0;text-transform:none;white-space:nowrap}
|
|
282
285
|
|
|
283
286
|
/* Dialog shells may receive programmatic focus, but only their controls need a visible ring. */
|
|
284
287
|
:where(.component-modal,.confirmation-modal,.report-view-modal,.prompt-detail-modal,.prompt-chat-modal):focus,:where(.component-modal,.confirmation-modal,.report-view-modal,.prompt-detail-modal,.prompt-chat-modal):focus-visible{box-shadow:none;outline:none}
|
|
@@ -361,6 +364,7 @@ html[data-theme="light"] #promptHistory .execution-history-action{background:#ff
|
|
|
361
364
|
|
|
362
365
|
/* Light report modals keep markdown code on readable light surfaces. */
|
|
363
366
|
html[data-theme="light"] .report-view-modal__content :is(pre,code){background:#eef4fb;color:#182230}
|
|
367
|
+
html[data-theme="light"] .report-view-modal__content .markdown-code-block code{background:transparent}html[data-theme="light"] .report-view-modal__content .markdown-json-key{color:#185d9d}html[data-theme="light"] .report-view-modal__content .markdown-json-string{color:#167143}html[data-theme="light"] .report-view-modal__content .markdown-json-number{color:#965513}html[data-theme="light"] .report-view-modal__content .markdown-json-literal{color:#7346a7}html[data-theme="light"] .report-view-modal__content .markdown-json-punctuation{color:#52637a}
|
|
364
368
|
|
|
365
369
|
|
|
366
370
|
/* Engineering Platform is a generic platform label and uses the orange house style. */
|
|
@@ -986,7 +990,7 @@ html[data-theme="light"] ::-webkit-scrollbar-thumb:hover{background:#0a6b9d}
|
|
|
986
990
|
/* Telemetry can contain multiple long tables. Keep its outer dialog within
|
|
987
991
|
the visual viewport and scroll only its evidence body on small screens. */
|
|
988
992
|
.telemetry-detail-modal{--modal-accent:#fb7185;--category-color:var(--modal-accent);--modal-outer-gutter:24px;--modal-panel-max-width:1120px;--modal-shell-inset:24px;--modal-shell-padding:0}.telemetry-detail-modal__panel{--modal-header-inset:var(--dashboard-modal-panel-padding);display:grid;grid-template-rows:auto auto minmax(0,1fr);height:100%;max-height:100%;overflow:hidden;width:min(1120px,100%)}.telemetry-detail-modal__content{max-height:none;min-height:0;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;padding:0 4px 4px}@media(max-width:620px){.telemetry-detail-modal__panel{--modal-header-inset:18px;padding:18px}.telemetry-detail-modal__content{padding-inline:2px}}
|
|
989
|
-
.lifecycle-detail-modal{--modal-default-accent:#65c5d9}.lifecycle-detail-modal__panel{background:var(--modal-surface);border:2px solid var(--modal-accent);border-radius:var(--dashboard-modal-radius);box-sizing:border-box;color:var(--dashboard-modal-ink);display:grid;grid-template-rows:auto minmax(0,1fr);max-width:min(
|
|
993
|
+
.lifecycle-detail-modal{--modal-default-accent:#65c5d9;--modal-panel-max-width:920px}.lifecycle-detail-modal__panel{background:var(--modal-surface);border:2px solid var(--modal-accent);border-radius:var(--dashboard-modal-radius);box-sizing:border-box;color:var(--dashboard-modal-ink);display:grid;grid-template-rows:auto minmax(0,1fr);max-width:min(920px,calc(100vw - 32px));overflow:hidden;padding:var(--dashboard-modal-panel-padding);width:100%}.lifecycle-detail-modal__content{color:var(--dashboard-modal-ink);display:grid;gap:18px;max-height:none;min-height:0;overflow:auto;overscroll-behavior:contain;padding:4px}.lifecycle-detail-modal__content .field>span:last-child{color:var(--dashboard-modal-ink)}.lifecycle-detail-modal__content h3{color:var(--modal-accent);font-size:16px;margin:0 0 8px}.lifecycle-detail-modal :is(.label,.lifecycle-detail-modal__phase-list strong){color:var(--modal-secondary-accent)}.lifecycle-detail-modal__phase-list{display:grid;gap:8px;list-style:none;margin:0;padding:0}.lifecycle-detail-modal__phase-list li{align-items:baseline;border-bottom:1px solid color-mix(in srgb,var(--modal-accent) 32%,transparent);display:flex;gap:12px;justify-content:space-between;padding:8px 0}.lifecycle-detail-modal__phase-list li:last-child{border-bottom:0}.lifecycle-detail-modal__assurance-evidence .lifecycle-detail-modal__phase-list strong{flex:0 0 auto;white-space:nowrap}.lifecycle-detail-modal__assurance-evidence .lifecycle-detail-modal__phase-list span{flex:1 1 0;min-width:0;overflow-wrap:anywhere}.lifecycle-detail-modal__phase-list span{color:var(--dashboard-modal-muted);text-align:start}html[data-theme="light"] .lifecycle-detail-modal :is(.label,.lifecycle-detail-modal__phase-list strong){color:color-mix(in srgb,var(--modal-secondary-accent) 76%,#182230)}@media(max-width:620px){.lifecycle-detail-modal__panel{max-width:calc(100vw - 32px);padding:18px}.lifecycle-detail-modal__phase-list li{align-items:flex-start;flex-direction:column;gap:4px}.lifecycle-detail-modal__phase-list span{text-align:start}.lifecycle-detail-modal__assurance-evidence .lifecycle-detail-modal__phase-list strong{white-space:normal}}
|
|
990
994
|
/* A telemetry Run-ID is a redundant activator inside an interactive row.
|
|
991
995
|
The row owns its continuous rose selection surface, never the text itself. */
|
|
992
996
|
.telemetry-run-link{-webkit-appearance:none;appearance:none;background:transparent;border:0;color:inherit;cursor:pointer;font:inherit;line-height:inherit;min-height:0;min-width:0;padding:0;text-align:left;text-decoration:none;white-space:nowrap}.telemetry-run-link:is(:hover,:active){background:transparent!important;color:inherit!important}.telemetry-run-link:is(:focus,:focus-visible){border-color:transparent!important;box-shadow:none!important;outline:0!important}
|
|
@@ -307,41 +307,6 @@ function finalStatus(phase) {
|
|
|
307
307
|
if (phase === "FAILED") return ["red", t("status.failed")];
|
|
308
308
|
return ["grey", t("status.unknown")];
|
|
309
309
|
}
|
|
310
|
-
function executionRange(x) {
|
|
311
|
-
const characters = Number(x.prompt_characters) || 0;
|
|
312
|
-
if (characters <= 2e3) return [6, 10];
|
|
313
|
-
if (characters <= 6e3) return [10, 18];
|
|
314
|
-
if (characters <= 12e3) return [16, 26];
|
|
315
|
-
return [24, 38];
|
|
316
|
-
}
|
|
317
|
-
function pluralMinutes(value) {
|
|
318
|
-
return locale.plural(value, "unit.minute", "unit.minutes");
|
|
319
|
-
}
|
|
320
|
-
function historicalRange(estimate, fallback) {
|
|
321
|
-
const samples = Number(estimate?.sample_count) || 0,
|
|
322
|
-
lower = Number(estimate?.lower_seconds),
|
|
323
|
-
upper = Number(estimate?.upper_seconds);
|
|
324
|
-
if (samples < 2 || !Number.isFinite(lower) || !Number.isFinite(upper)) return fallback;
|
|
325
|
-
const learnedMinimum = Math.max(1, Math.round(lower / 60)),
|
|
326
|
-
learnedMaximum = Math.max(learnedMinimum, Math.ceil(upper / 60));
|
|
327
|
-
// The exact runtime profile's size-adjusted history is more informative
|
|
328
|
-
// than the coarse static table. Keep a small safety contribution from the
|
|
329
|
-
// latter, with confidence increasing as more comparable runs exist.
|
|
330
|
-
const historyWeight = samples >= 8 ? 0.9 : samples >= 4 ? 0.85 : 0.8;
|
|
331
|
-
return [
|
|
332
|
-
Math.max(1, Math.round(fallback[0] * (1 - historyWeight) + learnedMinimum * historyWeight)),
|
|
333
|
-
Math.max(1, Math.round(fallback[1] * (1 - historyWeight) + learnedMaximum * historyWeight)),
|
|
334
|
-
];
|
|
335
|
-
}
|
|
336
|
-
function historicalContext(estimate, fallback) {
|
|
337
|
-
const samples = Number(estimate?.sample_count) || 0;
|
|
338
|
-
return samples >= 2
|
|
339
|
-
? t("estimate.historical_context", { count: samples })
|
|
340
|
-
: fallback;
|
|
341
|
-
}
|
|
342
|
-
function hasHistoricalEstimate(estimate) {
|
|
343
|
-
return (Number(estimate?.sample_count) || 0) >= 2;
|
|
344
|
-
}
|
|
345
310
|
function phaseAwareRange(estimate) {
|
|
346
311
|
const samples = Number(estimate?.phase_sample_count) || 0,
|
|
347
312
|
lower = Number(estimate?.remaining_lower_seconds),
|
|
@@ -349,75 +314,31 @@ function phaseAwareRange(estimate) {
|
|
|
349
314
|
if (estimate?.phase_aware !== true || samples < 2 || !Number.isFinite(lower) || !Number.isFinite(upper)) return null;
|
|
350
315
|
return [Math.max(1, Math.round(lower / 60)), Math.max(1, Math.ceil(upper / 60))];
|
|
351
316
|
}
|
|
352
|
-
function exceededEstimateContext(durationEstimate, elapsedContext = "") {
|
|
353
|
-
const values = [elapsedContext, t("estimate.exceeded_context")];
|
|
354
|
-
if (hasHistoricalEstimate(durationEstimate)) values.push(historicalContext(durationEstimate, ""));
|
|
355
|
-
return values.filter(Boolean).join("\n");
|
|
356
|
-
}
|
|
357
317
|
function estimate(x, durationEstimate = {}) {
|
|
358
318
|
const phase = x.current_phase || "";
|
|
359
319
|
const phaseRange = phaseAwareRange(durationEstimate);
|
|
320
|
+
const activePhases = ["INITIALIZE", "CAPABILITY_REVIEW", "EXECUTE_AGENT", "LOCAL_REPOSITORY_VALIDATION", "QUALITY_CONTROL_AGENT", "REPAIR_AGENT", "FINALIZATION_REPAIR_AGENT", "FINALIZE_AGENT", "RECONCILE_AGENT", "REPOSITORY_CLEANUP", "WAIT_FOR_TERMINAL_EVIDENCE", "WAIT_FOR_OPERATOR_MERGE"];
|
|
321
|
+
const phaseContext = phase ? t("estimate.current_phase", { phase: t("state." + phase, {}, phase) }) : "";
|
|
322
|
+
const activeContext = (...details) => [phaseContext, ...details].filter(Boolean).join("\n");
|
|
360
323
|
if (["INITIALIZE", "EXECUTE_AGENT", "REPAIR_AGENT", "FINALIZATION_REPAIR_AGENT", "FINALIZE_AGENT", "REPOSITORY_CLEANUP"].includes(phase) && phaseRange) {
|
|
361
324
|
const remainingUpperSeconds = Number(durationEstimate?.remaining_upper_seconds);
|
|
362
325
|
if (Number.isFinite(remainingUpperSeconds) && remainingUpperSeconds <= 0) {
|
|
363
326
|
return {
|
|
364
|
-
summary: t("estimate.
|
|
365
|
-
context:
|
|
327
|
+
summary: t("estimate.remaining_unknown"),
|
|
328
|
+
context: activeContext(t("estimate.internal_exceeded"), t("estimate.internal_context")),
|
|
366
329
|
};
|
|
367
330
|
}
|
|
368
331
|
const [minimum, maximum] = phaseRange;
|
|
369
332
|
return {
|
|
370
|
-
summary: t("estimate.
|
|
371
|
-
context:
|
|
333
|
+
summary: t("estimate.remaining_unknown"),
|
|
334
|
+
context: activeContext(t("estimate.internal_remaining", { minimum, maximum }), t("estimate.internal_context")),
|
|
372
335
|
};
|
|
373
336
|
}
|
|
374
|
-
if (phase === "INITIALIZE")
|
|
375
|
-
return { summary: t("estimate.initializing"), context: "" };
|
|
376
|
-
if (["EXECUTE_AGENT", "REPAIR_AGENT", "FINALIZATION_REPAIR_AGENT"].includes(phase)) {
|
|
377
|
-
const [minimum, maximum] = historicalRange(durationEstimate, executionRange(x));
|
|
378
|
-
if (!promptStartedAt)
|
|
379
|
-
return {
|
|
380
|
-
summary: t("estimate.total", { minimum, maximum }),
|
|
381
|
-
context: historicalContext(durationEstimate, t("estimate.total_context")),
|
|
382
|
-
};
|
|
383
|
-
const elapsed = Math.max(
|
|
384
|
-
0,
|
|
385
|
-
Math.floor((Date.now() - promptStartedAt) / 6e4),
|
|
386
|
-
),
|
|
387
|
-
remainingMinimum = Math.max(1, minimum - elapsed),
|
|
388
|
-
remainingMaximum = Math.max(remainingMinimum, maximum - elapsed);
|
|
389
|
-
const elapsedContext = t("estimate.elapsed", { elapsed, minutes: pluralMinutes(elapsed) });
|
|
390
|
-
if (maximum - elapsed <= 0) {
|
|
391
|
-
return {
|
|
392
|
-
summary: t("estimate.exceeded"),
|
|
393
|
-
context: exceededEstimateContext(durationEstimate, elapsedContext),
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
return {
|
|
397
|
-
summary: t("estimate.remaining", { minimum: remainingMinimum, maximum: remainingMaximum }),
|
|
398
|
-
context: hasHistoricalEstimate(durationEstimate)
|
|
399
|
-
? `${elapsedContext}\n${historicalContext(durationEstimate, "")}`
|
|
400
|
-
: elapsedContext,
|
|
401
|
-
};
|
|
402
|
-
}
|
|
403
|
-
if (phase === "FINALIZE_AGENT")
|
|
404
|
-
return {
|
|
405
|
-
summary: t("estimate.finalizing"),
|
|
406
|
-
context: t("estimate.finalizing_context"),
|
|
407
|
-
};
|
|
408
|
-
if (phase === "REPOSITORY_CLEANUP")
|
|
409
|
-
return {
|
|
410
|
-
summary: t("estimate.cleanup"),
|
|
411
|
-
context: t("estimate.cleanup_context"),
|
|
412
|
-
};
|
|
413
|
-
if (phase === "WAIT_FOR_TERMINAL_EVIDENCE")
|
|
414
|
-
return {
|
|
415
|
-
summary: t("estimate.waiting"),
|
|
416
|
-
context: t("estimate.waiting_context"),
|
|
417
|
-
};
|
|
418
337
|
if (phase === "COMPLETE") return { summary: t("status.complete"), context: "" };
|
|
419
338
|
if (["BLOCKED", "FAILED"].includes(phase))
|
|
420
339
|
return { summary: t("estimate.action_required"), context: "" };
|
|
340
|
+
if (activePhases.includes(phase) || x.watcher_state === "ENGINEERING_RUN_ACTIVE")
|
|
341
|
+
return { summary: t("estimate.remaining_unknown"), context: activeContext(t("estimate.remaining_unknown_context")) };
|
|
421
342
|
return { summary: t("estimate.not_available"), context: "" };
|
|
422
343
|
}
|
|
423
344
|
function renderEstimate(x, durationEstimate = latestDurationEstimate) {
|
|
@@ -2211,7 +2132,7 @@ function lifecycleAssuranceEvidence(step) {
|
|
|
2211
2132
|
const reviews = Array.isArray(step?.assurance_reviews) ? step.assurance_reviews : [];
|
|
2212
2133
|
if (!reviews.length) return null;
|
|
2213
2134
|
const section = document.createElement("section");
|
|
2214
|
-
section.className = "lifecycle-detail-modal__quality-evidence";
|
|
2135
|
+
section.className = "lifecycle-detail-modal__quality-evidence lifecycle-detail-modal__assurance-evidence";
|
|
2215
2136
|
const rounds = step?.repair_rounds || {};
|
|
2216
2137
|
section.append(Object.assign(document.createElement("h3"), { textContent: t("lifecycle.detail_assurance") }));
|
|
2217
2138
|
if (Number.isFinite(Number(rounds.used))) section.append(Object.assign(document.createElement("p"), {
|
|
@@ -2411,9 +2332,10 @@ function activeRunPullRequestEntries(execution) {
|
|
|
2411
2332
|
? repository : null;
|
|
2412
2333
|
const seen = new Set();
|
|
2413
2334
|
return [
|
|
2414
|
-
["bound", execution?.pull_request],
|
|
2415
2335
|
["implementation", execution?.implementation_pr],
|
|
2416
2336
|
["finalization", execution?.finalization_pr],
|
|
2337
|
+
["reconciliation", execution?.reconciliation_pr],
|
|
2338
|
+
["bound", execution?.pull_request],
|
|
2417
2339
|
].flatMap(([role, value]) => {
|
|
2418
2340
|
const number = Number(value);
|
|
2419
2341
|
if (!Number.isInteger(number) || number <= 0 || seen.has(number)) return [];
|
|
@@ -2437,6 +2359,7 @@ function renderActivePullRequests(execution, lifecycle) {
|
|
|
2437
2359
|
bound: t("detail.bound_pull_request"),
|
|
2438
2360
|
implementation: t("detail.implementation_pull_request"),
|
|
2439
2361
|
finalization: t("detail.finalization_pull_request"),
|
|
2362
|
+
reconciliation: t("detail.reconciliation_pull_request"),
|
|
2440
2363
|
};
|
|
2441
2364
|
const fields = entries.map((entry) => {
|
|
2442
2365
|
const field = detailField(labels[entry.role], "");
|
|
@@ -3563,22 +3486,65 @@ function appendMarkdownInline(target, value) {
|
|
|
3563
3486
|
}
|
|
3564
3487
|
target.append(document.createTextNode(value.slice(offset)));
|
|
3565
3488
|
}
|
|
3489
|
+
function appendFencedCode(target, lines, language) {
|
|
3490
|
+
const pre = document.createElement("pre"), code = document.createElement("code"),
|
|
3491
|
+
value = lines.join(String.fromCharCode(10));
|
|
3492
|
+
pre.className = "markdown-code-block";
|
|
3493
|
+
if (language === "json") {
|
|
3494
|
+
code.className = "language-json";
|
|
3495
|
+
try {
|
|
3496
|
+
// Highlight only well-formed, bounded JSON. Text nodes and spans keep
|
|
3497
|
+
// report content inert even when a string contains HTML-like markup.
|
|
3498
|
+
if (value.length > 262144) throw new SyntaxError("JSON code block is too large");
|
|
3499
|
+
JSON.parse(value);
|
|
3500
|
+
const tokens = /"(?:\\.|[^"\\])*"|-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?|\b(?:true|false|null)\b|[{}\[\],:]/g;
|
|
3501
|
+
let offset = 0, tokenCount = 0;
|
|
3502
|
+
for (const token of value.matchAll(tokens)) {
|
|
3503
|
+
// Dense valid JSON can have more tokens than characters of prose.
|
|
3504
|
+
// Keep the modal's DOM bounded and show the exact raw code instead.
|
|
3505
|
+
if (++tokenCount > 4096) throw new RangeError("JSON code block has too many tokens");
|
|
3506
|
+
code.append(document.createTextNode(value.slice(offset, token.index)));
|
|
3507
|
+
const span = document.createElement("span"), text = token[0];
|
|
3508
|
+
span.className = `markdown-json-${text.startsWith('"')
|
|
3509
|
+
? /^\s*:/.test(value.slice(token.index + text.length)) ? "key" : "string"
|
|
3510
|
+
: /^[-\d]/.test(text) ? "number"
|
|
3511
|
+
: /^(?:true|false|null)$/.test(text) ? "literal" : "punctuation"}`;
|
|
3512
|
+
span.textContent = text;
|
|
3513
|
+
code.append(span);
|
|
3514
|
+
offset = token.index + text.length;
|
|
3515
|
+
}
|
|
3516
|
+
code.append(document.createTextNode(value.slice(offset)));
|
|
3517
|
+
} catch (error) {
|
|
3518
|
+
code.textContent = value;
|
|
3519
|
+
}
|
|
3520
|
+
} else {
|
|
3521
|
+
code.textContent = value;
|
|
3522
|
+
}
|
|
3523
|
+
pre.append(code);
|
|
3524
|
+
target.append(pre);
|
|
3525
|
+
}
|
|
3566
3526
|
function renderMarkdownAnswer(target, value) {
|
|
3567
3527
|
const newline = String.fromCharCode(10);
|
|
3568
3528
|
let codeLines = null,
|
|
3529
|
+
codeLanguage = "",
|
|
3569
3530
|
list = null,
|
|
3570
3531
|
listType = "";
|
|
3571
|
-
|
|
3532
|
+
const lines = String(value).split(newline);
|
|
3533
|
+
const tableCells = (line) => line.trim().replace(/^\|/, "").replace(/\|$/, "").split(/(?<!\\)\|/).map((cell) => cell.trim().replace(/\\\|/g, "|"));
|
|
3534
|
+
const tableDivider = (line, count) => {
|
|
3535
|
+
const cells = tableCells(line);
|
|
3536
|
+
return cells.length === count && cells.every((cell) => /^:?-{3,}:?$/.test(cell));
|
|
3537
|
+
};
|
|
3538
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
3539
|
+
const line = lines[index];
|
|
3572
3540
|
if (line.startsWith("```")) {
|
|
3573
3541
|
if (codeLines === null) {
|
|
3574
3542
|
codeLines = [];
|
|
3543
|
+
codeLanguage = line.slice(3).trim().toLowerCase();
|
|
3575
3544
|
} else {
|
|
3576
|
-
|
|
3577
|
-
code = document.createElement("code");
|
|
3578
|
-
code.textContent = codeLines.join(newline);
|
|
3579
|
-
pre.append(code);
|
|
3580
|
-
target.append(pre);
|
|
3545
|
+
appendFencedCode(target, codeLines, codeLanguage);
|
|
3581
3546
|
codeLines = null;
|
|
3547
|
+
codeLanguage = "";
|
|
3582
3548
|
}
|
|
3583
3549
|
list = null;
|
|
3584
3550
|
continue;
|
|
@@ -3587,6 +3553,35 @@ function renderMarkdownAnswer(target, value) {
|
|
|
3587
3553
|
codeLines.push(line);
|
|
3588
3554
|
continue;
|
|
3589
3555
|
}
|
|
3556
|
+
if (line.trim().startsWith("|") && index + 1 < lines.length &&
|
|
3557
|
+
lines[index + 1].trim().startsWith("|") && tableDivider(lines[index + 1], tableCells(line).length)) {
|
|
3558
|
+
const headers = tableCells(line), table = document.createElement("table"),
|
|
3559
|
+
thead = document.createElement("thead"), headingRow = document.createElement("tr"),
|
|
3560
|
+
tbody = document.createElement("tbody");
|
|
3561
|
+
for (const header of headers) {
|
|
3562
|
+
const cell = document.createElement("th");
|
|
3563
|
+
appendMarkdownInline(cell, header);
|
|
3564
|
+
headingRow.append(cell);
|
|
3565
|
+
}
|
|
3566
|
+
thead.append(headingRow);
|
|
3567
|
+
index += 1;
|
|
3568
|
+
while (index + 1 < lines.length && lines[index + 1].trim().startsWith("|")) {
|
|
3569
|
+
const cells = tableCells(lines[index + 1]);
|
|
3570
|
+
if (cells.length !== headers.length) break;
|
|
3571
|
+
const row = document.createElement("tr");
|
|
3572
|
+
for (const value of cells) {
|
|
3573
|
+
const cell = document.createElement("td");
|
|
3574
|
+
appendMarkdownInline(cell, value);
|
|
3575
|
+
row.append(cell);
|
|
3576
|
+
}
|
|
3577
|
+
tbody.append(row);
|
|
3578
|
+
index += 1;
|
|
3579
|
+
}
|
|
3580
|
+
table.append(thead, tbody);
|
|
3581
|
+
target.append(table);
|
|
3582
|
+
list = null;
|
|
3583
|
+
continue;
|
|
3584
|
+
}
|
|
3590
3585
|
const heading = /^(#{1,3})\s+(.+)$/.exec(line),
|
|
3591
3586
|
bullet = /^[-*]\s+(.+)$/.exec(line),
|
|
3592
3587
|
ordered = /^\d+\.\s+(.+)$/.exec(line);
|
|
@@ -3623,11 +3618,7 @@ function renderMarkdownAnswer(target, value) {
|
|
|
3623
3618
|
target.append(paragraph);
|
|
3624
3619
|
}
|
|
3625
3620
|
if (codeLines !== null) {
|
|
3626
|
-
|
|
3627
|
-
code = document.createElement("code");
|
|
3628
|
-
code.textContent = codeLines.join(newline);
|
|
3629
|
-
pre.append(code);
|
|
3630
|
-
target.append(pre);
|
|
3621
|
+
appendFencedCode(target, codeLines, codeLanguage);
|
|
3631
3622
|
}
|
|
3632
3623
|
}
|
|
3633
3624
|
const plainChatMessage = chatMessage;
|
|
@@ -5739,8 +5730,10 @@ function promptHistoryMarkdownList(title, values) {
|
|
|
5739
5730
|
}
|
|
5740
5731
|
function promptHistoryMarkdownPullRequests(pullRequests) {
|
|
5741
5732
|
const labels = {
|
|
5733
|
+
bound: t("detail.bound_pull_request"),
|
|
5742
5734
|
implementation: t("detail.implementation_pull_request"),
|
|
5743
5735
|
finalization: t("detail.finalization_pull_request"),
|
|
5736
|
+
reconciliation: t("detail.reconciliation_pull_request"),
|
|
5744
5737
|
};
|
|
5745
5738
|
const items = promptDetailPullRequestEntries(pullRequests).map((item) => {
|
|
5746
5739
|
const metrics = promptDetailPullRequestMetrics(item)
|
|
@@ -8323,7 +8316,7 @@ function promptDetailCommitsSection(commits) {
|
|
|
8323
8316
|
}
|
|
8324
8317
|
function promptDetailPullRequestEntries(pullRequests) {
|
|
8325
8318
|
return Array.isArray(pullRequests) ? pullRequests.filter((item) =>
|
|
8326
|
-
item && ["implementation", "finalization"].includes(item.role) &&
|
|
8319
|
+
item && ["bound", "implementation", "finalization", "reconciliation"].includes(item.role) &&
|
|
8327
8320
|
Number.isInteger(item.number) && item.number > 0 &&
|
|
8328
8321
|
typeof item.url === "string" &&
|
|
8329
8322
|
/^https:\/\/github\.com\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+\/pull\/\d+$/.test(item.url),
|
|
@@ -8343,8 +8336,10 @@ function promptDetailPullRequestsSection(pullRequests) {
|
|
|
8343
8336
|
const links = promptDetailPullRequestEntries(pullRequests);
|
|
8344
8337
|
if (!links.length) return null;
|
|
8345
8338
|
const labels = {
|
|
8339
|
+
bound: t("detail.bound_pull_request"),
|
|
8346
8340
|
implementation: t("detail.implementation_pull_request"),
|
|
8347
8341
|
finalization: t("detail.finalization_pull_request"),
|
|
8342
|
+
reconciliation: t("detail.reconciliation_pull_request"),
|
|
8348
8343
|
};
|
|
8349
8344
|
const fields = links.map((item) => {
|
|
8350
8345
|
const label = labels[item.role], field = detailField(label, "");
|
|
@@ -8386,7 +8381,7 @@ function promptDetailEvidenceSection(evidence) {
|
|
|
8386
8381
|
}).filter(Boolean);
|
|
8387
8382
|
if (!fields.length) return null;
|
|
8388
8383
|
void localizeDynamicEvidence(dynamicRows);
|
|
8389
|
-
return promptDetailCard(t("detail.execution_evidence"), fields);
|
|
8384
|
+
return promptDetailCard(t("detail.execution_evidence"), fields, false, "prompt-detail-card--evidence");
|
|
8390
8385
|
}
|
|
8391
8386
|
function promptDetailRecommendationHandoff(handoff) {
|
|
8392
8387
|
if (!handoff || typeof handoff !== "object") return null;
|