cmux NEXT: delete the motion.frameOwner.sharedEdges Debug switch; rule D is the only drag path (FRAME OWNER S2B)

Merged
LA
2d ago
+11-28

FRAME OWNER REFACTOR S2B, the switch deletion. Rule D (#35775, merged as ef400020f122) is the only drag path now: the Debug switch motion.frameOwner.sharedEdges goes. With its default on, nothing changes.

Takes back #35036: its runtime switch motion.frameOwner.sharedEdges. The stage plan deletes each stage's switch after its films and the first dogfood gate.
Takes back #35775: only that switch's doc and help text (rule D's wording), which goes with the switch.

The stage rule: each stage ships behind one runtime switch, and the switch goes after the stage's films and the first dogfood gate.

  • S2B's first dogfood gate passed (pixel-perfect: 8f285364, feat 304c181dbbed, 11/11).
  • The after-merge typing check passed (cmux23 ABBA: commit p99 base 13.71 ms mean, S2B 13.60 ms).
  • Rule D's films passed on its final build (ddf0ac45b40, the receipt in #35775). pixel-perfect films the merged rule D (ef400020f122) again in round ab-s2bm-22.

Changes

  • Removed: MotionTunables.frameOwnerSharedEdges and its catalog entry, and the switch read in DividerDrag.start.
  • DividerDragState.sharedEdges stays as rule D's per-drag flag. It is true from the start, which was the switch's default. A press that cannot hold its line while the screen moves turns it off for its drag, which is then the drag from before S2B. These are the fallbacks the review rounds required:
    • a view offset that still moves;
    • a value the probes cannot move;
    • a row edge;
    • a pane that could show a negative size, also with a clamp's spring taken off.
  • The only places that make a DividerDragState are the three cases of DividerDrag.start, and each set the flag to the switch's value. Nothing read the old false default.
  • The docs no longer name the switch.
  • TabStripFollowsPaneTickTests sets the release's sharedEdges to true (the only value now).
  • schemas/defaults/cmux-next.json still lists the removed tunable (its lines 1110 and 1463 at the base). It is bot-only (#21946): the PR repair drops it (scripts/cmux-next/pr-autofix-apply.sh), and the base autofix commits it after the merge (scripts/cmux-next/base-autofix.sh). So no autofix commit comes on this PR and the head stays 39cce148820; the defaults guard is green on it (it reads the source, with the Codex receipt below).

Changelog

none

Tests

The switch was default on, so the suites already ran the only path that stays. No test set it OFF by its key.

RunRefStepResult
early, stacked on rule D's head before the squash6d2a70ffee8b692f33e84f9cee433013477SharedEdgeDuringSpringTests (18 cases, 0 misses), SharedEdgeCatchFallbackTests, SharedEdgeCameraLimitTests, TabStripFollowsPaneTickTests, DividerModifierDragTests: 5/5 suites pass
final head: those 5 suites + the 26 S2 suites39cce14882025024f592b1cdfbb9277553c29 suites pass (SharedEdgeDuringSpringTests 18/18 cases, 0 misses); PaneMotionWorkTests skips (a bench: CMUX_PANE_BENCH=1)
final head: 32 more layout suites39cce14882067acab64c8b83957e8eda62431 pass; OutOfSightFramesTests skips (it needs CMUX_TEST_REQUIRE_GUI=1)
final head, display fleet run (gui-session-v1 --display): the divider-drag suites39cce14882089facc2f424851b4a52340a8ci-step s2bd-delsw-display-39cce148820-v1 exited 0: 16/16 suites pass (the 3 SharedEdge suites, TabStripFollowsPaneTickTests, DividerDragFollowsPointerTests and the 11 divider-drag and split-motion suites), 61 tests, 0 skipped; 18/18 cases, 0 misses

Probe (the red step): fix/s2bd-delete-probe-e-nomerge (never merge, 9cacab7a060, on this PR's head) turns off rule D's two press guards: a view offset that still moves, and a negative size. Its step e0e7737f8ae17aa0fc60443b (it ran on the Blacksmith overflow, which reports "ended failure") fails these 4 tests, the same as on the earlier stacked head:

  • aPressWhileTheStripCameraMovesTakesTheOldDrag: the press kept rule D;
  • aClampedPressWhoseReleaseCouldShowAPaneUnderZeroTakesTheOldDrag: the press kept rule D, then "drag frame 1: b2 shows a negative size -85.35 x 700.00";
  • aPressWhoseDragCouldCarryAPaneUnderZeroBySpeedTakesTheOldDrag: "drag frame 1: a|b1 gap -97.00 pt, at rest 6.00 pt";
  • panesThatShareAnEdgeShowItAtOnePlaceInEveryFrame(.shrinkColumnDuringInnerSpring): 12 misses, "drag frame 1: a|b1 gap -99.00 pt, at rest 6.00 pt".
    The same probe on the earlier stacked head (6d2a70ffee8 + the probe, step 9564c5728402c14b77b22e88) failed the same 4 tests.

So the per-drag flag and its fallbacks, which this PR keeps, are what the tests need.

Frames

  • Frames: no change. With the switch on (the default), every frame is as before this PR. Only the Debug menu's OFF arm goes.

Films

pixel-perfect's decision: no film round before landing. The gate is the unit evidence above (probe red, green, display run, Codex SHIP): the three start paths set the flag from the tunable, whose default was true, and now it starts true, so the default path is the code the ON films of ef400020f122 judged. Between ef400020f122 and this base, feat changed only ClosingPanes (#35886), which no drag film uses. After this lands, pixel-perfect films the MERGED commit once (3t, 2st, the clamp, the clamp chase on cmux22), with a verdict that names that sha. A failure there is fixed forward.

CI

cmux-next swift test is red with 4 tests that this PR does not cause: 3 fail the same at the base 2b01de7c296 (fleet step 9f553811db6722fe1c8fc898) and at this head (step 19a497093d4d5df34e42da4d), and aSlowRunnerScalesTheMenuBudgets passes on the fleet at both (a timing budget, red on the CI runner only). The table is in the PR comments.

Observed / Not run

  • Observed: the fleet runs above, the prepush gate and check-motion.
  • Not run: films of this head (pixel-perfect's call, above: one film of the merged commit after it lands).

No capture: no visual change.