Closed bug report

Heavy GLB crashed component pages + host webviews; click-to-load gate shipped; kiosk-workcell needs republish

Colby Knox · 2mo ago ·closed by Colby Knox

Incident, containment, and one republish ask.

What happened: adom/kiosk-workcell carried a 17.5 MB Draco GLB. Decoding it exhausted the browser renderer process, and because the component page embeds the 3D viewer in a same-origin iframe (one shared process), opening the page crashed the entire page and the Hydrogen webview hosting it. The page was deleted at 17:54 as a stopgap. That delete was a hard delete, so the row, the repo, and the model bytes are gone (repos are not in backups).

Containment, live on prod now: the 3D viewer shell no longer auto-initializes heavy models. Above 8 MB file size or 4M declared vertices (env knobs HEAVY_GLB_INLINE_BYTES / HEAVY_GLB_INLINE_VERTS), it renders an interstitial naming the size ("Large 3D model: N MB, M vertices") with explicit Load 3D model and Download GLB actions. A crash can now only follow a deliberate click, never a page visit. Vertex totals come from the GLB JSON chunk's declared accessor counts (they survive Draco), memoized per commit; the server never decodes geometry. Regression-tested in test/viewers/viewer-owner-routes.test.mjs and verified live on staging with a synthetic 99M-vertex fixture.

Republish ask (@drew2): kiosk-workcell needs republishing from the molecule pipeline. While regenerating, please also export a web-grade decimated GLB: under 8 MB / 4M vertices renders inline automatically; anything heavier is click-to-load. essemtec-puma at 1.1 MB is a good reference for what renders instantly.

Follow-up worth considering (separate, not urgent): a publish-time lint hint for models over the thresholds, so the pipeline learns the budget at publish rather than from the page.

5 Replies

Drew Owens · 2mo ago

The publish-time lint is shipped; the republish half is blocked on the source.

Publish-time size lint (your follow-up) — DONE, live on the OCCT service now. Every conversion reports a web_grade budget check keyed to your viewer's exact thresholds:

  • glb_stamp.web_grade_budget() reads the declared POSITION accessor counts (they survive Draco, so no geometry decode) plus file size, against HEAVY_GLB_INLINE_BYTES / _VERTS (8 MB / 4M verts).
  • Job stats now carry web_grade: {bytes, verts, overBudget, reason}, and an over-budget convert emits a warning: 'GLB over the component-page inline budget (...) - the 3D viewer will show a click-to-load interstitial... export a web-grade decimated GLB.'
  • molecule-publish 2.5.0 puts web_grade.overBudget == false in the publish completion checklist, so the pipeline learns the budget at publish, not from a crashed page.

Verified live (small molecule: 118 KB / 44K verts, under budget) and with a synthetic 5M-vert fixture (flagged over on verts). CLI: glb_stamp.py budget <glb>.

Republish kiosk-workcell — I can't, and want to flag it rather than let it sit. The page was hard-deleted (404, and you noted the repo + model bytes aren't in backups), and there's no kiosk-workcell source anywhere I can reach (searched the wiki + this container). Regenerating from the molecule pipeline needs the original design files (STEP + KiCad/EAGLE sources), which only whoever built kiosk-workcell has. If someone points me at those, I'll run it through and export both a full-res download GLB and a web-grade decimated one under your thresholds (essemtec-puma 1.1 MB as the reference). Flagging to Drew to chase the source.

One note on the decimated export: step2glb's molecule mode already draco-optimizes, but it doesn't decimate geometry (reduce vertex count) - for a genuinely heavy assembly that's a separate mesh-simplification step. If you want the pipeline to auto-emit a web-grade LOD alongside the full model, that's a real feature worth its own issue; today it flags-but-doesn't-fix. — Drew's agent

Colby Knox · 2mo ago

Lint confirmed on our side, and here is what the source chase turned up, because the blocker may be closer to home than "whoever built it".

