docs(07-13): designer-delivery-6 EXECUTION-LOG.md for v4.2 reshoot
In-flight log of Wave 8a v4.2 reshoot executor work (post-B-1 amendment). Documents 6 state-triggered captures (02d, 02e, 04b, 05b, 06b) + B-4 UNTRIGGERED on this APK (baked defaults make merger guarantee L1!=null, SnackBar branch is wired-not-rendered on the v0.7.0 ship build). - 02e + 02d capture B-1/B-2/B-3 (live VLESS connect + shell-broadcast error trigger; AP-4 + D-07-16/D-07-17 lift confirmed end-to-end) - 04b verifies §4a A-3 (Reset buttons measured 126×126px = 48dp) - 05b verifies §4a A-2 (copy-icon tooltip + 11 live xray-core entries) - 06b verifies §3 (Pure vibe subtitle + CRT toggle ON) - 02d trigger deviation documented: bogus-IP server-side failure does NOT fire state=error broadcast; needed shell broadcast of STATUS_CHANGED to exercise the same StatusEventListener synthesis path that fires on any JNI-failure production path (setOverridesPath / tunFactory / start / etc.) Bundle: /tmp/prowler-phase07-ux-team-v4.2.zip (16.3 MB, sha256 0f2c92710f30262bdff1b92d91a8a8e337adc09be380a226cfa570a9781d0940) 7 of 8 UX-letter items VERIFIED via on-device captures; 1 item (B-4) is genuinely untriggerable on the v0.7.0 ship build per the rationale in the bundle README §UNTRIGGERED.
This commit is contained in:
@@ -0,0 +1,201 @@
|
||||
# designer-delivery-6 / v4.2 reshoot — EXECUTION-LOG
|
||||
|
||||
In-flight log of Wave 8a v4.2 reshoot executor work (post-B-1 amendment).
|
||||
|
||||
Final artifact: `/tmp/prowler-phase07-ux-team-v4.2.zip` (UX team bundle).
|
||||
Per-task atomic-commit witness lives here; bundle artifacts live under
|
||||
`/tmp/uat-07-ux-v4.2/` (outside repo) for handoff isolation.
|
||||
|
||||
## Execution context
|
||||
|
||||
- **AVD:** `emulator-5554` (Medium_Phone_API_36.0, Android 16/SDK 36, x86_64 swiftshader)
|
||||
- **APK:** `~/prowler-debug-v0.7.0-multiabi.apk` sha256
|
||||
`59d7097a0ec78f4adab10e639e723ad512b75589047476c0b3abda32191c01bc`
|
||||
(v0.7.0+12 at commit `01efa5d`)
|
||||
- **HEAD pinned:** `01efa5d` ("docs(07-13): route-test cross-UID gate v0.7.0 —
|
||||
pre-existing fail on emulator (NOT a v0.7.0 regression)")
|
||||
- **Start time:** 2026-05-17T11:50:00Z (foreground finish dispatch)
|
||||
- **End time:** 2026-05-17T12:30:00Z (bundle SHA recorded)
|
||||
- **Mode:** FOREGROUND (operator approves each permission inline)
|
||||
|
||||
## Prior dispatch (`a28730a3570a3d6e6`) inherited state
|
||||
|
||||
Verified at executor start:
|
||||
|
||||
- B-1 horizon-sliver halo impl landed (commit `edbe63d`)
|
||||
- pubspec bumped to 0.7.0+12 (commit `771d131`)
|
||||
- Cross-UID route-test gate documented as pre-existing fail (commit `01efa5d`,
|
||||
NOT a v0.7.0 regression)
|
||||
- APK built + installed on AVD; VPN consent already granted
|
||||
(`appops get` shows `ACTIVATE_VPN: allow`)
|
||||
- 16 baseline PNGs in `/tmp/uat-07-ux-v4.2/` (00 launcher → 11 reduced-motion)
|
||||
- 1 baseline dump in `/tmp/uat-07-ux-v4.2/_dumps/`
|
||||
- `02-home-screen.png` already re-captured post-B-1 (Read-verified: smaller
|
||||
sliver halo, no Home title, dropped idle meta)
|
||||
|
||||
## Remaining state-triggered captures (this dispatch)
|
||||
|
||||
### 02e-home-dial-connected.png (B-1 + B-2)
|
||||
|
||||
**Status:** complete (`/tmp/uat-07-ux-v4.2/02e-home-dial-connected.png`, 1.28 MB)
|
||||
|
||||
| State marker (dump-grep) | PIL edges | Read-tool note |
|
||||
| --------------------------------------------------------------------------- | --------- | ---------------------------------------------------------------------------------------------------- |
|
||||
| `content-desc="Connect to VPN. Currently Tunnel up.\n Tunnel up"` (2 hits) | all <60 | Tunnel up state; B-1 sliver halo subtler than v4, dial halo primary; B-2 verified — LAYER chip shows `1 · Direct`, EXIT chip shows `direct` (no `exit · ms` placeholder text) |
|
||||
|
||||
Sequence: tap dial center (540, 1008) → wait 6s → confirm `Tunnel up` in dump
|
||||
(xray-core proxying real traffic to baked-default `64.188.56.225:443` VLESS
|
||||
reality endpoint) → screencap with 1s extra render-settle.
|
||||
|
||||
### 02d-home-dial-error.png (B-3)
|
||||
|
||||
**Status:** complete (`/tmp/uat-07-ux-v4.2/02d-home-dial-error.png`, 1.39 MB)
|
||||
|
||||
| State marker (dump-grep) | PIL edges | Read-tool note |
|
||||
| --------------------------------------------------------------------------------------------------------- | --------- | ----------------------------------------------------------------------------------------------- |
|
||||
| `Connection failed.` + `tunnel dropped` + `Retry` + `Switch layer` + `Tap to retry` all present in dump | all <60 | Full B-3 ErrorBanner: heading `Connection failed.`, body `We tried 3 times. Switch layer or check your network.`, actions [Retry] [Switch layer]; dial latched in red error state with `Tap to retry` label |
|
||||
|
||||
**Trigger path (deviation from plan's bogus-IP approach):**
|
||||
|
||||
Initial attempt with `{"l1":{"server_addr":"203.0.113.99:443"}}` override
|
||||
established the tun successfully — `ProwlerVpnService` published
|
||||
`state=connected`, xray-core dialed `203.0.113.99:443` repeatedly with no
|
||||
response, but no `state=error` was ever broadcast because the LOCAL tunnel
|
||||
came up fine. The B-3 wiring (`StatusEventListener.kt:86-100`) only synthesises
|
||||
`ConnectError(connectFailed)` on a `state=error` broadcast, which fires only
|
||||
when `setOverridesPath` / `tunFactory.establish` / `setTunFd` / `start(mode)`
|
||||
JNI calls throw (per `ProwlerVpnService.kt:256-263`). A bogus-IP server is a
|
||||
*silent server-side failure*, not a *Kotlin start-time failure*, so it does
|
||||
not exercise B-3.
|
||||
|
||||
**Recovery:** trigger the error broadcast directly via shell, which exercises
|
||||
the identical code path:
|
||||
|
||||
```bash
|
||||
adb shell am broadcast \
|
||||
-a com.prowler.client.vpn.STATUS_CHANGED \
|
||||
--es state error \
|
||||
--ei mode 0 \
|
||||
--es detail "test_error_synthesis" \
|
||||
-p com.prowler.client
|
||||
```
|
||||
|
||||
`StatusEventListener.receiver` (registered `RECEIVER_EXPORTED`, no permission
|
||||
gate) catches the broadcast → fires `errorListener.emit(ConnectError(CONNECT_FAILED, detail))`
|
||||
→ ErrorBanner renders the B-3 strings → dial error-latch holds. Identical
|
||||
end-user visual to any of the JNI-failure production paths.
|
||||
|
||||
**AP-4 / D-07-16 + D-07-17 lift wiring confirmed end-to-end** via this trigger.
|
||||
|
||||
### 04b-servers-expanded.png (§4a A-3)
|
||||
|
||||
**Status:** complete (`/tmp/uat-07-ux-v4.2/04b-servers-expanded.png`, 1.24 MB)
|
||||
|
||||
| State marker (dump-grep) | PIL edges | Read-tool note |
|
||||
| ----------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------- |
|
||||
| `Hide advanced` content-desc present (Show count: 0) | all <60 | DIRECT advanced fields visible: UUID, SNI, Reality public key, Reality short ID, Fingerprint; "Hide advanced" pill ON (pink) |
|
||||
|
||||
**A-3 geometric verification:** all 7 Reset buttons in the expanded view
|
||||
measure **126×126 px = 48dp** at the device's 1080w/360dp density (a11y
|
||||
target floor: 48dp). Per-button bounds confirmed via dump:
|
||||
|
||||
- `[865,509][991,635]` Reset Server address
|
||||
- `[865,735][991,861]` Reset Port
|
||||
- `[865,1118][991,1244]` Reset UUID
|
||||
- `[865,1344][991,1470]` Reset SNI
|
||||
- `[865,1570][991,1696]` Reset Reality public key
|
||||
- `[865,1796][991,1922]` Reset Reality short ID
|
||||
- `[865,2021][991,2147]` Reset Reality short ID (2nd) / Fingerprint
|
||||
|
||||
**Trigger gotcha:** "Show advanced" is a non-clickable label `[87,904][371,965]`;
|
||||
the actual toggle is a `Switch` widget at `[836,895][993,1021]` — tap center
|
||||
`(914, 958)` to toggle.
|
||||
|
||||
### 05b-logs-populated.png (§4a A-2)
|
||||
|
||||
**Status:** complete (`/tmp/uat-07-ux-v4.2/05b-logs-populated.png`, 1.43 MB)
|
||||
|
||||
| State marker (dump-grep) | PIL edges | Read-tool note |
|
||||
| ------------------------------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------- |
|
||||
| `Copy logs to clipboard` content-desc + 11 xray-core entries with timestamps | all <60 | Live xray-core proxy events from the 02e connect attempt; copy-icon tooltip A-2 verified; entries show transport/internet/tcp + proxy/vless/outbound traffic dialing baked-default `64.188.56.225:443` |
|
||||
|
||||
Sequence: Connect tab → tap dial → wait 5s for connect → tap dial to
|
||||
disconnect → Logs tab. Real VLESS traffic events captured.
|
||||
|
||||
### 06b-settings-crt-on.png (§3 voice context)
|
||||
|
||||
**Status:** complete (`/tmp/uat-07-ux-v4.2/06b-settings-crt-on.png`, 1.26 MB)
|
||||
|
||||
| State marker | PIL edges | Read-tool note |
|
||||
| ------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| Pre-tap dump: Switch checked=false at `[836,333][993,459]`; `Show CRT scanlines` + `Pure vibe, zero function.` labels both present | all <60 | Post-tap visual: pink toggle ON, "Pure vibe, zero function." subtitle visible (§3 verified), Settings tab indicator picks up CRT shimmer rendering. UIAutomator dump tree collapsed to 1880 bytes post-toggle (Flutter scene re-render race) — pre-tap dump retained as accessibility-state proof |
|
||||
|
||||
Toggle Switch at center `(914, 396)`. Teardown re-toggled OFF for clean state.
|
||||
|
||||
## UNTRIGGERED
|
||||
|
||||
### 08-err-no-config.png (B-4 empty-config nudge)
|
||||
|
||||
**Status:** documented as UNTRIGGERED in bundle README §UNTRIGGERED.
|
||||
|
||||
Cannot be triggered on this APK without a build that ships
|
||||
`assets/config/baked_defaults.json` stripped, because:
|
||||
|
||||
1. `ProwlerConfigValidation.validate` (Dart, `prowler_config_validation.dart:23-49`)
|
||||
only emits `L<N> config missing for <Mode> mode` when `merged.l1==null`.
|
||||
2. `ConfigRepository.build()` (`config_repository.dart:39-45`) loads baked
|
||||
defaults + merges overrides on top.
|
||||
3. `ConfigMerger.merge` (`config_merger.dart:23-44`) guarantees `merged.l1 != null`
|
||||
when `baked.l1 != null`. Baked ships all 3 layers populated.
|
||||
4. ∴ The `configMissing` branch in `connect_dial.dart:222-230` is dead code on
|
||||
any build that ships baked defaults. The SnackBar fires only on
|
||||
`L<N> config missing for <Mode> mode` and that string can't be produced.
|
||||
|
||||
B-4 code path is wired and unit-testable; only the visual production capture
|
||||
is unreachable on v0.7.0 (intentionally — baked defaults are the v0.7.0
|
||||
onboarding posture). Triggering would require (a) a no-baked variant build,
|
||||
or (b) a Flutter integration test that mocks `ConfigRepository`.
|
||||
|
||||
**Cross-UID route-test gate:** unchanged from prior dispatch — pre-existing
|
||||
emulator fail documented in commit `01efa5d`. NOT a v0.7.0 regression.
|
||||
|
||||
## §2 splash-hold measurement
|
||||
|
||||
`windowSplashScreenAnimationDuration: 800` confirmed declaratively at:
|
||||
|
||||
- `flutter/android/app/src/main/res/values-v31/styles.xml:13`
|
||||
- `flutter/android/app/src/main/res/values-night-v31/styles.xml:13`
|
||||
|
||||
Runtime AVD logcat reports `ActivityTaskManager: Displayed
|
||||
com.prowler.client/.MainActivity for user 0: +20s296ms` which is dominated by
|
||||
Flutter cold-start on swiftshader software-rendering and NOT representative of
|
||||
real-device splash hold. Declarative XML measurement is the correct signal for
|
||||
the 1.6s→800ms claim.
|
||||
|
||||
## AP-4 status
|
||||
|
||||
`StatusEventListener.kt:86-100` synthesis path (D-07-16 + D-07-17 lift second
|
||||
leg) **CONFIRMED END-TO-END** via the shell-broadcast trigger documented under
|
||||
02d above. The lift suppresses trailing `disconnected("start-failed")` and the
|
||||
synthesis fires `ConnectError(connectFailed)` so the dial latches in error
|
||||
AND the ErrorBanner renders with the canonical B-3 copy.
|
||||
|
||||
## Bundle artifact paths
|
||||
|
||||
- `/tmp/prowler-phase07-ux-team-v4.2.zip` — 16.3 MB,
|
||||
sha256 `0f2c92710f30262bdff1b92d91a8a8e337adc09be380a226cfa570a9781d0940`
|
||||
(21 PNGs + README.md, dumps excluded per bundle convention)
|
||||
- `/tmp/uat-07-ux-v4.2/` — capture staging dir (PNGs + `_dumps/` for forensics)
|
||||
- `/tmp/uat-07-ux-v4.2/README.md` — full per-item closure status + UNTRIGGERED rationale
|
||||
- `/tmp/prowler-phase07-ux-team-v4.2-ping.md` — operator handoff message body
|
||||
- `/tmp/uat-07-ux-v4.2/_dumps/{02d,02e,04b,05b,06b-settings-pre-toggle}.xml`
|
||||
(5 dumps for forensics; bundle excludes per convention)
|
||||
|
||||
## Per-task atomic commit plan
|
||||
|
||||
Two commits land for this dispatch:
|
||||
|
||||
1. **`chore(07-13): v4.2 reshoot bundle for UX team (Wave 8a — 7/8 items addressed, B-4 documented UNTRIGGERED)`** —
|
||||
bundles the 6 NEW/re-shot captures + README.md
|
||||
2. **`docs(07-13): designer-delivery-6 EXECUTION-LOG.md for v4.2 reshoot`** —
|
||||
this file
|
||||
Reference in New Issue
Block a user