TASK-60: shell half done; the release was the seam
The awkward hand-off was not the dwell gate — it was committing at whatever shift the thumb left. quickstep travels to the end target first; settleTo does that now. Dwell restored to match prior art. Records the geometry being measured rather than assumed, and two findings that are not this task's: furniture_at() is a stub so synthetic touch cannot reach the pill, and Origin is two-valued so agent touches carry no audit.
This commit is contained in:
parent
f71f0d722a
commit
71f6ce591e
1 changed files with 97 additions and 5 deletions
|
|
@ -1,9 +1,9 @@
|
|||
# TASK 60 — multitasking is a place, not a transition
|
||||
|
||||
**Status: 2026-08-07 (later) — the cards draw, and the transition is being
|
||||
rebuilt around one owner.** Patching the two geometries into agreement failed
|
||||
three times in one session; the plan below replaces them with one. Read
|
||||
"One owner" before touching any of it.
|
||||
**Status: 2026-08-07 (latest) — both halves are built and the strand repro
|
||||
passes on hardware.** The compositor owns the transition geometry; the shell
|
||||
drives it through four verbs and names the card rect once. Read "One owner" for
|
||||
why, then "Shell half: DONE" for what landed.
|
||||
|
||||
## One owner — the rebuild, 2026-08-07
|
||||
|
||||
|
|
@ -100,7 +100,99 @@ package and a session restart.
|
|||
- `focus_border` returns empty while a window is carried — the card owns the
|
||||
frame.
|
||||
|
||||
### Shell half: the next session, and it is well defined
|
||||
### Shell half: DONE 2026-08-07 (`souveraine`)
|
||||
|
||||
`services/ZoneTransition.qml` is the one owner: the card rect, the four verbs,
|
||||
the end-target table, and the clock. `ZoneOverview` and the rail both read it
|
||||
and neither derives a geometry.
|
||||
|
||||
**Deleted, not adapted** — `ViewtopControl.poseActiveZone` / `clearPose` /
|
||||
`_posed`, `zoneCard.scale`, and `GlobalStates.zonePullProgress`. The card's
|
||||
inner `ColumnLayout` went too: its 8 px margin was a second opinion about where
|
||||
a window sits inside its zone. Panes are now the compositor's own tiling scaled,
|
||||
so a split zone draws as what it is.
|
||||
|
||||
**One clock, two strategies.** The rail reports travel and interprets nothing.
|
||||
`ZoneTransition` derives `shift` (what the compositor carries on, clamped) and
|
||||
`presence` (how present the destination is, rising to the detent then receding
|
||||
past it, so a home-bound pull never previews somewhere the release will not go).
|
||||
Two curves is correct; two *places* was the bug, and putting the second one on
|
||||
the rail was the first thing tried here and reverted. TASK-52's rule — one
|
||||
clock, effects as strategies over it — is the same rule as "one owner", a level
|
||||
up, and `pose` is a gravity well borrowed from those primitives, so this is her
|
||||
felt environment, not merely navigation chrome.
|
||||
|
||||
#### What actually made the swipe feel wrong
|
||||
|
||||
Not the dwell gate. **The release committed where the thumb left it.** Lift at
|
||||
60% of the climb and the carry was released at 60%, so the window jumped to its
|
||||
final state with no travel — two motions with a cut between them. Every attempt
|
||||
to fix this by tuning fades was treating the symptom.
|
||||
|
||||
quickstep does not do that (`AbsSwipeUpHandler.handleNormalGestureEnd`):
|
||||
|
||||
```java
|
||||
float endShift = endTarget.isLauncher ? 1 : 0;
|
||||
long expectedDuration = Math.abs(Math.round((endShift - currentShift)
|
||||
* MAX_SWIPE_DURATION * SWIPE_DURATION_MULTIPLIER));
|
||||
duration = Math.min(MAX_SWIPE_DURATION, expectedDuration);
|
||||
startShift = currentShift;
|
||||
```
|
||||
|
||||
`ZoneTransition.settleTo()` is that, with the same numbers — 350 ms cap,
|
||||
multiplier `min(1/0.7, 1/0.3)` from `MIN_PROGRESS_FOR_OVERVIEW`. Every release
|
||||
travels to its destination and commits on arrival, including the abandoned
|
||||
half-swipe (`last_zone`, end shift 0), which is the commonest gesture of all and
|
||||
used to snap.
|
||||
|
||||
Correcting a claim made earlier in this session: the dwell gate was **restored**
|
||||
after reading the source. quickstep gates the same way and the "ever" is a latch,
|
||||
not a level:
|
||||
|
||||
```java
|
||||
recentsAttachedToAppWindow = mHasMotionEverBeenPaused || mIsLikelyToStartNewTask;
|
||||
```
|
||||
|
||||
Removing it went *against* prior art. A fast unpaused flick showing no
|
||||
destination on its way past is correct.
|
||||
|
||||
#### Measured on hardware (`10.10.30.213`, viewtop `r97.g3c853972`)
|
||||
|
||||
- The carry lands where it is told: target `(135,280) 270×520` logical →
|
||||
`(271,561) 539×1035` physical at scale 2.0. `focus_border` correctly absent.
|
||||
- Shell-driven: card `(73.9, 12.0) 392.2×784.4`, scale 0.7263; carried window
|
||||
measured `(148,89)–(931,1590)` against predicted `(147.8,82.1)–(932.2,1592.7)`.
|
||||
- **The strand repro passes**, three times across three shell builds.
|
||||
|
||||
#### The geometry is measured now, not assumed
|
||||
|
||||
`ZoneTransition` took the card's box from `screen.height * 0.78`. The overview
|
||||
`PanelWindow` respects exclusive zones, so its height changes underneath: read
|
||||
once as **1040** (something reserving 40 px) and once as **1080**. The assumption
|
||||
was right today and would have drifted silently the moment the dock reserved.
|
||||
The surface reports its own rect through `measuredAt()`, and `carryState` prints
|
||||
`surface` beside `panelWindow` so a card in the wrong place is *read*, not
|
||||
theorised — the same reason `state` exists at all.
|
||||
|
||||
#### Two findings that are not this task's
|
||||
|
||||
1. **A synthesized touch cannot reach the pill.** `furniture_at()` returns `None`
|
||||
unconditionally and deliberately (`wayland.rs:4490`: *"until the engine
|
||||
publishes a region layout, nothing is furniture and every touch is session
|
||||
content"*), so an agent's `touch_down` on the rail lands on the client window
|
||||
behind it. This is the structural argument for "it has to be a verb" below —
|
||||
the touch path *cannot* drive the pill today. A drawn hand (Casey, 2026-08-07,
|
||||
art in progress) rides on the verbs and does not wait on this.
|
||||
2. **`Origin` is two-valued**, so on-device Ani and a remote caller over the
|
||||
socket are indistinguishable, and an agent touch leaves no trail at all —
|
||||
`is_evidence()` is false by design. Evidence ("does the machine think a human
|
||||
is here") and audit ("who did what") are different questions and only the
|
||||
first is answered. TASK-41's attested producers is where the second lives.
|
||||
|
||||
Still unseen on glass: a split zone's card, which is right by construction
|
||||
(each pane is the compositor's reported rect scaled) but has not been exercised.
|
||||
|
||||
### Shell half: the plan as written (kept for the argument)
|
||||
|
||||
Rewrite the pill and `ZoneOverview` to drive the four verbs instead of posing
|
||||
windows and scaling cards independently.
|
||||
|
|
|
|||
Loading…
Reference in a new issue