engineering-platform 2.3.103__tar.gz → 2.3.105__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.103 → engineering_platform-2.3.105}/PKG-INFO +1 -1
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/pyproject.toml +1 -1
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json +1 -1
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json +4 -4
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/platform_version.py +1 -1
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/system_instance_lifecycle.py +75 -18
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/system_instance_provisioner.py +1 -2
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/templates/workspace-config.json +1 -1
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/PKG-INFO +1 -1
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/README.md +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/setup.cfg +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/__init__.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/__main__.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/agent_state.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/agent_trust.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard.css +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard.js +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard_locales.mjs +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard_status_store.mjs +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/dashboard_translation.mjs +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/apple-touch-icon-dark.png +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/apple-touch-icon-light.png +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/icon-dark.png +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/icon-light.png +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/icon-transparent.png +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assets/operations-console/manifest.webmanifest +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/assurance_scope.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/capability_preflight.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/capability_review.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/central_data_transfer.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/central_database.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/central_operational_reset.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/central_store_migration.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/codex_capacity.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/codex_chat.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/codex_observability.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/component_lock.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/component_logging.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/console_presentation.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/console_route_ownership.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/contracts/__init__.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/contracts/ep_consumer.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/contracts/models.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/contracts/projection.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/dashboard_browser_validation.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/dashboard_state.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/dashboard_supervisor.swift +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/dashboard_translation.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/dependabot_producer.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/development_profile.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/drift_diagnostics.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/emergency_recovery.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/engineering_memory.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/ep_consumer_credentials.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/evidence_projection.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_activity.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_context.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_errors.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_evidence.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_executor.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_finalization.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_host.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_host_evidence.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_lease.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_lifecycle.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_models.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_readiness.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_reporting.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_repository.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_timeout_policy.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_timing.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/execution_transaction.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/external_producer_binding.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/file_inbox.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/forensic_attribution.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/forensic_attribution_v2.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/forensic_delta.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/golden_scenario.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/historical_dashboard_configuration.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/host_admin.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/host_preflight.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_relocation.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_activation.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_admission.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_backup.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_composition.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_executor.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_migration.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_operation.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_plan.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/installation_update_preparation.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/investigation_ledger.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/legacy_inbox_migration.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/legacy_installation_adoption.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/lifecycle_worker.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/live_status.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/local_api.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/local_api_keychain.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/local_repository_binding.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/managed_autonomy.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/managed_codex_runtime.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/managed_workspace_readiness.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/managed_workspace_recovery.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/merge_delegation.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/operational_installation.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/operational_installation_lock.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/operational_installation_record.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/owner_credential_recovery.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/parity_context.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/parity_lifecycle_dispatcher.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/platform_admin.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/platform_api.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/platform_bootstrap.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/platform_components.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/pr_check_repair.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/pr_evidence_backfill.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/producer.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/product_installation_readback.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/project_agent.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/project_agent_service.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/project_topology.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/prompt_history.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_context.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_context_benchmark.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_context_scope.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_interruption.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_process_identity.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_readiness.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_recovery.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/provider_usage.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/providers.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/qualification.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/qualification_runtime.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/recommendation_handoff.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/reconciliation_adoption.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/release_operation.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/report_analysis.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/repository_attachment.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/repository_handoff.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/resources.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/reviewer_evidence.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/revision_binding.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/schemas/producer-readback-v1.2.schema.json +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/schemas/producer-readback-v1.3.schema.json +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/schemas/producer-readback-v1.schema.json +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/schemas/repository-attachment.schema.json +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/server.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/server_console_services.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/server_relay.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/server_service.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/status_model.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/status_reconciliation.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/storage.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/submission_cli.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/submission_intake.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/submission_service.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/system_installation_topology.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/system_provider_context.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/system_server_service.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/telemetry.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/telemetry_contract.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/telemetry_export.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/telemetry_metrics.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/terminal_evidence_reconciliation.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/validation_identity.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/validation_profile.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/version_preparation_delivery.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/workspace_preflight.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/worktree_provenance.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/worktree_tooling.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/SOURCES.txt +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/dependency_links.txt +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/entry_points.txt +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform.egg-info/top_level.txt +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/tests/test_adaptive_action_sizing_design.py +0 -0
- {engineering_platform-2.3.103 → engineering_platform-2.3.105}/tests/test_role_task_model_policy_design.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "engineering-platform"
|
|
7
|
-
version = "2.3.
|
|
7
|
+
version = "2.3.105"
|
|
8
8
|
description = "Local-first Engineering Platform execution operations runtime"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.14,<3.15"
|
|
@@ -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.105",
|
|
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.105",
|
|
10
10
|
"report_format": 2,
|
|
11
|
-
"runner_version": "2.3.
|
|
11
|
+
"runner_version": "2.3.105",
|
|
12
12
|
"status_model": 1,
|
|
13
13
|
"storage_schema": 45,
|
|
14
|
-
"watcher_version": "2.3.
|
|
14
|
+
"watcher_version": "2.3.105"
|
|
15
15
|
}
|
|
@@ -12,7 +12,7 @@ from .storage import ENGINEERING_STORAGE_SCHEMA_VERSION
|
|
|
12
12
|
|
|
13
13
|
SEMVER = re.compile(r"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$")
|
|
14
14
|
CONTRACT = re.compile(r"^(\d{4})\.(0[1-9]|1[0-2])$")
|
|
15
|
-
CURRENT_PLATFORM_VERSION = "2.3.
|
|
15
|
+
CURRENT_PLATFORM_VERSION = "2.3.105"
|
|
16
16
|
MANIFEST_FIELDS = frozenset(
|
|
17
17
|
{
|
|
18
18
|
"platform_version",
|
|
@@ -97,10 +97,22 @@ def _atomic_json(path: Path, value: Mapping[str, object]) -> None:
|
|
|
97
97
|
temporary.unlink(missing_ok=True)
|
|
98
98
|
|
|
99
99
|
|
|
100
|
+
def _assert_owned_mode(path: Path, details: os.stat_result) -> None:
|
|
101
|
+
if stat.S_IMODE(details.st_mode) & 0o022:
|
|
102
|
+
raise SystemInstanceLifecycleError(
|
|
103
|
+
f"EP preserved instance contains group/world-writable entry: {path}"
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
|
|
100
107
|
def _regular_digest(path: Path) -> str:
|
|
101
108
|
details = path.lstat()
|
|
102
109
|
if path.is_symlink() or not stat.S_ISREG(details.st_mode):
|
|
103
110
|
raise SystemInstanceLifecycleError(f"EP preserved instance contains unsafe entry: {path}")
|
|
111
|
+
_assert_owned_mode(path, details)
|
|
112
|
+
if details.st_nlink != 1:
|
|
113
|
+
raise SystemInstanceLifecycleError(
|
|
114
|
+
f"EP preserved instance contains non-exclusive hardlink: {path}"
|
|
115
|
+
)
|
|
104
116
|
digest = hashlib.sha256()
|
|
105
117
|
with path.open("rb") as stream:
|
|
106
118
|
while True:
|
|
@@ -118,6 +130,7 @@ def _tree_digest(root: Path, *, ignored_roots: tuple[Path, ...] = ()) -> str:
|
|
|
118
130
|
raise SystemInstanceLifecycleError("EP preserved instance root is unavailable") from error
|
|
119
131
|
if root.is_symlink() or not stat.S_ISDIR(details.st_mode):
|
|
120
132
|
raise SystemInstanceLifecycleError("EP preserved instance root is unsafe")
|
|
133
|
+
_assert_owned_mode(root, details)
|
|
121
134
|
ignored: tuple[tuple[str, ...], ...] = tuple(
|
|
122
135
|
path.relative_to(root).parts for path in ignored_roots
|
|
123
136
|
)
|
|
@@ -137,6 +150,7 @@ def _tree_digest(root: Path, *, ignored_roots: tuple[Path, ...] = ()) -> str:
|
|
|
137
150
|
info = path.lstat()
|
|
138
151
|
if stat.S_ISLNK(info.st_mode) or not stat.S_ISDIR(info.st_mode):
|
|
139
152
|
raise SystemInstanceLifecycleError(f"EP preserved instance contains unsafe entry: {path}")
|
|
153
|
+
_assert_owned_mode(path, info)
|
|
140
154
|
entries.append({
|
|
141
155
|
"path": str(path.relative_to(root)),
|
|
142
156
|
"kind": "DIRECTORY",
|
|
@@ -327,6 +341,7 @@ class SystemInstanceLifecycle:
|
|
|
327
341
|
raise SystemInstanceLifecycleError("EP preserved instance changed after terminal preserve")
|
|
328
342
|
return receipt
|
|
329
343
|
with _Lock(instance.lifecycle_lock):
|
|
344
|
+
_tree_digest(instance.root)
|
|
330
345
|
self.controller.remove(instance)
|
|
331
346
|
if self.controller.loaded(instance) or self.service_interpreter(instance) is not None:
|
|
332
347
|
raise SystemInstanceLifecycleError("EP preserved service was not fully removed")
|
|
@@ -441,6 +456,10 @@ class SystemInstanceLifecycle:
|
|
|
441
456
|
if state.get("phase") == "COMPLETE":
|
|
442
457
|
return state
|
|
443
458
|
with _Lock(instance.lifecycle_lock):
|
|
459
|
+
_tree_digest(
|
|
460
|
+
instance.root,
|
|
461
|
+
ignored_roots=(instance.operations_root / operation_id,),
|
|
462
|
+
)
|
|
444
463
|
self.controller.remove(instance)
|
|
445
464
|
if self.controller.loaded(instance) or self.service_interpreter(instance) is not None:
|
|
446
465
|
raise SystemInstanceLifecycleError("EP purge service was not fully removed")
|
|
@@ -458,40 +477,78 @@ class SystemInstanceLifecycle:
|
|
|
458
477
|
"PURGE_READY",
|
|
459
478
|
mutable_instance_data_digest=tree_digest,
|
|
460
479
|
descriptor_digest=request["descriptor_digest"],
|
|
480
|
+
# REMOVE publishes its receipt before deleting this tree. A
|
|
481
|
+
# process kill can erase instance.json before rmtree finishes.
|
|
482
|
+
# Retain only the topology and root identity needed to resume
|
|
483
|
+
# that exact deletion without adopting a replacement root.
|
|
484
|
+
display_label=instance.display_label,
|
|
485
|
+
service_account=instance.service_account,
|
|
486
|
+
root_device=instance.root.stat(follow_symlinks=False).st_dev,
|
|
487
|
+
root_inode=instance.root.stat(follow_symlinks=False).st_ino,
|
|
461
488
|
)
|
|
462
489
|
|
|
463
490
|
def resume_purge_target(
|
|
464
491
|
self,
|
|
465
|
-
|
|
466
|
-
descriptor: Mapping[str, object],
|
|
492
|
+
instance_id: str,
|
|
467
493
|
operation_id: str,
|
|
494
|
+
remove_receipt: Mapping[str, object],
|
|
468
495
|
) -> None:
|
|
469
|
-
root = self._operation_root(
|
|
496
|
+
root = self._operation_root(instance_id, operation_id)
|
|
470
497
|
state = _read_json(root / "state.json")
|
|
471
498
|
if (
|
|
472
499
|
state.get("contract") != CONTRACT
|
|
473
500
|
or state.get("operation") != "PURGE"
|
|
474
501
|
or state.get("phase") != "PURGE_READY"
|
|
475
|
-
or state.get("instance_id") !=
|
|
476
|
-
or state.get("
|
|
502
|
+
or state.get("instance_id") != instance_id
|
|
503
|
+
or state.get("request") != {
|
|
504
|
+
"instance_id": instance_id,
|
|
505
|
+
"descriptor_digest": state.get("descriptor_digest"),
|
|
506
|
+
}
|
|
507
|
+
or state.get("request_digest") != _json_digest(state["request"])
|
|
508
|
+
or remove_receipt.get("operation") != "REMOVE"
|
|
509
|
+
or remove_receipt.get("operation_id") != operation_id
|
|
510
|
+
or remove_receipt.get("instance_id") != instance_id
|
|
511
|
+
or not isinstance(remove_receipt.get("evidence"), Mapping)
|
|
512
|
+
or remove_receipt["evidence"].get("removed_descriptor_digest") != state.get("descriptor_digest")
|
|
477
513
|
):
|
|
478
514
|
raise SystemInstanceLifecycleError("EP purge recovery evidence is invalid")
|
|
479
|
-
|
|
515
|
+
try:
|
|
516
|
+
instance = system_installation_topology.system_instance_topology(
|
|
517
|
+
self.product,
|
|
518
|
+
instance_id=instance_id,
|
|
519
|
+
display_label=state["display_label"],
|
|
520
|
+
service_account=state["service_account"],
|
|
521
|
+
)
|
|
522
|
+
except (KeyError, TypeError, ValueError) as error:
|
|
523
|
+
raise SystemInstanceLifecycleError("EP purge recovery topology is invalid") from error
|
|
524
|
+
expected = self.product.system_root / "instances" / instance.instance_id
|
|
525
|
+
if (
|
|
526
|
+
instance.root != expected
|
|
527
|
+
or instance.root.is_symlink()
|
|
528
|
+
or not instance.root.is_relative_to(self.product.system_root / "instances")
|
|
529
|
+
):
|
|
530
|
+
raise SystemInstanceLifecycleError("EP purge recovery target is invalid")
|
|
531
|
+
|
|
532
|
+
def verify_original_root() -> None:
|
|
533
|
+
details = instance.root.stat(follow_symlinks=False)
|
|
534
|
+
if (details.st_dev, details.st_ino) != (state.get("root_device"), state.get("root_inode")):
|
|
535
|
+
raise SystemInstanceLifecycleError("EP purge recovery target was replaced")
|
|
536
|
+
|
|
537
|
+
# Check before opening the instance-owned lock, which may recreate a
|
|
538
|
+
# lock directory already erased by the interrupted deletion.
|
|
539
|
+
verify_original_root()
|
|
540
|
+
with _Lock(root / "purge-recovery.lock"), _Lock(instance.lifecycle_lock):
|
|
541
|
+
verify_original_root()
|
|
480
542
|
self.controller.remove(instance)
|
|
481
543
|
if self.controller.loaded(instance) or self.service_interpreter(instance) is not None:
|
|
482
544
|
raise SystemInstanceLifecycleError("EP purge recovery service was not fully removed")
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
instance.root != expected
|
|
491
|
-
or instance.root.is_symlink()
|
|
492
|
-
or not instance.root.is_relative_to(self.product.system_root / "instances")
|
|
493
|
-
):
|
|
494
|
-
raise SystemInstanceLifecycleError("EP purge recovery target is invalid")
|
|
545
|
+
# The exact root survives until rmtree's final step. Its contents
|
|
546
|
+
# may be a strict subset after SIGKILL, so the original whole-tree
|
|
547
|
+
# digest cannot be required here. Reject unsafe remaining entries.
|
|
548
|
+
_tree_digest(instance.root, ignored_roots=(instance.operations_root / operation_id,))
|
|
549
|
+
if instance.descriptor.exists():
|
|
550
|
+
if _json_digest(_read_json(instance.descriptor)) != state.get("descriptor_digest"):
|
|
551
|
+
raise SystemInstanceLifecycleError("EP purge recovery descriptor changed")
|
|
495
552
|
shutil.rmtree(instance.root)
|
|
496
553
|
|
|
497
554
|
def record_purge(
|
|
@@ -665,8 +665,7 @@ class SystemInstanceProvisioner:
|
|
|
665
665
|
else:
|
|
666
666
|
remove_receipt = prior_remove
|
|
667
667
|
if instance_root.exists() or instance_root.is_symlink():
|
|
668
|
-
|
|
669
|
-
lifecycle.resume_purge_target(instance, descriptor, operation_id)
|
|
668
|
+
lifecycle.resume_purge_target(instance_id, operation_id, remove_receipt)
|
|
670
669
|
receipt = lifecycle.record_purge(instance_id, operation_id, remove_receipt)
|
|
671
670
|
return {
|
|
672
671
|
"contract": system_instance_lifecycle.CONTRACT,
|
|
File without changes
|
|
File without changes
|
{engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/__init__.py
RENAMED
|
File without changes
|
{engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/__main__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/codex_chat.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/file_inbox.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/host_admin.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/local_api.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/producer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/providers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/resources.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/storage.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{engineering_platform-2.3.103 → engineering_platform-2.3.105}/src/engineering_platform/telemetry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|