From 72c9ed709d32d08a81c15b6e0355867acb4cdf28 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 15 Jul 2026 11:27:20 +0100 Subject: [PATCH] Record released held-input witness --- .../PlayMode/GenericWorldCaptureTests.cs | 37 ++++++++++++++++++- ReleaseConsumerProject/Packages/manifest.json | 4 +- .../Packages/packages-lock.json | 10 ++--- docs/aetheria-released-package-witness.md | 33 ++++++++++------- scripts/run-aetheria-daemon-world-witness.ps1 | 6 +-- 5 files changed, 64 insertions(+), 26 deletions(-) diff --git a/ReleaseConsumerProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs b/ReleaseConsumerProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs index 050ab02..ce53c38 100644 --- a/ReleaseConsumerProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs +++ b/ReleaseConsumerProject/Assets/Tests/PlayMode/GenericWorldCaptureTests.cs @@ -192,6 +192,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests WitnessReceipt lookReceipt = null; WitnessReceipt focusReceipt = null; WitnessReceipt tractorReceipt = null; + WitnessReceipt tractorReleaseReceipt = null; WitnessReceipt actionReceipt = null; EveUnityShotReceipt observedShot = null; EveUnityCombatPresentation observedCombat = null; @@ -202,6 +203,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests float aimDotDistance = 0f; int cockpitProgressCount = 0; float tractorBeamPower = 0f; + float tractorReleasedPower = 1f; int tractorBeamParticleSystemCount = 0; try @@ -385,7 +387,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests Assert.That(beamPresentation.ActivationActionId, Is.Not.Empty, "The beam presentation does not name an advertised generic action."); var tractorVersion = runtime.ActiveVersion; - var tractor = host.SubmitAdvertisedActionIntent(playerId, beamPresentation.ActivationActionId); + var tractor = host.SubmitAdvertisedActionValueIntent(playerId, beamPresentation.ActivationActionId, 1f); var tractorDeadline = Time.realtimeSinceStartup + 12f; while (Time.realtimeSinceStartup < tractorDeadline && (runtime.LastReceipt == null || runtime.LastReceipt.CommandId != tractor.CommandId || @@ -600,6 +602,29 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(mapCapturePath))); File.WriteAllBytes(mapCapturePath, pixels.EncodeToPNG()); Assert.That(new FileInfo(mapCapturePath).Length, Is.GreaterThan(1024)); + var tractorReleaseVersion = runtime.ActiveVersion; + var tractorRelease = host.SubmitAdvertisedActionValueIntent( + playerId, + beamPresentation.ActivationActionId, + 0f); + var tractorReleaseDeadline = Time.realtimeSinceStartup + 12f; + while (Time.realtimeSinceStartup < tractorReleaseDeadline && + (runtime.LastReceipt == null || runtime.LastReceipt.CommandId != tractorRelease.CommandId || + !string.Equals(runtime.LastReceipt.State, "reconciled", StringComparison.OrdinalIgnoreCase) || + runtime.ActiveVersion < runtime.LastReceipt.SourceVersion || + EveUnityBeamPresentation.FindAll(runtime.ActiveProjection).Single().Power > + beamPresentation.ActivationThreshold)) + { + yield return new WaitForSecondsRealtime(0.1f); + runtime.Refresh(); + } + AssertReconciledProviderReceipt(runtime.LastReceipt, tractorRelease.CommandId, + provider.Selection.ProviderId, provider.Selection.SurfaceId, tractorReleaseVersion); + tractorReleaseReceipt = WitnessReceipt.From("beam-release", runtime.LastReceipt); + beamRenderer.RefreshNow(); + Assert.That(beamRenderer.TryGetPower(beamPresentation.Id, out tractorReleasedPower), Is.True); + Assert.That(tractorReleasedPower, Is.Zero, + "Released held input did not return the daemon-authored tractor presentation to zero."); WriteWitnessFacts( initialVersion, runtime.ActiveVersion, @@ -615,6 +640,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests lookReceipt, focusReceipt, tractorReceipt, + tractorReleaseReceipt, actionReceipt, observedShot, shieldRatioBefore, @@ -631,6 +657,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests pilotBrightPixelCount, cockpitProgressCount, tractorBeamPower, + tractorReleasedPower, tractorBeamParticleSystemCount, playerRendererFacts); } @@ -665,6 +692,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests WitnessReceipt look, WitnessReceipt targeting, WitnessReceipt tractor, + WitnessReceipt tractorRelease, WitnessReceipt action, EveUnityShotReceipt shot, float shieldRatioBefore, @@ -681,6 +709,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests int pilotBrightPixelCount, int cockpitProgressCount, float tractorBeamPower, + float tractorReleasedPower, int tractorBeamParticleSystemCount, RendererFact[] playerRendererFacts) { @@ -695,6 +724,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests aimPresentation = look != null && aimDotDistance >= 49.9f, targeting = targeting != null, beamPresentation = tractor != null && tractorBeamPower > 0.01f && tractorBeamParticleSystemCount > 0, + beamRelease = tractorRelease != null && tractorReleasedPower == 0f, action = action != null, combatPresentation = shot != null, shotId = shot?.ShotId ?? "", @@ -721,13 +751,14 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests pilotBrightPixelCount = pilotBrightPixelCount, cockpitProgressCount = cockpitProgressCount, tractorBeamPower = tractorBeamPower, + tractorReleasedPower = tractorReleasedPower, tractorBeamParticleSystemCount = tractorBeamParticleSystemCount, playerRenderers = playerRendererFacts, mapChannelRendererCount = mapChannelRendererCount, mapChangedPixels = mapChangedPixels, pilotCameraExcludesMapChannel = pilotCameraExcludesMapChannel, mapCameraIncludesMapChannel = mapCameraIncludesMapChannel, - receipts = new[] { movement, look, targeting, tractor, action } + receipts = new[] { movement, look, targeting, tractor, tractorRelease, action } }; Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(path))); File.WriteAllText(path, JsonUtility.ToJson(document, true)); @@ -743,6 +774,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests public bool aimPresentation; public bool targeting; public bool beamPresentation; + public bool beamRelease; public bool action; public bool combatPresentation; public string shotId; @@ -769,6 +801,7 @@ namespace GameCult.EveUnity.GenericClient.PlayModeTests public int pilotBrightPixelCount; public int cockpitProgressCount; public float tractorBeamPower; + public float tractorReleasedPower; public int tractorBeamParticleSystemCount; public RendererFact[] playerRenderers; public int mapChannelRendererCount; diff --git a/ReleaseConsumerProject/Packages/manifest.json b/ReleaseConsumerProject/Packages/manifest.json index 1dfc17c..df32b8b 100644 --- a/ReleaseConsumerProject/Packages/manifest.json +++ b/ReleaseConsumerProject/Packages/manifest.json @@ -8,8 +8,8 @@ "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.13", "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.1.1", - "org.gamecult.eve.surface": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.surface#eveunity-surface-v0.2.1", - "org.gamecult.eve.unity-scene": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.30", + "org.gamecult.eve.surface": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.surface#eveunity-surface-v0.2.2", + "org.gamecult.eve.unity-scene": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.31", "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 269434a..a4b2b92 100644 --- a/ReleaseConsumerProject/Packages/packages-lock.json +++ b/ReleaseConsumerProject/Packages/packages-lock.json @@ -133,26 +133,26 @@ "hash": "0b099274a4e2b4c301eced4322166837792f585a" }, "org.gamecult.eve.surface": { - "version": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.surface#eveunity-surface-v0.2.1", + "version": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.surface#eveunity-surface-v0.2.2", "depth": 0, "source": "git", "dependencies": { "org.gamecult.cultlib": "1.0.8" }, - "hash": "d0aa50d31f3b6da96bffc194fdc3aa358f37e332" + "hash": "140e1bd963a0033e66777a3b2c5fe6e9c97dfe32" }, "org.gamecult.eve.unity-scene": { - "version": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.30", + "version": "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.3.31", "depth": 0, "source": "git", "dependencies": { "org.gamecult.cultlib": "1.0.13", "org.gamecult.eve.plugin-fields": "0.1.1", - "org.gamecult.eve.surface": "0.2.1", + "org.gamecult.eve.surface": "0.2.2", "com.unity.mathematics": "1.3.2", "com.unity.modules.particlesystem": "1.0.0" }, - "hash": "f979cd425a9f8f951736c56051e8368b6d6ac2f3" + "hash": "140e1bd963a0033e66777a3b2c5fe6e9c97dfe32" }, "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 0bb254b..6c8be3a 100644 --- a/docs/aetheria-released-package-witness.md +++ b/docs/aetheria-released-package-witness.md @@ -4,8 +4,9 @@ The warm-cache released-package witness passes with: -- `org.gamecult.eve.unity-scene` `0.3.30`, commit - `f979cd425a9f8f951736c56051e8368b6d6ac2f3`; +- `org.gamecult.eve.unity-scene` `0.3.31`, commit + `140e1bd963a0033e66777a3b2c5fe6e9c97dfe32`; +- `org.gamecult.eve.surface` `0.2.2`, from the same commit; - `org.gamecult.eve.unity-uitoolkit` `0.1.1`, commit `4d0cbe0185bdc4fc65eb63503a7c5cb578539669`; - `org.gamecult.cultlib` `1.0.13`, commit @@ -15,7 +16,7 @@ The warm-cache released-package witness passes with: Evidence is in `artifacts/aetheria-daemon-native-0326-warm`. The PlayMode test passed and recorded provider-owned reconciled movement, look, targeting, -tractor, and action receipts. The daemon-owned look direction reached the SoA body rotation, +tractor press, tractor release, and action receipts. The daemon-owned look direction reached the SoA body rotation, and the generic aim presentation rendered at the advertised 50-unit minimum convergence distance. The advertised skybox material and reflection cubemap resolved from the provider bundle as their required native types and became the @@ -44,13 +45,14 @@ daemon lock progress `1.0`; Unity does not manufacture or smooth that value. Camera-channel facts: - provider-authored player renderers: `14`, including the lowered tractor effect; -- pilot changed pixels: `230,255`; -- pilot average luminance: `0.004634`; -- pilot bright pixels: `1,542`; -- map-channel renderers: `11`; -- map changed pixels: `8,510`; +- pilot changed pixels: `230,173`; +- pilot average luminance: `0.002677`; +- pilot bright pixels: `1,024`; +- map-channel renderers: `10`; +- map changed pixels: `4,626`; - native cockpit progress bars: `7`; -- daemon tractor power at capture: `0.24`; +- daemon tractor power at capture: `0.16`; +- daemon tractor power after the advertised release: `0`; - provider tractor particle systems: `1`; - the pilot camera excludes the advertised map layer; - the player prefab's embedded layer-14 map icon contributes exactly `0` pilot @@ -69,15 +71,18 @@ Aetheria currently bundles ambientCG's 1K `Metal012` color, normal, and metalness maps under CC0. The same pre-generated maps now replace dead Substance archive sub-assets on the brushed aluminium, tinted car paint, cockpit, steel, black-metal, and radiator materials. The released witness -resolves textured native URP materials in `9` distinct player-material slots, +resolves textured native URP materials in `10` distinct player-material slots, up from `3`, without adding another texture payload. This is temporary provider art with recorded provenance, not a replacement texture pipeline. The tractor proof is structural, not yet a native-look victory lap. The daemon -publishes `beam.presentation`, the generic client routes `pilot.scoop` through -the advertised `SetTractorPower` operation and payload, and the provider-owned -prefab is attached to the SoA-presented ship with nonzero daemon power. Its -particle renderer contributes only one measured pilot pixel in this capture. +publishes `beam.presentation` and advertises `pilot.scoop` as a +`button-hold.v1` value action. The generic client routes scalar `1` on press and +scalar `0` on release through the advertised `SetTractorPower` operation. Both +commands receive provider-owned reconciled receipts, and the daemon ramps the +published power from `0.16` at capture to exactly `0` after release. The +provider-owned prefab is attached to the SoA-presented ship, but its particle +renderer contributes zero measured pilot pixels in this capture. Effect tuning remains provider art work; the runtime must not compensate with an Aetheria-specific beam. diff --git a/scripts/run-aetheria-daemon-world-witness.ps1 b/scripts/run-aetheria-daemon-world-witness.ps1 index 3069618..b4890ec 100644 --- a/scripts/run-aetheria-daemon-world-witness.ps1 +++ b/scripts/run-aetheria-daemon-world-witness.ps1 @@ -1,9 +1,9 @@ param( [string] $UnityExe = "C:\Program Files\Unity\Hub\Editor\6000.4.2f1\Editor\Unity.exe", [string] $AetheriaRoot = "E:\Projects\Aetheria", - [string] $CultLibRoot = "E:\Projects\CultLib", + [string] $CultLibRoot = "E:\Projects\CultLib-codex-cultmesh-reliability", [string] $EveUnityRoot = "E:\Projects\EveUnity", - [string] $YmirRoot = "E:\Projects\Ymir", + [string] $YmirRoot = "E:\Projects\Ymir-aetheria-integration", [string] $ClientProject = "ReleaseConsumerProject", [int] $Port = 3076, [string] $OutputDirectory = "artifacts\aetheria-daemon", @@ -13,7 +13,7 @@ param( ) $ErrorActionPreference = "Stop" -$expectedEveUnityCommit = "f979cd425a9f8f951736c56051e8368b6d6ac2f3" +$expectedEveUnityCommit = "140e1bd963a0033e66777a3b2c5fe6e9c97dfe32" $expectedEveUnityUiToolkitCommit = "4d0cbe0185bdc4fc65eb63503a7c5cb578539669" $expectedCultLibCommit = "feb5c71513e71d681699f462fe3682b3168c6f73" $repoRoot = Split-Path -Parent $PSScriptRoot