Skip to content

Commit c19cafb

Browse files
committed
[docs] admit app candidate with final physical qualification receipts
Signed-off-by: Viwat Vchirawongkwin <viwat.v@chula.ac.th>
1 parent 3336f91 commit c19cafb

2 files changed

Lines changed: 124 additions & 20 deletions

File tree

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

Lines changed: 117 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,14 @@
99
| Scope | App-only bounded current-text recovery; existing Play open-testing and TestFlight channels |
1010
| Runtime source | Recovery baseline plus landscape layout, native keyboard dismissal and iPad palette-geometry repairs at `bef67bded9e5b83437e3eb0e2ec4be6a4cfd1a64` |
1111
| Build checkout | Release worktree `c6e685dd3ebe718ed89fcfe58e441331eb174648`; app tree `60b3a68b693551af5d83076547c502f69838e052`, verified identical to the runtime baseline |
12-
| State | Production Android and iOS rebuilt cleanly with the iPad palette-geometry repair; packaging and the bounded Android 16 KiB runtime smoke pass. Final physical acceptance and release admission remain separate gates |
12+
| State | M-02 and app-only M-04 engineering admission accepted on 31 October for the frozen artifacts below. Final PR required CI and merge precede publishing; M-05 delivery remains pending |
1313
| Local evidence | Ignored `local/recovery-completion/release/candidate-bef67bd/`: build/check logs, source/artifact manifests, runtime evidence and retained signed binaries |
1414
| Public copy | [Prepared release packet](../../../publication/app-0.3.0-build-9-release-packet.md); no submission or availability claim |
1515

16+
A post-freeze comment correction clarifies Android's asset/file-access adapter
17+
semantics. It changes no executable behavior or loading path; the retained
18+
artifacts remain bound to the frozen runtime and app tree above.
19+
1620
## Gate selection
1721

1822
This increment changes the app, not the firmware bytes. The
@@ -24,11 +28,11 @@ claim a new firmware release, fresh firmware OI-1 qualification or a Ready badge
2428

2529
| Gate | Required evidence | Current disposition |
2630
|---|---|---|
27-
| 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 |
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 final keyboard repairs record 984 ordinary Flutter tests, including 28 shell widget tests, six iOS guide/platform-control tests and one platform-fallback test, plus clean analysis/source gates. Integrated-candidate CI and final physical acceptance remain separate |
29-
| 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 |
31+
| M-02 recovery acceptance | All DR-T01–14 required evidence, including representative physical generated-text recovery and both platform offline/current-board-consent records | Accepted: mandatory DR-T01–14 evidence is reconciled in the [execution record](00_Execution_Record.md) and its iPad/Android reports, including final normal-candidate generated-text recovery, offline restore and current-target Cancel checks |
32+
| App regression | Accepted source contract, red/green history, locked dependencies, ordinary tests, pinned goldens, platform builds and repository gates | Accepted runtime evidence: 984 ordinary Flutter tests, including 28 shell widget tests, six iOS guide/platform-control tests and one platform-fallback test; 36 Android runtime CI checks; pinned goldens and clean analysis/source gates. The final documentation/rebase head must still pass required PR CI before merge and publishing |
33+
| Five-profile app compatibility | Q01–Q10 below with exact app/firmware identity, actual observations and retained failures | Accepted Q01–Q10 on the exact named firmware inputs below, with source-impact mapping for earlier unaffected rows and final affected keyboard/recovery reruns on both tablets; retained failures remain visible in the device reports |
3034
| 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 |
31-
| Release review | Frozen artifact identity, resolved mandatory failures, supported scope, privacy/dependency review and recorded acceptance | Not yet admitted |
35+
| Release review | Frozen artifact identity, resolved mandatory failures, supported scope, privacy/dependency review and recorded acceptance | Accepted app-only M-04 engineering admission for `bef67bd` and the hashes below, with the Lenovo OEM precondition and historical firmware limits retained |
3236
| 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 |
3337

3438
Pilot participation and useful-return evidence remain separate from maintenance
@@ -179,10 +183,10 @@ path. The exact-asset controls observed `onPageStarted`, then `hostReady`, and
179183
confirmed that `window.pybleBlocks.configureHost` exists. The selected provider
180184
was installed/enabled and not stopped or suspended at inspection time.
181185

