Skip to content

test(List): the press release curve proof holds the release in the page - #10047

Merged
cixzhang merged 2 commits into
meta:mainfrom
vjeux:test-list-row-release-hold
Nov 5, 2026
Merged

cixzhang merged 2 commits into
meta:mainfrom
vjeux:test-list-row-release-hold

Conversation

@vjeux

@vjeux vjeux commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

Maintainer impact

ListRowPress's "a held row paints the pressed token and its release follows the exit easing, sampled frame by frame" fails on busy runners with release undefined: the hold found no animation to hold. In Chromium pinned to two cores with 4 workers, main failed 4 of 20.

Intended invariant

component:List FR11: a row's release fades on the theme's exit tokens (--duration-exit, --ease-exit) on the compositor. The proof samples that curve, and what it asserts is unchanged.

Change

The proof sent its hold from the test after the lift, after a press-state read and a timer freeze. The release lasts 125 ms, the default theme's exit duration, so on a busy runner it could end before the hold arrived. The page now holds the release itself as soon as it runs: armHold, armed before the tap, as the harness documents for a short animation. The curve is then sampled from that hold, by seeking, as before.

Evidence

One machine and one build, the arms alternated:

  • Failure before the change: main failed 4 of 20 at 4 workers on the two-core pin ("Received: undefined"). With a 200 ms pause before the hold is read, main failed 5 of 5.
  • Success after the change: 20 of 20 at 4 workers on the pin, 5 of 5 with the same pause, and 10 of 10 in WebKit in the CI container (1 worker).
  • A row whose release runs on the main thread still fails the proof, 3 of 3: its layer never paints the pressed token.
  • Product/runtime behavior verified unchanged: the diff is one test file.
  • CI impact: none; no workflow or CI script changes.

Scope

  • No intended public API, product behavior, visual direction, or policy change.
  • Product changes discovered during the work were removed or split.
  • Public text and artifacts contain no internal Meta context.

Testing

# Chromium pinned to two cores
taskset -c 2,3 npx playwright test -c playwright.interaction.config.ts \
  --project=chromium --workers=4 --repeat-each=10 \
  -g "paints the pressed token and its release follows the exit easing" \
  packages/core/src/List/__tests__/ListRowPress.interaction.browser.spec.ts
# WebKit in the CI container
node internal/interaction-harness/scripts/webkit-container.mjs --workers=1 \
  --repeat-each=10 -g "paints the pressed token" \
  packages/core/src/List/__tests__/ListRowPress.interaction.browser.spec.ts

The arms above, as commits not for landing:

  • the late read on main: bd5d1de;
  • the late read on this change: 8907ecc;
  • the release on the main thread (Item without rowPressLayerStyles.cell): 1b44761.

