Harden browser runtime status capture

This commit is contained in:
axiomlogicnexus 2026-06-19 05:28:46 +00:00
parent cbcf98a70e
commit 8704e0976d
12 changed files with 352 additions and 2 deletions

View file

@ -1,5 +1,7 @@
#include "HyperTwistBrowser/HyperTwistBrowserBridgeObject.h"
#include "JsonObjectConverter.h"
namespace HyperTwistBrowserBridgeObjectInternal
{
bool TryCacheTilingEnvelope(
@ -13,6 +15,17 @@ namespace HyperTwistBrowserBridgeObjectInternal
OutEnvelope
);
}
bool TryCacheBrowserRuntimeStatusEnvelope(
const FString& Json,
FHyperTwistBrowserRuntimeStatusEnvelope& OutEnvelope
)
{
OutEnvelope = FHyperTwistBrowserRuntimeStatusEnvelope();
return !Json.IsEmpty()
&& FJsonObjectConverter::JsonObjectStringToUStruct(Json, &OutEnvelope, 0, 0)
&& OutEnvelope.IsStructurallyValid();
}
}
void UHyperTwistBrowserBridgeObject::NotifyEnvelope(const FString& EnvelopeJson)
@ -22,6 +35,16 @@ void UHyperTwistBrowserBridgeObject::NotifyEnvelope(const FString& EnvelopeJson)
EnvelopeJson,
LastTilingEnvelope
);
FHyperTwistBrowserRuntimeStatusEnvelope RuntimeStatusEnvelope;
if (HyperTwistBrowserBridgeObjectInternal::TryCacheBrowserRuntimeStatusEnvelope(
EnvelopeJson,
RuntimeStatusEnvelope
))
{
LastBrowserRuntimeStatusEnvelope = RuntimeStatusEnvelope;
bHasLastBrowserRuntimeStatusEnvelope = true;
}
}
void UHyperTwistBrowserBridgeObject::NotifyState(const FString& StateJson)
@ -46,8 +69,10 @@ void UHyperTwistBrowserBridgeObject::ResetReceivedMessages()
LastRuntimeReadyJson.Reset();
LastTilingEnvelope = FHyperTwistTrainingTilingStateEnvelope();
LastTilingStateEnvelope = FHyperTwistTrainingTilingStateEnvelope();
LastBrowserRuntimeStatusEnvelope = FHyperTwistBrowserRuntimeStatusEnvelope();
bHasLastTilingEnvelope = false;
bHasLastTilingStateEnvelope = false;
bHasLastBrowserRuntimeStatusEnvelope = false;
}
bool UHyperTwistBrowserBridgeObject::TryGetLastTilingEnvelope(
@ -69,3 +94,13 @@ bool UHyperTwistBrowserBridgeObject::TryGetLastTilingStateEnvelope(
: FHyperTwistTrainingTilingStateEnvelope();
return bHasLastTilingStateEnvelope;
}
bool UHyperTwistBrowserBridgeObject::TryGetLastBrowserRuntimeStatusEnvelope(
FHyperTwistBrowserRuntimeStatusEnvelope& OutStatusEnvelope
) const
{
OutStatusEnvelope = bHasLastBrowserRuntimeStatusEnvelope
? LastBrowserRuntimeStatusEnvelope
: FHyperTwistBrowserRuntimeStatusEnvelope();
return bHasLastBrowserRuntimeStatusEnvelope;
}

View file

@ -138,6 +138,15 @@ bool UHyperTwistBrowserWidget::TryGetLastTilingStateEnvelope(
&& BrowserBridgeObject->TryGetLastTilingStateEnvelope(OutStateEnvelope);
}
bool UHyperTwistBrowserWidget::TryGetLastBrowserRuntimeStatusEnvelope(
FHyperTwistBrowserRuntimeStatusEnvelope& OutStatusEnvelope
) const
{
OutStatusEnvelope = FHyperTwistBrowserRuntimeStatusEnvelope();
return BrowserBridgeObject != nullptr
&& BrowserBridgeObject->TryGetLastBrowserRuntimeStatusEnvelope(OutStatusEnvelope);
}
FString UHyperTwistBrowserWidget::ResolveBundledBrowserShellUrl()
{
return HyperTwistBrowserWidgetInternal::MakeFileUrl(

View file

@ -7,6 +7,80 @@
DECLARE_MULTICAST_DELEGATE_OneParam(FHyperTwistBrowserRuntimeReadyDelegate, const FString&);
USTRUCT(BlueprintType)
struct FHyperTwistBrowserRuntimeStatusSnapshot
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
FString RuntimeStatusId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
FString RuntimeMode;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
FString BootstrapStartedAtUtc;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
FString RuntimeReadyAtUtc;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
FString ShellAuthority;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
int32 AdapterCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
int32 QueuedCommandCountAtRuntimeReady = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
int32 QueuedShellStateCountAtRuntimeReady = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
int32 CommandReceiveCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
int32 ShellStateReceiveCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
FString LastCommandReceivedAtUtc;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
FString LastShellStateReceivedAtUtc;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
FString BridgeTrafficStatus;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
FString FallbackReason;
bool IsStructurallyValid() const
{
return !RuntimeStatusId.IsEmpty() && !RuntimeMode.IsEmpty();
}
};
USTRUCT(BlueprintType)
struct FHyperTwistBrowserRuntimeStatusEnvelope
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
FString Type;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
FString Source;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Browser")
FHyperTwistBrowserRuntimeStatusSnapshot Status;
bool IsStructurallyValid() const
{
return Type.Equals(TEXT("browser-runtime-status"), ESearchCase::CaseSensitive)
&& !Source.IsEmpty() && Status.IsStructurallyValid();
}
};
UCLASS(BlueprintType)
class UNREALHYPERTWIST_API UHyperTwistBrowserBridgeObject : public UObject
{
@ -35,6 +109,11 @@ public:
FHyperTwistTrainingTilingStateEnvelope& OutStateEnvelope
) const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Browser")
bool TryGetLastBrowserRuntimeStatusEnvelope(
FHyperTwistBrowserRuntimeStatusEnvelope& OutStatusEnvelope
) const;
UPROPERTY(BlueprintReadOnly, Category = "HyperTwist|Browser")
FString LastEnvelopeJson;
@ -57,4 +136,10 @@ public:
UPROPERTY(Transient)
bool bHasLastTilingStateEnvelope = false;
UPROPERTY(Transient)
FHyperTwistBrowserRuntimeStatusEnvelope LastBrowserRuntimeStatusEnvelope;
UPROPERTY(Transient)
bool bHasLastBrowserRuntimeStatusEnvelope = false;
};