182-
The current isolated profile candidate subsequently reached the real Blocks
183-
workspace. These observations distinguish the retained debug failure from a
184-
completed profile-candidate failure; they do not identify the original cause
185-
or prove DR-T12 by themselves. The inline control exposed a possible callback
186+
The earlier isolated profile candidate subsequently reached the real Blocks
187+
workspace. Those observations did not establish the cause of the retained
188+
debug failure or prove DR-T12 by themselves. A later final-candidate profile
189+
failure was reproduced and isolated separately below. The inline control exposed a possible callback
186190
ordering hazard, but neither exact-asset control reproduced it, so no startup-protocol
187191
change or claimed startup fix followed. The physical report must separately record
188192
actual generated-text handoff, recovery and cold relaunch. Diagnostic fixture
@@ -192,11 +196,73 @@ A separate physical finding established that console Expand did not dismiss
192196
an Android keyboard owned by a native Blockly field. The final candidate adds
193197
a narrow current-window dismissal request on Android and iOS while retaining
194198
layout based on actual insets. The Android rerun observed IME visibility change
195-
from shown to hidden, an expanded console and retained field text. The iPad
196-
outcome remains part of its separate physical report. The production artifacts
199+
from shown to hidden, an expanded console and retained field text. The final iPad
200+
report also passes reachable Expand/dismissal in both Editor and Blocks. The production artifacts
197201
above include this repair and the later iPad geometry fallback; the diagnostic controls
198202
did not change the Blocks startup protocol.
199203

204+
## Final Android renderer suppression control
205+
206+
The final `bef67bd` isolated qualifier profile subsequently timed out on Blocks
207+
startup, including Retry and a startup with no active UI-automation polling.
208+
The failure is retained; earlier profile success does not erase it. An ignored
209+
instrumented copy of the actual host completed controller setup and asset-load
210+
submission by 412 ms. At 3 and 9 seconds the native URL was the bundled asset,
211+
but bounded JavaScript readiness probes timed out. No page-start, page-finished
212+
or bridge callback arrived; the 15-second watchdog fired at generation zero.
213+
This observed failure preceded the startup gate, so no host-readiness protocol
214+
change was justified.
215+
216+
Android retained the qualifier's renderer service as pending with no process or
217+
binder. Its ActivityManager explicitly suppressed service startup. The device's
218+
DuraSpeed service was enabled and listed the isolated qualifier package in its
219+
suppression set. The actual production package `dev.pyble.pyble` was absent from
220+
that set and was not changed. A plain native Activity loading the exact bundled
221+
assets under the same qualifier APK/UID also failed before any page/bridge
222+
callback, establishing that Flutter and the Blocks startup gate were not
223+
necessary for this failure.
224+
225+
The ordinary qualifier App info → Battery screen initially selected
226+
**Optimized**. A scoped, reversible control selected **Unrestricted** for that
227+
qualifier alone. The same native APK/UID then emitted page-start at 594 ms,
228+
`hostReady` at 801 ms, page-finished at 809 ms, and successful document/API
229+
readiness probes at 3 and 9 seconds. DuraSpeed remained globally enabled and
230+
its global configuration was unchanged. No provider replacement, global
231+
optimization disable, hidden allowlist mutation, firmware change or app-data
232+
reset was used. This native control alone was not final app acceptance: a later
233+
normal-APK shell launch still produced a retained watchdog failure. Both the
234+
older and final normal profile APKs subsequently opened a valid empty workspace
235+
through the actual launcher. A helper initially misclassified that ready empty
236+
state because it waited for enabled Preview code before any blocks existed;
237+
the raw hierarchy instead showed Visual block workspace, Browse examples and
238+
Add blocks to generate Python, with no startup error. This oracle correction
239+
does not erase the separate real watchdog failures.
240+
241+
The final normal `945e9746` qualifier then passed Hello example generation,
242+
native-field keyboard Expand/dismissal with content retained, guarded Editor
243+
handoff, a local generated-text checkpoint, offline cold relaunch/Restore with
244+
both radios off, and current-C3 Save Cancel and Run Cancel. A first post-radio
245+
C3 service-discovery timeout was retained; explicit reconnect succeeded before
246+
the two Cancel checks. The board was explicitly disconnected afterward.
247+
No startup source change or extra artifact rebuild followed these controls.
248+
249+
After these observations, the qualifier's original **Optimized** battery mode
250+
was restored through the same ordinary Settings screen. Fresh native hierarchy
251+
and screenshot receipts show only Optimized checked. The qualifier was removed
252+
from the device-idle allowlist; the global DuraSpeed configuration is byte-for-
253+
byte identical to its baseline and remains enabled. The production package
254+
remains absent from the DuraSpeed suppression/explicit allowlist observations
255+
and its settings were untouched. The final acceptance therefore records the
256+
observed Unrestricted/actual-launcher qualification precondition and restoration,
257+
rather than promising operation while the OS suppresses renderer startup.
258+
259+
Raw callback logs, the failed attempts and normal APK identities are retained
260+
under ignored `local/recovery-completion/android/`. OEM policy, checked-radio
261+
screenshots and the restoration recipe are under
262+
`local/recovery-completion/blockly-startup-diagnostic/`. This is an explicit
263+
device precondition for the isolated qualification container, not a claim of
264+
unconditional operation while Android suppresses its WebView renderer.
265+
200266
## iPad keyboard palette regression
201267

