Skip to content

Commit 1b89a05

Browse files
committed
[docs] record app 0.2.0 build 5 TestFlight handoff
Signed-off-by: Viwat Vchirawongkwin <viwat.v@chula.ac.th>
1 parent 8f8dd32 commit 1b89a05

2 files changed

Lines changed: 192 additions & 0 deletions

File tree

‎docs/README.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ bundled offline examples required by its own product contracts.
5252

5353
## Testing and release handoff
5454

55+
- [PyBLE 0.2.0 (5) TestFlight description and test
56+
plan](testing/testflight/0.2.0-build-5.md)
5557
- [PyBLE 0.1.0 (4) TestFlight description and test
5658
plan](testing/testflight/0.1.0-build-4.md)
5759

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
# PyBLE 0.2.0 (5) TestFlight test description
2+
3+
This document contains the English (`en-US`) TestFlight copy and test plan for
4+
PyBLE app version `0.2.0`, build `5`. It is written for external beta testers
5+
updating from TestFlight build `0.1.0 (4)`.
6+
7+
- App bundle ID: `dev.pyble.pyble`
8+
- App source: `8f8dd32010fac9b2b636f57f9044fd040565e0dd`
9+
- PBLE/1 baseline: `PBLE/1`
10+
- Qualified board-agent release: `0.6.0`
11+
- TestFlight channel: public external beta
12+
- Minimum iOS/iPadOS encoded by this historical build: `13.0`
13+
- Transporter advisory observed during upload: `90068` (Apple's announced
14+
Spring 2027 minimum becomes iOS/iPadOS 15)
15+
16+
## Transporter artifact handoff
17+
18+
- Prepared: `2026-08-27`
19+
- IPA filename: `PyBLE-0.2.0-build-5-8f8dd32.ipa`
20+
- IPA size: `22,409,046` bytes
21+
- IPA SHA-256:
22+
`e2e44019aafd6b75f1d281a7cf4fb49d3ef7f326a4d604f2900ad249af70f2af`
23+
- Signing: Apple Distribution / App Store provisioning for
24+
`dev.pyble.pyble`
25+
- Matching archive and dSYMs: retained outside Git with the local handoff
26+
artifact
27+
28+
The IPA has passed the repository's strict local App Store payload validator,
29+
including code-signature, nested-code, and Xcode software-information checks.
30+
That validator did not evaluate Apple's later-announced Spring 2027 deployment
31+
floor. The retained IPA and archive therefore remain exact iOS/iPadOS 13
32+
artifacts and MUST NOT be relabelled or re-exported as iOS/iPadOS 15. Future
33+
source raises the project floor through a clean rebuild; this record claims no
34+
corrected build-6 upload. This preparation record also does not claim that App
35+
Store Connect accepted or processed build 5.
36+
37+
Apple treats the Beta App Description as app-level information and What to Test
38+
as build-specific information. Paste only the text inside the corresponding
39+
plain-text blocks into App Store Connect. Keep tester or reviewer credentials
40+
out of both fields; PyBLE does not require an account or test credentials.
41+
42+
## Beta App Description
43+
44+
```text
45+
PyBLE is a free, open-source, tablet-first MicroPython IDE. It connects an iPad to a compatible board running the PyBLE agent over Bluetooth Low Energy, so you can edit, save, run, and stop MicroPython programs, view live console output, manage board files, and build programs with offline Blocks—without Wi-Fi onboarding or an account.
46+
47+
Build 5 starts the PyBLE 0.2.0 beta. The GitHub importer now opens with the editable official PyBLE examples repository, offers an easy public-branch chooser while retaining advanced tag or commit entry, and guides protected root targets into a child folder. Files now supports reviewed deletion of multiple visible regular files and keeps its actions on one responsive toolbar row. GitHub import remains the app's only Internet-dependent workflow; imported code is never opened or run automatically.
48+
```
49+
50+
## What to Test
51+
52+
```text
53+
Build 5 adds five focus areas to TestFlight build 4:
54+
55+
1. Open About and confirm version 0.2.0 (5). Connect to a board running qualified PyBLE firmware v0.6.0 and confirm the Board ID and agent version remain correct through Run, Stop, disconnect, and reconnect.
56+
57+
2. In Files, open “Import examples from GitHub.” Confirm Public repository URL starts with https://github.com/PyBLE-dev/examples and remains editable. Confirm the branch-only chooser loads, marks the default branch, and lets you search or select another available branch. Browse main and confirm a full pinned commit SHA appears. Advanced mode must still allow a branch, tag, or commit.
58+
59+
3. At the board root, browse to examples/capabilities/buses/i2c_scan and select pyble_i2c_scan.py. Review must stop before writing and guide you to a child folder such as /examples. Close Import, create and enter that folder, reopen Import, repeat the selection, and confirm the exact child-folder destination before importing. The imported file must not open or run automatically.
60+
61+
4. In one disposable child folder, prepare two or more regular files. Enter selection with Select files or a long press, toggle individual files, and try Select all shown. Folders and board-protected entries must not be selectable. Choose Delete selected and confirm the dialog lists the exact folder and filenames. Cancel once and verify nothing is removed; repeat, confirm deletion, and verify the Files list and deleted count are accurate.
62+
63+
5. Rotate between portrait and landscape. In a compact Files pane, Select files and GitHub import should remain directly visible on one row while Refresh, New file, New folder, and Upload appear under More file actions. A roomy pane should show all six actions on one row. Please also test 2× text size and, if available, keyboard navigation.
64+
65+
With a selection or delete confirmation open, disconnect and reconnect once. Stale selection and the old board listing must disappear without deleting anything.
66+
67+
Please recheck scanning, Save, Run, Stop, console output, ordinary single-file operations, and offline Blocks for regressions. Report the iPad model, iPadOS version, exact firmware profile, Board ID, agent version, pinned GitHub commit when relevant, steps taken, and expected versus actual behavior.
68+
```
69+
70+
## Tester setup
71+
72+
1. Back up the board before provisioning. Installing PyBLE firmware erases its
73+
existing flash workspace.
74+
2. Install qualified firmware v0.6.0 from
75+
[pyble.dev/flash](https://pyble.dev/flash), choosing only the exact profile
76+
that matches the board and memory topology:
77+
- `esp32-4mb`
78+
- `esp32-s3-n16r8`
79+
- `waveshare-esp32-s3-lcd-147b`
80+
- `esp32-c3-4mb`
81+
- `rpi-pico2-w`
82+
3. Provision an ESP profile from a supported desktop Chromium browser. For
83+
Pico 2 W, use the verified UF2 download and copy it in BOOTSEL mode. iPadOS
84+
cannot perform either wired provisioning workflow.
85+
4. Power the board, keep it nearby, and allow Bluetooth access when PyBLE asks.
86+
Stock MicroPython without a conforming PyBLE agent will not appear as a
87+
compatible PBLE/1 board.
88+
5. Internet access is needed only for the optional GitHub-import scenarios. A
89+
GitHub account or token is neither needed nor accepted.
90+
6. Use only disposable test files for deletion scenarios. Multi-file deletion
91+
is permanent and is not a transaction or a reversible trash operation.
92+
93+
## Focused test matrix
94+
95+
| Area | Exercise | Expected result |
96+
| --- | --- | --- |
97+
| Build identity | Open About before connecting and after reconnecting | The app consistently reports `0.2.0 (5)`; firmware continues to report agent `0.6.0` independently. |
98+
| Official examples | Open GitHub import from Files | The repository starts as editable `https://github.com/PyBLE-dev/examples`; opening ordinary Files does not make a GitHub request. |
99+
| Branch discovery | Load, search, refresh, and select public branches; then try Advanced | Branch mode shows branches only, marks the reported default, and never presents a partial catalog as complete. Advanced still accepts an explicit branch, tag, or commit. |
100+
| Immutable browse | Browse a selected branch and change the repository or ref | A full pinned commit SHA is visible. Changing repository or ref clears the earlier navigation and selection before a new snapshot is browsed. |
101+
| Root guidance | At the board root, select `pyble_i2c_scan.py`; repeat inside `/examples` | Review is blocked at the protected top-level destination with path-specific child-folder guidance. The same basename is accepted inside an ordinary child folder. |
102+
| GitHub import | Review and import the I2C scan example into `/examples` | Review shows the exact source and board destination. Existing files require separate overwrite consent. Imported code is not opened or run automatically. |
103+
| File selection | Select individual files, long-press, Select all shown, Cancel, Escape/Back, and reconnect | Only eligible direct regular files in the current folder are selected. Selection clears on cancellation, navigation, folder/session replacement, or disconnect. |
104+
| Multi-delete | Cancel one exact confirmation, then confirm deletion of disposable files | Cancel removes nothing. Confirmed deletion is sequential and fail-fast; the result and refreshed listing report what actually happened without claiming rollback. |
105+
| Protected entries | Inspect folders, board-control files, and transfer scratch entries | Folders use their separate one-at-a-time flow. Protected or scratch paths are visibly locked and cannot enter bulk selection. |
106+
| Files toolbar | Exercise narrow/roomy panes, portrait/landscape, and 2× text | Actions remain on one row. Select and GitHub import stay direct in compact mode; the other four actions move into one labelled overflow menu. |
107+
| Core regression | Scan, connect, Save, Run, Stop, view console output, manage one file, and use offline Blocks | BLE-first workflows remain responsive; no account or network connection is required outside user-started GitHub import. |
108+
109+
## Expected boundaries and known limitations
110+
111+
- Public GitHub requests are unauthenticated and rate-limited. If GitHub reports
112+
a limit, follow the app's retry/reset guidance instead of repeatedly retrying.
113+
- Branch mode lists branches only. Tags and commit SHAs remain available through
114+
Advanced. Discovery is deliberately bounded and fails closed instead of
115+
presenting an incomplete list as all available branches.
116+
- GitHub import accepts selected ordinary lowercase `.py` files from one shown
117+
remote folder and writes them into the current connected board folder. It
118+
does not recreate remote directories, keep a durable local project or
119+
provenance record, open imported code, or run it.
120+
- Importing at the board root is not entirely forbidden. Protected top-level
121+
lowercase `pyble*`/`pble*`, exact `boot.py`/`_boot.py`, and `.pbltmp` paths
122+
are refused. An ordinary `pyble_*` basename remains eligible inside a normal
123+
child folder such as `/examples`.
124+
- Multi-delete applies only to eligible direct regular files visibly shown in
125+
one current folder. It excludes folders, descendants, board-control paths,
126+
transfer scratch paths, and omitted or truncated entries.
127+
- Deletion is permanent, sequential, fail-fast, and non-atomic. If a later
128+
deletion or the connection fails, earlier successful deletions may remain;
129+
the result identifies succeeded, current/failed, and unattempted files.
130+
- Editing, BLE, Files, Blocks, and Run remain offline and account-free. Public
131+
GitHub requests begin only after the tester opens the importer.
132+
- App `0.2.0 (5)` does not change PBLE/1 or the independently qualified firmware
133+
`0.6.0` baseline. It is a beta candidate, not a production `1.0.0` release.
134+
- The uploaded `0.2.0 (5)` artifact supports iOS/iPadOS `13.0` or later. The
135+
source-level `15.0` floor applies only to later builds produced after this
136+
retained artifact; no build 6 is prepared or uploaded by that source change.
137+
138+
## Feedback checklist
139+
140+
For actionable TestFlight feedback, include:
141+
142+
- iPad model and exact iPadOS version;
143+
- PyBLE app version and build from About;
144+
- exact firmware profile used;
145+
- Board ID and PyBLE agent version shown by the app;
146+
- current board folder and selected filenames for Files issues;
147+
- repository URL, chosen ref, and pinned commit SHA for GitHub-import issues;
148+
- whether GitHub displayed a request-limit or retry time;
149+
- whether the issue followed first connect, reconnect, or a board switch;
150+
- numbered reproduction steps and expected versus actual behavior;
151+
- whether portrait/landscape, 2× text, VoiceOver, or an external keyboard was
152+
involved; and
153+
- a screenshot, screen recording, or TestFlight crash report when it contains
154+
no private code, repository credentials, or other secrets.
155+
156+
## App Store Connect handoff
157+
158+
- Paste **Beta App Description** under TestFlight **Additional → Test
159+
Information** for the English localization.
160+
- Paste **What to Test** into the English build localization for `0.2.0 (5)`.
161+
- Set the maintained feedback email separately; Apple requires it for external
162+
testing.
163+
- Complete the separate **Beta App Review Information** with the maintained
164+
reviewer's first name, last name, email address, and phone number. Mark a
165+
demo account as not required because PyBLE has no sign-in. Put any physical
166+
board access or setup guidance needed by the reviewer in the review-only
167+
notes.
168+
- Confirm the live field counters before saving. Apple's public TestFlight
169+
documentation does not publish maximum lengths for these two fields, so this
170+
document does not assert an unofficial limit.
171+
- Put private review-only directions in TestFlight App Review Information,
172+
never in tester-visible copy.
173+
174+
Apple references:
175+
176+
- [Provide test information](https://developer.apple.com/help/app-store-connect/test-a-beta-version/provide-test-information/)
177+
- [Include notes for testers](https://developer.apple.com/documentation/xcode/including-notes-for-testers-with-a-beta-release-of-your-app)
178+
- [Beta App Localization attributes](https://developer.apple.com/documentation/appstoreconnectapi/betaapplocalization/attributes-data.dictionary)
179+
- [Beta Build Localizations](https://developer.apple.com/documentation/appstoreconnectapi/beta-build-localizations)
180+
- [Beta App Review Detail](https://developer.apple.com/documentation/appstoreconnectapi/beta-app-review-detail)
181+
182+
Project references:
183+
184+
- [Changelog](../../../CHANGELOG.md)
185+
- [Current app capabilities](../../../app/README.md)
186+
- [Detailed app requirements](../../specifications/App/specs.md)
187+
- [GitHub import trust boundary](../../decisions/0040-sha-pinned-connected-github-import.md)
188+
- [Official examples and branch discovery](../../decisions/0042-prefill-official-examples-and-discover-branches.md)
189+
- [Visible-file multi-delete](../../decisions/0043-session-bound-visible-file-multi-delete.md)
190+
- [App 0.2.0 beta identity](../../decisions/0044-start-app-v020-beta-train-at-build-5.md)

0 commit comments

Comments
 (0)