View file

@ -2,11 +2,11 @@
#include "CoreMinimal.h"
#include "Components/Widget.h"
#include "HyperTwistBrowser/HyperTwistBrowserBridgeObject.h"
#include "HyperTwistTraining/HyperTwistTrainingTilingLibrary.h"
#include "HyperTwistBrowserWidget.generated.h"
class SWebBrowser;
class UHyperTwistBrowserBridgeObject;
UCLASS(BlueprintType)
class UNREALHYPERTWIST_API UHyperTwistBrowserWidget : public UWidget
@ -66,6 +66,11 @@ public:
FHyperTwistTrainingTilingStateEnvelope& OutStateEnvelope
) const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Browser")
bool TryGetLastBrowserRuntimeStatusEnvelope(
FHyperTwistBrowserRuntimeStatusEnvelope& OutStatusEnvelope
) const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Browser")
static FString ResolveBundledBrowserShellUrl();

View file

@ -202,6 +202,92 @@ bool FHyperTwistBrowserBridgeObjectTilingStateEnvelopeDecodeTest::RunTest(
return true;
}
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
FHyperTwistBrowserBridgeObjectRuntimeStatusEnvelopeDecodeTest,
"HyperTwist.Browser.Bridge.RuntimeStatusEnvelopeDecode",
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
)
bool FHyperTwistBrowserBridgeObjectRuntimeStatusEnvelopeDecodeTest::RunTest(
const FString& Parameters
)
{
UHyperTwistBrowserBridgeObject* BridgeObject = NewObject<UHyperTwistBrowserBridgeObject>();
TestNotNull(TEXT("The browser bridge object must be constructible."), BridgeObject);
if (BridgeObject == nullptr)
{
return false;
}
const FString RuntimeStatusEnvelopeJson =
TEXT("{\"type\":\"browser-runtime-status\",\"source\":\"browser-runtime-shell\",")
TEXT("\"status\":{\"runtimeStatusId\":\"runtime-ready\",\"runtimeMode\":\"bundled-module\",")
TEXT("\"bootstrapStartedAtUtc\":\"2026-06-19T04:30:00Z\",")
TEXT("\"runtimeReadyAtUtc\":\"2026-06-19T04:31:00Z\",")
TEXT("\"shellAuthority\":\"Content/Browser/index.html\",")
TEXT("\"adapterCount\":21,")
TEXT("\"queuedCommandCountAtRuntimeReady\":2,")
TEXT("\"queuedShellStateCountAtRuntimeReady\":1,")
TEXT("\"commandReceiveCount\":3,")
TEXT("\"shellStateReceiveCount\":2,")
TEXT("\"lastCommandReceivedAtUtc\":\"2026-06-19T04:31:10Z\",")
TEXT("\"lastShellStateReceivedAtUtc\":\"2026-06-19T04:31:11Z\",")
TEXT("\"bridgeTrafficStatus\":\"shell-state-live\",")
TEXT("\"fallbackReason\":null}}");
BridgeObject->NotifyEnvelope(RuntimeStatusEnvelopeJson);
FHyperTwistBrowserRuntimeStatusEnvelope RuntimeStatusEnvelope;
TestTrue(
TEXT("The browser bridge object must decode a typed browser runtime-status envelope."),
BridgeObject->TryGetLastBrowserRuntimeStatusEnvelope(RuntimeStatusEnvelope)
);
TestEqual(
TEXT("The decoded runtime-status envelope must preserve the envelope type."),
RuntimeStatusEnvelope.Type,
TEXT("browser-runtime-status")
);
TestEqual(
TEXT("The decoded runtime-status envelope must preserve the source id."),
RuntimeStatusEnvelope.Source,
TEXT("browser-runtime-shell")
);
TestEqual(
TEXT("The decoded runtime-status envelope must preserve the runtime mode."),
RuntimeStatusEnvelope.Status.RuntimeMode,
TEXT("bundled-module")
);
TestEqual(
TEXT("The decoded runtime-status envelope must preserve the adapter count."),
RuntimeStatusEnvelope.Status.AdapterCount,
21
);
TestEqual(
TEXT("The decoded runtime-status envelope must preserve the bridge traffic status."),
RuntimeStatusEnvelope.Status.BridgeTrafficStatus,
TEXT("shell-state-live")
);
BridgeObject->NotifyEnvelope(TEXT("{\"type\":\"hypertwist-state\",\"source\":\"browser-runtime-shell\"}"));
TestTrue(
TEXT("A non-runtime-status envelope must not clear the last valid runtime-status capture."),
BridgeObject->TryGetLastBrowserRuntimeStatusEnvelope(RuntimeStatusEnvelope)
);
TestEqual(
TEXT("Retained runtime-status capture must survive later unrelated envelope traffic."),
RuntimeStatusEnvelope.Status.RuntimeMode,
TEXT("bundled-module")
);
BridgeObject->ResetReceivedMessages();
TestFalse(
TEXT("Resetting the bridge object must also clear the typed browser runtime-status cache."),
BridgeObject->TryGetLastBrowserRuntimeStatusEnvelope(RuntimeStatusEnvelope)
);
return true;
}
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
FHyperTwistBrowserWidgetQueuedOutboundMessagesTest,
"HyperTwist.Browser.Widget.QueuedOutboundMessages",

