Skip to content

test(BottomSheet): deflake v0.7.12 release contract - #10845

Closed
cixzhang wants to merge 1 commit into
release/v0.7.12from
fix/release-v0.7.12-bottomsheet-deflake
Closed

cixzhang wants to merge 1 commit into
release/v0.7.12from
fix/release-v0.7.12-bottomsheet-deflake

Conversation

@cixzhang

@cixzhang cixzhang commented Nov 9, 2026

Copy link
Copy Markdown
Contributor

Maintainer impact

The v0.7.12 exact release-branch gate failed the same BottomSheet accessibility-contract test on its first run and its one allowed failed-jobs rerun: a synthetic mouse close sometimes waited past two seconds because its event timestamps depended on runner delivery speed.

This pull request ports the already merged test-only fix from #10756 onto release/v0.7.12. It changes no component, package, story, workflow, assertion, or timeout.

Intended invariant and change

Reuse the test file's timestamped mouseDrag helper. Keep the downward mouse gesture and 150 px travel, pin it to 50 ms (3,000 px/s), and release 1 ms after the final move. The test now deterministically exercises its existing dismissal branch regardless of delayed event delivery.

The port's stable patch ID exactly matches source commit a0f2a2da8838.

Evidence

  • Source PR test(BottomSheet): timestamp the reduced-motion mouse close #10756: the target passed 20/20 normally and 20/20 with 200 ms delivery delays; the complete file passed 13/13.
  • Exact release gate attempt 1: run 42660959150, BottomSheetRelease.a11y.chromium.spec.ts:294, expected hidden but remained visible after 2,000 ms; 365 sibling tests passed.
  • Exact release gate attempt 2: the identical test and timeout repeated at the same release head.

Scope

  • One test file; exact port of the merged source fix.
  • No intended public API, package, product behavior, visual direction, or policy change.
  • No weakened assertion, longer wait, retry, or skipped coverage.
  • Public text contains no private operational context.

Testing

  • Stable patch ID: 0bcb81963a0e90030526a5db84a294d34a0e7189 for both the release port and source commit.
  • Source test(BottomSheet): timestamp the reduced-motion mouse close #10756: 20/20 targeted passes normally, 20/20 with 200 ms event-delivery delays, and 13/13 complete-file passes.
  • pnpm specs:for --diff origin/release/v0.7.12
  • pnpm review:pre --base origin/release/v0.7.12
  • Fresh pull-request CI runs the full accessibility-contract suite on hosted Chromium.

@vercel

vercel Bot commented Nov 9, 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 10, 2026 2:31am UTC

Request Review

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

astracat-bot Bot commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

AI review status for this pull request.

Review status Updated
❓ Needs maintainer input (for maintainers only) Nov 10, 2026, 2:40 AM UTC

@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 finished on this head yet.

This ports the merged test-only fix from #10756 to release/v0.7.12 unchanged. The reduced-motion mouse close in BottomSheetRelease.a11y.chromium.spec.ts now uses the file's timestamped mouseDrag helper, so the release speed it measures no longer depends on how fast the runner delivers input. The file matches main exactly, and every assertion and timeout is unchanged. With 200 ms delivery delays, the old input fails the same way the release gate did, and the new input passes.

[Automated review]

@github-actions

github-actions Bot commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

PR Analysis Report

🔎 Preview · 172c4f8

Storybook · Sandbox · built from this PR's head

Modified components

Component Size LoC Visual · A11y · RTL
BottomSheet 65.1 kB (0) · 7.5 kB CSS (0) — ✓ · ✓ · —
BottomSheetSwitcher 17.8 kB (0) · 3.4 kB CSS (0) — ✓ · ✓ · —

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

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

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

