Back to Motion

Open-PR Landing Plans & Open-Issue Plans

plans/issues/README.md

12.41.016.7 KB
Original Source

Open-PR Landing Plans & Open-Issue Plans

Generated by the improve skill on 2026-06-11 against local main 42bfbe3ed (remote main was 4 commits ahead at 43e508e3e). Two plan sets:

  1. PR plans (pr-<n>.md) — one per open PR (8), each specifying how to make it merge-ready or why/how to close it. Table below.
  2. Issue plans (issue-<n>.md) — one per open issue (115), classified and indexed in the "Issue plans" section further down. Executor: use the /fix skill (.claude/skills/fix/SKILL.md) with the plan file as the argument. Read the plan fully before starting, honor its STOP conditions, run its drift check first, and update your row when done.

Decision gates: rows marked NEEDS-DECISION require the maintainer to edit the Status cell (e.g. to APPROVED, APPROVED-CLOSE, APPROVED-MERGE, or REJECTED) before an executor may act on the gated steps. Everything else is executable as-is.

Execution order & status

PlanPRTitleActionPriorityEffortDepends onStatus
pr-3731#3731Capture-phase drag/press endRebase + merge (note behavior change)P1STODO — merge step NEEDS-DECISION
pr-3728#3728Drag blocked by variant transformRebase + broaden hasTranslate + mergeP1STODO
pr-3748#3748animateLayout batched-commits rewritePort fixture + mergeP1Splan-009 sequencing gateNEEDS-DECISION (plan-009: land first, or accept fixtures as characterization suite?)
pr-3747#3747animateLayout rewrite (v1)Close as superseded by #3748P3Spr-3748 Steps 2–3TODO (auto with pr-3748)
pr-3749#3749Effects/VisualElement unificationResolve threads + compat check + merge after #3748P1Mpr-3748; SVG-projection thread gateNEEDS-DECISION (SVG projection: drop documented, or defensive forward?)
pr-3743#3743Turbopack duplicate re-export fixRebase + invariant test + reporter ping; gated mergeP2Sreporter confirmation OR approvalTODO — merge step NEEDS-DECISION
pr-3727#3727Regression test #2826 (no repro)Close per no-repro policyP3Sapproval gateNEEDS-DECISION
pr-3740#3740turbo 1→2 dependabot bumpClose + @dependabot ignore; gated migration PRP3S+Mmigration gateTODO (close); NEEDS-DECISION (migration)

Status values: TODO | IN PROGRESS | DONE | BLOCKED (one-line reason) | REJECTED (one-line rationale) | NEEDS-DECISION → APPROVED/APPROVED-CLOSE/APPROVED-MERGE/REJECTED.

Dependency notes

  • pr-3748 before pr-3749 — no git conflict (zero file overlap), but the animate-layout HTML fixtures must re-validate on the combination; pr-3749 Step 4 enforces it. Landing 3749 first is possible but forces the same re-run on 3748 anyway.
  • pr-3747 closes via pr-3748 Step 3, but only after pr-3748 Step 2 ports fire-and-forget.html (the one 3747-exclusive fixture). Do not close 3747 early.
  • pr-3727, pr-3740(close), pr-3743 are mutually independent.

Cross-cutting facts executors should know

  • CI flake family: at planning time every red check across the open PRs was a single known-flaky Cypress spec (drag.ts, drag-nested.ts, drag-svg.ts, drag-svg-viewbox.ts, drag-momentum.ts, layout-group.ts, layout.ts, use-scroll-target-late-ref.ts [fixed on main 2026-05-18]) or the Jest real-timer delay.test.ts. First response to a red check after rebase: re-run once. Same spec red twice in a row = real, STOP. A durable fix for the flaky drag suite would unblock every PR at once — worth its own plan if flakes persist (not planned here; out of scope of PR landing).
  • gh pr edit is broken on this repo (Projects Classic GraphQL deprecation). For body/title edits use gh api -X PATCH repos/motiondivision/motion/pulls/<n> -f body=...; gh issue view may also fail — use gh api repos/.../issues/<n>.
  • Branch updates: all non-dependabot PRs are the maintainer's own branches; gh pr checkout <n> && git rebase origin/main && git push --force-with-lease is the standard loop. Dependabot PRs: comment @dependabot rebase instead.
  • No PR has human review; bot (Greptile) findings are triaged inside each plan — do not re-litigate ones a plan marks refuted/cosmetic.

Findings considered and rejected

  • "Fix turbo.json inside dependabot PR #3740": dependabot force-pushes version-only rebases over manual commits on its branches; a standalone migration PR is the durable route.
  • Greptile's "subscription leak on lazy-load re-bind" on #3749: refuted — bindToMotionValue cleans up an existing subscription for the key on both main and the branch (verified during planning). Reply-and-close, don't fix.

Issue plans

