Watch
1
0
Fork
You've already forked SouveraineOS
0

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:
Fimeg 2026-08-07 12:26:25 -04:00
commit 71f6ce591e

View file

@ -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.