# HyperTwist Phase 3R Packet 3R-D Model Viewer Implementation

Created on `2026-05-13`

## Status

`Phase 3R / Packet 3R-D` is now `closed`.

This packet converts `google/model-viewer` from the retained browser presentation and compact editor anchor into a landed first-party HyperTwist browser viewer, compact editor, and standards-aware asset-QA lane.

It does not reopen `Phase 0R`, `Phase 1R`, or `Phase 2R-B`.

Those earlier packets still own source-value extraction, retained-set routing, and ownership boundaries.

This packet owns the next question instead:

- what first-party implementation actually landed
- which donor value was realized
- what remains explicitly out of scope for this lane
- what validation was completed
- what the next bounded implementation move is after this landing

## Authority order

For future work on the `google/model-viewer` lane, read in this order:

1. this packet for first-party landing scope, accepted widening, and validation result
2. [HYPERTWIST_LIVE_LANES_SOURCE_AND_PRESERVATION_AUDIT_2026-05-13.md](C:/HyperTwist/docs/HYPERTWIST_LIVE_LANES_SOURCE_AND_PRESERVATION_AUDIT_2026-05-13.md:1) for live-lane preserve posture
3. [HYPERTWIST_PHASE_2R_PACKET_2R_B_OWNERSHIP_AND_ACCEPTANCE_CONTRACT_2026-05-13.md](C:/HyperTwist/docs/HYPERTWIST_PHASE_2R_PACKET_2R_B_OWNERSHIP_AND_ACCEPTANCE_CONTRACT_2026-05-13.md:1) for ownership boundaries and pre-widening acceptance markers
4. [HYPERTWIST_PHASE_0R_PACKET_0R_B_EVALUATION_2026-05-12.md](C:/HyperTwist/docs/HYPERTWIST_PHASE_0R_PACKET_0R_B_EVALUATION_2026-05-12.md:1) for source-value extraction and non-promotion rationale
5. [REPO_LICENSE_TRACKING.md](C:/HyperTwist/docs/REPO_LICENSE_TRACKING.md:1) for license and notice obligations

## Packet licensing snapshot

- `google/model-viewer`: `Apache-2.0`
- `google/model-viewer/packages/space-opera`: `Apache-2.0`
- `google/model-viewer/packages/render-fidelity-tools`: `Apache-2.0`
- `google/model-viewer/packages/model-viewer-effects`: `Apache-2.0`
- `google/model-viewer/packages/modelviewer.dev`: `Apache-2.0`
- `KhronosGroup/glTF-Sample-Viewer`: `Apache-2.0`
- `KhronosGroup/glTF-Sample-Renderer`: `Apache-2.0`
- `google/model-viewer/packages/shared-assets`: `Apache-2.0` container with mixed per-asset terms, not widened by this packet

Checked local notice surfaces:

- [LICENSE](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/LICENSE:1) currently carries the Apache-2.0 grant for the code monorepo
- [LICENSE.md](C:/Workspaces/HyperTwist/mirrors/permissive/KhronosGroup/glTF-Sample-Viewer/LICENSE.md:1) currently carries the Apache-2.0 grant for the viewer app shell
- [LICENSE.md](C:/Workspaces/HyperTwist/mirrors/permissive/KhronosGroup/glTF-Sample-Viewer/glTF-Sample-Renderer/LICENSE.md:1) currently carries the Apache-2.0 grant for the checked renderer substrate

## Packet result

`3R-D` lands `google/model-viewer` as:

- `implemented_live_permissive`
- `landed_permissive_preserve`

`KhronosGroup/glTF-Sample-Viewer`, `KhronosGroup/glTF-Sample-Renderer`, `google/model-viewer/packages/space-opera`, `google/model-viewer/packages/render-fidelity-tools`, `google/model-viewer/packages/model-viewer-effects`, and `google/model-viewer/packages/modelviewer.dev` do not become separately live through this packet.

They remain retained subordinate support lanes beneath the landed `google/model-viewer` owner.

