Record released held-input witness

This commit is contained in:
Meta Vens 2026-07-15 11:27:20 +01:00
commit 72c9ed709d
5 changed files with 64 additions and 26 deletions

View file

@ -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;

View file

@ -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": [

View file

@ -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",

View file

@ -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.

View file

@ -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