XR standards (virtual, augmented and mixed reality)
Criteria verified as of August 2026. Re-verify on the web before committing to anything (§8).
1. Scope and triggers
Sets the engineering criteria for building an application worn on your head: frame budget and
latency, comfort and motion sickness as a functional requirement, standard API versus vendor
extension, interaction with hands and controllers, accessibility in a medium that assumes one
specific body, and the privacy of the data that only exists in XR — gaze, face, body and a
three-dimensional map of the user's home.
The domain's axis: comfort and safety are not polish, they are a functional requirement. On a
screen, a dropped frame is an annoyance; on your head, it is a physical symptom. A game with bad
physics plays badly; an XR application that makes people dizzy does not get used — the headset
comes off and does not go back on. That is why the order of priorities is rigid and not negotiated
with design:
- A stable frame rate within the device's budget — not "high on average".
- Minimum motion-to-photon latency: the image must respond to the head before the inner ear
notices the lag.
- No acceleration imposed on the user: not of the camera, not of the horizon, not of the scale.
- And only then: visual fidelity, content and features.
Golden rule, the most broken one: do not move the user's camera unless the user moved it. No
cutscenes that turn the head, no camera shake, no weapon recoil that rotates the view, no imposed
"smoothing" on collision, no fade that drags the horizon. The vector of motion sickness is the
conflict between what the eye sees and what the inner ear feels; any movement the body did not
command is a dose of that conflict.
Reprojection is a safety net, not a plan. Timewarp/reprojection and their variants
(Application SpaceWarp and equivalents) rescue the occasional dropped frame by generating a
synthetic one from the previous frame; used as a design budget they produce visible artifacts
(trails, torn edges, ghosting on fast objects) and they do not fix simulation latency. Design to
meet the budget without them.
Triggers: xrCreateInstance, XrSession, XrSpace, xrWaitFrame, xrEndFrame,
XR_EXT_hand_tracking, XR_EXT_eye_gaze_interaction, XR_EXT_plane_detection,
XR_EXT_spatial_anchor, XR_FB_*/XR_META_*/XR_ANDROID_*, com.oculus.permission.USE_SCENE,
XRInteractionManager, XROrigin, navigator.xr, requestSession('immersive-vr'),
XRReferenceSpace, local-floor, hit-test, OVR Metrics Tool, stale frames, store VRCs, and the
symptoms: "it makes me sick", "it stutters when I turn my head", "the hands lag", "it does not
detect the floor", "the headset comes off after 10 minutes".
Not applicable: see game-development-standards (batch 22, direct sister and the main
boundary: the engine, the game loop, the fixed timestep, ECS, pooling, asset streaming,
multiplayer with server authority, binary version control, certification and monetisation are
theirs. Here what changes because it is worn: budget and stability per device, comfort,
locomotion, spatial interaction, XR accessibility and biometric privacy. Arbitration rule: if the
answer would be the same on a flat screen, it belongs to game-development; if it changes because
the user has the device on their head, it belongs here), webgl-webgpu-standards (the browser
and the graphics API are theirs without exception: WebGL2/WebGPU, WGSL/GLSL, three.js/Babylon,
context loss, compressed textures. WebXR rests on them: here the session model, reference spaces,
input and comfort; there what is drawn and what it costs), computer-vision-standards (SLAM,
inside-out tracking, reconstruction, plane and marker detection, and any perception model are
theirs; here only consuming the result the runtime exposes — anchors, meshes, planes — and the
obligations that data brings), mobile-standards (Android packaging, permissions, app lifecycle and
store policy; a standalone headset is an Android with rules of its own), cpp-standards /
c-standards (the language of the loader and the extensions), dotnet-standards (C# outside
Unity), accessibility-standards (the WCAG and EN 301 549 conformance criterion and its legal
scope are theirs; here what WCAG does not cover: height, reach, dominant hand, seated/standing,
spatial subtitles), i18n-standards (translation, formats and vendor; here only the spatial cost of
text), privacy-engineering-standards (the privacy discipline — legal basis, DPIA, minimisation,
data subject rights, retention — is theirs, in full. Here only XR's differentiating fact: which
sensors exist, what is derived from them and what is forbidden to capture. Gaze data processing is
designed with this skill and governed with theirs), ai-governance-standards (the AI Act
as a compliance framework — inventory, provider and deployer roles, assessments, governance — is
theirs; here only the concrete trigger: emotion inference from biometrics),
deep-learning-standards and local-inference-standards (training and serving models),
performance-engineering-standards (profiling methodology), gaming-infrastructure-standards
(servers and multi-user sessions), frontend-web-platform-standards (the page hosting the WebXR
experience), embedded-iot-standards (the device as a physical object; here third-party hardware is
assumed).
2. Default decisions / Toolchain
Verify the latest version, the current device catalogue and their refresh rates on the web before
fixing them in a real project (§8). The XR hardware catalogue rotates fast and the sales figures
in circulation are not verifiable: they are not cited.
| Decision |
Default |
Justifiable alternative |
Reason |
| Device API |
OpenXR |
Proprietary SDK |
Khronos standard; avoids rewriting per vendor |
| Vendor extensions |
Only after proven degradation |
— |
Every XR_FB_/XR_META_ is coupling |
| Engine |
Unity + XR Interaction Toolkit / Unreal / Godot XR |
Native with OpenXR + Vulkan |
Tooling and interaction already solved |
| Performance target |
p99 ms within the device's budget |
— |
A dropped frame is felt in the body |
| Default locomotion |
Teleport + snap turn |
Continuous as an option with vignetting |
Less vestibular conflict |
| Reference frame |
local-floor/stage with height calibration |
local seated |
Correct scale and floor |
| Input |
Controllers as the primary path |
Hands as an alternative |
Reliability, precision and fatigue |
| Distance interaction |
Raycast with clear feedback |
Direct interaction (near) |
Ergonomics of reach |
| Gaze as input |
Only with explicit confirmation |
— |
Gaze is not an intent |
| Gaze/face data |
Does not leave the device |
Never by default |
Biometrics §5 |
| Web |
WebXR when it suffices and reach matters |
Native when performance matters |
Distribution without a store |
| Reprojection |
Safety net |
— |
It is not a design budget |
Verified status of the standard (August 2026):
- OpenXR publishes its specification on the 1.1 line (
registry.khronos.org/OpenXR/:
«OpenXR 1.1 API Specifications (also applies to 1.0 development)»; 1.0.34 appears marked
Obsolete). Latest SDK release verified via the releases Atom feed: OpenXR SDK 1.1.62.
- What falls outside the standard, with a figure and a method: counting the extensions declared
in the official registry
specification/registry/xr.xml (main branch of OpenXR-SDK, excluding
reserved placeholders of the XR_META_extension_NNN kind), there are 261 extensions with a real
name, of which only 35 are XR_KHR_ and 38 XR_EXT_ (multi-vendor). The remaining 188
are vendor-specific: XR_FB_ 41, XR_META_ 34, XR_ANDROID_ 27, XR_BD_ 16, XR_MSFT_ 15,
XR_ML_ 13, XR_HTC_ 9, XR_VARJO_ 7, XR_QCOM_ 6… Reading: OpenXR standardises the core
well — session, spaces, layers, input, frame cycle — and almost everything differentiating
(passthrough, scene mesh, face and body tracking, shared anchors, depth) still arrives via vendor
extension. Real portability = standard core + your own abstraction layer over whatever extension
is used + proven degradation when the extension is absent.
- WebXR Device API: W3C Candidate Recommendation Draft of 9 June 2026 (
w3.org/TR/webxr/).
That is: a standard in progress, not a Recommendation; browser and platform support is checked
before promising it, and the modules (AR, hit test, anchors, layers, hands) go through separate
specifications with different maturity.
- Frame budget per device — verified normative data. Meta store requirement
VRC.Quest.Performance.1 (updated 2025-10-22), verbatim: «The app must run at an allowed refresh
rate and maintain a rendering rate (fps) of at least 60 fps», «Interactive applications must use
a refresh rate of 72 Hz, 80 Hz, 90 Hz, 96 Hz, 100 Hz or 120 Hz (96 Hz, 100 Hz, and 120 Hz not
available on all devices)» and «Media applications may use a refresh of 60 Hz on devices that
support 60 Hz». The same vendor's Unity performance guide additionally states: «Interactive
applications must achieve a minimum of 72 FPS». Translated into a budget: 72 Hz → 13.9 ms;
80 Hz → 12.5 ms; 90 Hz → 11.1 ms; 120 Hz → 8.3 ms per frame, for everything (simulation,
physics, animation, culling, two eyes of rendering, composition, audio, networking). And per
eye: the render cost is paid twice unless single-pass rendering (single-pass
instanced/multiview) is used, which is the correct default setting.
- Documented exception: the same VRC allows «a rendering rate (fps) of half the refresh rate
(such as … 36 fps for 72 Hz), for portions of their experience utilizing Application SpaceWarp»
and requires generating motion vectors that minimise artifacts. It is an exception with
conditions, not a licence to design at half budget.
- Other vendors: each store has its own equivalent requirements document. Do not assume one
vendor's applies to another: read the target's before fixing the goal (§8).
3. Structure and conventions
Loop and synchronisation. The OpenXR cycle (xrWaitFrame → xrBeginFrame → render →
xrEndFrame) is governed by the runtime, not the application: xrWaitFrame is what decides when
to begin and delivers the predictedDisplayTime. Rules:
- Every pose is queried for the predicted display time, not for "now". Using the previous frame's
pose or the system clock introduces latency and judder.
- Never block the render thread: asset loading, networking, decoding and heavy physics go
elsewhere. A 30 ms block is a dropped frame, and a dropped frame is a jolt in the head.
- Always submit composition layers with correct depth (
XR_KHR_composition_layer_depth where
available): reprojection works much better with depth.
- The UI is not stuck to the face. Interface anchored to the world or to the body, at a
comfortable reading distance, with sufficient angular text size. A head-locked UI causes sickness
and is the hallmark of the lazy port from a flat screen.
Reference spaces and scale. Declare explicitly which one is used (local, local-floor,
stage/bounded) and respect 1:1 scale: a virtual metre is a real metre. Changing the world's
scale or the interpupillary distance without reason breaks depth perception and causes sickness. The
play boundary (guardian) is a physical safety feature: never hide it, never incite the user to
step outside it, plan for the small-space case.
Locomotion — a catalogue with criteria:
- Teleport with a destination indicator: the most comfortable, with almost no vestibular
conflict. The default.
- Snap turn (30°/45°) versus continuous turn: snap by default; continuous as an option.
- Continuous locomotion: only as an opt-in option, with dynamic vignetting (reducing the
peripheral field of view while moving), constant speed and no acceleration (acceleration is
what causes sickness, not speed), with no strafing combined with turning.
- A static reference frame (cockpit, virtual nose, grid or frame fixed relative to the body) when
movement is unavoidable: it reduces the conflict by giving the eye a reference that does not move.
It is why driving/flight simulators are comfortable.
- Always forbidden: stairs/ramps that sway the camera, head bobbing, uncommanded vertical
movement, long free falls, and taking view control away from the user.
- All of the above is offered as a setting, with conservative defaults, accessible at any moment
without leaving the application.
Interaction.
- Controllers for what demands precision, haptic feedback and low fatigue. Hands for social,
short or accessory-free interaction: tracking fails under occlusion, in low light and outside the
cameras' field of view, so every hand interaction needs an alternative path and tolerance to
tracking loss.
- Gorilla arm is a design requirement: no holding the arm up, no repeated gestures; short
interactions, at chest height, with rest.
- Multimodal feedback: every targeted object is highlighted, every action confirms with sound
and/or haptics. In XR, without feedback the user does not know whether the system heard them.
- Gaze is not a click. With eye tracking, gaze may select but another gesture confirms (pinch,
button). Dwell (holding the gaze) only as an explicit accessibility option.
- Comfort zone: interactive content within reach without moving; nothing critical above the head,
below the waist or behind the user. If something important is outside the field of view, it must be
indicated (spatial audio, arrow, halo).
Spatial audio as part of the simulation, not as decoration: it is the channel that places what is
out of sight and reduces neck work. With occlusion and reverberation consistent with the scene.
4. Quality and testing
- Profile on the device, in a release build, always. The editor with a headset preview does not
measure what the device measures: thermals, mobile GPU, real resolution and composition. On
standalone hardware, moreover, performance degrades with heat: a valid test lasts more than
15–20 minutes, not two.
- Metrics: p99 frame time, dropped frames and stale frames (frames repeated by the
compositor), and the level of CPU/GPU thermal throttling. Average fps is worthless.
- Comfort testing with people, including people with no prior XR experience and people prone to
motion sickness: the development team's tolerance is the worst possible reference (habituation).
Timed sessions, with the option to stop at any moment, and a symptom log. No figure of the "X% get
sick" kind is cited without a study and its methodology: that is industry folklore.
- A mandatory physical test matrix: standing and seated; a large space and a 1×1 m space; a tall
user and a short user (or a user seated in a wheelchair); left-handed and right-handed; with
glasses; in low light and in direct light (it affects inside-out tracking); taking the headset
off and putting it back on mid-session; losing tracking of one hand; a controller with a dead
battery.
- Extension degradation: a test that boots with vendor extensions disabled and verifies the
application works or degrades cleanly.
- CI gates in order of cost: static analysis → logic tests without the headset → per-platform
build → a reference scene measured on-device with a threshold in ms → automated check of store
requirements (VRC/equivalent) → a comfort session with people.
- Before submitting to a store: go through the vendor's full requirements list. The most frequent
failures are not render technicalities, they are policy — privacy, age rating, content, metadata.
5. Stack security
This is where XR separates from everything else in the catalogue: the sensors it needs to work are
sensors for bodily and domestic surveillance. The headset measures where you look, how much your
pupils dilate, how your face moves, how your body moves and what the room you live in looks like
inside. None of that is "telemetry".
- Gaze (eye tracking): it reveals attention, interest, cognitive load and — according to the
literature — allows identifying a person by their eye movement pattern. Hard criterion: gaze data
is processed on the device and does not leave it. If the use case is foveated rendering or
aiming, the application needs the current vector, not the history: it is not stored, not
logged, not transmitted, not used for advertising nor for attention analytics.
- Face and body: facial expression and posture are behavioural data derived from biometric
sensors. Same criterion: local, ephemeral, with a declared purpose (avatar) and with no persistence.
- 3D map of the home: the scene mesh, the planes and the spatial anchors are a floor plan of the
user's house, with furniture, size and sometimes contents. On Meta's platform access sits behind
an explicit runtime permission —
com.oculus.permission.USE_SCENE, declared in the
AndroidManifest.xml, with a consent dialog — and the documentation requires planning the
alternative path if the user denies it. Criterion: ask for it only when it is used, explain it
at that moment, work without it and never export it off the device. Uploading a scene mesh to
your own server is processing that requires a legal basis, a DPIA and minimisation
(privacy-engineering-standards).
- Passthrough cameras and camera frame access: it is a domestic camera with everything that
implies — including non-consenting third parties in the scene. It is treated as a camera, with a
visible capture indicator and no silent recording.
- Legal framework, verbatim from the source:
- GDPR, art. 4(14): «‘biometric data’ means personal data resulting from specific technical
processing relating to the physical, physiological or behavioural characteristics of a natural
person, which allow or confirm the unique identification of that natural person…». Art. 9(1):
the processing of «biometric data for the purpose of uniquely identifying a natural person»
is prohibited save for an exception under 9(2) — explicit consent among them. That is: gaze
or face data is not automatically art. 9; it becomes so when it is used to uniquely
identify. The practical consequence does not change: it is personal data that is sensitive by
context, and the correct design is that it is not persisted.
- AI Regulation (EU) 2024/1689 — emotion inference. Definition (art. 3): «‘emotion recognition
system’ means an AI system for the purpose of identifying or inferring emotions or intentions of
natural persons on the basis of their biometric data». Prohibition (art. 5), verbatim: «the
placing on the market, the putting into service for this specific purpose, or the use of AI
systems to infer emotions of a natural person in the areas of workplace and education
institutions, except where the use of the AI system is intended to be put in place or into the
market for medical or safety reasons». Outside work and education it is not prohibited, but it
is high risk: Annex III lists «AI systems intended to be used for emotion recognition». And
art. 50(3) requires: «Deployers of an emotion recognition system or a biometric categorisation
system shall inform the natural persons exposed thereto of the operation of the system». The
Regulation itself warns in its recitals that there are «serious concerns about the scientific
basis of AI systems aiming to identify or infer emotions». Engineering translation: a
"detect how the user feels" feature based on face, gaze or voice is, in workplace training or
education in the EU, illegal; in every other case it drags in the high-risk regime and the
duty to inform. It is not implemented without going through
ai-governance-standards.
- Minors: headsets have minimum ages and child account modes. Content, voice chat, data capture
and advertising change regime. Verify the platform's policy and the child protection framework
before designing social features.
- Verified store requirement (
VRC.Quest.Privacy.4, updated 2026-04-08): the privacy policy must
explain how any user requests deletion of their data, and «Requiring users to pay a fee for
deletion of user data is prohibited». It is also, according to the vendor itself, one of the most
frequently failed requirements.
- The classic surface that does not disappear just because it is XR: multiplayer with server
authority and a hostile client (
game-development-standards §5), keys embedded in the binary,
user-downloaded content, and harassment in social spaces — which in XR is bodily (invasion of
personal space): a personal bubble, muting, blocking and reporting are safety features, not
community features.
6. Performance and operability
- Double cost per eye: enable single-pass instanced rendering (single-pass
instanced/multiview) by default; measure whether you are paying twice by mistake.
- Real levers on standalone hardware, in order of return: reduce draw calls and material
changes (static/dynamic batching, atlases), dynamic resolution and foveation (fixed or
gaze-driven), simple mobile shaders with no overdraw (overdraw with transparencies is killer
number one), lightmaps instead of dynamic lighting, aggressive LOD, and avoiding full-screen
post-processing. Geometry is rarely the bottleneck; fill rate and calls almost always are.
- Thermals: a standalone device throttles itself. Measure with a long session and leave headroom
(~10–20%) over the nominal budget; no design that depends on running at 99% of the budget survives
minute 20.
- Session telemetry (with consent): frame time, dropped frames, throttling, session duration
and early abandonment. A spike of drop-offs in the first few minutes is the signature of motion
sickness, not of the plot.
- Start-up and resumption: the user takes the headset off and puts it back on constantly; save and
restore state, pause without punishment, do not lose progress on losing focus.
- Battery and weight: the typical session does not last hours. Design experiences with natural
exit points every few minutes.
- Accessibility in XR — enforceable minimums, and none of them optional:
- Adjustable height and reach: height recalibration without leaving the app; everything
interactive reachable seated; a real seated mode (not "standing but shorter").
- Configurable dominant hand and every action available with one hand.
- An alternative to physically turning around: controller turning always available (not
everyone can turn 360°, nor has the room).
- Configurable locomotion (teleport/continuous, vignetting, snap/continuous turn, speed).
- Spatial subtitles: legible, with an indication of the speaker's direction when out of sight;
adjustable size and contrast; no head-locked subtitle stuck to the face.
- No requirement for stereo hearing or binocular vision: do not encode information only in
spatial audio nor only in stereoscopic depth.
- No requirement for fine gestures, strength or speed; adjustable timeouts; dwell as an
alternative to pressing.
- Photosensitivity: no flashes and no fast high-contrast patterns; an option to reduce effects.
7. Long-term sustainability
- Portability as an architectural decision: a core on OpenXR, and a thin layer of your own
over every vendor extension used, with a documented no-op implementation. Today's flagship device
gets discontinued; the proprietary SDK that saved two weeks costs the entire port.
- Cadence: the vendor's runtime updates itself on the user's device. Test against the new runtime
version before it reaches the public (test channels) and pin the SDK/plugin version in the repo
and in CI.
- Deprecation:
XR_FB_* extensions have gradually been replaced by XR_META_* and some features
by already-standardised XR_EXT_*. Review at every bump what has been promoted to the core and
migrate towards the standard, not away from it.
- Document in an ADR: target devices and their budget, non-standard extensions used and why,
locomotion and comfort decisions, and which sensor data is touched and on what legal basis.
Explicit prohibitions:
- ❌ Moving, rotating, tilting or shaking the user's camera by application decision. Includes
head bobbing, weapon recoil, cutscenes that turn the view and physical "shoves".
- ❌ Designing while counting on reprojection/SpaceWarp to hit the budget.
- ❌ Setting the target in average fps or measuring only in the editor and on the development PC.
- ❌ Acceleration in continuous locomotion, or continuous locomotion without a teleport
alternative and without configurable vignetting.
- ❌ A head-locked UI, small text at the wrong reading distance, or menus that force neck rotation.
- ❌ Hiding, disabling or encouraging the user to ignore the play boundary (guardian).
- ❌ Storing, logging or transmitting gaze, facial expression, body or scene mesh data. Neither
"anonymised", nor "to improve the product".
- ❌ Inferring emotions or psychological state from biometrics in a workplace or educational
context in the EU (art. 5 prohibition of the AI Regulation), and doing so in any other context
without high-risk governance and without informing the person (Annex III and art. 50(3)).
- ❌ Requesting the spatial data permission at start-up "just in case", with no explanation and no
alternative path if denied.
- ❌ Recording passthrough or camera without a visible indicator.
- ❌ Assuming a standard body: a standing user, two functional hands, 1.75 m, no glasses, with 2×2 m
free. It is the medium's default exclusion.
- ❌ Blocking the render thread with asset loading, networking or heavy physics.
- ❌ Depending on a vendor extension with no proven degradation path.
- ❌ Citing motion sickness, market share or device sales figures without a study and its
methodology.
- ❌ Porting a flat-screen application to XR keeping its camera, UI and pacing. It is the origin of
95% of bad experiences… a figure which, by the way, also has no source: do not repeat it.
8. Mandatory web verification
Before deciding, check against the primary source:
- OpenXR: the current specification version at
registry.khronos.org/OpenXR/ (verified: the
1.1 line) and the latest SDK release (verified: 1.1.62). Review in
specification/registry/xr.xml which extensions have been promoted to XR_EXT_/XR_KHR_ since
last time: it is the only reliable way to know what has stopped being proprietary.
- Budget per device: the technical requirements document of each target store (only Meta's
verified:
VRC.Quest.Performance.1, allowed rates and a 60 fps minimum with the AppSW exception).
Declared gap: it has not been possible to verify against a primary source the target refresh
rate nor the equivalent requirements document for visionOS/Apple Vision Pro nor for other
vendors (JavaScript-rendered pages, no retrievable text); verify before fixing a target on those
platforms.
- WebXR: the document's status at
w3.org/TR/webxr/ (verified: Candidate Recommendation
Draft, 2026-06-09) and real browser/platform support for the modules you intend to use (AR, hit
test, anchors, layers, hands) — Safari/visionOS and Android headset support is what changes most.
- Device catalogue: current models, supported rates, resolution, sensors (gaze, face, body) and
minimum ages. Do not marry a vendor and do not cite sales.
- AI Regulation (EU) 2024/1689: the consolidated text on EUR-Lex and the application dates in
force — they have been amended by the digital omnibus package; the correct timetable is set by
ai-governance-standards, not by this document.
- GDPR: AEPD and EDPB guidance on biometrics and sensor-derived data; the interpretation of
"unique identification" is what decides whether art. 9 applies.
- Store privacy and publishing requirements (verified:
VRC.Quest.Privacy.4, 2026-04-08) and
each platform's policy on minors.
- CVEs and advisories for the runtime, the OpenXR loader, the engine and vendor SDKs.
If the web contradicts this document, the web wins — flag the discrepancy.
1---2name: xr-standards3description: Virtual, augmented and mixed reality engineering where comfort, latency and biometric privacy are hard requirements. Use when building with OpenXR (xrCreateInstance, XrSession, XrSpace, xrWaitFrame/xrBeginFrame/xrEndFrame, XR_KHR_composition_layer_depth, XR_EXT_hand_tracking, XR_EXT_eye_gaze_interaction, XR_EXT_plane_detection, XR_EXT_spatial_anchor, vendor XR_FB_/XR_META_/XR_ANDROID_ extensions), Unity XR Interaction Toolkit and OpenXR plugin, Unreal VR templates and OpenXR runtime, Godot XR, or WebXR (navigator.xr, requestSession("immersive-vr"/"immersive-ar"), XRReferenceSpace, hit-test and anchors), motion-to-photon latency, reprojection, timewarp, Application SpaceWarp and stale frames, headset refresh rates and per-frame budget on standalone hardware, locomotion, teleport, snap turn, vignette and simulator sickness, room-scale guardian and boundary, seated versus standing play, hand tracking versus controllers, raycast interaction, gaze and pinch, passthrough and scene understanding, spatial anchors and4---56# XR standards (virtual, augmented and mixed reality)78Criteria verified as of **August 2026**. Re-verify on the web before committing to anything (§8).910## 1. Scope and triggers1112Sets the engineering criteria for **building an application worn on your head**: frame budget and13latency, comfort and motion sickness as a functional requirement, standard API versus vendor14extension, interaction with hands and controllers, accessibility in a medium that assumes one15specific body, and **the privacy of the data that only exists in XR** — gaze, face, body and a16three-dimensional map of the user's home.1718**The domain's axis: comfort and safety are not polish, they are a functional requirement.** On a19screen, a dropped frame is an annoyance; on your head, **it is a physical symptom**. A game with bad20physics plays badly; an XR application that makes people dizzy **does not get used** — the headset21comes off and does not go back on. That is why the order of priorities is rigid and not negotiated22with design:23241. **A stable frame rate within the device's budget** — not "high on average".252. **Minimum motion-to-photon latency**: the image must respond to the head before the inner ear26 notices the lag.273. **No acceleration imposed on the user**: not of the camera, not of the horizon, not of the scale.284. And only then: visual fidelity, content and features.2930**Golden rule, the most broken one: do not move the user's camera unless the user moved it.** No31cutscenes that turn the head, no camera shake, no weapon recoil that rotates the view, no imposed32"smoothing" on collision, no fade that drags the horizon. The vector of motion sickness is the33**conflict between what the eye sees and what the inner ear feels**; any movement the body did not34command is a dose of that conflict.3536**Reprojection is a safety net, not a plan.** *Timewarp*/*reprojection* and their variants37(*Application SpaceWarp* and equivalents) rescue the occasional dropped frame by generating a38synthetic one from the previous frame; used as a design budget they produce visible artifacts39(trails, torn edges, ghosting on fast objects) and they do not fix simulation latency. **Design to40meet the budget without them.**4142Triggers: `xrCreateInstance`, `XrSession`, `XrSpace`, `xrWaitFrame`, `xrEndFrame`,43`XR_EXT_hand_tracking`, `XR_EXT_eye_gaze_interaction`, `XR_EXT_plane_detection`,44`XR_EXT_spatial_anchor`, `XR_FB_*`/`XR_META_*`/`XR_ANDROID_*`, `com.oculus.permission.USE_SCENE`,45`XRInteractionManager`, `XROrigin`, `navigator.xr`, `requestSession('immersive-vr')`,46`XRReferenceSpace`, `local-floor`, `hit-test`, OVR Metrics Tool, *stale frames*, store VRCs, and the47symptoms: "it makes me sick", "it stutters when I turn my head", "the hands lag", "it does not48detect the floor", "the headset comes off after 10 minutes".4950**Not applicable**: see `game-development-standards` (**batch 22, direct sister and the main51boundary**: **the engine, the game loop, the fixed timestep, ECS, *pooling*, asset *streaming*,52multiplayer with server authority, binary version control, certification and monetisation are53theirs**. **Here what changes because it is worn**: budget and stability per device, comfort,54locomotion, spatial interaction, XR accessibility and biometric privacy. Arbitration rule: *if the55answer would be the same on a flat screen, it belongs to `game-development`; if it changes because56the user has the device on their head, it belongs here*), `webgl-webgpu-standards` (**the browser57and the graphics API are theirs without exception**: WebGL2/WebGPU, WGSL/GLSL, three.js/Babylon,58context loss, compressed textures. **WebXR rests on them: here the session model, reference spaces,59input and comfort; there what is drawn and what it costs**), `computer-vision-standards` (**SLAM,60*inside-out* tracking, reconstruction, plane and marker detection, and any perception model are61theirs**; here only **consuming** the result the runtime exposes — anchors, meshes, planes — and the62obligations that data brings), `mobile-standards` (Android packaging, permissions, app lifecycle and63store policy; a standalone headset is an Android with rules of its own), `cpp-standards` /64`c-standards` (the language of the *loader* and the extensions), `dotnet-standards` (C# outside65Unity), `accessibility-standards` (**the WCAG and EN 301 549 conformance criterion and its legal66scope are theirs**; **here what WCAG does not cover**: height, reach, dominant hand, seated/standing,67spatial subtitles), `i18n-standards` (translation, formats and vendor; here only the spatial cost of68text), `privacy-engineering-standards` (**the privacy discipline — legal basis, DPIA, minimisation,69data subject rights, retention — is theirs, in full**. **Here only XR's differentiating fact**: which70sensors exist, what is derived from them and what is forbidden to capture. Gaze data processing is71**designed** with this skill and **governed** with theirs), `ai-governance-standards` (**the AI Act72as a compliance framework — inventory, provider and deployer roles, assessments, governance — is73theirs**; here only the concrete trigger: emotion inference from biometrics),74`deep-learning-standards` and `local-inference-standards` (training and serving models),75`performance-engineering-standards` (profiling methodology), `gaming-infrastructure-standards`76(servers and multi-user sessions), `frontend-web-platform-standards` (the page hosting the WebXR77experience), `embedded-iot-standards` (the device as a physical object; here third-party hardware is78assumed).7980## 2. Default decisions / Toolchain8182> Verify the latest version, the current device catalogue and their refresh rates on the web before83> fixing them in a real project (§8). **The XR hardware catalogue rotates fast and the sales figures84> in circulation are not verifiable: they are not cited.**8586| Decision | Default | Justifiable alternative | Reason |87|---|---|---|---|88| Device API | **OpenXR** | Proprietary SDK | Khronos standard; avoids rewriting per vendor |89| Vendor extensions | Only after proven degradation | — | Every `XR_FB_`/`XR_META_` is coupling |90| Engine | Unity + XR Interaction Toolkit / Unreal / Godot XR | Native with OpenXR + Vulkan | Tooling and interaction already solved |91| Performance target | **p99 ms within the device's budget** | — | A dropped frame is felt in the body |92| Default locomotion | **Teleport + *snap turn*** | Continuous **as an option** with vignetting | Less vestibular conflict |93| Reference frame | `local-floor`/*stage* with height calibration | `local` seated | Correct scale and floor |94| Input | **Controllers** as the primary path | Hands as an alternative | Reliability, precision and fatigue |95| Distance interaction | *Raycast* with clear feedback | Direct interaction (near) | Ergonomics of reach |96| Gaze as input | **Only with explicit confirmation** | — | Gaze is not an intent |97| Gaze/face data | **Does not leave the device** | Never by default | Biometrics §5 |98| Web | **WebXR** when it suffices and reach matters | Native when performance matters | Distribution without a store |99| Reprojection | Safety net | — | It is not a design budget |100101**Verified status of the standard (August 2026):**102103- **OpenXR** publishes its specification on the **1.1** line (`registry.khronos.org/OpenXR/`:104 *«OpenXR 1.1 API Specifications (also applies to 1.0 development)»*; 1.0.34 appears marked105 *Obsolete*). Latest SDK release verified via the releases Atom feed: **OpenXR SDK 1.1.62**.106- **What falls outside the standard, with a figure and a method**: counting the extensions declared107 in the official registry `specification/registry/xr.xml` (`main` branch of `OpenXR-SDK`, excluding108 reserved placeholders of the `XR_META_extension_NNN` kind), there are **261 extensions with a real109 name**, of which only **35 are `XR_KHR_`** and **38 `XR_EXT_`** (multi-vendor). The **remaining 188110 are vendor-specific**: `XR_FB_` 41, `XR_META_` 34, `XR_ANDROID_` 27, `XR_BD_` 16, `XR_MSFT_` 15,111 `XR_ML_` 13, `XR_HTC_` 9, `XR_VARJO_` 7, `XR_QCOM_` 6… **Reading**: OpenXR standardises the core112 well — session, spaces, layers, input, frame cycle — and **almost everything differentiating113 (passthrough, scene mesh, face and body tracking, shared anchors, *depth*) still arrives via vendor114 extension**. Real portability = standard core + your own abstraction layer over whatever extension115 is used + **proven degradation** when the extension is absent.116- **WebXR Device API**: **W3C Candidate Recommendation Draft of 9 June 2026** (`w3.org/TR/webxr/`).117 That is: a standard in progress, not a Recommendation; browser and platform support **is checked118 before promising it**, and the modules (AR, *hit test*, anchors, layers, hands) go through separate119 specifications with different maturity.120- **Frame budget per device — verified normative data.** Meta store requirement121 `VRC.Quest.Performance.1` (updated 2025-10-22), verbatim: *«The app must run at an allowed refresh122 rate and maintain a rendering rate (fps) of at least 60 fps»*, *«Interactive applications must use123 a refresh rate of 72 Hz, 80 Hz, 90 Hz, 96 Hz, 100 Hz or 120 Hz (96 Hz, 100 Hz, and 120 Hz not124 available on all devices)»* and *«Media applications may use a refresh of 60 Hz on devices that125 support 60 Hz»*. The same vendor's Unity performance guide additionally states: *«Interactive126 applications must achieve a minimum of 72 FPS»*. **Translated into a budget**: 72 Hz → **13.9 ms**;127 80 Hz → 12.5 ms; 90 Hz → **11.1 ms**; 120 Hz → 8.3 ms **per frame, for everything** (simulation,128 physics, animation, culling, two eyes of rendering, composition, audio, networking). And **per129 eye**: the render cost is paid twice unless single-pass rendering (*single-pass130 instanced*/*multiview*) is used, which is the correct default setting.131- **Documented exception**: the same VRC allows *«a rendering rate (fps) of half the refresh rate132 (such as … 36 fps for 72 Hz), for portions of their experience utilizing Application SpaceWarp»*133 and requires generating motion vectors that minimise artifacts. **It is an exception with134 conditions, not a licence to design at half budget.**135- **Other vendors**: each store has its own equivalent requirements document. **Do not assume one136 vendor's applies to another**: read the target's before fixing the goal (§8).137138## 3. Structure and conventions139140**Loop and synchronisation.** The OpenXR cycle (`xrWaitFrame` → `xrBeginFrame` → render →141`xrEndFrame`) is governed by **the runtime**, not the application: `xrWaitFrame` is what decides when142to begin and delivers the `predictedDisplayTime`. Rules:143144- **Every pose is queried for the predicted display time**, not for "now". Using the previous frame's145 pose or the system clock introduces latency and *judder*.146- **Never block the render thread**: asset loading, networking, decoding and heavy physics go147 elsewhere. A 30 ms block is a dropped frame, and a dropped frame is a jolt in the head.148- **Always submit composition layers with correct depth** (`XR_KHR_composition_layer_depth` where149 available): reprojection works much better with depth.150- **The UI is not stuck to the face.** Interface anchored to the world or to the body, at a151 comfortable reading distance, with sufficient angular text size. A *head-locked* UI causes sickness152 and is the hallmark of the lazy port from a flat screen.153154**Reference spaces and scale.** Declare explicitly which one is used (`local`, `local-floor`,155`stage`/*bounded*) and **respect 1:1 scale**: a virtual metre is a real metre. Changing the world's156scale or the interpupillary distance without reason breaks depth perception and causes sickness. The157play boundary (*guardian*) is a **physical safety** feature: never hide it, never incite the user to158step outside it, plan for the small-space case.159160**Locomotion — a catalogue with criteria:**161162- **Teleport** with a destination indicator: the most comfortable, with almost no vestibular163 conflict. The default.164- **Snap turn** (30°/45°) versus continuous turn: snap by default; continuous as an option.165- **Continuous locomotion**: only as an **opt-in option**, with **dynamic vignetting** (reducing the166 peripheral field of view while moving), constant speed and **no acceleration** (acceleration is167 what causes sickness, not speed), with no strafing combined with turning.168- **A static reference frame** (cockpit, virtual nose, grid or frame fixed relative to the body) when169 movement is unavoidable: it reduces the conflict by giving the eye a reference that does not move.170 It is why driving/flight simulators are comfortable.171- **Always forbidden**: stairs/ramps that sway the camera, *head bobbing*, uncommanded vertical172 movement, long free falls, and taking view control away from the user.173- **All of the above is offered as a setting**, with conservative defaults, accessible at any moment174 **without leaving the application**.175176**Interaction.**177178- **Controllers** for what demands precision, haptic feedback and low fatigue. **Hands** for social,179 short or accessory-free interaction: tracking fails under occlusion, in low light and outside the180 cameras' field of view, so **every hand interaction needs an alternative path** and tolerance to181 tracking loss.182- ***Gorilla arm* is a design requirement**: no holding the arm up, no repeated gestures; short183 interactions, at chest height, with rest.184- **Multimodal feedback**: every targeted object is highlighted, every action confirms with sound185 and/or haptics. In XR, without feedback the user does not know whether the system heard them.186- **Gaze is not a click.** With eye tracking, gaze may select but **another gesture confirms** (pinch,187 button). *Dwell* (holding the gaze) only as an explicit accessibility option.188- **Comfort zone**: interactive content within reach without moving; nothing critical above the head,189 below the waist or behind the user. If something important is outside the field of view, it must be190 **indicated** (spatial audio, arrow, halo).191192**Spatial audio** as part of the simulation, not as decoration: it is the channel that places what is193out of sight and reduces neck work. With occlusion and reverberation consistent with the scene.194195## 4. Quality and testing196197- **Profile on the device, in a release build, always.** The editor with a headset preview does not198 measure what the device measures: thermals, mobile GPU, real resolution and composition. On199 standalone hardware, moreover, **performance degrades with heat**: a valid test lasts **more than200 15–20 minutes**, not two.201- **Metrics**: p99 frame time, **dropped frames and *stale frames*** (frames repeated by the202 compositor), and the level of CPU/GPU thermal *throttling*. Average fps is worthless.203- **Comfort testing with people**, including people with no prior XR experience and people prone to204 motion sickness: **the development team's tolerance is the worst possible reference** (habituation).205 Timed sessions, with the option to stop at any moment, and a symptom log. **No figure of the "X% get206 sick" kind is cited without a study and its methodology: that is industry folklore.**207- **A mandatory physical test matrix**: standing and seated; a large space and a 1×1 m space; a tall208 user and a short user (or a user seated in a wheelchair); left-handed and right-handed; with209 glasses; in low light and in direct light (it affects *inside-out* tracking); taking the headset210 off and putting it back on mid-session; losing tracking of one hand; a controller with a dead211 battery.212- **Extension degradation**: a test that boots with vendor extensions disabled and verifies the213 application works or degrades cleanly.214- **CI gates in order of cost**: static analysis → logic tests without the headset → per-platform215 build → a reference scene measured on-device with a threshold in ms → automated check of store216 requirements (VRC/equivalent) → a comfort session with people.217- **Before submitting to a store**: go through the vendor's full requirements list. The most frequent218 failures are not render technicalities, they are policy — privacy, age rating, content, metadata.219220## 5. Stack security221222**This is where XR separates from everything else in the catalogue: the sensors it needs to work are223sensors for bodily and domestic surveillance.** The headset measures where you look, how much your224pupils dilate, how your face moves, how your body moves and **what the room you live in looks like225inside**. None of that is "telemetry".226227- **Gaze (*eye tracking*)**: it reveals attention, interest, cognitive load and — according to the228 literature — allows identifying a person by their eye movement pattern. **Hard criterion: gaze data229 is processed on the device and does not leave it.** If the use case is *foveated rendering* or230 aiming, the application needs the current vector, **not the history**: it is not stored, not231 logged, not transmitted, not used for advertising nor for attention analytics.232- **Face and body**: facial expression and posture are behavioural data derived from biometric233 sensors. Same criterion: local, ephemeral, with a declared purpose (avatar) and with no persistence.234- **3D map of the home**: the scene mesh, the planes and the spatial anchors are **a floor plan of the235 user's house**, with furniture, size and sometimes contents. On Meta's platform access sits behind236 an explicit runtime permission — `com.oculus.permission.USE_SCENE`, declared in the237 `AndroidManifest.xml`, with a consent dialog — and the documentation requires **planning the238 alternative path if the user denies it**. Criterion: **ask for it only when it is used, explain it239 at that moment, work without it and never export it off the device**. Uploading a scene mesh to240 your own server is processing that requires a legal basis, a DPIA and minimisation241 (`privacy-engineering-standards`).242- ***Passthrough* cameras** and camera frame access: it is a domestic camera with everything that243 implies — including non-consenting third parties in the scene. It is treated as a camera, with a244 visible capture indicator and no silent recording.245- **Legal framework, verbatim from the source:**246 - **GDPR, art. 4(14)**: *«‘biometric data’ means personal data resulting from specific technical247 processing relating to the physical, physiological or behavioural characteristics of a natural248 person, which allow or confirm the unique identification of that natural person…»*. **Art. 9(1)**:249 the processing of *«biometric data for the purpose of uniquely identifying a natural person»*250 **is prohibited** save for an exception under 9(2) — explicit consent among them. That is: gaze251 or face data **is not automatically art. 9**; it becomes so **when it is used to uniquely252 identify**. The practical consequence does not change: it is personal data that is sensitive by253 context, and the correct design is that it is not persisted.254 - **AI Regulation (EU) 2024/1689 — emotion inference**. Definition (art. 3): *«‘emotion recognition255 system’ means an AI system for the purpose of identifying or inferring emotions or intentions of256 natural persons on the basis of their biometric data»*. **Prohibition (art. 5)**, verbatim: *«the257 placing on the market, the putting into service for this specific purpose, or the use of AI258 systems to infer emotions of a natural person in the areas of workplace and education259 institutions, except where the use of the AI system is intended to be put in place or into the260 market for medical or safety reasons»*. Outside work and education it **is not prohibited, but it261 is high risk**: Annex III lists *«AI systems intended to be used for emotion recognition»*. And262 art. 50(3) requires: *«Deployers of an emotion recognition system or a biometric categorisation263 system shall inform the natural persons exposed thereto of the operation of the system»*. The264 Regulation itself warns in its recitals that there are *«serious concerns about the scientific265 basis of AI systems aiming to identify or infer emotions»*. **Engineering translation**: a266 "detect how the user feels" feature based on face, gaze or voice is, in workplace training or267 education in the EU, **illegal**; in every other case it drags in the high-risk regime and the268 duty to inform. **It is not implemented without going through `ai-governance-standards`.**269- **Minors**: headsets have minimum ages and child account modes. Content, voice chat, data capture270 and advertising change regime. Verify the platform's policy and the child protection framework271 before designing social features.272- **Verified store requirement** (`VRC.Quest.Privacy.4`, updated 2026-04-08): the privacy policy must273 explain how **any** user requests deletion of their data, and *«Requiring users to pay a fee for274 deletion of user data is prohibited»*. It is also, according to the vendor itself, **one of the most275 frequently failed requirements**.276- **The classic surface that does not disappear just because it is XR**: multiplayer with server277 authority and a hostile client (`game-development-standards` §5), keys embedded in the binary,278 user-downloaded content, and **harassment in social spaces** — which in XR is bodily (invasion of279 personal space): a personal bubble, muting, blocking and reporting are safety features, not280 community features.281282## 6. Performance and operability283284- **Double cost per eye**: enable single-pass instanced rendering (*single-pass285 instanced*/multiview) by default; measure whether you are paying twice by mistake.286- **Real levers on standalone hardware**, in order of return: reduce *draw calls* and material287 changes (static/dynamic batching, atlases), dynamic resolution and *foveation* (fixed or288 gaze-driven), simple mobile *shaders* with no overdraw (**overdraw with transparencies is killer289 number one**), *lightmaps* instead of dynamic lighting, aggressive LOD, and avoiding full-screen290 post-processing. Geometry is rarely the bottleneck; fill rate and calls almost always are.291- **Thermals**: a standalone device throttles itself. Measure with a long session and leave headroom292 (~10–20%) over the nominal budget; no design that depends on running at 99% of the budget survives293 minute 20.294- **Session telemetry** (with consent): frame time, dropped frames, *throttling*, session duration295 and **early abandonment**. A spike of drop-offs in the first few minutes is the signature of motion296 sickness, not of the plot.297- **Start-up and resumption**: the user takes the headset off and puts it back on constantly; save and298 restore state, pause without punishment, do not lose progress on losing focus.299- **Battery and weight**: the typical session does not last hours. Design experiences with natural300 exit points every few minutes.301- **Accessibility in XR** — enforceable minimums, and none of them optional:302 - **Adjustable height and reach**: height recalibration without leaving the app; everything303 interactive reachable **seated**; a real seated mode (not "standing but shorter").304 - **Configurable dominant hand** and every action available with **one hand**.305 - **An alternative to physically turning around**: controller turning always available (not306 everyone can turn 360°, nor has the room).307 - **Configurable locomotion** (teleport/continuous, vignetting, snap/continuous turn, speed).308 - **Spatial subtitles**: legible, with an indication of the speaker's direction when out of sight;309 adjustable size and contrast; no *head-locked* subtitle stuck to the face.310 - **No requirement for stereo hearing or binocular vision**: do not encode information **only** in311 spatial audio nor **only** in stereoscopic depth.312 - **No requirement for fine gestures, strength or speed**; adjustable timeouts; *dwell* as an313 alternative to pressing.314 - **Photosensitivity**: no flashes and no fast high-contrast patterns; an option to reduce effects.315316## 7. Long-term sustainability317318- **Portability as an architectural decision**: a core on OpenXR, and **a thin layer of your own**319 over every vendor extension used, with a documented *no-op* implementation. Today's flagship device320 gets discontinued; the proprietary SDK that saved two weeks costs the entire port.321- **Cadence**: the vendor's runtime updates itself on the user's device. Test against the new runtime322 version **before** it reaches the public (test channels) and pin the SDK/plugin version in the repo323 and in CI.324- **Deprecation**: `XR_FB_*` extensions have gradually been replaced by `XR_META_*` and some features325 by already-standardised `XR_EXT_*`. Review at every bump what has been promoted to the core and326 migrate towards the standard, not away from it.327- **Document in an ADR**: target devices and their budget, non-standard extensions used and why,328 locomotion and comfort decisions, and **which sensor data is touched and on what legal basis**.329330**Explicit prohibitions:**331332- ❌ **Moving, rotating, tilting or shaking the user's camera** by application decision. Includes333 *head bobbing*, weapon recoil, cutscenes that turn the view and physical "shoves".334- ❌ Designing while counting on reprojection/*SpaceWarp* to hit the budget.335- ❌ Setting the target in **average fps** or measuring only in the editor and on the development PC.336- ❌ Acceleration in continuous locomotion, or continuous locomotion **without** a teleport337 alternative and **without** configurable vignetting.338- ❌ A *head-locked* UI, small text at the wrong reading distance, or menus that force neck rotation.339- ❌ Hiding, disabling or encouraging the user to ignore the play boundary (*guardian*).340- ❌ **Storing, logging or transmitting gaze, facial expression, body or scene mesh data.** Neither341 "anonymised", nor "to improve the product".342- ❌ **Inferring emotions or psychological state** from biometrics in a workplace or educational343 context in the EU (art. 5 prohibition of the AI Regulation), and doing so in any other context344 without high-risk governance and without informing the person (Annex III and art. 50(3)).345- ❌ Requesting the spatial data permission at start-up "just in case", with no explanation and no346 alternative path if denied.347- ❌ Recording *passthrough* or camera without a visible indicator.348- ❌ Assuming a standard body: a standing user, two functional hands, 1.75 m, no glasses, with 2×2 m349 free. It is the medium's default exclusion.350- ❌ Blocking the render thread with asset loading, networking or heavy physics.351- ❌ Depending on a vendor extension with no proven degradation path.352- ❌ Citing motion sickness, market share or device sales figures without a study and its353 methodology.354- ❌ Porting a flat-screen application to XR keeping its camera, UI and pacing. It is the origin of355 95% of bad experiences… a figure which, by the way, **also has no source: do not repeat it**.356357## 8. Mandatory web verification358359Before deciding, check against the primary source:3603611. **OpenXR**: the current specification version at `registry.khronos.org/OpenXR/` (verified: the362 **1.1** line) and the latest SDK release (verified: **1.1.62**). Review in363 `specification/registry/xr.xml` which extensions have been promoted to `XR_EXT_`/`XR_KHR_` since364 last time: **it is the only reliable way to know what has stopped being proprietary**.3652. **Budget per device**: the technical requirements document of **each target store** (only Meta's366 verified: `VRC.Quest.Performance.1`, allowed rates and a 60 fps minimum with the AppSW exception).367 **Declared gap**: it has not been possible to verify against a primary source the target refresh368 rate nor the equivalent requirements document for **visionOS/Apple Vision Pro** nor for other369 vendors (JavaScript-rendered pages, no retrievable text); **verify before fixing a target on those370 platforms**.3713. **WebXR**: the document's status at `w3.org/TR/webxr/` (verified: **Candidate Recommendation372 Draft, 2026-06-09**) and real browser/platform support for the modules you intend to use (AR, *hit373 test*, anchors, layers, hands) — Safari/visionOS and Android headset support is what changes most.3744. **Device catalogue**: current models, supported rates, resolution, sensors (gaze, face, body) and375 minimum ages. **Do not marry a vendor and do not cite sales.**3765. **AI Regulation (EU) 2024/1689**: the consolidated text on EUR-Lex and **the application dates in377 force** — they have been amended by the digital omnibus package; the correct timetable is set by378 `ai-governance-standards`, not by this document.3796. **GDPR**: AEPD and EDPB guidance on biometrics and sensor-derived data; the interpretation of380 "unique identification" is what decides whether art. 9 applies.3817. **Store privacy and publishing requirements** (verified: `VRC.Quest.Privacy.4`, 2026-04-08) and382 each platform's policy on minors.3838. **CVEs and advisories** for the runtime, the OpenXR *loader*, the engine and vendor SDKs.384385If the web contradicts this document, **the web wins** — flag the discrepancy.