Harden exact-source validation recovery
This commit is contained in:
parent
79b8dd9039
commit
2bd12a0c5e
11 changed files with 1155 additions and 20 deletions
|
|
@ -0,0 +1,419 @@
|
|||
{
|
||||
"devices": [
|
||||
{
|
||||
"deviceName": "DESKTOP-KS3VGHU",
|
||||
"instance": "1A6ED41B42F9172331469FBD2D852C7C",
|
||||
"instanceName": "DESKTOP-KS3VGHU-38936",
|
||||
"platform": "WindowsEditor",
|
||||
"oSVersion": "Windows 11 (23H2) [10.0.22631.4037] ",
|
||||
"model": "Default",
|
||||
"gPU": "GenericGPUBrand",
|
||||
"cPUModel": "12th Gen Intel(R) Core(TM) i7-12700H",
|
||||
"rAMInGB": 16,
|
||||
"renderMode": "SM6",
|
||||
"rHI": "",
|
||||
"appInstanceLog": ""
|
||||
}
|
||||
],
|
||||
"reportCreatedOn": "2026.06.30-10.45.20",
|
||||
"succeeded": 26,
|
||||
"succeededWithWarnings": 0,
|
||||
"failed": 0,
|
||||
"notRun": 0,
|
||||
"inProcess": 0,
|
||||
"totalDuration": 15.698421478271484,
|
||||
"comparisonExported": false,
|
||||
"comparisonExportDirectory": "",
|
||||
"tests": [
|
||||
{
|
||||
"testDisplayName": "NotificationCapture",
|
||||
"fullTestPath": "HyperTwist.Browser.Bridge.NotificationCapture",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.015972699970006943,
|
||||
"dateTime": "2026.06.30-10.44.59",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "RuntimeReadyDelegate",
|
||||
"fullTestPath": "HyperTwist.Browser.Bridge.RuntimeReadyDelegate",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.015567902475595474,
|
||||
"dateTime": "2026.06.30-10.44.59",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "RuntimeReadyPayloadDecode",
|
||||
"fullTestPath": "HyperTwist.Browser.Bridge.RuntimeReadyPayloadDecode",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.015711601823568344,
|
||||
"dateTime": "2026.06.30-10.44.59",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "RuntimeStatusEnvelopeDecode",
|
||||
"fullTestPath": "HyperTwist.Browser.Bridge.RuntimeStatusEnvelopeDecode",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.016416601836681366,
|
||||
"dateTime": "2026.06.30-10.44.59",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "TilingStateEnvelopeDecode",
|
||||
"fullTestPath": "HyperTwist.Browser.Bridge.TilingStateEnvelopeDecode",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.016030300408601761,
|
||||
"dateTime": "2026.06.30-10.44.59",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "ControlInputReadinessInspectSurface",
|
||||
"fullTestPath": "HyperTwist.Browser.CoachDashboard.ControlInputReadinessInspectSurface",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.81774640083312988,
|
||||
"dateTime": "2026.06.30-10.44.59",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "ControlProfileContinuityArtifacts",
|
||||
"fullTestPath": "HyperTwist.Browser.CoachDashboard.ControlProfileContinuityArtifacts",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 1.1325118541717529,
|
||||
"dateTime": "2026.06.30-10.45.00",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "ControlProfileRosterInspectSurface",
|
||||
"fullTestPath": "HyperTwist.Browser.CoachDashboard.ControlProfileRosterInspectSurface",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.49913820624351501,
|
||||
"dateTime": "2026.06.30-10.45.06",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "ControlSettingsOwnershipInspectSurface",
|
||||
"fullTestPath": "HyperTwist.Browser.CoachDashboard.ControlSettingsOwnershipInspectSurface",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.86615478992462158,
|
||||
"dateTime": "2026.06.30-10.45.06",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "ControlSurfaceStructuredTextArtifacts",
|
||||
"fullTestPath": "HyperTwist.Browser.CoachDashboard.ControlSurfaceStructuredTextArtifacts",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 10.748218536376953,
|
||||
"dateTime": "2026.06.30-10.45.07",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "RuntimeInspectSurface",
|
||||
"fullTestPath": "HyperTwist.Browser.CoachDashboard.RuntimeInspectSurface",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.39892959594726562,
|
||||
"dateTime": "2026.06.30-10.45.18",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "ControlInputReadinessInspectSurface",
|
||||
"fullTestPath": "HyperTwist.Browser.TrainingPanel.ControlInputReadinessInspectSurface",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.16984249651432037,
|
||||
"dateTime": "2026.06.30-10.45.18",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "ControlProfileContinuityParity",
|
||||
"fullTestPath": "HyperTwist.Browser.TrainingPanel.ControlProfileContinuityParity",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.12023679912090302,
|
||||
"dateTime": "2026.06.30-10.45.19",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "ControlProfileRosterInspectSurface",
|
||||
"fullTestPath": "HyperTwist.Browser.TrainingPanel.ControlProfileRosterInspectSurface",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.055037502199411392,
|
||||
"dateTime": "2026.06.30-10.45.19",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "ControlSettingsOwnershipInspectSurface",
|
||||
"fullTestPath": "HyperTwist.Browser.TrainingPanel.ControlSettingsOwnershipInspectSurface",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.63307029008865356,
|
||||
"dateTime": "2026.06.30-10.45.19",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "RuntimeInspectSurface",
|
||||
"fullTestPath": "HyperTwist.Browser.TrainingPanel.RuntimeInspectSurface",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.015922199934720993,
|
||||
"dateTime": "2026.06.30-10.45.19",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "AuthoritativeShellArtifacts",
|
||||
"fullTestPath": "HyperTwist.Browser.Widget.AuthoritativeShellArtifacts",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.01653599739074707,
|
||||
"dateTime": "2026.06.30-10.45.20",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "BundledShellUrl",
|
||||
"fullTestPath": "HyperTwist.Browser.Widget.BundledShellUrl",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.015801899135112762,
|
||||
"dateTime": "2026.06.30-10.45.20",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "OperatorStatusSurfaceLive",
|
||||
"fullTestPath": "HyperTwist.Browser.Widget.OperatorStatusSurfaceLive",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.016534201800823212,
|
||||
"dateTime": "2026.06.30-10.45.20",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "OperatorStatusSurfaceResetOnShellChange",
|
||||
"fullTestPath": "HyperTwist.Browser.Widget.OperatorStatusSurfaceResetOnShellChange",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.01616780087351799,
|
||||
"dateTime": "2026.06.30-10.45.20",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "OperatorStatusSurfaceWaiting",
|
||||
"fullTestPath": "HyperTwist.Browser.Widget.OperatorStatusSurfaceWaiting",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.01643029972910881,
|
||||
"dateTime": "2026.06.30-10.45.20",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "QueuedOutboundMessages",
|
||||
"fullTestPath": "HyperTwist.Browser.Widget.QueuedOutboundMessages",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.015827201306819916,
|
||||
"dateTime": "2026.06.30-10.45.20",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "StatusSurfaceArtifacts",
|
||||
"fullTestPath": "HyperTwist.Browser.Widget.StatusSurfaceArtifacts",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.016406100243330002,
|
||||
"dateTime": "2026.06.30-10.45.20",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "ControlInputContinuityStateFormatting",
|
||||
"fullTestPath": "HyperTwist.Browser.ControlInputContinuityStateFormatting",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.016290102154016495,
|
||||
"dateTime": "2026.06.30-10.45.20",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "ControlProfileContinuityStateFormatting",
|
||||
"fullTestPath": "HyperTwist.Browser.ControlProfileContinuityStateFormatting",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.015774600207805634,
|
||||
"dateTime": "2026.06.30-10.45.20",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
},
|
||||
{
|
||||
"testDisplayName": "ControlSettingsContinuityStateFormatting",
|
||||
"fullTestPath": "HyperTwist.Browser.ControlSettingsContinuityStateFormatting",
|
||||
"tags": [],
|
||||
"state": "Success",
|
||||
"deviceInstance": [
|
||||
"1A6ED41B42F9172331469FBD2D852C7C"
|
||||
],
|
||||
"duration": 0.016147200018167496,
|
||||
"dateTime": "2026.06.30-10.45.20",
|
||||
"entries": [],
|
||||
"warnings": 0,
|
||||
"errors": 0,
|
||||
"artifacts": []
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"reportVersion": "ht-higher-dimensional-package-validation/v1",
|
||||
"generatedAtUtc": "2026-06-29T14:00:38.8107466Z",
|
||||
"projectRoot": "C:\\HyperTwist_worktrees\\phase10validate",
|
||||
"archiveDirectory": "C:\\HyperTwist_worktrees\\phase10validate_packaged_phase6c_higherdim_refresh_20260629",
|
||||
"generatedAtUtc": "2026-06-30T10:45:24.1772955Z",
|
||||
"projectRoot": "C:\\HTpp",
|
||||
"archiveDirectory": "C:\\HTpp_packaged_phase6c_higherdim_refresh_20260630",
|
||||
"configuration": "Development",
|
||||
"cookMaps": [
|
||||
"/Game/HyperTwistTraining/Maps/L_HyperTwist_Magic120CellTraining",
|
||||
|
|
@ -17,10 +17,10 @@
|
|||
"-SkipCookingEditorContent"
|
||||
],
|
||||
"cleanArchive": false,
|
||||
"skipBuild": true,
|
||||
"skipBuild": false,
|
||||
"skipLaunch": false,
|
||||
"authoringManifest": {
|
||||
"path": "C:\\HyperTwist_worktrees\\phase10validate\\docs\\generated\\higher_dimensional_training_maps\\phase6c_dedicated_family_map_manifest.json",
|
||||
"path": "C:\\HTpp\\docs\\generated\\higher_dimensional_training_maps\\phase6c_dedicated_family_map_manifest.json",
|
||||
"manifestId": "phase6c/dedicated-family-training-map-authoring",
|
||||
"manifestVersion": "2026.06.18",
|
||||
"authoredThroughGameModeClassPath": "/Script/UnrealHyperTwist.HyperTwistCoachDashboardGameMode",
|
||||
|
|
@ -50,13 +50,13 @@
|
|||
]
|
||||
},
|
||||
"result": "passed",
|
||||
"packagedExecutablePath": "C:\\HyperTwist_worktrees\\phase10validate_packaged_phase6c_higherdim_refresh_20260629\\Windows\\UnrealHyperTwist.exe",
|
||||
"packagedExecutablePath": "C:\\HTpp_packaged_phase6c_higherdim_refresh_20260630\\Windows\\UnrealHyperTwist.exe",
|
||||
"smokeReports": [
|
||||
{
|
||||
"reportVersion": "ht-higher-dimensional-package-smoke/v1",
|
||||
"generatedAtUtc": "2026-06-29T14:01:45.8644849Z",
|
||||
"packageRoot": "C:\\HyperTwist_worktrees\\phase10validate_packaged_phase6c_higherdim_refresh_20260629",
|
||||
"executablePath": "C:\\HyperTwist_worktrees\\phase10validate_packaged_phase6c_higherdim_refresh_20260629\\Windows\\UnrealHyperTwist.exe",
|
||||
"generatedAtUtc": "2026-06-30T11:39:15.0336201Z",
|
||||
"packageRoot": "C:\\HTpp_packaged_phase6c_higherdim_refresh_20260630",
|
||||
"executablePath": "C:\\HTpp_packaged_phase6c_higherdim_refresh_20260630\\Windows\\UnrealHyperTwist.exe",
|
||||
"mapUrl": "/Game/HyperTwistTraining/Maps/L_HyperTwist_Magic120CellTraining",
|
||||
"smokeSeconds": 10,
|
||||
"resolution": {
|
||||
|
|
@ -65,16 +65,16 @@
|
|||
},
|
||||
"keepRunning": false,
|
||||
"result": "passed",
|
||||
"processId": 30724,
|
||||
"processId": 34020,
|
||||
"processStopped": true,
|
||||
"exitCode": null,
|
||||
"error": null
|
||||
},
|
||||
{
|
||||
"reportVersion": "ht-higher-dimensional-package-smoke/v1",
|
||||
"generatedAtUtc": "2026-06-29T14:01:56.2411398Z",
|
||||
"packageRoot": "C:\\HyperTwist_worktrees\\phase10validate_packaged_phase6c_higherdim_refresh_20260629",
|
||||
"executablePath": "C:\\HyperTwist_worktrees\\phase10validate_packaged_phase6c_higherdim_refresh_20260629\\Windows\\UnrealHyperTwist.exe",
|
||||
"generatedAtUtc": "2026-06-30T11:39:25.7497608Z",
|
||||
"packageRoot": "C:\\HTpp_packaged_phase6c_higherdim_refresh_20260630",
|
||||
"executablePath": "C:\\HTpp_packaged_phase6c_higherdim_refresh_20260630\\Windows\\UnrealHyperTwist.exe",
|
||||
"mapUrl": "/Game/HyperTwistTraining/Maps/L_HyperTwist_MagicCube5DTraining",
|
||||
"smokeSeconds": 10,
|
||||
"resolution": {
|
||||
|
|
@ -83,7 +83,7 @@
|
|||
},
|
||||
"keepRunning": false,
|
||||
"result": "passed",
|
||||
"processId": 34848,
|
||||
"processId": 34908,
|
||||
"processStopped": true,
|
||||
"exitCode": null,
|
||||
"error": null
|
||||
|
|
|
|||
|
|
@ -183,6 +183,85 @@ The sensitive runbook now carries the exact current Windows-side tunnel
|
|||
commands, known-hosts scratch file, listener verification command, reverse-sync
|
||||
commands, and the still-current password-backed login path.
|
||||
|
||||
## Addendum - 2026-06-30 (exact-source fallback refresh and host-lock recovery)
|
||||
|
||||
Live follow-up on `2026-06-30` established these additional facts:
|
||||
|
||||
- the primary reverse-SSH `localhost:22022` lane was still healthy for the
|
||||
current exact-source browser/package refresh sequence
|
||||
- the repo now also carries
|
||||
`scripts/run-hypertwist-remote-exact-source-browser-package-refresh.sh` as a
|
||||
bounded first-party exact-source wrapper that:
|
||||
- re-proves the remote Windows shell identity
|
||||
- optionally syncs a bounded set of exact-source browser/package support
|
||||
files into the target Windows root
|
||||
- reruns the remote editor build, browser automation, and higher-dimensional
|
||||
package helper
|
||||
- pulls the refreshed browser/package evidence back into the tracked repo
|
||||
- re-renders
|
||||
`website/src/shared/generated/windows-package-validation-summary.json`
|
||||
- the maintained validation root remained
|
||||
`C:\HyperTwist_worktrees\phase10validate`, but the exact-source editor build
|
||||
on that root failed twice with the same host-side file lock on:
|
||||
`C:\HyperTwist_worktrees\phase10validate\UnrealHyperTwist\Source\UnrealHyperTwist\Private\HyperTwistTraining\HyperTwistTrainingRepositoryLibrary.cpp`
|
||||
- `scripts/run-hypertwist-remote-unreal-build.sh` now retries that exact
|
||||
transient Windows source-lock class once by default before declaring the
|
||||
build failed, so a host-state file lock is no longer silently conflated with
|
||||
an ordinary first-pass code failure
|
||||
- because that maintained-root host lock persisted across the bounded retry,
|
||||
the same exact-source wrapper truthfully fell back to isolated Windows root
|
||||
`C:\HTpp`
|
||||
- that fallback root initially lacked the current `Content\Browser`, package
|
||||
helper, manifest, and related exact-source support files, so the wrapper
|
||||
narrow-synced those first instead of pretending the fallback tree was already
|
||||
exact-source complete
|
||||
- the fallback root also lacked the packaged-game target receipt
|
||||
`C:\HTpp\UnrealHyperTwist\Binaries\Win64\UnrealHyperTwist.target`, so the
|
||||
package helper correctly performed a full packaged build there instead of
|
||||
forcing `-SkipBuild`
|
||||
- the same fallback root then passed the current exact-source browser
|
||||
automation proof through exported report
|
||||
`docs/generated/browser_automation/Browser-ExactSource-20260630/index.json`
|
||||
with:
|
||||
- `26` tests succeeded
|
||||
- `0` failed
|
||||
- `0` not run
|
||||
- `0` in process
|
||||
- the same fallback root then passed the higher-dimensional package helper
|
||||
proof with:
|
||||
- `BuildCookRun` result `passed`
|
||||
- archive output in
|
||||
`C:\HTpp_packaged_phase6c_higherdim_refresh_20260630`
|
||||
- both dedicated-family packaged smoke maps green again:
|
||||
- `/Game/HyperTwistTraining/Maps/L_HyperTwist_Magic120CellTraining`
|
||||
- `/Game/HyperTwistTraining/Maps/L_HyperTwist_MagicCube5DTraining`
|
||||
- the refreshed aggregate package proof was then pulled back into
|
||||
`docs/generated/higher_dimensional_training_maps/phase6c_dedicated_family_package_validation_report.json`
|
||||
and the public summary was re-rendered into
|
||||
`website/src/shared/generated/windows-package-validation-summary.json`
|
||||
with truthful `skip_build: false`
|
||||
- `scripts/run-hypertwist-remote-unreal-automation.sh` now also treats the
|
||||
exported automation report itself as authority, not only the
|
||||
`UnrealEditor-Cmd` process exit:
|
||||
- it clears any prior report directory first
|
||||
- requires the new `index.json` to exist
|
||||
- fails the wrapper when the report records any `failed`, `notRun`, or
|
||||
`inProcess` counts
|
||||
|
||||
Operational rules reinforced by this proof:
|
||||
|
||||
- when the maintained isolated Windows worktree is temporarily blocked by a
|
||||
host-side source-file lock, do not falsely report the whole exact-source lane
|
||||
as green or code-broken until the bounded retry and any declared fallback
|
||||
lane have both been truthfully exercised
|
||||
- when a fallback Windows root is used for exact-source browser/package proof,
|
||||
sync the bounded browser/package support surfaces first instead of assuming a
|
||||
minimal Unreal tree is already sufficient evidence
|
||||
- judge remote browser automation success by the exported report counts, not by
|
||||
process exit alone
|
||||
- judge higher-dimensional package proof by the real target-receipt posture:
|
||||
use `-SkipBuild` only when the packaged-game receipt actually exists
|
||||
|
||||
## Addendum - 2026-06-22 (maintained validation-root clarification)
|
||||
|
||||
Live follow-up on `2026-06-22` established these additional facts:
|
||||
|
|
|
|||
|
|
@ -236,6 +236,30 @@ This extends the doctrine from a one-off helper proof into a re-proven
|
|||
maintained package lane that still stays green after later editor-build
|
||||
recovery work on the same primary reverse-SSH path.
|
||||
|
||||
Further exact-source browser/package refresh proof on `2026-06-30` then
|
||||
extended that same doctrine into truthful fallback-root recovery when the
|
||||
maintained isolated Windows worktree was temporarily blocked by host state:
|
||||
the current primary lane on `localhost:22022` still accepted the session, but
|
||||
the maintained validation root `C:\HyperTwist_worktrees\phase10validate`
|
||||
failed its exact-source editor rebuild twice because
|
||||
`HyperTwistTrainingRepositoryLibrary.cpp` was held by another Windows process.
|
||||
The new bounded wrapper
|
||||
`scripts/run-hypertwist-remote-exact-source-browser-package-refresh.sh` then
|
||||
fell back to isolated root `C:\HTpp`, narrow-synced the exact-source
|
||||
browser/package support files that that fallback root lacked, rebuilt the
|
||||
editor there successfully, reran `HyperTwist.Browser` automation with pulled
|
||||
report `docs/generated/browser_automation/Browser-ExactSource-20260630/index.json`
|
||||
showing `26` succeeded, `0` failed, `0` not run, and `0` in process, then
|
||||
performed a truthful full higher-dimensional package build because the fallback
|
||||
root had no packaged-game target receipt. The refreshed aggregate package
|
||||
proof still passed, both dedicated-family packaged smoke maps stayed green, and
|
||||
the checked-in public summary at
|
||||
`website/src/shared/generated/windows-package-validation-summary.json` was
|
||||
re-rendered with `skip_build: false`. This extends the doctrine from
|
||||
maintained-root `-SkipBuild` helper proof into bounded exact-source fallback
|
||||
proof when a live Windows host lock temporarily makes the maintained root
|
||||
unusable.
|
||||
|
||||
Further `2026-06-13` continuation proof on that same primary lane recovered
|
||||
the classic-cube replay/leaderboard/package slice after a corrupted reverse
|
||||
sync incident: a prior aborted broad tar sync left remote
|
||||
|
|
|
|||
|
|
@ -191,6 +191,18 @@ Current packaged-proof bridge truth after the same `2026-06-23` continuation:
|
|||
bounded first-party way to pull Windows-side validation artifacts back into
|
||||
the HyperTwist repo with explicit remote-to-local path mapping and SHA-256
|
||||
verification instead of relying on ad hoc manual copies
|
||||
- `scripts/run-hypertwist-remote-exact-source-browser-package-refresh.sh` now
|
||||
gives the lane one bounded exact-source browser/package recovery entry point:
|
||||
- it can re-prove the remote shell identity, sync the exact-source
|
||||
browser/package support files a fallback root needs, rerun the editor
|
||||
build plus `HyperTwist.Browser` automation plus the higher-dimensional
|
||||
package helper, pull the refreshed evidence back into the tracked repo, and
|
||||
re-render the public Windows packaged-proof summary in one same-family pass
|
||||
- the wrapper only claims browser automation success when the exported
|
||||
automation report itself exists and records `0` failed, `0` not run, and
|
||||
`0` in-process tests
|
||||
- the wrapper only claims higher-dimensional `-SkipBuild` package proof when
|
||||
the packaged-game target receipt actually exists on the chosen Windows root
|
||||
|
||||
Current bounded refactor-tool truth after the `2026-06-24` follow-up:
|
||||
|
||||
|
|
@ -2449,10 +2461,111 @@ Latest same-family responsive public-route expansion follow-up on `2026-06-29`:
|
|||
- deployment/readiness tooling validation:
|
||||
- `3` files passed
|
||||
- `30` tests passed
|
||||
- `website/server` validation:
|
||||
- `10` files passed
|
||||
- `36` tests passed
|
||||
- website plus `Content/Browser` production builds passed
|
||||
|
||||
## Exact-source fallback refresh plus owned web-surface recovery (`2026-06-30`)
|
||||
|
||||
- the next bounded continuation stayed on the already-open production-
|
||||
hardening and public/manual authority lane and did not widen product scope
|
||||
- the primary reverse-SSH `localhost:22022` lane was re-proved first and
|
||||
remained healthy for the current exact-source refresh
|
||||
- the repo now carries one bounded exact-source recovery wrapper:
|
||||
- `scripts/run-hypertwist-remote-exact-source-browser-package-refresh.sh`
|
||||
- the maintained validation root still remained:
|
||||
- `C:\HyperTwist_worktrees\phase10validate`
|
||||
- the current exact-source editor rebuild on that maintained root then failed
|
||||
twice because Windows still held:
|
||||
- `UnrealHyperTwist\Source\UnrealHyperTwist\Private\HyperTwistTraining\HyperTwistTrainingRepositoryLibrary.cpp`
|
||||
open from another process
|
||||
- the remote build wrapper now treats that specific source-lock class as a
|
||||
bounded retry case:
|
||||
- `scripts/run-hypertwist-remote-unreal-build.sh`
|
||||
- one default retry
|
||||
- `3` second retry delay
|
||||
- because that host-state lock persisted across the bounded retry, the exact-
|
||||
source recovery wrapper then truthfully fell back to:
|
||||
- `C:\HTpp`
|
||||
- that fallback root was not exact-source-complete on its own, so the wrapper
|
||||
narrow-synced the current browser/package support surfaces first:
|
||||
- `Content/Browser/index.html`
|
||||
- `Content/Browser/src/browser-runtime-bootstrap.js`
|
||||
- `Content/Browser/src/browser-spatial-runtime-fallback.js`
|
||||
- `Content/Browser/src/runtime/shell.ts`
|
||||
- `scripts/Invoke-HyperTwistHigherDimensionalPackage.ps1`
|
||||
- `scripts/Launch-HyperTwistHigherDimensionalPackage.ps1`
|
||||
- `docs/generated/higher_dimensional_training_maps/phase6c_dedicated_family_map_manifest.json`
|
||||
- the fallback root then rebuilt the editor successfully and reran the current
|
||||
browser authority proof through:
|
||||
- `scripts/run-hypertwist-remote-unreal-automation.sh --filter HyperTwist.Browser --report-name Browser-ExactSource-20260630`
|
||||
- pulled report:
|
||||
`docs/generated/browser_automation/Browser-ExactSource-20260630/index.json`
|
||||
- result:
|
||||
- `26` tests succeeded
|
||||
- `0` failed
|
||||
- `0` not run
|
||||
- `0` in process
|
||||
- `scripts/run-hypertwist-remote-unreal-automation.sh` is now stricter and
|
||||
more truthful for future sessions:
|
||||
- it removes any stale report directory before the run
|
||||
- requires the new `index.json` export to exist
|
||||
- fails when the exported report itself records `failed`, `notRun`, or
|
||||
`inProcess` counts even if `UnrealEditor-Cmd` exited `0`
|
||||
- the higher-dimensional package helper then ran from the same fallback exact-
|
||||
source state, but this time the lane correctly detected that
|
||||
`C:\HTpp\UnrealHyperTwist\Binaries\Win64\UnrealHyperTwist.target` was absent
|
||||
there, so it did a truthful full package build instead of forcing
|
||||
`-SkipBuild`
|
||||
- the refreshed higher-dimensional package proof then stayed green:
|
||||
- `BuildCookRun` result `passed`
|
||||
- archive:
|
||||
`C:\HTpp_packaged_phase6c_higherdim_refresh_20260630`
|
||||
- both dedicated-family packaged smoke maps passed again:
|
||||
- `Magic120Cell`
|
||||
- `MagicCube5D`
|
||||
- refreshed aggregate report:
|
||||
`docs/generated/higher_dimensional_training_maps/phase6c_dedicated_family_package_validation_report.json`
|
||||
- the public packaged-proof bridge was then rerendered from that exact-source
|
||||
package report again:
|
||||
- `website/src/shared/generated/windows-package-validation-summary.json`
|
||||
- truthful posture now shows `skip_build: false`
|
||||
- the related public marketing proof was hardened so website tests accept the
|
||||
two truthful packaged-build modes instead of assuming only one:
|
||||
- existing target receipt reused
|
||||
- full package build
|
||||
- the same repo state then reran the full owned web-surface gate green:
|
||||
- `scripts/run-hypertwist-web-surface-validation.sh`
|
||||
- focused website route/auth/release validation:
|
||||
- `14` files passed
|
||||
- `84` tests passed
|
||||
- deployment/readiness tooling validation:
|
||||
- `4` files passed
|
||||
- `34` tests passed
|
||||
- `website/server` validation:
|
||||
- `10` files passed
|
||||
- `36` tests passed
|
||||
- website plus `Content/Browser` production builds passed
|
||||
- website production audit stayed at:
|
||||
- `found 0 vulnerabilities`
|
||||
- `Content/Browser` production audit stayed at:
|
||||
- `found 0 vulnerabilities`
|
||||
- the same already-documented upstream auth-server residual remained the
|
||||
only accepted production-audit note:
|
||||
- `supertokens-node -> nodemailer`
|
||||
- the HyperTwist-owned structural and analysis loop also stayed healthy on the
|
||||
same current state:
|
||||
- `scripts/run-hypertwist-sentrux-source-only.sh`
|
||||
- `Quality: 6245`
|
||||
- all `7` rules passing
|
||||
- `scripts/run-hypertwist-gitnexus-analyze.sh`
|
||||
- the repo-owned local CLI still exhibits the current post-index
|
||||
`free(): invalid pointer` quirk on this Linux host
|
||||
- the wrapper now treats that exact post-index case as success after a fresh
|
||||
follow-up `status` confirms the bounded mirror is current
|
||||
- `scripts/run-hypertwist-gitnexus-status.sh`
|
||||
- bounded mirror `Status: up-to-date`
|
||||
- `website/` and `Content/Browser/` production audits stayed at
|
||||
`found 0 vulnerabilities`
|
||||
- `website/server/` again retained only the same already-documented upstream
|
||||
|
|
|
|||
|
|
@ -294,7 +294,7 @@ repo.
|
|||
| Higher-dimensional initial shared-map launch and view-context execution bridge | Implemented now | landed `Phase 6C` continuation packet | First-party current code first bundled higher-dimensional launch surfaces and view-context surfaces for `Magic120Cell` and `MagicCube5D`, resolved those surfaces through the training runtime library plus the live training panel/session-actor caches, and let the training subsystem start the shared-map seed run, apply default selector posture, persist the generated-mode launch request, and start the owned generated run without widening into external-process ownership. After recovering an interrupted follow-up, the primary reverse-SSH `localhost:22022` Windows lane rebuilt that cleaned slice on `2026-06-18` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 124.81 seconds`, and passed all `8` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests, including `LaunchCatalog`, `ViewContextCatalog`, `LaunchExecution`, and `RunStateActivationResolution`; that initial bridge is now superseded by the later dedicated-family map ownership continuation. |
|
||||
| Higher-dimensional explicit dedicated-host seam | Implemented now | landed `Phase 6C` host-surface continuation packet | First-party current code then recorded the preferred dedicated-family `Magic120Cell` / `MagicCube5D` host-map targets in an explicit higher-dimensional host-surface catalog while the slice still kept the shared training map as the interim effective runtime fallback, mirrored that resolved host seam through the training runtime library plus the panel/session caches, and threaded the host-surface id into the launch/view-context surfaces and generated-mode lineage. The primary reverse-SSH `localhost:22022` Windows lane rebuilt this widened slice on `2026-06-18` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 2858.02 seconds`, and passed all `9` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests, including the new `HostCatalog`; that interim fallback is now superseded by the later dedicated-family map ownership continuation. |
|
||||
| Higher-dimensional executed runtime session surface | Implemented now | landed `Phase 6C` session-surface continuation packet | First-party current code now merges the higher-dimensional launch, host, and view-context seams into an explicit runtime-session catalog for `Magic120Cell` and `MagicCube5D`, mirrors that session surface through the training runtime library plus the panel/session caches, upgrades generated-mode deck lineage to record the resolved session surface, and applies the merged launch-plus-view selector posture at start time instead of only the narrower launch defaults. The primary reverse-SSH `localhost:22022` Windows lane rebuilt this widened slice on `2026-06-18` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 3541.98 seconds`, and passed all `10` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests, including the new `SessionCatalog`; the longer `LaunchExecution` quiet interval of `573.84 seconds` remained known-good. |
|
||||
| Higher-dimensional dedicated-family interactive scene ownership | Implemented now | landed `Phase 6C` interactive-scene and dedicated-host continuation packet | First-party current code now promotes the higher-dimensional runtime-session seams into explicit `Magic120Cell` and `MagicCube5D` interactive-scene surfaces with family-owned runtime-state, projection, and persistence envelopes, replaces the shared-map bridge with dedicated-family training-map assets plus dedicated host/launch/view-context/session surfaces, exposes explicit scene-envelope decoders through the runtime library, batches default selector application so generated-mode launch execution no longer rebuilds repository views once per selector, and then defers repository-view projection across the internal generated-mode handoff itself so only the final launch state forces a view refresh. The primary reverse-SSH `localhost:22022` Windows lane rebuilt the dedicated-family ownership slice on `2026-06-18` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 1648.33 seconds`; the later projection-deferral hardening rebuild completed in `400.77 seconds`, and the exported automation report passed all `11` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests with `totalDuration` `41.88494873046875`, `LaunchExecution` duration `41.53509521484375`, and the controller quiet interval reduced to `41.52 seconds`. The current recovery-proof continuation now also deterministically reauthors the dedicated-family maps through `scripts/hypertwist_author_higher_dimensional_training_maps.py`, records manifest-backed owned hashes in `docs/generated/higher_dimensional_training_maps/phase6c_dedicated_family_map_manifest.json`, preserves the optional `AHyperTwistHigherDimensionalTrainingShellActor` for manual/editor authoring while intentionally skipping it on the headless commandlet lane because that spawn path still crashes `UnrealEditor-Cmd`, passes all `13` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests through pulled proof in `docs/generated/higher_dimensional_training_maps/phase6c_dedicated_map_ownership_automation_report.json`, including `DedicatedMapAuthoringManifest` and `DedicatedMapOwnedShell`, and now has a maintained packaged-validation seam through `scripts/Invoke-HyperTwistHigherDimensionalPackage.ps1` plus `scripts/Launch-HyperTwistHigherDimensionalPackage.ps1`. That helper was then live-validated on `2026-06-22` against isolated worktree `C:\HyperTwist_worktrees\phase10validate` in `-SkipBuild` mode, with `BuildCookRun time: 118.53 s`, archive output in `C:\HyperTwist_worktrees\phase10validate_packaged_phase6c_higherdim`, both dedicated-family packaged smoke maps green, and pulled aggregate proof in `docs/generated/higher_dimensional_training_maps/phase6c_dedicated_family_package_validation_report.json`. The same maintained helper lane was refreshed again on `2026-06-23` after the recovered authoritative editor rebuild, again in `-SkipBuild` mode against the existing receipt, with `BuildCookRun time: 70.74 s`, archive output in `C:\HyperTwist_worktrees\phase10validate_packaged_phase6c_higherdim_refresh_20260623`, both dedicated-family packaged smoke maps green again, and the checked-in aggregate report refreshed in place. |
|
||||
| Higher-dimensional dedicated-family interactive scene ownership | Implemented now | landed `Phase 6C` interactive-scene and dedicated-host continuation packet | First-party current code now promotes the higher-dimensional runtime-session seams into explicit `Magic120Cell` and `MagicCube5D` interactive-scene surfaces with family-owned runtime-state, projection, and persistence envelopes, replaces the shared-map bridge with dedicated-family training-map assets plus dedicated host/launch/view-context/session surfaces, exposes explicit scene-envelope decoders through the runtime library, batches default selector application so generated-mode launch execution no longer rebuilds repository views once per selector, and then defers repository-view projection across the internal generated-mode handoff itself so only the final launch state forces a view refresh. The primary reverse-SSH `localhost:22022` Windows lane rebuilt the dedicated-family ownership slice on `2026-06-18` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 1648.33 seconds`; the later projection-deferral hardening rebuild completed in `400.77 seconds`, and the exported automation report passed all `11` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests with `totalDuration` `41.88494873046875`, `LaunchExecution` duration `41.53509521484375`, and the controller quiet interval reduced to `41.52 seconds`. The current recovery-proof continuation now also deterministically reauthors the dedicated-family maps through `scripts/hypertwist_author_higher_dimensional_training_maps.py`, records manifest-backed owned hashes in `docs/generated/higher_dimensional_training_maps/phase6c_dedicated_family_map_manifest.json`, preserves the optional `AHyperTwistHigherDimensionalTrainingShellActor` for manual/editor authoring while intentionally skipping it on the headless commandlet lane because that spawn path still crashes `UnrealEditor-Cmd`, passes all `13` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests through pulled proof in `docs/generated/higher_dimensional_training_maps/phase6c_dedicated_map_ownership_automation_report.json`, including `DedicatedMapAuthoringManifest` and `DedicatedMapOwnedShell`, and now has a maintained packaged-validation seam through `scripts/Invoke-HyperTwistHigherDimensionalPackage.ps1` plus `scripts/Launch-HyperTwistHigherDimensionalPackage.ps1`. That helper was then live-validated on `2026-06-22` against isolated worktree `C:\HyperTwist_worktrees\phase10validate` in `-SkipBuild` mode, with `BuildCookRun time: 118.53 s`, archive output in `C:\HyperTwist_worktrees\phase10validate_packaged_phase6c_higherdim`, both dedicated-family packaged smoke maps green, and pulled aggregate proof in `docs/generated/higher_dimensional_training_maps/phase6c_dedicated_family_package_validation_report.json`. The same maintained helper lane was refreshed again on `2026-06-23` after the recovered authoritative editor rebuild, again in `-SkipBuild` mode against the existing receipt, with `BuildCookRun time: 70.74 s`, archive output in `C:\HyperTwist_worktrees\phase10validate_packaged_phase6c_higherdim_refresh_20260623`, both dedicated-family packaged smoke maps green again, and the checked-in aggregate report refreshed in place. A later exact-source recovery on `2026-06-30` then proved the same dedicated-family package lane can stay truthful even when the maintained isolated worktree is temporarily blocked by a Windows host file lock: the new bounded wrapper `scripts/run-hypertwist-remote-exact-source-browser-package-refresh.sh` retried the maintained-root editor build, fell back to `C:\HTpp` when the lock persisted, narrow-synced the exact-source browser/package support surfaces that fallback root lacked, reran `HyperTwist.Browser` proof with `26` succeeded and `0` failed, then completed a full packaged higher-dimensional build there because the fallback root did not yet have the packaged-game target receipt. Both dedicated-family smoke maps still passed, and the checked-in aggregate package report plus public summary were refreshed with truthful `skip_build: false` posture instead of pretending the old maintained-root `-SkipBuild` condition still applied. |
|
||||
| Broad non-Euclidean interaction shell and host ownership | Deep-source grounded retained | `MagicTile` retained remainder | Broad interaction-shell, WinForms/OpenTK host ownership, native spherical/hyperbolic renderer ownership beyond the landed first-party native behavior proof, and generic runtime replacement remain deferred after the landed `Phase 6R-T`, `Phase 7A`, `Phase 7B`, and `Phase 7C` slices, with later native renderer reopening now governed by the separate spec-only `Phase 7D` decision gate. |
|
||||
|
||||
### 8. Speech input and voice sidecars
|
||||
|
|
|
|||
|
|
@ -0,0 +1,412 @@
|
|||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Usage:
|
||||
HYPERTWIST_REMOTE_WINDOWS_PASSWORD=... \
|
||||
scripts/run-hypertwist-remote-exact-source-browser-package-refresh.sh
|
||||
|
||||
Options:
|
||||
--worktree-root <path>
|
||||
Optional Windows worktree root. Defaults to C:\HyperTwist_worktrees\phase10validate.
|
||||
|
||||
--report-stamp <YYYYMMDD>
|
||||
Optional suffix used for the browser automation report and package archive.
|
||||
Defaults to the current UTC date.
|
||||
|
||||
--fallback-worktree-root <path>
|
||||
Optional fallback Windows worktree root to use if the primary refresh
|
||||
fails. Useful when the maintained worktree is temporarily locked by
|
||||
another Windows-side process.
|
||||
|
||||
--browser-filter <automation-filter>
|
||||
Optional Unreal automation filter. Defaults to HyperTwist.Browser.
|
||||
|
||||
--browser-report-name <name>
|
||||
Optional explicit browser automation report name. Defaults to
|
||||
Browser-ExactSource-<report-stamp>.
|
||||
|
||||
--package-archive-dir <path>
|
||||
Optional Windows archive directory for the higher-dimensional package run.
|
||||
Defaults to <worktree-root>_packaged_phase6c_higherdim_refresh_<report-stamp>.
|
||||
|
||||
--sync-file <repo-relative-path>
|
||||
Optional repo-relative file to sync into the remote Windows worktree before
|
||||
validation. May be repeated.
|
||||
|
||||
--skip-build
|
||||
Skip the remote Unreal editor build step.
|
||||
|
||||
--skip-browser-automation
|
||||
Skip the HyperTwist.Browser automation refresh.
|
||||
|
||||
--skip-package
|
||||
Skip the higher-dimensional package refresh.
|
||||
|
||||
--skip-browser-report-pull
|
||||
Skip pulling the browser automation index.json back into docs/generated.
|
||||
|
||||
--skip-package-report-pull
|
||||
Skip pulling the higher-dimensional package validation report back into
|
||||
docs/generated.
|
||||
|
||||
--skip-summary-refresh
|
||||
Skip re-rendering website/src/shared/generated/windows-package-validation-summary.json.
|
||||
|
||||
--skip-exact-source-support-sync
|
||||
Skip syncing the bounded exact-source browser/package support files that
|
||||
the fallback Windows validation root needs for truthful browser/package
|
||||
refreshes.
|
||||
|
||||
--dry-run
|
||||
Print the wrapper invocations without executing them.
|
||||
|
||||
Environment:
|
||||
HYPERTWIST_REMOTE_WINDOWS_PASSWORD Required by the underlying remote wrappers.
|
||||
HYPERTWIST_REMOTE_WINDOWS_WORKTREE_ROOT Optional default for --worktree-root.
|
||||
HYPERTWIST_REMOTE_WINDOWS_FALLBACK_WORKTREE_ROOT
|
||||
Optional default for --fallback-worktree-root.
|
||||
HYPERTWIST_REMOTE_WINDOWS_SKIP_EXACT_SOURCE_SUPPORT_SYNC
|
||||
Optional default for --skip-exact-source-support-sync.
|
||||
EOF
|
||||
}
|
||||
|
||||
ps_single_quote() {
|
||||
printf "'%s'" "${1//\'/\'\'}"
|
||||
}
|
||||
|
||||
run_or_print() {
|
||||
if [[ "$dry_run" == "true" ]]; then
|
||||
printf '%q ' "$@"
|
||||
printf '\n'
|
||||
return 0
|
||||
fi
|
||||
|
||||
"$@"
|
||||
}
|
||||
|
||||
worktree_root="${HYPERTWIST_REMOTE_WINDOWS_WORKTREE_ROOT:-C:\\HyperTwist_worktrees\\phase10validate}"
|
||||
fallback_worktree_root="${HYPERTWIST_REMOTE_WINDOWS_FALLBACK_WORKTREE_ROOT:-}"
|
||||
report_stamp="$(date -u '+%Y%m%d')"
|
||||
browser_filter="HyperTwist.Browser"
|
||||
browser_report_name=""
|
||||
package_archive_dir=""
|
||||
sync_files=()
|
||||
skip_build="false"
|
||||
skip_browser_automation="false"
|
||||
skip_package="false"
|
||||
skip_browser_report_pull="false"
|
||||
skip_package_report_pull="false"
|
||||
skip_summary_refresh="false"
|
||||
skip_exact_source_support_sync="${HYPERTWIST_REMOTE_WINDOWS_SKIP_EXACT_SOURCE_SUPPORT_SYNC:-false}"
|
||||
dry_run="false"
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--worktree-root)
|
||||
worktree_root="${2:-}"
|
||||
shift 2
|
||||
;;
|
||||
--report-stamp)
|
||||
report_stamp="${2:-}"
|
||||
shift 2
|
||||
;;
|
||||
--fallback-worktree-root)
|
||||
fallback_worktree_root="${2:-}"
|
||||
shift 2
|
||||
;;
|
||||
--browser-filter)
|
||||
browser_filter="${2:-}"
|
||||
shift 2
|
||||
;;
|
||||
--browser-report-name)
|
||||
browser_report_name="${2:-}"
|
||||
shift 2
|
||||
;;
|
||||
--package-archive-dir)
|
||||
package_archive_dir="${2:-}"
|
||||
shift 2
|
||||
;;
|
||||
--sync-file)
|
||||
sync_files+=("${2:-}")
|
||||
shift 2
|
||||
;;
|
||||
--skip-build)
|
||||
skip_build="true"
|
||||
shift
|
||||
;;
|
||||
--skip-browser-automation)
|
||||
skip_browser_automation="true"
|
||||
shift
|
||||
;;
|
||||
--skip-package)
|
||||
skip_package="true"
|
||||
shift
|
||||
;;
|
||||
--skip-browser-report-pull)
|
||||
skip_browser_report_pull="true"
|
||||
shift
|
||||
;;
|
||||
--skip-package-report-pull)
|
||||
skip_package_report_pull="true"
|
||||
shift
|
||||
;;
|
||||
--skip-summary-refresh)
|
||||
skip_summary_refresh="true"
|
||||
shift
|
||||
;;
|
||||
--skip-exact-source-support-sync)
|
||||
skip_exact_source_support_sync="true"
|
||||
shift
|
||||
;;
|
||||
--dry-run)
|
||||
dry_run="true"
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
usage >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ -z "$browser_report_name" ]]; then
|
||||
browser_report_name="Browser-ExactSource-${report_stamp}"
|
||||
fi
|
||||
|
||||
if [[ -z "$package_archive_dir" ]]; then
|
||||
package_archive_dir="${worktree_root}_packaged_phase6c_higherdim_refresh_${report_stamp}"
|
||||
fi
|
||||
|
||||
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
repo_root="$(cd "${script_dir}/.." && pwd)"
|
||||
remote_ps_wrapper="${script_dir}/run-hypertwist-remote-windows-powershell.sh"
|
||||
remote_build_wrapper="${script_dir}/run-hypertwist-remote-unreal-build.sh"
|
||||
remote_automation_wrapper="${script_dir}/run-hypertwist-remote-unreal-automation.sh"
|
||||
remote_sync_wrapper="${script_dir}/run-hypertwist-remote-windows-file-sync.sh"
|
||||
remote_pull_wrapper="${script_dir}/run-hypertwist-remote-windows-file-pull.sh"
|
||||
summary_refresh_script="${script_dir}/render-hypertwist-web-package-validation-summary.mjs"
|
||||
|
||||
for required_wrapper in \
|
||||
"$remote_ps_wrapper" \
|
||||
"$remote_build_wrapper" \
|
||||
"$remote_automation_wrapper" \
|
||||
"$remote_sync_wrapper" \
|
||||
"$remote_pull_wrapper"
|
||||
do
|
||||
if [[ ! -x "$required_wrapper" ]]; then
|
||||
echo "Expected executable wrapper at $required_wrapper" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ ! -f "$summary_refresh_script" ]]; then
|
||||
echo "Expected summary refresh script at $summary_refresh_script" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -z "${HYPERTWIST_REMOTE_WINDOWS_PASSWORD:-}" ]]; then
|
||||
echo "Set HYPERTWIST_REMOTE_WINDOWS_PASSWORD before running this refresh." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
host_probe_command="Write-Output ('USER=' + [System.Security.Principal.WindowsIdentity]::GetCurrent().Name); Write-Output ('HOST=' + \$env:COMPUTERNAME)"
|
||||
browser_report_local_path="docs/generated/browser_automation/${browser_report_name}/index.json"
|
||||
package_report_local_path="docs/generated/higher_dimensional_training_maps/phase6c_dedicated_family_package_validation_report.json"
|
||||
exact_source_support_files=(
|
||||
"Content/Browser/index.html"
|
||||
"Content/Browser/src/browser-runtime-bootstrap.js"
|
||||
"Content/Browser/src/browser-spatial-runtime-fallback.js"
|
||||
"Content/Browser/src/runtime/shell.ts"
|
||||
"scripts/Invoke-HyperTwistHigherDimensionalPackage.ps1"
|
||||
"scripts/Launch-HyperTwistHigherDimensionalPackage.ps1"
|
||||
"docs/generated/higher_dimensional_training_maps/phase6c_dedicated_family_map_manifest.json"
|
||||
)
|
||||
effective_sync_files=()
|
||||
|
||||
add_effective_sync_file() {
|
||||
local candidate="$1"
|
||||
local existing
|
||||
for existing in "${effective_sync_files[@]}"; do
|
||||
if [[ "$existing" == "$candidate" ]]; then
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
effective_sync_files+=("$candidate")
|
||||
}
|
||||
|
||||
if [[ "$skip_exact_source_support_sync" != "true" ]]; then
|
||||
for sync_file in "${exact_source_support_files[@]}"; do
|
||||
add_effective_sync_file "$sync_file"
|
||||
done
|
||||
fi
|
||||
|
||||
for sync_file in "${sync_files[@]}"; do
|
||||
add_effective_sync_file "$sync_file"
|
||||
done
|
||||
|
||||
run_refresh_for_root() {
|
||||
local current_worktree_root="$1"
|
||||
local current_validation_report_path="${current_worktree_root}\\docs\\generated\\higher_dimensional_training_maps\\phase6c_dedicated_family_package_validation_report.json"
|
||||
local browser_report_remote_path="${current_worktree_root}\\UnrealHyperTwist\\Saved\\AutomationReports\\${browser_report_name}\\index.json"
|
||||
local package_report_remote_path="$current_validation_report_path"
|
||||
local current_package_script_path="${current_worktree_root}\\scripts\\Invoke-HyperTwistHigherDimensionalPackage.ps1"
|
||||
local current_package_archive_dir="$package_archive_dir"
|
||||
local current_game_target_receipt_path="${current_worktree_root}\\UnrealHyperTwist\\Binaries\\Win64\\UnrealHyperTwist.target"
|
||||
local package_skip_build_clause=""
|
||||
local step_exit=0
|
||||
|
||||
if [[ "$current_worktree_root" != "$worktree_root" && "$package_archive_dir" == "${worktree_root}_packaged_phase6c_higherdim_refresh_${report_stamp}" ]]; then
|
||||
current_package_archive_dir="${current_worktree_root}_packaged_phase6c_higherdim_refresh_${report_stamp}"
|
||||
fi
|
||||
|
||||
echo "Re-proving remote Windows lane through ${current_worktree_root}."
|
||||
if run_or_print "$remote_ps_wrapper" --command "$host_probe_command"; then
|
||||
:
|
||||
else
|
||||
step_exit="$?"
|
||||
return "$step_exit"
|
||||
fi
|
||||
|
||||
if [[ ${#effective_sync_files[@]} -gt 0 ]]; then
|
||||
echo "Syncing ${#effective_sync_files[@]} repo-relative exact-source support file(s) into ${current_worktree_root}."
|
||||
local sync_command=("$remote_sync_wrapper")
|
||||
local sync_file
|
||||
for sync_file in "${effective_sync_files[@]}"; do
|
||||
sync_command+=(--file "$sync_file")
|
||||
done
|
||||
sync_command+=(--remote-root "$current_worktree_root")
|
||||
if run_or_print "${sync_command[@]}"; then
|
||||
:
|
||||
else
|
||||
step_exit="$?"
|
||||
return "$step_exit"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$skip_build" != "true" ]]; then
|
||||
echo "Running remote Unreal editor build."
|
||||
if run_or_print "$remote_build_wrapper" --worktree-root "$current_worktree_root"; then
|
||||
:
|
||||
else
|
||||
step_exit="$?"
|
||||
return "$step_exit"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$skip_browser_automation" != "true" ]]; then
|
||||
echo "Running remote browser automation refresh (~10-20s once the editor lane is warm)."
|
||||
if run_or_print \
|
||||
env HYPERTWIST_REMOTE_WINDOWS_WORKTREE_ROOT="$current_worktree_root" \
|
||||
"$remote_automation_wrapper" \
|
||||
--filter "$browser_filter" \
|
||||
--report-name "$browser_report_name"
|
||||
then
|
||||
:
|
||||
else
|
||||
step_exit="$?"
|
||||
return "$step_exit"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$skip_package" != "true" ]]; then
|
||||
echo "Running remote higher-dimensional package refresh (~1-3m on the maintained lane)."
|
||||
if [[ "$dry_run" == "true" ]]; then
|
||||
echo "Dry run: package helper would auto-detect whether ${current_game_target_receipt_path} exists before deciding on -SkipBuild."
|
||||
else
|
||||
local package_skip_build_probe_output
|
||||
if package_skip_build_probe_output="$(
|
||||
"$remote_ps_wrapper" --command "\$GameTargetReceiptPath = $(ps_single_quote "$current_game_target_receipt_path"); Write-Output ('PACKAGE_SKIP_BUILD=' + (Test-Path -LiteralPath \$GameTargetReceiptPath).ToString().ToLowerInvariant())" \
|
||||
| tr -d '\r'
|
||||
)"; then
|
||||
:
|
||||
else
|
||||
step_exit="$?"
|
||||
return "$step_exit"
|
||||
fi
|
||||
if printf '%s\n' "$package_skip_build_probe_output" | grep -Fq 'PACKAGE_SKIP_BUILD=true'; then
|
||||
package_skip_build_clause=" -SkipBuild"
|
||||
echo "Package helper will reuse the existing Win64 game target receipt."
|
||||
else
|
||||
echo "Package helper will rebuild the Win64 game target because the packaged-game receipt is absent."
|
||||
fi
|
||||
fi
|
||||
local package_command
|
||||
package_command="$(
|
||||
cat <<EOF
|
||||
\$ProjectRoot = $(ps_single_quote "$current_worktree_root")
|
||||
\$ArchiveDirectory = $(ps_single_quote "$current_package_archive_dir")
|
||||
\$PackageScriptPath = $(ps_single_quote "$current_package_script_path")
|
||||
\$ValidationReportPath = $(ps_single_quote "$current_validation_report_path")
|
||||
if (-not (Test-Path -LiteralPath \$PackageScriptPath)) {
|
||||
throw "Higher-dimensional package script was not found at '\$PackageScriptPath'."
|
||||
}
|
||||
& \$PackageScriptPath -ProjectRoot \$ProjectRoot -ArchiveDirectory \$ArchiveDirectory -ValidationReportPath \$ValidationReportPath${package_skip_build_clause}
|
||||
exit \$LASTEXITCODE
|
||||
EOF
|
||||
)"
|
||||
if run_or_print "$remote_ps_wrapper" --command "$package_command"; then
|
||||
:
|
||||
else
|
||||
step_exit="$?"
|
||||
return "$step_exit"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$skip_browser_automation" != "true" && "$skip_browser_report_pull" != "true" ]]; then
|
||||
echo "Pulling remote browser automation index.json back into docs/generated."
|
||||
if run_or_print \
|
||||
"$remote_pull_wrapper" \
|
||||
--map "${browser_report_remote_path}::${browser_report_local_path}"
|
||||
then
|
||||
:
|
||||
else
|
||||
step_exit="$?"
|
||||
return "$step_exit"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$skip_package" != "true" && "$skip_package_report_pull" != "true" ]]; then
|
||||
echo "Pulling remote higher-dimensional package report back into docs/generated."
|
||||
if run_or_print \
|
||||
"$remote_pull_wrapper" \
|
||||
--map "${package_report_remote_path}::${package_report_local_path}"
|
||||
then
|
||||
:
|
||||
else
|
||||
step_exit="$?"
|
||||
return "$step_exit"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$skip_package" != "true" && "$skip_package_report_pull" != "true" && "$skip_summary_refresh" != "true" ]]; then
|
||||
echo "Refreshing the checked-in website package-validation summary."
|
||||
if run_or_print node "$summary_refresh_script"; then
|
||||
:
|
||||
else
|
||||
step_exit="$?"
|
||||
return "$step_exit"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
active_worktree_root="$worktree_root"
|
||||
if run_refresh_for_root "$worktree_root"; then
|
||||
:
|
||||
else
|
||||
primary_exit="$?"
|
||||
if [[ -n "$fallback_worktree_root" ]]; then
|
||||
echo "Primary remote refresh failed on ${worktree_root}. Falling back to ${fallback_worktree_root}." >&2
|
||||
run_refresh_for_root "$fallback_worktree_root"
|
||||
active_worktree_root="$fallback_worktree_root"
|
||||
else
|
||||
exit "$primary_exit"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Remote exact-source browser/package refresh complete through ${active_worktree_root}."
|
||||
|
|
@ -113,7 +113,11 @@ lines = [
|
|||
f"$ReportExportPath = {ps_single_quote(report_export_path)}",
|
||||
f"$AbsLogPath = {ps_single_quote(abs_log_path)}",
|
||||
f"$Filter = {ps_single_quote(filter_name)}",
|
||||
"$ReportIndexPath = Join-Path $ReportExportPath 'index.json'",
|
||||
"",
|
||||
"if (Test-Path -LiteralPath $ReportExportPath) {",
|
||||
" Remove-Item -LiteralPath $ReportExportPath -Recurse -Force",
|
||||
"}",
|
||||
"New-Item -ItemType Directory -Force -Path $ReportExportPath | Out-Null",
|
||||
"New-Item -ItemType Directory -Force -Path (Split-Path -Parent $AbsLogPath) | Out-Null",
|
||||
"",
|
||||
|
|
@ -146,7 +150,28 @@ if extra_args:
|
|||
lines.extend([
|
||||
" \"-TestExit=Automation Test Queue Empty\"",
|
||||
"",
|
||||
"exit $LASTEXITCODE",
|
||||
"$EditorExitCode = $LASTEXITCODE",
|
||||
"if ($EditorExitCode -ne 0) {",
|
||||
" exit $EditorExitCode",
|
||||
"}",
|
||||
"",
|
||||
"if (-not (Test-Path -LiteralPath $ReportIndexPath)) {",
|
||||
" throw \"Automation report index was not written to '$ReportIndexPath'.\"",
|
||||
"}",
|
||||
"",
|
||||
"$Report = Get-Content -LiteralPath $ReportIndexPath -Raw | ConvertFrom-Json",
|
||||
"if ($null -eq $Report) {",
|
||||
" throw \"Automation report '$ReportIndexPath' could not be parsed.\"",
|
||||
"}",
|
||||
"",
|
||||
"$FailedCount = if ($null -ne $Report.failed) { [int]$Report.failed } else { 0 }",
|
||||
"$NotRunCount = if ($null -ne $Report.notRun) { [int]$Report.notRun } else { 0 }",
|
||||
"$InProcessCount = if ($null -ne $Report.inProcess) { [int]$Report.inProcess } else { 0 }",
|
||||
"if ($FailedCount -gt 0 -or $NotRunCount -gt 0 -or $InProcessCount -gt 0) {",
|
||||
" throw \"Automation report '$ReportIndexPath' recorded failed=$FailedCount notRun=$NotRunCount inProcess=$InProcessCount for filter '$Filter'.\"",
|
||||
"}",
|
||||
"",
|
||||
"exit 0",
|
||||
])
|
||||
|
||||
print("\n".join(lines))
|
||||
|
|
|
|||
|
|
@ -32,6 +32,13 @@ Options:
|
|||
--allow-uba
|
||||
Allow UBA instead of forcing the verified remote-lane -NoUBA posture.
|
||||
|
||||
--source-lock-retries <count>
|
||||
Retry the remote build when UnrealBuildTool hits a transient Windows
|
||||
source-file lock. Defaults to 1.
|
||||
|
||||
--source-lock-retry-delay-seconds <count>
|
||||
Delay between transient source-lock retries. Defaults to 3 seconds.
|
||||
|
||||
--extra-arg <value>
|
||||
Append an extra Build.bat argument. May be repeated.
|
||||
|
||||
|
|
@ -45,6 +52,10 @@ Environment:
|
|||
HYPERTWIST_REMOTE_WINDOWS_BUILD_BAT Optional default for --build-batch-path.
|
||||
HYPERTWIST_REMOTE_WINDOWS_MAX_PARALLEL_ACTIONS
|
||||
Optional default for --max-parallel-actions.
|
||||
HYPERTWIST_REMOTE_WINDOWS_SOURCE_LOCK_RETRIES
|
||||
Optional default for --source-lock-retries.
|
||||
HYPERTWIST_REMOTE_WINDOWS_SOURCE_LOCK_RETRY_DELAY_SECONDS
|
||||
Optional default for --source-lock-retry-delay-seconds.
|
||||
EOF
|
||||
}
|
||||
|
||||
|
|
@ -55,6 +66,8 @@ worktree_root="${HYPERTWIST_REMOTE_WINDOWS_WORKTREE_ROOT:-C:\\HyperTwist_worktre
|
|||
project_path=""
|
||||
build_batch_path="${HYPERTWIST_REMOTE_WINDOWS_BUILD_BAT:-C:\\Program Files\\Epic Games\\UE_5.7\\Engine\\Build\\BatchFiles\\Build.bat}"
|
||||
max_parallel_actions="${HYPERTWIST_REMOTE_WINDOWS_MAX_PARALLEL_ACTIONS:-2}"
|
||||
source_lock_retries="${HYPERTWIST_REMOTE_WINDOWS_SOURCE_LOCK_RETRIES:-1}"
|
||||
source_lock_retry_delay_seconds="${HYPERTWIST_REMOTE_WINDOWS_SOURCE_LOCK_RETRY_DELAY_SECONDS:-3}"
|
||||
allow_uba="false"
|
||||
dry_run="false"
|
||||
extra_args=()
|
||||
|
|
@ -93,6 +106,14 @@ while [[ $# -gt 0 ]]; do
|
|||
allow_uba="true"
|
||||
shift
|
||||
;;
|
||||
--source-lock-retries)
|
||||
source_lock_retries="${2:-}"
|
||||
shift 2
|
||||
;;
|
||||
--source-lock-retry-delay-seconds)
|
||||
source_lock_retry_delay_seconds="${2:-}"
|
||||
shift 2
|
||||
;;
|
||||
--extra-arg)
|
||||
extra_args+=("${2:-}")
|
||||
shift 2
|
||||
|
|
@ -126,6 +147,16 @@ if [[ -n "$max_parallel_actions" && ! "$max_parallel_actions" =~ ^[0-9]+$ ]]; th
|
|||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -n "$source_lock_retries" && ! "$source_lock_retries" =~ ^[0-9]+$ ]]; then
|
||||
echo "--source-lock-retries must be numeric." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -n "$source_lock_retry_delay_seconds" && ! "$source_lock_retry_delay_seconds" =~ ^[0-9]+$ ]]; then
|
||||
echo "--source-lock-retry-delay-seconds must be numeric." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
remote_ps_wrapper="${script_dir}/run-hypertwist-remote-windows-powershell.sh"
|
||||
|
||||
|
|
@ -210,4 +241,32 @@ if [[ "$dry_run" == "true" ]]; then
|
|||
exit 0
|
||||
fi
|
||||
|
||||
exec "$remote_ps_wrapper" --command "$powershell_payload"
|
||||
source_lock_marker="because it is being used by another process"
|
||||
attempt=1
|
||||
max_attempts=$((source_lock_retries + 1))
|
||||
build_output_path="$(mktemp)"
|
||||
trap 'rm -f "$build_output_path"' EXIT
|
||||
|
||||
while :; do
|
||||
set +e
|
||||
"$remote_ps_wrapper" --command "$powershell_payload" 2>&1 | tee "$build_output_path"
|
||||
build_exit="${PIPESTATUS[0]}"
|
||||
set -e
|
||||
|
||||
if [[ "$build_exit" -eq 0 ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if ! grep -Fq "$source_lock_marker" "$build_output_path"; then
|
||||
exit "$build_exit"
|
||||
fi
|
||||
|
||||
if (( attempt >= max_attempts )); then
|
||||
echo "Remote Unreal build exhausted ${max_attempts} attempt(s) after transient source-file lock detection." >&2
|
||||
exit "$build_exit"
|
||||
fi
|
||||
|
||||
attempt=$((attempt + 1))
|
||||
echo "Retrying remote Unreal build after transient source-file lock (${attempt}/${max_attempts}) in ${source_lock_retry_delay_seconds}s..." >&2
|
||||
sleep "$source_lock_retry_delay_seconds"
|
||||
done
|
||||
|
|
|
|||
|
|
@ -1172,7 +1172,11 @@ describe('public marketing pages', () => {
|
|||
expect(within(packagedProofSection as HTMLElement).getByText('Packaged validation passed')).toBeTruthy()
|
||||
expect(within(packagedProofSection as HTMLElement).getByText(/The Windows lane has current first-party package proof/i)).toBeTruthy()
|
||||
expect(within(packagedProofSection as HTMLElement).getByText(/MagicCube5D dedicated-family training map: passed/i)).toBeTruthy()
|
||||
expect(within(packagedProofSection as HTMLElement).getByText(/Build step during latest proof: skipped and reused existing target receipt/i)).toBeTruthy()
|
||||
expect(
|
||||
within(packagedProofSection as HTMLElement).getByText(
|
||||
/Build step during latest proof: (skipped and reused existing target receipt|full package build)/i
|
||||
)
|
||||
).toBeTruthy()
|
||||
expect(screen.getAllByText('Support topic quick routes').length).toBeGreaterThan(0)
|
||||
expect(screen.getByText('Choose the right HyperTwist surface')).toBeTruthy()
|
||||
expect(screen.getByText('Why HyperTwist keeps both a website and a desktop runtime')).toBeTruthy()
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
{
|
||||
"lane": "Windows Unreal packaged validation",
|
||||
"result": "passed",
|
||||
"generated_at": "2026-06-29T14:00:38.8107466Z",
|
||||
"generated_at": "2026-06-30T10:45:24.1772955Z",
|
||||
"configuration": "Development",
|
||||
"skip_build": true,
|
||||
"skip_build": false,
|
||||
"smoke_map_count": 2,
|
||||
"smoke_maps": [
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue