Skip to content

Commit b6b9998

Browse files
committed
[docs] bind release handoff to repaired production artifacts
Signed-off-by: Viwat Vchirawongkwin <viwat.v@chula.ac.th>
1 parent 88b7871 commit b6b9998

2 files changed

Lines changed: 47 additions & 20 deletions

File tree

‎docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md‎

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77
|---|---|
88
| Date | 31 October 2026, Asia/Bangkok |
99
| Scope | App-only bounded current-text recovery; existing Play open-testing and TestFlight channels |
10-
| Source | Merged PR #40 at `6f5b3ea73a70342331fb49d0685938ce2a4cae11`; app tree `b12fe3621f1d100a3b3724d15ee0dea3b359acfe` |
11-
| State | Production Android and iOS packaging verified for this source; physical acceptance and final release admission remain outstanding. The physical-device follow-up identified a keyboard-layout issue being repaired separately, so these pre-fix artifacts are provisional and must be rebuilt after that change |
12-
| Local evidence | Ignored `local/recovery-completion/release/`: build/check logs, artifact manifest and retained signed binaries |
10+
| Runtime source | Recovery baseline plus landscape-keyboard repair at `e54a78acf32e7ea26166a60d66573fdf9e697ad4` |
11+
| Build checkout | Release worktree `e8aeddd8ddbda85293dcca72ad524823bd5ae66a`; app tree `d0f2a464e9886c8451a0cb046123973095f246c6`, verified identical to the runtime baseline |
12+
| State | Production Android and iOS rebuilt cleanly with the keyboard-layout repair; packaging and the bounded Android 16 KiB runtime smoke pass. Physical acceptance and final release admission remain outstanding |
13+
| Local evidence | Ignored `local/recovery-completion/release/candidate-e54a78a/`: build/check logs, source/artifact manifests, runtime evidence and retained signed binaries |
1314
| Public copy | [Prepared release packet](../../../publication/app-0.3.0-build-9-release-packet.md); no submission or availability claim |
1415

1516
## Gate selection
@@ -24,9 +25,9 @@ claim a new firmware release, fresh firmware OI-1 qualification or a Ready badge
2425
| Gate | Required evidence | Current disposition |
2526
|---|---|---|
2627
| M-02 recovery acceptance | All DR-T01–14 required evidence, including representative physical generated-text recovery and both platform offline/current-board-consent records | Reconcile against the [execution record](00_Execution_Record.md) and actual device reports; installation/scan alone is insufficient |
27-
| App regression | Accepted source contract, red/green history, locked dependencies, ordinary tests, pinned goldens, platform builds and repository gates | PR #40 and its post-merge CI passed; 972 ordinary Flutter tests recorded; rerun affected checks for any further code change |
28+
| App regression | Accepted source contract, red/green history, locked dependencies, ordinary tests, pinned goldens, platform builds and repository gates | PR #40/post-merge CI passed historically; the keyboard repair records 974 ordinary Flutter tests, 25 shell widget tests and clean analysis/source gates. Integrated-candidate CI and final physical acceptance remain separate |
2829
| Five-profile app compatibility | Q01–Q10 below with exact app/firmware identity, actual observations and retained failures | Final complete candidate-bound matrix not yet established |
29-
| Production packaging | Android upload signer/AAB/APK/native alignment; iOS distribution export/IPA validation; capability parity | Android and iOS checks below pass for the recorded source; affected checks must follow a repaired candidate |
30+
| Production packaging | Android upload signer/AAB/APK/native alignment; iOS distribution export/IPA validation; capability parity | Android and iOS checks below pass for the repaired source and exact retained artifacts |
3031
| Release review | Frozen artifact identity, resolved mandatory failures, supported scope, privacy/dependency review and recorded acceptance | Not yet admitted |
3132
| M-05 channel delivery | Actual upload/processing/review/availability, followed by store-delivered installed identity and upgrade/launch checks | No upload or new channel delivery established by this preparation |
3233

@@ -42,7 +43,7 @@ physical or packaging evidence.
4243
| Q01 | Q02 | `esp32-4mb` | Common workflow plus affected recovery |
4344
| Q03 | Q04 | `esp32-s3-n16r8` | Common workflow plus affected recovery; do not infer the profile from the `esp32-s3` chip string alone |
4445
| Q05 | Q06 | `waveshare-esp32-s3-lcd-147b` | Common workflow plus affected recovery; keep its exact-board/image identity distinct from generic S3 |
45-
| Q07 | Q08 | `esp32-c3-4mb` | Common workflow plus affected recovery and the real-app C3-G5 behavior |
46+
| Q07 | Q08 | `esp32-c3-4mb` | Common workflow plus affected recovery and real-UI tight-loop/print-flood Stop; see scope below |
4647
| Q09 | Q10 | `rpi-pico2-w` | Common workflow plus affected recovery on each physical platform; no new full GP2 qualification inferred |
4748