`google/model-viewer/packages/shared-assets` remains outside this widening as the already-ratified boundary-sensitive fixture pack.

Current portfolio effect:

- curated HyperTwist shallow-eval set: `71`
- currently verified live in checked Unreal surfaces: `10`
- permissive live lanes: `9`
- restrictive live clean-room lanes: `1`
- active non-live implementation-board rows: `49`

## Donor source surfaces read

The source read for this widening remained bounded to the retained browser presentation, hotspot and camera editing, snippet/export, docs/demo separation, standards-aware validation, and fidelity-oracle domains:

- [LICENSE](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/LICENSE:1)
- [README.md](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/README.md:1)
- [package.json](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/package.json:1)
- [packages/model-viewer/src/model-viewer-base.ts](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/packages/model-viewer/src/model-viewer-base.ts:1)
- [packages/space-opera/src/components/inspector/inspector.ts](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/packages/space-opera/src/components/inspector/inspector.ts:1)
- [packages/space-opera/src/components/camera_settings/camera_settings.ts](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/packages/space-opera/src/components/camera_settings/camera_settings.ts:1)
- [packages/space-opera/src/components/hotspot_panel/hotspot_panel.ts](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/packages/space-opera/src/components/hotspot_panel/hotspot_panel.ts:1)
- [packages/space-opera/src/components/model_viewer_snippet/model_viewer_snippet.ts](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/packages/space-opera/src/components/model_viewer_snippet/model_viewer_snippet.ts:1)
- [packages/render-fidelity-tools/src/workflows/compare-results.ts](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/packages/render-fidelity-tools/src/workflows/compare-results.ts:1)
- [packages/model-viewer-effects/src/model-viewer-effects.ts](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/packages/model-viewer-effects/src/model-viewer-effects.ts:1)
- [packages/modelviewer.dev/src/components/example-snippet.ts](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/packages/modelviewer.dev/src/components/example-snippet.ts:1)
- [packages/modelviewer.dev/src/docs-and-examples/create-html.ts](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/packages/modelviewer.dev/src/docs-and-examples/create-html.ts:1)
- [packages/modelviewer.dev/src/docs-and-examples/sidebar.ts](C:/Workspaces/HyperTwist/mirrors/permissive/google/model-viewer/packages/modelviewer.dev/src/docs-and-examples/sidebar.ts:1)
- [src/ui/ui.js](C:/Workspaces/HyperTwist/mirrors/permissive/KhronosGroup/glTF-Sample-Viewer/src/ui/ui.js:1)
- [glTF-Sample-Renderer/source/GltfState/gltf_state.js](C:/Workspaces/HyperTwist/mirrors/permissive/KhronosGroup/glTF-Sample-Viewer/glTF-Sample-Renderer/source/GltfState/gltf_state.js:1)

## First-party landing surfaces

The landed first-party Unreal surfaces are:

- [HyperTwistTrainingViewerLibrary.h](C:/HyperTwist/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingViewerLibrary.h:1)
- [HyperTwistTrainingViewerLibrary.cpp](C:/HyperTwist/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingViewerLibrary.cpp:1)
- [HyperTwistTrainingRuntimeLibrary.h](C:/HyperTwist/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h:1)
- [HyperTwistTrainingRuntimeLibrary.cpp](C:/HyperTwist/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp:1)
- [hypertwist-reference-incorporation-targets.json](C:/HyperTwist/UnrealHyperTwist/Content/HyperTwistTraining/MaterializedCatalog/hypertwist-reference-incorporation-targets.json:1)
- [hypertwist-catalog-materialization-summary.json](C:/HyperTwist/UnrealHyperTwist/Content/HyperTwistTraining/MaterializedCatalog/hypertwist-catalog-materialization-summary.json:1)
- [google-model-viewer-reference-pages.jsonl](C:/HyperTwist/UnrealHyperTwist/Content/HyperTwistTraining/MaterializedCatalog/raw-extracts/google-model-viewer-reference-pages.jsonl:1)