View file

@ -0,0 +1,105 @@
# HyperTwist Phase 8A browser runtime-status native-capture implementation packet
Created on `2026-06-19`
## Status
- first-party HyperTwist packet
- bounded first-party `Phase 8A` continuation slice
## Purpose
This packet hardens the already-landed embedded browser shipping lane one layer
below the browser-side status surface.
The landed slice is:
- decode first-party `browser-runtime-status` envelopes into typed Unreal-owned
structs instead of leaving them as generic JSON only
- retain the last valid browser runtime-status snapshot through
`UHyperTwistBrowserBridgeObject` and `UHyperTwistBrowserWidget`
- preserve that typed runtime-status ownership across later unrelated envelope
traffic until an explicit bridge reset clears it
- widen focused browser automation so the new native-side retention behavior is
verified on the primary reverse-SSH Windows lane
It is not:
- a topology widening into the optional full-browser client branch
- a native `MagicTile` renderer-port packet
- a reopening of the already-landed embedded browser/CEF host decision
## Current authority basis
This implementation packet stands on:
- `docs/ops/HYPERTWIST_COMPREHENSIVE_RECONSTRUCTION_ROADMAP_2026-06-10.md`
- `docs/v6_5_deep_manual_pack/HyperTwist/ROADMAP.md`
- `docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md`
- `docs/v6_5_deep_manual_pack/HyperTwist/ARCHITECTURE.md`
- `docs/arch/HYPERTWIST_PHASE8A_BROWSER_STATUS_SURFACE_HARDENING_IMPLEMENTATION_PACKET_2026-06-19.md`
## Landed scope
Current code now hardens the live embedded-browser lane through:
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistBrowser/HyperTwistBrowserBridgeObject.h`
typed first-party `FHyperTwistBrowserRuntimeStatusSnapshot` and
`FHyperTwistBrowserRuntimeStatusEnvelope` ownership
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistBrowser/HyperTwistBrowserBridgeObject.cpp`
typed decode and retained caching for `browser-runtime-status` envelopes
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistBrowser/HyperTwistBrowserWidget.h`
and
`UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistBrowser/HyperTwistBrowserWidget.cpp`
widget-level forwarding for the retained runtime-status envelope
- focused browser automation in
`UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistBrowserBridgeObjectTest.cpp`
for:
- typed runtime-status envelope decode
- retention across unrelated later envelope traffic
- explicit cache clearing on bridge reset
## Why this hardening mattered
The browser shell could already surface runtime-health facts inside the
embedded UI, but Unreal still only saw that packet as raw JSON even after the
status surface landed.
That left the authoritative native host without a typed ownership seam for the
same runtime facts the browser was projecting. This packet closes that gap
without widening product topology.
## Validation
Local validation:
- `git diff --check`
- result on `2026-06-19`: passed
Windows build validation:
- `Build.bat UnrealHyperTwistEditor Win64 Development -Project='C:\HyperTwist_worktrees\phase10validate\UnrealHyperTwist\UnrealHyperTwist.uproject' -WaitMutex -NoHotReloadFromIDE -NoUba`
- result on `2026-06-19`: `Result: Succeeded` with UnrealBuildTool
`Total execution time: 111.69 seconds` on isolated worktree
`C:\HyperTwist_worktrees\phase10validate`
Focused browser validation:
- `Automation RunTests HyperTwist.Browser`
- result on `2026-06-19`: found `8` `HyperTwist.Browser.*` tests and passed
all `8`, exporting the report to
`Saved\AutomationReports\Browser-RuntimeStatusNativeCapture-Verify`,
including the hardened:
- `Bridge.RuntimeStatusEnvelopeDecode`
## Product effect
This packet keeps the live embedded browser/CEF shipping lane intact, but it
upgrades native ownership quality:
- Unreal now retains a typed browser runtime-status snapshot instead of generic
JSON only
- browser-side runtime-health facts now survive later unrelated bridge traffic
until explicit reset
- the embedded browser lane becomes easier to reason about from Unreal-side
code and future diagnostics without widening into a browser-first topology

View file

@ -107,3 +107,10 @@ raises its truthfulness and inspectability:
- bridge traffic can be checked from inside the shell without widening product
topology
- `Phase 7A` browser-host posture remains reinforced rather than reopened
Follow-on continuation:
- `docs/arch/HYPERTWIST_PHASE8A_BROWSER_RUNTIME_STATUS_NATIVE_CAPTURE_IMPLEMENTATION_PACKET_2026-06-19.md`
now records the adjacent Unreal-side typed capture seam for the same
`browser-runtime-status` vocabulary, so the native host retains the last
valid runtime snapshot instead of only raw JSON.

View file

@ -425,6 +425,8 @@ Closure read:
- Validation evidence on `2026-06-19`: the primary reverse-SSH `localhost:22022` lane rebuilt isolated worktree `C:\HyperTwist_worktrees\phase10validate` with `Result: Succeeded` and UnrealBuildTool `Total execution time: 96.96 seconds`, then exported green automation reports for `6` `HyperTwist.Browser.*` tests at `Saved\AutomationReports\Browser-Hardening-Verify`, `7` `HyperTwist.FirstParty.MagicTile.*` tests at `Saved\AutomationReports\Phase7-MagicTile-BrowserHardening`, and `6` `HyperTwist.Permissive.MagicTile.*` tests at `Saved\AutomationReports\Phase7-Permissive-MagicTile-BrowserHardening`
- Status-surface continuation on `2026-06-19`: current code now adds shared browser boot-state ownership plus a compact `Browser Runtime Status` surface in both the authoritative bundled shell and the clean-checkout fallback shell, surfacing runtime mode, bootstrap/runtime-ready timestamps, startup queue carryover, bridge traffic counts, and latest command or shell-state receipt facts while keeping the existing embedded browser/CEF posture intact
- Validation evidence on `2026-06-19`: local `npm --prefix Content/Browser run verify:shell` passed and `npm --prefix Content/Browser run build` succeeded, then the primary reverse-SSH `localhost:22022` lane rebuilt isolated worktree `C:\HyperTwist_worktrees\phase10validate` with `Result: Succeeded` and UnrealBuildTool `Total execution time: 160.16 seconds`, and `Automation RunTests HyperTwist.Browser` found `7` `HyperTwist.Browser.*` tests and passed all `7` at `Saved\AutomationReports\Browser-StatusSurface-Verify`
- Native-capture continuation on `2026-06-19`: current code now closes the remaining authority gap below that status surface by decoding first-party `browser-runtime-status` envelopes into typed Unreal-owned structs, retaining the last valid runtime-status snapshot through `UHyperTwistBrowserBridgeObject` and `UHyperTwistBrowserWidget`, and preserving that snapshot across later unrelated envelope traffic until explicit reset
- Validation evidence on `2026-06-19`: the same primary reverse-SSH `localhost:22022` lane rebuilt isolated worktree `C:\HyperTwist_worktrees\phase10validate` with `Result: Succeeded` and UnrealBuildTool `Total execution time: 111.69 seconds`, then `Automation RunTests HyperTwist.Browser` found `8` `HyperTwist.Browser.*` tests and passed all `8` at `Saved\AutomationReports\Browser-RuntimeStatusNativeCapture-Verify`
### 8B — State Synchronization
- [x] Bridge UE cube state to browser via embedded Unreal bridge object plus JavaScript `postMessage` fallback

View file

@ -133,6 +133,10 @@ Use these as the current governing docs:
- [HYPERTWIST_PHASE8B_OPTIONAL_FULL_BROWSER_CLIENT_HTTP_BACKEND_PREPARATION_PACKET_2026-06-19.md](C:/HyperTwist/docs/arch/HYPERTWIST_PHASE8B_OPTIONAL_FULL_BROWSER_CLIENT_HTTP_BACKEND_PREPARATION_PACKET_2026-06-19.md:1)
- [HYPERTWIST_PHASE8B_BROWSER_CLIENT_SPEC_EVIDENCE_HARDENING_PACKET_2026-06-19.md](C:/HyperTwist/docs/arch/HYPERTWIST_PHASE8B_BROWSER_CLIENT_SPEC_EVIDENCE_HARDENING_PACKET_2026-06-19.md:1)
- current shipping/browser posture remains the landed embedded browser/CEF shell
- that same shipping/browser posture now also has a typed Unreal-side
`browser-runtime-status` capture seam through the browser bridge/widget,
retaining the last valid runtime snapshot across unrelated later envelope
traffic until explicit reset
- `MagicTile` `Phase 7C` is now landed separately through the bundled tiling native-behavior
proof contract/probe seam, runtime-library proof helpers, and focused Windows validation on
isolated worktree `C:\HyperTwist_worktrees\phase10validate`

View file

@ -99,6 +99,12 @@ outbound command and shell-state payloads now queue until the first-party
browser runtime-ready bridge arrives, then flush shell state before queued
commands so the embedded browser lane stays deterministic across startup.
That same shipping lane was then hardened again on `2026-06-19`: the native
browser bridge now decodes and retains typed first-party
`browser-runtime-status` envelopes so Unreal owns the same runtime-health
snapshot the browser shell projects, and preserves the last valid snapshot
across later unrelated envelope traffic until explicit reset.
The optional full-browser client path now exists only as a spec-defined
first-party branch:

View file

@ -144,7 +144,7 @@ Do not collapse those three tiers into one undifferentiated "features" voice.
| First-party provider-neutral custom-endpoint runtime routing | Implemented now | landed first-party `Phase 6R-AI` | First-party per-session provider-profile endpoint selection, runtime routing, fallback-health reflection, and bounded provider-backed transport-failure posture are now live above the landed provider-profile/BYOK and provider-routing seams. Provider-specific overlays, payment execution, provider-portal ownership, and payload shipping remain deferred. |
| Analytics/reporting surfaces | Implemented now | landed analytics/reporting packets | Reporting is real, but bounded to accepted retained slices. |
| Rewritten training analytics and report reference grounding | Implemented now | `apache/echarts` retained permissive lane + first-party current code | Current live `Training Analytics` reference side includes four rewritten first-party targets grounded in retained `apache/echarts`: session outcome and progress reporting, analytics data-view and export, timing-trend history and overview interaction, and the optional richer explainer or sidecar boundary. This does not displace the landed `Phase 3R-C` first-party analytics/reporting owner or elevate `ecomfe/echarts-gl` and `ecomfe/zrender` beyond support-only sidecars. |
| Browser/spatial/media adjunct surfaces | Implemented now | landed `three.js`, `react-three-fiber`, `xr`, `model-viewer`, `remotion` packets | These are implemented bounded families, and the current Phase 1 browser-runtime landing now includes a first-party authoritative `Content/Browser/index.html` shell, bundled-runtime upgrade path, committed clean-checkout plain-JS fallback runtime, embedded `UHyperTwistBrowserWidget` bridge, the `2026-06-19` runtime-ready queue hardening that retains outbound Unreal shell traffic until the browser runtime is ready, and a same-day first-party `Browser Runtime Status` surface with shared boot-state ownership across bundled and fallback shells. This still is not proof of unlimited browser-shell parity. |
| Browser/spatial/media adjunct surfaces | Implemented now | landed `three.js`, `react-three-fiber`, `xr`, `model-viewer`, `remotion` packets | These are implemented bounded families, and the current Phase 1 browser-runtime landing now includes a first-party authoritative `Content/Browser/index.html` shell, bundled-runtime upgrade path, committed clean-checkout plain-JS fallback runtime, embedded `UHyperTwistBrowserWidget` bridge, the `2026-06-19` runtime-ready queue hardening that retains outbound Unreal shell traffic until the browser runtime is ready, a same-day first-party `Browser Runtime Status` surface with shared boot-state ownership across bundled and fallback shells, and a follow-on typed Unreal-side `browser-runtime-status` capture seam that retains the last valid runtime snapshot across unrelated later envelope traffic until explicit reset. This still is not proof of unlimited browser-shell parity. |
| Optional full-browser client path above Unreal backend authority | Deep-source grounded retained | landed first-party `Phase 8B` preparation packet + spec/evidence continuation | This branch remains a spec-only first-party option: a browser-owned rendering and input shell may sit above explicit Unreal backend seams while Unreal remains authoritative for puzzle, training, timer, replay, and persistence state. The current continuation now fixes the allowed seam families to catalog, session, action, state, continuity push, replay, persistence status, and runtime health, while keeping offline-first, public-hosted, and native renderer widening posture deferred. The landed embedded browser/CEF shell remains the current shipping posture, and this branch stays separate from any native `MagicTile` behavior or renderer widening. |
| Rewritten browser spatial scene and renderer reference grounding | Implemented now | `mrdoob/three.js` retained permissive lane + first-party current code | Current live `Browser 3D and XR Support` reference side includes one rewritten first-party target grounded in retained `mrdoob/three.js`: the browser spatial scene and renderer contract. This does not displace the landed `Phase 3R-F` first-party browser spatial owner trio or absorb the adjacent `react-three-fiber` renderer-bridge and `xr` session slices. |
| Rewritten React-side browser renderer and event-bridge grounding | Implemented now | `pmndrs/react-three-fiber` retained permissive lane + first-party current code | Current live `Browser 3D and XR Support` reference side includes one rewritten first-party target grounded in retained `react-three-fiber`: the React scene renderer and event bridge. This does not displace the landed `Phase 3R-F` first-party browser spatial owner trio or absorb the adjacent `three.js` scene substrate and `xr` session slices. |

View file

@ -123,6 +123,12 @@ Current consolidated milestone snapshot:
browser-bundle build proof, and fresh primary-lane `localhost:22022`
validation with `7` green `HyperTwist.Browser.*` tests including
`Widget.StatusSurfaceArtifacts`
- that same shipping lane then gained typed native Unreal ownership of the
`browser-runtime-status` envelope on `2026-06-19`, retaining the last valid
runtime snapshot through the browser bridge and widget across unrelated later
envelope traffic until explicit reset, with refreshed primary-lane
`localhost:22022` validation at `8` green `HyperTwist.Browser.*` tests
including the hardened `Bridge.RuntimeStatusEnvelopeDecode`
- classic-cube `Phase 9A` replay recording is now closed through first-party
runtime capture, `.json` replay persistence, local playback reconstruction,
schema-light replay normalization across save/load/viewer import, and live