4849
Each common row includes ordinary service-filtered discovery/HELLO, editing and
@@ -51,12 +52,25 @@ disconnect/reconnect and workspace continuity. Retain the selected candidate's
5152
affected lifecycle/recovery scenarios. Record the actual result of every row;
5253
a scan result or one platform cannot stand in for another row.
5354

54-
[C3-G5](../../../specifications/firmware/ports/esp32-c3-4mb.md#c3-g5--real-app-hil-on-both-platforms-frozen)
55-
requires Stop through the real UI against both a tight loop and print flood.
56-
Its C3-G2 oracle is exactly one matching `RSP{OK}` before `RUN_STATE(idle)` in
57-
less than 500 ms from complete STOP submission, a usable connection, and a
58-
subsequent bounded run. UI responsiveness alone cannot establish that wire
59-
latency. There is no new arbitrary repetition count added by this app increment.
55+
The [C3 contract](../../../specifications/firmware/ports/esp32-c3-4mb.md#c3-g5--real-app-hil-on-both-platforms-frozen)
56+
and inventory require tight-loop and print-flood Stop through the real UI on
57+
both platforms. The full C3-G5 firmware qualification also requires the C3-G2
58+
wire oracle: exactly one matching `RSP{OK}` before `RUN_STATE(idle)` in less
59+
than 500 ms from complete STOP submission, a usable connection and a subsequent
60+
bounded run. UI observations alone cannot prove that latency or a complete
61+
C3-G5 pass.
62+
63+
The contract's dated status clarification scopes those frozen qualification
64+
gates to a fresh automated-qualified C3/candidate claim. Under the inventory's
65+
app-only scope, this storage/layout increment does not automatically require a
66+
new firmware qualification or fresh wire-latency capture. Impact review found
67+
`app/lib/ble/` and `app/lib/pble/` unchanged between `8dde8d6` and the repaired
68+
runtime baseline; the Run controller's Stop implementation is also unchanged.
69+
Keep fresh UI workload results, existing firmware provenance and any timing
70+
claim distinct. No artifact-bound v0.6.1 timing receipt was established by this
71+
preparation; the historical v0.6.0 qualification and incomplete published
72+
v0.6.1 automated HIL retain their original limits. No new timing pass or arbitrary
73+
repetition count is inferred.
6074

6175
## Prepared Android production artifacts
6276

@@ -66,8 +80,8 @@ manager and never written into source or logs.
6680

6781
| Artifact | SHA-256 | Bytes |
6882
|---|---|---:|
69-
| `PyBLE-0.3.0-build-9-production-release.aab` | `fcf4692dbf7655f53a50a0687eedb81d9cf63bc601721552f622246d5cca0330` | 64,414,627 |
70-
| `PyBLE-0.3.0-build-9-production-release.apk` | `8656549a8480ae7ebfe9b6023220fa35c9b967fb07ca0a754a0ec24cd63e3e13` | 66,439,954 |
83+
| `PyBLE-0.3.0-build-9-production-release.aab` | `6fe609a2ebfb925bbffe2662d64a24b4b9bfdb8b5b39ee3fde6077f3cf8fba73` | 64,413,036 |
84+
| `PyBLE-0.3.0-build-9-production-release.apk` | `71b99f8312c298693e6a8ed1aaa9fc4dc960ac6371504fdfec81152873f67ef8` | 66,439,954 |
7185

7286
| Check | Actual result |
7387
|---|---|
@@ -78,22 +92,35 @@ manager and never written into source or logs.
7892
| Native libraries | All 12 packaged shared objects have every ELF LOAD alignment at least 16 KiB, including `libsqlite3.so` and `libdartjni.so` on all three ABIs |
7993
| APK alignment | `zipalign -c -P 16 -v 4` passes |
8094
| Permissions | Expected BLE, legacy location, Internet and AndroidX signature permission; no new authored platform permission |
81-
| Runtime page-size check | Production APK launched on the official API 36 Google APIs 16 KiB arm64 emulator; kernel `PAGE_SIZE=16384`, About `Version 0.3.0 (9)`, bundled native SQLite mapped from the APK, and fresh schema v1 created successfully |
95+
| Runtime page-size check | Production APK launched on the official API 36 Google APIs 16 KiB arm64 emulator; kernel `PAGE_SIZE=16384`, About `Version 0.3.0 (9)`, bundled native SQLite mapped from the APK, and existing schema v1 reopened successfully; installed APK bytes match the recorded artifact hash |
8296

8397
The 16 KiB runtime observation also force-stopped and relaunched the same
8498
installed package without data clearing. The normal disconnected screen
85-
returned; the retained fresh database and WAL reopened with `integrity_check=ok`
99+
returned without a fatal exception or native-library load error. The database
100+
created by the earlier `6f5b3ea` production candidate and its WAL reopened with
101+
`integrity_check=ok`
86102
and the expected `projects`, `project_files` and `settings` tables. This is a
87103
native packaging/startup smoke, not a physical BLE row or the full recovery
88104
acceptance matrix. The SQLite database's own page size is independent of the
89-
operating-system memory page size.
105+
operating-system memory page size. The emulator uses Google APIs 16 KiB arm64
106+
API 36 image revision 7; its fingerprint and private UI captures are recorded
107+
with the candidate manifest.
90108

91109
The first local invocation incorrectly used `--no-pub` after fresh `pub get`,
92110
leaving the integration-test plugin in a generated Android registrant. Its
93111
failed log is retained. Repeating the canonical CI production commands,
94112
which allow Flutter to regenerate release plugin metadata, built both artifacts
95113
successfully without a source change.
96114

115+
A later incremental rebuild after the keyboard repair regenerated AOT inputs
116+
but reused stale Gradle merged/stripped native libraries. Comparing packaged
117+
`libapp.so` against current build inputs exposed the mismatch; those artifacts
118+
were rejected and retained under `rejected-stale-gradle-e54a78a/`. Running
119+
`flutter clean` and both canonical production commands rebuilt the current
120+
artifacts above. Their packaged AOT libraries match current stripped outputs
121+
on all three ABIs. The earlier `6f5b3ea` artifacts remain historical evidence
122+
under `artifacts-6f5b3ea/`; they are not the repaired release candidate.
123+
97124
The APK uses the upload certificate, whereas Google Play can deliver its own
98125
app-signing certificate. Do not uninstall an existing user's Play app or clear
99126
its data merely to install this locally signed APK. Store upgrade acceptance
@@ -103,8 +130,8 @@ must use the actual delivered package.
103130

104131
| Field / check | Actual result |
105132
|---|---|
106-
| IPA | `PyBLE-0.3.0-build-9-app-store.ipa`, 23,782,489 bytes |
107-
| SHA-256 | `73ad7cda10c402a7f25316efc5e30f9c80bbd030e23c2bfc32313fd79c41c2ab` |
133+
| IPA | `PyBLE-0.3.0-build-9-app-store.ipa`, 23,784,757 bytes |
134+
| SHA-256 | `14146b8951e4cd3298d27eb20e2036c80bbcd1b05bba42c98bf1abbd53b5eba6` |
108135
| Identity | `dev.pyble.pyble`, `0.3.0 (9)`, normal `lib/main.dart` |
109136
| Build / deployment floor | Xcode 27.2 / iOS SDK 27.2; app and compiled deployment floor at least iOS 15.0 |
110137
| Export | App Store Connect distribution export; automatic signing with build-number management disabled; export destination only, no upload |

‎docs/publication/app-0.3.0-build-9-release-packet.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ contract and rebuilt artifacts, not a renamed file.
1313
## Google Play release notes
1414

1515
```text
16-
PyBLE can now keep one current Python draft locally and offer Restore or Discard after an app restart. Local recovery status is shown separately from saving to a board. Recovered text requires confirmation of the current destination before board Save, Run or Upload. Blocks workspaces and multi-file projects are not included in local draft recovery. A compatible MicroPython board with the PyBLE agent is still required for board workflows.
16+
PyBLE can keep one current Python draft locally and offer Restore or Discard after restart. Local recovery status is separate from board saving. Recovered text needs current-destination confirmation before board Save, Run or Upload. Landscape editing stays usable above the keyboard. Blocks workspaces and multi-file projects are not included in draft recovery. Board workflows require a compatible MicroPython board running the PyBLE agent.
1717
```
1818

1919
## TestFlight — What to Test

0 commit comments

Comments
 (0)