## Landed implementation scope

What landed:

- a first-party compiled browser viewer reference bundle with explicit asset-input, lifecycle-hook, viewer-embed, compact editor, QA artifact, QA check, renderer-comparison, and docs-boundary contracts
- a first-party runtime-library access layer for the bundled browser viewer lane, including embed-contract lookup, QA-check lookup, and checklist export
- bundled first-party reference targets for browser viewer embed, compact editor/inspection, snippet/export, asset validation/statistics, renderer comparison/fidelity, and docs/demo separation
- bundled raw source-reference capture for the new `google/model-viewer` and `KhronosGroup/glTF-Sample-Viewer` reference-target families

What that means in practice:

- `google/model-viewer` now owns the landed permissive browser presentation, compact editor, and asset-QA lane in HyperTwist
- the landed surface is a first-party Unreal viewer/QA contract and runtime API, not a vague future donor note
- `KhronosGroup/glTF-Sample-Viewer`, `KhronosGroup/glTF-Sample-Renderer`, and the package rows remain explicit support-only lanes beneath this owner rather than separate live product lanes

## Preserved landed value

The donor value that was actually promoted is:

- embeddable browser viewer behavior with explicit load-progress, framing, camera, and annotation boundaries
- compact editor and inspection behavior for hotspot authoring, camera settings, JSON inspection, and snippet/export flows
- renderer-comparison and standards-aware QA discipline for validation, statistics, camera export, capture, and fidelity checks
- explicit docs/demo separation so snippet infrastructure and support patterns are retained without promoting donor demo shells into product ownership
- explicit subordinate-sidecar boundaries for `space-opera`, `model-viewer-effects`, `modelviewer.dev`, `render-fidelity-tools`, `glTF-Sample-Viewer`, and `glTF-Sample-Renderer`

## Excluded or non-promotion boundary

Do not promote this lane into:

- gameplay, simulation, or puzzle-runtime ownership
- generic browser-runtime or product-shell ownership
- a blanket license to ship mixed-provenance payloads from `google/model-viewer/packages/shared-assets`
- separate live-lane claims for `KhronosGroup/glTF-Sample-Viewer`, `KhronosGroup/glTF-Sample-Renderer`, or the `google/model-viewer` package rows

Rationale:

- this repo was retained and widened because it was the strongest bounded browser presentation and compact editor donor in the set
- its highest value is viewer/embed discipline, editor-side support flows, and QA boundaries, not host-application ownership
- the subordinate packages remain useful precisely because they stay beneath the landed `google/model-viewer` owner

## Acceptance markers satisfied

The `2R-B` acceptance markers for this row are now satisfied in first-party Unreal surfaces:

- a first-party browser viewer embed contract exists with supported asset inputs, camera state fields, annotation surfaces, and lifecycle hooks
- a first-party editor and inspection contract exists with hotspot, camera, snippet/export, and preview-state boundaries
- a first-party QA relationship exists between the landed browser presentation lane, `KhronosGroup/glTF-Sample-Viewer`, and render-fidelity tooling
- a first-party separation now exists between shippable viewer behavior and docs/demo-only behavior

## Validation

Validation completed for this packet:

- `git diff --check` passed apart from CRLF conversion warnings
- JSON validation passed for the updated materialized-catalog files and workspace manifest
- Unreal build succeeded with:
  - `C:\Program Files\Epic Games\UE_5.7\Engine\Build\BatchFiles\Build.bat UnrealHyperTwistEditor Win64 Development C:\HyperTwist\UnrealHyperTwist\UnrealHyperTwist.uproject -WaitMutex -NoHotReloadFromIDE`

Build result:

- `Succeeded` on `2026-05-13`

## Next move

The next bounded move is `Phase 3R-E`:

- widen `met4citizen/TalkingHead` as the retained embodied companion, narration, lip-sync, gesture, and subtitle lane
- keep the newly landed `google/model-viewer` browser presentation and asset-QA lane on preserve-and-enhance footing rather than treating it as an open donor candidate again
