Signature: ios-autobind-vmi-undefined
Regex: Cannot read property 'numberProperty' of undefined in autoplay.harness.tsx ("auto-binds default ViewModel when one exists") on test-harness-ios
Category: test-bug (timing) over a real API gap
First seen: 2026-07-08 · Last seen: 2026-07-08
Occurrence log
- 2026-07-08 — run 28916680755 (
812966d, experimental backend) — ref.getViewModelInstance() returned undefined right after view-ready; expect(vmi).not.toBeNull() passes for undefined, then vmi!.numberProperty('ypos') throws. Same run also had one exit-137 (Metro OOM) retry on attempt 1.
Hypothesis
The view's auto-bound ViewModelInstance resolves asynchronously after view-ready (no native bind-complete signal, review finding M3) — a one-shot getViewModelInstance() read races the bind. The test also uses not.toBeNull() which lets undefined through to a crash instead of a clean assertion failure.
Reproduction
Timing race — tighten the window by reading getViewModelInstance() immediately after awaitViewReady() on a data-bound file (experimental backend); the auto-bind round-trips the command queue and can land later.
Mitigation
Closing criterion (guard)
#304 merges (test waits for the property; hook polls for the bound instance) and the signature stops appearing → move to ci-flake:resolved.
Tracked via CI Flake Triage. This issue is intentionally closed — it is a ledger entry, not open work.
Signature:
ios-autobind-vmi-undefinedRegex:
Cannot read property 'numberProperty' of undefinedinautoplay.harness.tsx("auto-binds default ViewModel when one exists") ontest-harness-iosCategory: test-bug (timing) over a real API gap
First seen: 2026-07-08 · Last seen: 2026-07-08
Occurrence log
812966d, experimental backend) —ref.getViewModelInstance()returnedundefinedright after view-ready;expect(vmi).not.toBeNull()passes forundefined, thenvmi!.numberProperty('ypos')throws. Same run also had one exit-137 (Metro OOM) retry on attempt 1.Hypothesis
The view's auto-bound ViewModelInstance resolves asynchronously after view-ready (no native bind-complete signal, review finding M3) — a one-shot
getViewModelInstance()read races the bind. The test also usesnot.toBeNull()which letsundefinedthrough to a crash instead of a clean assertion failure.Reproduction
Timing race — tighten the window by reading
getViewModelInstance()immediately afterawaitViewReady()on a data-bound file (experimental backend); the auto-bind round-trips the command queue and can land later.Mitigation
feat/use-viewmodel-instance-async(80e854d: wait for a ViewModel property, not just the view ref) — pending merge via feat(hooks): async instance creation via useViewModelInstance({ async: true }) #304, which also adds ref-bind polling inuseViewModelInstanceAsync.getViewModelInstance()has a deterministic ready point (M3).Closing criterion (guard)
#304 merges (test waits for the property; hook polls for the bound instance) and the signature stops appearing → move to
ci-flake:resolved.Tracked via CI Flake Triage. This issue is intentionally closed — it is a ledger entry, not open work.