Before this decision, the installed app identity was 0.1.0+4; build 4 remains
a retained TestFlight handoff bound to an earlier source commit. Since that
handoff, the app source has gained a coherent set of compatible beta features:
connected board identity, the numbered and adjustable rich editor, SHA-pinned
GitHub import, the editable official examples-repository default with
branch-only discovery, session-bound visible-file multi-delete, and a one-row
responsive Files toolbar.
Reinstalling a different source state under the same version and build works
for local development, but it makes About, screenshots, HIL evidence, and
tester reports unable to distinguish the artifacts. A future TestFlight upload
also needs a unique build identity, and the shared Flutter build number becomes
Android's monotonically increasing versionCode.
The project reserves app 1.0.0 for its first production release and has not
previously assigned a numbered milestone to the current Unreleased app work.
-
Start a new compatible beta milestone. The current coherent Unreleased feature set becomes the PyBLE app 0.2.0 beta train. This changes neither the independently versioned firmware agent (
0.6.0) nor PBLE/1. -
Use build 5 for the first candidate. The first local beta candidate is
0.2.0+5, displayed as0.2.0 (5). Later candidate artifacts increment the build number (+6,+7, …) even when the base version stays0.2.0. PyBLE does not reset the shared Flutter build sequence when the base version changes, preserving one simple iOS/Android ordering rule. -
Keep
pubspec.yamlauthoritative.app/pubspec.yamlowns the complete base-version/build-number pair. The base version is mirrored at compile time bykAppVersionfor PBLE/1 HELLO because the wire layer must not depend on runtime package metadata. The public GitHub request User-Agent derives from the samekAppNameandkAppVersionconstants instead of carrying another independently authored version literal. -
Make synchronization executable. An automated test parses the package version, pins the declared 0.2.0 build-5 candidate, and proves its base version equals
kAppVersion. GitHub-client tests require the exactPyBLE/<kAppVersion>User-Agent. A later version bump must update the candidate expectation and cannot silently drift package, HELLO, and HTTP identities. -
Distinguish a candidate from a qualified release. A local install or TestFlight build carrying
0.2.0 (5)is a beta candidate, not evidence that the app has completed release qualification. Store-signable artifacts, platform parity, compatibility declarations, automated gates, and required physical validation remain governed by the existing release requirements. -
Bind every external handoff to source and evidence. If build 5 advances from local testing to TestFlight or another external handoff, its test plan records the exact accepted source commit, qualified agent release, PBLE/1 baseline, focused test scope, and known boundaries. About must report the installed package identity, and physical evidence must name both app version/build and board firmware identity.
-
Preserve historical identities. The retained
0.1.0 (4)TestFlight plan, prior changelog entries, and thesource-2026.08.23citation snapshot remain unchanged. They describe immutable earlier artifacts rather than the moving branch tip. -
Keep delivery test-first and local until accepted. The synchronization test lands red before the version implementation. The exact candidate build is installed and physically reviewed on iPad before any pull request or push for this combined feature branch.
- Testers can distinguish the new feature set from retained build 4 in About, screenshots, diagnostics, and any later TestFlight feedback.
- PBLE/1 sees app version
0.2.0while remaining protocol-compatible with the qualified0.6.0agents. - The official examples repository remains independently versioned and untrusted at the importer boundary.
- Future candidate builds pay the small cost of updating one explicit build expectation in exchange for deterministic cross-platform traceability.
1.0.0remains unavailable until the production acceptance gates pass.
- Use
0.1.0+5. Valid for another iteration of the same beta milestone, but rejected because the accumulated compatible feature set now warrants an explicit minor beta milestone. - Reset to
0.2.0+1. Accepted by iOS for a new base version, but rejected because Android requires a greaterversionCodeand PyBLE ships one Flutter identity at platform parity. - Override only the build command. Rejected because About could report an overridden package version while PBLE/1 HELLO and the GitHub User-Agent still advertise stale compile-time values.
- Jump to
1.0.0. Rejected because version 1.0 is the first fully qualified production release, not a development or TestFlight milestone.