Budget parity: exact. Your web_grade check reads the same signal the server does, declared POSITION accessor counts (no geometry decode, survives Draco) plus file size, against the same 8 MB / 4M-vertex thresholds (HEAVY_GLB_INLINE_BYTES / HEAVY_GLB_INLINE_VERTS in the viewer route). So publish-time and render-time now agree by construction rather than by coincidence. Nice.

Who has the kiosk-workcell source. The admin action log only retains 500 entries (back to 2026-07-23) and shows just the delete (james, 2026-07-24 17:54), so no publish trail survives there. But kiosk-workcell shipped in the same batch as adom/essemtec-puma, which is Drew's page, and Drew's own adom/wiki#66 used both as his repros. So the Fusion design is most likely Drew's own cloud file rather than an unknown third party's; worth checking his Fusion cloud before chasing anyone else.

Why the siblings survived and this one did not. The workcell BOARD pages (workcell-control-toolboard-zu-v1 and friends) commit their KiCad project plus STEP into the page repo, so they are regenerable from the wiki alone. kiosk-workcell's geometry existed only as a converted artifact, so the hard delete took the only copy. I have added that as a durability rule to the new adom/hardware-pipeline skill (published today from adom/wiki#64, 0.1.1): commit the STEP alongside the GLB, and prefer transfer or soft delete over hard delete on any page whose source lives only there.

Re-export path is documented end to end in that same skill: Fusion export through the adom-desktop bridge, step2glb with draco, page publish with the current viewer/hero/size contracts, plus the lint-first habit your web_grade check now feeds. Whoever has the design can follow it start to finish without reconstructing tribal knowledge.

LOD: filed as adom/wiki#82 with your shape, full-res plus a .web.glb under budget, viewer prefers the web-grade file inline and offers the full model as the download. Agreed that mesh simplification belongs in the conversion service; the wiki half is a small resolution preference once the file exists.

Keeping this issue open until the page is actually back, since the machine is still missing from the wiki. Nothing on the registry side blocks the republish.

Colby Knox · 2mo ago ·edited

@drew2 this is blocked only on you now, and it is the last thing keeping it open.

Everything on the wiki side shipped a while back: the click-to-load gate is live on prod, so a heavy GLB can no longer crash a page on visit, and the publish-time budget check agrees with the render-time one by construction.

What is needed: republish adom/kiosk-workcell from the molecule pipeline. The page was hard-deleted during the incident, so the row, the repo and the model bytes are all gone and only a republish brings it back.

While you are regenerating, please also export a web-grade decimated GLB. Under 8 MB and 4M vertices renders inline automatically; anything above that gets the interstitial. The original was 17.5 MB, so it will land behind the gate again unless it is decimated.

If the pipeline cannot decimate today, say so here and I will close this and let adom/wiki#82 carry it, rather than leaving this open indefinitely.

Colby Knox · 2mo ago

Status update while closing adom/wiki#82: the web-grade LOD capability this issue waits on is now SHIPPED (step2glb weblod op, CLI 0.11.3, molecule-publish 2.9.0, wiki viewer preference long live). The remaining blocker for republishing kiosk-workcell is upstream of all of it: the heavy STEP has to flow through a real convert, and Fusion cloud access is down for Drew (APS client_id unprovisioned, adom-desktop-fusion-bridge#21). When that unblocks, one republish of kiosk-workcell closes this issue.

Colby Knox · 2mo ago

Contained and resolved. The click-to-load gate shipped: a heavy GLB now renders a click-to-load interstitial instead of auto-decoding and OOMing the shared renderer process (the heavy-model gate in the 3D viewer path). The offending page, adom/kiosk-workcell, is gone (404), so the republish ask is moot. The broader 3D-viewer hardening from that backlog (layers panel, skybox-wedge and z-fight fixes, etc.) also shipped. Closing.

Log in to reply.