One plan per open issue (115 at planning time, 2026-06-11). Executor: run via the /fix skill with the plan file as argument; run each plan's drift check first; honor STOP conditions; update your row when done. Close actions are ALWAYS gated — never close an issue unless the row says APPROVED (or the plan's own gate is satisfied). Classifications:

  • FIX — actionable bug with a fix plan (failing-test-first).
  • VERIFY-FIXED — evidence it was fixed since filing; plan = reproduce on current main, add a regression test where valuable, comment + gated close.
  • NEEDS-REPRO — cannot act; plan = bounded reconstruction attempt, then comment requesting repro + gated close (no repro → no fix).
  • FEATURE — maintainer decision gate first, then design/implementation.
  • COVERED — an existing plan (plans/NNN or pr-NNN) owns it; pointer plan.
  • INVALID/SUPPORT — not a Motion bug / by design / usage question; plan = answer + gated close.

Fix queue (execute in this order)

PlanPriEffAction
issue-3735P1MGuard unguarded window.* across 13 motion-dom files (non-browser runtime crash); shared isBrowser util; node-env failing test first
issue-2280P1MRender-step drops immediate re-schedules (delete-before-execute) — diamond useTransform permanently stale; coordinates with plans 011/012
issue-1207P1SJSAnimation never finishes when calculatedDuration === Infinity (>20s springs); snap-at-8.6s owned by plan 031
issue-3746P1MAnimatePresence enter/exit tracking broken under React.StrictMode; Jest failing-first
issue-1411P1MAllow layoutId to change post-mount (setOptions sync + stack re-registration); prior-art branches referenced
issue-3658P1MuseScroll offsets in position:fixed ancestor — guard canUseNativeTimeline; original repro already fixed in 12.39.0
issue-2416P1MpopLayout alternating opacity-exit failures; Cypress-first diagnosis with verified-fixed fallback
issue-3745P2SPopChild: gate children.props?.ref read on pop !== false (React 18.3 warning)
issue-2611P2SAdd rotateZ to buildProjectionTransform/hasTransform/mixValues
issue-2567P2SDynamic layout prop activation without remount — AFTER issue-1411 (same mechanism)
issue-2609P2SAdd scaleZ to transformPropOrder + matrix parsers
issue-2654P2ScomplexRegex parses matrix3d as matrix + number; guard identifier-embedded digits
issue-2637P2SisValidMotionProp drag* prefix claim wrong — explicit prop set
issue-2365P2SuseSVGProps mutates memoized visualProps (stale styles win); survives PR #3749 — verified
issue-2263P2MStable useMotionRef never re-hydrates swapped ref prop; useInsertionEffect re-hydration
issue-2390P2MResolve var() axis values at drag start (CSS variables break drag)
issue-2024P2MRe-resolve ref dragConstraints per drag start (stale after nested-container scroll); shares fix surface with issue-2342 — run both specs
issue-2342P2MLazy-loaded motion.div breaks dragConstraints; measure-event re-resolution; cross-runs issue-2024
issue-2591P2MReset stale whileHover after drag-end settle via elementFromPoint hit-test
issue-2682P2MSuppress native click after started Reorder drag (gated — behavior change)
issue-2362P2MlayoutId + initial/animate conflict; decision gate on blocking initial when joining live shared stack
issue-2465P2LFixed↔page coordinate-space shared promotes; fixture matrix then design; STOP on #3748/#3749 collision
issue-2317P2Mstop() never settles finished promises → transitionEnd hangs on interrupt; Cypress gate flips VERIFY→FIX
issue-2385P2MScroll reset on layout animation (resetTransform shrinks overflow → scrollTop clamp); repro first
issue-2236P3MDrag inside sticky container: refresh scroll + updateLayout in snapToCursor
issue-2425P3MlayoutRoot || bypasses change detection in didUpdate (Reorder perf); deterministic animation-count spec

Verify-then-close queue (cheap; run gate, comment, gated close)

PlanPriEvidence
issue-1827P1ref-constraints largely fixed by PR #3690 ResizeObserver + cfccb0300; add state-resize regression test
issue-2684P2wait-mode rapid-switch fixed 10427ae38 (12.36.0)
issue-2462P2#2477 merged AND reverted same day — correct the thread; existing test covers
issue-2348P2popLayout offsetParent-relative now; extend fixture with position:fixed
issue-2500P2pause-with-delay fixed 48d3169c7 (12.7.5); add regression tests
issue-2494P220s cut was v10.18 pregeneration bail (removed); pin >20s regression test
issue-2205P2FunctionSegment shipped 12.31.1 — sequences accept callbacks
issue-2483P2late-ref hydration fixed 12.39.0 (5401a9e4a)
issue-2333P2trackContentSize: true shipped 12.29.0, says "Fixes #2333"
issue-2656P2display block→none fixed v11.2.0 (mixVisibility); issue-2563 closes with it
issue-2601P2LazyMotion late-feature animation fixed 12.28.2; add Cypress lock-in
issue-1747P2flick velocity dilution fixed 9f228395e; run drag-momentum gate R18+19
issue-2488P3constraints recalc likely fixed by ResizeObserver commits; Cypress confirm
issue-2405P3popup layout fixes 90a3dfbda/656a77142/ea1448e4b
issue-2338P3four hiding-mode matrix; zero-snapshot + stack-eviction fixes
issue-2234P3wait-mode enter-stuck likely fixed 12.36.0
issue-2238P3bindToMotionValue unsubscribe guard #2773 (v11.4.0)
issue-2610P3useSpring rewritten onto attachSpring; click-spike fixed
issue-2578P3SVG text animation fixed #2841 (v11.13.1)
issue-2450P3SVG animate() dimension gate removed (12.36.0); re-test after pr-3749
issue-2580P3attrX in sequences typechecks today (verified vs built d.ts); add type test

