Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ A Human pairs the phone app with their Host by a one-time QR code, and the phone
## How to get to it (user POV)

- Computer: Bot mode → settings → Devices → Pair a phone. The dialog shows the QR code and a copy link; the Devices list has Revoke.
- Phone: the app opens on "Pair with your computer"; scan the code or paste the link, then tap Pair.
- Phone: first use opens "Pair with your computer". From an existing session: Workspaces → Computers → Pair a new computer. Scan the code or paste the link, then tap Pair. Cloud → Join by link or QR is the separate cloud invitation path; its preview identifies organization membership versus one-channel guest access. The category tabs are the first drawer row; swipe, backdrop, Android Back and accessibility escape dismiss it.

## Driving it with verify-app

Expand Down
21 changes: 21 additions & 0 deletions .github/pr-screenshots/2161-workspace-drawer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Workspace drawer UAT evidence — Batch 22

Draft PR #2170; issue #2161. Runtime `bfb5cc4ec9b5b3029bebd7d544905efa6d2dcd4b`, baseline `d2529feb520ace2d773db6ac0966dc265887bdc5`. Installed native binary `494a20f1eb4f0666a2c90bc3c758af4e7ff5f46b`; its native inputs match. TOB UAT `bf6d896e813457382cd2bb2e7c74b22c03ba01ca`. This commit adds evidence and docs only. Source CI [39104178457](https://github.com/BotHarness/DeepSeekBot/actions/runs/39104178457) passed at the runtime head.

## Observed behavior

- Before: an unpaired user enters the separate Cloud services screen, verifies the saved session, then opens Cloud workspaces. `before-verified-cloud-services.png` captures this prior entry point, not a predecessor drawer with cloud rows.
- After: the cloud header opens the same root Workspaces drawer. The synthetic B account sees its own organization, two member organizations, and a channel-only guest organization. Selecting the member organization lists four channels; selecting the guest organization lists only its invited channel. Organization names may match, but role and instance remain distinct.
- `scope-accepted.json` and `scope-revoked.json` use the actual native session for independent public HTTP readback: no guest-organization membership, sibling denied, filtered directory limited to the granted organization, and revoked grant removed. These checks supplement the UI; they are not screenshots masquerading as API proof.
- An unsent draft survives a real Refresh session action and token rotation. Cold launch restores the directory. The directory itself does not claim verified live identity; Check session separately re-establishes it.
- Revoking only the test grant and reopening removes the guest organization. B sign-out leaves only a sign-in entry; a separately prepared A session after restart shows Owner instead of B's Member/Guest roles. This verifies logout and account change across restart, not an in-place browser account replacement.
- Both native sessions were signed out through the UI. The latest refresh tokens were rejected, baseline sessions retained, and local credentials removed. The temporary fixture files were deleted only after this verification.
- Three Dynamic Type sizes (large, extra-extra-extra-large, accessibility-extra-extra-extra-large) × light/dark: labels wrap, the list scrolls, Create workspace and Cloud services remain reachable. The maximum-size Cloud services action was actually pressed. `workspace-switch.mp4` is a 26-second member→guest navigation recording; the contact sheet was inspected before publication.

## Preserved failures and limits

Initial Metro bound only IPv6 while the launch URL used IPv4; restarting this task's Metro with IPv4-first DNS resolved it. One generic scroll-top command misread the nested scroll surface despite already being at the top; `first-matrix-scroll-failure.png` preserves the scene, and targeted swipes completed the matrix. A cold checkpoint was requested before live identity verification and correctly refused; Check session then passed. An old temporary logout wrapper referenced a removed worktree; the current source wrapper verified logout successfully. No product source fix was needed in this run.

No computer was paired in this Simulator, so computer selection/return was not exercised and no new pairing was introduced. Pagination, error/retry and exact cancelled-request ordering retain source-test evidence only. Android, physical camera, Human/VoiceOver acceptance, new-instance Hosted AuthKit continuation, sender sharing and QR rendering/save remain open. Synthetic API-prepared sessions do not count as a Hosted AuthKit login.