21 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 ComponentIconSlotDoc interface ComponentIconSlotDoc import type {ComponentIconSlotDoc} from '@astryxdesign/cli/authoring'
+ cli ./authoring · Types · interface ComponentIconSlotStateDoc interface ComponentIconSlotStateDoc import type {ComponentIconSlotStateDoc} 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 ./doc · Also exported from an earlier entry point · ComponentIconSlotDoc ComponentIconSlotDoc (./authoring) import {ComponentIconSlotDoc} from '@astryxdesign/cli/doc'
+ cli ./doc · Also exported from an earlier entry point · ComponentIconSlotStateDoc ComponentIconSlotStateDoc (./authoring) import {ComponentIconSlotStateDoc} from '@astryxdesign/cli/doc'
+ cli ./template · Also exported from an earlier entry point · ComponentDeprecation ComponentDeprecation (./authoring) import {ComponentDeprecation} from '@astryxdesign/cli/template'
+ cli ./template · Also exported from an earlier entry point · ComponentIconSlotDoc ComponentIconSlotDoc (./authoring) import {ComponentIconSlotDoc} from '@astryxdesign/cli/template'
+ cli ./template · Also exported from an earlier entry point · ComponentIconSlotStateDoc ComponentIconSlotStateDoc (./authoring) import {ComponentIconSlotStateDoc} 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(…)
~ cli ./api · Types · type SwizzleCopyResponse data: { component: string; package: string; outputDir: string; filesCopied: number; files: string[]; usesStyleX: boolean; feedback?: SwizzleFeedback | undefined } → data: { component: string; package: string; outputDir: string; filesCopied: number; files: string[]; usesStyleX: boolean; dependencies: Record<string, string>; feedback?: SwizzleFeedback | undefined } import type {SwizzleCopyResponse} from '@astryxdesign/cli/api'; const x: SwizzleCopyResponse = {data: …}
~ cli ./authoring · Types · interface MultiComponentDoc theming?: { container?: boolean; targets: ComponentThemingTarget[]; vars?: ComponentThemingVar[]; derived?: ComponentThemingDerivedVar[] } → theming?: { container?: boolean; targets: ComponentThemingTarget[]; vars?: ComponentThemingVar[]; derived?: ComponentThemingDerivedVar[]; componentIcons?: ComponentIconSlotDoc[] } import type {MultiComponentDoc} from '@astryxdesign/cli/authoring'; const x: MultiComponentDoc = {theming: …}
~ cli ./authoring · Types · interface SingleComponentDoc theming?: { container?: boolean; targets: ComponentThemingTarget[]; vars?: ComponentThemingVar[]; derived?: ComponentThemingDerivedVar[] } → theming?: { container?: boolean; targets: ComponentThemingTarget[]; vars?: ComponentThemingVar[]; derived?: ComponentThemingDerivedVar[]; componentIcons?: ComponentIconSlotDoc[] } import type {SingleComponentDoc} from '@astryxdesign/cli/authoring'; const x: SingleComponentDoc = {theming: …}
~ cli ./authoring · Types · type TemplateCategory type TemplateCategory = | 'Dashboard - Analytics' | 'Dashboard - Comparison' | 'Dashboard - KPI Summary' | 'Dashboard - Monitoring' | 'Dashboard - Executive Summary' | 'Dashboard - Sco … #e7c18378 → type TemplateCategory = | 'Dashboard - Analytics' | 'Dashboard - Comparison' | 'Dashboard - KPI Summary' | 'Dashboard - Monitoring' | 'Dashboard - Executive Summary' | 'Dashboard - Sco … #a8be998f import type {TemplateCategory} from '@astryxdesign/cli/authoring'
~ cli ./doc · Types · interface ComponentBaseDoc theming?: { container?: boolean; targets: ComponentThemingTarget[]; vars?: ComponentThemingVar[]; derived?: ComponentThemingDerivedVar[] } → theming?: { container?: boolean; targets: ComponentThemingTarget[]; vars?: ComponentThemingVar[]; derived?: ComponentThemingDerivedVar[]; componentIcons?: ComponentIconSlotDoc[] } import type {ComponentBaseDoc} from '@astryxdesign/cli/doc'; const x: ComponentBaseDoc = {theming: …}
~ cli ./doc · Types · interface SubComponentDoc theming?: { container?: boolean; targets: ComponentThemingTarget[]; vars?: ComponentThemingVar[]; derived?: ComponentThemingDerivedVar[] } → theming?: { container?: boolean; targets: ComponentThemingTarget[]; vars?: ComponentThemingVar[]; derived?: ComponentThemingDerivedVar[]; componentIcons?: ComponentIconSlotDoc[] } import type {SubComponentDoc} from '@astryxdesign/cli/doc'; const x: SubComponentDoc = {theming: …}

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

