|
| 1 | +<!-- SPDX-License-Identifier: MIT --> |
| 2 | +<!-- Part of PyBLE (https://pyble.dev) — see /LICENSE. --> |
| 3 | + |
| 4 | +# C1-S1 — physical iPad TestFlight verification |
| 5 | + |
| 6 | +| Field | Record | |
| 7 | +|---|---| |
| 8 | +| Observed | 25 September 2026, approximately 10:42–10:48 UTC / 17:42–17:48 Asia/Bangkok | |
| 9 | +| Task / story | C1-S1-T03; iPad portion of PYB-001.2 | |
| 10 | +| Result | **Done for verification of the current TestFlight installation**; fresh enrollment and a new installation/update were not performed | |
| 11 | +| Device / OS | Physical `iPad16,10`; iPadOS `26.6.2`, build `23G90`; live device queries and screen captures succeeded | |
| 12 | +| Installed app | `dev.pyble.pyble`, version `0.2.0`, build `6` | |
| 13 | +| Distribution proof | Installed-app metadata reports `SignerIdentity = TestFlight Beta Distribution`, `beta-reports-active = true`, `get-task-allow = false`; the native TestFlight page offers the same version/build with **Open** | |
| 14 | +| Launch | Successful nonterminating activation before and after the TestFlight inspection; captured PyBLE's disconnected screen with **No board connected** | |
| 15 | +| Source mapping | Unresolved; no installed binary was matched to an immutable uploaded archive or source revision | |
| 16 | +| Evidence author | Codex, direct device queries and inspection; no independent human review or usability participant is implied | |
| 17 | +| Related | [Channel ledger](01_Channel_and_Artifact_Ledger.md), [execution record](00_Execution_Record.md), [TestFlight metadata correction](05_TestFlight_Metadata_Correction.md), [Sprint backlog](../06_Sprint_Backlogs.md) | |
| 18 | + |
| 19 | +This retry supersedes the earlier locked-device result for current iPad access |
| 20 | +and installed identity. T03 asks to verify the current TestFlight installation; |
| 21 | +the installed beta and its functioning launch satisfy that bounded task without |
| 22 | +reinstalling an already working app. The combined PYB-001.2 story still needs its |
| 23 | +Android evidence and explicitly retains any unperformed enrollment/install |
| 24 | +criteria. Neither this check nor a completed task qualifies BLE, draft recovery, |
| 25 | +the firmware matrix, or the five-participant pilot. |
| 26 | + |
| 27 | +## Observations and acceptance assessment |
| 28 | + |
| 29 | +| Check | Observed evidence | Assessment / boundary | |
| 30 | +|---|---|---| |
| 31 | +| Live device access | Exact PyBLE query, device details and native screenshot commands succeeded | Earlier unlock/access blocker cleared | |
| 32 | +| Installed identity | CoreDevice and the independent installation-proxy query both report `0.2.0 (6)` | Build is observed on the device; source `pubspec.yaml` was not used to infer it | |
| 33 | +| Existing beta access | The public invitation opened on the iPad, then its actual `itms-beta` link opened PyBLE in the native TestFlight app | Existing account can access this beta; no fresh-account eligibility or country-wide availability claim | |
| 34 | +| Currently offered build | TestFlight shows `0.2.0`, **Build 6**, **Open**, 62 days until expiration, and 21.6 MB; release date is 27 August 2026 | No Update or Install action was offered on the observed page; the relative expiry is only a dated observation | |
| 35 | +| TestFlight origin | Exact installed-app lookup: `TestFlight Beta Distribution`; beta reporting enabled; debugger entitlement disabled | Stronger evidence than an Open button or a matching version alone | |
| 36 | +| Foreground launch | Two successful `devicectl` launch results and screenshots of PyBLE's disconnected screen | Launch smoke passed; About was not opened and its text is not claimed as evidence | |
| 37 | +| Safe existing state | No uninstall, clear-data, replacement build, test runner, board connection, run, or STOP action | Existing data was not deliberately modified; draft contents and persistence were not assessed | |
| 38 | +| Historical/source mapping | Historical build-5 handoff differs from installed build 6; no archive comparison performed | Distribution owner must bind the observed beta to retained build/archive/source evidence | |
| 39 | +| Installation floor | Installed-app metadata reports `MinimumOSVersion = 18.0`; TestFlight build notes describe an iOS/iPadOS 15 rebuild | Reconcile the delivered variant, archive and store eligibility before claiming tested support on iPadOS 15–17 | |
| 40 | + |
| 41 | +CoreDevice reports `builtByDeveloper = true` and `containerAccessible = true` |
| 42 | +for this app. Those booleans are **not** used to classify its signing origin: |
| 43 | +the scoped installation-proxy response identifies TestFlight Beta Distribution. |
| 44 | +Equally, the displayed **Open** action alone would not have established origin. |
| 45 | + |
| 46 | +The installed `MinimumOSVersion` is a fact about the metadata returned for this |
| 47 | +device. It does not establish the universal minimum of all delivered variants, |
| 48 | +prove an App Store Connect configuration error, or demonstrate compatibility on |
| 49 | +an older OS. The distribution owner owns this follow-up alongside source |
| 50 | +mapping. Current-device launch passed on iPadOS 26.6.2 despite this unresolved |
| 51 | +cross-version question. The stale public description remains tracked in the |
| 52 | +[metadata correction packet](05_TestFlight_Metadata_Correction.md). |
| 53 | + |
| 54 | +## Reproducible inspection procedure |
| 55 | + |
| 56 | +| Step | Operation | Result | |
| 57 | +|---|---|---| |
| 58 | +| 1 | Query the live device and exact `dev.pyble.pyble` bundle, including default apps | One matching app; `0.2.0 (6)` | |
| 59 | +| 2 | Activate PyBLE without `--terminate-existing`; capture its screen | Successful launch and disconnected-screen smoke | |
| 60 | +| 3 | Query only `com.apple.TestFlight` | Installed TestFlight `4.3.1 (681.1)` | |
| 61 | +| 4 | Open `https://testflight.apple.com/join/yU4e8s6d` on the iPad | Public PyBLE beta invitation rendered | |
| 62 | +| 5 | Open the invitation's actual `itms-beta://testflight.apple.com/join/yU4e8s6d` link; allow the page to finish loading; capture it | Native TestFlight offered build 6 with Open | |
| 63 | +| 6 | Perform read-only `instproxy_lookup` for only `dev.pyble.pyble` through installed libimobiledevice | Installed signer and beta entitlements established; metadata preserved privately | |
| 64 | +| 7 | Activate PyBLE again without termination, capture the screen, and repeat exact installed identity query | Successful smoke; installed version/build unchanged | |
| 65 | + |
| 66 | +Representative commands, with device identifiers and raw output paths replaced: |
| 67 | + |
| 68 | +```sh |
| 69 | +xcrun devicectl device info details --device '<paired-iPad>' \ |
| 70 | + --json-output '<private-evidence>/device-details.json' |
| 71 | +xcrun devicectl device info apps --device '<paired-iPad>' \ |
| 72 | + --include-default-apps --bundle-id dev.pyble.pyble \ |
| 73 | + --json-output '<private-evidence>/pyble-apps.json' |
| 74 | +xcrun devicectl device process launch --device '<paired-iPad>' \ |
| 75 | + --json-output '<private-evidence>/pyble-launch.json' dev.pyble.pyble |
| 76 | +xcrun devicectl device capture screenshot --device '<paired-iPad>' \ |
| 77 | + --destination '<private-evidence>/pyble-launch.png' |
| 78 | +xcrun devicectl device process openURL --device '<paired-iPad>' \ |
| 79 | + 'https://testflight.apple.com/join/yU4e8s6d' |
| 80 | +xcrun devicectl device process openURL --device '<paired-iPad>' \ |
| 81 | + 'itms-beta://testflight.apple.com/join/yU4e8s6d' |
| 82 | +``` |
| 83 | + |
| 84 | +Tool versions were Xcode `27.0` (`27A266a`), CoreDevice CLI `642.16`, |
| 85 | +libimobiledevice `1.4.0`, and libplist `2.7.0`. The local read-only metadata |
| 86 | +probe starts the standard installation-proxy service and calls |
| 87 | +`instproxy_lookup` with the sole application ID `dev.pyble.pyble`; it neither |
| 88 | +browses unrelated apps nor calls install/uninstall APIs. Its fresh, small C |
| 89 | +source is retained with the raw evidence. Only selected nonpersonal fields |
| 90 | +are published here. |
| 91 | + |
| 92 | +The legacy `idevicescreenshot` command failed because its screenshot service |
| 93 | +was unavailable; native `devicectl device capture screenshot` then succeeded. |
| 94 | +One later launch attempt put device options after the positional app argument |
| 95 | +and returned CLI usage error `64`; the corrected command succeeded. These are |
| 96 | +inspection-tool failures, not observed PyBLE launch failures. Initial captures |
| 97 | +during transitions/loading were not used as final UI evidence. |
| 98 | + |
| 99 | +## Retained evidence |
| 100 | + |
| 101 | +Raw logs, plist/JSON responses, helper source and screenshots remain in the main |
| 102 | +workspace's ignored `local/c1-s1/2026-09-25-retry/ipad/`. They contain private |
| 103 | +device/account context and are excluded from Git. The hashes below identify |
| 104 | +captures, not signed app binaries or a source revision. |
| 105 | + |
| 106 | +| Capture | SHA-256 | Purpose | |
| 107 | +|---|---|---| |
| 108 | +| `device-details.json` | `1b5311b7ae5d5c7d362477c06c9c7d5973bbffc43204717d975c79a1c9af1d9b` | Live model/OS and available developer services | |
| 109 | +| `pyble-apps.json` | `e05fec8dd09a57d1ad3af88180b18cb9b692c273c344a7f86830b731508763a7` | Exact initial installed identity | |
| 110 | +| `pyble-launch.json` | `3be33583b4da503617630396123fa191668332946be5e1ad2643ca9050385bd7` | Successful initial activation | |
| 111 | +| `pyble-launch.png` | `a3c4501b6a8a097f86a581e48c0098d6899c9d3a0b2f995a85e0b5534c12e7ee` | Initial disconnected-screen smoke | |
| 112 | +| `testflight-apps.json` | `3025a8cf7f77741a321c5ff7167e3cce2eb214a5d53f325ff394d972bcec2900` | Exact TestFlight app query | |
| 113 | +| `testflight-app-settled.png` | `cc5d640c8e9ffe3f32873dcdb11bf2f8ee9ba83b20c1d0967477c6f3fe11ed53` | Loaded native PyBLE beta page and offered build | |
| 114 | +| `pyble-installation-proxy.plist` | `442009f522d4641aad8698d730ca9b72e90cc6fbb12bc9410499c124322199d1` | Exact installed signer, beta entitlements, version and minimum OS metadata | |
| 115 | +| `app_lookup.c` | `f0fae980df75eafc22dc595ca3dbecd1d18281461dab17932fd0f9951de9e53c` | Read-only, single-bundle metadata probe source | |
| 116 | +| `pyble-final-launch.json` | `30c488910697ab53e74e38a8782b6a9ff7145d4cd5f99e8483e00fb0ad7079bb` | Successful activation after TestFlight inspection | |
| 117 | +| `pyble-final-v2.png` | `1dc640507bdd80b3542534b4bca919d554d343c4d970f2206ea994cd5cabab72` | Final disconnected-screen smoke | |
| 118 | +| `pyble-apps-final.json` | `aeac713c535d4ccf21cc7cf06b7ee8fbd43afd5c3241e673048e623463288572` | Installed identity unchanged after channel inspection | |
0 commit comments