01 / PDF page 2
What changed after 424 works
The earlier Reddit post described a 424-work digital collection and an existing Astro/Three.js/Node/Python workflow. A reader suggested AR/VR. The comparison here uses commit 6652430, the last first-parent repository state with 424 public works, rather than inventing an exact publication timestamp for the post. That revision has 431 raw catalogue records and seven hidden records. [R1, R2]
The released catalogue now contains 1,058 records, of which 1,046 are public. Comparing slug sets and every first-parent transition gives 627 additions and five later withdrawals from public display: 622 additional public works, a 146.7% increase. All original 424 public works remain. Hidden records are retained, not deleted. [R3]
| Change | State in the 13 September release |
|---|---|
| Collection growth | 424 -> 1,046 public works; broader holdings, including 50 Islamic-world works. |
| Browsing and curation | Six permanent wings; exhibition stops now support interactive 3D; nine additions to existing exhibitions and six corrected wing assignments. |
| Delivery and viewer | R2 GLB delivery; resource management for multiple viewers; reviewed orientation, bounds and selected scan repairs. |
| Immersive viewing | WebXR AR/VR and client-side Apple USDZ preparation, device guidance, independent display supports, native lighting correction. |
| Current AR/VR discovery | Home-page feature, navigation and dedicated index; all 1,046 works offer AR/VR, with 248 strict size references and 798 chosen default displays labelled Size unverified. |
Some additions that can be identified precisely
New post-baseline works include Hepworth's Ancestor I, Dubuffet's La Chiffonnière, Saint Phalle's The Firebird and Nikigator, a Gandharan Buddha from Minneapolis, Suzuki Masanao's Curled rat, the Rapa Nui Long Rongorongo Tablet, the Nasrid Casket, and an Abbasid Tombstone dated 830 CE. These are examples, not a claim that every new object is a marble sculpture or a photogrammetric scan. Source collections include institutional repositories, independent scans and archive mirrors; their inclusion does not imply institutional partnerships. [R3]
What is not new
Astro, the custom Three.js viewer, Node/Python ingestion, source and rights records, collection filtering, thematic exhibitions and featured rotation already existed. The direct JavaScript dependency versions also stayed unchanged. The work extended that system; it did not replace it with a newly written rendering engine. [R2-R5]
02 / PDF page 3
Architecture and dependency boundary
Atrium is a statically generated catalogue with interactive client rendering. catalog.ts combines a master JSON catalogue with explicit overlays for preview URLs, orientation, material appearance, identity, physical dimensions and display recommendations. Hidden entries are excluded before public route generation. Work pages are generated from the normalized public list. Work.spatialAccess now controls AR/VR availability and chosen display size; the separate spatialEligibility result controls the strict size-review badge and guarantees. This separates acquisition records from presentation decisions while preserving stable object routes. [R3, R4]
Offline ingest
Source records + scans
Node / Python / glTF toolsStatic build
Catalogue + reviewed overrides
Astro → GitHub PagesBrowser
Three.js + R2 GLBs
Load on demand
WebXR
Same Three renderer
AR hit tests / VR room
Apple Quick Look
Temporary USDZ export
Separate native renderer
The web application deploys to GitHub Pages. GLBs are delivered separately through models.atrium.earth, backed by Cloudflare R2. There is no application Worker, server-side USDZ conversion service or multiplayer backend in the inspected path. The build removes local mirrors only when a recognized remote URL is configured; asset publication and CORS policy are separate operational steps. [R4, R13]
| Locked dependency | Version | Role |
|---|---|---|
| Astro | 6.1.10 | Static HTML, routing, component compilation. |
| Three.js | 0.182.0 | Active renderer, scene graph, loaders, WebXR integration and USDZ exporter. |
| glTF Transform CLI | 4.4.2 | Optional mesh/texture optimization in acquisition workflows. |
| Playwright | 1.61.1 | Browser automation and recorded UI/export checks. |
| model-viewer | 4.2.0 | Installed dependency; no active component/import found in the Astro viewer path. |
The table reports lockfile resolutions, not current upstream releases; these versions also appear at the 424-work baseline. Lucide 1.14.0 and the Astro sitemap integration 3.7.2 are likewise unchanged. Python requirements pin Trimesh 4.12.1 and fast-simplification 0.1.12; scipy and networkx use lower bounds rather than fully locked versions. [R4]
Runtime boundaries
Normal 3D and WebXR share the existing Three renderer. Apple Quick Look consumes an exported USDZ and renders it independently. A browser viewport, an immersive reference space and a native AR scene therefore cannot be assumed to share camera exposure, tracking, material evaluation or coordinate interpretation. The implementation explicitly bridges geometry and selected material properties; it cannot make the renderers physically identical. [R5-R7, R14-R17]
03 / PDF page 4
Acquisition, conversion and delivery
The existing ingestion system has manifest-driven and discovery/fetch/assembly paths. A candidate needs an identifiable object, a source model or archive, provenance and recorded rights. The workflow retains original and preview artifacts separately, with explicit metadata/appearance/orientation overrides. Expansion increased the number and diversity of acquisitions; it did not introduce the idea of automated ingestion from scratch. [R2-R4]
Processing sequence
- Discover a candidate, resolve identity/version and collect source metadata. An institution's location in a record does not mean the institution supplied the scan.
- Fetch and retain source geometry; convert supported source formats into glTF/GLB previews. Node and Python scripts coordinate mesh work and catalogue assembly.
- Where invoked, simplify/compress and resize textures using the configured tooling. Draco decoding is supported by the viewer, but optimization is optional: not every source file necessarily uses Draco.
- Review pose, up-axis, support boundary and appearance. An orientation-solve timeout can preserve a low-confidence review outcome instead of hanging or treating a guessed result as verified.
- Produce still assets through a browser render harness. The thumbnail pipeline captures a 1,000 x 1,250 canvas and converts output to WebP at configured quality 90.
- Publish preview assets, update their mappings, validate the catalogue/build and inspect selected rendered works. This includes human-directed curation and visual review.
R2 migration and measurable scope
The September migration recorded a reduction of the then-current model set from about 2.47 GB to 1.18 GB, and a static build of about 82 MB after model separation. These are migration-time figures, not today's total collection size or a phone download budget. The current 1,046 public preview entries all point to the model domain. Later batches use content-hashed URLs and retain hashes for originals/previews. Some historical URLs are mutable, which motivates the runtime byte check described on page 7. [R13]
A concrete acquisition example is the 30-work diverse batch: its archived originals totalled about 1,018.29 MB and its previews 42.56 MB. That batch is evidence of a reduction for those assets, not a universal compression ratio. The static asset verifier accepts configured remote URLs but does not itself prove remote availability; separate network checks are necessary. [R3, R13]
Geometry and rights are independent reviews
The September scan review corrected 73 placements among 450 recent works, regenerated the then-public thumbnails, and removed 304 isolated triangles from The Kiss while checking retained geometry and texture. Severe scans were withheld rather than presented as repaired. These operations do not establish uniform capture quality across the collection. [R3]
The website's original source code uses MIT licensing. Third-party scans, images, derived thumbnails and collection metadata retain their applicable source terms. Metadata filters and recorded licenses are useful controls, not a blanket grant or a comprehensive legal determination. [R4]
04 / PDF page 5
Three.js scene and resource lifecycle
The active Viewer.astro dynamically imports Three.js, GLTFLoader, DRACOLoader, MeshoptDecoder, OrbitControls and environment support. Decoder files are served locally under /vendor/draco/. WebGLRenderer uses antialiasing, a device-pixel ratio capped at two, ACES filmic tone mapping, sRGB output and soft shadow mapping. A PMREM-filtered RoomEnvironment, hemisphere light and directional lights provide the web presentation. Per-work settings control appearance and camera/view parameters. [R5]
Normalization is a presentation transform
Source up-axis and reviewed rotation/yaw are applied before precise geometry bounds are evaluated. Box3.setFromObject(model, true) uses transformed geometry rather than relying solely on cached local boxes. The longest displayed dimension is normalized to one scene unit and the model is centered. Uniform multiplication preserves relative authored scale; independently forcing x/y/z extents would distort the object. Camera fitting uses projected corners. [R5, R9]
B_i = maximum displayed coordinate_i - minimum coordinate_i
k = 1 / max(B_x, B_y, B_z)
normalized geometry = translate_to_center(k * oriented geometry)
spatial placement = reviewed or default uniform scale
One normalized scene unit is a convenient framing convention. It is not evidence that the real object is one metre high or wide. A verified physical scale must reference the same reviewed pose and asset. An unverified display instead uses an explicitly chosen longest extent and makes no measurement claim. Errors in surviving fragments, protruding restoration parts or retained museum bases cannot be solved by camera framing.
Loading, suspension and disposal
Standalone views can auto-start after first paint/idle; exhibition views can activate within a 200-pixel intersection margin. Loading is deferred, not universally click-only. A resident-viewer map targets four nearby/recent lazy viewers, including pending loads. This is a soft target: visible, focused and fullscreen views are exempt. Camera state is retained when a resident is released. [R5]
Offscreen, hidden or spatially suspended views stop their screen loop. Release disposes owned geometry, materials, textures, controls, environment and rendering resources, disconnects observers, and forces WebGL context loss. Cancellation and generation tracking prevent a late async load from attaching to a released view. Reusing the renderer for WebXR also requires suspending and subsequently restoring screen controls and animation.
Appearance semantics and known limits
Standard source materials are reused; other material types may be converted to MeshStandardMaterial. Textured source materials bypass generic untextured tint/roughness/metalness overrides. Untextured models can receive curated profiles and synthetic vertex variation. Wireframe is a separate display path, while the Texture/finish control affects roughness. These are display choices, not measured reconstruction of the original object's reflectance. Source-colour loss and unlit-to-lit conversion remain specific follow-up issues; page 10 records the audit scope. [R5, R11]
05 / PDF page 6
Physical-reference contract
A catalogue dimension string is not parsed into an immersive scale. For the strict size badge, the combined reference and eligibility contract requires source evidence, acceptable status/basis, a reviewed axis, positive metres, a valid optional component fraction, and matching model URL and orientation. physicalDimensionsFor checks placement configuration; spatialEligibilityFor adds source, measurement-conversion and review checks. AR/VR access is now independent of passing this verification. [R8-R10]
| Configured physical reference | Works | Interpretation |
|---|---|---|
| Documented reference | 644 | One selected extent is configured; other extents are not certified. |
| Approximate reference | 22 | Source value or model/component boundary is explicitly approximate. |
| No supported reference | 380 | No accepted calibrated placement, even if dimensions are published. |
These categories total 1,046 and are unchanged by the access release. Source-record status is a different count: 806 documented, 41 approximate, 198 unresolved and one variable. A museum height can be exact as a transcription while its boundary in a scan is estimated. Only 248 references currently pass the stricter badge policy. The other 798 use chosen viewing presets, not their uncertain measurements. [R8, R10]
Uniform scale and component scope
Let a be the reviewed axis, B_a its normalized extent, f the reviewed component fraction (default one), and D the source measurement in metres:
s = D / (B_a * f) with D > 0, B_a > 0, 0 < f <= 1
artwork.scale = (s, s, s)
artwork.position.y = supportHeight - box.min.y * s
This preserves proportions rather than fitting each axis to a dimension triplet. Units are explicit: mm x 0.001, cm x 0.01, or metres. Source labels such as Length or Depth remain visible even when their mapped model axis is Y. Invalid references cannot authorize a verified-size badge. [R9, R10]
There are 27 configured component/region references, six in the strict subset. Ugolino's 197.5 cm reference concerns the sculpture rather than its retained pedestal; the reviewed fraction is approximately 0.619004. This does not verify every secondary dimension or automatically identify components in future scans. [R8]
Furniture and default display size
Virtual furniture lives in room metres, independently of artwork scaling. Raising a plinth does not enlarge the work. Captured bases stay within the mesh. For an unverified display, displayReferenceFor chooses the longest oriented X/Y/Z extent and scales it uniformly to a recorded preset; surrounding scan geometry remains included. This is a viewing choice, not a sourced measurement. Strict references stay fixed; defaults can be resized. Apple assemblies containing a virtual stand stay fixed to preserve the furniture's dimensions. [R6, R10]
06 / PDF page 7
Access, size badges and asset identity
All 1,046 public works now offer AR/VR on compatible devices. Work.spatialAccess separates access from strict size verification: 248 retain reviewed badges, while 798 have chosen starting sizes and red Size unverified text. The strict group comprises 26 original-size references, 201 museum-object references and 21 measured casts. A cast badge does not certify the original's size or every dimension. [R10]
The 798 defaults include 380 unsupported, 22 approximate and 396 documented references needing further review. Their source records remain intact; unresolved axis, component, version or secondary-extent questions prevent verification rather than access. An uncertain museum dimension is never used to derive a default.
Explicit viewing presets
spatial-display-defaults.json records a choice for each unverified work. Its maxExtentMeters targets the longest displayed side, not necessarily height:
| Preset | Longest extent | Works |
|---|---|---|
| Detail | 0.2 m | 41 |
| Handheld | 0.4 m | 154 |
| Portrait | 0.6 m | 91 |
| General | 1 m | 203 |
| Large form | 1.5 m | 309 |
Codex selected these viewing presets from object-type, title and slug cues: 40 individual choices, 583 ordered-rule choices and 175 neutral fallbacks. They are neither physical measurements nor estimates of original size. Each record retains its selection reason. Wide reliefs scale by width; upright figures may scale by height. [R10]
defaultScale = chosenMaxExtent / max(B_x, B_y, B_z)
access = compatibleGLB
strictBadge = explicitDecision && validEvidence && matchingBinding
Strict evidence and downloaded bytes
spatial-eligibility.mjs retains the measurement/unit, source URL, geometry-review, asset SHA-256, orientation and component checks. It fingerprints the whole dimension record with recursively sorted object keys and preserved array order. The binding includes slug, kind and policy version. A changed secondary measurement invalidates its review. Fingerprints are integrity checks, not digital signatures or proof of source truth; algorithm changes still require review. [R10]
For a work claiming verified size, the viewer fetches the GLB, hashes it with Web Crypto and decodes the same ArrayBuffer. A mismatched or failed digest prevents WebXR and native export while preserving ordinary 3D. Launch functions repeat this guard. The default path makes no verified-size claim and does not require that reviewed hash. Historical changed-byte browser tests cover the strict guard; they are not a claim of hash-gated defaults. Both paths preserve proportions and avoid compensating axis stretch. [R5, R7, R12]
07 / PDF page 8
WebXR session implementation
The browser layer probes immersive AR and VR independently, with 2.5-second deadlines and handling for missing, throwing, rejected or slow APIs. Secure-context requirements and device-specific guidance are part of the UI. Apple Quick Look recognition combines rel=ar support with narrowly identified iOS browser fallbacks and an embedded-browser exclusion. Capability detection is a routing decision, not proof that tracking or display will work on a particular device. [R7, R16, R17]
User activation and state transitions
Session requests are issued synchronously from the launch click before asynchronous scene work. A deep link to #ar-vr opens the options dialog only; it does not request a session or export without another action. Busy, pending, ready and failed states govern buttons, export invalidation and cancellation. [R7]
3D view -> options dialog -> capability + model checks
-> explicit launch click -> pending session
-> suspended screen controls -> immersive loop
-> end / denial / interruption -> restored 3D view
| Mode | Required behaviour in the implementation |
|---|---|
| AR | Request immersive-ar with hit-test; use local reference space, viewer hit-test source, transparent scene background and a placement reticle. |
| VR | Request immersive-vr with local-floor; place the object two metres ahead of the initial reference origin; use an opaque room background. |
| Optional capabilities | DOM overlay; VR also requests optional hand tracking, without a bespoke hand-gesture interaction system. |
AR placement accepts poses whose transform has matrix[5] >= 0.85, rejecting strongly tilted/wall surfaces. On select, the anchor receives the hit position and becomes visible. Placement keeps the object upright; it is not a general surface-conforming or wall-mounting system. Repositioning hides the artwork until another suitable hit is selected. [R6]
VR controller select rotates the anchor by 30 degrees. The strictly reviewed path forces display scale to one and bypasses thumbstick resizing. Unverified defaults allow 0.1x-2x display scaling through the slider or thumbstick; reset restores the chosen starting extent. Stand height is independent of artwork scale. Red Size unverified text remains in the webpage controls and the DOM overlay when that optional overlay is available. This is immersive inspection of a work, not a multi-room navigable museum or shared multiplayer environment.
Cleanup is part of correctness
The session saves the model's parent, floor/grid state, camera, background, clear colour/alpha and XR-enabled state. Cleanup cancels hit testing, stops the XR animation loop, removes listeners, disposes temporary support/reticle objects, restores scene membership and resumes the screen viewer. Startup errors and aborts use the same restoration path. [R6]
The project creator has not personally tested VR in a headset. Mock sessions and browser automation cover control flow and geometry; they do not validate headset-specific inputs, world tracking, comfort, frame rates or room-scale placement.
08 / PDF page 9
Client-side USDZ preparation
Apple Quick Look is reached through a generated USDZ, not by sending the live WebGL canvas to a native view. The AR action dynamically imports Three's USDZExporter, creates a temporary static assembly, exports it, and creates a local Blob URL. The visitor then explicitly taps an anchor with rel=ar and an image child. The inspected code has no server-side conversion endpoint and no Android Scene Viewer fallback; Android AR uses supported WebXR paths or device guidance. [R6, R7, R17]
Export preparation steps
- Traverse visible meshes and reject geometry hidden through an ancestor. Clone geometry and export materials so preparation does not mutate the live viewer.
- Bake the currently displayed skinned or morphed pose into vertex positions where needed. Remove skin attributes/morph targets from the static result and recompute normals for that bake.
- Bake world transforms into cloned geometry. For mirrored transforms, reverse triangle winding after baking to preserve front-face orientation.
- Split material groups where necessary so the exporter does not silently omit parts of a multi-material mesh. Preserve supported maps and source material factors through the conversion.
- Put the uniformly scaled Artwork group beneath an identity assembly wrapper. Add optional independently sized furniture and floor/support translation.
- Export with the configured 2,048-pixel texture limit, create the USDZ Blob URL, and clean up the temporary scene resources.
Why serialized geometry must be checked
Correct Three.js bounds before export do not guarantee correct USDZ transforms. The exporter handles root/child transforms in a particular way; the identity wrapper ensures the intended physical scale appears on an exported child transform. Regression tests unzip the USDZ, read USDA prim transforms and geometry points, compose transforms, and reconstruct the exported bounds. This detects lost scale that an in-memory scene assertion would miss. [R6, R12]
exported point = parentTransform * meshTransform * vertex
exported extent_i = max(point_i) - min(point_i)
reference extent = exported extent_a * reviewed fraction
The Quick Look URL requests allowsContentScaling=0 for a strictly reviewed reference or an assembly with a virtual stand. An unverified default without a stand uses allowsContentScaling=1, allowing pinch resizing. The warning appears before launch; Apple's native viewer cannot carry the webpage's warning overlay. Neither URL setting proves tracking accuracy or real-world dimensions. [R7, R10, R17]
Costs and compatibility limits
Client-side export allocates cloned geometry/materials, decompressed model data, encoded textures and the ZIP/Blob. Compressed GLB transfer size therefore understates peak memory. Large or complex scans can fail preparation; the UI preserves normal 3D and reports the failure. Prepared URLs are revoked when invalidated. A known double-sided-material exporter warning remains for some works; extended PBR and vertex-colour behaviour require explicit native validation. [R6, R7, R11]
Chrome and WebKit each exported Laocoön/Dubuffet at a resizable 1.5 m and Ushebti at a fixed 0.09 m. WebKit's Ushebti archive was 5,202,552 bytes. These were export checks, not native phone launches. [R10, R19]
09 / PDF page 10
Lighting: exposure is not reflectance
The September 13 correction separates a web camera's exposure setting from a material's reflectance. The earlier conversion multiplied Laocoön's linear base colour by its page exposure of 0.2 before Apple applied native lighting. That made the input material darker. Commit c66d124 removed this multiplication while retaining the independent emissive-intensity correction. The new all-works access release preserves that fix. [R11]
web image = toneMap(pageExposure * shadedWebRadiance)
native image = nativeRender(nativeLighting, materialInputs)
export colour = current material colour # no exposure gain
export emission = emissiveColour * emissiveIntensity
export emissiveIntensity = 1 # applied once
The equations describe implementation boundaries, not a complete photometric simulation. PBR base colour/albedo and emission are different inputs. The cloned material retains its existing colour/texture factors; constant and mapped emission are folded once into the export path. WebXR retains the web renderer's per-work lights, ACES tone mapping and environment. Native Quick Look uses its own renderer and surroundings. It cannot be expected to reproduce a page's pixels outdoors. [R5-R7, R11, R14, R15]
Complete data audit, limited visual claims
The fuller follow-up audit inspected 1,046 exact-hash models, 1,266 material slots and 956 base/emissive texture references, including embedded WebP. Its per-work flag index and summary are embedded in this PDF as atrium-report-evidence.json [R19]. Every work has an outcome, but this is not an outdoor-phone inspection of every piece. The following overlapping flags use that follow-up dataset. The earlier public R11 snapshot has 64 dark-texture candidates; the expanded texture review raises that count to 230, not 230 outdoor failures:
| Audit category | Works | Meaning |
|---|---|---|
| Synthetic tint / vertex variation | 346 / 333 | Existing presentation approximations, not measured albedo. |
| Source unlit converted to lit | 75 | A material-semantics change needing specific review. |
| Emissive texture / active emission | 46 / 45 | Texture channels and effective intensity need preservation. |
| Source colour attribute overwritten | 27 | 23 varying sources; 3 constant grey and 1 all-black placeholder. |
| Dark-texture candidates | 230 | Screening flags, not instructions to brighten. |
Texture statistics use alpha-filtered 128-pixel samples and are not UV-weighted. They cannot distinguish dark paint from baked shadow or unused atlas space. Source-colour comparisons found lost patina/markings in some objects; a uniformly black placeholder also demonstrates why blindly retaining every colour attribute can fail. [R11]
The installed exporter writes geometry displayColor data but does not connect a corresponding primvar reader into its preview-surface diffuse input. Presence of colour arrays therefore does not prove native Apple rendering uses them. Source-colour restoration, extended materials and physical-device appearance testing remain separate work. No per-piece outdoor gain was invented to conceal those limitations.
10 / PDF page 11
Laocoön: one number is not the object
The Laocoön scan is a useful example of why model identity, source dimensions, export arithmetic and actual placement must be evaluated separately. It depicts the historical extended-arm restoration. The current Vatican group has a different bent-arm configuration, so transferring its overall height or width to this mesh would describe a different representation. [R18]
The earlier phone-scale correction used a 2.42 m height for the historical version, retaining the integral altar/sculptural base and adding no virtual stand by default. SMK KAS385 records 242 cm gross height and Berlin mould 263; the Berlin master record independently gives that height. The higher hand controls the top of this particular scan. Published lateral extents remain inconsistent across historical sources. [R18]
| Measurement | Value | Evidential role |
|---|---|---|
| Selected historical height | 2.420000 m | Uniform target used by the scale/export correction. |
| Actual UI-exported height | 2.420074 m | Approximately 74 micrometres above target after serialization. |
| Retained mesh width / depth | ~1.8007 / 1.0689 m | Consequences of preserved mesh proportions at that height. |
| SMK lateral extents | 1.625 / 1.03 m | Source width/depth; not independently matched by the mesh. |
| Berlin lateral extents | 1.84 / 1.00 m | Another documented set requiring reconciliation. |
The source uses normalized signed 16-bit positions. Baking into cloned normalized attributes can round values to the 1/32767 grid; the measured exported height residual was within the stated 0.1 mm numerical tolerance. The Artwork transform remained uniform, its base was at floor level within that tolerance, and the URL disabled content resizing. This does not establish 0.1 mm accuracy of a scan, historical measurement or phone placement. [R18]
The lighting correction has a different target
The corrected native material's first linear diffuse channel is approximately 0.938753, compared with 0.187751 under the superseded 0.2 exposure multiplier. This is a fivefold change in that material input, not a measurement of fivefold image brightness. The inspected Laocoön material has no active constant emission, so emission is not offered as the explanation for this specific darkening. Public-page export checks validated the restored input and unchanged size. [R11, R18]
Current access does not assert verified size
Laocoön now opens in AR/VR with red Size unverified text and a chosen 1.5 m longest extent, with WebXR resizing available even with a stand. Apple permits pinch resizing only when no virtual stand is included. Dubuffet uses the same display preset. Neither has gained a verified-size badge; their source measurements and unresolved questions remain. The historical 2.42 m export test is evidence about that earlier target, not the current default. [R10]
New Chrome and WebKit exports measured Laocoön's longest extent at approximately 1.5000459 m, reflecting existing position quantization. This is within the 0.1 mm serialization tolerance, not real-world physical accuracy. The implementation preserves proportions rather than stretching individual axes to reconcile incompatible sources. A usable display choice and a verified measurement remain different claims. [R10, R19]
11 / PDF page 12
Verification and visitor-facing changes
Source review, geometry arithmetic, serialized files, browser behaviour and hardware tests answer different questions. Deployment 34781588840 succeeded. Public Chrome checks then verified the 1,046-work index, size filters and three exports with no response interception or JavaScript errors. [R8, R10-R13, R19]
| Check | Recorded outcome | What it does not establish |
|---|---|---|
| Historical dimension audit | 666 reference extents passed serialized USDZ arithmetic. | Full-axis accuracy, source precision, identity or tracking. |
| New access coverage | 1,046 generated work pages: 248 strict references; 798 explicit defaults. | New physical measurements or complete visual review. |
| Regression suites | Dimension, verification, access, rendering, support and spatial checks passed. | A complete hardware/device matrix. |
| Discovery UI | 14 checks: filters, URL retention and 320-1,440 px layouts; no JavaScript errors. | GPU speed or native touch behaviour. |
| Chrome/WebKit exports | Three works per engine: Laocoön/Dubuffet at 1.5 m, resizable; Ushebti at 0.09 m, fixed. | Native launch, outdoor appearance or real-world accuracy. |
The older 666-reference audit includes 22 approximate cases and uses max(0.2 mm, 0.01% of target) as a numerical tolerance. The six new local exports and three public-site exports matched target extent and floor placement within 0.1 mm, including existing quantization. Arithmetic does not verify the original object; some references that passed these checks still lack the strict badge. [R8, R10, R19]
What visitors encounter
The home page, navigation, footer and /ar-vr/ index expose all 1,046 works. The size-status filter separates reviewed references from default displays; search and facets persist between collection views. Actions stay below artwork. A #ar-vr link opens options without launching a session. [R10]
The 798 defaults show red Size unverified text and the chosen longest dimension on cards and work controls. The dialog states that this is a display choice. Laocoön and Dubuffet have launch controls; reviewed cast/component labels remain explicit. Defaults can be resized, while strict references stay fixed. An Apple assembly with a virtual stand also stays fixed. [R6, R7, R10]
Hardware disclosure
The creator has tried phone AR but has not personally tested VR in a headset. Browser and export checks are not outdoor-phone or physical-headset acceptance tests. No immersive frame rate, tracking accuracy or universally correct outdoor exposure is claimed.
12 / PDF page 13
Reproduction and remaining work
Use the released source revision as the implementation snapshot; package version: 0.0.0 is not a useful release identifier. The all-works access release is commit 541669e476adc7e2747b729cc73fd1efe0194b58. It follows the initial 248-work discovery policy in 2ef8137 and the native lighting correction c66d124. The original 424-work comparison is 6652430. GitHub deployment run 34781588840 succeeded, followed by public index and three-work export checks. [R2, R4, R13]
Reproduce the code-level checks
git clone https://github.com/never-nude/atrium.earth.git
cd atrium.earth
git checkout 541669e476adc7e2747b729cc73fd1efe0194b58
npm ci
npm run test:model-normalization
npm run test:dimensions
npm run test:spatial-eligibility
npm run test:spatial-access
npm run test:spatial
npm run test:display-support
npm run test:quick-look-export
npm run build
The lockfile's Astro version requires Node >=22.12.0; the Pages workflow sets Node 22. These tests cover the inspected source paths, not a fresh download/verification of every original model. Acquisition and thumbnail regeneration require their additional Python/browser tools and source assets. The workflow runs npm ci and the production build; do not infer that every local audit suite automatically runs on every Pages deployment. [R4, R12, R13]
The 424-to-1,046 count can be reproduced by reading src/data/catalog.json at the two revisions, selecting records where hidden is false, and comparing slug sets. For gross additions/withdrawals, traverse first-parent history once to avoid double-counting branch and merge commits.
Remaining engineering and evidence work
- Dimensions: resolve source-axis conventions, component boundaries, original/cast identity and secondary extents before expanding the 248-work strict size-review subset. AR/VR access already covers all 1,046 works through verified or default display paths. Review older documented records as well as the 380 unsupported references.
- Geometry: inspect incomplete backs, restoration changes and mount contamination. Improve/replace an unsuitable scan where a uniform scale cannot solve the mismatch.
- Materials: restore genuinely varying source colour where appropriate, reject placeholder attributes, and verify native material/primvar interpretation. Avoid histogram-driven brightening.
- Physical devices: record device/browser versions, test a measured reference object on a real surface, inspect several object sizes/materials indoors and outdoors, and compare headset controls/placement. No completion is claimed for this protocol.
- Operations: preserve reproducible source/asset hashes and review decisions; make geometry-policy changes and default-preset selection reasons explicit. Monitor asset delivery separately from static build success.
13 / PDF page 14
Source map and evidence
All links were assembled from inspected repository files and primary documentation. Code links pin a revision. The earlier local-preview notes remain historical records; the implementation discussed as current is the released 541669e snapshot. This report and its reasoning are AI-written.
R1 - Original Reddit post: the 424-work account and reader AR/VR suggestion.
R2 - Comparison baseline 6652430: master catalogue, viewer, package lock and workflow before subsequent growth.
R3 - Current acquisition and organization records: ingest manifests, scan review, six-wing inventory and exhibition changes; master catalogue under src/data.
R4 - Released repository and dependencies: package-lock.json, requirements.txt, astro.config.mjs, README/license scope and src/lib/catalog.ts.
R5 - Viewer implementation: rendering, materials, resource lifecycle and downloaded-byte verification.
R6 - Spatial session and export scene: room transforms, hit testing, cleanup, supports and flattened USDZ scene.
R7 - Spatial UI and launch orchestration: capability routing, user activation, preparation and native link policy.
R8 - Dimension audit: coverage, 666-reference checks and production-page export evidence.
R9 - Physical scaling implementation: matched placement-reference contract and axis/fraction scale calculation; unit conversion is checked in R10.
R10 - All-works access and display defaults: 1,046 accessible works, 248 strict references and 798 chosen presets; src/lib/spatial-access.mjs separates access from spatial-eligibility.mjs.
R11 - Native lighting audit: corrected reflectance transport and material coverage; fuller local audit additionally decoded all 956 texture references.
R12 - Regression tests: normalization, physical dimensions, eligibility, spatial sessions/materials and actual serialized USDZ checks.
R13 - Successful release publishing run; R2 migration c187093; deployment source in .github/workflows/deploy.yml.
R14 - Khronos glTF 2.0: material channel semantics. R15 - OpenUSD Preview Surface: albedo/emission and material interchange.
R16 - W3C WebXR Device API: immersive session/reference-space model. R17 - Apple AR Quick Look: native USDZ use and content-scaling parameter; Three USDZExporter.
R18 - Laocoön phone-scale review: source links to SMK/Berlin/current Vatican representations, geometry and serialized export measurements.
R19 - Embedded report evidence: atrium-report-evidence.json retains the historical material summary and 1,046-work asset/flag index separately from the new access coverage, browser exports and deployment checks. It accompanies this PDF as an attachment; it contains neither source GLBs nor physical-device validation.