diff --git a/docs/engineering/EP_PRODUCER_READBACK_CONTRACT.md b/docs/engineering/EP_PRODUCER_READBACK_CONTRACT.md index a9d605e4..ab116f67 100644 --- a/docs/engineering/EP_PRODUCER_READBACK_CONTRACT.md +++ b/docs/engineering/EP_PRODUCER_READBACK_CONTRACT.md @@ -69,7 +69,8 @@ artifact response. A missing, corrupt, or mismatched artifact is represented as verified, run-bound delivery evidence: normally a recorded merge revision, or an explicit host-verified Managed no-op revision after the unchanged, synchronized `main` checkout was rechecked in that transaction. EP never uses -the ambient checkout `HEAD` as a substitute. `VALIDATION_ONLY`, `BLOCKED`, and +the ambient checkout `HEAD` as a substitute, and an advisory producer-reported +SHA cannot override the host's before/after observation. `VALIDATION_ONLY`, `BLOCKED`, and `FAILED` may have valid terminal evidence with a null revision; they are not fabricated into successful delivery. diff --git a/package-lock.json b/package-lock.json index 0afdeb59..0ca4f14e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "engineering-platform-browser-validation", - "version": "2.3.16", + "version": "2.3.17", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "engineering-platform-browser-validation", - "version": "2.3.16", + "version": "2.3.17", "devDependencies": { "@playwright/test": "1.62.1" } diff --git a/package.json b/package.json index 680936eb..44c47649 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "engineering-platform-browser-validation", "private": true, - "version": "2.3.16", + "version": "2.3.17", "scripts": { "test:engineering-dashboard": "PYTHONPATH=src python3 -m engineering_platform.dashboard_browser_validation", "test:engineering-dashboard-logic": "node --test tests/engineering/dashboard_status_store.test.mjs tests/engineering/ui_localization_contract.test.mjs", diff --git a/pyproject.toml b/pyproject.toml index c7d2ba8d..bb2618eb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "engineering-platform" -version = "2.3.16" +version = "2.3.17" description = "Local-first Engineering Platform execution operations runtime" readme = "README.md" requires-python = ">=3.11" diff --git a/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json b/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json index 259611d8..a0b1e375 100644 --- a/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json +++ b/src/engineering_platform/ENGINEERING_PLATFORM_CONFIG.json @@ -3,7 +3,7 @@ "platform": { "id": "engineering-platform", "name": "Engineering Platform", - "version": "2.3.16", + "version": "2.3.17", "generation": 2, "documentation_namespace": "engineering-platform", "capability_registry_version": 1 diff --git a/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json b/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json index 997ad7bd..e26fb6a5 100644 --- a/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json +++ b/src/engineering_platform/ENGINEERING_PLATFORM_VERSION.json @@ -1,15 +1,15 @@ { "bootstrap_contract": "2026.12", "checkpoint_format": 1, - "dashboard_version": "2.3.16", + "dashboard_version": "2.3.17", "handoff_protocol": 1, "memory_format": 2, "minimum_codex_cli": "0.146.0", "inbox_protocol": 1, - "platform_version": "2.3.16", + "platform_version": "2.3.17", "report_format": 2, - "runner_version": "2.3.16", + "runner_version": "2.3.17", "status_model": 1, "storage_schema": 44, - "watcher_version": "2.3.16" + "watcher_version": "2.3.17" } diff --git a/src/engineering_platform/execution_host.py b/src/engineering_platform/execution_host.py index f4557bf2..a607aa97 100644 --- a/src/engineering_platform/execution_host.py +++ b/src/engineering_platform/execution_host.py @@ -2244,12 +2244,16 @@ def _is_verified_managed_noop( current = self.repository.inspect(self.root) except RunnerError: return False + # The provider's reported SHA is advisory input, not delivery proof. + # A Forge Runtime Prompt can legitimately carry an earlier pinned + # repository-truth revision while this host has already synchronized + # main. The no-op decision is qualified only by the host-observed + # before/after state for this run. return ( current.clean and current.branch == "main" and current.main_contains_head and current.head_sha == baseline.head_sha - and (result.commit_sha is None or result.commit_sha == current.head_sha) ) def _advance_after_primary_agent_result( diff --git a/src/engineering_platform/platform_version.py b/src/engineering_platform/platform_version.py index 700eb3f7..966dcde1 100644 --- a/src/engineering_platform/platform_version.py +++ b/src/engineering_platform/platform_version.py @@ -12,7 +12,7 @@ SEMVER = re.compile(r"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$") CONTRACT = re.compile(r"^(\d{4})\.(0[1-9]|1[0-2])$") -CURRENT_PLATFORM_VERSION = "2.3.16" +CURRENT_PLATFORM_VERSION = "2.3.17" MANIFEST_FIELDS = frozenset( { "platform_version", diff --git a/src/engineering_platform/templates/workspace-config.json b/src/engineering_platform/templates/workspace-config.json index ee9ada72..ea2046f4 100644 --- a/src/engineering_platform/templates/workspace-config.json +++ b/src/engineering_platform/templates/workspace-config.json @@ -3,7 +3,7 @@ "platform": { "id": "engineering-platform", "name": "Engineering Platform", - "version": "2.3.16", + "version": "2.3.17", "generation": 2, "documentation_namespace": "engineering-platform", "capability_registry_version": 1 diff --git a/tests/engineering/test_execution_host.py b/tests/engineering/test_execution_host.py index daae02ed..1be2963c 100644 --- a/tests/engineering/test_execution_host.py +++ b/tests/engineering/test_execution_host.py @@ -2646,6 +2646,10 @@ def test_verified_managed_noop_reconciles_an_unchanged_main_checkout(self) -> No result = AgentResult( "COMPLETE", terminal_condition="repository_reconciled", + # Producer provenance can carry an earlier pinned repository + # revision. The host's before/after observation remains the + # authoritative no-op delivery evidence. + commit_sha="b" * 40, validation_evidence=({"command": "python -m unittest focused", "result": "PASS: focused checks"},), )