vfx runtime: nested layoutsubtree capture canvases hang drawElementImage (check/snapshot time out); ref lookups are unscoped descendant queries
Los mantenedores suelen responder en 1 día
@vanceingalls ya está trabajando en esto.
Desde el 30/9/2026.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 45/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Activo
- Stack tecnológico
- typescript
- Área
- computer-graphics, performance
Línea de trabajo
Start in runtime/vfx.ts at lines 263, 387, 475-512, then inspect the immediate-child lookup rule and the capture-source resolution paths. Reproduce with hyperframes check or snapshot using the referenced bisect copies and logs. Done means nested capture sources are rejected without hanging and host-to-source/output lookups follow the stated scope rule.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Measured 2026-09-24 on hyperframes 0.8.71 (origin/main 58c873d81) with the AE exporter's retro-wave export, HF_VFX=1 HF_VFX_REF=1.
Symptom
hyperframes check → Runtime ✗ check_runtime_failure: Runtime.callFunctionOn timed out after "Runtime did not become render-ready within 3000ms" / "Shader transitions did not finish pre-rendering"; hyperframes snapshot --at 2.6 hangs >500 s with no output. Zero console lines are collected in the failing runs (the renderer main thread is blocked, not slow).
Bisect (seven serialized check runs on hand-edited copies)
| copy | noise+backdrop | ref wrapper | ext map |
nested layoutsubtree canvases |
result |
|---|---|---|---|---|---|
| unmodified | ✓ | ✓ | ✓ | 2 | FAIL |
noise chains + data-vfx-for wrappers removed |
✗ | ✓ | ✓ | 1 | FAIL |
map param dropped, ref wrapper kept |
✓ | ✓ | ✗ | 2 | FAIL |
| ref wrapper unwrapped | ✓ | ✗ | ✗ | 1 | FAIL |
| both shapes gone | ✗ | ✗ | ✗ | 0 | PASS |
| E: both shapes kept verbatim; the two INNER self-capture triads removed | ✓ | ✓ | ✓ | 0 | PASS |
F: = E with the two inner layoutsubtree canvases put back |
✓ | ✓ | ✓ | 2 | FAIL |
E vs F differ by exactly two elements: a <canvas layoutsubtree class="hf-vfx-src"> nested inside another capture wrapper's subtree (a data-vfx-ref-visible ref wrapper around a host that runs its own displacement-map chain; a data-vfx-for backdrop wrapper whose preceding-sibling prefix contains a self-capture host). Every runtime path involved — findBackdropWrapper, resolveRefSource, data-vfx-ref-visible, CAPTURE_VISIBLE_SOURCE — is live in E and works. Every await in runtime/vfx.ts is bounded (CAPTURE_PAINT_TIMEOUT_MS), so this is Chrome refusing drawElementImage on a subtree containing another layoutsubtree canvas, not a JS promise.
The exporter is being fixed to never emit the nest (withdraw the chain with a gap). Three runtime items remain:
- Design gap: a
map/matteref that names a layer which runs its own kernel cannot be expressed —wrapAsVfxRefSource's precondition "it runs no kernel of its own" is unsatisfiable for such layers. A ref param that may name a HOST and bind its.hf-vfx-outtexture directly would remove the need for an outer wrapper. - Latent (M2): host→src/out lookups are unscoped descendant queries —
runtime/vfx.ts:486owner.querySelector("canvas.hf-vfx-src")and:263host.querySelector("canvas.hf-vfx-out")— while:487uses:scope > .hf-vfx-inand the comment at:475states the immediate-child rule. On a nested shape this bindsentry.srcto the OUTER wrapper andentry.outto the INNER out, socaptureSourcewould draw the canvas the entry paints into. Hidden today only because the nest hangs first. - Latent (M3):
resolveCaptureSourcehardcodesvisible:false(:512) whileresolveRefSourcereads the attribute (:387) — a doubly-reached canvas gets twoVfxCaptureSourceobjects with oppositekeepBitmap; registry order decides.
Suggested runtime hardening independent of the exporter fix: reject (with a reportVfxError) any .hf-vfx-src whose subtree contains another .hf-vfx-src, rather than hanging; and scope the two lookups to :scope >.
Repro copies and logs are on the AE-export machine (/tmp/hf71-bisect-{a,b,b2,c,e,f}, /tmp/fable-coord/hf71-bisect-*.log); exporter-side record: hyperframes-ae-exporter spec §Task 3.8 (2026-09-24).
🤖 Generated with Claude Code
- Lenguaje dominante
- TypeScript
- Estrellas
- 54.1k
- Forks
- 4.9k
- Merge medio
- 7 h 18 min
- PR fusionados (30 d)
- 784
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de heygen-com/hyperframes
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
heygen-com/hyperframes#5027 ·
Los mantenedores suelen responder en 1 día
-
fix(producer): propagate useGpu to HDR layered streaming encoderPosiblemente ocupada @Monster-GM la tomó hace 2 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 87/100
heygen-com/hyperframes#5002 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
heygen-com/hyperframes#4702 · 1 comentario · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
Studio catalog prompt editor has no accessible namePosiblemente ocupada @lorenzozanee la tomó hace 12 días. Abiertobug difficulty/easy triage/ready
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
heygen-com/hyperframes#4384 ·
Los mantenedores suelen responder en 1 día
-
lint: validate composition variables declared on supported root elementsQuizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abiertobug difficulty/easy triage/ready
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
heygen-com/hyperframes#4383 ·
Los mantenedores suelen responder en 1 día
Todos los issues de heygen-com/hyperframes
Issues similares
-
Dificultad 2/5 Menos de una hora Aptitud para principiantes 85/100
capricorn86/happy-dom#2474 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
JSerwatka/letterboxd-tweaks#81 · 1 comentario ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
siyuan-note/siyuan#20165 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
polkadot-js/phishing#5716 ·
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 90/100
juice-shop/juice-shop#3662 ·
Los mantenedores suelen responder en 1 día