Feature decisions (NEEDS-DECISION gates — maintainer must mark APPROVED first)

PlanPriEffAsk
issue-1725P2MPort YOUR transition.out branch (PR #2951, alive) to v12 — never close as not_planned; issue-2636 is its substance-duplicate
issue-2496P2MrenderFrame manual frame driving: YOUR PR #3521 closed unmerged — revive minimal or close
issue-2204P2Sat: "label+0.2" offset syntax — small real gap, ~10-line fix once syntax approved
issue-1630P2MOpt-in layoutWhileDrag prop (covers issue-2248)
issue-2658P2MKeyboard-accessible Reorder via context moveByOffset
issue-1935P2LlayoutRoot-relative shared layout animation (absorbs issue-2514 scenario)
issue-3173P2LAnimateSuspense — BUILD / DOCS / REJECT gate, then probe-pattern design
issue-2652P2S–MDrop implicit @emotion/is-prop-valid require (breaking; next major)
issue-2579P2MuseInView: re-register when ref.current null at first render (real bug shaped as feature)
issue-2603P3SonReorder second arg {value, from, to}
issue-2189P3S/MscrollXMax/scrollYMax on useScroll, or answer with scrollInfo()
issue-2319P3SPopChild ownerDocument default vs close (existing root prop covers manually)

Needs-repro queue (bounded attempt → comment → gated close)

issue-2791 (P2, defers to plan 032) · issue-1764 (P2, decision-tree repro) · issue-2616 · issue-2514 (consolidate under 1935) · issue-2284 (document projection limitation) · issue-2364 · issue-2662 · issue-2457 · issue-2444 · issue-1831 · issue-1530 · issue-2504 · issue-2255 · issue-2369 · issue-2777

Answer-and-close queue (INVALID/SUPPORT; all closes gated)

issue-2449 + issue-2750 (P2 — prove correctParentTransform workaround for scaled parents, then documented-limitation close) · issue-2546 (pass axis:"x") · issue-2568 (hold-timer recipe) · issue-2538 · issue-2503 · issue-2542 · issue-2636 (dup of 1725) · issue-2714 · issue-2716 · issue-2491 · issue-2246 (maintainer already wontfixed in-thread; execute) · issue-2250 (same) · issue-2598 · issue-2642 · issue-2268 · issue-2261 · issue-2655 · issue-2641 · issue-2260 · issue-2566 · issue-2608 · issue-2509 · issue-2676 · issue-2550 · issue-3737 (NO ACTION — not this repo, maintainer already engaged)

Covered (pointer plans — execute the owning plan)

IssueOwned by
issue-3741, issue-2826, issue-2807, issue-2794pr-3743, pr-3727, pr-3728, pr-3731 respectively
issue-1400plan 018 (multidimensional reorder)
issue-2232, issue-2094plan 016 (LazyMotion warning) — keep open as trackers per plan 016 notes
issue-2563issue-2656 (same root cause, fixed v11.2.0)
issue-2248issue-1630 (layoutWhileDrag)

Cross-cutting execution notes

  • Sequencing: issue-2567 after issue-1411 (same mechanism). issue-2342 ↔ issue-2024 share fix surface — whichever runs first re-runs the other's specs and may flip it to VERIFY-FIXED. issue-1207 coordinates with plan 031; issue-2791 defers to plan 032; issue-2280 lands before plans 011/012 build on it. SVG VERIFY-FIXED plans (2450, 2578) re-test after pr-3749 lands.
  • Deep projection plans (2385, 2425, 1630, 2465, 1411) carry STOP conditions for collision with PR #3748/#3749 — re-read those PRs' state at execution time.
  • CodeSandbox is Cloudflare-blocked (every sandbox link, API and page, verified across all 12 investigation runs). Plans reconstruct repros from issue text; if a reconstruction can't fail, the no-repro policy applies — don't force it.
  • All issue/PR reads via gh api repos/motiondivision/motion/... (gh issue view / gh pr edit hit the Projects-Classic GraphQL bug).
  • Issue rows are NOT pre-listed in a status table (115 rows would drown the PR table) — executors append a line per completed plan under "Execution log" below.

Execution log

(append: date · plan · outcome · PR/comment links)