The rest of the spec file passes in Chromium on the pin and in WebKit, except two cases main fails too: the "Item row in a scroller" blocked-thread case (its own pull request) and the WebKit video case (#10011).

The proof that a held row's release follows the exit easing sent its
hold from the test after the lift. On a busy machine the hold reached
the page after the 125 ms release had ended, so it held nothing. The
page now holds the release itself as soon as it runs (armHold, armed
before the tap), and the curve is sampled from that hold as before.
@vercel

vercel Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
astryx Ready Ready Preview Nov 5, 2026 7:20am UTC

Request Review

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Meta Open Source bot. label Nov 5, 2026
@astracat-bot

astracat-bot Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

AI review status for this pull request.

Review status Updated
🟢 Reviewed (for maintainers only) Nov 5, 2026, 7:33 AM UTC

@github-actions

github-actions Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

PR Analysis Report

🔎 Preview · 8642dbd

Storybook · Sandbox · built from this PR's head

Modified components

Component Size LoC Visual · A11y · RTL
List 5.4 kB (0) · 469 B CSS (0) — ✓ · ✓ · —
ListItem 58.7 kB (0) · 10.7 kB CSS (0) — ✓ · ✓ · ✓

Package size: measured; main has no measurement of the merge base to compare yet.

API changes: cli +8 · ~1 · −0 (against the merge base's committed report)

Committed API report behind this build: cli 9 rows, core 4 rows; run pnpm api:report.

9 API changes (advisory)
Package Where Signature Usage
+ cli ./api · Types · type SearchResultEntry deprecated?: ComponentDeprecation | undefined import type {SearchResultEntry} from '@astryxdesign/cli/api'; const x: SearchResultEntry = {deprecated: …}
+ cli ./authoring · Types · interface ComponentDeprecation interface ComponentDeprecation import type {ComponentDeprecation} from '@astryxdesign/cli/authoring'
+ cli ./authoring · Types · interface MultiComponentDoc deprecated?: ComponentDeprecation import type {MultiComponentDoc} from '@astryxdesign/cli/authoring'; const x: MultiComponentDoc = {deprecated: …}
+ cli ./authoring · Types · interface SingleComponentDoc deprecated?: ComponentDeprecation import type {SingleComponentDoc} from '@astryxdesign/cli/authoring'; const x: SingleComponentDoc = {deprecated: …}
+ cli ./doc · Types · interface ComponentBaseDoc deprecated?: ComponentDeprecation import type {ComponentBaseDoc} from '@astryxdesign/cli/doc'; const x: ComponentBaseDoc = {deprecated: …}
+ cli ./doc · Types · interface SubComponentDoc deprecated?: ComponentDeprecation import type {SubComponentDoc} from '@astryxdesign/cli/doc'; const x: SubComponentDoc = {deprecated: …}
+ cli ./doc · Also exported from an earlier entry point · ComponentDeprecation ComponentDeprecation (./authoring) import {ComponentDeprecation} from '@astryxdesign/cli/doc'
+ cli ./template · Also exported from an earlier entry point · ComponentDeprecation ComponentDeprecation (./authoring) import {ComponentDeprecation} from '@astryxdesign/cli/template'
~ cli ./api · Functions · function search function search: (query: string, options?: { cwd?: string | undefined; type?: "template" | "component" | "hook" | "theme" | "doc" | undefined; limit?: number | undefined }) => Promise<SearchResponse> → function search: (query: string, options?: { cwd?: string | undefined; type?: "template" | "component" | "doc" | "theme" | "hook" | undefined; limit?: number | undefined }) => Promise<SearchResponse> import {search} from '@astryxdesign/cli/api'; search(…)

Touched components checked; add ci:run-visual, ci:run-a11y or ci:run-rtl to run the full suites.


Generated by PR Enrichment workflow | View full report

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved pending CI: CI has not run on this head yet. Arming armHold before the tap removes the race with the 125 ms release, and the proof's assertions on component:List FR11 stay the same.

Next step: once the pull request is marked ready for review, a maintainer adds the ci:run label so CI runs.

  • Optional follow-up: the storyboard test in the same file ("storyboard: a row released after a hold") still holds after the lift; an armHold armed before its tap, passed to animationStoryboard as held: await hold.held(), would close the same race.

[Automated review]

@vjeux
vjeux marked this pull request as ready for review November 5, 2026 05:53
@cixzhang cixzhang added the ci:run A maintainer lets this outside contributor's pull request run CI (AST-030 FR17) label Nov 5, 2026
@cixzhang
cixzhang marked this pull request as draft November 5, 2026 05:56
@cixzhang
cixzhang marked this pull request as ready for review November 5, 2026 05:56
@cixzhang
cixzhang marked this pull request as draft November 5, 2026 07:13
@cixzhang
cixzhang marked this pull request as ready for review November 5, 2026 07:14

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved. Arming armHold before the tap lets the page hold the 125 ms release as soon as it runs, so the FR11 curve proof no longer races the test's round trip; its assertions stay the same, and it passes in CI's Chromium and WebKit interaction runs on this head.

  • Optional follow-up: the storyboard test in the same file ("storyboard: a row released after a hold") still holds after the lift; an armHold armed before its tap and passed to animationStoryboard as held: await hold.held() would close the same race.

[Automated review]

@cixzhang
cixzhang merged commit 922c0e8 into meta:main Nov 5, 2026
78 of 118 checks passed
@vjeux
vjeux deleted the test-list-row-release-hold branch November 5, 2026 18:00

This branch was successfully deployed

1 active deployment
Preview — 8642dbd5 Deployed Nov 5, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci:run A maintainer lets this outside contributor's pull request run CI (AST-030 FR17) CLA Signed This label is managed by the Meta Open Source bot.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants