plans/issues/README.md
Generated by the improve skill on 2026-06-11 against local main 42bfbe3ed
(remote main was 4 commits ahead at 43e508e3e). Two plan sets:
pr-<n>.md) — one per open PR (8), each specifying how to
make it merge-ready or why/how to close it. Table below.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.
| Plan | PR | Title | Action | Priority | Effort | Depends on | Status |
|---|---|---|---|---|---|---|---|
| pr-3731 | #3731 | Capture-phase drag/press end | Rebase + merge (note behavior change) | P1 | S | — | TODO — merge step NEEDS-DECISION |
| pr-3728 | #3728 | Drag blocked by variant transform | Rebase + broaden hasTranslate + merge | P1 | S | — | TODO |
| pr-3748 | #3748 | animateLayout batched-commits rewrite | Port fixture + merge | P1 | S | plan-009 sequencing gate | NEEDS-DECISION (plan-009: land first, or accept fixtures as characterization suite?) |
| pr-3747 | #3747 | animateLayout rewrite (v1) | Close as superseded by #3748 | P3 | S | pr-3748 Steps 2–3 | TODO (auto with pr-3748) |
| pr-3749 | #3749 | Effects/VisualElement unification | Resolve threads + compat check + merge after #3748 | P1 | M | pr-3748; SVG-projection thread gate | NEEDS-DECISION (SVG projection: drop documented, or defensive forward?) |
| pr-3743 | #3743 | Turbopack duplicate re-export fix | Rebase + invariant test + reporter ping; gated merge | P2 | S | reporter confirmation OR approval | TODO — merge step NEEDS-DECISION |
| pr-3727 | #3727 | Regression test #2826 (no repro) | Close per no-repro policy | P3 | S | approval gate | NEEDS-DECISION |
| pr-3740 | #3740 | turbo 1→2 dependabot bump | Close + @dependabot ignore; gated migration PR | P3 | S+M | migration gate | TODO (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.
fire-and-forget.html (the one 3747-exclusive fixture). Do not close 3747
early.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>.gh pr checkout <n> && git rebase origin/main && git push --force-with-lease is the standard loop. Dependabot PRs: comment
@dependabot rebase instead.bindToMotionValue cleans up an existing subscription for the key on both
main and the branch (verified during planning). Reply-and-close, don't fix.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:
| Plan | Pri | Eff | Action |
|---|---|---|---|
| issue-3735 | P1 | M | Guard unguarded window.* across 13 motion-dom files (non-browser runtime crash); shared isBrowser util; node-env failing test first |
| issue-2280 | P1 | M | Render-step drops immediate re-schedules (delete-before-execute) — diamond useTransform permanently stale; coordinates with plans 011/012 |
| issue-1207 | P1 | S | JSAnimation never finishes when calculatedDuration === Infinity (>20s springs); snap-at-8.6s owned by plan 031 |
| issue-3746 | P1 | M | AnimatePresence enter/exit tracking broken under React.StrictMode; Jest failing-first |
| issue-1411 | P1 | M | Allow layoutId to change post-mount (setOptions sync + stack re-registration); prior-art branches referenced |
| issue-3658 | P1 | M | useScroll offsets in position:fixed ancestor — guard canUseNativeTimeline; original repro already fixed in 12.39.0 |
| issue-2416 | P1 | M | popLayout alternating opacity-exit failures; Cypress-first diagnosis with verified-fixed fallback |
| issue-3745 | P2 | S | PopChild: gate children.props?.ref read on pop !== false (React 18.3 warning) |
| issue-2611 | P2 | S | Add rotateZ to buildProjectionTransform/hasTransform/mixValues |
| issue-2567 | P2 | S | Dynamic layout prop activation without remount — AFTER issue-1411 (same mechanism) |
| issue-2609 | P2 | S | Add scaleZ to transformPropOrder + matrix parsers |
| issue-2654 | P2 | S | complexRegex parses matrix3d as matrix + number; guard identifier-embedded digits |
| issue-2637 | P2 | S | isValidMotionProp drag* prefix claim wrong — explicit prop set |
| issue-2365 | P2 | S | useSVGProps mutates memoized visualProps (stale styles win); survives PR #3749 — verified |
| issue-2263 | P2 | M | Stable useMotionRef never re-hydrates swapped ref prop; useInsertionEffect re-hydration |
| issue-2390 | P2 | M | Resolve var() axis values at drag start (CSS variables break drag) |
| issue-2024 | P2 | M | Re-resolve ref dragConstraints per drag start (stale after nested-container scroll); shares fix surface with issue-2342 — run both specs |
| issue-2342 | P2 | M | Lazy-loaded motion.div breaks dragConstraints; measure-event re-resolution; cross-runs issue-2024 |
| issue-2591 | P2 | M | Reset stale whileHover after drag-end settle via elementFromPoint hit-test |
| issue-2682 | P2 | M | Suppress native click after started Reorder drag (gated — behavior change) |
| issue-2362 | P2 | M | layoutId + initial/animate conflict; decision gate on blocking initial when joining live shared stack |
| issue-2465 | P2 | L | Fixed↔page coordinate-space shared promotes; fixture matrix then design; STOP on #3748/#3749 collision |
| issue-2317 | P2 | M | stop() never settles finished promises → transitionEnd hangs on interrupt; Cypress gate flips VERIFY→FIX |
| issue-2385 | P2 | M | Scroll reset on layout animation (resetTransform shrinks overflow → scrollTop clamp); repro first |
| issue-2236 | P3 | M | Drag inside sticky container: refresh scroll + updateLayout in snapToCursor |
| issue-2425 | P3 | M | layoutRoot || bypasses change detection in didUpdate (Reorder perf); deterministic animation-count spec |
| Plan | Pri | Evidence |
|---|---|---|
| issue-1827 | P1 | ref-constraints largely fixed by PR #3690 ResizeObserver + cfccb0300; add state-resize regression test |
| issue-2684 | P2 | wait-mode rapid-switch fixed 10427ae38 (12.36.0) |
| issue-2462 | P2 | #2477 merged AND reverted same day — correct the thread; existing test covers |
| issue-2348 | P2 | popLayout offsetParent-relative now; extend fixture with position:fixed |
| issue-2500 | P2 | pause-with-delay fixed 48d3169c7 (12.7.5); add regression tests |
| issue-2494 | P2 | 20s cut was v10.18 pregeneration bail (removed); pin >20s regression test |
| issue-2205 | P2 | FunctionSegment shipped 12.31.1 — sequences accept callbacks |
| issue-2483 | P2 | late-ref hydration fixed 12.39.0 (5401a9e4a) |
| issue-2333 | P2 | trackContentSize: true shipped 12.29.0, says "Fixes #2333" |
| issue-2656 | P2 | display block→none fixed v11.2.0 (mixVisibility); issue-2563 closes with it |
| issue-2601 | P2 | LazyMotion late-feature animation fixed 12.28.2; add Cypress lock-in |
| issue-1747 | P2 | flick velocity dilution fixed 9f228395e; run drag-momentum gate R18+19 |
| issue-2488 | P3 | constraints recalc likely fixed by ResizeObserver commits; Cypress confirm |
| issue-2405 | P3 | popup layout fixes 90a3dfbda/656a77142/ea1448e4b |
| issue-2338 | P3 | four hiding-mode matrix; zero-snapshot + stack-eviction fixes |
| issue-2234 | P3 | wait-mode enter-stuck likely fixed 12.36.0 |
| issue-2238 | P3 | bindToMotionValue unsubscribe guard #2773 (v11.4.0) |
| issue-2610 | P3 | useSpring rewritten onto attachSpring; click-spike fixed |
| issue-2578 | P3 | SVG text animation fixed #2841 (v11.13.1) |
| issue-2450 | P3 | SVG animate() dimension gate removed (12.36.0); re-test after pr-3749 |
| issue-2580 | P3 | attrX in sequences typechecks today (verified vs built d.ts); add type test |
| Plan | Pri | Eff | Ask |
|---|---|---|---|
| issue-1725 | P2 | M | Port YOUR transition.out branch (PR #2951, alive) to v12 — never close as not_planned; issue-2636 is its substance-duplicate |
| issue-2496 | P2 | M | renderFrame manual frame driving: YOUR PR #3521 closed unmerged — revive minimal or close |
| issue-2204 | P2 | S | at: "label+0.2" offset syntax — small real gap, ~10-line fix once syntax approved |
| issue-1630 | P2 | M | Opt-in layoutWhileDrag prop (covers issue-2248) |
| issue-2658 | P2 | M | Keyboard-accessible Reorder via context moveByOffset |
| issue-1935 | P2 | L | layoutRoot-relative shared layout animation (absorbs issue-2514 scenario) |
| issue-3173 | P2 | L | AnimateSuspense — BUILD / DOCS / REJECT gate, then probe-pattern design |
| issue-2652 | P2 | S–M | Drop implicit @emotion/is-prop-valid require (breaking; next major) |
| issue-2579 | P2 | M | useInView: re-register when ref.current null at first render (real bug shaped as feature) |
| issue-2603 | P3 | S | onReorder second arg {value, from, to} |
| issue-2189 | P3 | S/M | scrollXMax/scrollYMax on useScroll, or answer with scrollInfo() |
| issue-2319 | P3 | S | PopChild ownerDocument default vs close (existing root prop covers manually) |
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
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)
| Issue | Owned by |
|---|---|
| issue-3741, issue-2826, issue-2807, issue-2794 | pr-3743, pr-3727, pr-3728, pr-3731 respectively |
| issue-1400 | plan 018 (multidimensional reorder) |
| issue-2232, issue-2094 | plan 016 (LazyMotion warning) — keep open as trackers per plan 016 notes |
| issue-2563 | issue-2656 (same root cause, fixed v11.2.0) |
| issue-2248 | issue-1630 (layoutWhileDrag) |
gh api repos/motiondivision/motion/... (gh issue view / gh pr edit hit the Projects-Classic GraphQL bug).(append: date · plan · outcome · PR/comment links)