Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
acaafbfdd1 | ||
|
|
5d7b356686 |
|
After Width: | Height: | Size: 186 KiB |
|
After Width: | Height: | Size: 189 KiB |
|
After Width: | Height: | Size: 187 KiB |
|
After Width: | Height: | Size: 186 KiB |
|
After Width: | Height: | Size: 175 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 253 KiB |
|
After Width: | Height: | Size: 254 KiB |
|
After Width: | Height: | Size: 173 KiB |
|
After Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 138 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 134 KiB |
|
After Width: | Height: | Size: 132 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 146 KiB |
|
After Width: | Height: | Size: 233 KiB |
|
After Width: | Height: | Size: 234 KiB |
|
Before Width: | Height: | Size: 329 KiB |
|
Before Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 216 KiB |
|
Before Width: | Height: | Size: 119 KiB |
@@ -0,0 +1,101 @@
|
||||
# Native composer scroll regression
|
||||
|
||||
Commit: `b5e63f716`, pushed to `fix/new-workspace-composer-dock`.
|
||||
|
||||
The dock's dismiss surface is now a sibling behind the content. No JS responder from the dock sits above a native scroll view. New workspace's decorative form containers pass through empty-space touches on iOS; its controls remain touch targets. The `ComposerDock` interface, header dismissal, keyboard drivers, sizing model, and flick classifier are unchanged.
|
||||
|
||||
## Red / green
|
||||
|
||||
The same native swipe on `b68767635` changed **0.00%** of stream pixels, both from the bottom and after returning there and waiting for the scrollbar to fade. The new `stream-moved` assertion failed both captures. With the fix it changed **23.89%** and **26.44%**. [Raw assertion output](red-green.log).
|
||||
|
||||
The assertion ignores the scrollbar rail and requires at least 1% of pixels in the stream region to differ by more than 8 RGB levels. The host scenario submits a 50-line fixture through each real host, waits for the selectable mock model's response to finish and for JS/scrollbars to become idle, swipes natively, returns to the bottom, waits, and swipes again. Draft and New workspace submissions naturally transition to their new chats. Existing assertions, thresholds, inputs and gestures are unchanged.
|
||||
|
||||
| Reproduction | Before native swipe | After native swipe |
|
||||
| --- | --- | --- |
|
||||
| Broken branch, idle at bottom |  |  |
|
||||
| Fixed branch, idle at bottom |  |  |
|
||||
|
||||
## Android
|
||||
|
||||
```sh
|
||||
PASEO_COMPOSER_KEYBOARD_DAEMON_HOST=127.0.0.1:6768 \
|
||||
PASEO_COMPOSER_KEYBOARD_DAEMON_HOME=/home/moboudra/dev/paseo/.dev/paseo-home \
|
||||
npm run test:e2e:composer-keyboard:android
|
||||
```
|
||||
|
||||
**Final full harness: exit 0** on `b5e63f716`. [Raw output](harness-final.log). All original steps passed, plus the common scenario on every host: growth, bounds, retained close/reopen height, hold-delete reset, content/header dismissal, JS-stall motion, and command/file/model/attachment/forge popovers in both keyboard states. The initial run was intentionally stopped after iOS exposed the empty-padding hit-test failure; this final run includes the correction.
|
||||
|
||||
| Origin host | Native swipe after submit | Native swipe after returning to bottom + idle |
|
||||
| --- | ---: | ---: |
|
||||
| Chat | 24.30% | 23.50% |
|
||||
| New agent tab | 24.67% | 25.67% |
|
||||
| New workspace | 24.05% | 24.33% |
|
||||
|
||||
```text
|
||||
PASS host=chat: native stream swipe after submit and after idle at bottom
|
||||
PASS host=workspace-draft: native stream swipe after submit and after idle at bottom
|
||||
PASS host=new-workspace: native stream swipe after submit and after idle at bottom
|
||||
Composer keyboard invariants passed
|
||||
```
|
||||
|
||||
| Android idle swipe | Before | After |
|
||||
| --- | --- | --- |
|
||||
| Chat |  |  |
|
||||
| New agent tab submission |  |  |
|
||||
| New workspace submission |  |  |
|
||||
|
||||
## iOS
|
||||
|
||||
iPhone 16 Pro, iOS 18.6, shared Namespace Mac, isolated `composer-scroll-ios` session. This checkout's Metro was tunneled on 8083 and the daemon on 17668. Both owned processes and the device session were closed afterward; other sessions were left alone.
|
||||
|
||||
Native stream displacement after submit: **28.64%**. After returning to the bottom and waiting: **29.79%**. Slow native pan with keyboard open: **27.82%**, keyboard remained open and input height remained 30 pt. [Native assertions](ios/native-scroll.log), [slow-scroll assertion](ios/slow-scroll.log), [gesture output](ios/composer-scroll-ios-gestures.log).
|
||||
|
||||
| Host | Empty/reset | Cap, after header dismissal, after reopen | Empty-content/header dismissal |
|
||||
| --- | ---: | ---: | --- |
|
||||
| Chat | 30 pt | 298 pt | Passed |
|
||||
| New agent tab | 30 pt | 250 pt | Passed |
|
||||
| New workspace | 30 pt | 333 pt | Passed |
|
||||
|
||||
The first sibling-only implementation failed New workspace's empty-content dismissal on iOS: decorative form padding intercepted hit testing. `box-none` on layout containers and `none` on inert title/spacers fixed that failure; no responder was added above content. [Failing dismissal output](ios/new-workspace-padding-red.log), [passing output](ios/composer-scroll-ios-workspace-final.log).
|
||||
|
||||
A 230-point automated iOS fling still left the keyboard open. The pre-existing classifier is unchanged, and automated iOS flick dismissal remains a QA gap previously recorded for the extraction. This report does not claim a passing flick-dismissal result. Android's existing flick assertions remain in the full harness.
|
||||
|
||||
| iOS state | Before | After |
|
||||
| --- | --- | --- |
|
||||
| Native swipe after submit |  |  |
|
||||
| Native swipe after idle at bottom |  |  |
|
||||
| Slow pan with keyboard open |  |  |
|
||||
| Chat capped header dismissal |  |  |
|
||||
| New agent tab capped header dismissal |  |  |
|
||||
| New workspace capped header dismissal |  |  |
|
||||
|
||||
## Static checks
|
||||
|
||||
```text
|
||||
npm run format: exit 0
|
||||
npm run lint: exit 0; 0 warnings, 0 errors
|
||||
npm run typecheck: exit 0; all workspaces
|
||||
```
|
||||
|
||||
[Format](composer-scroll-format.log), [lint](composer-scroll-lint.log), [typecheck](composer-scroll-typecheck.log).
|
||||
|
||||
## Production APK
|
||||
|
||||
[Install the plain production APK](https://dev-new.tail8fe838.ts.net/paseo-composer-dock-b5e63f716.apk), built from pushed commit `b5e63f7160abe3fe3d7894fb603db2b3d2a2c219`. [Build output](release-build.log), [package metadata](apk-metadata.log), [HTTP verification](apk-http.log).
|
||||
|
||||
```sh
|
||||
cd packages/app
|
||||
npm --prefix ../.. run build:client && CI=1 APP_VARIANT=production npx expo prebuild --platform android --clean --non-interactive && cd android && ./gradlew assembleRelease --no-daemon -q
|
||||
# exit 0; working tree clean afterward
|
||||
# sh.paseo, version 0.8.0, versionCode 8000; target SDK 36; four ABIs
|
||||
# HTTP 200, application/vnd.android.package-archive, 262457899 bytes
|
||||
# SHA-256 b1ee48c1ddd16469ad0b2f257190bde4af3a1fd80666887b59a6a345bf3191a1
|
||||
```
|
||||
|
||||
Installed this APK successfully on the emulator and reran the original reported reproduction. Native stream displacement: **27.74%** from a fresh bottom and **25.07%** after returning to the bottom and waiting. [Assertion output](release/assertions.log), [original reproduction output](release/reproduction.log).
|
||||
|
||||
| Production idle swipe | Before | After |
|
||||
| --- | --- | --- |
|
||||
| Rebuilt APK |  |  |
|
||||
|
||||
PR #4973 remains unmerged, pending physical-phone acceptance of this replacement APK.
|
||||
|
After Width: | Height: | Size: 245 KiB |
|
After Width: | Height: | Size: 268 KiB |
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 269 KiB |
|
After Width: | Height: | Size: 224 KiB |
|
After Width: | Height: | Size: 255 KiB |
|
After Width: | Height: | Size: 253 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 242 KiB |
|
After Width: | Height: | Size: 249 KiB |
|
After Width: | Height: | Size: 249 KiB |
|
After Width: | Height: | Size: 235 KiB |
|
After Width: | Height: | Size: 238 KiB |
|
After Width: | Height: | Size: 260 KiB |
|
After Width: | Height: | Size: 260 KiB |
|
After Width: | Height: | Size: 221 KiB |
@@ -0,0 +1,7 @@
|
||||
HTTP/2 200
|
||||
accept-ranges: bytes
|
||||
content-type: application/vnd.android.package-archive
|
||||
last-modified: Wed, 16 Sep 2026 21:22:53 GMT
|
||||
content-length: 262457899
|
||||
date: Wed, 16 Sep 2026 21:23:03 GMT
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
package: name='sh.paseo' versionCode='8000' versionName='0.8.0' platformBuildVersionName='16' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='16'
|
||||
sdkVersion:'29'
|
||||
targetSdkVersion:'36'
|
||||
native-code: 'arm64-v8a' 'armeabi-v7a' 'x86' 'x86_64'
|
||||
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 244 KiB |
@@ -0,0 +1,39 @@
|
||||
|
||||
> paseo@0.8.0 format
|
||||
> oxfmt .
|
||||
|
||||
(node:3389721) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389855) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389870) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389809) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389852) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389802) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389796) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389790) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389863) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389864) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389777) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389856) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389776) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389817) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389783) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389784) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
(node:3389826) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
Finished in 1520ms on 4547 files using 16 threads.
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
> paseo@0.8.0 lint
|
||||
> oxlint
|
||||
|
||||
Found 0 warnings and 0 errors.
|
||||
Finished in 849ms on 4260 files with 177 rules using 16 threads.
|
||||
@@ -0,0 +1,59 @@
|
||||
|
||||
> paseo@0.8.0 typecheck
|
||||
> npm run typecheck --workspaces --if-present
|
||||
|
||||
|
||||
> @getpaseo/expo-two-way-audio@0.8.0 typecheck
|
||||
> tsgo --noEmit
|
||||
|
||||
|
||||
> @getpaseo/highlight@0.8.0 typecheck
|
||||
> tsgo --noEmit
|
||||
|
||||
|
||||
> @getpaseo/plugin@0.8.0 typecheck
|
||||
> tsgo --noEmit && tsgo -p tsconfig.examples.json --noEmit
|
||||
|
||||
|
||||
> @getpaseo/protocol@0.8.0 pretypecheck
|
||||
> npm run generate:validators
|
||||
|
||||
|
||||
> @getpaseo/protocol@0.8.0 generate:validators
|
||||
> node scripts/generate-validation-aot.mjs
|
||||
|
||||
(node:3390483) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
|
||||
(Use `node --trace-warnings ...` to show where the warning was created)
|
||||
generated src/generated/validation/ws-outbound.aot.ts from codegen/ws-outbound.compile.ts (WSOutboundMessageSchema)
|
||||
|
||||
> @getpaseo/protocol@0.8.0 typecheck
|
||||
> tsgo --noEmit
|
||||
|
||||
|
||||
> @getpaseo/client@0.8.0 typecheck
|
||||
> tsgo --noEmit
|
||||
|
||||
|
||||
> @getpaseo/server@0.8.0 typecheck
|
||||
> tsgo -p tsconfig.server.typecheck.json --noEmit
|
||||
|
||||
|
||||
> @getpaseo/app@0.8.0 typecheck
|
||||
> tsgo --noEmit
|
||||
|
||||
|
||||
> @getpaseo/relay@0.8.0 typecheck
|
||||
> tsgo --noEmit
|
||||
|
||||
|
||||
> @getpaseo/website@0.8.0 typecheck
|
||||
> tsgo --noEmit
|
||||
|
||||
|
||||
> @getpaseo/desktop@0.8.0 typecheck
|
||||
> tsgo --noEmit -p tsconfig.json
|
||||
|
||||
|
||||
> @getpaseo/cli@0.8.0 typecheck
|
||||
> tsgo --noEmit
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
Native swipe moved stream content: 23.89% changed
|
||||
Native swipe moved stream content: 26.44% changed
|
||||
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 71 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 67 KiB |