The original large/light settings were restored, only the task's grant/sessions were cleaned up, and its app/driver/Metro were stopped. Existing shared documents, installed app and trusted config, other sessions, physical phone, Hosts and signed Products were preserved. No native build/install/erase, production change or merge.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions .github/pr-screenshots/2161-workspace-drawer/logout-a.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"event": "uat_logout_verified",
"ownSessionRevoked": true,
"latestRefreshRejected": true,
"otherSessionsPreserved": true
}
6 changes: 6 additions & 0 deletions .github/pr-screenshots/2161-workspace-drawer/logout-b.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"event": "uat_logout_verified",
"ownSessionRevoked": true,
"latestRefreshRejected": true,
"otherSessionsPreserved": true
}
80 changes: 80 additions & 0 deletions .github/pr-screenshots/2161-workspace-drawer/proof.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
{
"date": "2026-10-18",
"batch": 22,
"before": "d2529feb520ace2d773db6ac0966dc265887bdc5",
"runtime": "bfb5cc4ec9b5b3029bebd7d544905efa6d2dcd4b",
"native": "494a20f1eb4f0666a2c90bc3c758af4e7ff5f46b",
"uat": "bf6d896e813457382cd2bb2e7c74b22c03ba01ca",
"ci": 39104178457,
"viewport": [402, 874],
"syntheticTestSession": true,
"hostedAuthKitClaim": false,
"nativePassed": [
"header opens shared root drawer",
"member selection lists four organization channels",
"guest organization lists one authorized channel",
"actual native token has no guest-organization membership and sibling access denied",
"refresh rotates token and preserves unsent draft",
"cold directory restores; Check session separately verifies live identity",
"reopening after grant revocation removes guest organization",
"logout clears directory; A fixture after restart shows owner identities instead of B member or guest identities",
"both mobile sessions remote-revoked; latest refresh denied; other baseline sessions retained"
],
"matrix": [
{
"size": "large",
"theme": "light",
"cloudServicesReachable": true,
"createWorkspaceVisibleAfterScroll": true
},
{
"size": "large",
"theme": "dark",
"cloudServicesReachable": true,
"createWorkspaceVisibleAfterScroll": true
},
{
"size": "extra-extra-extra-large",
"theme": "light",
"cloudServicesReachable": true,
"createWorkspaceVisibleAfterScroll": true
},
{
"size": "extra-extra-extra-large",
"theme": "dark",
"cloudServicesReachable": true,
"createWorkspaceVisibleAfterScroll": true
},
{
"size": "accessibility-extra-extra-extra-large",
"theme": "light",
"cloudServicesReachable": true,
"createWorkspaceVisibleAfterScroll": true
},
{
"size": "accessibility-extra-extra-extra-large",
"theme": "dark",
"cloudServicesReachable": true,
"createWorkspaceVisibleAfterScroll": true
}
],
"nativeUntested": [
"computer selection: no computer saved in this simulator; no new pairing added",
"pagination, injected errors/retry and exact cancelled-request ordering: source tests only",
"in-place account replacement without fixture restart",
"Android",
"physical camera",
"Human and VoiceOver acceptance",
"new-instance Hosted AuthKit continuation",
"native sender share and QR generation/save"
],
"cleanup": {
"ownGuestGrantRevoked": true,
"temporarySessionsDeletedAfterRevocationProof": true,
"largeLightRestored": true,
"ownDriverAndMetroStopped": true,
"nativeBuildInstallErase": false,
"prodTouched": false,
"merged": false
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"at": "2026-10-18T07:26:22.637Z",
"usingActualNativeSession": true,
"expectedGuestGrantVisible": true,
"grantRevoked": false,
"noOrganizationMembership": true,
"siblingDenied": true,
"orgFilter": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"at": "2026-10-18T07:29:22.014Z",
"usingActualNativeSession": true,
"expectedGuestGrantVisible": false,
"grantRevoked": true,
"noOrganizationMembership": true,
"siblingDenied": true,
"orgFilter": true
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
26 changes: 26 additions & 0 deletions .github/pr-screenshots/2171-drawer-headers/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Drawer headers — Batch 23

Runtime `4185d28a380bd37f68eafb765d28d24ee947af4a`; base `3be6b52c384812f801d2b9d58013580c0d6e4c0f`; installed native `494a20f1eb4f0666a2c90bc3c758af4e7ff5f46b`. [Runtime CI](https://github.com/BotHarness/DeepSeekBot/actions/runs/39109396184) passed all applicable jobs.

The assigned existing iOS 26 Simulator rendered both views at 402 × 874 in English. Before/after pairs use matching default text, light theme and signed-out data. No new dependency, native build, account login, service mutation or Prod change.

## Results

- Workspace drawer and generic statistics Sheet: default/intermediate/maximum Dynamic Type × light/dark captured and inspected. Long titles wrap; maximum-size close actually clicked in both surfaces. Sheet body was scrolled; the secondary Got it button was partly clipped in the captured position, so this is not a full body-action reachability qualification.
- Normal-size iOS title uses native glass from existing Expo UI. Larger text uses an opaque rounded rectangle. Close is a separate 44pt target. Android source/bundle passed but was not driven natively.
- Workspace close/reopen and backdrop dismissal were actually performed. The 3.7-second recording and 14-cell contact sheet were inspected.
- Real Settings Reduce Transparency toggle was observed checked, App returned to opaque title/close, then the original unchecked state and glass rendering were restored. No app restart was needed for the setting change.
- Original statistics preferences were backed up privately, noticeSeen was temporarily cleared to show the production Sheet, then the original bytes were restored. Development telemetry transport was unconfigured. No telemetry identity or private file is published.

## First failures retained

- Initial sandbox source run could not bind loopback; permitted rerun passed 649 tests / 8 skipped.
- Initial CI rejected comments/useEffect; external-store subscription replaced it. The final source-policy, typecheck, build, affected tests and both mobile bundles passed.
- First native maximum-light glass title became a dark ellipse around multiline text (`first-pass/`). Final runtime uses the rounded opaque large-text treatment; all six cases rerun.
- Initial capture was during bundling and was discarded from final comparisons. First system-switch label click did not toggle the switch; unchecked state and unchanged glass were retained. Actual switch tap then produced checked → opaque → unchecked → glass evidence.

## Boundaries and cleanup

Settings/SheetStack remain unchanged; this does not requalify #2112 or claim every drawer migrated. Android, physical phone, VoiceOver/Human and older-iOS rendering remain unverified. Source and iOS results do not close those gates.

Large/light and Reduce Transparency off restored; original statistics preference file restored byte-for-byte; own App, driver and Metro stopped. Installed app/data/Keychain, signed Products, rollback, three original QA documents, physical-phone lane and all Hosts preserved. No merge.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
38 changes: 38 additions & 0 deletions .github/pr-screenshots/2171-drawer-headers/drawer-matrix.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
[
{
"kind": "drawer",
"size": "large",
"theme": "light",
"closeAccessible": true
},
{
"kind": "drawer",
"size": "large",
"theme": "dark",
"closeAccessible": true
},
{
"kind": "drawer",
"size": "extra-extra-extra-large",
"theme": "light",
"closeAccessible": true
},
{
"kind": "drawer",
"size": "extra-extra-extra-large",
"theme": "dark",
"closeAccessible": true
},
{
"kind": "drawer",
"size": "accessibility-extra-extra-extra-large",
"theme": "light",
"closeAccessible": true
},
{
"kind": "drawer",
"size": "accessibility-extra-extra-extra-large",
"theme": "dark",
"closeAccessible": true
}
]
36 changes: 36 additions & 0 deletions .github/pr-screenshots/2171-drawer-headers/proof.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"issue": 2171,
"pr": 2172,
"base": "3be6b52c384812f801d2b9d58013580c0d6e4c0f",
"runtime": "4185d28a380bd37f68eafb765d28d24ee947af4a",
"native": "494a20f1eb4f0666a2c90bc3c758af4e7ff5f46b",
"ci": 39109396184,
"environment": "local iOS Simulator, existing UAT signed-out configuration",
"viewport": "402x874",
"matrices": {
"drawer": "3 text sizes x light/dark",
"sheet": "3 text sizes x light/dark"
},
"pass": [
"native title material",
"maximum-text close in drawer and sheet",
"drawer close/reopen/backdrop",
"sheet body scroll",
"Reduce Transparency on/opaque and off/glass restored"
],
"unverified": [
"Android native",
"physical phone",
"Human and VoiceOver",
"older iOS native fallback",
"Settings / SheetStack adoption"
],
"cleanup": [
"large/light restored",
"Reduce Transparency restored off",
"original statistics preferences restored byte-for-byte",
"own app/driver/Metro stopped",
"no login or service writes",
"other Hosts and physical phone unchanged"
]
}
38 changes: 38 additions & 0 deletions .github/pr-screenshots/2171-drawer-headers/sheet-matrix.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
[
{
"kind": "sheet",
"size": "large",
"theme": "light",
"closeAccessible": true
},
{
"kind": "sheet",
"size": "large",
"theme": "dark",
"closeAccessible": true
},
{
"kind": "sheet",
"size": "extra-extra-extra-large",
"theme": "light",
"closeAccessible": true
},
{
"kind": "sheet",
"size": "extra-extra-extra-large",
"theme": "dark",
"closeAccessible": true
},
{
"kind": "sheet",
"size": "accessibility-extra-extra-extra-large",
"theme": "light",
"closeAccessible": true
},
{
"kind": "sheet",
"size": "accessibility-extra-extra-extra-large",
"theme": "dark",
"closeAccessible": true
}
]
33 changes: 33 additions & 0 deletions .github/pr-screenshots/2171-drawer-headers/transparency-app.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
Page: ai.botharness.deepseekbot.dev
App: ai.botharness.deepseekbot.dev
Snapshot: 27 visible nodes
Simulator AX snapshot inapplicable (system-surface-host-lingering); used XCTest, which read app content: the system surface host process was still running but no longer presenting.
@e1 [application] "DeepSeekBot Dev"
@e2 [other] "gearshape.fill"
@e3 [image] "gearshape.fill"
@e4 [navigation-bar] "Back"
@e5 [button] "Back"
@e6 [text] "Cloud services"
@e7 [button] "Workspaces"
@e8 [other] "tob-instance-uat"
@e9 [scroll-area] "Import the UAT configuration supplied by your deployer. Cloud sign-in is separate from pairing a computer." [scrollable]
[content below scroll-area hidden]
@e10 [other] [same label as parent]
@e11 [button] "Scan configuration"
@e12 [button] "Paste configuration"
@e13 [text] "https://tob-service-uat.yangmufeng233.workers.dev"
@e14 [text] "UAT"
@e15 [text] "Signed out"
@e16 [button] "Sign in"
@e17 [other] "Workspaces"
@e18 [button] "Close workspaces"
@e19 [scroll-area] "Computers" [scrollable]
[content below scroll-area hidden]
@e20 [other] "Computers"
@e21 [text] "Cloud workspaces"
@e22 [button] "tob-service-uat.yangmufeng233.workers.dev · Sign in to continue"
@e23 [button] "Join with invitation"
@e24 [button] "Create workspace"
@e25 [button] "Pair a new computer"
@e26 [button] "Cloud services"
@e27 [button] "Notifications"
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
Page: com.apple.Preferences
App: com.apple.Preferences
Snapshot: 18 visible nodes
Simulator AX snapshot inapplicable (system-surface-host-lingering); used XCTest, which read app content: the system surface host process was still running but no longer presenting.
@e1 [application] "Settings"
@e2 [navigation-bar] "Back"
@e3 [button] "Back"
@e4 [text] "Display & Text Size"
@e5 [table] "Bold Text"
[content below table hidden]
@e6 [switch] "Bold Text" [unchecked]
@e7 [cell] "Larger Text, On"
@e8 [switch] "Button Shapes" [unchecked]
@e9 [switch] "On/Off Labels" [unchecked]
@e10 [link] "What's new in Display & Text Size…"
@e11 [switch] "Reduce Transparency" [checked]
@e12 [other] "Improve contrast by reducing transparency and blurs on some backgrounds to increase legibility."
@e13 [switch] "Increase Contrast" [unchecked]
@e14 [other] "Increase color contrast between app foreground and background colors."
@e15 [switch] "Differentiate Without Color" [unchecked]
@e16 [other] "Replaces user interface items that rely solely on color to convey information with alternatives."
@e17 [switch] "Prefer Horizontal Text" [unchecked]
@e18 [other] "Prefer horizontal text in languages that support vertical text."
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
Page: com.apple.Preferences
App: com.apple.Preferences
Snapshot: 18 visible nodes
Simulator AX snapshot inapplicable (system-surface-host-lingering); used XCTest, which read app content: the system surface host process was still running but no longer presenting.
@e1 [application] "Settings"
@e2 [navigation-bar] "Back"
@e3 [button] "Back"
@e4 [text] "Display & Text Size"
@e5 [table] "Bold Text"
[content below table hidden]
@e6 [switch] "Bold Text" [unchecked]
@e7 [cell] "Larger Text, On"
@e8 [switch] "Button Shapes" [unchecked]
@e9 [switch] "On/Off Labels" [unchecked]
@e10 [link] "What's new in Display & Text Size…"
@e11 [switch] "Reduce Transparency" [unchecked]
@e12 [other] "Improve contrast by reducing transparency and blurs on some backgrounds to increase legibility."
@e13 [switch] "Increase Contrast" [unchecked]
@e14 [other] "Increase color contrast between app foreground and background colors."
@e15 [switch] "Differentiate Without Color" [unchecked]
@e16 [other] "Replaces user interface items that rely solely on color to convey information with alternatives."
@e17 [switch] "Prefer Horizontal Text" [unchecked]
@e18 [other] "Prefer horizontal text in languages that support vertical text."
Loading
Loading