diff --git a/ReleaseConsumerProject/Packages/manifest.json b/ReleaseConsumerProject/Packages/manifest.json index 181522f..1a69088 100644 --- a/ReleaseConsumerProject/Packages/manifest.json +++ b/ReleaseConsumerProject/Packages/manifest.json @@ -6,10 +6,10 @@ "com.unity.modules.physics": "1.0.0", "com.unity.modules.uielements": "1.0.0", "com.unity.render-pipelines.universal": "17.4.0", - "org.gamecult.cultlib": "https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.32", + "org.gamecult.cultlib": "https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.34", "org.gamecult.eve.plugin-fields": "https://github.com/GameCult/EvePlugins.git?path=/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields#eve-plugin-fields-unity-v0.2.3", "org.gamecult.eve.surface": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.surface#eveunity-surface-v0.2.4", - "org.gamecult.eve.unity-scene": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.91", + "org.gamecult.eve.unity-scene": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.94", "org.gamecult.eve.unity-uitoolkit": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-uitoolkit#eveunity-uitoolkit-v0.1.1" }, "testables": [ diff --git a/ReleaseConsumerProject/Packages/packages-lock.json b/ReleaseConsumerProject/Packages/packages-lock.json index 0e92525..b02e97b 100644 --- a/ReleaseConsumerProject/Packages/packages-lock.json +++ b/ReleaseConsumerProject/Packages/packages-lock.json @@ -119,11 +119,11 @@ } }, "org.gamecult.cultlib": { - "version": "https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.32", + "version": "https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.34", "depth": 0, "source": "git", "dependencies": {}, - "hash": "d018bb1fb5a8ce73da6f5579e2f475750d901d8b" + "hash": "c148d891c1d8713285ae15b2f17b59c106fb9426" }, "org.gamecult.eve.plugin-fields": { "version": "https://github.com/GameCult/EvePlugins.git?path=/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields#eve-plugin-fields-unity-v0.2.3", @@ -144,18 +144,18 @@ "hash": "e08fa08335f99e9edddeb706912eecfad07cb281" }, "org.gamecult.eve.unity-scene": { - "version": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.91", + "version": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.94", "depth": 0, "source": "git", "dependencies": { - "org.gamecult.cultlib": "1.0.32", + "org.gamecult.cultlib": "1.0.34", "org.gamecult.eve.plugin-fields": "0.2.3", "org.gamecult.eve.surface": "0.2.4", "com.unity.mathematics": "1.3.2", "com.unity.render-pipelines.universal": "17.4.0", "com.unity.modules.particlesystem": "1.0.0" }, - "hash": "c93f09342f4c14e0607a47038df6b8e2e99cbf03" + "hash": "0463ddff4e39c9cca14e632b7e46b6b0081c67cc" }, "org.gamecult.eve.unity-uitoolkit": { "version": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-uitoolkit#eveunity-uitoolkit-v0.1.1", diff --git a/docs/aetheria-released-package-witness.md b/docs/aetheria-released-package-witness.md index f2bb0a9..4e14cd8 100644 --- a/docs/aetheria-released-package-witness.md +++ b/docs/aetheria-released-package-witness.md @@ -4,16 +4,16 @@ The generic `ReleaseConsumerProject` is pinned to released Git packages: -- `org.gamecult.eve.unity-scene` `0.3.91`, commit - `c93f09342f4c14e0607a47038df6b8e2e99cbf03`, and +- `org.gamecult.eve.unity-scene` `0.3.94`, commit + `0463ddff4e39c9cca14e632b7e46b6b0081c67cc`, and `org.gamecult.eve.surface` `0.2.4`, commit `e08fa08335f99e9edddeb706912eecfad07cb281`; - `org.gamecult.eve.plugin-fields` `0.2.3`, commit `c5a4a75c1b727499b16c2dae1895f29e2a9f72f0`; - `org.gamecult.eve.unity-uitoolkit` `0.1.1`, commit `4d0cbe0185bdc4fc65eb63503a7c5cb578539669`; -- `org.gamecult.cultlib` `1.0.32`, commit - `d018bb1fb5a8ce73da6f5579e2f475750d901d8b`. +- `org.gamecult.cultlib` `1.0.34`, commit + `c148d891c1d8713285ae15b2f17b59c106fb9426`. The hand-run integration gate is the warm released-package witness: @@ -36,32 +36,31 @@ content-hashed body into the local warm cache. This is convenient local setup, not CDN-transfer evidence. On later runs, use `-SkipAssetBundleBuild` and omit the prime flag when neither provider assets nor their catalog changed. -Cold transfer is a passing released-package integration gate as of -`artifacts/cold-release-0391`. The run starts with zero bodies and zero partials, -transfers and verifies the `56,204,750`-byte provider bundle through the -dedicated `cultmesh.content.v1` session, atomically promotes one content-hashed -body with no partial left behind, and grants Unity a `SharedFileMapping` lease -over that verified file. The Unity test completes in 54.8 seconds and the full -clean import/build/test wrapper completes in 149.6 seconds under the unchanged -300-second deadline. Pilot/map channel separation and 65,536 Stardust particles -remain proven after the cold load. +The current split transport proof is warm. Control/discovery, subscriptions, +commands, and receipts use `cultnet+tcp`; the same-machine entity body resolves +to `SharedFileMapping`; CDN bytes are advertised on a separate +`cultmesh-content+tcp` endpoint. The passing run in +`artifacts/aetheria-daemon-tcp-warm` used an explicitly primed 56,204,750-byte +provider body and therefore makes no cold-transfer claim. The prior cold path +that carried bundle chunks through batched snapshot records timed out and is +not accepted as evidence. A fresh empty-cache run over the dedicated TCP +content plane remains required before cold CDN delivery is promoted again. -This proves that bulk asset bytes no longer depend on snapshot records. It does -not claim remote zero-copy: the current remote content session still copies and -fragments bounded chunks before the verified local file becomes mapped. Network -body streaming and copy-volume profiling remain transport work. - -The July 19 released-package run in `artifacts/dockyard-trade-warm-8` passes the +The July 19 released-package run in `artifacts/aetheria-daemon-tcp-warm` passes the full-session gate. The generic client lowers the provider-owned bundle through `SharedFileMapping`, docks at the daemon-authored 12-berth Zenith Dockyard, buys and sells one typed item, undocks, moves, targets, aims, runs a held tractor beam, destroys the sole proof hostile, and collects the resulting loot exactly once through daemon-owned proximity. All eight retained witness receipts are -provider-owned and reconciled. The run records 65,536 Stardust particles, 147 +provider-owned and reconciled. The run records 65,536 Stardust particles, 396 field composites/dispatches/draws, and both camera-channel invariants. The pilot capture contains the 3D fog/Stardust/ship frame and no map icons; the map capture contains the map icons against its map background. The pilot image remains visually overexposed and is integration evidence, not final art approval. +The wrapper starts the client before the daemon so package import time does not +advance the live proof world. EveUnity 0.3.94 reports a refused TCP rendezvous as +a retryable provider-preparation failure; once the daemon binds, the same generic +preparation path connects without an Aetheria-specific reconnect shim. The July 19 transport-boundary run in `artifacts/demanded-fields-warm-6` passed its released-consumer PlayMode test and produced both camera captures. diff --git a/scripts/run-aetheria-daemon-world-witness.ps1 b/scripts/run-aetheria-daemon-world-witness.ps1 index 892d508..ba440ab 100644 --- a/scripts/run-aetheria-daemon-world-witness.ps1 +++ b/scripts/run-aetheria-daemon-world-witness.ps1 @@ -17,10 +17,10 @@ param( ) $ErrorActionPreference = "Stop" -$expectedEveUnityCommit = "c93f09342f4c14e0607a47038df6b8e2e99cbf03" +$expectedEveUnityCommit = "0463ddff4e39c9cca14e632b7e46b6b0081c67cc" $expectedEveFieldsCommit = "c5a4a75c1b727499b16c2dae1895f29e2a9f72f0" $expectedEveUnityUiToolkitCommit = "4d0cbe0185bdc4fc65eb63503a7c5cb578539669" -$expectedCultLibCommit = "d018bb1fb5a8ce73da6f5579e2f475750d901d8b" +$expectedCultLibCommit = "c148d891c1d8713285ae15b2f17b59c106fb9426" $repoRoot = Split-Path -Parent $PSScriptRoot $projectRoot = $ClientProject $outputRoot = if ([IO.Path]::IsPathRooted($OutputDirectory)) { $OutputDirectory } else { Join-Path $repoRoot $OutputDirectory } @@ -207,8 +207,8 @@ $daemonArguments = @( "--no-odin-announcements" ) $env:AETHERIA_TRACE_EVE_SNAPSHOTS = "1" -$env:AETHERIA_TRACE_CLIENT_RUDP = "1" -$env:EVEUNITY_RENDEZVOUS_ENDPOINT = "rudp://127.0.0.1:$Port" +$env:AETHERIA_TRACE_CLIENT_TRANSPORT = "1" +$env:EVEUNITY_RENDEZVOUS_ENDPOINT = "cultnet+tcp://127.0.0.1:$Port" $env:EVEUNITY_PROVIDER_ID = "aetheria" Remove-Item Env:EVEUNITY_SURFACE_ID -ErrorAction SilentlyContinue $env:EVEUNITY_REPLICA_PATH = $replicaPath @@ -227,32 +227,31 @@ $arguments = @( "-testFilter", "GenericCultMeshClientLowersAndMovesAdvertisedWorld", "-testResults", $resultsPath, "-logFile", $unityLogPath ) -$unity = Start-Process -FilePath $UnityExe -ArgumentList $arguments -WorkingDirectory $repoRoot -PassThru -WindowStyle Hidden -Write-Host "Unity witness PID: $($unity.Id)" -Write-Host "Unity log: $unityLogPath" -$clientReady = $false -for ($attempt = 0; $attempt -lt 240; $attempt++) { - if ($unity.HasExited) { throw "Unity exited before reaching provider connection. See $unityLogPath" } - if (Test-Path -LiteralPath $providerReadyPath) { $clientReady = $true; break } - Start-Sleep -Milliseconds 500 -} -if (-not $clientReady) { - Stop-Process -Id $unity.Id -Force -ErrorAction SilentlyContinue - throw "Unity did not reach provider connection within 120 seconds. See $unityLogPath" -} - -$daemon = Start-Process -FilePath "dotnet" -ArgumentList $daemonArguments -PassThru -WindowStyle Hidden ` - -RedirectStandardOutput $daemonLogPath -RedirectStandardError (Join-Path $outputRoot "aetheria-daemon.error.log") -Write-Host "Aetheria daemon PID: $($daemon.Id)" -Write-Host "Daemon log: $daemonLogPath" -Write-Host "Poll: Select-String -Path '$daemonLogPath' -Pattern 'Aetheria client CultMesh endpoint'" - +$daemon = $null +$unity = $null try { + $unity = Start-Process -FilePath $UnityExe -ArgumentList $arguments -WorkingDirectory $repoRoot -PassThru -WindowStyle Hidden + Write-Host "Unity witness PID: $($unity.Id)" + Write-Host "Unity log: $unityLogPath" + $clientReady = $false + for ($attempt = 0; $attempt -lt 240; $attempt++) { + if ($unity.HasExited) { throw "Unity exited before reaching provider preparation. See $unityLogPath" } + if (Test-Path -LiteralPath $providerReadyPath) { $clientReady = $true; break } + Start-Sleep -Milliseconds 500 + } + if (-not $clientReady) { throw "Unity did not reach provider preparation within 120 seconds. See $unityLogPath" } + + $daemon = Start-Process -FilePath "dotnet" -ArgumentList $daemonArguments -PassThru -WindowStyle Hidden ` + -RedirectStandardOutput $daemonLogPath -RedirectStandardError (Join-Path $outputRoot "aetheria-daemon.error.log") + Write-Host "Aetheria daemon PID: $($daemon.Id)" + Write-Host "Daemon log: $daemonLogPath" + Write-Host "Poll: Select-String -Path '$daemonLogPath' -Pattern 'Aetheria client CultMesh endpoint'" + $ready = $false for ($attempt = 0; $attempt -lt 240; $attempt++) { if ($daemon.HasExited) { throw "Aetheria daemon exited before publishing CultMesh. See $daemonLogPath" } if ((Test-Path $daemonLogPath) -and - (Select-String -Path $daemonLogPath -Pattern "Aetheria client CultMesh endpoint: rudp://127.0.0.1:$Port" -Quiet)) { $ready = $true; break } + (Select-String -Path $daemonLogPath -Pattern "Aetheria client CultMesh endpoint: cultnet\+tcp://127.0.0.1:$Port" -Quiet)) { $ready = $true; break } Start-Sleep -Milliseconds 500 } if (-not $ready) { throw "Aetheria daemon did not open CultMesh port $Port within 120 seconds. See $daemonLogPath" } @@ -451,5 +450,5 @@ finally { if ($null -ne $unity -and -not $unity.HasExited) { Stop-Process -Id $unity.Id -Force -ErrorAction SilentlyContinue } if ($null -ne $daemon -and -not $daemon.HasExited) { Stop-Process -Id $daemon.Id -Force } Remove-Item Env:EVEUNITY_RENDEZVOUS_ENDPOINT, Env:EVEUNITY_PROVIDER_ENDPOINT, Env:EVEUNITY_PROVIDER_ID, Env:EVEUNITY_SURFACE_ID, Env:EVEUNITY_REPLICA_PATH, Env:EVEUNITY_AETHERIA_CAPTURE_PATH, Env:EVEUNITY_AETHERIA_MAP_CAPTURE_PATH, Env:EVEUNITY_DISABLE_AUTO_LAUNCHER, Env:EVEUNITY_ASSET_CACHE_PATH, Env:EVEUNITY_WITNESS_FACTS_PATH, Env:EVEUNITY_PROVIDER_READY_PATH, Env:EVEUNITY_WITNESS_PROFILE, Env:EVEUNITY_WITNESS_GAMEPLAY_SCENARIO -ErrorAction SilentlyContinue - Remove-Item Env:AETHERIA_TRACE_EVE_SNAPSHOTS -ErrorAction SilentlyContinue + Remove-Item Env:AETHERIA_TRACE_EVE_SNAPSHOTS, Env:AETHERIA_TRACE_CLIENT_TRANSPORT -ErrorAction SilentlyContinue }