iOS selector click taps a point resolved from a pre-tap capture, so a layout shift between capture and tap retargets it silently
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 25/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- ios, typescript
- Área
- mobile
Línea de trabajo
Start with settleAppleOpen in packages/platform-apple/src/open-policy.ts, where the fixed post-open sleep fallback lives, and with the runtime-selector tap path that takes its point from the pre-tap capture. The issue asks you to pick one owning fix, so first settle the design, then update the guarantee cell in packages/contracts/src/interaction-guarantees.ts. Done means a fixture or live run where a moved target either gets tapped at its new location or fails with a typed reason, with warm click timing unchanged. Linked PR #3356 is already open, so check it before starting.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Purpose
An iOS selector click taps the point it resolved from its own pre-tap snapshot. If the layout moves between that capture and the tap, the tap lands on whatever is now under the old point, and the click still reports success. Nothing re-checks where the target is at dispatch time.
Evidence
Main run 37815426076 (2026-10-08, iOS 26 lane), 01-settings.ad. Times are from the session runner.log:
open postOpenObservation: unobservable -> fixed POST_OPEN_SETTLE_MS sleep
17:41:31.77 COMMAND_ACCEPTED command=snapshot (click's pre-tap capture)
17:41:34.57 COMMAND_COMPLETED command=snapshot ok=1 (2.80 s capture)
17:41:35.56 SYNTHESIZED_DISPATCH kind=tap point=(201.0,319.0) attempt 1 -> following wait failed
17:42:10.96 SYNTHESIZED_DISPATCH kind=tap point=(201.0,406.0) attempt 2 -> passed
General was at y=319 in a capture taken about 0.5 s after open returned. On the settled root list it is at y=406, 87 pt lower. Attempt 1's tap probably hit the Apple Account band.
This alone does not prove the tap missed. In #2936 a failing first attempt tapped the settled (201,406) and its wait still failed, so a stale point is one cause among others. Diagnostic history: #2948.
Where it happens
settleAppleOpen(packages/platform-apple/src/open-policy.ts): when the bridge can't read the app, the open falls back to a fixed sleep. When the bridge does read it,observableonly means the tree was readable, not that the layout is stable.- The runtime-selector path takes its tap point from the rect in the pre-tap capture. Neither the
offscreen/nonHittablechecks nor anything in the runner confirm that the node is still at that point when the tap goes out.
Required behavior
- Choose one owning fix and justify it against the evidence. Candidates:
- re-resolve or re-check the target's frame in the runner right before tapping;
- require the target's frame to be stable across captures before tapping;
- gate the first post-open interaction on the layout settling.
- A bounded check must have a budget shorter than the click itself and must not add a capture to warm clicks whose layout is already stable.
- A target that moved and can't be confirmed must fail with a typed reason, not tap the old point.
- Update the guarantee cell this changes in
packages/contracts/src/interaction-guarantees.ts.
Completion
- A fixture or live run where the target moves between capture and tap either taps the new location or fails with a typed reason.
- Warm click p50 on
01-settings.ad(about 2.6 s locally) does not regress.
Related: #3335 (click reports dispatch, not landing), #2948, #2491/#3328 (wait observation stall).
- Lenguaje dominante
- TypeScript
- Estrellas
- 4.9k
- Forks
- 328
- Merge medio
- 11 h 49 min
- PR fusionados (30 d)
- 585
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
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 callstack/agent-device
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
callstack/agent-device#3407 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
callstack/agent-device#3353 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
callstack/agent-device#1869 ·
Los mantenedores suelen responder en 1 día
-
Client stop paths treat EPERM as a confirmed exit and drop state for a live companionPosiblemente ocupada @thymikee la tomó hoy. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 52/100
callstack/agent-device#3540 ·
Los mantenedores suelen responder en 1 día
-
enhancement needs-triage
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
callstack/agent-device#3531 ·
Los mantenedores suelen responder en 1 día
Todos los issues de callstack/agent-device
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
microsoft/playwright#43327 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
microsoft/TypeScript#64758 ·
Los mantenedores suelen responder en 1 día
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
opensearch-project/OpenSearch-Dashboards#12937 ·
Los mantenedores suelen responder en 2 días
-
Liveness marks block-included attesters live in the block's epoch instead of the attestation's epochAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
Los mantenedores suelen responder en 1 día
-
status: needs-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100
a2ui-project/a2ui#3158 ·
Los mantenedores suelen responder en 2 días