Skip to content

spec(AST-057): flick opens, tap closes, full swipe confirms (FR4/FR5/FR7) - #9156

Merged
cixzhang merged 1 commit into
mainfrom
spec/ast057-swipe-amendment
Oct 31, 2026
Merged

cixzhang merged 1 commit into
mainfrom
spec/ast057-swipe-amendment

Conversation

@cixzhang

Copy link
Copy Markdown
Contributor

People who swipe a list row on a phone stop losing messages and pages by accident. A quick flick only opens or closes the row and never fires Delete. A tap on an open row closes it instead of opening the item. A long swipe shows which action will run before the finger lifts, and backing out cancels it. Mouse, keyboard and screen-reader paths are unchanged.

Exact decision needed

How a swipe-action row (Item, ListItem) settles a release, and what closes an open row: spec:AST-057 FR4, FR5, FR7 and AR3.

Existing authority searched

Decision

  • FR5: under reveal, a release goes by its speed first: a fast one goes the way the row is moving; a slower one opens past half the panel's width. Speed alone never fires an entry. Dragged past the confirm point, the row runs ahead and the outermost entry covers it while the finger is down. A lift there fires that entry. Coming back short of the confirm point closes the row and fires nothing. A disabled outermost entry never confirms. Under commit, only a lift past the confirm point fires. onActivate fires once the row's content has left its box.
  • FR4: while a full swipe is confirmed, the outermost entry alone covers the uncovered space.
  • FR7: an open row closes when a pointer lands outside it, on a touch tap on its own content, on a scroll while focus is outside its open panel, on Escape, on firing an entry, and on unmount. Rows settling open count as open. The tap activates nothing and paints no press, an exception to spec:AST-094 FR11's cell profile.
  • AR3: the primary's activation is unchanged while the row is closed. While it is open, a touch tap closes it; keyboard activation is unchanged.
  • Full swipe stays on by default under reveal, as before. No public API changes.
  • The two Public API rows that restated the old timing and fling rule (onActivate, Item.swipeBehavior) now point at FR5. The verification rows for FR4–FR6, FR7 and AR1–AR3 name the new states and failures.

Rejected alternatives

  • A confirmation dialog on a destructive full swipe: the covering entry already shows what a lift will do and backing out cancels; a caller that wants a dialog opens one from onActivate.

Claim scope and non-goals

  • Only FR4, FR5, FR7 and AR3 change, plus the matching verification rows and two Public API rows that restated FR5.
  • Not covered: how the row moves (FR2, DEC-5), and gesture constants (confirm point, release speed), which stay behaviour constants in source.

Evidence and implementation relationship

Writing rubric results

  • R1 narration: none in the changed text; every new sentence states behaviour in the present tense. One pre-existing stale statement remains outside this decision: the Verification section's "Known verification gap" still calls the record draft.
  • R2 research in the record: none; the iOS parity comparison lives in this description.
  • R3 evidence naming a change: none; the FR5 basis stays UIKit performsFirstActionWithFullSwipe.
  • R4 rejected alternatives over one line or outside a decision: none added.
  • R5 pull request or issue references remaining: one pre-existing reference in DEC-2's "Rejected" line, untouched by this change; none added.
  • R6 ruled open questions still listing options: none; Open questions reads "None."

Scope

  • This PR contains specification records only.
  • It records observable behavior and preserves equivalent internal implementations.
  • Any named internal mechanism is intentionally public, names its dependent caller/system, and explains why an equivalent implementation would not satisfy the contract.
  • Verification states the evidence layer and failure signal without prescribing CI job/workflow topology.
  • It records one intentional durable decision, not a rescue for a separable tagalong.
  • The canonical knowledge owner, affected current claims, and overlapping open work are named; any ownership collision is resolved or called out for human decision.
  • Adjacent API, visual, accessibility, composition, and implementation facts remain outside scope unless this exact decision depends on them.
  • Public text and artifacts contain no internal Meta context.

Validation

  • pnpm check:knowledge: "Knowledge templates and records are aligned."
  • Prettier: applied to the record.
  • git diff --check: clean.

@vercel

vercel Bot commented Oct 31, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated
astryx Building Building Preview Oct 31, 2026 4:15pm UTC

Request Review

@astracat-bot

astracat-bot Bot commented Oct 31, 2026

Copy link
Copy Markdown

AI review status for this pull request.

Review status Updated
🔄 In progress (for maintainers only) Oct 31, 2026, 4:15 PM UTC

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Meta Open Source bot. label Oct 31, 2026
@github-actions github-actions Bot added the needs:spec-owner-review Current knowledge records await owner approval label Oct 31, 2026
@cixzhang

Copy link
Copy Markdown
Contributor Author

/approve-spec 3dc4e01

@github-actions github-actions Bot removed the needs:spec-owner-review Current knowledge records await owner approval label Oct 31, 2026
@cixzhang
cixzhang merged commit b234968 into main Oct 31, 2026
44 of 45 checks passed

This branch was successfully deployed

1 active deployment
Preview — 3dc4e013 Deployed Oct 31, 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