202268
On the native-dismissal candidate `01a7ac8`, opening the docked keyboard through
@@ -223,9 +289,30 @@ and runtime `bef67bd`. The complete ordinary suite passes 984 tests; six guide
223289
regressions cover the actual fallback, Blocks dismissal/host retention,
224290
maximum/padding behavior, resize ordering, stale callbacks/lifecycle and the
225291
unchanged Android path. Native iOS profile compilation and static/source gates
226-
pass. Exact physical iPad palette reopening and reachable Expand/dismissal
227-
remain acceptance observations in the [execution record](00_Execution_Record.md);
228-
a production IPA export alone cannot substitute for them.
292+
pass. Final physical iPad palette reopening and reachable Expand/dismissal
293+
passed in both Editor and Blocks on `bef67bd`; the iPad report linked from the [execution record](00_Execution_Record.md)
294+
retains the original failures and measured diagnostic alongside the successful
295+
reruns. These physical observations, not the IPA export alone, satisfy the
296+
affected keyboard acceptance.
297+
298+
## Dependency review scope
299+
300+
On 31 October, GitHub's 19 open Dependabot entries mapped to 12 advisory
301+
families in the website's npm manifests. Current main already contains fixes
302+
for 11 families; the braces advisory was withdrawn. A fresh
303+
`npm audit --audit-level=high --json` exited successfully with no high or
304+
critical findings. It reports 15 moderate affected dependency nodes from two
305+
roots: minimatch in development lint tooling and Satori in vinext image tooling.
306+
No authored affected SVG, cache or TLS invocation was found. Production serves
307+
static output, and these website dependencies are outside the frozen app
308+
artifact. The moderate findings remain separate web maintenance; this review
309+
does not claim that every dependency is vulnerability-free. No alerts were
310+
dismissed and no dependencies were changed.
311+
312+
The retained audit completed at `2026-10-31T12:54:17.290202+00:00` against lockfile
313+
SHA-256 `2c7b0c6c652a078eefada990f4a018ae4650355bfb703858c581b5cf430e5483`.
314+
Its advisory mapping, audit JSON and summary remain under ignored
315+
`local/recovery-completion/dependency-audit/`.
229316

230317
## Distribution access and remaining account work
231318

@@ -245,8 +332,19 @@ already been consumed; these remain **unverified**. Read-only browser discovery
245332
did not establish an authenticated console session. This is not a claim that
246333
the owner lacks web-console access or that Xcode has no potential upload route.
247334

248-
After the candidate is admitted, the authorized distribution operator must
249-
verify the exact package, unused build numbers and current declarations, upload
250-
the retained artifacts, resolve processing/review findings, and record actual
251-
availability and installed-store results separately. The prepared packet and
252-
artifact records make those steps concrete; they do not substitute for them.
335+
A read-only GitHub audit found zero repository Actions secrets and zero
336+
repository environments. The only authored active workflow is
337+
`.github/workflows/ci.yml`, which validates/builds but has no store-publishing
338+
job; the tracked tree has no Fastlane configuration. Organization-secret
339+
listing returned HTTP 403, so inherited organization credentials were not
340+
proven absent. No existing repository workflow consumes a Play or App Store
341+
publisher credential. This inspection found no configured CI upload route;
342+
it does not infer that the owner lacks credentials elsewhere.
343+
344+
Engineering admission is complete for the frozen artifacts. After the final
345+
required PR checks and merge, the authorized distribution operator must verify
346+
the exact package, unused build numbers and current declarations, upload the
347+
retained artifacts, resolve processing/review findings, and record actual
348+
availability and installed-store results separately. The existing Xcode account
349+
is a concrete route to attempt, with server authentication and receipts retained.
350+
The prepared packet and artifact records do not substitute for channel delivery.

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55

66
Prepared 31 October 2026. This is candidate copy for the existing Google Play
77
open-testing and TestFlight channels. It does not announce availability, a
8-
submission, or release admission. The [readiness record](../developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md)
8+
submission, or store delivery. Engineering admission is accepted for the frozen
9+
artifacts; final PR checks and merge precede publishing. The [readiness record](../developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md)
910
owns the artifact and gate states. Confirm that build 9 is unused in each
1011
account before uploading; a consumed number requires a new source version
1112
contract and rebuilt artifacts, not a renamed file.
@@ -57,6 +58,11 @@ application identities. Their successful installation does not prove an upgrade
5758
of `dev.pyble.pyble`, store processing, or store delivery. A distribution export
5859
also does not establish successful execution on the physical tablet.
5960

61+
The [dependency review](../developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md#dependency-review-scope)
62+
records the current website audit separately from the frozen mobile artifact:
63+
no high/critical findings, with moderate web-tooling findings still open for
64+
maintenance. It does not claim that every dependency is vulnerability-free.
65+
6066
## Privacy and recovery scope
6167

6268
Candidate 0.3.0 adds an app-private local database containing one current text

0 commit comments

Comments
 (0)