Current run: CI concluded failure; parts of this report may be missing.


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.

Changes requested: this pull request cannot merge into release/v0.7.12 as built.

  • Found by CI: the required test check fails because pull requests into release/v* run the generated-only release lane, whose release-bump job refuses packages/core/src/BottomSheet/__tests__/BottomSheetRelease.a11y.chromium.spec.ts as a non-generated path.
  • Miss: landing a commit merged to main after the v0.7.12 cut on the release branch contradicts spec:AST-030 FR12, which says the release cuts from the exact checked SHA and later commits remain next-release input.

The test change itself is sound: it matches the fix merged in #10756, and with 200 ms delivery delays the old input fails the way the release gate did while the new input passes. To unblock v0.7.12, ship the fix through a release cut that contains it, or change the release-branch rule in its own reviewed pull request first. CI treated this pull request as the release version bump and ran no browser contract, so the test has no CI evidence on this head.

[Automated review]

@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.

Not ready to merge yet, although the change itself is sound: it is #10756's patch exactly, the release branch's own validator, run on a full clone, accepts it as the one test repair allowed after the version bump, and the changed test passed in this run's component accessibility contracts.

Required checks fail at this head because of release/v0.7.12 itself, not this change:

  • Regression: release-bump stops with spawnSync git ENOBUFS, because the branch's ci.yml now fetches the base with --depth=200, which makes the checkout shallow, so the validator's git show --binary of the depth-200 boundary commit overflows Node's 1 MiB output buffer.
  • Regression: test-node (2/4) fails two tests in .github/scripts/touched-components.test.mjs, because the branch carries #10634's ci.yml fallback without that pull request's test update.

pr-interaction (2/6) also failed one Lab NavigationStack frame-timing test that this change does not reach. A release owner needs to choose how the branch's carried policy gets fixed (for example a second policy carry from main), and then this repair rebases onto it and reruns every lane.

[Automated review]

Co-authored-by: astracat-bot[bot] <323722387+astracat-bot[bot]@users.noreply.github.com>

@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.

Not ready to merge yet, although the change itself is sound: it is #10756's patch exactly, the release branch's own validator accepts it on full history as the one test repair allowed after the version bump, and the changed test passes in this head's component accessibility contracts.

The required release-bump check still fails at this head because of release/v0.7.12 itself, not this change: the branch's ci.yml fetches the base with --depth=200, so the validator treats the 200th commit as a root that adds this test file, and showing it (about 434 MB) overflows the 64 MiB buffer the final policy sync added. spec:AST-017 FR61 admits no further policy sync and no override, so a release or engineering owner needs to decide how v0.7.12 proceeds (for example an approved spec amendment for a third sync, or a recut). Nothing in this pull request needs to change.

[Automated review]

@cixzhang cixzhang closed this Nov 10, 2026
@cixzhang cixzhang reopened this Nov 10, 2026
@cixzhang
cixzhang changed the base branch from release/v0.7.12 to main November 10, 2026 03:17
@cixzhang
cixzhang changed the base branch from main to release/v0.7.12 November 10, 2026 03:17
@cixzhang cixzhang closed this Nov 10, 2026
@cixzhang cixzhang reopened this Nov 10, 2026
@cixzhang cixzhang closed this Nov 10, 2026
@cixzhang
cixzhang deleted the fix/release-v0.7.12-bottomsheet-deflake branch November 10, 2026 03:45

This branch was successfully deployed

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

Labels

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.

1 participant