Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
89c3f9aca0 |
|
Before Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 189 KiB |
|
Before Width: | Height: | Size: 187 KiB |
|
Before Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 175 KiB |
|
Before Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 222 KiB |
|
Before Width: | Height: | Size: 253 KiB |
|
Before Width: | Height: | Size: 254 KiB |
|
Before Width: | Height: | Size: 173 KiB |
|
Before Width: | Height: | Size: 156 KiB |
|
After Width: | Height: | Size: 256 KiB |
|
After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 233 KiB |
|
Before Width: | Height: | Size: 234 KiB |
|
After Width: | Height: | Size: 329 KiB |
|
After Width: | Height: | Size: 186 KiB |
|
After Width: | Height: | Size: 216 KiB |
|
After Width: | Height: | Size: 119 KiB |
@@ -1,101 +0,0 @@
|
||||
# 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.
|
||||
|
Before Width: | Height: | Size: 245 KiB |
|
Before Width: | Height: | Size: 268 KiB |
|
Before Width: | Height: | Size: 244 KiB |
|
Before Width: | Height: | Size: 269 KiB |
|
Before Width: | Height: | Size: 224 KiB |
|
Before Width: | Height: | Size: 255 KiB |
|
Before Width: | Height: | Size: 253 KiB |
|
Before Width: | Height: | Size: 222 KiB |
|
Before Width: | Height: | Size: 222 KiB |
|
Before Width: | Height: | Size: 242 KiB |
|
Before Width: | Height: | Size: 249 KiB |
|
Before Width: | Height: | Size: 249 KiB |
|
Before Width: | Height: | Size: 235 KiB |
|
Before Width: | Height: | Size: 238 KiB |
|
Before Width: | Height: | Size: 260 KiB |
|
Before Width: | Height: | Size: 260 KiB |
|
Before Width: | Height: | Size: 221 KiB |
@@ -1,7 +0,0 @@
|
||||
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
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
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'
|
||||
|
Before Width: | Height: | Size: 244 KiB |
|
Before Width: | Height: | Size: 244 KiB |
|
Before Width: | Height: | Size: 244 KiB |
|
Before Width: | Height: | Size: 244 KiB |
|
Before Width: | Height: | Size: 244 KiB |
@@ -1,39 +0,0 @@
|
||||
|
||||
> 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.
|
||||
@@ -1,6 +0,0 @@
|
||||
|
||||
> paseo@0.8.0 lint
|
||||
> oxlint
|
||||
|
||||
Found 0 warnings and 0 errors.
|
||||
Finished in 849ms on 4260 files with 177 rules using 16 threads.
|
||||
@@ -1,59 +0,0 @@
|
||||
|
||||
> 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
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
Native swipe moved stream content: 23.89% changed
|
||||
Native swipe moved stream content: 26.44% changed
|
||||
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 67 KiB |