You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 43b4af8
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md
+94-27Lines changed: 94 additions & 27 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,21 +6,24 @@
6
6
| Field | Record |
7
7
|---|---|
8
8
| Date / operator | 31 October 2026; automated operator on the maintainer's Mac |
9
-
| State |Completed Android continuation within the physical scope and limitations recorded below |
9
+
| State |Final-candidate affected checks passed; retained acceptance observations and candidate identities are distinguished below |
10
10
| Physical device | Lenovo TB-J616X; Android 12 / API 31; landscape 2000 × 1200 pixels at 240 dpi |
11
11
| App |`0.3.0 (9)`, normal `lib/main.dart`; isolated qualification application identity preserves the installed store app and its data |
12
-
| Final runtime source |`01a7ac8acab32e926c185c8567f9b8dca08d3d68`; Android worktree runtime is byte-equivalent. The native package name alone is changed for the isolated identity |
13
-
| Final profile APK SHA-256 |`afc50a741a07344047d3069c9d4a36c1111869b3286e67b0a9f8d4a61a408e89`; also verified against the installed `base.apk`|
14
-
| Final arm64 AOT SHA-256 |`2ddb34eb36169466b5aa5aa32515e007354389f1ebdd276c0fdd40638e6e47a4`|
15
-
| Final native DEX SHA-256 |`1b62aceb530a2d361980b18d009188994cf7c92118d22842af3a6293757b61bb`|
12
+
| Final runtime source |`bef67bded9e5b83437e3eb0e2ec4be6a4cfd1a64`; app tree `60b3a68b693551af5d83076547c502f69838e052`. Android runtime inputs are hash-bound to this source; the native package name is substituted for the isolated identity |
13
+
| Final profile APK SHA-256 |`945e9746559831c0d0f793d779bd53a0c53cc8395d02e50df3f45e9ff6790bcf`; also verified against the installed `base.apk`|
14
+
| Final arm64 AOT SHA-256 |`b4e42e6b50a2cdd565b2fbcccd457aab1c512c20a40933c9a8674cf38c214a9c`|
15
+
| Final `classes.dex` SHA-256 |`1b62aceb530a2d361980b18d009188994cf7c92118d22842af3a6293757b61bb`|
| Original debug APK | Source equivalent to `6f5b3ea`; SHA-256 `957982f5acec969f8003d04b2d6444eecbba9af26b7392d760badb5be5d6bd0e`; original failures retained |
| P01 | Pass on final candidate: actual Bluetooth state OFF and Wi-Fi disabled; startup presents the exact checkpoint before any connection workflow |`nativefix-all-offline-relaunch`, `nativefix-offline-bluetooth-confirmed`|
41
+
| P01 | Pass on native-keyboard profile: actual Bluetooth state OFF and Wi-Fi disabled; startup presents the exact checkpoint before any connection workflow |`nativefix-all-offline-relaunch`, `nativefix-offline-bluetooth-confirmed`|
37
42
| P02 | Pass: named `recovery.py` retains Unicode `✓`, punctuation, blank lines and final newline; native entry was asserted exactly before normal key-event editing |`nativefix-typing-seed`, `nativefix-continuous-expected`|
38
43
| P03 | Pass: explicit recovery save acknowledges the matching text; Saved locally and board Unsaved changes remain distinct |`profile-saved-local`, `nativefix-continuous-saved`|
39
44
| P04 | Pass: actual force-stop/relaunch reproduces exact named text and checkpoint, including the generated Blocks text |`nativefix-typed-offline-relaunch`, `nativefix-generated-relaunch`|
40
45
| P05 | Pass: Back leaves the unresolved recovery decision; relaunch presents the same complete generated checkpoint |`nativefix-recovery-before-back`, `nativefix-recovery-after-back`|
41
-
| P06 | Pass on final candidate: explicit Restore shows exact text in the disconnected local panel; connecting remains a separate action |`controlled-3dcb-local-restore`|
46
+
| P06 | Pass on native-keyboard profile: explicit Restore shows exact text in the disconnected local panel; connecting remains a separate action |`controlled-3dcb-local-restore`|
42
47
| P07 | Pass for ordinary edit/lifecycle behavior: repeated normal key events, idle acknowledged checkpoint, backgrounding, force-stop and exact recovery |`nativefix-continuous-*`, `nativefix-all-offline-relaunch`|
43
-
| P08 | Pass on final candidate: Cancel retains the exact copy; confirmed Discard commits the empty slot and another process launch has no recovery prompt |`controlled-3dcb-discard-*`, `controlled-3dcb-empty-slot`|
48
+
| P08 | Pass on native-keyboard profile: Cancel retains the exact copy; confirmed Discard commits the empty slot and another process launch has no recovery prompt |`controlled-3dcb-discard-*`, `controlled-3dcb-empty-slot`|
44
49
| P09 | Pass on earlier profile: deliberately empty named `acceptance_1730.py` survives checkpoint/process relaunch as a recoverable document |`profile-empty-named-saved`, `profile-empty-named-prompt`|
45
50
| P10 | Pass on earlier profile: Save and Run show their current destination and distinct write-only/write-and-run effects; Cancel preserves the document. Confirmed upload and subsequent Run produced `67891`|`profile-save-consent-dialog`, `profile-run-consent-dialog`, `profile-named-upload-consent`, `profile-hello-output-complete`|
46
51
| P11 | Pass for physical moved-directory destination: Upload names the actual current directory; cancellation and confirmed upload were exercised |`profile-upload-cwd-consent`, `controlled-3dcb-cwd-upload-consent`|
47
-
| P12 | Pass on final candidate: matching confirmed upload clears board dirty; a new connection session requires current-target consent again, which was cancelled |`controlled-3dcb-upload-ack`, `controlled-3dcb-new-session-consent`|
48
-
| P13 | Pass on final candidate: Editor New, Board Open and Blocks handoff each protect meaningful pending Unicode text. Cancel retains it exactly; confirmed Blocks replacement installs the generated text |`nativefix-new-*`, `nativefix-board-open-*`, `nativefix-block-handoff-*`|
49
-
| P14 / DR-T12 | Pass on final candidate: normal Hello example → Open in Editor → guarded replacement → Save recovery copy → Disconnect → force-stop/relaunch recovers exactly `print('Hello, PyBLE!')\n` as text |`nativefix-generated-checkpoint`, `nativefix-generated-relaunch`|
52
+
| P12 | Pass on native-keyboard profile: matching confirmed upload clears board dirty; a new connection session requires current-target consent again, which was cancelled |`controlled-3dcb-upload-ack`, `controlled-3dcb-new-session-consent`|
53
+
| P13 | Pass on native-keyboard profile: Editor New, Board Open and Blocks handoff each protect meaningful pending Unicode text. Cancel retains it exactly; confirmed Blocks replacement installs the generated text |`nativefix-new-*`, `nativefix-board-open-*`, `nativefix-block-handoff-*`|
54
+
| P14 / DR-T12 | Pass on native-keyboard profile: normal Hello example → Open in Editor → guarded replacement → Save recovery copy → Disconnect → force-stop/relaunch recovers exactly `print('Hello, PyBLE!')\n` as text |`nativefix-generated-checkpoint`, `nativefix-generated-relaunch`|
50
55
| P15 | Verified physical scope: 2× recovery controls, Editor/Blocks keyboard layout, and native accessibility focus/labels with TalkBack active. Audible pronunciation and complete gesture navigation were not observed |`nativefix-named-2x-*`, `nativefix-blocks-ime-*`, `talkback-probe-*`|
51
56
52
57
The generated-text recovery observation does not claim restoration of a Blocks
53
58
workspace, revision history or companion files. The UI explicitly states that
54
59
the local slot contains one current text draft.
55
60
56
61
The retained earlier-profile observations cover unchanged storage, target-guard
57
-
and transport code. The final runtime changes keyboard dismissal; its affected
58
-
Editor/native-WebView behavior and Blocks handoff were repeated on the final
62
+
and transport code. The native-keyboard runtime changes keyboard dismissal; its affected
63
+
Editor/native-WebView behavior and Blocks handoff were repeated on that exact
59
64
installed artifact. This is an impact assessment, not a claim that every earlier
60
65
observation was rerun on identical bytes.
61
66
@@ -66,6 +71,62 @@ phases. Their physical execution is not inferred from a successful ordinary
66
71
restart. Error-panel localization/layout coverage also remains part of the
67
72
host widget/semantics/golden evidence.
68
73
74
+
## Final candidate recheck
75
+
76
+
The final APK was installed over the isolated app without clearing its data.
77
+
The installed hash was checked again after restoring it from the temporary
78
+
diagnostic and older-candidate comparisons. No diagnostic Activity or callback
79
+
logging remains in that APK or the restored qualification source copy.
80
+
81
+
| Check | Result on final `945e9746…` APK | Evidence prefix |
82
+
|---|---|---|
83
+
| Identity and retained data | About shows `Version 0.3.0 (9)`; the previous exact `matrix.py` checkpoint survives installation |`final-guide-about`, `final-guide-preserved-relaunch`, `final-guide-final-installed-sha256`|
84
+
| Editor keyboard | Code and navigation remain usable above the keyboard; Expand hides the actual IME and retains exact text and the normal expanded console |`final-guide-editor-ime-*`, `final-guide-editor-expanded`|
85
+
| Blocks startup and keyboard | Actual launcher entry loads the empty workspace and Hello example. Opening the native HTML text field shows the IME; semantic Expand hides it, exposes Collapse console, and retains the field/workspace |`final-guide-final-empty-workspace`, `final-guide-hello-ready`, `final-guide-blocks-ime-*`, `final-guide-blocks-expanded`|
86
+
| Generated checkpoint / DR-T12 | Guarded Open in Editor and confirmed replacement produce exactly `print('Hello, PyBLE!')\n` in `blocks.py`; explicit local save acknowledges it |`final-guide-handoff-review`, `final-guide-generated-editor`, `final-guide-generated-checkpoint`|
87
+
| Offline relaunch and Restore | Bluetooth is actually OFF and Wi-Fi disabled before process termination/relaunch; recovery and explicit disconnected Restore retain the exact generated text and filename |`final-guide-generated-offline-*`|
88
+
| Current-target cancellation | After deliberate C3 connection, Save and Run show `/blocks.py` and their distinct effects; each Cancel preserves exact text. No board upload or program run occurs |`final-guide-generated-target-*`, `final-guide-generated-run-*`, `final-guide-generated-result`|
89
+
90
+
The final change adds an iOS-only keyboard-guide fallback; the Android wrapper
91
+
returns the existing child. The unchanged storage, target-guard, BLE, run and
92
+
Blocks code, together with identical native DEX and bundled Blocks inputs,
93
+
supports retaining the earlier matrix rows below. Those rows are not represented
94
+
as new five-board executions of the final APK.
95
+
96
+
The startup investigation also found a device-environment condition. The
97
+
isolated package appeared in Lenovo's DuraSpeed suppression list while its
98
+
renderer service remained pending without a process or binder. Real watchdog
99
+
failures had no page or JavaScript bridge callbacks; a same-package native
100
+
Activity without Flutter reproduced them. A controlled native comparison
101
+
passed with the qualifier's Battery mode temporarily set to **Unrestricted**.
102
+
The accepted final-app sequence also used its actual, package-verified launcher
103
+
icon. Global DuraSpeed configuration was unchanged. These observations qualify
104
+
the recorded setup; they do not establish that every shell launch or OEM power
105
+
mode works, or that either setup step is universally necessary. The earlier
106
+
successful shell-launched profile did not retain a comparable policy snapshot.
107
+
No product startup code was changed for this investigation.
108
+
109
+
After qualification, the original **Optimized** battery mode was restored and
110
+
the qualifier was removed from the device-idle exemption list. Global DuraSpeed
111
+
configuration remained byte-identical to the recorded baseline. Original radio,
112
+
accessibility, touch-exploration and font settings were verified restored; the
113
+
final APK and its recovery data remain installed, with the qualifier stopped
114
+
and temporary device helpers removed.
115
+
116
+
Some helper waits were corrected against the retained UI evidence: an empty
117
+
initialized workspace offers Browse examples and disables Preview code with
118
+
“Add blocks to generate Python.” Waiting for Preview code in that state is not
119
+
a startup failure. Both the final and retained native-keyboard APKs reached
120
+
that valid state through the actual launcher. Those selector timeouts remain
121
+
separate from the genuine earlier watchdog failures.
122
+
123
+
After radio restoration, the first generated-text C3 connection encountered a
124
+
15-second service-discovery timeout before Ready. Its explicit retry reached
125
+
Ready and completed both target-cancellation checks. This retained transient is
126
+
not counted as a successful first attempt. The separate Classic reconnect
127
+
errors are likewise retained; its subsequent board-restoration step does not
0 commit comments