From 3bafba6a4608b6fa3f758220492d8993ebadb8e4 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 17:27:18 +0700 Subject: [PATCH 01/31] [docs] reconcile merged recovery candidate and continuation plan Signed-off-by: Viwat Vchirawongkwin --- CHANGELOG.md | 13 ++-- README.md | 9 +-- docs/ROADMAP.md | 5 +- ...048-bounded-current-text-draft-recovery.md | 5 +- .../01_Overview_and_Scrum_Framework.md | 6 +- .../02_Product_Roadmap.md | 4 +- .../03_Milestones.md | 4 +- .../04_Sprint_Plan.md | 34 +++++++-- .../05_Product_Backlog_and_Stories.md | 12 ++-- .../06_Sprint_Backlogs.md | 14 ++-- .../c1-s1/00_Execution_Record.md | 2 +- .../02_Pilot_Protocol_and_Observation_Kit.md | 12 ++++ .../c1-s2/00_Execution_Record.md | 70 ++++++++++--------- .../c1-s2/01_Operator_Recipe.md | 2 +- .../c1-s2/02_Platform_Qualification.md | 24 ++++++- ...E_Implementation_Plan_and_Strategy_v1.0.md | 21 ++++-- docs/specifications/App/TDD.md | 2 +- .../App/current-draft-recovery.md | 2 +- docs/specifications/App/specs.md | 4 +- 19 files changed, 159 insertions(+), 86 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d4387e5..765565d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,16 +10,15 @@ or firmware release. Firmware v0.6.1 is published on the owner's confirmation; incomplete automated evidence remains pending. The qualified v0.6.0 release remains a separate historical baseline built from its annotated tag. -The current compatible app feature set now targets `0.2.0`; build `5` was -handed off through Transporter for TestFlight. This candidate identity improves -test and evidence traceability but does not designate a qualified store release -or claim App Store Connect processing, beta-review approval, or availability. -The next prepared Android open-testing candidate is `0.2.0 (8)`; its bundle -and submission packet do not claim Play submission, approval, or rollout. +The merged app source now targets `0.3.0+9`. Its local Android and iPad Preview +installations are engineering candidates, with release qualification and channel +delivery tracked separately. The recorded existing-channel baseline is Android +Play `0.2.0 (8)` and iPad TestFlight `0.2.0 (6)`; the earlier build-5 Transporter +and build-8 submission handoffs remain historical artifact records. ### App source -- Prepared app source candidate `0.3.0+9` with bounded on-device current-text +- Merged app source candidate `0.3.0+9` with bounded on-device current-text recovery using Drift. Exact text and metadata commit atomically; startup offers offline preview, Restore and confirmed Discard, with separate local checkpoint status and an explicit Save recovery copy action. Storage errors diff --git a/README.md b/README.md index c5c48b08..3668b45a 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ fetches and validates the complete batch, shows the exact destination paths, and asks separately before overwriting existing files. Import never creates a remote folder hierarchy, opens an editor document, or runs downloaded code. -The next App source candidate is `0.3.0+9`; App and firmware versions are +The merged App source candidate is `0.3.0+9`; App and firmware versions are independent. The published Android version is `0.2.0`, available through [Google Play open testing](https://play.google.com/store/apps/details?id=dev.pyble.pyble). iPad testing continues through TestFlight. The @@ -93,7 +93,7 @@ same Flutter source and app test gates. The iOS/iPadOS project minimum is 15. ### Next app candidate: local draft recovery -The `0.3.0+9` source candidate adds one on-device current-text recovery copy. +The merged `0.3.0+9` candidate adds one on-device current-text recovery copy. After restart, preview and explicitly Restore or Discard the last committed copy before connecting. “Saved locally” means the matching transaction finished; pending edits may not survive immediate termination. The separate **Save @@ -104,8 +104,9 @@ This bounded feature covers text up to 1 MiB, including Python explicitly copied from Blocks. Blocks workspace graphs, projects/history and exported backups remain outside this increment. Uninstalling or clearing app data removes local copies. See the [candidate execution record](docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md) -for automated and device evidence; source implementation does not establish -store availability or release qualification. +for passing automated checks and candidate-specific device evidence. Local +Android and iPad Preview installations are engineering candidates; their +installation does not establish store availability or release qualification. ### Firmware diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 7af96d59..4e17f19b 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -38,13 +38,14 @@ v0.7.0 remains non-normative and requires separate maintainer approval. was not exercised. The pilot kit, recovery design and validation inventory are prepared; this does not complete the Sprint or board qualification. - Validate and qualify the implemented [bounded current-text recovery candidate](developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md) - against the [contract](specifications/App/current-draft-recovery.md). Source + against the [contract](specifications/App/current-draft-recovery.md). Merged candidate `0.3.0+9` supplies atomic local checkpoints and offline recovery; full A-24 and Blocks graph persistence remain separate scope. The original 45–72 hour estimate remains a forecast, not measured effort. - Correct the [stale public TestFlight description](developments/2026-q4-reliable-workflow/c1-s1/05_TestFlight_Metadata_Correction.md) through the distribution owner; replacement copy is prepared, not published. -- Prepare the next app `0.3.0+9` candidate while retaining the published 0.2.0 channel baseline. The +- Complete release qualification and channel delivery for merged app `0.3.0+9`, + retaining the recorded 0.2.0 channel baseline until the new channel is verified. The [Android publication review](testing/website/android-open-testing-2026-09-25.md) records live open-testing availability. The [prepared build-8 handoff](testing/google-play/0.2.0-build-8.md) remains a diff --git a/docs/decisions/0048-bounded-current-text-draft-recovery.md b/docs/decisions/0048-bounded-current-text-draft-recovery.md index 4bf725f2..bf2d6c7e 100644 --- a/docs/decisions/0048-bounded-current-text-draft-recovery.md +++ b/docs/decisions/0048-bounded-current-text-draft-recovery.md @@ -5,8 +5,9 @@ **Status:** Accepted for the bounded implementation; candidate source implemented 2026-10-31 under the user's next-release request. The contract was specified -2026-09-25 during C1-S1. Final integrated checks, required physical evidence and -release admission remain pending; no named human sign-off is claimed. +2026-09-25 during C1-S1. PR #40 merged the source and integrated CI passes. +Required physical acceptance and release admission remain pending; no named +human sign-off is claimed. ## Context diff --git a/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md b/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md index 2701f617..72954d9f 100644 --- a/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md +++ b/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md @@ -18,7 +18,7 @@ This package derives execution views from the strategy. It does not replace normative specifications, expand hardware claims, create GitHub issues, or authorize store/website publication. The strategy and original package were recorded together in planning baseline `d039db0`. The [C1-S1 execution record](c1-s1/00_Execution_Record.md) owns actual results and blockers. -**31 October implementation update:** bounded recovery work is underway for candidate `0.3.0+9`, following the user’s next-release request. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) records source, automated and physical states separately. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours below remain the planning baseline; no completed Sprint, adopted 60-hour capacity forecast or release admission is inferred. +**31 October continuation update:** bounded recovery candidate `0.3.0+9` is merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) at `6f5b3ea`; the integrated suite and post-merge CI pass. Both tablets have local candidate installations and native storage restart evidence. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) tracks the remaining physical acceptance separately from release qualification. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the planning baseline; the current continuation order and unresolved capacity inputs are recorded in the [Sprint plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast). ## Navigation and ownership of information @@ -35,7 +35,7 @@ This package derives execution views from the strategy. It does not replace norm ```mermaid flowchart LR - Strategy["Strategy revision 1.4"] --> Goal["One Product Goal"] + Strategy["Strategy revision 1.6"] --> Goal["One Product Goal"] Goal --> Roadmap["Outcome roadmap and milestones"] Roadmap --> Product["Ordered Product Backlog"] Product --> Planning["Sprint Planning"] @@ -140,7 +140,7 @@ When facts or priority change, update the canonical file above and its dependent | Source | Use and precedence | |---|---| -| [Strategy revision 1.4](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md) | Scope, targets, six-Sprint capacity, three outcomes, Ready program and conditional horizons | +| [Strategy revision 1.6](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md) | Scope, targets, six-Sprint capacity, three outcomes, Ready program and conditional horizons | | [Public roadmap](../../ROADMAP.md), [README](../../../README.md) | Current capability and distribution baseline | | [App specification](../../specifications/App/specs.md), [App TDD](../../specifications/App/TDD.md), [ADR-0010](../../decisions/0010-working-loop-in-memory-document.md) | Persistence contract and recorded implementation deviation; consult frozen working-loop scope | | [Firmware roadmap](../../planning/firmware-v0.6.1-v0.7.0-roadmap.md), [PBLE/1](../../specifications/protocol.md) | v0.7 proposals versus frozen wire behavior; old v0.6.1 publication/#24 wording is historical | diff --git a/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md b/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md index c9ef164c..3c7ffe74 100644 --- a/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md +++ b/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md @@ -7,13 +7,13 @@ |---|---| | Status | C1-S1 has six tasks Done, two Prepared awaiting pilot setup and four Awaiting evidence; existing channel installations verified. Future direction remains conditional and forecasts need revision after sizing | | Planning date | 25 September 2026; dates use Asia/Bangkok | -| Source | [Implementation strategy revision 1.4](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), particularly §§1, 6–9, 12, 14, and 19 | +| Source | [Implementation strategy revision 1.6](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), particularly §§1, 6–9, 12, 14, and 19 | | Inspected baseline | `main` at `23ed764b0ef88dce9720c66fbd1c0655268860cf` | | First cycle | C1: 28 September–20 December 2026; later horizons conditional through September 2028 | | Planning authority | Product Owner orders the Product Backlog; Developers forecast feasible work during Sprint Planning; names and capacity remain unassigned | | Related documents | [Framework](01_Overview_and_Scrum_Framework.md), [milestones](03_Milestones.md), [Sprint Plan](04_Sprint_Plan.md), [stories](05_Product_Backlog_and_Stories.md), [Sprint Backlogs](06_Sprint_Backlogs.md) | -**31 October implementation update:** bounded recovery work is underway for candidate `0.3.0+9`, following the user’s next-release request. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) records source, automated and physical states separately. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours below remain the planning baseline; no completed Sprint, adopted 60-hour capacity forecast or release admission is inferred. +**31 October continuation update:** bounded recovery candidate `0.3.0+9` is merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) at `6f5b3ea`; the integrated suite and post-merge CI pass. Both tablets have local candidate installations and native storage restart evidence. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) tracks the remaining physical acceptance separately from release qualification. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the planning baseline; the current continuation order and unresolved capacity inputs are recorded in the [Sprint plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast). ## Product Goal and decision principle diff --git a/docs/developments/2026-q4-reliable-workflow/03_Milestones.md b/docs/developments/2026-q4-reliable-workflow/03_Milestones.md index 0b085d12..ab96b747 100644 --- a/docs/developments/2026-q4-reliable-workflow/03_Milestones.md +++ b/docs/developments/2026-q4-reliable-workflow/03_Milestones.md @@ -7,12 +7,12 @@ |---|---| | Status | M-01/SG0 remains Blocked on 25 September by pilot ownership/cohort/setup and capacity decisions; existing channel installations verified on retry. M-02 is in progress in the 31 October candidate with acceptance pending; other milestones remain Proposed and forecast windows need replanning | | Planning date | 25 September 2026; dates use Asia/Bangkok | -| Source | [Implementation strategy revision 1.4](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), especially §§4, 8–10, 14, and 19 | +| Source | [Implementation strategy revision 1.6](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), especially §§4, 8–10, 14, and 19 | | Inspected baseline | `main` at `23ed764b0ef88dce9720c66fbd1c0655268860cf` | | Related documents | [Framework](01_Overview_and_Scrum_Framework.md), [roadmap](02_Product_Roadmap.md), [Sprint Plan](04_Sprint_Plan.md), [stories](05_Product_Backlog_and_Stories.md), [Sprint Backlogs](06_Sprint_Backlogs.md) | | Meaning | Milestones describe inspectable outcomes and decision evidence; they are not additional Scrum events or promised releases | -**31 October implementation update:** bounded recovery work is underway for candidate `0.3.0+9`, following the user’s next-release request. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) records source, automated and physical states separately. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours below remain the planning baseline; no completed Sprint, adopted 60-hour capacity forecast or release admission is inferred. +**31 October continuation update:** bounded recovery candidate `0.3.0+9` is merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) at `6f5b3ea`; the integrated suite and post-merge CI pass. Both tablets have local candidate installations and native storage restart evidence. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) tracks the remaining physical acceptance separately from release qualification. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the planning baseline; the current continuation order and unresolved capacity inputs are recorded in the [Sprint plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast). ## Assessment and evidence states diff --git a/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md b/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md index 96a6bf9d..3778fbb0 100644 --- a/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md +++ b/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md @@ -5,14 +5,14 @@ | Field | Value | |---|---| -| Status | C1-S1 remains partial; bounded S2 candidate implementation selected 31 October with acceptance pending. Original S2–S6 dates/hours remain baseline forecasts requiring capacity reconciliation | +| Status | C1-S1 remains partial; bounded S2 candidate merged 31 October with physical acceptance pending. Original S2–S6 dates/hours remain baseline forecasts requiring capacity reconciliation | | Cycle | `C1`, 28 September–20 December 2026, Asia/Bangkok | -| Basis | [Strategy revision 1.4, §8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md#8-twelve-week-implementation-schedule) | +| Basis | [Strategy revision 1.6, §8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md#8-twelve-week-implementation-schedule) | | Product Goal and quality rules | [Working agreement](01_Overview_and_Scrum_Framework.md) | | Acceptance criteria | [Product backlog and stories](05_Product_Backlog_and_Stories.md) | | Task-level proposal | [Sprint backlogs](06_Sprint_Backlogs.md) | -**31 October implementation update:** bounded recovery work is underway for candidate `0.3.0+9`, following the user’s next-release request. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) records source, automated and physical states separately. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours below remain the planning baseline; no completed Sprint, adopted 60-hour capacity forecast or release admission is inferred. +**31 October continuation update:** bounded recovery candidate `0.3.0+9` is merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) at `6f5b3ea`; the integrated suite and post-merge CI pass. Both tablets have local candidate installations and native storage restart evidence. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) tracks the remaining physical acceptance separately from release qualification. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the planning baseline; the current continuation order and unresolved capacity inputs are recorded in the [Sprint plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast). ## Forecast and commitment boundary @@ -44,7 +44,7 @@ The remaining 18h under S2–S4's combined 78h ceiling cannot silently absorb al The next-release instruction selects PYB-006.2 engineering and its required verification, supporting PYB-009.1 recipe work and applicable PYB-008.1 evidence. The [execution record](c1-s2/00_Execution_Record.md) owns actual results. Source -storage/coordinator/UI/guard work is implemented; the usable story remains in +storage/coordinator/UI/guard work is merged and automated checks pass; the usable story remains in progress until all applicable acceptance passes. The original 12–25 October S2 window is historical; calendar position does not mark S2 or S3 complete. @@ -54,6 +54,32 @@ the tables below. Reorder displaced matrix/activation work with actual capacity; keep pilot evidence and the M-01/SG0 gap visible while known engineering work continues. No automatic completion of S1, SG0, broader A-24 or PyBLE Ready follows. +## 31 October continuation order and reforecast + +The user requested completion of the remaining work after reviewing the stage +assessment. The selected engineering order is below. This records actual work +selection; it does not invent a completed Sprint Planning event, human staffing, +measured velocity or a new delivery deadline. The original C1-S3 window is +26 October–8 November; unfinished S2 acceptance carries into that window. + +| Order / stream | Current work and completion evidence | Forecast treatment | +|---|---|---| +| 1 — M-02 recovery acceptance | Complete remaining representative iPad/Android recovery, current-board consent and Blocks-to-Editor checks; reconcile DR-T01–14 against exact artifacts and review the result | Selected now; record actual duration and residual scenarios before forecasting completion | +| 2 — M-04 release qualification | Freeze the selected app artifacts and complete the applicable five-profile × two-platform affected app matrix, provenance and release review | Follows accepted recovery behavior; unchanged firmware does not automatically require fresh firmware-release qualification | +| 3 — M-05 distribution | Prepare the existing Play/TestFlight handoffs; submit only an admitted candidate; record processing/availability and installed-channel evidence separately | Preparation can overlap qualification; external access/review duration is unresolved | +| Parallel — M-01 pilot baseline | Confirm pilot owner, primary cohort, exact reference setup and actual weekly capacity; collect real consented baseline sessions using the prepared kit | Awaiting human inputs; engineering observations are not participant starts | +| Later — M-03/M-06 learning | Collect useful-task and prospective day-7–14 follow-up observations from actual consenting activations | Preserve original recruitment targets; reforecast dates after real recruitment and capacity are known | +| Conditional — Ready rehearsal | Use an assigned second operator for one exact profile only after capacity is selected | Remains optional; it is not a prerequisite for unrelated maintenance delivery | + +Required planning inputs are the named pilot/recruitment owner, selected cohort +and reference setup, actual engineering/pilot hours per week, and any existing +consented session records. Until supplied, the 20h/week assumption, 45–72h +recovery estimate and 60h allocation option remain historical planning inputs. +Do not subtract agent wall-clock time from human capacity or relabel elapsed +calendar time as measured engineering effort. Maintain the original 22 November +activation target alongside any later approved forecast; missed windows remain +missing or late evidence. + ## Capacity model The source assumes one primary maintainer at 20 hours/week. Confirm real availability and any contributor capacity at Planning; extra roles do not create extra hours. diff --git a/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md b/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md index 5024df4a..9fa97fb7 100644 --- a/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md +++ b/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md @@ -6,14 +6,14 @@ | Control | Value | |---|---| | Product Goal | Make the existing tablet workflow trustworthy enough for useful repeat tasks by the selected primary audience | -| Source | [Implementation strategy revision 1.4](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), reviewed 25 September 2026 | +| Source | [Implementation strategy revision 1.6](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), reviewed 25 September 2026 | | Cycle | Proposed 28 September–20 December 2026; Asia/Bangkok | | Baseline | `23ed764b0ef88dce9720c66fbd1c0655268860cf`; completed publication work is evidence, not a new commitment | -| Status | C1-S1: PYB-001.1/.2 and PYB-006.1 scoped work Done; pilot preparation awaits setup, observation work awaits evidence, PYB-009.1 partial; PYB-006.2 candidate source implemented with integrated/physical acceptance pending; later work remains forecast | +| Status | C1-S1: PYB-001.1/.2 and PYB-006.1 scoped work Done; pilot preparation awaits setup, observation work awaits evidence, PYB-009.1 partial; PYB-006.2 source merged and automated checks passing; physical acceptance pending; later work remains forecast | | Accountabilities | Product Owner orders the backlog; Developers size and select work in Sprint Planning; named people and capacity remain to be assigned | | Navigation | [Overview and Scrum](01_Overview_and_Scrum_Framework.md) · [Roadmap](02_Product_Roadmap.md) · [Milestones](03_Milestones.md) · [Sprint plan](04_Sprint_Plan.md) · [Sprint Backlogs](06_Sprint_Backlogs.md) | -**31 October implementation update:** bounded recovery work is underway for candidate `0.3.0+9`, following the user’s next-release request. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) records source, automated and physical states separately. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours below remain the planning baseline; no completed Sprint, adopted 60-hour capacity forecast or release admission is inferred. +**31 October continuation update:** bounded recovery candidate `0.3.0+9` is merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) at `6f5b3ea`; the integrated suite and post-merge CI pass. Both tablets have local candidate installations and native storage restart evidence. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) tracks the remaining physical acceptance separately from release qualification. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the planning baseline; the current continuation order and unresolved capacity inputs are recorded in the [Sprint plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast). ## 1. How to use this backlog @@ -38,7 +38,7 @@ | — | PYB-002 / P0 accuracy | Keep maintained availability claims correct | 002.1: public TestFlight description | PR #33 Android correction complete; residual found during 001 | Correction packet prepared; actual store update/public verification pending | | 2 | PYB-003 / P0 | Conduct a safe, consented pilot with bounded data collection | 003.1 | C1-S1; 001 informs setup | Prepared — awaiting pilot setup and named collection decision | | 3 | PYB-004 / P0 | Observe one reachable audience completing reproducible, useful tasks | 004.1, 004.2 | C1-S1; 001, 003 | 004.1 Prepared — awaiting cohort/setup; 004.2 Awaiting participant evidence | -| 4 | PYB-006 / P0 | Recover the current text draft after process restart | 006.1, 006.2 | Sized in C1-S1; S2–S4 working option requires replanning; known defect does not wait for recruitment | 006.1 Done; 006.2 candidate source implemented, integrated/physical acceptance pending | +| 4 | PYB-006 / P0 | Recover the current text draft after process restart | 006.1, 006.2 | Sized in C1-S1; S2–S4 working option requires replanning; known defect does not wait for recruitment | 006.1 Done; 006.2 source merged, automated checks passing, physical acceptance pending | | 5 | PYB-009 / P0 | Make existing validation reproducible by an operator | 009.1; optional 009.2 | Inventory C1-S1, scoped recipe C1-S2; reproduction only with assigned capacity | T12 Done; 009.1 remains partial | | 6 | PYB-005 / P0 if observed | Remove a demonstrated first-use blocker | 005.1 | C1-S2 candidate; actual 004 findings | Conditional; no defect invented | | 7 | PYB-008 / P0 for claims | Establish the exact candidate's applicable compatibility evidence | 008.1, 008.2 | Representative checks C1-S2; staged matrix C1-S3–S5; 001, 009.1, artifacts | Proposed; hardware and mandatory workload must be costed | @@ -62,8 +62,8 @@ The completed portion of PYB-002 is [PR #33](https://github.com/PyBLE-dev/PyBLE/ | PYB-002.1 | Prepared; store correction pending | Public TestFlight description remains discrepant; build-6 minimum-OS metadata also needs distribution-owner review. No claim of external mutation | | PYB-003.1 / PYB-004.1 | Prepared — awaiting pilot setup | [Pilot kit](c1-s1/02_Pilot_Protocol_and_Observation_Kit.md); technical review completed, but human owner, reachable cohort, tested board setup and collection decision remain missing | | PYB-004.2 / PYB-011.2 | Awaiting participant/observation evidence | T06–T08 await participant sessions; T09 awaits their records. Five baseline starts and all later follow-up remain outstanding | -| PYB-006.1 | Done for design/review/sizing | [Contract and review](c1-s1/03_Recovery_Design_and_Sizing.md); PYB-006.2 implementation remains pending; revised allocation needed | -| PYB-009.1 | Partial | T12 [inventory/cost model](c1-s1/04_Validation_Inventory_and_Operator_Recipe.md) complete; S2 scoped procedure and subsequent operator results still pending | +| PYB-006.1 | Done for design/review/sizing | [Contract and review](c1-s1/03_Recovery_Design_and_Sizing.md); PYB-006.2 was subsequently merged in PR #40; physical acceptance remains pending under the dated S2 record | +| PYB-009.1 | Partial | T12 [inventory/cost model](c1-s1/04_Validation_Inventory_and_Operator_Recipe.md) complete; S2 scoped procedure prepared; candidate execution/reconciliation is tracked in the S2 record | The ordered table above retains original priorities and forecast labels. It is not evidence that all proposed dates remain feasible after the recovery estimate; use the [reforecast requirements](04_Sprint_Plan.md#c1-s1-findings-and-required-reforecast) before selecting future work. diff --git a/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md b/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md index 745555fa..a2eba5bb 100644 --- a/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md +++ b/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md @@ -5,7 +5,7 @@ | Field | Rule | |---|---| -| Status | C1-S1: six Done, two Prepared, four Awaiting evidence. C1-S2 bounded candidate implementation is underway on 31 October; integrated/physical acceptance remains pending. Original allowances/calendar remain baseline; later work requires replanning | +| Status | C1-S1: six Done, two Prepared, four Awaiting evidence. C1-S2 candidate source is merged and automated checks pass; required physical acceptance remains pending on 31 October. Original allowances/calendar remain baseline; later work requires replanning | | Product/Sprint Goals | [Framework](01_Overview_and_Scrum_Framework.md) and [Sprint plan](04_Sprint_Plan.md) | | Acceptance authority | [Product backlog and stories](05_Product_Backlog_and_Stories.md); task completion never overrides a parent story's acceptance criteria | | Selection | Developers confirm scope, ownership, estimates and task plan at each Sprint Planning | @@ -20,7 +20,7 @@ The initial tasks are small planning units, generally 1–4 hours. If a task or Record optional follow-up consent and the prospective day-7–14 window at each activation. Collect follow-up as windows arrive, starting with the first cohort; do not postpone early cohorts until S5. S1 observation allowances include any follow-up due within S1; S2-T11, S3-T10 and later follow-up rows continue it. Developers must reallocate headroom or other selected work if actual pilot effort exceeds these allowances, preserving required recovery review and tests. Record missed windows as missing/late evidence rather than reconstructing an on-time response. -**31 October implementation update:** bounded recovery work is underway for candidate `0.3.0+9`, following the user’s next-release request. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) records source, automated and physical states separately. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours below remain the planning baseline; no completed Sprint, adopted 60-hour capacity forecast or release admission is inferred. +**31 October continuation update:** bounded recovery candidate `0.3.0+9` is merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) at `6f5b3ea`; the integrated suite and post-merge CI pass. Both tablets have local candidate installations and native storage restart evidence. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) tracks the remaining physical acceptance separately from release qualification. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the planning baseline; the current continuation order and unresolved capacity inputs are recorded in the [Sprint plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast). ## C1-S1 — reproduce the current workflow and size recovery @@ -65,14 +65,14 @@ Five baseline starts is a target, not the implied result of reserving six hours. | Task ID | Parent child item | Proposed task and expected output | Dependency | Contribution role | h | Status | |---|---|---|---|---|---:|---| | C1-S2-T01 | PYB-009.1 | Complete the scoped restart/setup/operator recipe and expected evidence for this increment | 006.1 scope; initial 009.1 inventory | QA + App | 2 | Prepared — scoped recipe; execution/reproduction pending | -| C1-S2-T02 | PYB-006.2 | Add meaningful failing tests for the accepted write boundary, relaunch recovery and absence of implicit board/network actions | Approved 006.1; specification-first sequence | App | 2 | Implemented — component tests; final integration pending | -| C1-S2-T03 | PYB-006.2 | Add failing tests for interrupted/corrupt/full local storage and stale completions against newer edits | Approved 006.1 | App | 2 | Implemented — failure/race tests; final integration pending | +| C1-S2-T02 | PYB-006.2 | Add meaningful failing tests for the accepted write boundary, relaunch recovery and absence of implicit board/network actions | Approved 006.1; specification-first sequence | App | 2 | Implemented and checked — integrated suite and CI pass | +| C1-S2-T03 | PYB-006.2 | Add failing tests for interrupted/corrupt/full local storage and stale completions against newer edits | Approved 006.1 | App | 2 | Implemented and checked — integrated failure/race suite and CI pass | | C1-S2-T04 | PYB-006.2 | Implement the minimal accepted durable storage/migration behavior until relevant tests pass | T02/T03 red evidence | App | 4 | Implemented — candidate storage; acceptance pending | | C1-S2-T05 | PYB-006.2 | Implement hydration and specified recovery/discard behavior through existing providers | T04 and accepted UI contract | App | 4 | Implemented — candidate coordinator/UI; acceptance pending | | C1-S2-T06 | PYB-006.2 | Complete non-destructive error handling, truthful scope and localized recovery guidance | T04/T05 | App | 2 | Implemented — candidate guidance/errors; acceptance pending | -| C1-S2-T07 | PYB-006.2 | Run affected controller/widget/lifecycle regressions and repository gates; resolve scoped failures | T04–T06 | App + QA | 2 | In progress — integrated regression and gates | -| C1-S2-T08 | PYB-008.1 | Run representative Android restart/interruption scenarios on the recorded candidate; retain actual results | T01/T07; device/candidate | QA | 2 | Awaiting physical candidate evidence — Android | -| C1-S2-T09 | PYB-008.1 | Run representative iPad restart/interruption scenarios on the recorded candidate; retain actual results | T01/T07; device/candidate | QA | 2 | Awaiting physical candidate evidence — iPad | +| C1-S2-T07 | PYB-006.2 | Run affected controller/widget/lifecycle regressions and repository gates; resolve scoped failures | T04–T06 | App + QA | 2 | Implemented and checked — 972 tests and pinned CI gates pass | +| C1-S2-T08 | PYB-008.1 | Run representative Android restart/interruption scenarios on the recorded candidate; retain actual results | T01/T07; device/candidate | QA | 2 | In progress — native restart and normal recovery/board consent observed; remaining applicable scenarios pending | +| C1-S2-T09 | PYB-008.1 | Run representative iPad restart/interruption scenarios on the recorded candidate; retain actual results | T01/T07; device/candidate | QA | 2 | In progress — native restart and normal-app launch observed; remaining applicable scenarios pending | | C1-S2-T10 | PYB-006.2 | Review integration/evidence and update user guidance plus carried A-24/Blocks limitations | T07–T09 and all applicable acceptance | App + reviewer | 1 | In progress — integration review and evidence reconciliation | | C1-S2-T11 | PYB-011.2 | Collect due consented follow-up and account for early windows, missing responses and task opportunity | 004 prospective method; actual activation dates | Pilot | 1 | Awaiting participant evidence — no activation dates supplied | | **C1-S2 total** | | | | | **24** | | diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s1/00_Execution_Record.md b/docs/developments/2026-q4-reliable-workflow/c1-s1/00_Execution_Record.md index ee5485be..c63a41ea 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s1/00_Execution_Record.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s1/00_Execution_Record.md @@ -73,7 +73,7 @@ The original 136-hour task allocation, 20-hour planned headroom and 84-hour rese The user requested the next-release implementation after the C1-S1 integration and cleanup. The [C1-S2 record](../c1-s2/00_Execution_Record.md) now tracks candidate -source implementation and its outstanding integrated/physical acceptance. The +merged source, passing integrated CI and outstanding physical acceptance. The 25 September findings above remain historical evidence. This handoff does not complete the two Prepared or four Awaiting-evidence S1 tasks, M-01/SG0, full A-24, participant observations, a Ready badge or store delivery. diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s1/02_Pilot_Protocol_and_Observation_Kit.md b/docs/developments/2026-q4-reliable-workflow/c1-s1/02_Pilot_Protocol_and_Observation_Kit.md index bf82aaff..3dec3166 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s1/02_Pilot_Protocol_and_Observation_Kit.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s1/02_Pilot_Protocol_and_Observation_Kit.md @@ -22,6 +22,18 @@ **Device-retry review, 25 September 2026:** a separate source review checked the task cards against current localized UI, the first-program tutorial and PBLE/1 behavior. Save and Run remain separate explicit actions; the programs are bounded and console-only; STOP limits, assistance, missing data and consent/follow-up separation are consistent. This completes technical QA of the prepared kit, not the named human collection decision or an observed participant session. The [Android](06_Android_Channel_Verification.md) and [iPad](07_iPad_Channel_Verification.md) checks also establish current channel installations and launch. They do not provide a cohort, consent or exact-board smoke result. +**31 October continuation:** the engineering candidate `0.3.0 (9)` is now +installed separately on both tablets, with its engineering evidence recorded in +[the S2 record](../c1-s2/00_Execution_Record.md). The owner/cohort/reference-setup +and capacity inputs remain unconfirmed; no participant records have been +supplied. This prepared kit already provides the task cards, consent choices, +observation rows and follow-up accounting needed for the first sessions. +Before collecting on a new candidate, name that exact app/firmware/setup in the +pilot decision record and record a prospective cohort/version decision. Do not +pool different build/task cohorts silently or count engineering qualification +runs as participant starts. The original 25 September preparation above remains +historical. + This kit is a manual, explicitly consented pilot procedure. It changes neither the app's data handling nor the [public privacy policy source](../../../../tools/web/src/app/privacy/page.tsx) and its [offline counterpart](../../../../app/lib/app/pages/privacy_policy_page.dart). diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md index eeef9d1b..bb46b0c3 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md @@ -8,10 +8,10 @@ | Execution date | 31 October 2026; Asia/Bangkok | | Authorization | User requested implementation for the next release after the C1-S1 integration and stage review | | Integrated starting baseline | `8dde8d6107e4b3c3fab29340ecec5b40c877444b`; previously merged C1-S1 work | -| Candidate | App `0.3.0+9`; local source/build candidate, with final revision/artifact identity to be recorded at qualification | +| Candidate | App `0.3.0+9`; source merged at `6f5b3ea`; local Android and iPad candidates identified in the platform report; release artifacts require their own identity binding | | Scope | PYB-006.2 bounded current-text recovery; supporting PYB-009.1 recipe and applicable PYB-008.1 observations | | Contract | [Current-draft recovery](../../../specifications/App/current-draft-recovery.md), [ADR-0048](../../../decisions/0048-bounded-current-text-draft-recovery.md) | -| Overall state | Candidate source implemented; 972 ordinary Flutter tests pass, Android engineering recovery checks pass, and required physical acceptance remains partial. PYB-006.2 and M-02 are not Done | +| Overall state | Candidate source merged; 972 ordinary Flutter tests and post-merge CI pass, both native platform storage restart checks pass, and required physical acceptance remains partial. PYB-006.2 and M-02 are not Done | | S1 state | Unchanged: six Done, two Prepared, four Awaiting evidence; M-01/SG0 and pilot work remain unfinished | | Capacity/calendar | Original S2 allowance 24h and 12–25 October dates remain historical forecasts. The 45–72h estimate / 60h S2–S4 option is not measured effort or confirmed human capacity | | Method | Separate storage, coordinator and UI Git worktrees; root integrates board/session guards, regressions, release records and qualification attempts | @@ -42,38 +42,38 @@ source progress; it is not a Done Increment or release admission. | Task | Current state | Remaining acceptance | |---|---|---| | C1-S2-T01 / PYB-009.1 | Prepared — [scoped recipe](01_Operator_Recipe.md) | Execute against exact candidate; reconcile observations and operator gaps | -| C1-S2-T02 / PYB-006.2 | Implemented — checkpoint/relaunch/side-effect tests | Final integrated regression and candidate evidence | -| C1-S2-T03 / PYB-006.2 | Implemented — storage failure/interruption/stale-operation tests | Final integrated regression and candidate evidence | -| C1-S2-T04 / PYB-006.2 | Implemented — durable storage and schema | Final integration and physical storage evidence | -| C1-S2-T05 / PYB-006.2 | Implemented — startup choices/coordinator/UI | Final integration and physical interaction/restart evidence | -| C1-S2-T06 / PYB-006.2 | Implemented — failure guidance/localization/volatile choices | Final localization/accessibility/regression checks | -| C1-S2-T07 / PYB-006.2 | Implemented and checked — full analysis, 972 ordinary tests, formatting and source gates pass | Pinned golden CI and final release evidence remain tracked separately | -| C1-S2-T08 / PYB-008.1 | Awaiting physical Android candidate evidence | Lenovo connected and isolated engineering storage/relaunch/offline UI checks pass; remaining board/interaction matrix recorded in [platform report](02_Platform_Qualification.md) | -| C1-S2-T09 / PYB-008.1 | Awaiting physical iPad candidate evidence | iPad USB signed profile seed → kill → verify checks pass; full physical UI/board interaction matrix remains pending | +| C1-S2-T02 / PYB-006.2 | Implemented — checkpoint/relaunch/side-effect tests | Integrated regression passes; reconcile required physical acceptance | +| C1-S2-T03 / PYB-006.2 | Implemented — storage failure/interruption/stale-operation tests | Integrated regression passes; reconcile required physical acceptance | +| C1-S2-T04 / PYB-006.2 | Implemented — durable storage and schema | Integrated regression and native storage checks pass; reconcile required physical acceptance | +| C1-S2-T05 / PYB-006.2 | Implemented — startup choices/coordinator/UI | Integrated regression passes; remaining physical interaction/restart checks | +| C1-S2-T06 / PYB-006.2 | Implemented — failure guidance/localization/volatile choices | Automated localization/accessibility/regression checks pass; applicable physical checks remain separate | +| C1-S2-T07 / PYB-006.2 | Implemented and checked — full analysis, 972 ordinary tests, formatting and source gates pass | Pinned golden/native CI passed on PR #40 and merged `6f5b3ea`; release evidence remains separate | +| C1-S2-T08 / PYB-008.1 | In progress — physical Android observations recorded | Lenovo connected and isolated engineering storage/relaunch/offline UI checks pass; remaining board/interaction matrix recorded in [platform report](02_Platform_Qualification.md) | +| C1-S2-T09 / PYB-008.1 | In progress — physical iPad observations recorded | iPad signed profile seed → kill → verify checks pass; normal Preview build launches and sees five boards; remaining recovery UI/board interaction checks are pending | | C1-S2-T10 / PYB-006.2 | In progress — integration/evidence review | Record final checks, immutable candidates, physical results and carried limitations | | C1-S2-T11 / PYB-011.2 | Awaiting participant evidence | No consenting activation dates or mature follow-up records supplied | ## Required scenario evidence -Component reports below are dated engineering results before final integration. -Overlapping runs must not be added into one test count. The integration owner -records the final complete run and exact candidate revision before acceptance. +Component counts below are historical subsets of the integrated 972-test run. +They must not be added together. PR #40 and post-merge CI confirm the combined +source gates; physical observations remain bound to their recorded artifacts. | Scenario | Implemented evidence | Current acceptance state | |---|---|---| | DR-T01 | Real repository validation/round-trip tests: exact Unicode, filenames, content bound and invalid metadata | Automated integrated suite passing | | DR-T02 | File-backed close/reopen retains the committed slot and generation | Automated suite and Lenovo separate-process harness passing; iPad separate-process profile harness passing; full interaction matrix pending | -| DR-T03 | Child-process SIGKILL before/after write checkpoints; whole old/new committed content oracle | Host interruption tests and Lenovo force-stop/relaunch pass; precisely timed physical interruption phases and complete interaction matrix pending | +| DR-T03 | Child-process SIGKILL before/after write checkpoints; whole old/new committed content oracle | Host fault-controlled interruption tests and both-platform killed-process restart checks pass; deterministic physical phase timing is not claimed; remaining normal-app interaction scenarios are recorded separately | | DR-T04 | Real storage failure injection plus controller failure state retains previous copy and live edits | Automated integrated suite passing | | DR-T05 | Bad hash/metadata, corrupt/truncated database and unsupported version fixtures; bounded startup error UI | Automated integrated suite passing | -| DR-T06 | Fresh v1/reopen, exported first schema and unsupported-version refusal; no fictional released v0 | Component tests passing; future schema migrations remain gated on new fixtures | +| DR-T06 | Fresh v1/reopen, exported first schema and unsupported-version refusal; no fictional released v0 | Integrated schema tests pass; future schema migrations remain gated on new fixtures | | DR-T07 | Explicit Restore/Discard, failed discard, volatile Retry, late hydration and no implicit board writes | Automated suite and Lenovo Restore/offline preview/relaunch pass; complete interaction matrix pending | -| DR-T08 | Deterministic 500ms / continuous-edit 2s scheduling; delayed commits, startup timeout and epoch tests | Component tests passing; physical lifecycle interruption pending | +| DR-T08 | Deterministic 500ms / continuous-edit 2s scheduling; delayed commits, startup timeout and epoch tests | Integrated clock/epoch/lifecycle tests pass; candidate-specific physical interruption scope remains explicit | | DR-T09 | Active write/replacement serialization, tombstones and no queued resurrection | Automated integrated suite passing | | DR-T10 | Recovered-target cancellation and stale document/path/session consent | Recording-connection tests and Lenovo current-target Save/Run consent pass; iPad physical board consent pending | -| DR-T11 | Stable-facade board swap, delayed GET, stale completion and PUT-to-Run attachment refusal | Recording-connection tests passing; final integrated regression pending | -| DR-T12 | Explicit generated text handoff with editor-epoch/revision guards; existing workspace/sidecar behavior retained | Affected automated regression required in final suite; representative device checks pending | -| DR-T13 | Local/board status separation, ARB error/status copy, disconnected preview, keyboard and 2× text | Automated UI/localization pass; physical Lenovo 2× preview observed; local golden baseline mismatch reproduced unchanged, pinned CI pending | +| DR-T11 | Stable-facade board swap, delayed GET, stale completion and PUT-to-Run attachment refusal | Integrated recording-connection/session regression passes | +| DR-T12 | Explicit generated text handoff with editor-epoch/revision guards; existing workspace/sidecar behavior retained | Affected automated regression passes in the integrated suite; representative device checks pending | +| DR-T13 | Local/board status separation, ARB error/status copy, disconnected preview, keyboard and 2× text | Automated UI/localization/semantics and pinned golden CI pass; physical Lenovo 2× preview observed; local macOS mismatch remains documented separately | | DR-T14 | Exact recorded Android/iPad candidate, offline restore and explicit current target consent | Partial Lenovo engineering observations; signed iPad profile seed/verify pass; physical board consent still pending | ## Verification and remaining admission @@ -102,25 +102,27 @@ flowchart LR M01 -. "Independent evidence stream" .-> REVIEW ``` -The next required work is the final integrated regression plus exact-candidate -physical recovery/consent observations and any affected release matrix. Preserve +The next required work is the remaining exact-candidate physical recovery, +Blocks handoff and consent observations, followed by the applicable release matrix. Preserve failed/not-run rows rather than weakening the contract to meet a date. Human pilot work continues as its own evidence stream. No full A-24 completion, qualified release or publication follows from source commits alone. -## Local golden diagnosis and review branch - -The 33 local pixel comparisons fail on macOS 27.0.1 with Flutter 3.44.1. -All 33 rendered test images match byte-for-byte with the same tests run from -unchanged `origin/main` at `8dde8d6` on this host. Existing baselines are retained; -this result is not a golden pass. The workflow pins macOS 15, whose result is -tracked on [draft PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40). -At `709556e`, both the push and pull-request workflow runs passed all 18 jobs -(36 successful checks total), including the pinned golden and native Android -jobs. Subsequent changes in this record are documentation-only; their workflow -state remains visible on the PR. The source and documentation are reviewable -on `feature/current-draft-recovery`. -No merge or store publication is implied by that draft. +## Integrated source and CI review + +The 33 local pixel comparisons differ on macOS 27.0.1 with Flutter 3.44.1. +All 33 rendered images matched the same tests from unchanged `8dde8d6` on this +host, so existing baselines were retained. This local diagnosis is not a golden +pass; the pinned macOS 15 CI jobs provide that result. + +[PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) merged on 31 October at +`6f5b3ea73a70342331fb49d0685938ce2a4cae11` using the repository-required rebase +method. All 29 commits retained their DCO sign-offs and equivalent patches; the +merged tree equals the reviewed `ace7dbb` tree. All 36 pre-merge checks passed. +The [post-merge workflow](https://github.com/PyBLE-dev/PyBLE/actions/runs/41183672112) +also completed successfully, including pinned goldens and native Android jobs. +The feature branch was removed after verification. Source integration does not +establish store publication or acceptance of unperformed physical scenarios. The final boundedness audit added SQL byte/count preflights before metadata or row materialization: corrupt metadata is capped before JSON reaches the UI diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/01_Operator_Recipe.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/01_Operator_Recipe.md index f62f3a4d..02a0a0c2 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/01_Operator_Recipe.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/01_Operator_Recipe.md @@ -17,7 +17,7 @@ |---|---| | Source and app | Exact source SHA, clean/dirty state, `pubspec` version/build, platform build command, retained artifact SHA-256 and installed identity; do not identify a candidate solely by a branch name | | Devices | Actual Android model/API and iPad model/iPadOS; available application installation/signing route; accessible persistent storage | -| Current access | Android Lenovo is absent from current ADB discovery; an emulator is supplemental only. iPad is visible wirelessly but Developer Mode currently blocks development execution | +| Current access | Both Lenovo and iPad are connected. The Android normal-entry candidate runs locally; signed iPad profile builds install and launch through `devicectl`. The Flutter debug/JIT route remains a separate limitation, not a blocker for profile-mode physical execution | | User data | Preserve existing store installations and their data. Use a separate qualification identity/container when running test applications; never uninstall or clear app data to manufacture a passing recovery result | | Board-backed steps | Exact supported board profile, firmware identity, harmless setup and explicit destination; reserve a disposable user file that cannot affect startup or the PyBLE agent | | Evidence | Ignored local folder with commands, timestamps, outcome logs and artifact hashes; publish only reviewed redacted results, not device identifiers or user source | diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/02_Platform_Qualification.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/02_Platform_Qualification.md index dd45e395..f3df86e9 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/02_Platform_Qualification.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/02_Platform_Qualification.md @@ -10,7 +10,7 @@ | Scope | Local storage, explicit offline recovery and platform builds; partial evidence toward DR-T02/03/07/13/14 | | Acceptance | Engineering observations only; full physical board consent, interruption/interaction matrix and release qualification remain pending | | Raw evidence | Ignored `local/recovery-implementation/`: commands/results, source manifests, screenshots/UI dumps, retained checkpoint and APK; raw captures are not committed | -| Review | [Execution record](00_Execution_Record.md), [operator recipe](01_Operator_Recipe.md), [draft PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) | +| Review | [Execution record](00_Execution_Record.md), [operator recipe](01_Operator_Recipe.md), [merged PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) | ## Isolation and artifact identity @@ -170,3 +170,25 @@ checkpoint files and signed archives were retained. The original TestFlight application remained installed and was brought forward without terminating it. The separate Lenovo production-entry candidate remains available for review; its test draft and board test file were cleared as described above. + +## Post-merge iPad normal-app deployment — 31 October + +After PR #40 merged at `6f5b3ea`, the normal `lib/main.dart` entry point was built +in signed profile mode and installed under the isolated +`dev.pyble.recoveryqualification` identity with the display name **PyBLE Preview**. +This replaces the earlier test-only harness route with the normal candidate UI; +the existing TestFlight installation remains a separate app. + +| Evidence | Observation | +|---|---| +| Source | All 100 copied `lib/` files, pubspec and lockfile match merged source; only the isolated native application identity and display name differ | +| Artifact | Retained `ipad-preview-0309/PyBLE-Preview-0.3.0-9-profile.app.zip` beneath ignored `local/recovery-implementation/`; SHA-256 `c91bc6f7e14f421a528668bd3723e3f965d55f79f11ea90fec707a8fb15a4d1a` | +| Build and signature | Normal `lib/main.dart`, `0.3.0 (9)`, profile mode; no qualification-phase Dart define; strict code-signature verification passes | +| Installed apps | PyBLE Preview `0.3.0 (9)` and original PyBLE TestFlight `0.2.0 (6)` both present | +| Launch and discovery | Normal disconnected scan UI launches and displays `5646`, `C81A`, `DA86`, `8C9E` and `3DCB` | +| Evidence scope at deployment | Installation/launch/discovery only; no board connection or write performed during this deployment checkpoint | +| Raw receipt | `ipad-preview-0309/deployment-observation.json`, source manifest, installed-app metadata and captures retained privately | + +This observation explains the two iPad icons and versions. It supplies no new +TestFlight availability claim and does not by itself satisfy the normal-app +recovery/board-consent scenarios in DR-T14. diff --git a/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md b/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md index 263d13dd..ea9fcf57 100644 --- a/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md +++ b/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md @@ -11,10 +11,10 @@ | Field | Value | |---|---| -| Document version | 1.5 — bounded recovery candidate implementation; original filename retained | +| Document version | 1.6 — merged recovery candidate and acceptance continuation; original filename retained | | Prepared | 25 September 2026 | -| Last reviewed | 31 October 2026; bounded current-text recovery candidate selected and implemented; acceptance tracked separately | -| Status | C1-S1 has six tasks Done, two Prepared awaiting pilot setup and four Awaiting evidence; Sprint and SG0 remain unfinished. Future capacity and scope need replanning; no new protocol behavior approved | +| Last reviewed | 31 October 2026; PR #40 merged and integrated CI passed; physical acceptance and release continuation tracked separately | +| Status | C1-S1 has six tasks Done, two Prepared awaiting pilot setup and four Awaiting evidence; Sprint and SG0 remain unfinished. Bounded recovery source is merged, with physical acceptance and release qualification underway. Human capacity and recruitment dates need replanning; no new protocol behavior approved | | Product | PyBLE — Python over Bluetooth Low Energy | | Organization | SciLabPro | | Planning horizon | Immediate 12-week delivery cycle, followed by conditional expansion through September 2028 | @@ -26,7 +26,7 @@ **Scope of this document.** This plan converts the preceding PyBLE strategy discussion into executable workstreams, priorities, acceptance criteria, and decision gates. Existing repository specifications and contributor rules remain authoritative. Proposed features, names, metrics, staffing, and dates below are planning choices—not claims that those features exist or that resources and approvals are secured. -**Evidence boundary.** The baseline review inspected repository source, specifications, test entry points, publication records, and the GitHub state of PR #33 and issue #24 on 25 September. Revision 1.2 incorporates the subsequent strategy and PyBLE Ready feedback. The dated Android publication review establishes listing status only. Revision 1.3 records direct live-channel/website checks and the original unavailable/locked device attempts. Revision 1.4 adds the connected-device retry in the [C1-S1 ledger](../developments/2026-q4-reliable-workflow/c1-s1/01_Channel_and_Artifact_Ledger.md): existing Play `0.2.0 (8)` and TestFlight `0.2.0 (6)` installations and launches verified. Fresh enrollment/reinstallation was not performed. Android's code/asset comparison supports historical source mapping; iPad source mapping remains unknown. No participant outcome or new physical-board result has been measured. Previously reported publicity and GitHub counts are not proof of product-market fit.[^android-review] +**Evidence boundary.** The baseline review inspected repository source, specifications, test entry points, publication records, and the GitHub state of PR #33 and issue #24 on 25 September. Revision 1.2 incorporates the subsequent strategy and PyBLE Ready feedback. The dated Android publication review establishes listing status only. Revision 1.3 records direct live-channel/website checks and the original unavailable/locked device attempts. Revision 1.4 adds the connected-device retry in the [C1-S1 ledger](../developments/2026-q4-reliable-workflow/c1-s1/01_Channel_and_Artifact_Ledger.md): existing Play `0.2.0 (8)` and TestFlight `0.2.0 (6)` installations and launches verified. Fresh enrollment/reinstallation was not performed. Android's code/asset comparison supports historical source mapping; iPad source mapping remains unknown. No participant outcome was measured in that baseline review. The subsequent [C1-S2 record](../developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md) adds candidate-specific native storage/restart and board-workflow observations, PR #40 merge evidence and successful integrated CI. Those engineering observations do not supply participant outcomes. Previously reported publicity and GitHub counts are not proof of product-market fit.[^android-review] **Continuation decision.** Carry forward the completed Android publication/copy correction. Concentrate weekly execution on three outcomes: verify what users install, preserve their work through interruptions, and observe useful repeat tasks in one primary audience. Reuse existing lifecycle handling, tutorials, conformance fixtures, and release tooling. A bounded PyBLE Ready rehearsal can reuse one existing profile's evidence work; new ports, broad badge promotion, classroom bundles, and new protocol behavior remain conditional. @@ -38,6 +38,7 @@ | 1.3 | Executed C1-S1 repository deliverables in parallel worktrees; recorded device/pilot blockers, stale TestFlight metadata, a bounded recovery contract and larger engineering/matrix estimates; future allocations require replanning | | 1.4 | Verified existing Play/TestFlight installations on connected tablets; recorded artifact evidence and remaining provenance/metadata limits; replaced blanket pilot blockers with Prepared/Awaiting evidence states without waiving acceptance criteria | | 1.5 | Implemented bounded current-text recovery for source candidate 0.3.0+9; added candidate execution/operator records; preserved remaining pilot, platform and release gates | +| 1.6 | Reconciled PR #40 merge, passing integrated CI and both local tablet candidates; selected acceptance → qualification → distribution continuation, with human capacity and participant evidence still explicit | ## Contents @@ -119,10 +120,10 @@ The inspected repository already contains the following capabilities and develop | Area | Existing baseline | Consequence for implementation | |---|---|---| -| Tablet app | Flutter app; historical source baseline `0.2.0+8`; next candidate `0.3.0+9` | Improve and qualify the existing app rather than create a new client | +| Tablet app | Flutter app; historical source baseline `0.2.0+8`; merged candidate `0.3.0+9` | Improve and qualify the existing app rather than create a new client | | Distribution | Android 0.2.0 published on Google Play for open testing; iPad external TestFlight beta | Verify installed build identity separately; production-track availability is not claimed | | Normal workflow | BLE discovery, PBLE/1 connection, editor, files, run/stop, soft reboot, console | Measure and repair the complete workflow, not isolated features | -| Mobile state | Session ownership and connection retirement protections already implemented; current-text recovery implemented in the next source candidate | Qualify bounded recovery on recorded platform candidates; retain full-state obligations | +| Mobile state | Session ownership and connection retirement protections already implemented; current-text recovery merged in the `0.3.0+9` source candidate | Qualify bounded recovery on recorded platform candidates; retain full-state obligations | | Learning | Blockly, tutorials, reviewed screenshots, official examples repository | Improve discoverability and completion; do not duplicate the Learning Center | | Import | Reviewed, SHA-pinned public GitHub `.py` import | Preserve preview, explicit overwrite approval, and non-execution on import | | Firmware | Public v0.6.1 recorded as owner-confirmed | Preserve the distinction between publication and complete automated qualification | @@ -384,6 +385,14 @@ The cycle intentionally excludes a complete new protocol version, full classroom ### 8.2 Sprint plan +**31 October continuation:** PR #40 has merged and integrated CI passes. Complete +remaining M-02 physical acceptance, then the applicable M-04 app-release matrix +and M-05 channel delivery; prepare distribution in parallel where independent. +The [dated continuation order](../developments/2026-q4-reliable-workflow/04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) +records this selection and the human capacity/pilot inputs still needed. Source +progress does not reconstruct the original Sprint schedule or participant +sessions. The original forecasts remain below for comparison. + **Reforecast required after C1-S1:** the hour rows below retain the original 136-hour base allocation, not an accepted revised selection. Recovery's 45–72 hour estimate exceeds S2's allowance. A conditional S2/S3/S4 allocation of 26/22/12 hours preserves each 26-hour ceiling but leaves only 18 hours for displaced work across those three Sprints. Reorder matrix, activation and conditional fixes with actual owners/access; reassess S5/S6 and the 22 November recruitment target. Do not borrow the event reserve silently, drop failure cases, or count one physical run twice. The [Sprint plan](../developments/2026-q4-reliable-workflow/04_Sprint_Plan.md#c1-s1-findings-and-required-reforecast) owns the detailed comparison. diff --git a/docs/specifications/App/TDD.md b/docs/specifications/App/TDD.md index cd7354af..092b1d0e 100644 --- a/docs/specifications/App/TDD.md +++ b/docs/specifications/App/TDD.md @@ -705,7 +705,7 @@ Drift schema versions with explicit `MigrationStrategy` step migrations (forward ### 9.3 Bounded current-text recovery (specified) -**C1-S1 / PYB-006.1 contract, 2026-09-25; C1-S2 / PYB-006.2 candidate source implementation, 2026-10-31. Integrated and physical acceptance pending.** +**C1-S1 / PYB-006.1 contract, 2026-09-25; C1-S2 / PYB-006.2 source merged in PR #40, 2026-10-31. Integrated CI passes; required physical acceptance remains pending.** [ADR-0048](../../decisions/0048-bounded-current-text-draft-recovery.md) and [current-draft-recovery.md](current-draft-recovery.md) own the bounded successor to ADR-0010. Start with the necessary `projects`/`project_files` subset and the diff --git a/docs/specifications/App/current-draft-recovery.md b/docs/specifications/App/current-draft-recovery.md index 20b34eb4..0ba8e6e6 100644 --- a/docs/specifications/App/current-draft-recovery.md +++ b/docs/specifications/App/current-draft-recovery.md @@ -6,7 +6,7 @@ | Field | Value | |---|---| | Design baseline | 25 September 2026; C1-S1-T10/T11, PYB-006.1 | -| Status | Bounded source implementation for candidate `0.3.0+9`, 31 October 2026; final integrated checks and required physical acceptance remain pending | +| Status | Bounded `0.3.0+9` source merged in PR #40 on 31 October 2026; integrated checks pass; required physical acceptance remains pending | | Decision | [ADR-0048](../../decisions/0048-bounded-current-text-draft-recovery.md) | | Parent obligations | A-24; FR-EDIT-7, FR-PROJ-2/6, NFR-REL-3; their broader acceptance remains carried | | Delivery and sizing | [C1-S1 design review](../../developments/2026-q4-reliable-workflow/c1-s1/03_Recovery_Design_and_Sizing.md) | diff --git a/docs/specifications/App/specs.md b/docs/specifications/App/specs.md index 9af35bf2..a2741cb7 100644 --- a/docs/specifications/App/specs.md +++ b/docs/specifications/App/specs.md @@ -167,8 +167,8 @@ The client implements the PBLE/1 wire contract; it references [protocol.md](../p **Working-loop increment — FROZEN (A-20 subset · `[docs]` 2026-07-02, amended 2026-08-22 by [ADR-0012](../../decisions/0012-flutter-code-editor-behind-editorsurface.md), [ADR-0010](../../decisions/0010-working-loop-in-memory-document.md), [TDD §11.1](TDD.md#111-editor)/[§11.6](TDD.md#116-working-loop-provider-contract-frozen); run path superseded 2026-07-27 by [ADR-0013](../../decisions/0013-clean-room-blockly-one-way-file-backed.md)).** In scope: the ADR-0012 `EditorSurface` seam with `flutter_code_editor` 0.3.5 as the default rich adapter and the existing plain `TextField` as a live fallback; Python highlighting, always-visible one-based line numbers, safe auto-indent/Tab handling, and an editor-only 10–24 sp font adjustment in one-point steps (default 14 sp). Code and gutter resize together, platform text scaling still applies, and resizing MUST NOT modify the document, selection, dirty state, or board path. The size is app-session state, independent of file and board, until A-24's single Drift `SettingsStore` makes it durable; a second preferences store MUST NOT be introduced. The single volatile in-memory current document (name/content/dirty/boardPath), **New**, and board-backed Save/Run behavior remain as frozen by ADR-0010/0013. Save and Run capture one normalized document snapshot; transfer completion marks it saved/bound only when the live document still equals that snapshot, so mid-transfer edits or a replacement document remain dirty. The editor binds to `Connection` only (FR-EDIT-6, CON-8), and editor source MUST NOT reach a network analyzer. **Still deferred to A-24 or later:** multi-file tabs, app-owned localized find/replace, the remaining external-keyboard shortcuts, durable display settings, Save-to-project, and buffers-survive-restart. The document provider's `openFromBoard`/`markSaved` and the session display provider are the A-24 persistence hooks (RECORDED deviations, ADR-0010/0012). -**Current-text recovery successor — IMPLEMENTED IN CANDIDATE SOURCE, -acceptance pending (31 October 2026, C1-S2/PYB-006.2; contract +**Current-text recovery successor — MERGED CANDIDATE SOURCE, +automated checks passing; physical acceptance pending (31 October 2026, C1-S2/PYB-006.2; contract `[docs]` 2026-09-25, C1-S1/PYB-006.1, [ADR-0048](../../decisions/0048-bounded-current-text-draft-recovery.md)).** The [bounded recovery contract](current-draft-recovery.md) defines DR-01–07: From b8376fe268af668dcfc4c38d6f600c52637b2204 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 17:31:22 +0700 Subject: [PATCH 02/31] [docs] record iPad acceptance access and preserved candidate evidence Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/04_iPad_Acceptance.md | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md new file mode 100644 index 00000000..7dde3433 --- /dev/null +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md @@ -0,0 +1,66 @@ + + + +# iPad recovery acceptance continuation + +| Field | Record | +|---|---| +| Date | 31 October 2026, Asia/Bangkok | +| Scope | Remaining normal-app recovery and affected workflow observations for PYB-006.2 / PYB-008.1 | +| Current outcome | Candidate installation and launch pass; automated native UI execution awaits the device owner's iPadOS authentication | +| Source | PR #40 merged at `6f5b3ea73a70342331fb49d0685938ce2a4cae11`; subsequent planning changes do not change app runtime bytes | +| Candidate | PyBLE Preview `0.3.0 (9)`, normal `lib/main.dart`, signed profile mode, isolated `dev.pyble.recoveryqualification` identity | +| Physical platform | iPad Air 13-inch (M4), model `iPad16,10`, iPadOS `26.6.2` | +| Operator | Automated engineering run on the maintainer's Mac; no independent human review or participant observation claimed | +| Prior results | [Platform observations](02_Platform_Qualification.md); native storage seed/kill/verify is distinct from normal-app interaction acceptance | + +## Candidate and initial state + +The signed app archive is retained privately as +`local/recovery-implementation/ipad-preview-0309/PyBLE-Preview-0.3.0-9-profile.app.zip`. +Its SHA-256 is +`c91bc6f7e14f421a528668bd3723e3f965d55f79f11ea90fec707a8fb15a4d1a`. +The copied Dart runtime matches merged source; only the isolated native identity +and display name distinguish the installation. Signature verification, +installation and foreground launch passed. The disconnected scan displayed all +five board labels. Discovery alone does not establish a connection or completed +board workflow. + +The existing TestFlight `dev.pyble.pyble` installation remains version +`0.2.0 (6)`. The Preview application support files were copied privately before +continuation. The copied SQLite database passes `integrity_check` and contains +zero draft rows and zero content bytes. No storage reset, user-data deletion or +board write was used to establish that initial state. + +## Native UI runner attempt + +| Step | Actual observation | +|---|---| +| Build | Native XCTest helper builds successfully against the connected physical-device SDK; it operates the separately installed normal app | +| Runner startup | Signed helper starts on the iPad | +| OS authentication | iPadOS displays **Touch ID for “XCTest” — Enable UI Automation** | +| Result | Runner initialization times out after 60 seconds while enabling automation mode; the test body does not run | +| Classification | Operator-access dependency, not a failed PyBLE recovery assertion | +| Required action | Device owner authenticates the iPadOS prompt; retry the retained test and then execute the remaining workflow steps | + +The owner was asked to authenticate on the device. No passcode or biometric +material was requested, captured or substituted. Raw screenshots and the +`.xcresult` remain in ignored `local/recovery-completion/ipad/`; they are not +public documentation assets. + +## Acceptance accounting + +| Evidence | State after this attempt | +|---|---| +| Installed normal candidate, version and signature | Pass, limited to the local Preview identity | +| Foreground launch and five-board discovery | Pass, disconnected discovery only | +| Native storage process termination/reopening | Prior passing seed/verify evidence retained in the platform report | +| DR-T12 normal Blocks-to-Editor checkpoint/relaunch | Not run in this continuation; native UI access pending | +| DR-T14 normal offline Restore and physical current-board consent | Not run in this continuation; native UI access pending | +| Remaining applicable P01–P15 steps | Execute and record actual outcomes after UI authorization; the prepared test is not execution evidence | +| Five-profile iPad release rows | Pending; no qualification inferred from the five scan results | +| M-02 / release admission | Remain pending until mandatory evidence and review are complete | + +The [operator recipe](01_Operator_Recipe.md) and +[normative scenario matrix](../../../specifications/App/current-draft-recovery.md#7-required-evidence-before-acceptance) +remain the acceptance authority. This record does not change their requirements. From d1f8719c44a4ef955deae29c9cf5d3c139e39724 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 17:35:12 +0700 Subject: [PATCH 03/31] [red] reproduce landscape keyboard panel overflow Signed-off-by: Viwat Vchirawongkwin --- app/test/widget/app_shell_test.dart | 56 +++++++++++++++++++++++++++++ docs/specifications/App/specs.md | 1 + 2 files changed, 57 insertions(+) diff --git a/app/test/widget/app_shell_test.dart b/app/test/widget/app_shell_test.dart index 24e2a7d2..50a9e04c 100644 --- a/app/test/widget/app_shell_test.dart +++ b/app/test/widget/app_shell_test.dart @@ -92,6 +92,62 @@ Future _focusLandscapeBlocks(WidgetTester tester) async { } void main() { + group('landscape software keyboard', () { + for (final double inset in [404, 440]) { + testWidgets('keeps editing and navigation usable with $inset dp inset', ( + WidgetTester tester, + ) async { + const ShellSurface lenovo = ShellSurface( + 'lenovo_landscape', + Size(2000 / 1.5, 800), + 1.5, + ); + await pumpShell( + tester, + connection: fakeConnection(initial: ConnState.ready), + surface: lenovo, + ); + final Finder editor = find.byType(EditableText).first; + await tester.tap(editor); + await tester.enterText(editor, '# keyboard recovery check'); + tester.view.viewInsets = FakeViewPadding(bottom: inset * 1.5); + addTearDown(tester.view.resetViewInsets); + await tester.pumpAndSettle(); + + expect(tester.takeException(), isNull); + expect(tester.getSize(editor).height, greaterThanOrEqualTo(80)); + expect(tester.getRect(editor).bottom, lessThanOrEqualTo(800 - inset)); + expect( + tester + .widget(find.byType(ConsoleStripView)) + .collapsed, + isTrue, + ); + expect( + tester.widget(editor).controller.text, + '# keyboard recovery check', + ); + final Finder blocks = _landscapeBlocksDestination(); + await tester.ensureVisible(blocks); + expect(blocks.hitTestable(), findsOneWidget); + + tester.view.resetViewInsets(); + await tester.pumpAndSettle(); + expect(tester.takeException(), isNull); + expect( + tester + .widget(find.byType(ConsoleStripView)) + .collapsed, + isFalse, + ); + expect( + tester.widget(editor).controller.text, + '# keyboard recovery check', + ); + }); + } + }); + group('A-05 shell renders and binds to Connection', () { testWidgets('shows the IDE navigation destinations on iPad landscape ' '(connected)', (tester) async { diff --git a/docs/specifications/App/specs.md b/docs/specifications/App/specs.md index a2741cb7..a06d5b75 100644 --- a/docs/specifications/App/specs.md +++ b/docs/specifications/App/specs.md @@ -1011,6 +1011,7 @@ implementation: - **FR-UI-5** — The layout MUST be tablet-first but MUST NOT break on a phone (phone is best-effort). MUST (*source: PRD §13.2, §19, app.md §5; verify: golden; story: A-20*) - **FR-UI-6** — Interactive controls MUST use large touch targets and MUST clearly communicate connection and run state (disconnected/connecting/ready/running/error). MUST (*source: PRD §13.2; verify: golden; story: A-22*) - **FR-UI-7** — No UI panel MUST bind to BLE directly; every panel binds to `Connection`. MUST (*source: PRD §19, app.md §1; verify: unit; story: all A-2x/3x*) +- **FR-UI-8** — With a landscape software keyboard open, the connected shell MUST retain a usable editor viewport and reachable navigation without panel overflow. The console output strip MUST temporarily collapse to its status/actions bar while retaining buffered output; expanding it dismisses the keyboard. Navigation destinations MUST remain reachable by scrolling when height is constrained. Closing the keyboard restores the ordinary console layout and preserves the current document and selection. MUST (*source: FR-UI-1/5/6, NFR-A11Y-3; verify: widget and physical keyboard observations*) ### 4.14 Scan/Connect Flow UI (`lib/connect/`) — FR-CONNECT From e54a78acf32e7ea26166a60d66573fdf9e697ad4 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 17:39:22 +0700 Subject: [PATCH 04/31] [green] preserve landscape editing space above the keyboard Signed-off-by: Viwat Vchirawongkwin --- app/lib/app/shell.dart | 15 +++++++++++++-- app/test/widget/app_shell_test.dart | 9 ++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/lib/app/shell.dart b/app/lib/app/shell.dart index 571c619c..fc2fc485 100644 --- a/app/lib/app/shell.dart +++ b/app/lib/app/shell.dart @@ -220,6 +220,7 @@ class _LandscapeShell extends ConsumerWidget { final bool filesCollapsed = ref.watch(filesPaneCollapsedProvider); final bool blocksFocused = selected == AppSurface.blocks; final bool blocksConsoleExpanded = ref.watch(blocksConsoleExpandedProvider); + final bool keyboardVisible = MediaQuery.viewInsetsOf(context).bottom > 0; final AppLocalizations l10n = AppLocalizations.of(context); final AppSurface centre = _centreSurface(selected); @@ -331,8 +332,17 @@ class _LandscapeShell extends ConsumerWidget { ), const Divider(height: 1), ConsoleStripView( - collapsed: blocksFocused && !blocksConsoleExpanded, - onToggle: blocksFocused + collapsed: + keyboardVisible || (blocksFocused && !blocksConsoleExpanded), + onToggle: keyboardVisible + ? () { + if (blocksFocused) { + ref.read(blocksConsoleExpandedProvider.notifier).state = + true; + } + FocusScope.of(context).unfocus(); + } + : blocksFocused ? () { ref.read(blocksConsoleExpandedProvider.notifier).state = !blocksConsoleExpanded; @@ -410,6 +420,7 @@ class _SurfaceRail extends ConsumerWidget { ); final int selectedIndex = _ideNavSurfaces.indexOf(selected); return NavigationRail( + scrollable: true, selectedIndex: selectedIndex < 0 ? 0 : selectedIndex, labelType: NavigationRailLabelType.all, onDestinationSelected: (int index) { diff --git a/app/test/widget/app_shell_test.dart b/app/test/widget/app_shell_test.dart index 50a9e04c..43baf6c8 100644 --- a/app/test/widget/app_shell_test.dart +++ b/app/test/widget/app_shell_test.dart @@ -115,7 +115,10 @@ void main() { await tester.pumpAndSettle(); expect(tester.takeException(), isNull); - expect(tester.getSize(editor).height, greaterThanOrEqualTo(80)); + final Finder viewport = find.byWidgetPredicate( + (Widget widget) => widget is EditorSurface, + ); + expect(tester.getSize(viewport).height, greaterThanOrEqualTo(80)); expect(tester.getRect(editor).bottom, lessThanOrEqualTo(800 - inset)); expect( tester @@ -131,6 +134,10 @@ void main() { await tester.ensureVisible(blocks); expect(blocks.hitTestable(), findsOneWidget); + await tester.tap(find.byTooltip('Expand console')); + await tester.pump(); + expect(tester.widget(editor).focusNode.hasFocus, isFalse); + tester.view.resetViewInsets(); await tester.pumpAndSettle(); expect(tester.takeException(), isNull); From 88b7871523ce927bcb53b79b52949627b24d9f60 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 17:39:16 +0700 Subject: [PATCH 05/31] [docs] prepare recovery release artifacts and channel handoff Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/06_Release_Readiness.md | 135 ++++++++++++++++++ .../app-0.3.0-build-9-release-packet.md | 80 +++++++++++ docs/publication/google-play-data-safety.md | 28 ++++ 3 files changed, 243 insertions(+) create mode 100644 docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md create mode 100644 docs/publication/app-0.3.0-build-9-release-packet.md diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md new file mode 100644 index 00000000..a8dd5679 --- /dev/null +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md @@ -0,0 +1,135 @@ + + + +# App 0.3.0 (9) — release readiness and channel handoff + +| Field | Record | +|---|---| +| Date | 31 October 2026, Asia/Bangkok | +| Scope | App-only bounded current-text recovery; existing Play open-testing and TestFlight channels | +| Source | Merged PR #40 at `6f5b3ea73a70342331fb49d0685938ce2a4cae11`; app tree `b12fe3621f1d100a3b3724d15ee0dea3b359acfe` | +| 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 | +| Local evidence | Ignored `local/recovery-completion/release/`: build/check logs, artifact manifest and retained signed binaries | +| Public copy | [Prepared release packet](../../../publication/app-0.3.0-build-9-release-packet.md); no submission or availability claim | + +## Gate selection + +This increment changes the app, not the firmware bytes. The +[qualification inventory](../c1-s1/04_Validation_Inventory_and_Operator_Recipe.md#1-evidence-and-gate-selection) +requires affected app workflows on the five existing exact profiles and both +platforms for that compatibility claim. An unchanged firmware is a named input +with its own historical qualification limits. This work does not require or +claim a new firmware release, fresh firmware OI-1 qualification or a Ready badge. + +| Gate | Required evidence | Current disposition | +|---|---|---| +| 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 | +| 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 | +| 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 | +| 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 | +| Release review | Frozen artifact identity, resolved mandatory failures, supported scope, privacy/dependency review and recorded acceptance | Not yet admitted | +| 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 | + +Pilot participation and useful-return evidence remain separate from maintenance +release admission. A second operator is required for the optional reproduction +claim, not for an unrelated app release. Neither distinction waives mandatory +physical or packaging evidence. + +## Required app compatibility rows + +| iPad row | Android row | Exact profile | App checks | +|---|---|---|---| +| Q01 | Q02 | `esp32-4mb` | Common workflow plus affected recovery | +| Q03 | Q04 | `esp32-s3-n16r8` | Common workflow plus affected recovery; do not infer the profile from the `esp32-s3` chip string alone | +| Q05 | Q06 | `waveshare-esp32-s3-lcd-147b` | Common workflow plus affected recovery; keep its exact-board/image identity distinct from generic S3 | +| Q07 | Q08 | `esp32-c3-4mb` | Common workflow plus affected recovery and the real-app C3-G5 behavior | +| Q09 | Q10 | `rpi-pico2-w` | Common workflow plus affected recovery on each physical platform; no new full GP2 qualification inferred | + +Each common row includes ordinary service-filtered discovery/HELLO, editing and +saving a harmless file, Run/stdout/terminal state, Stop, exact file readback, +disconnect/reconnect and workspace continuity. Retain the selected candidate's +affected lifecycle/recovery scenarios. Record the actual result of every row; +a scan result or one platform cannot stand in for another row. + +[C3-G5](../../../specifications/firmware/ports/esp32-c3-4mb.md#c3-g5--real-app-hil-on-both-platforms-frozen) +requires Stop through the real UI against both a tight loop and print flood. +Its C3-G2 oracle is exactly one matching `RSP{OK}` before `RUN_STATE(idle)` in +less than 500 ms from complete STOP submission, a usable connection, and a +subsequent bounded run. UI responsiveness alone cannot establish that wire +latency. There is no new arbitrary repetition count added by this app increment. + +## Prepared Android production artifacts + +Both builds use normal `lib/main.dart`, production flavor and the established +owner upload key. Secret values were obtained from the existing local secret +manager and never written into source or logs. + +| Artifact | SHA-256 | Bytes | +|---|---|---:| +| `PyBLE-0.3.0-build-9-production-release.aab` | `fcf4692dbf7655f53a50a0687eedb81d9cf63bc601721552f622246d5cca0330` | 64,414,627 | +| `PyBLE-0.3.0-build-9-production-release.apk` | `8656549a8480ae7ebfe9b6023220fa35c9b967fb07ca0a754a0ec24cd63e3e13` | 66,439,954 | + +| Check | Actual result | +|---|---| +| Package and version | `dev.pyble.pyble`, `0.3.0`, version code `9` | +| SDKs / ABIs | Minimum 24, target/compile 36; `arm64-v8a`, `armeabi-v7a`, `x86_64` | +| Signing | AAB JAR verification and APK signature verification pass; certificate SHA-256 matches the retained owner certificate `DCA95C5060CDF4936F19FD8C3212A871C223E2BA3FB67B6226179AFFDA62DD57` | +| Bundle | Official bundletool 1.18.3 validation passes; tool digest checked against the retained verified digest; configuration declares `PAGE_ALIGNMENT_16K` | +| 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 | +| APK alignment | `zipalign -c -P 16 -v 4` passes | +| Permissions | Expected BLE, legacy location, Internet and AndroidX signature permission; no new authored platform permission | +| 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 | + +The 16 KiB runtime observation also force-stopped and relaunched the same +installed package without data clearing. The normal disconnected screen +returned; the retained fresh database and WAL reopened with `integrity_check=ok` +and the expected `projects`, `project_files` and `settings` tables. This is a +native packaging/startup smoke, not a physical BLE row or the full recovery +acceptance matrix. The SQLite database's own page size is independent of the +operating-system memory page size. + +The first local invocation incorrectly used `--no-pub` after fresh `pub get`, +leaving the integration-test plugin in a generated Android registrant. Its +failed log is retained. Repeating the canonical CI production commands, +which allow Flutter to regenerate release plugin metadata, built both artifacts +successfully without a source change. + +The APK uses the upload certificate, whereas Google Play can deliver its own +app-signing certificate. Do not uninstall an existing user's Play app or clear +its data merely to install this locally signed APK. Store upgrade acceptance +must use the actual delivered package. + +## Prepared iOS distribution artifact + +| Field / check | Actual result | +|---|---| +| IPA | `PyBLE-0.3.0-build-9-app-store.ipa`, 23,782,489 bytes | +| SHA-256 | `73ad7cda10c402a7f25316efc5e30f9c80bbd030e23c2bfc32313fd79c41c2ab` | +| Identity | `dev.pyble.pyble`, `0.3.0 (9)`, normal `lib/main.dart` | +| Build / deployment floor | Xcode 27.2 / iOS SDK 27.2; app and compiled deployment floor at least iOS 15.0 | +| Export | App Store Connect distribution export; automatic signing with build-number management disabled; export destination only, no upload | +| Provisioning | Production App Store profile; debugging disabled, no development-device list, beta reporting enabled; valid through 17 May 2027 | +| Validation | `tools/validate_ios_ipa.sh` passes code-signature, compiled minimum OS, embedded-asset mode/classification and Xcode `swinfo` checks; only the three expected unsigned resource-bundle records are excluded | + +The archive and exported IPA are retained privately. A distribution package +with no development-device list is not the separately installed development +Preview app. Its local validation does not establish App Store processing, +TestFlight availability, or store-installed upgrade behavior. + +## Distribution access and remaining account work + +The owner Android upload identity is locally usable and matches the historical +certificate. A valid Apple distribution identity and cached production App +Store provisioning profile are available. Signing access alone does not prove +an authenticated store session, role, account version history or review status. + +No dedicated Play/App Store Connect connector or configured command-line store +credential was found in the standard locations inspected. Account access and +whether build 9 has already been consumed remain **unverified**. This is not a +claim that the owner has no access through the respective web consoles. + +After the candidate is admitted, the authorized distribution operator must +verify the exact package, unused build numbers and current declarations, upload +the retained artifacts, resolve processing/review findings, and record actual +availability and installed-store results separately. The prepared packet and +artifact records make those steps concrete; they do not substitute for them. diff --git a/docs/publication/app-0.3.0-build-9-release-packet.md b/docs/publication/app-0.3.0-build-9-release-packet.md new file mode 100644 index 00000000..25495ad5 --- /dev/null +++ b/docs/publication/app-0.3.0-build-9-release-packet.md @@ -0,0 +1,80 @@ + + + +# PyBLE 0.3.0 (9) — prepared app release packet + +Prepared 31 October 2026. This is candidate copy for the existing Google Play +open-testing and TestFlight channels. It does not announce availability, a +submission, or release admission. The [readiness record](../developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md) +owns the artifact and gate states. Confirm that build 9 is unused in each +account before uploading; a consumed number requires a new source version +contract and rebuilt artifacts, not a renamed file. + +## Google Play release notes + +```text +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. +``` + +## TestFlight — What to Test + +```text +Test local recovery of the current Python text draft in PyBLE 0.3.0 (9). + +Use a compatible, separately provisioned MicroPython board running the PyBLE agent. Keep test hardware free of hazardous loads. About identifies the installed app version; record the board profile and agent version with feedback. + +1. Edit a disposable Python draft, choose Save recovery copy, and wait for Saved locally. Close the app process and reopen it without deleting or reinstalling the app. Check the exact text and filename in the recovery preview. +2. Restore while disconnected. Recovery should preserve the text without connecting to or writing to a board. Cancel a Discard confirmation, then confirm Discard using only disposable content; check the next launch. +3. Deliberately connect to a board. Check the current destination and separate Save/Run effects before confirming. Cancel a confirmation and verify that no unwanted board action occurs. +4. Copy generated Python from Blocks into Editor, save its recovery copy, and restart. Only the generated text is covered; the Blocks workspace, graph revisions and companion files are not restored by this local slot. +5. Exercise New, Board Open, Files Upload, disconnect/reconnect, portrait/landscape, larger text, an external keyboard and VoiceOver where available. Report any lost text, stale destination, inaccessible control or inaccurate success message. + +There is one recovery slot and no draft history. Wait for Saved locally before expecting an edit to survive termination. Storage failure can leave current edits only in memory; follow the displayed guidance. App removal or clearing app storage removes local recovery data. A draft that existed only in memory in an older version cannot be recovered by upgrading. + +Include app version/build, tablet/OS, exact board profile and agent version, numbered steps, expected and actual behavior, and whether the event followed an app restart or board switch. Omit private source, device identifiers, credentials and personal data from public reports. +``` + +Keep the existing maintained contact/review information and hardware-access +instructions in the account. Verify them against the current form rather than +inventing reviewer access, audience declarations, privacy attestation or a +store review result. No tester invitation is sent by preparing this packet. + +## Artifact and channel handoff + +| Step | Required result | +|---|---| +| Candidate | Final accepted source/app tree, locked dependencies, exact signed artifact hashes, full `0.3.0 (9)` identity and retained checks | +| Android package | `dev.pyble.pyble`, production flavor, normal `lib/main.dart`; existing owner upload signer, AAB validation and native alignment checks | +| iOS package | `dev.pyble.pyble`, normal `lib/main.dart`, distribution export and successful `tools/validate_ios_ipa.sh` | +| Admission | Accepted recovery evidence, required app/profile matrix, packaging/provenance review and no unresolved release-blocking defect | +| Account checks | Unused build numbers; current upload/signing identity, account role, declarations, review contact and hardware instructions | +| Submit | Upload only admitted artifacts; record processing and review outcomes independently on Play and App Store Connect | +| Verify delivery | Record actual track/group availability, then store-delivered installation/upgrade, About identity and a scoped launch/workflow check | +| Public copy | Update release availability only after observing it; preserve each platform's actual status | + +The isolated development applications used for engineering tests have different +application identities. Their successful installation does not prove an upgrade +of `dev.pyble.pyble`, store processing, or store delivery. A distribution export +also does not establish successful execution on the physical tablet. + +## Privacy and recovery scope + +Candidate 0.3.0 adds an app-private local database containing one current text +draft and bounded recovery metadata. See the dated addendum in the +[Data safety assessment](google-play-data-safety.md#31-october-2026--candidate-030-local-recovery-addendum). +The slot has no app-managed cloud synchronization. OS backup behavior remains +subject to platform and user settings. Board files and exported copies have +their own retention boundaries; Discard does not delete them. + +## Official submission references checked 31 October 2026 + +- Google requires new app/update submissions to target API 36 or higher under + the current mobile-app rule: [target API requirements](https://support.google.com/googleplay/android-developer/answer/11926878). +- Apps targeting Android 15 and higher must support 16 KiB pages on 64-bit + devices: [Android page-size guidance](https://developer.android.com/guide/practices/page-sizes). +- Apple accepts uploads through its supported tools with the appropriate + account role; processing must finish before the build appears in App Store + Connect: [upload builds](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds/). + +These public requirements do not reveal this application's private account +history or satisfy its project-specific hardware and release gates. diff --git a/docs/publication/google-play-data-safety.md b/docs/publication/google-play-data-safety.md index 5124afb3..975f6878 100644 --- a/docs/publication/google-play-data-safety.md +++ b/docs/publication/google-play-data-safety.md @@ -6,6 +6,34 @@ Console form. Reconcile it with the exact signed bundle, all active versions covered by the package-level form, endpoint behavior and the final Console questions before submission. +## 31 October 2026 — candidate 0.3.0 local recovery addendum + +The source candidate `0.3.0 (9)` adds a durable app-private `pyble.sqlite` +database for one current Python text draft, its filename and bounded recovery +metadata. This supersedes the **in-memory-only** editing description below for +that candidate; the September table remains the historical `0.2.0` assessment. +Blocks workspaces, multi-file projects and draft history are outside the local +recovery slot. Restoring a draft does not itself send it to a board or network. + +The local database adds no app-managed cloud synchronization, telemetry or +developer collection endpoint. The existing app policy's local retention and +platform-backup statements still apply: OS backup depends on the platform and +user settings. Do not equate local-only app processing with a guarantee that +the OS never backs up app storage. Confirm packaged backup settings when +reviewing the final artifacts. + +Explicit Discard removes the current recovery slot; it is not a secure-erasure +promise for database pages, OS backups, exports or board files. Clearing app +storage/uninstalling on Android or deleting the app on iPadOS removes the +installed app's local data, subject to the separately described platform backup +behavior. No pre-upgrade draft that existed only in memory can be recovered. + +The board/GitHub flow analysis and proposed Console answers below still need +owner review against the exact final bundle and all active versions. This +addendum records a source change, not a submitted Data safety declaration. +See the [prepared release packet](app-0.3.0-build-9-release-packet.md) for +candidate-specific tester copy and the channel handoff. + ## Why the internal-testing answer needs review The move to open testing requires a Data safety form. Google defines From b6b999808a28f446c76b6dfb6465e3894a6a0dc0 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 17:53:54 +0700 Subject: [PATCH 06/31] [docs] bind release handoff to repaired production artifacts Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/06_Release_Readiness.md | 65 +++++++++++++------ .../app-0.3.0-build-9-release-packet.md | 2 +- 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md index a8dd5679..87c85049 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md @@ -7,9 +7,10 @@ |---|---| | Date | 31 October 2026, Asia/Bangkok | | Scope | App-only bounded current-text recovery; existing Play open-testing and TestFlight channels | -| Source | Merged PR #40 at `6f5b3ea73a70342331fb49d0685938ce2a4cae11`; app tree `b12fe3621f1d100a3b3724d15ee0dea3b359acfe` | -| 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 | -| Local evidence | Ignored `local/recovery-completion/release/`: build/check logs, artifact manifest and retained signed binaries | +| Runtime source | Recovery baseline plus landscape-keyboard repair at `e54a78acf32e7ea26166a60d66573fdf9e697ad4` | +| Build checkout | Release worktree `e8aeddd8ddbda85293dcca72ad524823bd5ae66a`; app tree `d0f2a464e9886c8451a0cb046123973095f246c6`, verified identical to the runtime baseline | +| 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 | +| Local evidence | Ignored `local/recovery-completion/release/candidate-e54a78a/`: build/check logs, source/artifact manifests, runtime evidence and retained signed binaries | | Public copy | [Prepared release packet](../../../publication/app-0.3.0-build-9-release-packet.md); no submission or availability claim | ## Gate selection @@ -24,9 +25,9 @@ claim a new firmware release, fresh firmware OI-1 qualification or a Ready badge | Gate | Required evidence | Current disposition | |---|---|---| | 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 | -| 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 | +| 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 | | 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 | -| 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 | +| 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 | | Release review | Frozen artifact identity, resolved mandatory failures, supported scope, privacy/dependency review and recorded acceptance | Not yet admitted | | 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 | @@ -42,7 +43,7 @@ physical or packaging evidence. | Q01 | Q02 | `esp32-4mb` | Common workflow plus affected recovery | | Q03 | Q04 | `esp32-s3-n16r8` | Common workflow plus affected recovery; do not infer the profile from the `esp32-s3` chip string alone | | Q05 | Q06 | `waveshare-esp32-s3-lcd-147b` | Common workflow plus affected recovery; keep its exact-board/image identity distinct from generic S3 | -| Q07 | Q08 | `esp32-c3-4mb` | Common workflow plus affected recovery and the real-app C3-G5 behavior | +| Q07 | Q08 | `esp32-c3-4mb` | Common workflow plus affected recovery and real-UI tight-loop/print-flood Stop; see scope below | | Q09 | Q10 | `rpi-pico2-w` | Common workflow plus affected recovery on each physical platform; no new full GP2 qualification inferred | 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 affected lifecycle/recovery scenarios. Record the actual result of every row; a scan result or one platform cannot stand in for another row. -[C3-G5](../../../specifications/firmware/ports/esp32-c3-4mb.md#c3-g5--real-app-hil-on-both-platforms-frozen) -requires Stop through the real UI against both a tight loop and print flood. -Its C3-G2 oracle is exactly one matching `RSP{OK}` before `RUN_STATE(idle)` in -less than 500 ms from complete STOP submission, a usable connection, and a -subsequent bounded run. UI responsiveness alone cannot establish that wire -latency. There is no new arbitrary repetition count added by this app increment. +The [C3 contract](../../../specifications/firmware/ports/esp32-c3-4mb.md#c3-g5--real-app-hil-on-both-platforms-frozen) +and inventory require tight-loop and print-flood Stop through the real UI on +both platforms. The full C3-G5 firmware qualification also requires the C3-G2 +wire oracle: exactly one matching `RSP{OK}` before `RUN_STATE(idle)` in less +than 500 ms from complete STOP submission, a usable connection and a subsequent +bounded run. UI observations alone cannot prove that latency or a complete +C3-G5 pass. + +The contract's dated status clarification scopes those frozen qualification +gates to a fresh automated-qualified C3/candidate claim. Under the inventory's +app-only scope, this storage/layout increment does not automatically require a +new firmware qualification or fresh wire-latency capture. Impact review found +`app/lib/ble/` and `app/lib/pble/` unchanged between `8dde8d6` and the repaired +runtime baseline; the Run controller's Stop implementation is also unchanged. +Keep fresh UI workload results, existing firmware provenance and any timing +claim distinct. No artifact-bound v0.6.1 timing receipt was established by this +preparation; the historical v0.6.0 qualification and incomplete published +v0.6.1 automated HIL retain their original limits. No new timing pass or arbitrary +repetition count is inferred. ## Prepared Android production artifacts @@ -66,8 +80,8 @@ manager and never written into source or logs. | Artifact | SHA-256 | Bytes | |---|---|---:| -| `PyBLE-0.3.0-build-9-production-release.aab` | `fcf4692dbf7655f53a50a0687eedb81d9cf63bc601721552f622246d5cca0330` | 64,414,627 | -| `PyBLE-0.3.0-build-9-production-release.apk` | `8656549a8480ae7ebfe9b6023220fa35c9b967fb07ca0a754a0ec24cd63e3e13` | 66,439,954 | +| `PyBLE-0.3.0-build-9-production-release.aab` | `6fe609a2ebfb925bbffe2662d64a24b4b9bfdb8b5b39ee3fde6077f3cf8fba73` | 64,413,036 | +| `PyBLE-0.3.0-build-9-production-release.apk` | `71b99f8312c298693e6a8ed1aaa9fc4dc960ac6371504fdfec81152873f67ef8` | 66,439,954 | | Check | Actual result | |---|---| @@ -78,15 +92,19 @@ manager and never written into source or logs. | 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 | | APK alignment | `zipalign -c -P 16 -v 4` passes | | Permissions | Expected BLE, legacy location, Internet and AndroidX signature permission; no new authored platform permission | -| 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 | +| 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 | The 16 KiB runtime observation also force-stopped and relaunched the same installed package without data clearing. The normal disconnected screen -returned; the retained fresh database and WAL reopened with `integrity_check=ok` +returned without a fatal exception or native-library load error. The database +created by the earlier `6f5b3ea` production candidate and its WAL reopened with +`integrity_check=ok` and the expected `projects`, `project_files` and `settings` tables. This is a native packaging/startup smoke, not a physical BLE row or the full recovery acceptance matrix. The SQLite database's own page size is independent of the -operating-system memory page size. +operating-system memory page size. The emulator uses Google APIs 16 KiB arm64 +API 36 image revision 7; its fingerprint and private UI captures are recorded +with the candidate manifest. The first local invocation incorrectly used `--no-pub` after fresh `pub get`, leaving the integration-test plugin in a generated Android registrant. Its @@ -94,6 +112,15 @@ failed log is retained. Repeating the canonical CI production commands, which allow Flutter to regenerate release plugin metadata, built both artifacts successfully without a source change. +A later incremental rebuild after the keyboard repair regenerated AOT inputs +but reused stale Gradle merged/stripped native libraries. Comparing packaged +`libapp.so` against current build inputs exposed the mismatch; those artifacts +were rejected and retained under `rejected-stale-gradle-e54a78a/`. Running +`flutter clean` and both canonical production commands rebuilt the current +artifacts above. Their packaged AOT libraries match current stripped outputs +on all three ABIs. The earlier `6f5b3ea` artifacts remain historical evidence +under `artifacts-6f5b3ea/`; they are not the repaired release candidate. + The APK uses the upload certificate, whereas Google Play can deliver its own app-signing certificate. Do not uninstall an existing user's Play app or clear its data merely to install this locally signed APK. Store upgrade acceptance @@ -103,8 +130,8 @@ must use the actual delivered package. | Field / check | Actual result | |---|---| -| IPA | `PyBLE-0.3.0-build-9-app-store.ipa`, 23,782,489 bytes | -| SHA-256 | `73ad7cda10c402a7f25316efc5e30f9c80bbd030e23c2bfc32313fd79c41c2ab` | +| IPA | `PyBLE-0.3.0-build-9-app-store.ipa`, 23,784,757 bytes | +| SHA-256 | `14146b8951e4cd3298d27eb20e2036c80bbcd1b05bba42c98bf1abbd53b5eba6` | | Identity | `dev.pyble.pyble`, `0.3.0 (9)`, normal `lib/main.dart` | | Build / deployment floor | Xcode 27.2 / iOS SDK 27.2; app and compiled deployment floor at least iOS 15.0 | | Export | App Store Connect distribution export; automatic signing with build-number management disabled; export destination only, no upload | diff --git a/docs/publication/app-0.3.0-build-9-release-packet.md b/docs/publication/app-0.3.0-build-9-release-packet.md index 25495ad5..0b6c543c 100644 --- a/docs/publication/app-0.3.0-build-9-release-packet.md +++ b/docs/publication/app-0.3.0-build-9-release-packet.md @@ -13,7 +13,7 @@ contract and rebuilt artifacts, not a renamed file. ## Google Play release notes ```text -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. +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. ``` ## TestFlight — What to Test From e219b74ef767a21a43ec529c3bb88b5a13938e7c Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 18:06:56 +0700 Subject: [PATCH 07/31] [docs] distinguish Android WebView controls from candidate acceptance Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/06_Release_Readiness.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md index 87c85049..47851780 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md @@ -143,6 +143,29 @@ with no development-device list is not the separately installed development Preview app. Its local validation does not establish App Store processing, TestFlight availability, or store-installed upgrade behavior. +## Android WebView diagnostic boundary + +An earlier isolated debug-build Blocks startup timeout is retained in the +private Android evidence. The first profile-build captures showed loading; +they did not establish an expired watchdog. On the Lenovo with Google WebView +155.0.8059.43, three separate controls passed: a native inline HTML/JavaScript +bridge, a native WebView with the exact production Blockly assets/CSP, and a +minimal Flutter profile app using the same pinned WebView plugins and asset +path. The exact-asset controls observed `onPageStarted`, then `hostReady`, and +confirmed that `window.pybleBlocks.configureHost` exists. The selected provider +was installed/enabled and not stopped or suspended at inspection time. + +The current isolated profile candidate subsequently reached the real Blocks +workspace. These observations distinguish the retained debug failure from a +completed profile-candidate failure; they do not identify the original cause +or prove DR-T12 by themselves. The inline control exposed a possible callback +ordering hazard, but neither exact-asset control reproduced it, so no runtime +change or claimed fix followed. The physical report must separately record +actual generated-text handoff, recovery and cold relaunch. Diagnostic fixture +sources, APK hashes and callback logs remain under ignored +`local/recovery-completion/{native-webview-smoke,flutter-webview-smoke,android}/`. +The production artifacts above remain bound to `e54a78a`. + ## Distribution access and remaining account work The owner Android upload identity is locally usable and matches the historical From 62b077cd8ba18ec386258347ace40bd38e0c740e Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 18:11:33 +0700 Subject: [PATCH 08/31] [red] reproduce console expand with native keyboard ownership Signed-off-by: Viwat Vchirawongkwin --- app/test/widget/app_shell_test.dart | 104 ++++++++++++++++++++++++++++ docs/specifications/App/TDD.md | 11 +++ 2 files changed, 115 insertions(+) diff --git a/app/test/widget/app_shell_test.dart b/app/test/widget/app_shell_test.dart index 43baf6c8..0bc22506 100644 --- a/app/test/widget/app_shell_test.dart +++ b/app/test/widget/app_shell_test.dart @@ -23,8 +23,10 @@ import 'dart:typed_data'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pyble/app/app.dart'; @@ -93,6 +95,108 @@ Future _focusLandscapeBlocks(WidgetTester tester) async { void main() { group('landscape software keyboard', () { + for (final TargetPlatform platform in [ + TargetPlatform.android, + TargetPlatform.iOS, + ]) { + testWidgets('Expand dismisses a native Blocks keyboard on $platform', ( + WidgetTester tester, + ) async { + debugDefaultTargetPlatformOverride = platform; + addTearDown(() => debugDefaultTargetPlatformOverride = null); + const MethodChannel keyboard = MethodChannel('dev.pyble/keyboard'); + final List requests = []; + tester.binding.defaultBinaryMessenger.setMockMethodCallHandler( + keyboard, + (MethodCall call) async => requests.add(call), + ); + addTearDown( + () => tester.binding.defaultBinaryMessenger.setMockMethodCallHandler( + keyboard, + null, + ), + ); + await pumpShell( + tester, + connection: fakeConnection(initial: ConnState.ready), + surface: androidTabletLandscape, + ); + await _focusLandscapeBlocks(tester); + final Element host = tester.element( + find.byKey(_blocksWorkspaceHostKey), + ); + expect(find.byType(EditableText), findsNothing); + tester.view.viewInsets = const FakeViewPadding(bottom: 808); + addTearDown(tester.view.resetViewInsets); + await tester.pump(); + + await tester.tap(find.byKey(kConsoleStripToggleKey)); + await tester.pump(); + expect(requests.map((MethodCall call) => call.method), [ + 'dismissKeyboard', + ]); + expect(requests.single.arguments, isNull); + expect( + tester + .widget(find.byType(ConsoleStripView)) + .collapsed, + isTrue, + reason: 'acknowledging a hide request does not prove IME dismissal', + ); + expect(tester.element(find.byKey(_blocksWorkspaceHostKey)), same(host)); + tester.view.resetViewInsets(); + await tester.pump(); + expect( + tester + .widget(find.byType(ConsoleStripView)) + .collapsed, + isFalse, + ); + expect(tester.element(find.byKey(_blocksWorkspaceHostKey)), same(host)); + expect(tester.takeException(), isNull); + }); + } + + testWidgets('Expand preserves a Flutter editor draft and selection', ( + WidgetTester tester, + ) async { + const MethodChannel keyboard = MethodChannel('dev.pyble/keyboard'); + final List requests = []; + tester.binding.defaultBinaryMessenger.setMockMethodCallHandler( + keyboard, + (MethodCall call) async => requests.add(call.method), + ); + addTearDown( + () => tester.binding.defaultBinaryMessenger.setMockMethodCallHandler( + keyboard, + null, + ), + ); + await pumpShell( + tester, + connection: fakeConnection(initial: ConnState.ready), + surface: androidTabletLandscape, + ); + final Finder editor = find.byType(EditableText).first; + await tester.tap(editor); + await tester.enterText(editor, '# retained draft'); + final EditableText before = tester.widget(editor); + before.controller.selection = const TextSelection.collapsed(offset: 5); + tester.view.viewInsets = const FakeViewPadding(bottom: 808); + addTearDown(tester.view.resetViewInsets); + await tester.pump(); + await tester.tap(find.byKey(kConsoleStripToggleKey)); + await tester.pump(); + expect(requests, ['dismissKeyboard']); + expect(before.focusNode.hasFocus, isFalse); + expect(before.controller.text, '# retained draft'); + expect( + before.controller.selection, + const TextSelection.collapsed(offset: 5), + ); + expect(tester.takeException(), isNull); + }); + for (final double inset in [404, 440]) { testWidgets('keeps editing and navigation usable with $inset dp inset', ( WidgetTester tester, diff --git a/docs/specifications/App/TDD.md b/docs/specifications/App/TDD.md index 092b1d0e..c92b486e 100644 --- a/docs/specifications/App/TDD.md +++ b/docs/specifications/App/TDD.md @@ -2037,6 +2037,17 @@ Tablet-first, responsive (CON-5, FR-UI-5). The shell is **connection-gated** ([A stays ≥ 720 dp and ≥ 60% may a 360–420 dp generated-Python inspector appear. Host notices sit outside the canvas. The console is collapsed/on demand and expands after Run or new output. +- **Landscape keyboard dismissal (FR-UI-8).** While a software-keyboard inset + is present, explicit console Expand first releases Flutter focus, then asks + the app-owned `dev.pyble/keyboard` channel to `dismissKeyboard`. Android hides + the IME using the current Activity window token; iOS ends editing in the + window of the registered Flutter view controller, including native WebView + fields. Flutter's `TextInput.hide` alone does not dismiss every embedded + native input owner. Other platforms use the ordinary Flutter hide request. + Native completion acknowledges a request, not keyboard visibility: the shell + stays collapsed until actual view insets clear. This action does not clear + a text client, replace the Blocks host, discard buffered output, or mutate + the document/selection. - **Portrait / stacked tablet** layout uses a bottom bar to swap the full-width Editor, Console, Files, and Blocks work surfaces (FR-UI-2, [PRD §19.2](../prd.md)); editor remains the default primary surface. Blocks is From 01a7ac8acab32e926c185c8567f9b8dca08d3d68 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 18:14:43 +0700 Subject: [PATCH 09/31] [green] dismiss native keyboards before expanding the console Signed-off-by: Viwat Vchirawongkwin --- .../kotlin/dev/pyble/pyble/MainActivity.kt | 25 ++++++++++++++++++- app/ios/Runner/AppDelegate.swift | 17 +++++++++++++ app/lib/app/keyboard_dismissal.dart | 20 +++++++++++++++ app/lib/app/shell.dart | 4 ++- app/test/unit/keyboard_dismissal_test.dart | 21 ++++++++++++++++ app/test/widget/app_shell_test.dart | 22 +++++++--------- 6 files changed, 94 insertions(+), 15 deletions(-) create mode 100644 app/lib/app/keyboard_dismissal.dart create mode 100644 app/test/unit/keyboard_dismissal_test.dart diff --git a/app/android/app/src/main/kotlin/dev/pyble/pyble/MainActivity.kt b/app/android/app/src/main/kotlin/dev/pyble/pyble/MainActivity.kt index 43977e7d..942bd304 100644 --- a/app/android/app/src/main/kotlin/dev/pyble/pyble/MainActivity.kt +++ b/app/android/app/src/main/kotlin/dev/pyble/pyble/MainActivity.kt @@ -1,5 +1,28 @@ +// SPDX-License-Identifier: MIT +// Part of PyBLE (https://pyble.dev) — see /LICENSE. + package dev.pyble.pyble +import android.view.inputmethod.InputMethodManager import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel -class MainActivity : FlutterActivity() +class MainActivity : FlutterActivity() { + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + super.configureFlutterEngine(flutterEngine) + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "dev.pyble/keyboard") + .setMethodCallHandler { call, result -> + if (call.method == "dismissKeyboard") { + val manager = getSystemService(InputMethodManager::class.java) + window.decorView.windowToken?.let { token -> + manager?.hideSoftInputFromWindow(token, 0) + } + // Acknowledge the request; Flutter observes actual view insets. + result.success(null) + } else { + result.notImplemented() + } + } + } +} diff --git a/app/ios/Runner/AppDelegate.swift b/app/ios/Runner/AppDelegate.swift index c30b367e..8910e1af 100644 --- a/app/ios/Runner/AppDelegate.swift +++ b/app/ios/Runner/AppDelegate.swift @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: MIT +// Part of PyBLE (https://pyble.dev) — see /LICENSE. + import Flutter import UIKit @@ -12,5 +15,19 @@ import UIKit func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) + guard let registrar = engineBridge.pluginRegistry.registrar(forPlugin: "PybleKeyboardDismissal") + else { return } + let keyboard = FlutterMethodChannel( + name: "dev.pyble/keyboard", binaryMessenger: registrar.messenger()) + keyboard.setMethodCallHandler { [weak registrar] call, result in + guard call.method == "dismissKeyboard" else { + result(FlutterMethodNotImplemented) + return + } + // End editing in this engine's window, including embedded WKWebView fields. + registrar?.viewController?.viewIfLoaded?.window?.endEditing(true) + // Acknowledge the request; Flutter observes actual view insets. + result(nil) + } } } diff --git a/app/lib/app/keyboard_dismissal.dart b/app/lib/app/keyboard_dismissal.dart new file mode 100644 index 00000000..d281cf72 --- /dev/null +++ b/app/lib/app/keyboard_dismissal.dart @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +// Part of PyBLE (https://pyble.dev) — see /LICENSE. + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +const MethodChannel _keyboardChannel = MethodChannel('dev.pyble/keyboard'); + +/// Requests dismissal of the current window's keyboard, including native +/// WebView fields. Completion does not assert that the keyboard is hidden; +/// layout continues to follow the actual view insets. +Future dismissSoftwareKeyboard() async { + if (!kIsWeb && + (defaultTargetPlatform == TargetPlatform.android || + defaultTargetPlatform == TargetPlatform.iOS)) { + await _keyboardChannel.invokeMethod('dismissKeyboard'); + } else { + await SystemChannels.textInput.invokeMethod('TextInput.hide'); + } +} diff --git a/app/lib/app/shell.dart b/app/lib/app/shell.dart index fc2fc485..4a130829 100644 --- a/app/lib/app/shell.dart +++ b/app/lib/app/shell.dart @@ -25,6 +25,7 @@ import 'package:pyble/localization/localization.dart'; import 'package:pyble/pble/pble.dart'; import 'package:pyble/theme/theme.dart'; +import 'keyboard_dismissal.dart'; import 'pages/about_page.dart'; import 'pages/blocks_page.dart'; import 'pages/connect_page.dart'; @@ -335,12 +336,13 @@ class _LandscapeShell extends ConsumerWidget { collapsed: keyboardVisible || (blocksFocused && !blocksConsoleExpanded), onToggle: keyboardVisible - ? () { + ? () async { if (blocksFocused) { ref.read(blocksConsoleExpandedProvider.notifier).state = true; } FocusScope.of(context).unfocus(); + await dismissSoftwareKeyboard(); } : blocksFocused ? () { diff --git a/app/test/unit/keyboard_dismissal_test.dart b/app/test/unit/keyboard_dismissal_test.dart new file mode 100644 index 00000000..ba8c5129 --- /dev/null +++ b/app/test/unit/keyboard_dismissal_test.dart @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +// Part of PyBLE (https://pyble.dev) — see /LICENSE. + +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pyble/app/keyboard_dismissal.dart'; + +void main() { + testWidgets( + 'a platform without the app native handler uses the Flutter hide request', + (WidgetTester tester) async { + tester.testTextInput.log.clear(); + await dismissSoftwareKeyboard(); + expect( + tester.testTextInput.log.map((call) => call.method), + contains('TextInput.hide'), + ); + }, + variant: TargetPlatformVariant({TargetPlatform.linux}), + ); +} diff --git a/app/test/widget/app_shell_test.dart b/app/test/widget/app_shell_test.dart index 0bc22506..d0783255 100644 --- a/app/test/widget/app_shell_test.dart +++ b/app/test/widget/app_shell_test.dart @@ -21,8 +21,6 @@ // toolbar action slots) without weakening any of it. // HAND-OFF provenance: lib/app → app-architect; lib/pble → app-protocol-engineer. -import 'dart:typed_data'; - import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; @@ -95,15 +93,9 @@ Future _focusLandscapeBlocks(WidgetTester tester) async { void main() { group('landscape software keyboard', () { - for (final TargetPlatform platform in [ - TargetPlatform.android, - TargetPlatform.iOS, - ]) { - testWidgets('Expand dismisses a native Blocks keyboard on $platform', ( - WidgetTester tester, - ) async { - debugDefaultTargetPlatformOverride = platform; - addTearDown(() => debugDefaultTargetPlatformOverride = null); + testWidgets( + 'Expand requests native Blocks keyboard dismissal', + (WidgetTester tester) async { const MethodChannel keyboard = MethodChannel('dev.pyble/keyboard'); final List requests = []; tester.binding.defaultBinaryMessenger.setMockMethodCallHandler( @@ -154,8 +146,12 @@ void main() { ); expect(tester.element(find.byKey(_blocksWorkspaceHostKey)), same(host)); expect(tester.takeException(), isNull); - }); - } + }, + variant: TargetPlatformVariant({ + TargetPlatform.android, + TargetPlatform.iOS, + }), + ); testWidgets('Expand preserves a Flutter editor draft and selection', ( WidgetTester tester, From 758030a3fe084ef9b8bd448134ea52a08213dfde Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 18:30:00 +0700 Subject: [PATCH 10/31] [docs] bind final release package to native keyboard repair Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/06_Release_Readiness.md | 63 +++++++++++++------ 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md index 47851780..a8de1752 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md @@ -7,10 +7,10 @@ |---|---| | Date | 31 October 2026, Asia/Bangkok | | Scope | App-only bounded current-text recovery; existing Play open-testing and TestFlight channels | -| Runtime source | Recovery baseline plus landscape-keyboard repair at `e54a78acf32e7ea26166a60d66573fdf9e697ad4` | -| Build checkout | Release worktree `e8aeddd8ddbda85293dcca72ad524823bd5ae66a`; app tree `d0f2a464e9886c8451a0cb046123973095f246c6`, verified identical to the runtime baseline | -| 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 | -| Local evidence | Ignored `local/recovery-completion/release/candidate-e54a78a/`: build/check logs, source/artifact manifests, runtime evidence and retained signed binaries | +| Runtime source | Recovery baseline plus landscape layout and native keyboard-dismissal repairs at `01a7ac8acab32e926c185c8567f9b8dca08d3d68` | +| Build checkout | Release worktree `c98c0b4cc202c4c998ad84187a0c80bd59747f9d`; app tree `10336954910872172006300bdcc15d62231471e9`, verified identical to the runtime baseline | +| State | Production Android and iOS rebuilt cleanly with both keyboard repairs; packaging and the bounded Android 16 KiB runtime smoke pass. Physical acceptance and final release admission remain outstanding | +| Local evidence | Ignored `local/recovery-completion/release/candidate-01a7ac8/`: build/check logs, source/artifact manifests, runtime evidence and retained signed binaries | | Public copy | [Prepared release packet](../../../publication/app-0.3.0-build-9-release-packet.md); no submission or availability claim | ## Gate selection @@ -25,7 +25,7 @@ claim a new firmware release, fresh firmware OI-1 qualification or a Ready badge | Gate | Required evidence | Current disposition | |---|---|---| | 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 | -| 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 | +| 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 repair records 978 ordinary Flutter tests, 28 shell widget tests, one platform-fallback test and clean analysis/source gates. Integrated-candidate CI and final physical acceptance remain separate | | 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 | | 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 | | Release review | Frozen artifact identity, resolved mandatory failures, supported scope, privacy/dependency review and recorded acceptance | Not yet admitted | @@ -46,6 +46,15 @@ physical or packaging evidence. | Q07 | Q08 | `esp32-c3-4mb` | Common workflow plus affected recovery and real-UI tight-loop/print-flood Stop; see scope below | | Q09 | Q10 | `rpi-pico2-w` | Common workflow plus affected recovery on each physical platform; no new full GP2 qualification inferred | +The selected unchanged firmware inputs are the published `c8f549ee` reference +for classic ESP32 and the retained `96497b9` observer reference for generic S3, +Waveshare S3, C3 and Pico 2 W. Current immutable image checks and exact hashes +are recorded with the [execution evidence](00_Execution_Record.md). Runtime and +build-driver source review found no differences between those references, but +the artifact bytes differ. This is an app-only matrix on those named inputs; +it must not be relabeled as five current published-image passes or a fresh +firmware qualification. No firmware update is part of this release preparation. + Each common row includes ordinary service-filtered discovery/HELLO, editing and saving a harmless file, Run/stdout/terminal state, Stop, exact file readback, disconnect/reconnect and workspace continuity. Retain the selected candidate's @@ -80,8 +89,8 @@ manager and never written into source or logs. | Artifact | SHA-256 | Bytes | |---|---|---:| -| `PyBLE-0.3.0-build-9-production-release.aab` | `6fe609a2ebfb925bbffe2662d64a24b4b9bfdb8b5b39ee3fde6077f3cf8fba73` | 64,413,036 | -| `PyBLE-0.3.0-build-9-production-release.apk` | `71b99f8312c298693e6a8ed1aaa9fc4dc960ac6371504fdfec81152873f67ef8` | 66,439,954 | +| `PyBLE-0.3.0-build-9-production-release.aab` | `8bc29ec294a1369abf1adba644d7494ae97bf04a1198577c2f0b95c7cdbf5e6a` | 64,416,064 | +| `PyBLE-0.3.0-build-9-production-release.apk` | `d0b8e1ec19919b707c0776cef9c377a3fe015442ead1c743e5b689c2522b6aff` | 66,439,954 | | Check | Actual result | |---|---| @@ -97,9 +106,9 @@ manager and never written into source or logs. The 16 KiB runtime observation also force-stopped and relaunched the same installed package without data clearing. The normal disconnected screen returned without a fatal exception or native-library load error. The database -created by the earlier `6f5b3ea` production candidate and its WAL reopened with -`integrity_check=ok` -and the expected `projects`, `project_files` and `settings` tables. This is a +created by the earlier `6f5b3ea` production candidate, subsequently reused by +`e54a78a`, and its WAL reopened with +`integrity_check=ok` and the expected `projects`, `project_files` and `settings` tables. This is a native packaging/startup smoke, not a physical BLE row or the full recovery acceptance matrix. The SQLite database's own page size is independent of the operating-system memory page size. The emulator uses Google APIs 16 KiB arm64 @@ -116,10 +125,16 @@ A later incremental rebuild after the keyboard repair regenerated AOT inputs but reused stale Gradle merged/stripped native libraries. Comparing packaged `libapp.so` against current build inputs exposed the mismatch; those artifacts were rejected and retained under `rejected-stale-gradle-e54a78a/`. Running -`flutter clean` and both canonical production commands rebuilt the current -artifacts above. Their packaged AOT libraries match current stripped outputs -on all three ABIs. The earlier `6f5b3ea` artifacts remain historical evidence -under `artifacts-6f5b3ea/`; they are not the repaired release candidate. +`flutter clean` and both canonical production commands resolved that mismatch. +The final native-keyboard repair used another clean build; its packaged AOT +libraries match current stripped outputs and the AAB on all three ABIs. The +`6f5b3ea` artifacts under `artifacts-6f5b3ea/` and pre-native-fix `e54a78a` +artifacts under `candidate-e54a78a/` remain historical evidence. + +The first final-candidate build encountered an OpenJDK 17 AArch64 JIT internal +error in a long-lived Gradle daemon. Its failed log and crash receipt are kept +under `failed-jvm-01a7ac8/`. A fresh-daemon clean retry built the recorded APK, +AAB and IPA without a source change; all artifact checks were repeated. The APK uses the upload certificate, whereas Google Play can deliver its own app-signing certificate. Do not uninstall an existing user's Play app or clear @@ -130,8 +145,8 @@ must use the actual delivered package. | Field / check | Actual result | |---|---| -| IPA | `PyBLE-0.3.0-build-9-app-store.ipa`, 23,784,757 bytes | -| SHA-256 | `14146b8951e4cd3298d27eb20e2036c80bbcd1b05bba42c98bf1abbd53b5eba6` | +| IPA | `PyBLE-0.3.0-build-9-app-store.ipa`, 23,786,245 bytes | +| SHA-256 | `4a9de1114a6f4618672d8027b7fe3b754a7412e124e1f36282a6920cda1d5390` | | Identity | `dev.pyble.pyble`, `0.3.0 (9)`, normal `lib/main.dart` | | Build / deployment floor | Xcode 27.2 / iOS SDK 27.2; app and compiled deployment floor at least iOS 15.0 | | Export | App Store Connect distribution export; automatic signing with build-number management disabled; export destination only, no upload | @@ -159,12 +174,19 @@ The current isolated profile candidate subsequently reached the real Blocks workspace. These observations distinguish the retained debug failure from a completed profile-candidate failure; they do not identify the original cause or prove DR-T12 by themselves. The inline control exposed a possible callback -ordering hazard, but neither exact-asset control reproduced it, so no runtime -change or claimed fix followed. The physical report must separately record +ordering hazard, but neither exact-asset control reproduced it, so no startup-protocol +change or claimed startup fix followed. The physical report must separately record actual generated-text handoff, recovery and cold relaunch. Diagnostic fixture sources, APK hashes and callback logs remain under ignored `local/recovery-completion/{native-webview-smoke,flutter-webview-smoke,android}/`. -The production artifacts above remain bound to `e54a78a`. +A separate physical finding established that console Expand did not dismiss +an Android keyboard owned by a native Blockly field. The final candidate adds +a narrow current-window dismissal request on Android and iOS while retaining +layout based on actual insets. The Android rerun observed IME visibility change +from shown to hidden, an expanded console and retained field text. The iPad +outcome remains part of its separate physical report. The production artifacts +above include this repair and remain bound to `01a7ac8`; the diagnostic controls +did not change the Blocks startup protocol. ## Distribution access and remaining account work @@ -175,7 +197,8 @@ an authenticated store session, role, account version history or review status. No dedicated Play/App Store Connect connector or configured command-line store credential was found in the standard locations inspected. Account access and -whether build 9 has already been consumed remain **unverified**. This is not a +whether build 9 has already been consumed remain **unverified**. Read-only +browser discovery did not establish an authenticated console session. This is not a claim that the owner has no access through the respective web consoles. After the candidate is admitted, the authorized distribution operator must From 286d28018d5af413ff1866f358afddb26cb61411 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 18:54:57 +0700 Subject: [PATCH 11/31] [docs] record Android recovery and app-only matrix acceptance Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/05_Android_Acceptance.md | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md new file mode 100644 index 00000000..e78a83e4 --- /dev/null +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md @@ -0,0 +1,127 @@ + + + +# Android recovery acceptance continuation + +| Field | Record | +|---|---| +| Date / operator | 31 October 2026; automated operator on the maintainer's Mac | +| State | Completed Android continuation within the physical scope and limitations recorded below | +| Physical device | Lenovo TB-J616X; Android 12 / API 31; landscape 2000 × 1200 pixels at 240 dpi | +| App | `0.3.0 (9)`, normal `lib/main.dart`; isolated qualification application identity preserves the installed store app and its data | +| Final runtime source | `01a7ac8acab32e926c185c8567f9b8dca08d3d68`; Android worktree runtime is byte-equivalent. The native package name alone is changed for the isolated identity | +| Final profile APK SHA-256 | `afc50a741a07344047d3069c9d4a36c1111869b3286e67b0a9f8d4a61a408e89`; also verified against the installed `base.apk` | +| Final arm64 AOT SHA-256 | `2ddb34eb36169466b5aa5aa32515e007354389f1ebdd276c0fdd40638e6e47a4` | +| Final native DEX SHA-256 | `1b62aceb530a2d361980b18d009188994cf7c92118d22842af3a6293757b61bb` | +| Original debug APK | Source equivalent to `6f5b3ea`; SHA-256 `957982f5acec969f8003d04b2d6444eecbba9af26b7392d760badb5be5d6bd0e`; original failures retained | +| Earlier profile APK | Runtime equivalent to `e54a78a`; SHA-256 `5b93b0c68bfc7bfa06a3a887ab70192a4d47c4786cf82e5428005ef94b199861` | +| Governing evidence | [Recovery contract](../../../specifications/App/current-draft-recovery.md#7-required-evidence-before-acceptance), [operator recipe](01_Operator_Recipe.md), [execution record](00_Execution_Record.md), [release matrix](../c1-s1/04_Release_Qualification_Matrix.md) | +| Private evidence | Ignored `local/recovery-completion/android/`: exact artifact/source manifests, native assertions, fresh UI XML/screenshots, logs, initial isolated-data backup and installed-artifact hash | + +Both profile candidates were built from the normal application entry point. +The final candidate was built after `flutter clean`, with the new Dart keyboard +helper and native activity handler included. It is a qualification package; +these observations do not independently establish Play delivery or production +signing. The release record owns that separate packaging evidence. + +## Recovery and replacement observations + +The initial isolated Editor was empty. Its private data was backed up before +qualification, and the store app was not replaced or cleared. Only disposable +text and uniquely named board fixtures were used. No firmware was flashed by +this Android workflow. + +| Recipe | Result / physical oracle | Evidence prefix | +|---|---|---| +| 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` | +| 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` | +| P03 | Pass: explicit recovery save acknowledges the matching text; Saved locally and board Unsaved changes remain distinct | `profile-saved-local`, `nativefix-continuous-saved` | +| P04 | Pass: actual force-stop/relaunch reproduces exact named text and checkpoint, including the generated Blocks text | `nativefix-typed-offline-relaunch`, `nativefix-generated-relaunch` | +| P05 | Pass: Back leaves the unresolved recovery decision; relaunch presents the same complete generated checkpoint | `nativefix-recovery-before-back`, `nativefix-recovery-after-back` | +| P06 | Pass on final candidate: explicit Restore shows exact text in the disconnected local panel; connecting remains a separate action | `controlled-3dcb-local-restore` | +| 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` | +| 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` | +| 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` | +| 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` | +| 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` | +| 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` | +| 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-*` | +| 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` | +| 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-*` | + +The generated-text recovery observation does not claim restoration of a Blocks +workspace, revision history or companion files. The UI explicitly states that +the local slot contains one current text draft. + +The retained earlier-profile observations cover unchanged storage, target-guard +and transport code. The final runtime changes keyboard dismissal; its affected +Editor/native-WebView behavior and Blocks handoff were repeated on the final +installed artifact. This is an impact assessment, not a claim that every earlier +observation was rerun on identical bytes. + +Deterministic transaction-phase interruption, storage failure/volatile fallback +and stale-consent races remain covered by the automated fault/controller tests. +The normal device UI does not provide a reliable way to force those internal +phases. Their physical execution is not inferred from a successful ordinary +restart. Error-panel localization/layout coverage also remains part of the +host widget/semantics/golden evidence. + +## Physical app-only matrix + +Every passing core row covers edit, explicit Save, Run, observed stdout, Stop, +clearing the Editor before opening the saved board file, exact readback, explicit +disconnect/reconnect, and another readback. Program bytes and private action +receipts are retained with each row. A Ready scan result alone is not counted. + +| Row | Exact profile / board alias | App candidate | Result | Raw prefix | +|---|---|---|---|---| +| Q02 | `esp32-4mb` / 8C9E | Final | Pass | `q8c9e` | +| Q04 | `esp32-s3-n16r8` / 5646 | Final | Pass | `q5646` | +| Q06 | `waveshare-esp32-s3-lcd-147b` / DA86 | Final | Pass | `qda86` | +| Q08 | `esp32-c3-4mb` / C81A | Earlier profile; unchanged transport/run code | Pass, including both required real-UI Stop cases | `profile-c3-*`, `profile-tight-*`, `profile-flood-*` | +| Q10 | `rpi-pico2-w` / 3DCB | Final | Pass after an explicitly retained Android-133 connection failure and retry | `q3dcb` | + +C3 ran both `while True:\n pass\n` and +`while True:\n print(24680)\n`. The recorded UI changed from Running to +Ready/Console Idle after Stop and remained connected. During the print flood, +UIAutomator could not obtain an idle hierarchy; a direct live screenshot records +Running and repeated output before the captured toolbar Stop action. The settled +hierarchy then records Ready/Idle. No fresh wire-level latency bound or complete +firmware C3 qualification is claimed. + +The [execution record](00_Execution_Record.md) owns the fresh immutable-program +bindings and app-only scope decision. Classic ESP32 is bound to the published +baseline; the two S3 boards, C3 and Pico 2 W are bound to the verified observer +baseline `96497b9`. Their common HELLO version `0.6.1` is not treated as evidence +of identical firmware bytes or of the published five-profile firmware gate. + +## Defects resolved and evidence limits + +| Finding | Original observation | Final observation | +|---|---|---| +| Landscape keyboard overflow | Original debug candidate hid the Editor and overflowed Files/navigation while IME was visible | Editor and navigation remain visible; console collapses honestly and expands after keyboard dismissal | +| Native WebView keyboard remained open | Earlier profile: Blocks HTML field → Expand console retained the IME despite the successful semantic button action | Final profile: same action retains the field/workspace, expands console, and changes Android `mInputShown` from true to false | +| Initial debug Blocks startup failure | Original debug retries and device/provider restart reached the startup watchdog; browser-side diagnostics alone did not establish a JS/CSP cause | Clean profile application initializes, loads/edits the example and completes real handoff/relaunch. Exact-assets native and pinned-plugin diagnostic apps also initialize. No speculative CSP/bootstrap change was made | + +Initial helper attempts that reused a stale hierarchy, replaced populated rich +Editor text unreliably, or encountered an unrelated Android crash dialog were +retained and excluded. Accepted readbacks first clear the Editor, and named-file +input waits for the adopted Editor filename. The initial TalkBack gesture +attempt is also excluded because service/interaction state was not controlled. +A post-probe interval failed the following test's expected UI precondition and +was excluded from target/discard acceptance; that complete sequence subsequently +passed in a fresh uninterrupted run. No cause is inferred for those intervals. + +The later isolated accessibility probe used +`FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES`. For Restore, Copy text and Discard +recovery copy, it verified an exact visible/enabled native button, accepted +accessibility-focus action, matching focus event and focused node. TalkBack +remained bound before and after the probes. This verifies native focus and label +exposure, not audible speech or complete screen-reader usability. Recorded +accessibility-service, touch-exploration and font settings were restored in a +`finally` step. Original radio settings were restored after offline checks. +All board connections were explicitly released; temporary diagnostic apps, +device helper files and the debugging forward were removed. The isolated +qualification app/data and private evidence remain available for review. An +exact ownership manifest records the disposable board fixtures for coordinated +cleanup without touching other files. From 221758ce2c7d2692e8a026ae81bc839ec3a5458e Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 18:36:06 +0700 Subject: [PATCH 12/31] [docs] record existing Xcode account upload route Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/06_Release_Readiness.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md index a8de1752..281afac3 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md @@ -153,7 +153,8 @@ must use the actual delivered package. | Provisioning | Production App Store profile; debugging disabled, no development-device list, beta reporting enabled; valid through 17 May 2027 | | Validation | `tools/validate_ios_ipa.sh` passes code-signature, compiled minimum OS, embedded-asset mode/classification and Xcode `swinfo` checks; only the three expected unsigned resource-bundle records are excluded | -The archive and exported IPA are retained privately. A distribution package +The archive (including dSYMs), exported IPA and Android R8 mapping are retained +privately outside the temporary build worktree. A distribution package with no development-device list is not the separately installed development Preview app. Its local validation does not establish App Store processing, TestFlight availability, or store-installed upgrade behavior. @@ -195,11 +196,16 @@ certificate. A valid Apple distribution identity and cached production App Store provisioning profile are available. Signing access alone does not prove an authenticated store session, role, account version history or review status. -No dedicated Play/App Store Connect connector or configured command-line store -credential was found in the standard locations inspected. Account access and -whether build 9 has already been consumed remain **unverified**. Read-only -browser discovery did not establish an authenticated console session. This is not a -claim that the owner has no access through the respective web consoles. +No dedicated Play/App Store Connect connector or configured standalone +command-line store credential was found in the standard locations inspected. +However, Xcode preferences contain one configured production Apple-account +reference, and its cached provisioning metadata includes the candidate signing +team. The existing Xcode account may therefore support an archive upload after +admission without a separate App Store Connect API key. Account metadata alone +does not verify a live session, App Store Connect role or whether build 9 has +already been consumed; these remain **unverified**. Read-only browser discovery +did not establish an authenticated console session. This is not a claim that +the owner lacks web-console access or that Xcode has no potential upload route. After the candidate is admitted, the authorized distribution operator must verify the exact package, unused build numbers and current declarations, upload From e6e6f942e4656fc30ecb5c85a29f9153cb30ee6a Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 18:57:33 +0700 Subject: [PATCH 13/31] [docs] correct Android acceptance inventory reference Signed-off-by: Viwat Vchirawongkwin --- .../2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md index e78a83e4..3395571c 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md @@ -15,7 +15,7 @@ | Final native DEX SHA-256 | `1b62aceb530a2d361980b18d009188994cf7c92118d22842af3a6293757b61bb` | | Original debug APK | Source equivalent to `6f5b3ea`; SHA-256 `957982f5acec969f8003d04b2d6444eecbba9af26b7392d760badb5be5d6bd0e`; original failures retained | | Earlier profile APK | Runtime equivalent to `e54a78a`; SHA-256 `5b93b0c68bfc7bfa06a3a887ab70192a4d47c4786cf82e5428005ef94b199861` | -| Governing evidence | [Recovery contract](../../../specifications/App/current-draft-recovery.md#7-required-evidence-before-acceptance), [operator recipe](01_Operator_Recipe.md), [execution record](00_Execution_Record.md), [release matrix](../c1-s1/04_Release_Qualification_Matrix.md) | +| Governing evidence | [Recovery contract](../../../specifications/App/current-draft-recovery.md#7-required-evidence-before-acceptance), [operator recipe](01_Operator_Recipe.md), [execution record](00_Execution_Record.md), [validation inventory](../c1-s1/04_Validation_Inventory_and_Operator_Recipe.md) | | Private evidence | Ignored `local/recovery-completion/android/`: exact artifact/source manifests, native assertions, fresh UI XML/screenshots, logs, initial isolated-data backup and installed-artifact hash | Both profile candidates were built from the normal application entry point. From bd36731a8718e2518cdf059738b0cff5188aa185 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 18:55:21 +0700 Subject: [PATCH 14/31] [red] cover iPad keyboard palette geometry fallback Signed-off-by: Viwat Vchirawongkwin --- app/test/widget/keyboard_insets_test.dart | 159 ++++++++++++++++++++++ docs/specifications/App/TDD.md | 13 ++ docs/specifications/App/specs.md | 1 + 3 files changed, 173 insertions(+) create mode 100644 app/test/widget/keyboard_insets_test.dart diff --git a/app/test/widget/keyboard_insets_test.dart b/app/test/widget/keyboard_insets_test.dart new file mode 100644 index 00000000..3bcf1d4b --- /dev/null +++ b/app/test/widget/keyboard_insets_test.dart @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: MIT +// Part of PyBLE (https://pyble.dev) — see /LICENSE. + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pyble/console/console.dart'; +import 'package:pyble/pble/pble.dart'; + +import '../support/shell_harness.dart'; + +const MethodChannel _channel = MethodChannel('dev.pyble/keyboard/insets'); + +void main() { + final List calls = []; + setUp(() { + calls.clear(); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(_channel, (MethodCall call) async { + calls.add(call); + return null; + }); + }); + tearDown(() { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(_channel, null); + }); + + int generation() => + (calls.lastWhere((MethodCall call) => call.method == 'observe').arguments + as int); + + Future report(WidgetTester tester, double bottom, {int? epoch}) async { + await tester.binding.defaultBinaryMessenger.handlePlatformMessage( + _channel.name, + _channel.codec.encodeMethodCall( + MethodCall('inset', { + 'generation': epoch ?? generation(), + 'bottom': bottom, + }), + ), + (_) {}, + ); + await tester.pump(); + } + + MediaQueryData geometry(WidgetTester tester) => + MediaQuery.of(tester.element(find.byType(Scaffold).first)); + + testWidgets( + 'iPad palette reopening keeps Expand above the actual keyboard', + (WidgetTester tester) async { + await pumpShell( + tester, + connection: fakeConnection(initial: ConnState.ready), + ); + expect( + calls.where((MethodCall call) => call.method == 'observe'), + isNotEmpty, + ); + final EditableText editor = tester.widget( + find.byType(EditableText).first, + ); + editor.controller.text = '# retained across native geometry'; + editor.controller.selection = const TextSelection.collapsed(offset: 5); + await report(tester, 81.5); + expect(geometry(tester).viewInsets.bottom, 81.5); + await report(tester, 498); + expect(geometry(tester).viewInsets.bottom, 498); + expect( + tester.getRect(find.byKey(kConsoleStripToggleKey)).bottom, + lessThanOrEqualTo(1024 - 498), + ); + expect(find.byKey(kConsoleStripToggleKey).hitTestable(), findsOneWidget); + expect(editor.controller.text, '# retained across native geometry'); + expect( + editor.controller.selection, + const TextSelection.collapsed(offset: 5), + ); + expect(tester.takeException(), isNull); + }, + variant: TargetPlatformVariant.only(TargetPlatform.iOS), + ); + + testWidgets( + 'guide and Flutter insets combine by maximum and restore padding', + (WidgetTester tester) async { + await pumpShell( + tester, + connection: fakeConnection(initial: ConnState.ready), + ); + tester.view.viewPadding = const FakeViewPadding(bottom: 40); + tester.view.padding = const FakeViewPadding(bottom: 40); + tester.view.viewInsets = const FakeViewPadding(bottom: 996); + addTearDown(tester.view.resetViewPadding); + addTearDown(tester.view.resetPadding); + addTearDown(tester.view.resetViewInsets); + await tester.pump(); + await report(tester, 498); + expect(geometry(tester).viewInsets.bottom, 498); + expect(geometry(tester).padding.bottom, 0); + await report(tester, 81.5); + expect(geometry(tester).viewInsets.bottom, 498); + tester.view.resetViewInsets(); + await tester.pump(); + expect(geometry(tester).viewInsets.bottom, 81.5); + await report(tester, 0); + expect(geometry(tester).viewInsets.bottom, 0); + expect(geometry(tester).padding.bottom, 20); + }, + variant: TargetPlatformVariant.only(TargetPlatform.iOS), + ); + + testWidgets( + 'background resets observation and stale or invalid reports are inert', + (WidgetTester tester) async { + await pumpShell( + tester, + connection: fakeConnection(initial: ConnState.ready), + ); + final int old = generation(); + await report(tester, 498); + tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.paused); + await tester.pump(); + expect(geometry(tester).viewInsets.bottom, 0); + await report(tester, 498, epoch: old); + expect(geometry(tester).viewInsets.bottom, 0); + tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.resumed); + await tester.pump(); + expect(generation(), isNot(old)); + await report(tester, 498, epoch: old); + await report(tester, -1); + await report(tester, double.infinity); + await report(tester, 2048); + expect(geometry(tester).viewInsets.bottom, 0); + await report(tester, 70.5); + expect(geometry(tester).viewInsets.bottom, 70.5); + await tester.pumpWidget(const SizedBox()); + expect(calls.last.method, 'stop'); + }, + variant: TargetPlatformVariant.only(TargetPlatform.iOS), + ); + + testWidgets( + 'Android retains ordinary Flutter keyboard geometry', + (WidgetTester tester) async { + await pumpShell( + tester, + connection: fakeConnection(initial: ConnState.ready), + ); + expect(calls, isEmpty); + tester.view.viewInsets = const FakeViewPadding(bottom: 808); + addTearDown(tester.view.resetViewInsets); + await tester.pump(); + expect(geometry(tester).viewInsets.bottom, 404); + }, + variant: TargetPlatformVariant.only(TargetPlatform.android), + ); +} diff --git a/docs/specifications/App/TDD.md b/docs/specifications/App/TDD.md index c92b486e..53b32e9e 100644 --- a/docs/specifications/App/TDD.md +++ b/docs/specifications/App/TDD.md @@ -2048,6 +2048,19 @@ Tablet-first, responsive (CON-5, FR-UI-5). The shell is **connection-gated** ([A stays collapsed until actual view insets clear. This action does not clear a text client, replace the Blocks host, discard buffered output, or mutate the document/selection. +- **iOS keyboard geometry (FR-UI-8).** Observe the current engine view's public + `UIKeyboardLayoutGuide` after the first Flutter frame and when the app resumes + or view metrics change. A noninteractive view constrained to the guide reports + docked keyboard/palette overlap; a hidden guide's safe-area-only overlap is + zero. Do not infer visibility from notification end frames: physical iPad + Hide → palette Show Keyboard can report an offscreen end frame while the + guide correctly intersects the view. The application-level MediaQuery uses + `max(Flutter bottom inset, guide overlap)` and recalculates bottom padding + from viewPadding. Observation belongs to the current engine/view, stops on + detach/background, rejects stale generations and invalid geometry, and never + recreates the editor or Blocks host. Regression tests cover zero/stale Flutter + insets, already-correct insets without double shrink, palette retention, + safe-area restoration, stale callbacks, resume and ordinary non-iOS layout. - **Portrait / stacked tablet** layout uses a bottom bar to swap the full-width Editor, Console, Files, and Blocks work surfaces (FR-UI-2, [PRD §19.2](../prd.md)); editor remains the default primary surface. Blocks is diff --git a/docs/specifications/App/specs.md b/docs/specifications/App/specs.md index a06d5b75..86eb9064 100644 --- a/docs/specifications/App/specs.md +++ b/docs/specifications/App/specs.md @@ -1012,6 +1012,7 @@ implementation: - **FR-UI-6** — Interactive controls MUST use large touch targets and MUST clearly communicate connection and run state (disconnected/connecting/ready/running/error). MUST (*source: PRD §13.2; verify: golden; story: A-22*) - **FR-UI-7** — No UI panel MUST bind to BLE directly; every panel binds to `Connection`. MUST (*source: PRD §19, app.md §1; verify: unit; story: all A-2x/3x*) - **FR-UI-8** — With a landscape software keyboard open, the connected shell MUST retain a usable editor viewport and reachable navigation without panel overflow. The console output strip MUST temporarily collapse to its status/actions bar while retaining buffered output; expanding it dismisses the keyboard. Navigation destinations MUST remain reachable by scrolling when height is constrained. Closing the keyboard restores the ordinary console layout and preserves the current document and selection. MUST (*source: FR-UI-1/5/6, NFR-A11Y-3; verify: widget and physical keyboard observations*) + On iOS, this includes reopening the docked keyboard through its input palette when notification-derived Flutter insets are stale. The current window's keyboard layout guide supplies a fallback bottom occlusion; combine it with Flutter's inset by maximum, never addition. Preserve a visible input palette's actual occlusion and ordinary safe-area padding when the keyboard is hidden. ### 4.14 Scan/Connect Flow UI (`lib/connect/`) — FR-CONNECT From bef67bded9e5b83437e3eb0e2ec4be6a4cfd1a64 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 19:00:44 +0700 Subject: [PATCH 15/31] [green] keep iPad keyboard palette clear of editing controls Signed-off-by: Viwat Vchirawongkwin --- app/ios/Runner/AppDelegate.swift | 108 ++++++++++++++++++ app/lib/app/app.dart | 3 + app/lib/app/keyboard_insets.dart | 131 ++++++++++++++++++++++ app/test/widget/keyboard_insets_test.dart | 105 ++++++++++++++++- 4 files changed, 346 insertions(+), 1 deletion(-) create mode 100644 app/lib/app/keyboard_insets.dart diff --git a/app/ios/Runner/AppDelegate.swift b/app/ios/Runner/AppDelegate.swift index 8910e1af..d48e3083 100644 --- a/app/ios/Runner/AppDelegate.swift +++ b/app/ios/Runner/AppDelegate.swift @@ -6,6 +6,8 @@ import UIKit @main @objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { + private var keyboardInsets: PybleKeyboardInsets? + override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? @@ -17,6 +19,7 @@ import UIKit GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) guard let registrar = engineBridge.pluginRegistry.registrar(forPlugin: "PybleKeyboardDismissal") else { return } + keyboardInsets = PybleKeyboardInsets(registrar: registrar) let keyboard = FlutterMethodChannel( name: "dev.pyble/keyboard", binaryMessenger: registrar.messenger()) keyboard.setMethodCallHandler { [weak registrar] call, result in @@ -31,3 +34,108 @@ import UIKit } } } + +/// Measures the current Flutter view's public layout guide instead of keyboard +/// notification frames, which can be offscreen after an iPad palette transition. +private final class PybleKeyboardInsets { + private weak var registrar: FlutterPluginRegistrar? + private let channel: FlutterMethodChannel + private var observer: PybleKeyboardGuideView? + private var generation: Int? + private var lastBottom: CGFloat? + + init(registrar: FlutterPluginRegistrar) { + self.registrar = registrar + channel = FlutterMethodChannel( + name: "dev.pyble/keyboard/insets", binaryMessenger: registrar.messenger()) + channel.setMethodCallHandler { [weak self] call, result in + guard let self = self, let epoch = call.arguments as? Int else { + result(FlutterMethodNotImplemented) + return + } + switch call.method { + case "observe": + self.observe(generation: epoch) + result(nil) + case "stop": + if self.generation == epoch { self.stop() } + result(nil) + default: + result(FlutterMethodNotImplemented) + } + } + } + + private func observe(generation: Int) { + if self.generation != generation { + stop() + self.generation = generation + } + guard let view = registrar?.viewController?.viewIfLoaded else { + observer?.removeFromSuperview() + observer = nil + publish(0) + return + } + if observer?.superview !== view { + observer?.removeFromSuperview() + let guideView = PybleKeyboardGuideView() + guideView.translatesAutoresizingMaskIntoConstraints = false + guideView.isUserInteractionEnabled = false + guideView.accessibilityElementsHidden = true + guideView.backgroundColor = .clear + guideView.changed = { [weak self] bottom in self?.publish(bottom) } + observer = guideView + view.addSubview(guideView) + NSLayoutConstraint.activate([ + guideView.topAnchor.constraint(equalTo: view.keyboardLayoutGuide.topAnchor), + guideView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + guideView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + guideView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + ]) + view.layoutIfNeeded() + } + // An explicit refresh must return a snapshot even if UIKit has not moved: + // Dart may have rejected the previous value while its window size lagged. + lastBottom = nil + observer?.reportOverlap() + } + + private func publish(_ bottom: CGFloat) { + guard let generation = generation, bottom != lastBottom else { return } + lastBottom = bottom + channel.invokeMethod("inset", arguments: ["generation": generation, "bottom": bottom]) + } + + private func stop() { + generation = nil + observer?.removeFromSuperview() + observer = nil + lastBottom = nil + } +} + +private final class PybleKeyboardGuideView: UIView { + var changed: ((CGFloat) -> Void)? + + override func layoutSubviews() { + super.layoutSubviews() + reportOverlap() + } + + override func didMoveToWindow() { + super.didMoveToWindow() + reportOverlap() + } + + func reportOverlap() { + guard let owner = superview, window != nil else { + changed?(0) + return + } + // On iOS 15/16 a hidden/undocked guide ends at the safe-area bottom. + // A real docked keyboard or input palette reports its full overlap. + let overlap = min(owner.bounds.height, max(0, bounds.height)) + changed?(overlap <= owner.safeAreaInsets.bottom + 0.5 ? 0 : overlap) + } +} diff --git a/app/lib/app/app.dart b/app/lib/app/app.dart index 70cb4a55..daf0dfe9 100644 --- a/app/lib/app/app.dart +++ b/app/lib/app/app.dart @@ -19,6 +19,7 @@ import 'package:pyble/editor/recovery_gate.dart'; import 'package:pyble/theme/theme.dart'; import 'shell.dart'; +import 'keyboard_insets.dart'; /// Navigator used by explicit user confirmations, never by local recovery itself. final GlobalKey appNavigatorKey = GlobalKey(); @@ -45,6 +46,8 @@ class PybleApp extends StatelessWidget { highContrastDarkTheme: PybleTheme.highContrastDark, themeMode: ThemeMode.system, debugShowCheckedModeBanner: false, + builder: (BuildContext context, Widget? child) => + KeyboardInsets(child: child ?? const SizedBox.shrink()), home: const RecoveryGate(child: PybleShell()), ); } diff --git a/app/lib/app/keyboard_insets.dart b/app/lib/app/keyboard_insets.dart new file mode 100644 index 00000000..864bc54f --- /dev/null +++ b/app/lib/app/keyboard_insets.dart @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: MIT +// Part of PyBLE (https://pyble.dev) — see /LICENSE. + +import 'dart:async'; +import 'dart:math' as math; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; + +const MethodChannel _channel = MethodChannel('dev.pyble/keyboard/insets'); + +/// Supplements notification-derived iOS metrics with the current window's +/// keyboard layout guide. UIKit points and Flutter logical pixels coincide. +class KeyboardInsets extends StatefulWidget { + const KeyboardInsets({required this.child, super.key}); + + final Widget child; + + @override + State createState() => _KeyboardInsetsState(); +} + +class _KeyboardInsetsState extends State + with WidgetsBindingObserver { + static int _nextGeneration = 0; + late final bool _enabled = + !kIsWeb && defaultTargetPlatform == TargetPlatform.iOS; + int? _generation; + double _nativeBottom = 0; + double _viewHeight = 0; + bool _refreshScheduled = false; + + @override + void initState() { + super.initState(); + if (!_enabled) return; + _channel.setMethodCallHandler(_handleInset); + WidgetsBinding.instance.addObserver(this); + _generation = ++_nextGeneration; + _refreshAfterFrame(); + } + + Future _handleInset(MethodCall call) async { + final Object? arguments = call.arguments; + if (!mounted || + _generation == null || + call.method != 'inset' || + arguments is! Map || + arguments['generation'] != _generation) { + return; + } + final Object? raw = arguments['bottom']; + if (raw is! num) return; + final double bottom = raw.toDouble(); + if (!bottom.isFinite || bottom < 0 || bottom > _viewHeight) return; + if (_nativeBottom != bottom) setState(() => _nativeBottom = bottom); + } + + Future _request(String method, int generation) async { + try { + await _channel.invokeMethod(method, generation); + } on MissingPluginException { + // Host-only widget tests have no UIKit registrar. Flutter's ordinary + // metrics remain usable; the shipping iOS runner registers this channel. + } + } + + void _refreshAfterFrame() { + if (_refreshScheduled || _generation == null) return; + _refreshScheduled = true; + WidgetsBinding.instance.addPostFrameCallback((_) { + _refreshScheduled = false; + final int? generation = _generation; + if (mounted && generation != null) { + unawaited(_request('observe', generation)); + } + }); + } + + @override + void didChangeMetrics() => _refreshAfterFrame(); + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.paused || + state == AppLifecycleState.detached) { + _stop(); + if (_nativeBottom != 0) setState(() => _nativeBottom = 0); + } else if (state == AppLifecycleState.resumed) { + _generation ??= ++_nextGeneration; + _refreshAfterFrame(); + } + } + + void _stop() { + final int? generation = _generation; + _generation = null; + if (generation != null) unawaited(_request('stop', generation)); + } + + @override + void dispose() { + if (_enabled) { + _stop(); + WidgetsBinding.instance.removeObserver(this); + _channel.setMethodCallHandler(null); + } + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if (!_enabled) return widget.child; + final MediaQueryData original = MediaQuery.of(context); + _viewHeight = original.size.height; + final double bottom = math.max( + original.viewInsets.bottom, + _nativeBottom.clamp(0, _viewHeight), + ); + return MediaQuery( + data: original.copyWith( + viewInsets: original.viewInsets.copyWith(bottom: bottom), + padding: original.padding.copyWith( + bottom: math.max(0, original.viewPadding.bottom - bottom), + ), + ), + child: widget.child, + ); + } +} diff --git a/app/test/widget/keyboard_insets_test.dart b/app/test/widget/keyboard_insets_test.dart index 3bcf1d4b..c1eea0bd 100644 --- a/app/test/widget/keyboard_insets_test.dart +++ b/app/test/widget/keyboard_insets_test.dart @@ -30,7 +30,11 @@ void main() { (calls.lastWhere((MethodCall call) => call.method == 'observe').arguments as int); - Future report(WidgetTester tester, double bottom, {int? epoch}) async { + Future sendReport( + WidgetTester tester, + double bottom, { + int? epoch, + }) async { await tester.binding.defaultBinaryMessenger.handlePlatformMessage( _channel.name, _channel.codec.encodeMethodCall( @@ -41,6 +45,10 @@ void main() { ), (_) {}, ); + } + + Future report(WidgetTester tester, double bottom, {int? epoch}) async { + await sendReport(tester, bottom, epoch: epoch); await tester.pump(); } @@ -82,6 +90,64 @@ void main() { variant: TargetPlatformVariant.only(TargetPlatform.iOS), ); + testWidgets( + 'native guide keeps the Blocks host and dismissal control usable', + (WidgetTester tester) async { + const MethodChannel keyboard = MethodChannel('dev.pyble/keyboard'); + final List requests = []; + tester.binding.defaultBinaryMessenger.setMockMethodCallHandler( + keyboard, + (MethodCall call) async => requests.add(call.method), + ); + addTearDown( + () => tester.binding.defaultBinaryMessenger.setMockMethodCallHandler( + keyboard, + null, + ), + ); + await pumpShell( + tester, + connection: fakeConnection(initial: ConnState.ready), + ); + await tester.tap( + find.descendant( + of: find.byType(NavigationRail), + matching: find.text('Blocks'), + ), + ); + await tester.pump(); + final Finder workspace = find.byKey( + const ValueKey('blocksWorkspaceHost-0'), + ); + final Element host = tester.element(workspace); + await report(tester, 498); + expect( + tester.getRect(find.byKey(kConsoleStripToggleKey)).bottom, + lessThanOrEqualTo(1024 - 498), + ); + await tester.tap(find.byKey(kConsoleStripToggleKey)); + await tester.pump(); + expect(requests, ['dismissKeyboard']); + expect( + tester + .widget(find.byType(ConsoleStripView)) + .collapsed, + isTrue, + ); + expect(tester.element(workspace), same(host)); + await report(tester, 0); + expect( + tester + .widget(find.byType(ConsoleStripView)) + .collapsed, + isFalse, + ); + expect(tester.element(workspace), same(host)); + expect(tester.takeException(), isNull); + }, + variant: TargetPlatformVariant.only(TargetPlatform.iOS), + ); + testWidgets( 'guide and Flutter insets combine by maximum and restore padding', (WidgetTester tester) async { @@ -111,6 +177,39 @@ void main() { variant: TargetPlatformVariant.only(TargetPlatform.iOS), ); + testWidgets( + 'post-metrics refresh recovers a guide value that preceded window resizing', + (WidgetTester tester) async { + await pumpShell( + tester, + connection: fakeConnection(initial: ConnState.ready), + surface: const ShellSurface('short_window', Size(1366, 600), 2), + ); + await report(tester, 650); + expect(geometry(tester).viewInsets.bottom, 0); + tester.binding.defaultBinaryMessenger.setMockMethodCallHandler(_channel, ( + MethodCall call, + ) async { + calls.add(call); + if (call.method == 'observe') { + // Native observe returns a current snapshot even when unchanged. + await sendReport(tester, 650, epoch: call.arguments as int); + } + return null; + }); + tester.view.physicalSize = const Size(2732, 2048); + await tester.pump(); + await tester.pump(); + expect(geometry(tester).viewInsets.bottom, 650); + expect( + tester.getRect(find.byKey(kConsoleStripToggleKey)).bottom, + lessThanOrEqualTo(1024 - 650), + ); + expect(tester.takeException(), isNull); + }, + variant: TargetPlatformVariant.only(TargetPlatform.iOS), + ); + testWidgets( 'background resets observation and stale or invalid reports are inert', (WidgetTester tester) async { @@ -120,11 +219,15 @@ void main() { ); final int old = generation(); await report(tester, 498); + tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.inactive); + tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.hidden); tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.paused); await tester.pump(); expect(geometry(tester).viewInsets.bottom, 0); await report(tester, 498, epoch: old); expect(geometry(tester).viewInsets.bottom, 0); + tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.hidden); + tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.inactive); tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.resumed); await tester.pump(); expect(generation(), isNot(old)); From fe80d17c5322dc621a47df3d2a18fce00914f92c Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 19:04:13 +0700 Subject: [PATCH 16/31] [docs] record coordinated Android fixture cleanup Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/05_Android_Acceptance.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md index 3395571c..dbd79a30 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md @@ -123,5 +123,10 @@ accessibility-service, touch-exploration and font settings were restored in a All board connections were explicitly released; temporary diagnostic apps, device helper files and the debugging forward were removed. The isolated qualification app/data and private evidence remain available for review. An -exact ownership manifest records the disposable board fixtures for coordinated -cleanup without touching other files. +exact ownership manifest records the disposable board fixtures. Coordinated +cleanup removed nine authored files and five empty owned directories from the +Classic ESP32, generic S3, Waveshare and Pico. Each file was read and privately +backed up before deletion; unchanged unrelated root entries and disconnection +were verified for every board. The C3 fixtures remain reserved for the iPad +acceptance run. Private per-board cleanup receipts retain the commands, +readback hashes and before/after listings. From d9d058a8f9044c96cb61c30a1dcda391213c3fdd Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 19:09:08 +0700 Subject: [PATCH 17/31] [docs] bind release artifacts to iPad keyboard geometry repair Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/06_Release_Readiness.md | 68 +++++++++++++++---- .../app-0.3.0-build-9-release-packet.md | 2 +- 2 files changed, 54 insertions(+), 16 deletions(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md index 281afac3..b0ff7446 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md @@ -7,10 +7,10 @@ |---|---| | Date | 31 October 2026, Asia/Bangkok | | Scope | App-only bounded current-text recovery; existing Play open-testing and TestFlight channels | -| Runtime source | Recovery baseline plus landscape layout and native keyboard-dismissal repairs at `01a7ac8acab32e926c185c8567f9b8dca08d3d68` | -| Build checkout | Release worktree `c98c0b4cc202c4c998ad84187a0c80bd59747f9d`; app tree `10336954910872172006300bdcc15d62231471e9`, verified identical to the runtime baseline | -| State | Production Android and iOS rebuilt cleanly with both keyboard repairs; packaging and the bounded Android 16 KiB runtime smoke pass. Physical acceptance and final release admission remain outstanding | -| Local evidence | Ignored `local/recovery-completion/release/candidate-01a7ac8/`: build/check logs, source/artifact manifests, runtime evidence and retained signed binaries | +| Runtime source | Recovery baseline plus landscape layout, native keyboard dismissal and iPad palette-geometry repairs at `bef67bded9e5b83437e3eb0e2ec4be6a4cfd1a64` | +| Build checkout | Release worktree `c6e685dd3ebe718ed89fcfe58e441331eb174648`; app tree `60b3a68b693551af5d83076547c502f69838e052`, verified identical to the runtime baseline | +| 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 | +| Local evidence | Ignored `local/recovery-completion/release/candidate-bef67bd/`: build/check logs, source/artifact manifests, runtime evidence and retained signed binaries | | Public copy | [Prepared release packet](../../../publication/app-0.3.0-build-9-release-packet.md); no submission or availability claim | ## Gate selection @@ -25,7 +25,7 @@ claim a new firmware release, fresh firmware OI-1 qualification or a Ready badge | Gate | Required evidence | Current disposition | |---|---|---| | 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 | -| 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 repair records 978 ordinary Flutter tests, 28 shell widget tests, one platform-fallback test and clean analysis/source gates. Integrated-candidate CI and final physical acceptance remain separate | +| 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 | | 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 | | 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 | | Release review | Frozen artifact identity, resolved mandatory failures, supported scope, privacy/dependency review and recorded acceptance | Not yet admitted | @@ -89,8 +89,8 @@ manager and never written into source or logs. | Artifact | SHA-256 | Bytes | |---|---|---:| -| `PyBLE-0.3.0-build-9-production-release.aab` | `8bc29ec294a1369abf1adba644d7494ae97bf04a1198577c2f0b95c7cdbf5e6a` | 64,416,064 | -| `PyBLE-0.3.0-build-9-production-release.apk` | `d0b8e1ec19919b707c0776cef9c377a3fe015442ead1c743e5b689c2522b6aff` | 66,439,954 | +| `PyBLE-0.3.0-build-9-production-release.aab` | `bb041a9adcba7e84ece9800c418e69d7fa62274c2a170a929a37797a02784429` | 64,439,893 | +| `PyBLE-0.3.0-build-9-production-release.apk` | `92dd447ea9ee48ee00225825cbf89cb58807f3ba4d5f74d6e54d791874dd8979` | 66,456,338 | | Check | Actual result | |---|---| @@ -107,7 +107,7 @@ The 16 KiB runtime observation also force-stopped and relaunched the same installed package without data clearing. The normal disconnected screen returned without a fatal exception or native-library load error. The database created by the earlier `6f5b3ea` production candidate, subsequently reused by -`e54a78a`, and its WAL reopened with +`e54a78a` and `01a7ac8`, and its WAL reopened with `integrity_check=ok` and the expected `projects`, `project_files` and `settings` tables. This is a native packaging/startup smoke, not a physical BLE row or the full recovery acceptance matrix. The SQLite database's own page size is independent of the @@ -115,6 +115,11 @@ operating-system memory page size. The emulator uses Google APIs 16 KiB arm64 API 36 image revision 7; its fingerprint and private UI captures are recorded with the candidate manifest. +The first final smoke attempt stopped at the emulator-only ADB root request, +before package installation. Its failed attempt is retained. The completed +rerun verified the reconnected emulator identity and root user before the +installation and runtime checks; no physical-device settings were changed. + The first local invocation incorrectly used `--no-pub` after fresh `pub get`, leaving the integration-test plugin in a generated Android registrant. Its failed log is retained. Repeating the canonical CI production commands, @@ -126,15 +131,18 @@ but reused stale Gradle merged/stripped native libraries. Comparing packaged `libapp.so` against current build inputs exposed the mismatch; those artifacts were rejected and retained under `rejected-stale-gradle-e54a78a/`. Running `flutter clean` and both canonical production commands resolved that mismatch. -The final native-keyboard repair used another clean build; its packaged AOT +The native-dismissal and subsequent iPad palette-geometry repairs each used a clean build; its packaged AOT libraries match current stripped outputs and the AAB on all three ABIs. The `6f5b3ea` artifacts under `artifacts-6f5b3ea/` and pre-native-fix `e54a78a` -artifacts under `candidate-e54a78a/` remain historical evidence. +artifacts under `candidate-e54a78a/`, and pre-guide `01a7ac8` artifacts under +`candidate-01a7ac8/` remain historical evidence. The latter package is superseded +by the iPad reachability defect described below. -The first final-candidate build encountered an OpenJDK 17 AArch64 JIT internal +The earlier `01a7ac8` build encountered an OpenJDK 17 AArch64 JIT internal error in a long-lived Gradle daemon. Its failed log and crash receipt are kept under `failed-jvm-01a7ac8/`. A fresh-daemon clean retry built the recorded APK, -AAB and IPA without a source change; all artifact checks were repeated. +AAB and IPA without a source change; all artifact checks were repeated. The +new `bef67bd` clean build completed without that failure. The APK uses the upload certificate, whereas Google Play can deliver its own app-signing certificate. Do not uninstall an existing user's Play app or clear @@ -145,8 +153,8 @@ must use the actual delivered package. | Field / check | Actual result | |---|---| -| IPA | `PyBLE-0.3.0-build-9-app-store.ipa`, 23,786,245 bytes | -| SHA-256 | `4a9de1114a6f4618672d8027b7fe3b754a7412e124e1f36282a6920cda1d5390` | +| IPA | `PyBLE-0.3.0-build-9-app-store.ipa`, 23,795,805 bytes | +| SHA-256 | `54552bbb0cadf5f33c0bebd4e869623ea17308cd73281680c986daa6509e2c3d` | | Identity | `dev.pyble.pyble`, `0.3.0 (9)`, normal `lib/main.dart` | | Build / deployment floor | Xcode 27.2 / iOS SDK 27.2; app and compiled deployment floor at least iOS 15.0 | | Export | App Store Connect distribution export; automatic signing with build-number management disabled; export destination only, no upload | @@ -186,9 +194,39 @@ a narrow current-window dismissal request on Android and iOS while retaining layout based on actual insets. The Android rerun observed IME visibility change from shown to hidden, an expanded console and retained field text. The iPad outcome remains part of its separate physical report. The production artifacts -above include this repair and remain bound to `01a7ac8`; the diagnostic controls +above include this repair and the later iPad geometry fallback; the diagnostic controls did not change the Blocks startup protocol. +## iPad keyboard palette regression + +On the native-dismissal candidate `01a7ac8`, opening the docked keyboard through +its input palette could leave console Expand underneath the keyboard and +unreachable. This affected both the Flutter Editor and native Blockly input; +it did not establish a failure of the dismissal handler, which could not be +invoked. A normal initial keyboard focus produced a correct 498-point inset. +After Hide → palette Show Keyboard, however, the local keyboard notifications +reported end frame `[0,1024,1366,498]`, outside the current 1366×1024 view, while +`UIKeyboardLayoutGuide` correctly reported `[0,526,1366,498]`. The engine +registrar, current view controller and window were all present. Ignored native +console/XCTest receipts preserve this measured mismatch. + +The final repair observes that current engine view's public layout guide and +uses the maximum of native overlap and Flutter's bottom inset. It preserves +real 70.5/81.5-point palette occlusion, treats a hidden safe-area-only guide as +zero, and restores ordinary safe-area padding. It does not add both insets or +change Flutter/Blockly upstream code. Generation checks, post-frame attachment, +background reset and explicit post-metrics snapshots avoid stale callbacks and +a measured-window-size race. The editor and Blocks host retain their identity. + +Signed red `4882049` and green `c6e685d` correspond to integrated red `bd36731` +and runtime `bef67bd`. The complete ordinary suite passes 984 tests; six guide +regressions cover the actual fallback, Blocks dismissal/host retention, +maximum/padding behavior, resize ordering, stale callbacks/lifecycle and the +unchanged Android path. Native iOS profile compilation and static/source gates +pass. Exact physical iPad palette reopening and reachable Expand/dismissal +remain acceptance observations in the [execution record](00_Execution_Record.md); +a production IPA export alone cannot substitute for them. + ## Distribution access and remaining account work The owner Android upload identity is locally usable and matches the historical diff --git a/docs/publication/app-0.3.0-build-9-release-packet.md b/docs/publication/app-0.3.0-build-9-release-packet.md index 0b6c543c..61d3a35b 100644 --- a/docs/publication/app-0.3.0-build-9-release-packet.md +++ b/docs/publication/app-0.3.0-build-9-release-packet.md @@ -27,7 +27,7 @@ Use a compatible, separately provisioned MicroPython board running the PyBLE age 2. Restore while disconnected. Recovery should preserve the text without connecting to or writing to a board. Cancel a Discard confirmation, then confirm Discard using only disposable content; check the next launch. 3. Deliberately connect to a board. Check the current destination and separate Save/Run effects before confirming. Cancel a confirmation and verify that no unwanted board action occurs. 4. Copy generated Python from Blocks into Editor, save its recovery copy, and restart. Only the generated text is covered; the Blocks workspace, graph revisions and companion files are not restored by this local slot. -5. Exercise New, Board Open, Files Upload, disconnect/reconnect, portrait/landscape, larger text, an external keyboard and VoiceOver where available. Report any lost text, stale destination, inaccessible control or inaccurate success message. +5. Exercise New, Board Open, Files Upload, disconnect/reconnect, portrait/landscape, larger text, an external keyboard and VoiceOver where available. On iPad, hide and reopen the docked keyboard through its input palette, then check that console Expand remains reachable and dismisses it. Report any lost text, stale destination, inaccessible control or inaccurate success message. There is one recovery slot and no draft history. Wait for Saved locally before expecting an edit to survive termination. Storage failure can leave current edits only in memory; follow the displayed guidance. App removal or clearing app storage removes local recovery data. A draft that existed only in memory in an older version cannot be recovered by upgrading. From e297bb9cea4d260fa5fa3233dc1c2c1da9bafbdd Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 19:36:58 +0700 Subject: [PATCH 18/31] [docs] record completed iPad recovery and board acceptance Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/04_iPad_Acceptance.md | 176 ++++++++++++------ 1 file changed, 124 insertions(+), 52 deletions(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md index 7dde3433..28ed1dd3 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md @@ -1,66 +1,138 @@ -# iPad recovery acceptance continuation +# iPad recovery and app compatibility acceptance | Field | Record | |---|---| | Date | 31 October 2026, Asia/Bangkok | -| Scope | Remaining normal-app recovery and affected workflow observations for PYB-006.2 / PYB-008.1 | -| Current outcome | Candidate installation and launch pass; automated native UI execution awaits the device owner's iPadOS authentication | -| Source | PR #40 merged at `6f5b3ea73a70342331fb49d0685938ce2a4cae11`; subsequent planning changes do not change app runtime bytes | +| Scope | Normal-app recovery and affected workflow observations for PYB-006.2 / PYB-008.1; app-only compatibility rows Q01/Q03/Q05/Q07/Q09 | +| Outcome | Exact offline restoration, current-board consent and normal Blocks-generated text recovery observed; final keyboard repair and all five app-only iPad board rows pass within the recorded scope below | +| Current runtime | `bef67bded9e5b83437e3eb0e2ec4be6a4cfd1a64`, app tree `60b3a68b693551af5d83076547c502f69838e052`; PR #41 | | Candidate | PyBLE Preview `0.3.0 (9)`, normal `lib/main.dart`, signed profile mode, isolated `dev.pyble.recoveryqualification` identity | -| Physical platform | iPad Air 13-inch (M4), model `iPad16,10`, iPadOS `26.6.2` | -| Operator | Automated engineering run on the maintainer's Mac; no independent human review or participant observation claimed | -| Prior results | [Platform observations](02_Platform_Qualification.md); native storage seed/kill/verify is distinct from normal-app interaction acceptance | - -## Candidate and initial state - -The signed app archive is retained privately as -`local/recovery-implementation/ipad-preview-0309/PyBLE-Preview-0.3.0-9-profile.app.zip`. -Its SHA-256 is -`c91bc6f7e14f421a528668bd3723e3f965d55f79f11ea90fec707a8fb15a4d1a`. -The copied Dart runtime matches merged source; only the isolated native identity -and display name distinguish the installation. Signature verification, -installation and foreground launch passed. The disconnected scan displayed all -five board labels. Discovery alone does not establish a connection or completed -board workflow. - -The existing TestFlight `dev.pyble.pyble` installation remains version -`0.2.0 (6)`. The Preview application support files were copied privately before -continuation. The copied SQLite database passes `integrity_check` and contains -zero draft rows and zero content bytes. No storage reset, user-data deletion or -board write was used to establish that initial state. - -## Native UI runner attempt - -| Step | Actual observation | +| Physical platform | iPad Air 13-inch (M4), model `iPad16,10`, iPadOS `26.6.2`, wired to the maintainer's Mac | +| Operator | Automated engineering run through native XCTest; no independent human review, participant observation or audible VoiceOver evaluation claimed | +| Prior results | [Platform observations](02_Platform_Qualification.md); storage seed/kill/verify is distinct from this normal-app interaction evidence | + +## Installed artifacts and continuity + +| Runtime | Private archive SHA-256 | Observations | +|---|---|---| +| Merged PR #40 `6f5b3ea` | `c91bc6f7e14f421a528668bd3723e3f965d55f79f11ea90fec707a8fb15a4d1a` | Initial installed identity and five-board discovery; superseded for layout qualification | +| Landscape repair `e54a78a` | `ddf611e85065db05c1622faef59c6eddc5b821dfd1a2702ec0cbb66d093e5a0b` | Unicode lifecycle/offline recovery, current-target consent, empty named draft and classic ESP32 workflow | +| Native dismissal `01a7ac8` | `3a2775d1648fe3a188b89f30912af0b7f771ec08b8c0e3b9f4d0c3d49d33510b` | Blocks-to-Editor recovery and C3 workflow; input-palette geometry defect reproduced | +| Native keyboard guide `bef67bd` | `7d39100283fb2cd9189d448881b788ad5eadfdf813a0e5f36ff9a2850fa6c471` | Clean profile build; exact Dart/AppDelegate source manifest matches the runtime; compiled guide channel present and diagnostic instrumentation absent | + +Archives, source manifests, native accessibility trees, screenshots and +`.xcresult` bundles are retained under ignored +`local/recovery-completion/ipad/`; the original baseline archive is under +`local/recovery-implementation/ipad-preview-0309/`. Only bundle/display identity +differs from the normal application. Signature verification and installation +pass. Installs reuse the same Preview container without clearing its data. + +The existing TestFlight `dev.pyble.pyble` installation remains `0.2.0 (6)`. +Preview acceptance does not establish a TestFlight-delivered upgrade. Before +these runs, a private backup of Preview application support passed SQLite +`integrity_check` and contained zero draft rows and zero content bytes. No +storage reset established that initial state. + +## Recovery observations + +The [operator recipe](01_Operator_Recipe.md) and +[normative evidence matrix](../../../specifications/App/current-draft-recovery.md#7-required-evidence-before-acceptance) +remain authoritative. A receipt marked partial below contributes only its +completed assertions; its later failure is retained separately. + +| Procedure | Actual result and receipt | +|---|---| +| P01/P04/P06: offline startup and Restore | `offline-restore-radio-target`: terminate the same app/container, explicitly verify Wi-Fi and Bluetooth off, relaunch, inspect exact filename/source, Restore into the disconnected local panel. No connection is required. Original radios restored | +| P02/P03: exact named checkpoint | `classic-unicode-checkpoint`: `/q0309i_e54a/recovery.py`, exact `# café λ` followed by `print(271828)`; native text-value assertion and **Saved locally** after manual checkpoint | +| P05: unresolved decision | Discard Cancel preserves the exact preview. In `classic-discard-loop`, backgrounding to Settings and returning preserves the unresolved recovery prompt | +| P07: editing/lifecycle | Real native typing and multiple acknowledged checkpoints survive process termination/relaunch. On final `bef67bd`, `settled-native-input` injects the complete `print(424242` batch after the full keyboard is visibly settled, obtains exact `print(424242)`, checkpoints and restores it after termination without a board write. Continuous-edit debounce behavior remains covered by automated tests; no unacknowledged final keystroke is promised durable | +| P08: explicit Discard | `classic-discard-loop` completes Cancel, confirmed Discard and terminate/relaunch assertions: the next launch shows Scan without a recovery prompt. Its later folder-tap failure does not erase these observations | +| P09: empty named draft | `classic-readback-empty`: deliberately created `empty.py` checkpoints and returns as a named empty recovery copy; distinct from an empty untitled slot | +| P10: actual Save/Run target | `classic-target-cancel`: both current destination `/recovery.py` and distinct write/write-and-run effects are shown; Cancel retains the draft. The board is deliberately connected after Restore | +| P11/P12: Files destination and completion | `classic-upload-run`: move to the owned folder, cancel Upload, confirm its actual folder/file target, then explicitly confirm Run and observe `271828` with Finished. Real clear/Open readback verifies the Unicode source. Session/epoch mutation races remain covered by automated tests | +| P13: replacement guards | `blocks-handoff-recovery` cancels Blocks handoff over Unicode before later confirming. `c3-replacement-finite` and its resume cancel Editor New and board Open over the meaningful generated draft; source remains exact | +| P14 / DR-T12: generated text | `blocks-handoff-recovery`: ordinary Hello example generates exact `print('Hello, PyBLE!')` plus trailing newline, guarded adoption into `blocks.py`, acknowledged checkpoint and actual process termination/relaunch recover that exact text. The next process's Blocks surface offers a new example; no workspace graph restoration is inferred | +| P15 / DR-T13 | Widget/localization/semantics and 2× text coverage is recorded in source validation. Physical native keyboard checks are below. Native XCTest accessibility labels/values are observed; this is not a claim of audible VoiceOver speech or a complete human gesture evaluation | + +The offline panel intentionally previews restored text before connection; the +normal Editor shell appears after an explicit board connection. An early final +candidate helper incorrectly expected an Editor text field while still on that +panel. The panel held the exact recovered text; the corrected connected check +passed. That selector error is not a restoration failure. + +## Keyboard defects and physical regression + +Three separately tested repairs address measured failures: landscape overflow, +native WebView keyboard dismissal, and the iPad input-palette transition. +In the last case UIKit reported an off-screen end frame after **Hide keyboard → +Keyboard → Show Keyboard**, while `keyboardLayoutGuide` reported the actual +498-point occlusion. Private logging established that mismatch; its instrumented +binary is excluded from acceptance and distribution. + +The final native guide observer supplies the missing geometry, and Flutter uses +the larger valid platform/native inset without summing them. A remaining input +palette is a real occlusion; hiding the full keyboard does not imply zero inset. +Ending editing returns to ordinary safe-area layout. + +| Final `bef67bd` receipt | Actual observation | |---|---| -| Build | Native XCTest helper builds successfully against the connected physical-device SDK; it operates the separately installed normal app | -| Runner startup | Signed helper starts on the iPad | -| OS authentication | iPadOS displays **Touch ID for “XCTest” — Enable UI Automation** | -| Result | Runner initialization times out after 60 seconds while enabling automation mode; the test body does not run | -| Classification | Operator-access dependency, not a failed PyBLE recovery assertion | -| Required action | Device owner authenticates the iPadOS prompt; retry the retained test and then execute the remaining workflow steps | +| `guide-editor-connected` | Existing exact generated checkpoint restores; C3 Ready; the normal Editor receives native focus | +| `guide-editor-palette` | Full keyboard shown, hidden and shown again through the native palette. Editor text-field height remains 218 points with the full keyboard; console Expand occupies y=478…526 above it. Expand is hittable, hides the actual native keyboard, restores the 555-point normal Editor viewport and preserves exact text. Screenshots and accessibility frames agree | +| `guide-blocks-palette` | Native Blocks field repeats Hide → Show Keyboard; Expand remains hittable, dismisses the keyboard, and retains exact `Hello, PyBLE!`. Cancel closes the field without changing its block; returning to Editor retains the exact generated text | + +The final source has 984 passing ordinary tests, including guide geometry, +observer lifecycle and stale-generation coverage. iOS profile compilation and +repository analysis/source gates pass. Automated coverage does not replace the +physical input-palette sequence above. -The owner was asked to authenticate on the device. No passcode or biometric -material was requested, captured or substituted. Raw screenshots and the -`.xcresult` remain in ignored `local/recovery-completion/ipad/`; they are not -public documentation assets. +## App-only board matrix -## Acceptance accounting +Immutable program verification identifies the selected firmware: classic ESP32 uses +published `c8f549ee`; S3, Waveshare S3, C3 and Pico use retained observer +`96497b9`. Exact component hashes and the source-impact assessment are in the +[execution record](00_Execution_Record.md) and +[release readiness](06_Release_Readiness.md). No firmware was reflashed for this +app qualification. Identical relevant runtime/build-driver source does not make +the two firmware artifacts byte-identical. -| Evidence | State after this attempt | +| Row | Physical profile / suffix | Installed app | Result / receipt | +|---|---|---|---| +| Q01 | `esp32-4mb` / 8C9E | `e54a78a` | Pass: ordinary discovery/Ready, named Unicode edit/save, stdout/Finished, tight-loop Run/Stop→Idle, exact clear/Open readback, disconnect/reconnect continuity and recovery/current-target cases. Receipts `classic-*`; helper failures retained below | +| Q03 | `esp32-s3-n16r8` / 5646 | `bef67bd` | Pass: ordinary Ready; owned finite source Save/Run→`424242`/Finished; tight-loop Run/Stop→Idle; true clear/Open exact readback of both files; disconnect/reconnect continuity; acknowledged `loop.py` checkpoint, terminate/relaunch and exact Restore. Receipts `matrix-5646*`; initial failed attempts retained | +| Q05 | `waveshare-esp32-s3-lcd-147b` / DA86 | `bef67bd` | Pass: all common finite-output/Stop/readback/reconnect checks and named checkpoint/relaunch/Restore in one `matrix-da86` run | +| Q07 | `esp32-c3-4mb` / C81A | `01a7ac8` | Pass: ordinary Ready, owned `blocks.py` upload/Hello stdout/Finished, genuine clear/Open readback, tight-loop and print-flood Stop→Idle, connection remains usable, reconnect continuity and subsequent bounded Hello run. `c3-replacement-finite-resume`, completed `c3-readback-stops` assertions, `c3-stop-flood-now`, `c3-final-matrix` | +| Q09 | `rpi-pico2-w` / 3DCB | `bef67bd` | Pass after retained initial disconnect: `matrix-3dcb-retry` completes finite-output/Stop, true clear/Open readback, reconnect continuity and exact named checkpoint/relaunch/Restore | + +Earlier rows retain their actual installed identities. Later native/layout +changes do not alter transport, storage or Stop behavior, but final keyboard +checks are separately required. These UI Stop observations establish neither a +fresh C3 firmware qualification nor a sub-500-ms wire-level timing result. + +## Retained failures and cleanup + +| Observation | Classification / disposition | |---|---| -| Installed normal candidate, version and signature | Pass, limited to the local Preview identity | -| Foreground launch and five-board discovery | Pass, disconnected discovery only | -| Native storage process termination/reopening | Prior passing seed/verify evidence retained in the platform report | -| DR-T12 normal Blocks-to-Editor checkpoint/relaunch | Not run in this continuation; native UI access pending | -| DR-T14 normal offline Restore and physical current-board consent | Not run in this continuation; native UI access pending | -| Remaining applicable P01–P15 steps | Execute and record actual outcomes after UI authorization; the prepared test is not execution evidence | -| Five-profile iPad release rows | Pending; no qualification inferred from the five scan results | -| M-02 / release admission | Remain pending until mandatory evidence and review are complete | +| XCTest Touch ID authorization timeout | Owner completed the prompt; normal-app native automation subsequently runs. Resolved operator-access dependency | +| Newly installed helper launch denied while offline | Developer-certificate verification occurred before the test body. Retry entered offline mode within one running helper, verified both radios and passed; original radios restored | +| Native helper folder/file selector and terminated-app screenshot errors | Corrected using observed controls and device-screen capture; exact retries retained. No passing result inferred from preparation | +| C3 flood stdout prefix assertion | Existing Hello output preceded flood output in the same console label. Stop immediately returned Idle; retry cleared the console first and passed the intended stdout/Stop/readback/reconnect/bounded-run checks | +| Rapid synthetic typing and initial file-row attempts on S3 | One batched XCTest `print(424242` input produced `print(24242)` and failed the exact oracle before Save. Waiting for the visible keyboard and observing automatic `print()` insertion before injecting digits produced exact text; this is a controlled retry, not a code fix. Source review found no digit-normalization rule; the suspected platform/controller feedback timing was not proven. A further final-candidate control injects the original whole batch after the keyboard is fully visible and settled and passes exact text plus checkpoint/relaunch/Restore (`settled-native-input`); the failure is not reproduced under that controlled focus condition. Two initial file-Open assertions also timed out; explicit retries obtained exact source after a genuine empty Editor, and their failures remain retained | +| Early typing before async New-file GET completed | The editor epoch guard retained the newly typed buffer; no stale GET replaced it. A disposable classic `/untitled.py` was consequently written by the explicit Save/Run; this exact owned file was backed up and removed during coordinated cleanup | +| Initial Pico connection | Reached Ready, then disconnected before folder creation. A continuation incorrectly assumed the old connected layout and selected the Waveshare scan row; its Name-field assertion failed before any write. Waveshare cleanup had already finished. The corrected retry explicitly disconnected, rescanned, checked Pico Ready and passed the complete row; no firmware or transport fix is claimed | +| iPad input-palette geometry | Product defect reproduced with measured native frames; final repair and physical results above | -The [operator recipe](01_Operator_Recipe.md) and -[normative scenario matrix](../../../specifications/App/current-draft-recovery.md#7-required-evidence-before-acceptance) -remain the acceptance authority. This record does not change their requirements. +Only disposable qualification files/folders are written. The classic fixtures +and their CRC-verified backups/cleanup are recorded with the +[Android continuation](05_Android_Acceptance.md); pre-existing root entries are +preserved. The S3, Waveshare and Pico follow-up fixtures have likewise been CRC-verified, +backed up and removed with unrelated root entries unchanged. C3 fixtures remain +tracked privately for cleanup after the final Android continuation. Raw captures, binaries, database backups and helper +sources remain ignored. No user project or original store installation is reset. + +This report establishes only its recorded observations. Final admission, +production package identity and channel delivery are tracked in +[release readiness](06_Release_Readiness.md); independent pilot and Ready-program +obligations remain separate. From ef19773082deb033f9790546318ba413f4aa7984 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 19:43:57 +0700 Subject: [PATCH 19/31] [docs] clarify Android Blockly asset loading semantics Signed-off-by: Viwat Vchirawongkwin --- app/lib/blocks/blockly_webview.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/lib/blocks/blockly_webview.dart b/app/lib/blocks/blockly_webview.dart index 8fbb3c6e..15a709c6 100644 --- a/app/lib/blocks/blockly_webview.dart +++ b/app/lib/blocks/blockly_webview.dart @@ -31,10 +31,10 @@ const Duration _firstSnapshotTimeout = Duration(seconds: 15); /// Loads the sealed host through the platform path that can read its relative /// bundled resources. /// -/// Android's high-target-SDK WebView defaults file access off. Its public -/// [WebViewController.loadFile] adapter enables that setting before loading -/// the exact `/android_asset` document; `loadFlutterAsset` does not. WKWebView -/// continues to resolve the ordinary Flutter asset path directly. +/// Android loads the exact `/android_asset` document through +/// [WebViewController.loadFile]. The adapter requests file access concurrently +/// with navigation; Android asset URLs are exempt from that general filesystem +/// setting. WKWebView resolves the ordinary Flutter asset path directly. @visibleForTesting Future loadBlocklyAssetForPlatform({ required TargetPlatform platform, From 3b9afac001fe68bbc3b7e142ae4f7b4eb1e938f0 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 19:50:17 +0700 Subject: [PATCH 20/31] [docs] record iPad automation helper cleanup Signed-off-by: Viwat Vchirawongkwin --- .../2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md index 28ed1dd3..ffec5781 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md @@ -130,7 +130,9 @@ and their CRC-verified backups/cleanup are recorded with the preserved. The S3, Waveshare and Pico follow-up fixtures have likewise been CRC-verified, backed up and removed with unrelated root entries unchanged. C3 fixtures remain tracked privately for cleanup after the final Android continuation. Raw captures, binaries, database backups and helper -sources remain ignored. No user project or original store installation is reset. +sources remain ignored. The task-created XCTest runner was uninstalled after +the completed iPad checks; Preview and both pre-existing PyBLE installations +were preserved. No user project or original store installation is reset. This report establishes only its recorded observations. Final admission, production package identity and channel delivery are tracked in From fc904d0a24f260bf3aa99e377e0efa93b59aa02b Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 19:49:26 +0700 Subject: [PATCH 21/31] [docs] reconcile physical acceptance and remaining release gates Signed-off-by: Viwat Vchirawongkwin --- CHANGELOG.md | 6 + README.md | 2 + docs/ROADMAP.md | 2 +- .../01_Overview_and_Scrum_Framework.md | 8 +- .../02_Product_Roadmap.md | 4 +- .../03_Milestones.md | 10 +- .../04_Sprint_Plan.md | 4 +- .../05_Product_Backlog_and_Stories.md | 10 +- .../06_Sprint_Backlogs.md | 8 +- .../05_TestFlight_Metadata_Correction.md | 19 ++- .../c1-s2/00_Execution_Record.md | 134 ++++++++++++++++-- .../c1-s2/01_Operator_Recipe.md | 13 ++ .../c1-s2/02_Platform_Qualification.md | 23 ++- ...E_Implementation_Plan_and_Strategy_v1.0.md | 9 +- .../android-open-testing-2026-09-25.md | 17 ++- 15 files changed, 223 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 765565d1..b99ddf21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,12 @@ and build-8 submission handoffs remain historical artifact records. offers offline preview, Restore and confirmed Discard, with separate local checkpoint status and an explicit Save recovery copy action. Storage errors preserve the previous copy and live text, with explicit volatile continuation. +- Fixed landscape editing with the software keyboard open: the console output + strip temporarily collapses to its status/actions bar, and navigation + destinations remain reachable by scrolling. Expanding requests keyboard + dismissal from the current platform window, including native Blocks fields. + iPad layout also accounts for keyboards reopened through the keyboard palette + without applying the same overlap twice; document/console state is retained. - Added document-epoch and connection-session guards for Editor Save/Run, Files Open/Upload and Blocks-to-Editor replacement. Restored drafts require current-destination confirmation before board writes; a board swap after text diff --git a/README.md b/README.md index 3668b45a..6716cd10 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,8 @@ copies. See the [candidate execution record](docs/developments/2026-q4-reliable- for passing automated checks and candidate-specific device evidence. Local Android and iPad Preview installations are engineering candidates; their installation does not establish store availability or release qualification. +The [release readiness record](docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md) +tracks signed-artifact preparation, qualification and the channel handoff. ### Firmware diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 4e17f19b..d8fe5367 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -44,7 +44,7 @@ v0.7.0 remains non-normative and requires separate maintainer approval. 45–72 hour estimate remains a forecast, not measured effort. - Correct the [stale public TestFlight description](developments/2026-q4-reliable-workflow/c1-s1/05_TestFlight_Metadata_Correction.md) through the distribution owner; replacement copy is prepared, not published. -- Complete release qualification and channel delivery for merged app `0.3.0+9`, +- Complete [release qualification and channel delivery](developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md) for merged app `0.3.0+9`, retaining the recorded 0.2.0 channel baseline until the new channel is verified. The [Android publication review](testing/website/android-open-testing-2026-09-25.md) records live open-testing availability. The diff --git a/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md b/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md index 72954d9f..337739a8 100644 --- a/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md +++ b/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md @@ -9,7 +9,7 @@ |---|---| | Package | PyBLE 2026 Q4 reliable workflow, Cycle 1 (`C1`) | | Prepared | 25 September 2026; Asia/Bangkok | -| Strategy | [Implementation Plan, revision 1.4](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md) | +| Strategy | [Implementation Plan, revision 1.7](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md) | | Repository baseline | `23ed764b0ef88dce9720c66fbd1c0655268860cf` | | Proposed cycle | 28 September–20 December 2026; six two-week Sprints | | Status | C1-S1 device retry on 25 September: six tasks Done, two Prepared and four Awaiting evidence; both current channel installations verified, pilot work unfinished. Later Sprints require replanning against new sizing; no staffed-team ceremony is inferred | @@ -18,7 +18,7 @@ This package derives execution views from the strategy. It does not replace normative specifications, expand hardware claims, create GitHub issues, or authorize store/website publication. The strategy and original package were recorded together in planning baseline `d039db0`. The [C1-S1 execution record](c1-s1/00_Execution_Record.md) owns actual results and blockers. -**31 October continuation update:** bounded recovery candidate `0.3.0+9` is merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) at `6f5b3ea`; the integrated suite and post-merge CI pass. Both tablets have local candidate installations and native storage restart evidence. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) tracks the remaining physical acceptance separately from release qualification. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the planning baseline; the current continuation order and unresolved capacity inputs are recorded in the [Sprint plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast). +**31 October continuation update:** the `0.3.0+9` recovery baseline merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40). Physical qualification exposed three keyboard defects; their repairs at `bef67bd` pass 984 ordinary tests and all 36 PR #41 checks. iPad recovery, final keyboard regressions and all five iPad app-only board rows pass with declared source/firmware scope. Earlier Android recovery and board rows pass, but a later final-candidate Blocks startup observation remains under investigation. Signed packages and a channel packet are prepared; admission and actual store delivery remain separate. The [C1-S2 record](c1-s2/00_Execution_Record.md) binds the evidence. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records unresolved capacity inputs. ## Navigation and ownership of information @@ -35,7 +35,7 @@ This package derives execution views from the strategy. It does not replace norm ```mermaid flowchart LR - Strategy["Strategy revision 1.6"] --> Goal["One Product Goal"] + Strategy["Strategy revision 1.7"] --> Goal["One Product Goal"] Goal --> Roadmap["Outcome roadmap and milestones"] Roadmap --> Product["Ordered Product Backlog"] Product --> Planning["Sprint Planning"] @@ -140,7 +140,7 @@ When facts or priority change, update the canonical file above and its dependent | Source | Use and precedence | |---|---| -| [Strategy revision 1.6](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md) | Scope, targets, six-Sprint capacity, three outcomes, Ready program and conditional horizons | +| [Strategy revision 1.7](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md) | Scope, targets, six-Sprint capacity, three outcomes, Ready program and conditional horizons | | [Public roadmap](../../ROADMAP.md), [README](../../../README.md) | Current capability and distribution baseline | | [App specification](../../specifications/App/specs.md), [App TDD](../../specifications/App/TDD.md), [ADR-0010](../../decisions/0010-working-loop-in-memory-document.md) | Persistence contract and recorded implementation deviation; consult frozen working-loop scope | | [Firmware roadmap](../../planning/firmware-v0.6.1-v0.7.0-roadmap.md), [PBLE/1](../../specifications/protocol.md) | v0.7 proposals versus frozen wire behavior; old v0.6.1 publication/#24 wording is historical | diff --git a/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md b/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md index 3c7ffe74..44e6091f 100644 --- a/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md +++ b/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md @@ -7,13 +7,13 @@ |---|---| | Status | C1-S1 has six tasks Done, two Prepared awaiting pilot setup and four Awaiting evidence; existing channel installations verified. Future direction remains conditional and forecasts need revision after sizing | | Planning date | 25 September 2026; dates use Asia/Bangkok | -| Source | [Implementation strategy revision 1.6](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), particularly §§1, 6–9, 12, 14, and 19 | +| Source | [Implementation strategy revision 1.7](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), particularly §§1, 6–9, 12, 14, and 19 | | Inspected baseline | `main` at `23ed764b0ef88dce9720c66fbd1c0655268860cf` | | First cycle | C1: 28 September–20 December 2026; later horizons conditional through September 2028 | | Planning authority | Product Owner orders the Product Backlog; Developers forecast feasible work during Sprint Planning; names and capacity remain unassigned | | Related documents | [Framework](01_Overview_and_Scrum_Framework.md), [milestones](03_Milestones.md), [Sprint Plan](04_Sprint_Plan.md), [stories](05_Product_Backlog_and_Stories.md), [Sprint Backlogs](06_Sprint_Backlogs.md) | -**31 October continuation update:** bounded recovery candidate `0.3.0+9` is merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) at `6f5b3ea`; the integrated suite and post-merge CI pass. Both tablets have local candidate installations and native storage restart evidence. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) tracks the remaining physical acceptance separately from release qualification. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the planning baseline; the current continuation order and unresolved capacity inputs are recorded in the [Sprint plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast). +**31 October continuation update:** the `0.3.0+9` recovery baseline merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40). Physical qualification exposed three keyboard defects; their repairs at `bef67bd` pass 984 ordinary tests and all 36 PR #41 checks. iPad recovery, final keyboard regressions and all five iPad app-only board rows pass with declared source/firmware scope. Earlier Android recovery and board rows pass, but a later final-candidate Blocks startup observation remains under investigation. Signed packages and a channel packet are prepared; admission and actual store delivery remain separate. The [C1-S2 record](c1-s2/00_Execution_Record.md) binds the evidence. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records unresolved capacity inputs. ## Product Goal and decision principle diff --git a/docs/developments/2026-q4-reliable-workflow/03_Milestones.md b/docs/developments/2026-q4-reliable-workflow/03_Milestones.md index ab96b747..6e6c1951 100644 --- a/docs/developments/2026-q4-reliable-workflow/03_Milestones.md +++ b/docs/developments/2026-q4-reliable-workflow/03_Milestones.md @@ -5,14 +5,14 @@ | Control | Value | |---|---| -| Status | M-01/SG0 remains Blocked on 25 September by pilot ownership/cohort/setup and capacity decisions; existing channel installations verified on retry. M-02 is in progress in the 31 October candidate with acceptance pending; other milestones remain Proposed and forecast windows need replanning | +| Status | M-01/SG0 remains Blocked on 25 September by pilot ownership/cohort/setup and capacity decisions; existing channel installations verified on retry. M-02 is in progress in the 31 October candidate with acceptance pending; M-04/M-05 artifact and distribution preparation is underway, with admission and channel delivery still pending; forecast windows need replanning | | Planning date | 25 September 2026; dates use Asia/Bangkok | -| Source | [Implementation strategy revision 1.6](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), especially §§4, 8–10, 14, and 19 | +| Source | [Implementation strategy revision 1.7](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), especially §§4, 8–10, 14, and 19 | | Inspected baseline | `main` at `23ed764b0ef88dce9720c66fbd1c0655268860cf` | | Related documents | [Framework](01_Overview_and_Scrum_Framework.md), [roadmap](02_Product_Roadmap.md), [Sprint Plan](04_Sprint_Plan.md), [stories](05_Product_Backlog_and_Stories.md), [Sprint Backlogs](06_Sprint_Backlogs.md) | | Meaning | Milestones describe inspectable outcomes and decision evidence; they are not additional Scrum events or promised releases | -**31 October continuation update:** bounded recovery candidate `0.3.0+9` is merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) at `6f5b3ea`; the integrated suite and post-merge CI pass. Both tablets have local candidate installations and native storage restart evidence. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) tracks the remaining physical acceptance separately from release qualification. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the planning baseline; the current continuation order and unresolved capacity inputs are recorded in the [Sprint plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast). +**31 October continuation update:** the `0.3.0+9` recovery baseline merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40). Physical qualification exposed three keyboard defects; their repairs at `bef67bd` pass 984 ordinary tests and all 36 PR #41 checks. iPad recovery, final keyboard regressions and all five iPad app-only board rows pass with declared source/firmware scope. Earlier Android recovery and board rows pass, but a later final-candidate Blocks startup observation remains under investigation. Signed packages and a channel packet are prepared; admission and actual store delivery remain separate. The [C1-S2 record](c1-s2/00_Execution_Record.md) binds the evidence. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records unresolved capacity inputs. ## Assessment and evidence states @@ -49,8 +49,8 @@ no role in this table implies committed staffing or independent review. | M-01 — Blocked (25 Sep) | Accepted baseline and bounded cycle scope make installation, pilot, and engineering decisions reproducible | C1-S1, 28 Sep–11 Oct; PYB-001/003/004, residual 002, sizing 006/009 | Dated channel/install/source mapping or explicit owned unknowns; one primary cohort/job; safe task/consent rules; initial observations or recruitment blocker; actual capacity; persistence and physical-matrix estimates | SG0: accept a bounded scope or record gaps; Product Owner with release, pilot, and Developers | | M-02 — In progress; acceptance pending | A usable, bounded local-draft recovery increment protects accepted user work after interruption | C1-S2–C1-S3, 12 Oct–8 Nov; selected PYB-006 scope, supporting 009/008, observed 005 only if selected | Accepted App specification/TDD and ADR-0010 change; text/Blocks scope; persistence boundary; relaunch, interrupted-write, and corrupt-state scenarios; no implicit board overwrite/run; relevant regression and physical evidence | Review against the selected story acceptance criteria and Definition of Done; Developers with a named review path | | M-03 — Proposed | Observed first-use and meaningful second-task evidence explains activation and its largest obstacle | C1-S4, 9–22 Nov; PYB-004/011 and justified 005/012 | Safe recorded pilot setup; at least 12 eligible primary-cohort task starts, all outcomes retained; successful unassisted timing; Task C attempts, prior workflow, assistance and reasons | SG2: assess provisional completion/timing targets and severe failures; pilot lead supplies evidence, Product Owner records next investment | -| M-04 — Proposed | A frozen maintenance candidate is qualified for its declared release scope | Normally C1-S5, 23 Nov–6 Dec; PYB-008/009/013 and included fixes | Applicable exact-artifact matrix and normative gates pass; provenance/recovery/instructions; no unresolved release-blocking data-loss, unintended/cross-session write, or critical workflow regression within the accepted threat model | SG1: release or submission decision with required sign-off; release owner and QA/review path | -| M-05 — Proposed | Users can obtain the selected qualified app build through a verified existing channel | C1-S5–C1-S6, 23 Nov–20 Dec; PYB-014 and residual 002 | M-04; distribution-owner access; separate submission, availability, installed build/provenance, and installation outcome records; current user-facing claims | Verified-channel milestone passes only for the stated evidence; store delays are recorded as blockers; release owner | +| M-04 — In progress; admission pending | A frozen maintenance candidate is qualified for its declared release scope | Normally C1-S5, 23 Nov–6 Dec; PYB-008/009/013 and included fixes | Applicable exact-artifact matrix and normative gates pass; provenance/recovery/instructions; no unresolved release-blocking data-loss, unintended/cross-session write, or critical workflow regression within the accepted threat model | SG1: release or submission decision with required sign-off; release owner and QA/review path | +| M-05 — Preparation in progress; delivery pending | Users can obtain the selected qualified app build through a verified existing channel | C1-S5–C1-S6, 23 Nov–20 Dec; PYB-014 and residual 002 | M-04; distribution-owner access; separate submission, availability, installed build/provenance, and installation outcome records; current user-facing claims | Verified-channel milestone passes only for the stated evidence; store delays are recorded as blockers; release owner | | M-06 — Proposed | Useful-repeat and support evidence drives one explicit next-stage investment | C1-S6, 7–20 Dec; PYB-011 follow-up, cycle review; Ready inputs only if selected | Mature consented cohort accounting, useful Task C/return outcomes, task opportunity, prompting, missing responses, support burden, and status of candidate/channel evidence; retain blocked outcomes | SG3 assessment plus dated continue/narrow/pause-expansion decision; Product Owner with pilot and Developers | [C1-S1 evidence](c1-s1/00_Execution_Record.md) includes the ledger, pilot protocol, recovery contract, cost model and verified existing Play/TestFlight installations. Six tasks are Done, two are Prepared awaiting pilot setup and four await participant/observation evidence. Human ownership, cohort/setup and actual capacity remain unconfirmed, so M-01/SG0 remains blocked. Missing participants are recorded as a recruitment gap, not completed observations. Current-build verification does not pass M-05 for a future qualified update. M-02's S2–S3 window is the original baseline; a sized S2–S4 option now requires explicit replanning, with downstream matrix/recruitment dates reviewed together. diff --git a/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md b/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md index 3778fbb0..059b6c58 100644 --- a/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md +++ b/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md @@ -7,12 +7,12 @@ |---|---| | Status | C1-S1 remains partial; bounded S2 candidate merged 31 October with physical acceptance pending. Original S2–S6 dates/hours remain baseline forecasts requiring capacity reconciliation | | Cycle | `C1`, 28 September–20 December 2026, Asia/Bangkok | -| Basis | [Strategy revision 1.6, §8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md#8-twelve-week-implementation-schedule) | +| Basis | [Strategy revision 1.7, §8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md#8-twelve-week-implementation-schedule) | | Product Goal and quality rules | [Working agreement](01_Overview_and_Scrum_Framework.md) | | Acceptance criteria | [Product backlog and stories](05_Product_Backlog_and_Stories.md) | | Task-level proposal | [Sprint backlogs](06_Sprint_Backlogs.md) | -**31 October continuation update:** bounded recovery candidate `0.3.0+9` is merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) at `6f5b3ea`; the integrated suite and post-merge CI pass. Both tablets have local candidate installations and native storage restart evidence. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) tracks the remaining physical acceptance separately from release qualification. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the planning baseline; the current continuation order and unresolved capacity inputs are recorded in the [Sprint plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast). +**31 October continuation update:** the `0.3.0+9` recovery baseline merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40). Physical qualification exposed three keyboard defects; their repairs at `bef67bd` pass 984 ordinary tests and all 36 PR #41 checks. iPad recovery, final keyboard regressions and all five iPad app-only board rows pass with declared source/firmware scope. Earlier Android recovery and board rows pass, but a later final-candidate Blocks startup observation remains under investigation. Signed packages and a channel packet are prepared; admission and actual store delivery remain separate. The [C1-S2 record](c1-s2/00_Execution_Record.md) binds the evidence. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records unresolved capacity inputs. ## Forecast and commitment boundary diff --git a/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md b/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md index 9fa97fb7..0edd695a 100644 --- a/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md +++ b/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md @@ -6,14 +6,14 @@ | Control | Value | |---|---| | Product Goal | Make the existing tablet workflow trustworthy enough for useful repeat tasks by the selected primary audience | -| Source | [Implementation strategy revision 1.6](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), reviewed 25 September 2026 | +| Source | [Implementation strategy revision 1.7](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), initially derived 25 September; reconciled 31 October 2026 | | Cycle | Proposed 28 September–20 December 2026; Asia/Bangkok | | Baseline | `23ed764b0ef88dce9720c66fbd1c0655268860cf`; completed publication work is evidence, not a new commitment | | Status | C1-S1: PYB-001.1/.2 and PYB-006.1 scoped work Done; pilot preparation awaits setup, observation work awaits evidence, PYB-009.1 partial; PYB-006.2 source merged and automated checks passing; physical acceptance pending; later work remains forecast | | Accountabilities | Product Owner orders the backlog; Developers size and select work in Sprint Planning; named people and capacity remain to be assigned | | Navigation | [Overview and Scrum](01_Overview_and_Scrum_Framework.md) · [Roadmap](02_Product_Roadmap.md) · [Milestones](03_Milestones.md) · [Sprint plan](04_Sprint_Plan.md) · [Sprint Backlogs](06_Sprint_Backlogs.md) | -**31 October continuation update:** bounded recovery candidate `0.3.0+9` is merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) at `6f5b3ea`; the integrated suite and post-merge CI pass. Both tablets have local candidate installations and native storage restart evidence. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) tracks the remaining physical acceptance separately from release qualification. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the planning baseline; the current continuation order and unresolved capacity inputs are recorded in the [Sprint plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast). +**31 October continuation update:** the `0.3.0+9` recovery baseline merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40). Physical qualification exposed three keyboard defects; their repairs at `bef67bd` pass 984 ordinary tests and all 36 PR #41 checks. iPad recovery, final keyboard regressions and all five iPad app-only board rows pass with declared source/firmware scope. Earlier Android recovery and board rows pass, but a later final-candidate Blocks startup observation remains under investigation. Signed packages and a channel packet are prepared; admission and actual store delivery remain separate. The [C1-S2 record](c1-s2/00_Execution_Record.md) binds the evidence. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records unresolved capacity inputs. ## 1. How to use this backlog @@ -41,11 +41,11 @@ | 4 | PYB-006 / P0 | Recover the current text draft after process restart | 006.1, 006.2 | Sized in C1-S1; S2–S4 working option requires replanning; known defect does not wait for recruitment | 006.1 Done; 006.2 source merged, automated checks passing, physical acceptance pending | | 5 | PYB-009 / P0 | Make existing validation reproducible by an operator | 009.1; optional 009.2 | Inventory C1-S1, scoped recipe C1-S2; reproduction only with assigned capacity | T12 Done; 009.1 remains partial | | 6 | PYB-005 / P0 if observed | Remove a demonstrated first-use blocker | 005.1 | C1-S2 candidate; actual 004 findings | Conditional; no defect invented | -| 7 | PYB-008 / P0 for claims | Establish the exact candidate's applicable compatibility evidence | 008.1, 008.2 | Representative checks C1-S2; staged matrix C1-S3–S5; 001, 009.1, artifacts | Proposed; hardware and mandatory workload must be costed | +| 7 | PYB-008 / P0 for claims | Establish the exact candidate's applicable compatibility evidence | 008.1, 008.2 | Representative checks C1-S2; staged matrix C1-S3–S5; 001, 009.1, artifacts | 008.1 representative observations in progress; 008.2 complete affected app matrix and release review remain pending | | 8 | PYB-011 / P0 usability | Understand useful first and repeat tasks in the primary cohort | 011.1, 011.2 | Main activation collection C1-S3–S4; rolling follow-up from the first consented activation through C1-S6; 003, 004, recorded tested setup | Proposed; recruitment and follow-up are not assumed | | 9 | PYB-012 / P0 if severe | Resolve the highest-impact observed failure | 012.1 | C1-S4 candidate or earlier when evidence warrants | Conditional; reorder promptly when a real severe failure appears | -| 10 | PYB-013 / P0 release | Make a candidate-specific release decision with applicable evidence | 013.1 | C1-S5 forecast; applicable 008/009 and included fixes | Proposed; maintenance candidates may qualify earlier | -| 11 | PYB-014 / P0 when ready | Make the qualified app build installable through the selected existing channel | 014.1, 014.2 | C1-S5 submission/C1-S6 verification forecast; 013 and owner access | Proposed; external review may extend calendar | +| 10 | PYB-013 / P0 release | Make a candidate-specific release decision with applicable evidence | 013.1 | C1-S5 forecast; applicable 008/009 and included fixes | In progress: production artifacts and release packet prepared; candidate-specific qualification and admission pending | +| 11 | PYB-014 / P0 when ready | Make the qualified app build installable through the selected existing channel | 014.1, 014.2 | C1-S5 submission/C1-S6 verification forecast; 013 and owner access | Preparation in progress; store-account build history, upload, processing and installed-channel verification remain pending | | 12 | PYB-007 / P1 | Share a previewed, privacy-preserving support record | 007.1 | Optional capacity; 003 and approved export contract | Proposed; manual template is the base fallback | | 13 | PYB-010 / P1 | Read accurate setup and recovery guidance in Simplified Chinese | 010.1 | Optional capacity and named language reviewer | Proposed | | 14 | PYB-015 / P1 | Discover the verified release through accurate supporting material | 015.1 | C1-S6 optional; verified claims, 002/013 | Proposed | diff --git a/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md b/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md index a2eba5bb..48e385d3 100644 --- a/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md +++ b/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md @@ -20,7 +20,7 @@ The initial tasks are small planning units, generally 1–4 hours. If a task or Record optional follow-up consent and the prospective day-7–14 window at each activation. Collect follow-up as windows arrive, starting with the first cohort; do not postpone early cohorts until S5. S1 observation allowances include any follow-up due within S1; S2-T11, S3-T10 and later follow-up rows continue it. Developers must reallocate headroom or other selected work if actual pilot effort exceeds these allowances, preserving required recovery review and tests. Record missed windows as missing/late evidence rather than reconstructing an on-time response. -**31 October continuation update:** bounded recovery candidate `0.3.0+9` is merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) at `6f5b3ea`; the integrated suite and post-merge CI pass. Both tablets have local candidate installations and native storage restart evidence. [C1-S2 implementation record](c1-s2/00_Execution_Record.md) tracks the remaining physical acceptance separately from release qualification. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the planning baseline; the current continuation order and unresolved capacity inputs are recorded in the [Sprint plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast). +**31 October continuation update:** the `0.3.0+9` recovery baseline merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40). Physical qualification exposed three keyboard defects; their repairs at `bef67bd` pass 984 ordinary tests and all 36 PR #41 checks. iPad recovery, final keyboard regressions and all five iPad app-only board rows pass with declared source/firmware scope. Earlier Android recovery and board rows pass, but a later final-candidate Blocks startup observation remains under investigation. Signed packages and a channel packet are prepared; admission and actual store delivery remain separate. The [C1-S2 record](c1-s2/00_Execution_Record.md) binds the evidence. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records unresolved capacity inputs. ## C1-S1 — reproduce the current workflow and size recovery @@ -70,9 +70,9 @@ Five baseline starts is a target, not the implied result of reserving six hours. | C1-S2-T04 | PYB-006.2 | Implement the minimal accepted durable storage/migration behavior until relevant tests pass | T02/T03 red evidence | App | 4 | Implemented — candidate storage; acceptance pending | | C1-S2-T05 | PYB-006.2 | Implement hydration and specified recovery/discard behavior through existing providers | T04 and accepted UI contract | App | 4 | Implemented — candidate coordinator/UI; acceptance pending | | C1-S2-T06 | PYB-006.2 | Complete non-destructive error handling, truthful scope and localized recovery guidance | T04/T05 | App | 2 | Implemented — candidate guidance/errors; acceptance pending | -| C1-S2-T07 | PYB-006.2 | Run affected controller/widget/lifecycle regressions and repository gates; resolve scoped failures | T04–T06 | App + QA | 2 | Implemented and checked — 972 tests and pinned CI gates pass | -| C1-S2-T08 | PYB-008.1 | Run representative Android restart/interruption scenarios on the recorded candidate; retain actual results | T01/T07; device/candidate | QA | 2 | In progress — native restart and normal recovery/board consent observed; remaining applicable scenarios pending | -| C1-S2-T09 | PYB-008.1 | Run representative iPad restart/interruption scenarios on the recorded candidate; retain actual results | T01/T07; device/candidate | QA | 2 | In progress — native restart and normal-app launch observed; remaining applicable scenarios pending | +| C1-S2-T07 | PYB-006.2 | Run affected controller/widget/lifecycle regressions and repository gates; resolve scoped failures | T04–T06 | App + QA | 2 | Implemented and checked — 984 guide-correction ordinary tests; all 36 PR #41 checks pass at `bef67bd`, including pinned goldens/native WebView | +| C1-S2-T08 | PYB-008.1 | Run representative Android restart/interruption scenarios on the recorded candidate; retain actual results | T01/T07; device/candidate | QA | 2 | Earlier Android continuation recorded — five Q rows pass on stated sources; final-candidate Blocks startup failure under investigation | +| C1-S2-T09 | PYB-008.1 | Run representative iPad restart/interruption scenarios on the recorded candidate; retain actual results | T01/T07; device/candidate | QA | 2 | Physical execution complete — offline Restore, target consent, generated-text, final palette regression and all five iPad Q rows pass with recorded source limits; integrated review pending | | C1-S2-T10 | PYB-006.2 | Review integration/evidence and update user guidance plus carried A-24/Blocks limitations | T07–T09 and all applicable acceptance | App + reviewer | 1 | In progress — integration review and evidence reconciliation | | C1-S2-T11 | PYB-011.2 | Collect due consented follow-up and account for early windows, missing responses and task opportunity | 004 prospective method; actual activation dates | Pilot | 1 | Awaiting participant evidence — no activation dates supplied | | **C1-S2 total** | | | | | **24** | | diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s1/05_TestFlight_Metadata_Correction.md b/docs/developments/2026-q4-reliable-workflow/c1-s1/05_TestFlight_Metadata_Correction.md index 27b94a94..4ff0981a 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s1/05_TestFlight_Metadata_Correction.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s1/05_TestFlight_Metadata_Correction.md @@ -15,7 +15,7 @@ The live public invitation's description still presents the older ESP-family/age The later device retry establishes that the observed native TestFlight offer and installed beta are `0.2.0 (6)`, with a successful launch and TestFlight signing origin. Its source/archive mapping remains unknown. Installed metadata reports `MinimumOSVersion = 18.0` while the build notes describe an iOS/iPadOS 15 rebuild; reconcile that difference with archive and store eligibility before publishing an older-OS support claim. This discovery does not change the public description or the historical build-5 handoff. -## Prepared Beta App Description +## Prepared Beta App Description for the recorded 0.2.0 channel baseline The following is app-level copy for review against the actual offered build. It is not a build-specific “What to Test” entry and does not announce a new binary, production release or completed compatibility matrix. @@ -42,3 +42,20 @@ PyBLE is MIT-licensed and developed in public at https://github.com/PyBLE-dev/Py | Close PYB-002.1 | Both the actual metadata update and public verification must be evidenced; preparing this packet alone does not complete the correction | This residual task does not block preparation of the persistence contract or otherwise qualified maintenance work. No paid feature, app allowlist, new protocol behavior or PyBLE Ready claim is introduced. + +## 31 October 2026 public-page recheck + +A fresh HTTPS GET of the [public TestFlight invitation](https://testflight.apple.com/join/yU4e8s6d) +at 11:46 UTC returned HTTP 200 and still showed the old three-ESP-profile and +agent-`0.4.0` description. PYB-002.1 therefore remains unresolved. The public +page does not establish a currently offered build, archive/source identity or +eligibility for a particular device. + +Raw response and receipt: ignored +`local/recovery-completion/public-channel-recheck/testflight.html` and +`testflight-receipt.json`; response SHA-256 +`78b9fb6bf3ff04ce12dfdf0e2a24ae694d0fda50cc1b8a468ae5d01c8277fdfb`. +No metadata was changed. When admitting `0.3.0`, reconcile this older prepared +description's draft-durability sentence with the +[new candidate packet](../../../publication/app-0.3.0-build-9-release-packet.md) +and the actual offered build; do not publish contradictory recovery claims. diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md index bb46b0c3..1a9a75af 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md @@ -8,14 +8,126 @@ | Execution date | 31 October 2026; Asia/Bangkok | | Authorization | User requested implementation for the next release after the C1-S1 integration and stage review | | Integrated starting baseline | `8dde8d6107e4b3c3fab29340ecec5b40c877444b`; previously merged C1-S1 work | -| Candidate | App `0.3.0+9`; source merged at `6f5b3ea`; local Android and iPad candidates identified in the platform report; release artifacts require their own identity binding | +| Candidate | App `0.3.0+9`; recovery baseline merged at `6f5b3ea`, landscape repair `e54a78a`, native dismissal `01a7ac8`, and guide correction `bef67bd` under PR #41; platform and release reports bind each actual artifact | | Scope | PYB-006.2 bounded current-text recovery; supporting PYB-009.1 recipe and applicable PYB-008.1 observations | | Contract | [Current-draft recovery](../../../specifications/App/current-draft-recovery.md), [ADR-0048](../../../decisions/0048-bounded-current-text-draft-recovery.md) | -| Overall state | Candidate source merged; 972 ordinary Flutter tests and post-merge CI pass, both native platform storage restart checks pass, and required physical acceptance remains partial. PYB-006.2 and M-02 are not Done | +| Overall state | Recovery baseline merged with passing post-merge CI; both native platform storage restart baselines and normal-app recovery observations retained. Latest guide-correction source passes 984 ordinary tests, rebuilt production packaging and the exact iPad palette regression. All five iPad Q rows pass with their declared source/baseline scope, and 36 PR #41 checks pass at `bef67bd`. A repeated final-candidate Android Blocks startup failure remains under investigation. PYB-006.2 and M-02 are not Done | | S1 state | Unchanged: six Done, two Prepared, four Awaiting evidence; M-01/SG0 and pilot work remain unfinished | | Capacity/calendar | Original S2 allowance 24h and 12–25 October dates remain historical forecasts. The 45–72h estimate / 60h S2–S4 option is not measured effort or confirmed human capacity | | Method | Separate storage, coordinator and UI Git worktrees; root integrates board/session guards, regressions, release records and qualification attempts | +## Acceptance continuation after merge + +The user requested completion of the remaining acceptance and release work. +The normal-app runs exposed a connected landscape keyboard overflow. The +specification-first regression at `d1f8719` and repair at `e54a78a` keep the +console output strip compact while the keyboard is open and make navigation +scrollable. The repaired app tree is `d0f2a464e9886c8451a0cb046123973095f246c6`. +At that revision, the ordinary suite had 974 passing tests, the focused shell +suite had 25 passing tests and analysis was clean. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) +tracks the repair and its current CI/review state. These new results are separate from the +972-test PR #40 baseline below. Physical checks and artifact packaging must use +or explicitly revalidate the repaired candidate; version `0.3.0 (9)` alone is +not enough to equate the earlier and repaired binaries. + +A further normal-app check found that expanding the console did not dismiss a +keyboard owned by a native Blocks field. The meaningful red test at `62b077c` +and repair at `01a7ac8` add an explicit request to the current Android/iOS +window; the console still follows observed keyboard insets, and a request +acknowledgement is not a claim that dismissal occurred. That revision's app tree is `10336954910872172006300bdcc15d62231471e9`. +It passes 978 ordinary tests, including 28 shell tests and one platform-fallback +test, clean analysis/source gates, and Android/iOS native builds. Android's +physical rerun observes the keyboard hide and console expand while retaining +field text; the iPad result remains separately tracked. Signed production +artifacts were rebuilt and passed the packaging and repeated 16 KiB runtime +checks in the release report. A subsequent iPad keyboard-palette Hide→Show +transition left the docked keyboard covering the console Expand control while +Flutter insets did not reflect that obstruction; the handler could not be +reached. Native diagnostics show an offscreen notification end frame while the +current view's public keyboard layout guide correctly reports the docked +498-point overlap. That actual platform failure kept the `01a7ac8` artifacts +provisional; the following guide-based correction supersedes that candidate and its physical revalidation is recorded below. +Earlier artifacts and recovery observations retain their own source/artifact +scope; no M-02/M-04 acceptance follows from packaging alone. + +| Workstream | Evidence authority | Current disposition | +|---|---|---| +| iPad normal workflow | [iPad acceptance continuation](04_iPad_Acceptance.md) | Normal Preview passes offline Unicode Restore/current-board consent at `e54a78a`, generated-text handoff/recovery at `01a7ac8`, and Editor/native Blocks palette Hide→Show/dismissal at `bef67bd`; exact text and usable viewports are retained. All five iPad Q rows pass on their recorded candidates; exact firmware baselines and unchanged-behavior impact assessment remain explicit | +| Android normal workflow | [Android acceptance continuation](05_Android_Acceptance.md) | Recorded `01a7ac8` P01–P15 scope and five Android Q rows pass with stated earlier-profile/accessibility limits. A repeated Blocks startup watchdog on the subsequent final-candidate attempt is under investigation; earlier passes do not close that admission issue | +| Production artifacts and channel packet | [Release readiness](06_Release_Readiness.md) | Current `bef67bd` signed Android/iOS artifacts pass packaging and repeated 16 KiB Android startup/storage checks. Earlier artifacts are historical; physical acceptance, release admission and channel delivery remain separately tracked | +| Pilot and capacity | [Pilot kit](../c1-s1/02_Pilot_Protocol_and_Observation_Kit.md) and [continuation order](../04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) | Human owner/cohort/setup/capacity and actual consented sessions remain pending | + +The subsequent guide correction is integrated at +`bef67bded9e5b83437e3eb0e2ec4be6a4cfd1a64`, equivalent to release-worktree commit +`c6e685dd3ebe718ed89fcfe58e441331eb174648`, app tree +`60b3a68b693551af5d83076547c502f69838e052`. It uses the greater of Flutter's +ordinary inset and the current view's observed guide overlap, including a +remaining input palette, with safe-area handling and generation/lifecycle +checks. Explicit snapshots recover a measurement that arrived before updated +window dimensions. The committed source passes 984 ordinary tests, including +six guide regressions, plus native iOS compilation and analysis/source gates. +All 36 checks at the PR #41 runtime head pass, including pinned goldens and +native Android WebView checks ([push CI](https://github.com/PyBLE-dev/PyBLE/actions/runs/41199415487), +[PR CI](https://github.com/PyBLE-dev/PyBLE/actions/runs/41199411607)). +Rebuilt signed production artifacts and repeated 16 KiB Android runtime smoke +also pass. The exact iPad Editor and native Blocks palette Hide→Show transitions now pass +on `bef67bd`: Expand stays above the keyboard and is hittable, dismissal restores +the available viewport, and exact text/Blocks field state are retained. Native +screenshots and accessibility frames agree. A subsequent Lenovo +final-candidate run also repeatedly reached the Blocks startup watchdog. Its +investigation remains open; the preceding successful Android observations are +retained with their actual source and artifact scope. + +After artifact freeze, `ef19773` corrects four explanatory comment lines in +`blockly_webview.dart` about the pinned Android asset-loading adapter. It changes +no executable behavior. The retained binaries remain bound to `bef67bd` and its +app tree; the later branch tree is not asserted byte-identical to that build. + +## Verified firmware inputs for the app observations + +A reported agent version of `0.6.1` does not distinguish the retained observer +build from the owner-published build. Read-only verification on 31 October bound +the following current program bytes before using them as app-compatibility +inputs. ESP rows compare device-computed MD5 values for the complete immutable +bootloader, partition table and application against retained components; their +SHA-256 below identifies the matching reference application. The Pico row is +an actual verified raw-flash readback SHA-256. Mutable NVS/PHY and user-filesystem +regions are outside these firmware-identity comparisons. + +| Exact profile | Current immutable program identity | Application/raw program SHA-256 | Evidence scope | +|---|---|---|---| +| `esp32-4mb` | Owner-published source `c8f549eeabe6d2b8c2766eab022517944bb09c8c` | `0f05c96631832da8e9e03b5895a398d6787d7dad2eb5c624beaef2497fdb8a0c` | All three immutable components match; supersedes the earlier prefix-only observation | +| `esp32-s3-n16r8` | Retained observer source `96497b9cf642ab2078842ce8a321c3c84b6714b2` | `746b2375ee6d3346413597cf04ffd5ef4e5f397d18d9d934f6646d016cf29c4c` | Exact ROM identity, flash geometry and all three immutable component checksums match | +| `waveshare-esp32-s3-lcd-147b` | Retained observer source `96497b9cf642ab2078842ce8a321c3c84b6714b2` | `3641a4eeaefcb7dde6626596ccd7b6c5b10859241fcd5dd580918f467d19f2d7` | Exact ROM identity, flash geometry and all three immutable component checksums match | +| `esp32-c3-4mb` | Retained observer source `96497b9cf642ab2078842ce8a321c3c84b6714b2` | `792cbf018a9cba8f70ad6bddd543a690ecd38e5eaa8c6ba034d70e5afc12d042` | Exact ROM identity, flash geometry and all three immutable component checksums match after release of the Android session | +| `rpi-pico2-w` | Retained observer source `96497b9cf642ab2078842ce8a321c3c84b6714b2` | `36220898a8bfef521453eb04b3dd01b005a13f34275ab57b8cb060e1c0b535e2` | Exact runtime/ROM identity and verified 862,492-byte raw read at flash offset zero match | + +Private receipts are retained under +`local/recovery-completion/firmware-verification/` and, for Classic, +`local/recovery-completion/ipad/firmware-provenance/`. USB aliases were freshly +bound to retained physical identities. Earlier setup failures remain in the +evidence: missing separate observer bootloader input, native USB re-enumeration, +unavailable Pico USB REPL, and incomplete `picotool info -d` fields. The +successful Pico route used the maintained BLE runtime-identity check and a +transient `machine.bootloader()` command, followed by `picotool` verified read +and application reboot. All five boards appeared in the final scan after the +C3 verification and return to runtime. No firmware or filesystem write and no erase +operation was performed. + +The observer-to-published source diff changes qualification-policy and release +validator/audit files; runtime code, board definitions, upstream pins and build +drivers are unchanged. Their resulting program bytes are nevertheless distinct. +App observations name the actual baseline and its historical limitations; +they cannot be relabelled as tests of the published bytes. The 31 October +engineering scope review by the Codex integration operator selects these +current, verified baselines for the app-only Q rows, using the unchanged runtime, +board, upstream and build-driver sources as the rationale. This is a bounded +compatibility scope decision, not binary equivalence, a human release sign-off, +or admission of an unfinished matrix. No firmware update is selected. Claims of +candidate-app testing against published `c8f549ee` on all profiles remain outside +this evidence. No new firmware qualification or full firmware-suite pass is +created by this comparison. + ## User outcome and implementation An acknowledged current-text checkpoint can be offered after an app restart for @@ -47,9 +159,9 @@ source progress; it is not a Done Increment or release admission. | C1-S2-T04 / PYB-006.2 | Implemented — durable storage and schema | Integrated regression and native storage checks pass; reconcile required physical acceptance | | C1-S2-T05 / PYB-006.2 | Implemented — startup choices/coordinator/UI | Integrated regression passes; remaining physical interaction/restart checks | | C1-S2-T06 / PYB-006.2 | Implemented — failure guidance/localization/volatile choices | Automated localization/accessibility/regression checks pass; applicable physical checks remain separate | -| C1-S2-T07 / PYB-006.2 | Implemented and checked — full analysis, 972 ordinary tests, formatting and source gates pass | Pinned golden/native CI passed on PR #40 and merged `6f5b3ea`; release evidence remains separate | -| C1-S2-T08 / PYB-008.1 | In progress — physical Android observations recorded | Lenovo connected and isolated engineering storage/relaunch/offline UI checks pass; remaining board/interaction matrix recorded in [platform report](02_Platform_Qualification.md) | -| C1-S2-T09 / PYB-008.1 | In progress — physical iPad observations recorded | iPad signed profile seed → kill → verify checks pass; normal Preview build launches and sees five boards; remaining recovery UI/board interaction checks are pending | +| C1-S2-T07 / PYB-006.2 | Implemented and checked — latest source has 984 ordinary tests, including 28 shell, one dismissal-fallback and six guide tests, with clean analysis | PR #40 baseline CI and all 36 PR #41 checks at `bef67bd` pass, including pinned goldens/native WebView; physical/release evidence remains separate | +| C1-S2-T08 / PYB-008.1 | Earlier Android continuation recorded; final-candidate issue under investigation | [Normal-app recovery and five Android Q rows](05_Android_Acceptance.md) pass on their stated sources; repeated Blocks startup watchdog during final-candidate checking remains unresolved | +| C1-S2-T09 / PYB-008.1 | Physical iPad execution complete; final integrated review pending | iPad native storage restart and normal Preview offline Restore/current-board Save/Run consent pass for the recorded artifact; generated-text handoff/recovery and the final Editor/Blocks palette regression also pass; all five iPad release-matrix rows pass with their recorded source and baseline scope | | C1-S2-T10 / PYB-006.2 | In progress — integration/evidence review | Record final checks, immutable candidates, physical results and carried limitations | | C1-S2-T11 / PYB-011.2 | Awaiting participant evidence | No consenting activation dates or mature follow-up records supplied | @@ -67,14 +179,14 @@ source gates; physical observations remain bound to their recorded artifacts. | DR-T04 | Real storage failure injection plus controller failure state retains previous copy and live edits | Automated integrated suite passing | | DR-T05 | Bad hash/metadata, corrupt/truncated database and unsupported version fixtures; bounded startup error UI | Automated integrated suite passing | | DR-T06 | Fresh v1/reopen, exported first schema and unsupported-version refusal; no fictional released v0 | Integrated schema tests pass; future schema migrations remain gated on new fixtures | -| DR-T07 | Explicit Restore/Discard, failed discard, volatile Retry, late hydration and no implicit board writes | Automated suite and Lenovo Restore/offline preview/relaunch pass; complete interaction matrix pending | +| DR-T07 | Explicit Restore/Discard, failed discard, volatile Retry, late hydration and no implicit board writes | Automated suite, Lenovo Restore/offline preview/relaunch, and iPad normal-app offline preview/Discard cancellation/Restore pass; final-candidate interaction matrix pending | | DR-T08 | Deterministic 500ms / continuous-edit 2s scheduling; delayed commits, startup timeout and epoch tests | Integrated clock/epoch/lifecycle tests pass; candidate-specific physical interruption scope remains explicit | | DR-T09 | Active write/replacement serialization, tombstones and no queued resurrection | Automated integrated suite passing | -| DR-T10 | Recovered-target cancellation and stale document/path/session consent | Recording-connection tests and Lenovo current-target Save/Run consent pass; iPad physical board consent pending | +| DR-T10 | Recovered-target cancellation and stale document/path/session consent | Recording-connection tests and Lenovo/iPad current-target Save/Run consent with cancellation pass for their recorded candidates; iPad Files Upload cancellation preserves the empty destination, while confirmation writes only the selected file. Final affected checks remain separate | | DR-T11 | Stable-facade board swap, delayed GET, stale completion and PUT-to-Run attachment refusal | Integrated recording-connection/session regression passes | -| DR-T12 | Explicit generated text handoff with editor-epoch/revision guards; existing workspace/sidecar behavior retained | Affected automated regression passes in the integrated suite; representative device checks pending | +| DR-T12 | Explicit generated text handoff with editor-epoch/revision guards; existing workspace/sidecar behavior retained | Affected automated regression and representative Android/iPad device checks pass. The iPad normal Preview preserves the previous Unicode draft on handoff cancellation, adopts exact generated text only on confirmation, and offers that committed text after actual relaunch | | DR-T13 | Local/board status separation, ARB error/status copy, disconnected preview, keyboard and 2× text | Automated UI/localization/semantics and pinned golden CI pass; physical Lenovo 2× preview observed; local macOS mismatch remains documented separately | -| DR-T14 | Exact recorded Android/iPad candidate, offline restore and explicit current target consent | Partial Lenovo engineering observations; signed iPad profile seed/verify pass; physical board consent still pending | +| DR-T14 | Exact recorded Android/iPad candidate, offline restore and explicit current target consent | Lenovo observations and signed iPad native-storage checks retained; normal iPad offline Restore and current-target Save/Run consent now pass. Both-platform generated-text checks also pass; final iPad keyboard regression passes; the subsequent Android Blocks startup observation remains under investigation | ## Verification and remaining admission @@ -102,8 +214,8 @@ flowchart LR M01 -. "Independent evidence stream" .-> REVIEW ``` -The next required work is the remaining exact-candidate physical recovery, -Blocks handoff and consent observations, followed by the applicable release matrix. Preserve +The next required work is resolving the final-candidate Android Blocks startup +observation and reviewing the now-completed iPad release-matrix evidence. Preserve failed/not-run rows rather than weakening the contract to meet a date. Human pilot work continues as its own evidence stream. No full A-24 completion, qualified release or publication follows from source commits alone. diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/01_Operator_Recipe.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/01_Operator_Recipe.md index 02a0a0c2..74afa0ce 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/01_Operator_Recipe.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/01_Operator_Recipe.md @@ -85,6 +85,19 @@ source/artifact change. Retain the original failure before any repair/rerun. | P14 | Copy generated Python from Blocks into Editor and checkpoint/relaunch | The text can recover; workspace graph/revisions/sidecars are not represented as restored by the local text slot | | P15 | Check recovery choice/error/local panel with 2× text, keyboard and screen reader | Controls scroll/remain reachable, focus/semantics announce correctly, no technical filename/path/source is translated | +### P15 keyboard regression continuation + +The 31 October device findings refine P15's existing reachability requirement. +Run the affected cases on the recorded repaired candidate; preserve each +original failure and do not substitute a mocked dismissal request for an +observed keyboard/viewport transition. + +| Case | Operator action | Required oracle | +|---|---|---| +| P15-K1 | In landscape Editor, open the software keyboard, edit harmless text and expand the compact console strip | Navigation and console controls remain reachable; the keyboard actually dismisses, the console expands, and text/selection and buffered output are retained | +| P15-K2 | In landscape Blocks, edit a native Blockly field with its keyboard open and expand the console | The native keyboard dismisses, the console expands, and field text/workspace state remain intact; Flutter-only focus tests do not establish this result | +| P15-K3 | On iPad, hide the keyboard and reopen it through the keyboard palette; repeat with Editor and a native Blocks field | The visible docked keyboard leaves controls reachable above it; content is reduced by the observed overlap once and Expand can actually be tapped. Hiding the full keyboard accounts for any remaining input palette; zero keyboard occlusion is expected only after editing ends and the guide returns to its safe-area baseline | + Platform-controlled interruption before/during/after checkpoint should preserve whole permitted old/new content. If a required phase cannot be deterministically hit on a device, record that limitation and its host fault-test evidence; do not diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/02_Platform_Qualification.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/02_Platform_Qualification.md index f3df86e9..243c55ca 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/02_Platform_Qualification.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/02_Platform_Qualification.md @@ -12,6 +12,14 @@ | Raw evidence | Ignored `local/recovery-implementation/`: commands/results, source manifests, screenshots/UI dumps, retained checkpoint and APK; raw captures are not committed | | Review | [Execution record](00_Execution_Record.md), [operator recipe](01_Operator_Recipe.md), [merged PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) | +**Continuation:** this report preserves the earlier source/artifact results. +Later normal-app observations and repairs are recorded in the +[iPad acceptance report](04_iPad_Acceptance.md), +[Android acceptance report](05_Android_Acceptance.md), and +[current execution record](00_Execution_Record.md). A pending row here is not a +claim that the same scenario remains unrun on every later candidate; a later +pass likewise does not rewrite the earlier outcome or prove identical bytes. + ## Isolation and artifact identity The installed store applications were preserved. Qualification used copied app @@ -127,13 +135,16 @@ prove current contents. The fresh complete current workspace backup exactly matc and its valid LFS2 workspace remain intact, with identical partition geometry. ROM reads and startup tracing involved controlled resets. The verified valid pre-test workspace was then restored only to its original region, and the next scan shows all five boards. See the [recovery report](03_Classic_ESP32_Workspace_Recovery.md) for backups, hashes, offline inventory and the verified write. -## Remaining release evidence +## Subsequent acceptance evidence -Complete the iPad production interaction matrix, remaining Android interaction/interruption rows, -explicit harmless physical board Save/Run/Files destination consent, applicable -Blocks handoff checks and the selected release matrix. Preserve candidate -provenance and report every unrun row. Participant follow-up and the unfinished -M-01/SG0 pilot work remain separate from engineering recovery evidence. +The remaining normal-app interaction, current-target consent and Blocks handoff +work from this historical record is reconciled in the [iPad](04_iPad_Acceptance.md), +[Android](05_Android_Acceptance.md) and [current execution](00_Execution_Record.md) +records. All five iPad Q rows now pass within their exact source/firmware scope; +the final Android Blocks startup observation remains under investigation. +Candidate provenance, retained failures and final admission stay explicit. +Participant follow-up and unfinished M-01/SG0 pilot work remain separate from +engineering recovery evidence. ## Lenovo production workflow on recovered classic ESP32 diff --git a/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md b/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md index ea9fcf57..14d640cc 100644 --- a/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md +++ b/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md @@ -11,9 +11,9 @@ | Field | Value | |---|---| -| Document version | 1.6 — merged recovery candidate and acceptance continuation; original filename retained | +| Document version | 1.7 — physical acceptance, declared firmware baselines and release preparation; original filename retained | | Prepared | 25 September 2026 | -| Last reviewed | 31 October 2026; PR #40 merged and integrated CI passed; physical acceptance and release continuation tracked separately | +| Last reviewed | 31 October 2026; merged recovery baseline, physical acceptance continuation, firmware identity checks and release preparation reviewed; final candidate admission remains separate | | Status | C1-S1 has six tasks Done, two Prepared awaiting pilot setup and four Awaiting evidence; Sprint and SG0 remain unfinished. Bounded recovery source is merged, with physical acceptance and release qualification underway. Human capacity and recruitment dates need replanning; no new protocol behavior approved | | Product | PyBLE — Python over Bluetooth Low Energy | | Organization | SciLabPro | @@ -39,6 +39,7 @@ | 1.4 | Verified existing Play/TestFlight installations on connected tablets; recorded artifact evidence and remaining provenance/metadata limits; replaced blanket pilot blockers with Prepared/Awaiting evidence states without waiving acceptance criteria | | 1.5 | Implemented bounded current-text recovery for source candidate 0.3.0+9; added candidate execution/operator records; preserved remaining pilot, platform and release gates | | 1.6 | Reconciled PR #40 merge, passing integrated CI and both local tablet candidates; selected acceptance → qualification → distribution continuation, with human capacity and participant evidence still explicit | +| 1.7 | Recorded normal-app acceptance progress and exact current firmware inputs for app-only compatibility; tracked prepared signed artifacts and remaining candidate, release and channel evidence without inventing pilot results | ## Contents @@ -163,7 +164,7 @@ The [execution record](../developments/2026-q4-reliable-workflow/c1-s1/00_Execut | Residual PYB-002.1 | Accurate replacement TestFlight app-level description prepared after the public page exposed its older ESP/agent-0.4.0 baseline | Distribution owner must apply it and verify the public result; also reconcile build-6 installed `MinimumOSVersion` 18 with TestFlight notes stating 15 before asserting support. No store mutation performed; Android's earlier correction remains complete | | PYB-003/004 | Operational pilot protocol, safe Tasks A/B/C, consent/retention rules and empty observation/support templates | Human owner, reachable cohort, tested setup and collection decision unconfirmed; no participants or observed outcomes | | PYB-006.1 | [Recovery contract](../specifications/App/current-draft-recovery.md), ADR-0048, source/peer review, scenario matrix and estimate | Bounded implementation now tracked in the [C1-S2 record](../developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md); platform/release acceptance and broader A-24/Blocks scope remain carried | -| PYB-009.1 | Existing tool/gate inventory, ten platform/profile rows, cost model and initial operator recipe; 110 focused host harness tests pass | S2 scoped procedure, hardware/operator access, actual physical runs and independent reproduction remain pending | +| PYB-009.1 | Existing tool/gate inventory, ten platform/profile rows, cost model and initial operator recipe; 110 focused host harness tests pass | S2 now supplies the scoped procedure and actual connected-device observations; final candidate acceptance and independent reproduction remain separate | The recovery estimate is **38–63 engineering hours**, or **45–72 hours** with the original recipe, representative-platform and follow-up allowances. The [design review](../developments/2026-q4-reliable-workflow/c1-s1/03_Recovery_Design_and_Sizing.md) offers a conditional 60-hour S2–S4 allocation, displacing earlier matrix and activation forecasts. The [validation inventory](../developments/2026-q4-reliable-workflow/c1-s1/04_Validation_Inventory_and_Operator_Recipe.md) estimates 13.5–26 operator hours for the app matrix and 30–59 for fresh full firmware qualification, excluding builds, unavailable access and defect repair. These are working estimates, not actual effort or promises. **SG0 remains blocked.** @@ -873,7 +874,7 @@ At cycle end, choose one principal next investment: Reliable Projects, partner p - [ ] Assign one owner and one review path for each initial issue. - [ ] Inventory exact test boards, tablets, cables, and available recovery equipment. - [ ] Freeze Task A/B/C definitions, assistance/timeout rules, prospective follow-up windows and task-opportunity questions, consent procedure, and manual support template; observe initial eligible participants. -- [x] Specify and peer-review the bounded current-text contract and its acceptance scenarios; size the safe increment. Runtime implementation and physical acceptance remain pending; replan the original S2 forecast. +- [x] Specify and peer-review the bounded current-text contract and its acceptance scenarios; size the safe increment. Runtime implementation is merged; final physical acceptance remains in progress in the C1-S2 record. The dated continuation order preserves and replans the original S2 forecast. - [ ] If operator/capacity is available, include one existing-profile Ready rehearsal and draft record in PYB-009; show installation status and pending evidence explicitly. ### 20.2 Issue template diff --git a/docs/testing/website/android-open-testing-2026-09-25.md b/docs/testing/website/android-open-testing-2026-09-25.md index 83c08e77..efd9ee6e 100644 --- a/docs/testing/website/android-open-testing-2026-09-25.md +++ b/docs/testing/website/android-open-testing-2026-09-25.md @@ -40,7 +40,7 @@ listing remains the link; no inferred opt-in destination is introduced. ## Source and evidence boundaries -The repository's App source version remains `0.2.0+8`. The public app version +At the original review, the repository's App source version was `0.2.0+8`. The public app version `0.2.0` does not establish the installed store artifact's version code, source commit, or inclusion of later connection-lifecycle fixes. The [build-8 handoff](../google-play/0.2.0-build-8.md) and original submission @@ -51,3 +51,18 @@ This record documents availability and the coordinated content contract. It does not attest a deployment, signed-in Play Console state, installed app binary, or hardware-validation result. Search engines control when indexed snippets refresh after updated pages are published. + +## 31 October 2026 public-page recheck + +A fresh HTTPS GET of the [official Google Play listing](https://play.google.com/store/apps/details?id=dev.pyble.pyble&hl=en&gl=US) +at 11:46 UTC returned HTTP 200. Its English/US release notes still describe +`0.2.0` open testing, with 16 September 2026 shown as the update date. This +reconfirms the public copy baseline; it does not identify the current delivered +version code, account eligibility or binary. The `0.3.0+9` app candidate remains +under [release preparation](../../developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md). + +Raw response and receipt: ignored +`local/recovery-completion/public-channel-recheck/play.html` and +`play-receipt.json`; response SHA-256 +`270403bcba91faa4c8b9c7eb0ce8aa0882a3d3251c23623faf346e8a62d8b659`. +No enrollment, installation or store mutation was performed by this recheck. From 307156041c5b6a1475bad1ac9bcccaf4d974598a Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 20:08:25 +0700 Subject: [PATCH 22/31] [docs] admit app candidate with final physical qualification receipts Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/06_Release_Readiness.md | 136 +++++++++++++++--- .../app-0.3.0-build-9-release-packet.md | 8 +- 2 files changed, 124 insertions(+), 20 deletions(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md index b0ff7446..91a54af6 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md @@ -9,10 +9,14 @@ | Scope | App-only bounded current-text recovery; existing Play open-testing and TestFlight channels | | Runtime source | Recovery baseline plus landscape layout, native keyboard dismissal and iPad palette-geometry repairs at `bef67bded9e5b83437e3eb0e2ec4be6a4cfd1a64` | | Build checkout | Release worktree `c6e685dd3ebe718ed89fcfe58e441331eb174648`; app tree `60b3a68b693551af5d83076547c502f69838e052`, verified identical to the runtime baseline | -| 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 | +| 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 | | Local evidence | Ignored `local/recovery-completion/release/candidate-bef67bd/`: build/check logs, source/artifact manifests, runtime evidence and retained signed binaries | | Public copy | [Prepared release packet](../../../publication/app-0.3.0-build-9-release-packet.md); no submission or availability claim | +A post-freeze comment correction clarifies Android's asset/file-access adapter +semantics. It changes no executable behavior or loading path; the retained +artifacts remain bound to the frozen runtime and app tree above. + ## Gate selection 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 | Gate | Required evidence | Current disposition | |---|---|---| -| 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 | -| 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 | -| 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 | +| 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 | +| 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 | +| 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 | | 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 | -| Release review | Frozen artifact identity, resolved mandatory failures, supported scope, privacy/dependency review and recorded acceptance | Not yet admitted | +| 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 | | 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 | Pilot participation and useful-return evidence remain separate from maintenance @@ -179,10 +183,10 @@ path. The exact-asset controls observed `onPageStarted`, then `hostReady`, and confirmed that `window.pybleBlocks.configureHost` exists. The selected provider was installed/enabled and not stopped or suspended at inspection time. -The current isolated profile candidate subsequently reached the real Blocks -workspace. These observations distinguish the retained debug failure from a -completed profile-candidate failure; they do not identify the original cause -or prove DR-T12 by themselves. The inline control exposed a possible callback +The earlier isolated profile candidate subsequently reached the real Blocks +workspace. Those observations did not establish the cause of the retained +debug failure or prove DR-T12 by themselves. A later final-candidate profile +failure was reproduced and isolated separately below. The inline control exposed a possible callback ordering hazard, but neither exact-asset control reproduced it, so no startup-protocol change or claimed startup fix followed. The physical report must separately record 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 an Android keyboard owned by a native Blockly field. The final candidate adds a narrow current-window dismissal request on Android and iOS while retaining layout based on actual insets. The Android rerun observed IME visibility change -from shown to hidden, an expanded console and retained field text. The iPad -outcome remains part of its separate physical report. The production artifacts +from shown to hidden, an expanded console and retained field text. The final iPad +report also passes reachable Expand/dismissal in both Editor and Blocks. The production artifacts above include this repair and the later iPad geometry fallback; the diagnostic controls did not change the Blocks startup protocol. +## Final Android renderer suppression control + +The final `bef67bd` isolated qualifier profile subsequently timed out on Blocks +startup, including Retry and a startup with no active UI-automation polling. +The failure is retained; earlier profile success does not erase it. An ignored +instrumented copy of the actual host completed controller setup and asset-load +submission by 412 ms. At 3 and 9 seconds the native URL was the bundled asset, +but bounded JavaScript readiness probes timed out. No page-start, page-finished +or bridge callback arrived; the 15-second watchdog fired at generation zero. +This observed failure preceded the startup gate, so no host-readiness protocol +change was justified. + +Android retained the qualifier's renderer service as pending with no process or +binder. Its ActivityManager explicitly suppressed service startup. The device's +DuraSpeed service was enabled and listed the isolated qualifier package in its +suppression set. The actual production package `dev.pyble.pyble` was absent from +that set and was not changed. A plain native Activity loading the exact bundled +assets under the same qualifier APK/UID also failed before any page/bridge +callback, establishing that Flutter and the Blocks startup gate were not +necessary for this failure. + +The ordinary qualifier App info → Battery screen initially selected +**Optimized**. A scoped, reversible control selected **Unrestricted** for that +qualifier alone. The same native APK/UID then emitted page-start at 594 ms, +`hostReady` at 801 ms, page-finished at 809 ms, and successful document/API +readiness probes at 3 and 9 seconds. DuraSpeed remained globally enabled and +its global configuration was unchanged. No provider replacement, global +optimization disable, hidden allowlist mutation, firmware change or app-data +reset was used. This native control alone was not final app acceptance: a later +normal-APK shell launch still produced a retained watchdog failure. Both the +older and final normal profile APKs subsequently opened a valid empty workspace +through the actual launcher. A helper initially misclassified that ready empty +state because it waited for enabled Preview code before any blocks existed; +the raw hierarchy instead showed Visual block workspace, Browse examples and +Add blocks to generate Python, with no startup error. This oracle correction +does not erase the separate real watchdog failures. + +The final normal `945e9746` qualifier then passed Hello example generation, +native-field keyboard Expand/dismissal with content retained, guarded Editor +handoff, a local generated-text checkpoint, offline cold relaunch/Restore with +both radios off, and current-C3 Save Cancel and Run Cancel. A first post-radio +C3 service-discovery timeout was retained; explicit reconnect succeeded before +the two Cancel checks. The board was explicitly disconnected afterward. +No startup source change or extra artifact rebuild followed these controls. + +After these observations, the qualifier's original **Optimized** battery mode +was restored through the same ordinary Settings screen. Fresh native hierarchy +and screenshot receipts show only Optimized checked. The qualifier was removed +from the device-idle allowlist; the global DuraSpeed configuration is byte-for- +byte identical to its baseline and remains enabled. The production package +remains absent from the DuraSpeed suppression/explicit allowlist observations +and its settings were untouched. The final acceptance therefore records the +observed Unrestricted/actual-launcher qualification precondition and restoration, +rather than promising operation while the OS suppresses renderer startup. + +Raw callback logs, the failed attempts and normal APK identities are retained +under ignored `local/recovery-completion/android/`. OEM policy, checked-radio +screenshots and the restoration recipe are under +`local/recovery-completion/blockly-startup-diagnostic/`. This is an explicit +device precondition for the isolated qualification container, not a claim of +unconditional operation while Android suppresses its WebView renderer. + ## iPad keyboard palette regression 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 regressions cover the actual fallback, Blocks dismissal/host retention, maximum/padding behavior, resize ordering, stale callbacks/lifecycle and the unchanged Android path. Native iOS profile compilation and static/source gates -pass. Exact physical iPad palette reopening and reachable Expand/dismissal -remain acceptance observations in the [execution record](00_Execution_Record.md); -a production IPA export alone cannot substitute for them. +pass. Final physical iPad palette reopening and reachable Expand/dismissal +passed in both Editor and Blocks on `bef67bd`; the iPad report linked from the [execution record](00_Execution_Record.md) +retains the original failures and measured diagnostic alongside the successful +reruns. These physical observations, not the IPA export alone, satisfy the +affected keyboard acceptance. + +## Dependency review scope + +On 31 October, GitHub's 19 open Dependabot entries mapped to 12 advisory +families in the website's npm manifests. Current main already contains fixes +for 11 families; the braces advisory was withdrawn. A fresh +`npm audit --audit-level=high --json` exited successfully with no high or +critical findings. It reports 15 moderate affected dependency nodes from two +roots: minimatch in development lint tooling and Satori in vinext image tooling. +No authored affected SVG, cache or TLS invocation was found. Production serves +static output, and these website dependencies are outside the frozen app +artifact. The moderate findings remain separate web maintenance; this review +does not claim that every dependency is vulnerability-free. No alerts were +dismissed and no dependencies were changed. + +The retained audit completed at `2026-10-31T12:54:17.290202+00:00` against lockfile +SHA-256 `2c7b0c6c652a078eefada990f4a018ae4650355bfb703858c581b5cf430e5483`. +Its advisory mapping, audit JSON and summary remain under ignored +`local/recovery-completion/dependency-audit/`. ## Distribution access and remaining account work @@ -245,8 +332,19 @@ already been consumed; these remain **unverified**. Read-only browser discovery did not establish an authenticated console session. This is not a claim that the owner lacks web-console access or that Xcode has no potential upload route. -After the candidate is admitted, the authorized distribution operator must -verify the exact package, unused build numbers and current declarations, upload -the retained artifacts, resolve processing/review findings, and record actual -availability and installed-store results separately. The prepared packet and -artifact records make those steps concrete; they do not substitute for them. +A read-only GitHub audit found zero repository Actions secrets and zero +repository environments. The only authored active workflow is +`.github/workflows/ci.yml`, which validates/builds but has no store-publishing +job; the tracked tree has no Fastlane configuration. Organization-secret +listing returned HTTP 403, so inherited organization credentials were not +proven absent. No existing repository workflow consumes a Play or App Store +publisher credential. This inspection found no configured CI upload route; +it does not infer that the owner lacks credentials elsewhere. + +Engineering admission is complete for the frozen artifacts. After the final +required PR checks and merge, the authorized distribution operator must verify +the exact package, unused build numbers and current declarations, upload the +retained artifacts, resolve processing/review findings, and record actual +availability and installed-store results separately. The existing Xcode account +is a concrete route to attempt, with server authentication and receipts retained. +The prepared packet and artifact records do not substitute for channel delivery. diff --git a/docs/publication/app-0.3.0-build-9-release-packet.md b/docs/publication/app-0.3.0-build-9-release-packet.md index 61d3a35b..71eaa74d 100644 --- a/docs/publication/app-0.3.0-build-9-release-packet.md +++ b/docs/publication/app-0.3.0-build-9-release-packet.md @@ -5,7 +5,8 @@ Prepared 31 October 2026. This is candidate copy for the existing Google Play open-testing and TestFlight channels. It does not announce availability, a -submission, or release admission. The [readiness record](../developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md) +submission, or store delivery. Engineering admission is accepted for the frozen +artifacts; final PR checks and merge precede publishing. The [readiness record](../developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md) owns the artifact and gate states. Confirm that build 9 is unused in each account before uploading; a consumed number requires a new source version contract and rebuilt artifacts, not a renamed file. @@ -57,6 +58,11 @@ application identities. Their successful installation does not prove an upgrade of `dev.pyble.pyble`, store processing, or store delivery. A distribution export also does not establish successful execution on the physical tablet. +The [dependency review](../developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md#dependency-review-scope) +records the current website audit separately from the frozen mobile artifact: +no high/critical findings, with moderate web-tooling findings still open for +maintenance. It does not claim that every dependency is vulnerability-free. + ## Privacy and recovery scope Candidate 0.3.0 adds an app-private local database containing one current text From 6e444dae1e640be8222d88dd69a20ce1a86ed333 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 20:09:46 +0700 Subject: [PATCH 23/31] [docs] verify installed production identity and CI scope Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/06_Release_Readiness.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md index 91a54af6..a0ceacd9 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md @@ -29,7 +29,7 @@ claim a new firmware release, fresh firmware OI-1 qualification or a Ready badge | Gate | Required evidence | Current disposition | |---|---|---| | 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 | -| 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 | +| 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 frozen-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 | | 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 | | 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 | | 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 | @@ -321,6 +321,14 @@ certificate. A valid Apple distribution identity and cached production App Store provisioning profile are available. Signing access alone does not prove an authenticated store session, role, account version history or review status. +A read-only check of the Lenovo production package found `dev.pyble.pyble` +version `0.2.0`, versionCode `8`, installed by `com.android.vending`, with its +last update on 17 September. Its verified signing certificate SHA-256 is +`e3c1334dc7aad1ae20fe043b52c2d5638584a67a66e6a5255a87bf89f56f06d0`, distinct +from the owner upload certificate above. The production app was not replaced. +This installed Play build does not establish whether build 9 was subsequently +uploaded or consumed in a store account; that question remains an account check. + No dedicated Play/App Store Connect connector or configured standalone command-line store credential was found in the standard locations inspected. However, Xcode preferences contain one configured production Apple-account From 6124356009df134d5b8e8d59a1ff4524a103da73 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 20:10:41 +0700 Subject: [PATCH 24/31] [docs] retain store-installed upgrade baselines for channel delivery Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/06_Release_Readiness.md | 3 ++- docs/publication/app-0.3.0-build-9-release-packet.md | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md index a0ceacd9..b2418232 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md @@ -322,7 +322,8 @@ Store provisioning profile are available. Signing access alone does not prove an authenticated store session, role, account version history or review status. A read-only check of the Lenovo production package found `dev.pyble.pyble` -version `0.2.0`, versionCode `8`, installed by `com.android.vending`, with its +version `0.2.0`, versionCode `8`, with installing and initiating package +`com.android.vending` and its last update on 17 September. Its verified signing certificate SHA-256 is `e3c1334dc7aad1ae20fe043b52c2d5638584a67a66e6a5255a87bf89f56f06d0`, distinct from the owner upload certificate above. The production app was not replaced. diff --git a/docs/publication/app-0.3.0-build-9-release-packet.md b/docs/publication/app-0.3.0-build-9-release-packet.md index 71eaa74d..8b0bf687 100644 --- a/docs/publication/app-0.3.0-build-9-release-packet.md +++ b/docs/publication/app-0.3.0-build-9-release-packet.md @@ -40,6 +40,17 @@ instructions in the account. Verify them against the current form rather than inventing reviewer access, audience declarations, privacy attestation or a store review result. No tester invitation is sent by preparing this packet. +## Installed store baseline before delivery + +| Platform | Existing production/store identity | Release implication | +|---|---|---| +| iPad | PyBLE `0.2.0 (6)` | Preserve this installed-store baseline for the eventual TestFlight upgrade receipt; the local Preview `0.3.0 (9)` is separate evidence | +| Lenovo Android | `dev.pyble.pyble` `0.2.0`, versionCode `8`; installing and initiating package `com.android.vending`, with the Play certificate recorded in readiness | Preserve this Play-signed app and its data; the isolated qualifier `0.3.0 (9)` is separate evidence and the upload-key APK is not a compatible replacement for the Play-signed install | + +These installed baselines do not reveal whether a newer build number has +already been uploaded to either account. Confirm account history before +submission and record store-delivered About identity after actual delivery. + ## Artifact and channel handoff | Step | Required result | From 7cdbb31bfeffe64f65f31e5d379dff1903b0b37c Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 20:12:36 +0700 Subject: [PATCH 25/31] [docs] record complete qualification fixture cleanup Signed-off-by: Viwat Vchirawongkwin --- .../2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md index ffec5781..653107c0 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/04_iPad_Acceptance.md @@ -128,8 +128,9 @@ Only disposable qualification files/folders are written. The classic fixtures and their CRC-verified backups/cleanup are recorded with the [Android continuation](05_Android_Acceptance.md); pre-existing root entries are preserved. The S3, Waveshare and Pico follow-up fixtures have likewise been CRC-verified, -backed up and removed with unrelated root entries unchanged. C3 fixtures remain -tracked privately for cleanup after the final Android continuation. Raw captures, binaries, database backups and helper +backed up and removed with unrelated root entries unchanged. After the final +Android continuation, all four C3 fixtures and both empty owned directories were +likewise verified, backed up and removed; unrelated entries remain intact. Raw captures, binaries, database backups and helper sources remain ignored. The task-created XCTest runner was uninstalled after the completed iPad checks; Preview and both pre-existing PyBLE installations were preserved. No user project or original store installation is reset. From 124efb62a2062467fdabe713200dd8d03ef7a426 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 20:12:23 +0700 Subject: [PATCH 26/31] [docs] accept bounded recovery and declared app qualification Signed-off-by: Viwat Vchirawongkwin --- CHANGELOG.md | 5 +- README.md | 9 +- docs/ROADMAP.md | 12 +- .../0010-working-loop-in-memory-document.md | 5 +- ...048-bounded-current-text-draft-recovery.md | 6 +- .../01_Overview_and_Scrum_Framework.md | 14 +-- .../02_Product_Roadmap.md | 11 +- .../03_Milestones.md | 12 +- .../04_Sprint_Plan.md | 12 +- .../05_Product_Backlog_and_Stories.md | 18 +-- .../06_Sprint_Backlogs.md | 65 +++++----- .../c1-s2/00_Execution_Record.md | 119 ++++++++++++------ .../c1-s2/02_Platform_Qualification.md | 6 +- ...E_Implementation_Plan_and_Strategy_v1.0.md | 26 ++-- docs/specifications/App/TDD.md | 2 +- .../App/current-draft-recovery.md | 8 +- docs/specifications/App/specs.md | 7 +- 17 files changed, 200 insertions(+), 137 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b99ddf21..eef3a736 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,8 +11,9 @@ incomplete automated evidence remains pending. The qualified v0.6.0 release remains a separate historical baseline built from its annotated tag. The merged app source now targets `0.3.0+9`. Its local Android and iPad Preview -installations are engineering candidates, with release qualification and channel -delivery tracked separately. The recorded existing-channel baseline is Android +installations support scoped engineering acceptance for bounded recovery and +the declared app-only matrix. Device closeout is complete; final integration and actual channel +delivery remain separate. The recorded existing-channel baseline is Android Play `0.2.0 (8)` and iPad TestFlight `0.2.0 (6)`; the earlier build-5 Transporter and build-8 submission handoffs remain historical artifact records. diff --git a/README.md b/README.md index 6716cd10..73182a66 100644 --- a/README.md +++ b/README.md @@ -104,11 +104,12 @@ This bounded feature covers text up to 1 MiB, including Python explicitly copied from Blocks. Blocks workspace graphs, projects/history and exported backups remain outside this increment. Uninstalling or clearing app data removes local copies. See the [candidate execution record](docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md) -for passing automated checks and candidate-specific device evidence. Local -Android and iPad Preview installations are engineering candidates; their -installation does not establish store availability or release qualification. +for accepted automated and candidate-specific device evidence, including the +declared five-profile × two-platform app matrix and test conditions. Local +Android and iPad Preview installations remain separate from store delivery. The [release readiness record](docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md) -tracks signed-artifact preparation, qualification and the channel handoff. +tracks the engineering-qualified artifacts, completed device closeout and channel handoff; +`0.3.0 (9)` is not yet established as a store-delivered update. ### Firmware diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index d8fe5367..81049d6b 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -37,14 +37,14 @@ v0.7.0 remains non-normative and requires separate maintainer approval. and launches are verified on connected tablets; fresh enrollment/reinstallation was not exercised. The pilot kit, recovery design and validation inventory are prepared; this does not complete the Sprint or board qualification. -- Validate and qualify the implemented [bounded current-text recovery candidate](developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md) - against the [contract](specifications/App/current-draft-recovery.md). Merged - candidate `0.3.0+9` supplies atomic local checkpoints and offline recovery; - full A-24 and Blocks graph persistence remain separate scope. The original - 45–72 hour estimate remains a forecast, not measured effort. +- Deliver the engineering-accepted [bounded current-text recovery candidate](developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md). + Candidate `0.3.0+9` passes its [contract](specifications/App/current-draft-recovery.md) + and declared app-only matrix with exact test conditions recorded. Full A-24 + and Blocks graph persistence remain separate scope. The original 45–72 hour + estimate remains a forecast, not measured effort. - Correct the [stale public TestFlight description](developments/2026-q4-reliable-workflow/c1-s1/05_TestFlight_Metadata_Correction.md) through the distribution owner; replacement copy is prepared, not published. -- Complete [release qualification and channel delivery](developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md) for merged app `0.3.0+9`, +- Complete [final integration and channel delivery](developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md) for qualified app `0.3.0+9`, retaining the recorded 0.2.0 channel baseline until the new channel is verified. The [Android publication review](testing/website/android-open-testing-2026-09-25.md) records live open-testing availability. The diff --git a/docs/decisions/0010-working-loop-in-memory-document.md b/docs/decisions/0010-working-loop-in-memory-document.md index 16d1bd42..aad7ac56 100644 --- a/docs/decisions/0010-working-loop-in-memory-document.md +++ b/docs/decisions/0010-working-loop-in-memory-document.md @@ -69,6 +69,7 @@ and [C1-S1 review and sizing](../developments/2026-q4-reliable-workflow/c1-s1/03 That 25 September inspection was design-only. The 31 October candidate now implements the bounded current-text successor; its [C1-S2 execution record](../developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md) -separates source implementation from pending integrated/physical acceptance and -release admission. The remaining A-24 project, settings, console, import and +records scoped engineering acceptance after integrated/physical checks, with +exact test conditions and completed device closeout; final integration and +channel delivery remain separate. The remaining A-24 project, settings, console, import and Blocks obligations remain carried. diff --git a/docs/decisions/0048-bounded-current-text-draft-recovery.md b/docs/decisions/0048-bounded-current-text-draft-recovery.md index bf2d6c7e..32186d95 100644 --- a/docs/decisions/0048-bounded-current-text-draft-recovery.md +++ b/docs/decisions/0048-bounded-current-text-draft-recovery.md @@ -6,8 +6,10 @@ **Status:** Accepted for the bounded implementation; candidate source implemented 2026-10-31 under the user's next-release request. The contract was specified 2026-09-25 during C1-S1. PR #40 merged the source and integrated CI passes. -Required physical acceptance and release admission remain pending; no named -human sign-off is claimed. +Scoped recovery acceptance and app-only qualification are recorded for frozen +runtime `bef67bd` after required automated and physical checks. Device closeout +is complete; final branch integration and channel delivery remain separate; no +named human sign-off is claimed. ## Context diff --git a/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md b/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md index 337739a8..a5df4088 100644 --- a/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md +++ b/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md @@ -9,16 +9,16 @@ |---|---| | Package | PyBLE 2026 Q4 reliable workflow, Cycle 1 (`C1`) | | Prepared | 25 September 2026; Asia/Bangkok | -| Strategy | [Implementation Plan, revision 1.7](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md) | +| Strategy | [Implementation Plan, revision 1.8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md) | | Repository baseline | `23ed764b0ef88dce9720c66fbd1c0655268860cf` | | Proposed cycle | 28 September–20 December 2026; six two-week Sprints | -| Status | C1-S1 device retry on 25 September: six tasks Done, two Prepared and four Awaiting evidence; both current channel installations verified, pilot work unfinished. Later Sprints require replanning against new sizing; no staffed-team ceremony is inferred | +| Status | C1-S1: six Done, two Prepared and four Awaiting evidence. The 31 October continuation accepts M-02 and app-only M-04; S2 has ten Done tasks and T11 awaiting participants. Channel delivery and human capacity remain unresolved; no staffed-team ceremony is inferred | | Primary audience | Tablet-owning makers, provisionally; confirm one reachable cohort before observation | | Authoritative contracts | [Contributor rules](../../../AGENTS.md), [App specification](../../specifications/App/specs.md), [App TDD](../../specifications/App/TDD.md), [PBLE/1](../../specifications/protocol.md), and applicable firmware/release specifications | This package derives execution views from the strategy. It does not replace normative specifications, expand hardware claims, create GitHub issues, or authorize store/website publication. The strategy and original package were recorded together in planning baseline `d039db0`. The [C1-S1 execution record](c1-s1/00_Execution_Record.md) owns actual results and blockers. -**31 October continuation update:** the `0.3.0+9` recovery baseline merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40). Physical qualification exposed three keyboard defects; their repairs at `bef67bd` pass 984 ordinary tests and all 36 PR #41 checks. iPad recovery, final keyboard regressions and all five iPad app-only board rows pass with declared source/firmware scope. Earlier Android recovery and board rows pass, but a later final-candidate Blocks startup observation remains under investigation. Signed packages and a channel packet are prepared; admission and actual store delivery remain separate. The [C1-S2 record](c1-s2/00_Execution_Record.md) binds the evidence. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records unresolved capacity inputs. +**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. Final branch integration and actual M-05 store delivery remain separate. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. ## Navigation and ownership of information @@ -31,11 +31,11 @@ This package derives execution views from the strategy. It does not replace norm | [05 — Product backlog and stories](05_Product_Backlog_and_Stories.md) | Ordered work, parent/child identities, acceptance criteria, and source traceability | Refinement or changed user evidence | | [06 — Sprint backlogs](06_Sprint_Backlogs.md) | Task allowances, dependencies, C1-S1 execution status and later forecasts requiring replanning | Developers select/adapt work during a Sprint | | [C1-S1 — Execution and evidence](c1-s1/00_Execution_Record.md) | Actual channel checks, pilot kit, recovery design/sizing and validation inventory | New evidence, source review or a resolved blocker | -| [C1-S2 — Implementation and evidence](c1-s2/00_Execution_Record.md) | Bounded recovery candidate, actual test states, remaining physical/release work and scoped operator recipe | Source integration, actual platform runs or admission decision | +| [C1-S2 — Implementation and evidence](c1-s2/00_Execution_Record.md) | Accepted bounded recovery and app-only qualification, retained evidence/limits, release continuation and scoped operator recipe | Source integration, actual platform runs or admission decision | ```mermaid flowchart LR - Strategy["Strategy revision 1.7"] --> Goal["One Product Goal"] + Strategy["Strategy revision 1.8"] --> Goal["One Product Goal"] Goal --> Roadmap["Outcome roadmap and milestones"] Roadmap --> Product["Ordered Product Backlog"] Product --> Planning["Sprint Planning"] @@ -64,7 +64,7 @@ flowchart LR | App source is `0.2.0+8`; physical retry verifies Play `0.2.0 (8)` and TestFlight `0.2.0 (6)` | Android payloads map to the historical build-8 bundle; iPad source mapping remains unknown. Neither channel check proves BLE or older-OS compatibility | | Firmware v0.6.1 is published on owner confirmation across five exact profiles | Pending automated results stay pending; no automatic PyBLE Ready badge | | Issue #24 is closed/superseded | Do not resurrect its old release umbrella as a dependency | -| S1 baseline draft was volatile; [ADR-0048](../../decisions/0048-bounded-current-text-draft-recovery.md) now has a bounded candidate implementation | Complete applicable recovery acceptance; full project persistence and Blocks graph recovery remain carried | +| S1 baseline draft was volatile; [ADR-0048](../../decisions/0048-bounded-current-text-draft-recovery.md) now has an accepted bounded recovery increment | M-02 acceptance is recorded on 31 October; full project persistence and Blocks graph recovery remain carried | | Lifecycle protections, tutorials, imports, and test tools already exist | Reuse them; refine only observed gaps and the documented persistence gap | ## Applying Scrum to PyBLE @@ -140,7 +140,7 @@ When facts or priority change, update the canonical file above and its dependent | Source | Use and precedence | |---|---| -| [Strategy revision 1.7](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md) | Scope, targets, six-Sprint capacity, three outcomes, Ready program and conditional horizons | +| [Strategy revision 1.8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md) | Scope, targets, six-Sprint capacity, three outcomes, Ready program and conditional horizons | | [Public roadmap](../../ROADMAP.md), [README](../../../README.md) | Current capability and distribution baseline | | [App specification](../../specifications/App/specs.md), [App TDD](../../specifications/App/TDD.md), [ADR-0010](../../decisions/0010-working-loop-in-memory-document.md) | Persistence contract and recorded implementation deviation; consult frozen working-loop scope | | [Firmware roadmap](../../planning/firmware-v0.6.1-v0.7.0-roadmap.md), [PBLE/1](../../specifications/protocol.md) | v0.7 proposals versus frozen wire behavior; old v0.6.1 publication/#24 wording is historical | diff --git a/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md b/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md index 44e6091f..eafa16b0 100644 --- a/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md +++ b/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md @@ -5,15 +5,15 @@ | Control | Value | |---|---| -| Status | C1-S1 has six tasks Done, two Prepared awaiting pilot setup and four Awaiting evidence; existing channel installations verified. Future direction remains conditional and forecasts need revision after sizing | +| Status | C1-S1 remains partial; bounded recovery and app-only qualification pass 31 October engineering review. Next release work is final integration and M-05 delivery; pilot/capacity inputs remain outstanding | | Planning date | 25 September 2026; dates use Asia/Bangkok | -| Source | [Implementation strategy revision 1.7](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), particularly §§1, 6–9, 12, 14, and 19 | +| Source | [Implementation strategy revision 1.8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), particularly §§1, 6–9, 12, 14, and 19 | | Inspected baseline | `main` at `23ed764b0ef88dce9720c66fbd1c0655268860cf` | | First cycle | C1: 28 September–20 December 2026; later horizons conditional through September 2028 | | Planning authority | Product Owner orders the Product Backlog; Developers forecast feasible work during Sprint Planning; names and capacity remain unassigned | | Related documents | [Framework](01_Overview_and_Scrum_Framework.md), [milestones](03_Milestones.md), [Sprint Plan](04_Sprint_Plan.md), [stories](05_Product_Backlog_and_Stories.md), [Sprint Backlogs](06_Sprint_Backlogs.md) | -**31 October continuation update:** the `0.3.0+9` recovery baseline merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40). Physical qualification exposed three keyboard defects; their repairs at `bef67bd` pass 984 ordinary tests and all 36 PR #41 checks. iPad recovery, final keyboard regressions and all five iPad app-only board rows pass with declared source/firmware scope. Earlier Android recovery and board rows pass, but a later final-candidate Blocks startup observation remains under investigation. Signed packages and a channel packet are prepared; admission and actual store delivery remain separate. The [C1-S2 record](c1-s2/00_Execution_Record.md) binds the evidence. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records unresolved capacity inputs. +**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. Final branch integration and actual M-05 store delivery remain separate. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. ## Product Goal and decision principle @@ -49,7 +49,7 @@ team capacity or a completed formal Sprint. | Existing workflow | PBLE/1 editing, files, run/stop, console, Blocks, tutorials, and reviewed import already exist | Reuse implementation and tests; improve measured failures rather than rebuild the workflow | | Firmware v0.6.1 | Owner-confirmed publication for five exact profiles; incomplete automated evidence remains visible | New qualification and compatibility claims require their own applicable evidence | | Historical issue #24 | Closed as superseded; incomplete checklist was not declared passed | Do not recreate closure as a new dependency or treat historical closure as qualification | -| Durable drafts | Bounded current-text recovery now has candidate source under ADR-0048; required acceptance remains unfinished | Complete integrated/physical evidence for PYB-006.2; retain broader A-24/Blocks scope | +| Durable drafts | Bounded current-text recovery under ADR-0048 passes scoped engineering acceptance on 31 October | Deliver the qualified candidate through the selected channels; retain broader A-24/Blocks scope | | Adoption and Ready | No measured cohort results or awarded PyBLE Ready badge established by the strategy | Treat outcome targets and badge eligibility as proposals requiring evidence | The [Android publication review](../../testing/website/android-open-testing-2026-09-25.md) @@ -61,7 +61,8 @@ That proposal still informs conditional Reliable Projects scope and compatibilit The windows are sequencing forecasts measured from the proposed cycle start. Overlapping windows permit options; they do not create simultaneous commitments -for one maintainer. All rows in this table have status **Proposed**. +for one maintainer. The horizons remain proposals; the dated acceptance above records completed +bounded work inside H1 without declaring that whole horizon complete. | Horizon / indicative window | Outcome and user value | Planning items / milestone | Admission and dependency | Evidence for continuation | |---|---|---|---|---| diff --git a/docs/developments/2026-q4-reliable-workflow/03_Milestones.md b/docs/developments/2026-q4-reliable-workflow/03_Milestones.md index 6e6c1951..fe212de2 100644 --- a/docs/developments/2026-q4-reliable-workflow/03_Milestones.md +++ b/docs/developments/2026-q4-reliable-workflow/03_Milestones.md @@ -5,14 +5,14 @@ | Control | Value | |---|---| -| Status | M-01/SG0 remains Blocked on 25 September by pilot ownership/cohort/setup and capacity decisions; existing channel installations verified on retry. M-02 is in progress in the 31 October candidate with acceptance pending; M-04/M-05 artifact and distribution preparation is underway, with admission and channel delivery still pending; forecast windows need replanning | +| Status | M-01/SG0 remains Blocked on 25 September by pilot ownership/cohort/setup and capacity decisions; existing channel installations verified on retry. M-02 and scoped app-only M-04 pass 31 October engineering review; device closeout is complete, while final integration and M-05 channel delivery remain pending; forecast windows need replanning | | Planning date | 25 September 2026; dates use Asia/Bangkok | -| Source | [Implementation strategy revision 1.7](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), especially §§4, 8–10, 14, and 19 | +| Source | [Implementation strategy revision 1.8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), especially §§4, 8–10, 14, and 19 | | Inspected baseline | `main` at `23ed764b0ef88dce9720c66fbd1c0655268860cf` | | Related documents | [Framework](01_Overview_and_Scrum_Framework.md), [roadmap](02_Product_Roadmap.md), [Sprint Plan](04_Sprint_Plan.md), [stories](05_Product_Backlog_and_Stories.md), [Sprint Backlogs](06_Sprint_Backlogs.md) | | Meaning | Milestones describe inspectable outcomes and decision evidence; they are not additional Scrum events or promised releases | -**31 October continuation update:** the `0.3.0+9` recovery baseline merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40). Physical qualification exposed three keyboard defects; their repairs at `bef67bd` pass 984 ordinary tests and all 36 PR #41 checks. iPad recovery, final keyboard regressions and all five iPad app-only board rows pass with declared source/firmware scope. Earlier Android recovery and board rows pass, but a later final-candidate Blocks startup observation remains under investigation. Signed packages and a channel packet are prepared; admission and actual store delivery remain separate. The [C1-S2 record](c1-s2/00_Execution_Record.md) binds the evidence. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records unresolved capacity inputs. +**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. Final branch integration and actual M-05 store delivery remain separate. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. ## Assessment and evidence states @@ -47,13 +47,13 @@ no role in this table implies committed staffing or independent review. | ID / status | Outcome and value | Forecast window / stories | Dependencies and evidence | Assessment / accountable contribution | |---|---|---|---|---| | M-01 — Blocked (25 Sep) | Accepted baseline and bounded cycle scope make installation, pilot, and engineering decisions reproducible | C1-S1, 28 Sep–11 Oct; PYB-001/003/004, residual 002, sizing 006/009 | Dated channel/install/source mapping or explicit owned unknowns; one primary cohort/job; safe task/consent rules; initial observations or recruitment blocker; actual capacity; persistence and physical-matrix estimates | SG0: accept a bounded scope or record gaps; Product Owner with release, pilot, and Developers | -| M-02 — In progress; acceptance pending | A usable, bounded local-draft recovery increment protects accepted user work after interruption | C1-S2–C1-S3, 12 Oct–8 Nov; selected PYB-006 scope, supporting 009/008, observed 005 only if selected | Accepted App specification/TDD and ADR-0010 change; text/Blocks scope; persistence boundary; relaunch, interrupted-write, and corrupt-state scenarios; no implicit board overwrite/run; relevant regression and physical evidence | Review against the selected story acceptance criteria and Definition of Done; Developers with a named review path | +| M-02 — Pass (31 Oct; bounded scope) | A usable, bounded local-draft recovery increment protects accepted user work after interruption | C1-S2–C1-S3, 12 Oct–8 Nov; selected PYB-006 scope, supporting 009/008, observed 005 only if selected | Accepted App specification/TDD and ADR-0010 change; text/Blocks scope; persistence boundary; relaunch, interrupted-write, and corrupt-state scenarios; no implicit board overwrite/run; relevant regression and physical evidence | Review against the selected story acceptance criteria and Definition of Done; Developers with a named review path | | M-03 — Proposed | Observed first-use and meaningful second-task evidence explains activation and its largest obstacle | C1-S4, 9–22 Nov; PYB-004/011 and justified 005/012 | Safe recorded pilot setup; at least 12 eligible primary-cohort task starts, all outcomes retained; successful unassisted timing; Task C attempts, prior workflow, assistance and reasons | SG2: assess provisional completion/timing targets and severe failures; pilot lead supplies evidence, Product Owner records next investment | -| M-04 — In progress; admission pending | A frozen maintenance candidate is qualified for its declared release scope | Normally C1-S5, 23 Nov–6 Dec; PYB-008/009/013 and included fixes | Applicable exact-artifact matrix and normative gates pass; provenance/recovery/instructions; no unresolved release-blocking data-loss, unintended/cross-session write, or critical workflow regression within the accepted threat model | SG1: release or submission decision with required sign-off; release owner and QA/review path | +| M-04 — Engineering pass (31 Oct; app-only scope) | A frozen maintenance candidate is qualified for its declared release scope | Normally C1-S5, 23 Nov–6 Dec; PYB-008/009/013 and included fixes | Applicable exact-artifact matrix and normative gates pass; provenance/recovery/instructions; no unresolved release-blocking data-loss, unintended/cross-session write, or critical workflow regression within the accepted threat model | SG1: release or submission decision with required sign-off; release owner and QA/review path | | M-05 — Preparation in progress; delivery pending | Users can obtain the selected qualified app build through a verified existing channel | C1-S5–C1-S6, 23 Nov–20 Dec; PYB-014 and residual 002 | M-04; distribution-owner access; separate submission, availability, installed build/provenance, and installation outcome records; current user-facing claims | Verified-channel milestone passes only for the stated evidence; store delays are recorded as blockers; release owner | | M-06 — Proposed | Useful-repeat and support evidence drives one explicit next-stage investment | C1-S6, 7–20 Dec; PYB-011 follow-up, cycle review; Ready inputs only if selected | Mature consented cohort accounting, useful Task C/return outcomes, task opportunity, prompting, missing responses, support burden, and status of candidate/channel evidence; retain blocked outcomes | SG3 assessment plus dated continue/narrow/pause-expansion decision; Product Owner with pilot and Developers | -[C1-S1 evidence](c1-s1/00_Execution_Record.md) includes the ledger, pilot protocol, recovery contract, cost model and verified existing Play/TestFlight installations. Six tasks are Done, two are Prepared awaiting pilot setup and four await participant/observation evidence. Human ownership, cohort/setup and actual capacity remain unconfirmed, so M-01/SG0 remains blocked. Missing participants are recorded as a recruitment gap, not completed observations. Current-build verification does not pass M-05 for a future qualified update. M-02's S2–S3 window is the original baseline; a sized S2–S4 option now requires explicit replanning, with downstream matrix/recruitment dates reviewed together. +[C1-S1 evidence](c1-s1/00_Execution_Record.md) includes the ledger, pilot protocol, recovery contract, cost model and verified existing Play/TestFlight installations. Six tasks are Done, two are Prepared awaiting pilot setup and four await participant/observation evidence. Human ownership, cohort/setup and actual capacity remain unconfirmed, so M-01/SG0 remains blocked. Missing participants are recorded as a recruitment gap, not completed observations. Current-build verification does not pass M-05 for a future qualified update. M-02's S2–S3 window and the conditional S2–S4 sizing option remain historical forecasts. Acceptance occurred during the 31 October continuation; replan remaining distribution and recruitment with actual capacity. M-04 may occur in any Sprint once a maintenance candidate qualifies. M-03 and M-06 do not block it. M-06 can assess learning and choose a narrower next step diff --git a/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md b/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md index 059b6c58..972c862a 100644 --- a/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md +++ b/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md @@ -5,14 +5,14 @@ | Field | Value | |---|---| -| Status | C1-S1 remains partial; bounded S2 candidate merged 31 October with physical acceptance pending. Original S2–S6 dates/hours remain baseline forecasts requiring capacity reconciliation | +| Status | C1-S1 remains partial; bounded S2 recovery and app-only qualification pass 31 October engineering review. S2 follow-up and M-05 delivery remain unfinished; original dates/hours remain baseline forecasts | | Cycle | `C1`, 28 September–20 December 2026, Asia/Bangkok | -| Basis | [Strategy revision 1.7, §8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md#8-twelve-week-implementation-schedule) | +| Basis | [Strategy revision 1.8, §8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md#8-twelve-week-implementation-schedule) | | Product Goal and quality rules | [Working agreement](01_Overview_and_Scrum_Framework.md) | | Acceptance criteria | [Product backlog and stories](05_Product_Backlog_and_Stories.md) | | Task-level proposal | [Sprint backlogs](06_Sprint_Backlogs.md) | -**31 October continuation update:** the `0.3.0+9` recovery baseline merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40). Physical qualification exposed three keyboard defects; their repairs at `bef67bd` pass 984 ordinary tests and all 36 PR #41 checks. iPad recovery, final keyboard regressions and all five iPad app-only board rows pass with declared source/firmware scope. Earlier Android recovery and board rows pass, but a later final-candidate Blocks startup observation remains under investigation. Signed packages and a channel packet are prepared; admission and actual store delivery remain separate. The [C1-S2 record](c1-s2/00_Execution_Record.md) binds the evidence. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records unresolved capacity inputs. +**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. Final branch integration and actual M-05 store delivery remain separate. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. ## Forecast and commitment boundary @@ -64,9 +64,9 @@ measured velocity or a new delivery deadline. The original C1-S3 window is | Order / stream | Current work and completion evidence | Forecast treatment | |---|---|---| -| 1 — M-02 recovery acceptance | Complete remaining representative iPad/Android recovery, current-board consent and Blocks-to-Editor checks; reconcile DR-T01–14 against exact artifacts and review the result | Selected now; record actual duration and residual scenarios before forecasting completion | -| 2 — M-04 release qualification | Freeze the selected app artifacts and complete the applicable five-profile × two-platform affected app matrix, provenance and release review | Follows accepted recovery behavior; unchanged firmware does not automatically require fresh firmware-release qualification | -| 3 — M-05 distribution | Prepare the existing Play/TestFlight handoffs; submit only an admitted candidate; record processing/availability and installed-channel evidence separately | Preparation can overlap qualification; external access/review duration is unresolved | +| 1 — M-02 recovery acceptance | Accepted: DR-T01–14 reviewed against automated and exact platform evidence, including generated text and current-target consent | Completed outcome on 31 October; no measured human effort inferred from agent execution | +| 2 — M-04 release qualification | Engineering pass: frozen `bef67bd` artifacts, ten declared app/profile rows, packaging and scoped review; device closeout complete; branch integration tracked separately | This outcome covers the same later forecast batches; do not repeat them without a changed artifact or invalidated evidence | +| 3 — M-05 distribution | Prepared handoffs; verify account/build-number state, submit the admitted artifact after final integration, then record processing/availability and installed-channel evidence | Next release stage; owner access and external review duration remain unresolved | | Parallel — M-01 pilot baseline | Confirm pilot owner, primary cohort, exact reference setup and actual weekly capacity; collect real consented baseline sessions using the prepared kit | Awaiting human inputs; engineering observations are not participant starts | | Later — M-03/M-06 learning | Collect useful-task and prospective day-7–14 follow-up observations from actual consenting activations | Preserve original recruitment targets; reforecast dates after real recruitment and capacity are known | | Conditional — Ready rehearsal | Use an assigned second operator for one exact profile only after capacity is selected | Remains optional; it is not a prerequisite for unrelated maintenance delivery | diff --git a/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md b/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md index 0edd695a..a63ea6d0 100644 --- a/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md +++ b/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md @@ -6,14 +6,14 @@ | Control | Value | |---|---| | Product Goal | Make the existing tablet workflow trustworthy enough for useful repeat tasks by the selected primary audience | -| Source | [Implementation strategy revision 1.7](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), initially derived 25 September; reconciled 31 October 2026 | +| Source | [Implementation strategy revision 1.8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), initially derived 25 September; reconciled 31 October 2026 | | Cycle | Proposed 28 September–20 December 2026; Asia/Bangkok | | Baseline | `23ed764b0ef88dce9720c66fbd1c0655268860cf`; completed publication work is evidence, not a new commitment | -| Status | C1-S1: PYB-001.1/.2 and PYB-006.1 scoped work Done; pilot preparation awaits setup, observation work awaits evidence, PYB-009.1 partial; PYB-006.2 source merged and automated checks passing; physical acceptance pending; later work remains forecast | +| Status | C1-S1: PYB-001.1/.2 and PYB-006.1 scoped work Done; pilot preparation awaits setup and observation work awaits evidence. PYB-006.2/M-02, scoped 008/009 and app-only M-04 pass engineering review; final integration and M-05 delivery remain separate | | Accountabilities | Product Owner orders the backlog; Developers size and select work in Sprint Planning; named people and capacity remain to be assigned | | Navigation | [Overview and Scrum](01_Overview_and_Scrum_Framework.md) · [Roadmap](02_Product_Roadmap.md) · [Milestones](03_Milestones.md) · [Sprint plan](04_Sprint_Plan.md) · [Sprint Backlogs](06_Sprint_Backlogs.md) | -**31 October continuation update:** the `0.3.0+9` recovery baseline merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40). Physical qualification exposed three keyboard defects; their repairs at `bef67bd` pass 984 ordinary tests and all 36 PR #41 checks. iPad recovery, final keyboard regressions and all five iPad app-only board rows pass with declared source/firmware scope. Earlier Android recovery and board rows pass, but a later final-candidate Blocks startup observation remains under investigation. Signed packages and a channel packet are prepared; admission and actual store delivery remain separate. The [C1-S2 record](c1-s2/00_Execution_Record.md) binds the evidence. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records unresolved capacity inputs. +**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. Final branch integration and actual M-05 store delivery remain separate. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. ## 1. How to use this backlog @@ -38,13 +38,13 @@ | — | PYB-002 / P0 accuracy | Keep maintained availability claims correct | 002.1: public TestFlight description | PR #33 Android correction complete; residual found during 001 | Correction packet prepared; actual store update/public verification pending | | 2 | PYB-003 / P0 | Conduct a safe, consented pilot with bounded data collection | 003.1 | C1-S1; 001 informs setup | Prepared — awaiting pilot setup and named collection decision | | 3 | PYB-004 / P0 | Observe one reachable audience completing reproducible, useful tasks | 004.1, 004.2 | C1-S1; 001, 003 | 004.1 Prepared — awaiting cohort/setup; 004.2 Awaiting participant evidence | -| 4 | PYB-006 / P0 | Recover the current text draft after process restart | 006.1, 006.2 | Sized in C1-S1; S2–S4 working option requires replanning; known defect does not wait for recruitment | 006.1 Done; 006.2 source merged, automated checks passing, physical acceptance pending | -| 5 | PYB-009 / P0 | Make existing validation reproducible by an operator | 009.1; optional 009.2 | Inventory C1-S1, scoped recipe C1-S2; reproduction only with assigned capacity | T12 Done; 009.1 remains partial | +| 4 | PYB-006 / P0 | Recover the current text draft after process restart | 006.1, 006.2 | Sized in C1-S1; S2–S4 working option requires replanning; known defect does not wait for recruitment | 006.1 and bounded 006.2 Done; M-02 acceptance recorded 31 October; broader A-24 remains carried | +| 5 | PYB-009 / P0 | Make existing validation reproducible by an operator | 009.1; optional 009.2 | Inventory C1-S1, scoped recipe C1-S2; reproduction only with assigned capacity | 009.1 Done for inventory and executed/reviewed scoped recipe; optional 009.2 reproduction remains pending | | 6 | PYB-005 / P0 if observed | Remove a demonstrated first-use blocker | 005.1 | C1-S2 candidate; actual 004 findings | Conditional; no defect invented | -| 7 | PYB-008 / P0 for claims | Establish the exact candidate's applicable compatibility evidence | 008.1, 008.2 | Representative checks C1-S2; staged matrix C1-S3–S5; 001, 009.1, artifacts | 008.1 representative observations in progress; 008.2 complete affected app matrix and release review remain pending | +| 7 | PYB-008 / P0 for claims | Establish the exact candidate's applicable compatibility evidence | 008.1, 008.2 | Representative checks C1-S2; staged matrix C1-S3–S5; 001, 009.1, artifacts | 008.1/.2 Done for the declared app-only matrix; exact candidate/firmware/OEM-condition limits retained | | 8 | PYB-011 / P0 usability | Understand useful first and repeat tasks in the primary cohort | 011.1, 011.2 | Main activation collection C1-S3–S4; rolling follow-up from the first consented activation through C1-S6; 003, 004, recorded tested setup | Proposed; recruitment and follow-up are not assumed | | 9 | PYB-012 / P0 if severe | Resolve the highest-impact observed failure | 012.1 | C1-S4 candidate or earlier when evidence warrants | Conditional; reorder promptly when a real severe failure appears | -| 10 | PYB-013 / P0 release | Make a candidate-specific release decision with applicable evidence | 013.1 | C1-S5 forecast; applicable 008/009 and included fixes | In progress: production artifacts and release packet prepared; candidate-specific qualification and admission pending | +| 10 | PYB-013 / P0 release | Make a candidate-specific release decision with applicable evidence | 013.1 | C1-S5 forecast; applicable 008/009 and included fixes | Done for scoped engineering admission; device closeout complete; final integration and account checks precede submission | | 11 | PYB-014 / P0 when ready | Make the qualified app build installable through the selected existing channel | 014.1, 014.2 | C1-S5 submission/C1-S6 verification forecast; 013 and owner access | Preparation in progress; store-account build history, upload, processing and installed-channel verification remain pending | | 12 | PYB-007 / P1 | Share a previewed, privacy-preserving support record | 007.1 | Optional capacity; 003 and approved export contract | Proposed; manual template is the base fallback | | 13 | PYB-010 / P1 | Read accurate setup and recovery guidance in Simplified Chinese | 010.1 | Optional capacity and named language reviewer | Proposed | @@ -62,8 +62,8 @@ The completed portion of PYB-002 is [PR #33](https://github.com/PyBLE-dev/PyBLE/ | PYB-002.1 | Prepared; store correction pending | Public TestFlight description remains discrepant; build-6 minimum-OS metadata also needs distribution-owner review. No claim of external mutation | | PYB-003.1 / PYB-004.1 | Prepared — awaiting pilot setup | [Pilot kit](c1-s1/02_Pilot_Protocol_and_Observation_Kit.md); technical review completed, but human owner, reachable cohort, tested board setup and collection decision remain missing | | PYB-004.2 / PYB-011.2 | Awaiting participant/observation evidence | T06–T08 await participant sessions; T09 awaits their records. Five baseline starts and all later follow-up remain outstanding | -| PYB-006.1 | Done for design/review/sizing | [Contract and review](c1-s1/03_Recovery_Design_and_Sizing.md); PYB-006.2 was subsequently merged in PR #40; physical acceptance remains pending under the dated S2 record | -| PYB-009.1 | Partial | T12 [inventory/cost model](c1-s1/04_Validation_Inventory_and_Operator_Recipe.md) complete; S2 scoped procedure prepared; candidate execution/reconciliation is tracked in the S2 record | +| PYB-006.1 | Done for design/review/sizing | [Contract and review](c1-s1/03_Recovery_Design_and_Sizing.md); PYB-006.2 was subsequently merged in PR #40 and accepted in the dated 31 October S2 continuation | +| PYB-009.1 | Done after 31 October continuation | T12 [inventory/cost model](c1-s1/04_Validation_Inventory_and_Operator_Recipe.md) and executed/reviewed S2 recipe complete; independent reproduction remains optional 009.2 | The ordered table above retains original priorities and forecast labels. It is not evidence that all proposed dates remain feasible after the recovery estimate; use the [reforecast requirements](04_Sprint_Plan.md#c1-s1-findings-and-required-reforecast) before selecting future work. diff --git a/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md b/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md index 48e385d3..7b701ac1 100644 --- a/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md +++ b/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md @@ -5,7 +5,7 @@ | Field | Rule | |---|---| -| Status | C1-S1: six Done, two Prepared, four Awaiting evidence. C1-S2 candidate source is merged and automated checks pass; required physical acceptance remains pending on 31 October. Original allowances/calendar remain baseline; later work requires replanning | +| Status | C1-S1: six Done, two Prepared, four Awaiting evidence. C1-S2: ten engineering tasks Done, T11 Awaiting participant evidence. M-02 and app-only M-04 accepted 31 October; final integration and M-05 delivery pending. Original allowances/calendar remain historical | | Product/Sprint Goals | [Framework](01_Overview_and_Scrum_Framework.md) and [Sprint plan](04_Sprint_Plan.md) | | Acceptance authority | [Product backlog and stories](05_Product_Backlog_and_Stories.md); task completion never overrides a parent story's acceptance criteria | | Selection | Developers confirm scope, ownership, estimates and task plan at each Sprint Planning | @@ -20,7 +20,7 @@ The initial tasks are small planning units, generally 1–4 hours. If a task or Record optional follow-up consent and the prospective day-7–14 window at each activation. Collect follow-up as windows arrive, starting with the first cohort; do not postpone early cohorts until S5. S1 observation allowances include any follow-up due within S1; S2-T11, S3-T10 and later follow-up rows continue it. Developers must reallocate headroom or other selected work if actual pilot effort exceeds these allowances, preserving required recovery review and tests. Record missed windows as missing/late evidence rather than reconstructing an on-time response. -**31 October continuation update:** the `0.3.0+9` recovery baseline merged in [PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40). Physical qualification exposed three keyboard defects; their repairs at `bef67bd` pass 984 ordinary tests and all 36 PR #41 checks. iPad recovery, final keyboard regressions and all five iPad app-only board rows pass with declared source/firmware scope. Earlier Android recovery and board rows pass, but a later final-candidate Blocks startup observation remains under investigation. Signed packages and a channel packet are prepared; admission and actual store delivery remain separate. The [C1-S2 record](c1-s2/00_Execution_Record.md) binds the evidence. S1 remains six Done / two Prepared / four Awaiting evidence. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records unresolved capacity inputs. +**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. Final branch integration and actual M-05 store delivery remain separate. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. ## C1-S1 — reproduce the current workflow and size recovery @@ -64,23 +64,24 @@ Five baseline starts is a target, not the implied result of reserving six hours. | Task ID | Parent child item | Proposed task and expected output | Dependency | Contribution role | h | Status | |---|---|---|---|---|---:|---| -| C1-S2-T01 | PYB-009.1 | Complete the scoped restart/setup/operator recipe and expected evidence for this increment | 006.1 scope; initial 009.1 inventory | QA + App | 2 | Prepared — scoped recipe; execution/reproduction pending | -| C1-S2-T02 | PYB-006.2 | Add meaningful failing tests for the accepted write boundary, relaunch recovery and absence of implicit board/network actions | Approved 006.1; specification-first sequence | App | 2 | Implemented and checked — integrated suite and CI pass | -| C1-S2-T03 | PYB-006.2 | Add failing tests for interrupted/corrupt/full local storage and stale completions against newer edits | Approved 006.1 | App | 2 | Implemented and checked — integrated failure/race suite and CI pass | -| C1-S2-T04 | PYB-006.2 | Implement the minimal accepted durable storage/migration behavior until relevant tests pass | T02/T03 red evidence | App | 4 | Implemented — candidate storage; acceptance pending | -| C1-S2-T05 | PYB-006.2 | Implement hydration and specified recovery/discard behavior through existing providers | T04 and accepted UI contract | App | 4 | Implemented — candidate coordinator/UI; acceptance pending | -| C1-S2-T06 | PYB-006.2 | Complete non-destructive error handling, truthful scope and localized recovery guidance | T04/T05 | App | 2 | Implemented — candidate guidance/errors; acceptance pending | -| C1-S2-T07 | PYB-006.2 | Run affected controller/widget/lifecycle regressions and repository gates; resolve scoped failures | T04–T06 | App + QA | 2 | Implemented and checked — 984 guide-correction ordinary tests; all 36 PR #41 checks pass at `bef67bd`, including pinned goldens/native WebView | -| C1-S2-T08 | PYB-008.1 | Run representative Android restart/interruption scenarios on the recorded candidate; retain actual results | T01/T07; device/candidate | QA | 2 | Earlier Android continuation recorded — five Q rows pass on stated sources; final-candidate Blocks startup failure under investigation | -| C1-S2-T09 | PYB-008.1 | Run representative iPad restart/interruption scenarios on the recorded candidate; retain actual results | T01/T07; device/candidate | QA | 2 | Physical execution complete — offline Restore, target consent, generated-text, final palette regression and all five iPad Q rows pass with recorded source limits; integrated review pending | -| C1-S2-T10 | PYB-006.2 | Review integration/evidence and update user guidance plus carried A-24/Blocks limitations | T07–T09 and all applicable acceptance | App + reviewer | 1 | In progress — integration review and evidence reconciliation | +| C1-S2-T01 | PYB-009.1 | Complete the scoped restart/setup/operator recipe and expected evidence for this increment | 006.1 scope; initial 009.1 inventory | QA + App | 2 | Done — scoped recipe executed, corrected and reviewed; independent reproduction is optional 009.2 | +| C1-S2-T02 | PYB-006.2 | Add meaningful failing tests for the accepted write boundary, relaunch recovery and absence of implicit board/network actions | Approved 006.1; specification-first sequence | App | 2 | Done — meaningful red/green tests and integrated regression pass | +| C1-S2-T03 | PYB-006.2 | Add failing tests for interrupted/corrupt/full local storage and stale completions against newer edits | Approved 006.1 | App | 2 | Done — required fault/interruption/stale-work oracles pass | +| C1-S2-T04 | PYB-006.2 | Implement the minimal accepted durable storage/migration behavior until relevant tests pass | T02/T03 red evidence | App | 4 | Done — durable storage/schema and both native restart baselines accepted | +| C1-S2-T05 | PYB-006.2 | Implement hydration and specified recovery/discard behavior through existing providers | T04 and accepted UI contract | App | 4 | Done — startup choices and normal-app recovery accepted | +| C1-S2-T06 | PYB-006.2 | Complete non-destructive error handling, truthful scope and localized recovery guidance | T04/T05 | App | 2 | Done — guidance/error/localization and required scoped evidence accepted | +| C1-S2-T07 | PYB-006.2 | Run affected controller/widget/lifecycle regressions and repository gates; resolve scoped failures | T04–T06 | App + QA | 2 | Done — 984 ordinary tests and 36 frozen-runtime CI checks pass; final branch integration separate | +| C1-S2-T08 | PYB-008.1 | Run representative Android restart/interruption scenarios on the recorded candidate; retain actual results | T01/T07; device/candidate | QA | 2 | Done — Android recovery, final affected checks and declared Q rows accepted with OEM test condition | +| C1-S2-T09 | PYB-008.1 | Run representative iPad restart/interruption scenarios on the recorded candidate; retain actual results | T01/T07; device/candidate | QA | 2 | Done — iPad recovery, final palette regression and declared Q rows accepted | +| C1-S2-T10 | PYB-006.2 | Review integration/evidence and update user guidance plus carried A-24/Blocks limitations | T07–T09 and all applicable acceptance | App + reviewer | 1 | Done — scoped engineering review and device closeout; final branch integration tracked separately | | C1-S2-T11 | PYB-011.2 | Collect due consented follow-up and account for early windows, missing responses and task opportunity | 004 prospective method; actual activation dates | Pilot | 1 | Awaiting participant evidence — no activation dates supplied | | **C1-S2 total** | | | | | **24** | | These allowances do not assert that persistence fits 24 hours. Developers must confirm the estimate or change the forecast at Planning. Required corruption/recovery protections remain part of the usable slice. Representative runs cannot complete the whole five-profile release matrix. -Current S2 task states are source/evidence progress, not additional Done -increments. [The S2 record](c1-s2/00_Execution_Record.md) supplies current proof; +The bounded recovery increment and its supporting engineering tasks are +accepted and device closeout is complete. T11 remains unfinished, +so the whole S2 Sprint is not Done. [The S2 record](c1-s2/00_Execution_Record.md) supplies current proof; [the scoped recipe](c1-s2/01_Operator_Recipe.md) keeps physical steps and expected oracles explicit. Missing participants are not technical test failures and have not been replaced by maintainer or automated sessions. @@ -97,19 +98,21 @@ not been replaced by maintainer or automated sessions. | Task ID | Parent child item | Proposed task and expected output | Dependency | Contribution role | h | Status | |---|---|---|---|---|---:|---| -| C1-S3-T01 | PYB-008.1 | Bind candidate/build/provenance and safe setup to the selected qualification plan | 001; 009.1; candidate available | QA + release | 2 | Proposed | -| C1-S3-T02 | PYB-008.2 | Execute the first costed batch of required profile/platform scenarios; retain results and defects | T01; exact devices; agreed batch | QA + firmware | 4 | Proposed | -| C1-S3-T03 | PYB-008.2 | Execute the next costed batch; preserve every required unrun row explicitly | T01; exact devices; agreed batch | QA + firmware | 4 | Proposed | -| C1-S3-T04 | PYB-008.2 | Execute the next risk-prioritized batch or affected rerun; record immutable evidence | T01; previous findings | QA + firmware | 4 | Proposed | +| C1-S3-T01 | PYB-008.1 | Bind candidate/build/provenance and safe setup to the selected qualification plan | 001; 009.1; candidate available | QA + release | 2 | Covered by 31 October continuation for the accepted candidate; original allowance retained | +| C1-S3-T02 | PYB-008.2 | Execute the first costed batch of required profile/platform scenarios; retain results and defects | T01; exact devices; agreed batch | QA + firmware | 4 | Covered by accepted app-only matrix; no duplicate execution or hours claimed | +| C1-S3-T03 | PYB-008.2 | Execute the next costed batch; preserve every required unrun row explicitly | T01; exact devices; agreed batch | QA + firmware | 4 | Covered by accepted app-only matrix; no duplicate execution or hours claimed | +| C1-S3-T04 | PYB-008.2 | Execute the next risk-prioritized batch or affected rerun; record immutable evidence | T01; previous findings | QA + firmware | 4 | Affected reruns completed in continuation; new source changes require new impact review | | C1-S3-T05 | PYB-011.1 | Observe a scheduled primary-cohort activation/Task C batch on a recorded tested setup | 003/004; participant access | Pilot | 2 | Proposed | | C1-S3-T06 | PYB-011.1 | Observe the next useful-task batch and reasons to choose another workflow or return | 003/004; participant access | Pilot | 2 | Proposed | | C1-S3-T07 | PYB-011.1 | Analyze task outcomes, assistance and comparable cohorts; reconcile activation records | T05/T06; existing observations | Pilot | 1 | Proposed | -| C1-S3-T08 | PYB-009.1 | Correct operator instructions and evidence index from actual execution | T02–T04 findings | QA | 2 | Proposed | -| C1-S3-T09 | PYB-008.2 | Review matrix states, blockers and remaining cost; determine which bounded claims are supported | T02–T04/T08 | QA + reviewer | 2 | Proposed | +| C1-S3-T08 | PYB-009.1 | Correct operator instructions and evidence index from actual execution | T02–T04 findings | QA | 2 | Covered by executed/reviewed recipe and evidence reconciliation | +| C1-S3-T09 | PYB-008.2 | Review matrix states, blockers and remaining cost; determine which bounded claims are supported | T02–T04/T08 | QA + reviewer | 2 | Covered by scoped 31 October engineering review; limitations retained | | C1-S3-T10 | PYB-011.2 | Collect rolling follow-up in each due window and account for missing responses/opportunity | Consented activation records; prospective method | Pilot | 1 | Proposed | | **C1-S3 total** | | | | | **24** | | -At Planning, map each batch to exact rows among `esp32-4mb`, `esp32-s3-n16r8`, `waveshare-esp32-s3-lcd-147b`, `esp32-c3-4mb`, and `rpi-pico2-w`, on iPadOS and Android as required. The twelve-hour execution allowance is not a prediction that all ten combinations and every normative repetition fit. Completing a batch is not completing PYB-008.2 while required rows remain unrun or failing. +The original batch allowances above are not additional work or measured hours +for the already-accepted candidate. At future Planning, map any newly required +batch to exact rows among `esp32-4mb`, `esp32-s3-n16r8`, `waveshare-esp32-s3-lcd-147b`, `esp32-c3-4mb`, and `rpi-pico2-w`, on iPadOS and Android as required. The twelve-hour execution allowance is not a prediction that all ten combinations and every normative repetition fit. Completing a batch is not completing PYB-008.2 while required rows remain unrun or failing. ## C1-S4 — improve the observed task and mature the cohort @@ -150,15 +153,15 @@ An analysis task can finish with fewer than 12 starts, but PYB-011.1 remains unf | Task ID | Parent child item | Proposed task and expected output | Dependency | Contribution role | h | Status | |---|---|---|---|---|---:|---| -| C1-S5-T01 | PYB-013.1 | Freeze candidate identity/included changes and map applicable release requirements | Selected source/increment; 001/009 evidence | Release + QA | 2 | Proposed | -| C1-S5-T02 | PYB-008.2 | Execute a costed remaining required matrix batch or invalidated-evidence rerun | T01; exact devices | QA + firmware | 4 | Proposed | -| C1-S5-T03 | PYB-008.2 | Execute the next required batch and retain outstanding rows honestly | T01; exact devices | QA + firmware | 4 | Proposed | -| C1-S5-T04 | PYB-008.2 | Complete applicable cross-version/affected regressions and review unresolved defects | T01; named baselines; prior findings | QA + App/firmware | 3 | Proposed | -| C1-S5-T05 | PYB-013.1 | Assemble immutable evidence index, limitations and accurate release notes | T02–T04 actual results; prior accepted evidence | Release | 3 | Proposed | -| C1-S5-T06 | PYB-013.1 | Review release admission and record sign-off or blocking conditions | T05/T09; all mandatory gates | Release + reviewer | 2 | Proposed | -| C1-S5-T07 | PYB-014.1 | If admitted and authorized, submit exact artifact to selected existing channel and retain receipt/state | T06 pass; owner access/authorization | Release | 2 | Proposed | +| C1-S5-T01 | PYB-013.1 | Freeze candidate identity/included changes and map applicable release requirements | Selected source/increment; 001/009 evidence | Release + QA | 2 | Covered by frozen candidate and prepared release record | +| C1-S5-T02 | PYB-008.2 | Execute a costed remaining required matrix batch or invalidated-evidence rerun | T01; exact devices | QA + firmware | 4 | Current candidate rows covered; rerun only invalidated or newly selected scope | +| C1-S5-T03 | PYB-008.2 | Execute the next required batch and retain outstanding rows honestly | T01; exact devices | QA + firmware | 4 | Current candidate rows covered; rerun only invalidated or newly selected scope | +| C1-S5-T04 | PYB-008.2 | Complete applicable cross-version/affected regressions and review unresolved defects | T01; named baselines; prior findings | QA + App/firmware | 3 | Covered by declared-baseline and affected-regression review | +| C1-S5-T05 | PYB-013.1 | Assemble immutable evidence index, limitations and accurate release notes | T02–T04 actual results; prior accepted evidence | Release | 3 | Prepared — exact artifacts, evidence index, limitations and release notes retained | +| C1-S5-T06 | PYB-013.1 | Review release admission and record sign-off or blocking conditions | T05/T09; all mandatory gates | Release + reviewer | 2 | Covered by scoped engineering admission and closeout; final integration separate | +| C1-S5-T07 | PYB-014.1 | If admitted and authorized, submit exact artifact to selected existing channel and retain receipt/state | T06 pass; owner access/authorization | Release | 2 | Pending — store-account/build-number verification and actual submission receipt | | C1-S5-T08 | PYB-011.2 | Collect follow-up in due windows and account for closed windows; label immature windows and missing responses | Consented activation records; agreed method | Pilot | 2 | Proposed | -| C1-S5-T09 | PYB-013.1 | Verify update/recovery instructions against selected artifacts and accepted scope | T01; current operator/distribution guide | Release + QA | 2 | Proposed | +| C1-S5-T09 | PYB-013.1 | Verify update/recovery instructions against selected artifacts and accepted scope | T01; current operator/distribution guide | Release + QA | 2 | Prepared for admitted scope; actual store-upgrade observations remain 014.2 | | **C1-S5 total** | | | | | **24** | | The required matrix may cost more than these batches. Use the S1/Planning estimate to revise the forecast before committing; a Sprint end never shortens normative tests. If release admission is blocked, T07 is not Done and submission does not proceed. Participants activated on 22 November mature on 6 December, after the proposed Friday Review; finalize that accounting in C1-S6 without inventing early results. @@ -175,7 +178,7 @@ The required matrix may cost more than these batches. Use the S1/Planning estima | Task ID | Parent child item | Proposed task and expected output | Dependency | Contribution role | h | Status | |---|---|---|---|---|---:|---| -| C1-S6-T01 | PYB-014.1 | Verify submission/processing/availability state and remaining distribution actions | 013 admission; submission/access as applicable | Release | 2 | Proposed | +| C1-S6-T01 | PYB-014.1 | Verify submission/processing/availability state and remaining distribution actions | 013 admission; submission/access as applicable | Release | 2 | Pending — account/build-number checks and actual submission/processing evidence | | C1-S6-T02 | PYB-014.2 | If Android is selected, verify eligible installation of its qualified candidate, installed build and applicable smoke behavior | Actual selected-candidate Android availability | Release + QA | 2 | Proposed | | C1-S6-T03 | PYB-014.2 | If iPad is selected, verify eligible installation of its qualified candidate, installed build/provenance and applicable smoke behavior | Actual selected-candidate TestFlight availability | Release + QA | 2 | Proposed | | C1-S6-T04 | PYB-014.2 | Reconcile user-facing installation/update/support guidance with actual channel outcomes | T01 and selected-channel T02/T03 results | Release + Docs | 2 | Proposed | @@ -183,7 +186,7 @@ The required matrix may cost more than these batches. Use the S1/Planning estima | C1-S6-T06 | PYB-011.2 | Analyze full mature denominator, useful returns, prompting, opportunity and missing data | T05 and earlier observations | Pilot | 3 | Proposed | | C1-S6-T07 | PYB-011.2 | Summarize task/support effort and reasons to choose or leave PyBLE | Observations and support records | Pilot + Developers | 2 | Proposed | | C1-S6-T08 | Cycle decision — strategy §19 | Prepare the evidence-based next-investment recommendation and proposed backlog order for Review | T06/T07; milestone states | Product Owner + Developers | 3 | Proposed | -| C1-S6-T09 | PYB-009.1 | Close the operator/evidence index with current limits and any explicitly funded Ready rehearsal status | Actual 008/009 records | QA | 2 | Proposed | +| C1-S6-T09 | PYB-009.1 | Close the operator/evidence index with current limits and any explicitly funded Ready rehearsal status | Actual 008/009 records | QA | 2 | Current engineering index reconciled; later channel/reproduction results remain to add | | **C1-S6 total** | | | | | **20** | | T08 prepares a product decision; the Sprint Review/Retrospective meetings remain within the event reserve. A closed observation record may report an inconclusive target. A blocked app installation is not a completed installation, even when its blocker is documented. diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md index 1a9a75af..58a0772f 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md @@ -11,7 +11,7 @@ | Candidate | App `0.3.0+9`; recovery baseline merged at `6f5b3ea`, landscape repair `e54a78a`, native dismissal `01a7ac8`, and guide correction `bef67bd` under PR #41; platform and release reports bind each actual artifact | | Scope | PYB-006.2 bounded current-text recovery; supporting PYB-009.1 recipe and applicable PYB-008.1 observations | | Contract | [Current-draft recovery](../../../specifications/App/current-draft-recovery.md), [ADR-0048](../../../decisions/0048-bounded-current-text-draft-recovery.md) | -| Overall state | Recovery baseline merged with passing post-merge CI; both native platform storage restart baselines and normal-app recovery observations retained. Latest guide-correction source passes 984 ordinary tests, rebuilt production packaging and the exact iPad palette regression. All five iPad Q rows pass with their declared source/baseline scope, and 36 PR #41 checks pass at `bef67bd`. A repeated final-candidate Android Blocks startup failure remains under investigation. PYB-006.2 and M-02 are not Done | +| Overall state | Scoped PYB-006.2 / M-02 and app-only M-04 pass engineering review at frozen runtime `bef67bd`: 984 ordinary tests, 36 runtime-head CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. Device policy, owned fixtures and normal board advertising are restored; final branch integration, M-05 channel delivery and S2 participant follow-up remain unfinished | | S1 state | Unchanged: six Done, two Prepared, four Awaiting evidence; M-01/SG0 and pilot work remain unfinished | | Capacity/calendar | Original S2 allowance 24h and 12–25 October dates remain historical forecasts. The 45–72h estimate / 60h S2–S4 option is not measured effort or confirmed human capacity | | Method | Separate storage, coordinator and UI Git worktrees; root integrates board/session guards, regressions, release records and qualification attempts | @@ -38,7 +38,7 @@ acknowledgement is not a claim that dismissal occurred. That revision's app tree It passes 978 ordinary tests, including 28 shell tests and one platform-fallback test, clean analysis/source gates, and Android/iOS native builds. Android's physical rerun observes the keyboard hide and console expand while retaining -field text; the iPad result remains separately tracked. Signed production +field text; the final iPad continuation is recorded below. Signed production artifacts were rebuilt and passed the packaging and repeated 16 KiB runtime checks in the release report. A subsequent iPad keyboard-palette Hide→Show transition left the docked keyboard covering the console Expand control while @@ -53,8 +53,8 @@ scope; no M-02/M-04 acceptance follows from packaging alone. | Workstream | Evidence authority | Current disposition | |---|---|---| | iPad normal workflow | [iPad acceptance continuation](04_iPad_Acceptance.md) | Normal Preview passes offline Unicode Restore/current-board consent at `e54a78a`, generated-text handoff/recovery at `01a7ac8`, and Editor/native Blocks palette Hide→Show/dismissal at `bef67bd`; exact text and usable viewports are retained. All five iPad Q rows pass on their recorded candidates; exact firmware baselines and unchanged-behavior impact assessment remain explicit | -| Android normal workflow | [Android acceptance continuation](05_Android_Acceptance.md) | Recorded `01a7ac8` P01–P15 scope and five Android Q rows pass with stated earlier-profile/accessibility limits. A repeated Blocks startup watchdog on the subsequent final-candidate attempt is under investigation; earlier passes do not close that admission issue | -| Production artifacts and channel packet | [Release readiness](06_Release_Readiness.md) | Current `bef67bd` signed Android/iOS artifacts pass packaging and repeated 16 KiB Android startup/storage checks. Earlier artifacts are historical; physical acceptance, release admission and channel delivery remain separately tracked | +| Android normal workflow | [Android acceptance continuation](05_Android_Acceptance.md) | Recorded P01–P15 scope and all five Q rows pass with explicit earlier-source/accessibility limits. Final `bef67bd` normal profile `945e9746…` passes Editor/native Blocks keyboard checks and generated-text/offline recovery after actual launcher start under temporary qualifier-only Unrestricted battery policy; original watchdogs and the policy condition remain recorded | +| Production artifacts and channel packet | [Release readiness](06_Release_Readiness.md) | Current `bef67bd` signed Android/iOS artifacts pass packaging and repeated 16 KiB Android startup/storage checks. Earlier artifacts are historical; scoped engineering acceptance is recorded below, with device closeout complete and final integration/actual channel delivery separate | | Pilot and capacity | [Pilot kit](../c1-s1/02_Pilot_Protocol_and_Observation_Kit.md) and [continuation order](../04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) | Human owner/cohort/setup/capacity and actual consented sessions remain pending | The subsequent guide correction is integrated at @@ -74,9 +74,18 @@ also pass. The exact iPad Editor and native Blocks palette Hide→Show transitio on `bef67bd`: Expand stays above the keyboard and is hittable, dismissal restores the available viewport, and exact text/Blocks field state are retained. Native screenshots and accessibility frames agree. A subsequent Lenovo -final-candidate run also repeatedly reached the Blocks startup watchdog. Its -investigation remains open; the preceding successful Android observations are -retained with their actual source and artifact scope. +final-candidate run repeatedly reached the Blocks startup watchdog. Retained +OS traces show suppressed renderer-service startup. A same-UID native control +and the normal final profile then load under the explicitly recorded +qualifier-only Unrestricted battery condition; the normal run uses the actual +launcher icon. Its Hello example, native-field keyboard dismissal, guarded +generated-text handoff, acknowledged checkpoint, both-radios-off process +relaunch, exact local Restore and current-target Save/Run cancellation pass. +An early helper incorrectly expected an enabled Preview action in an empty +workspace; the retained hierarchy already showed a valid workspace and Browse +examples. That selector failure is distinct from the genuine earlier watchdogs. +No app startup patch, general production-package failure or universal battery +workaround is claimed. Earlier rows retain their actual source/artifact scope. After artifact freeze, `ef19773` corrects four explanatory comment lines in `blockly_webview.dart` about the pinned Android asset-loading adapter. It changes @@ -123,7 +132,7 @@ engineering scope review by the Codex integration operator selects these current, verified baselines for the app-only Q rows, using the unchanged runtime, board, upstream and build-driver sources as the rationale. This is a bounded compatibility scope decision, not binary equivalence, a human release sign-off, -or admission of an unfinished matrix. No firmware update is selected. Claims of +or a waiver of matrix requirements. No firmware update is selected. Claims of candidate-app testing against published `c8f549ee` on all profiles remain outside this evidence. No new firmware qualification or full firmware-suite pass is created by this comparison. @@ -133,36 +142,37 @@ created by this comparison. An acknowledged current-text checkpoint can be offered after an app restart for explicit local Restore or Discard. The bounded feature protects one text slot; it does not implement project management, Blocks workspace recovery or backup. -Existing channel installations are separate from this unqualified candidate. +Existing channel installations are separate from this engineering-qualified candidate. | Component | Candidate behavior | Evidence boundary | |---|---|---| -| Drift repository | `projects` / `project_files` subset and one SettingsStore; atomic content/metadata/generation; exact UTF-8 and SHA-256; 1 MiB admission bound | File-backed tests/schema fixtures plus Android/iPad native storage harnesses; full interaction/board acceptance remains pending | +| Drift repository | `projects` / `project_files` subset and one SettingsStore; atomic content/metadata/generation; exact UTF-8 and SHA-256; 1 MiB admission bound | File-backed tests/schema fixtures, both native storage harnesses and the accepted normal-app platform observations | | Production storage | `pyble.sqlite` below the platform app-private Application Support directory; owned background database connection with WAL and FULL synchronization | No cache/scratch/preferences substitute; preserve database/WAL/journal on failure | | Recovery coordinator | One active checkpoint and one coalesced pending revision; 500ms idle and maximum 2s active scheduling; manual/lifecycle flush; durable acknowledgement separate from board dirty | Controller timer/epoch/failure tests; callbacks are not a promise that every last keystroke survives termination | | Startup and local panel | Resolve storage before Connect mounts; explicit preview/Restore/Discard; ten-second bounded wait; Retry / clearly volatile continuation | ARB-backed widget/semantics checks; disconnected preview/copy is a narrow shell exception | | Guarded replacement | Confirm meaningful pending/dirty replacements; commit replacement/tombstone before adoption; keep live text if storage fails; require explicit volatile fallback | New, Board Open and Blocks-to-Editor keep captured editor epochs across confirmation and asynchronous work | -| Board authority | Restored text is dirty and unbound; Save/Run/Files Upload require current destination consent; paths in recovery metadata confer no authority | Recording-connection/session tests; physical board consent and absence of hidden writes remain required | +| Board authority | Restored text is dirty and unbound; Save/Run/Files Upload require current destination consent; paths in recovery metadata confer no authority | Recording-connection/session tests and observed physical current-target consent/cancellation; no implicit board write is authorized | | Stale work | Epoch checks detect edit-away/back; facade/session guards fence Board Open and Save/Upload completion; PUT-to-Run refuses a changed attachment | A stable Connection facade is tested; no persistent board identity/session stamp is introduced | | Unsafe store state | Conflict/corrupt/unsupported checkpoint state stops writes; Retry rereads and offers a choice without replacing live text | Generation conflict regression; no silent reset, downgrade or deletion | ## Sprint tasks and delivery state -These statuses report progress toward the selected outcome. **Implemented** is -source progress; it is not a Done Increment or release admission. +The engineering review accepts the bounded recovery outcome and its supporting +recipe/platform work. Device closeout is complete. Ten engineering tasks are +Done; participant follow-up is a separate unfinished task, so the whole Sprint is not complete. -| Task | Current state | Remaining acceptance | +| Task | Current state | Evidence / carried boundary | |---|---|---| -| C1-S2-T01 / PYB-009.1 | Prepared — [scoped recipe](01_Operator_Recipe.md) | Execute against exact candidate; reconcile observations and operator gaps | -| C1-S2-T02 / PYB-006.2 | Implemented — checkpoint/relaunch/side-effect tests | Integrated regression passes; reconcile required physical acceptance | -| C1-S2-T03 / PYB-006.2 | Implemented — storage failure/interruption/stale-operation tests | Integrated regression passes; reconcile required physical acceptance | -| C1-S2-T04 / PYB-006.2 | Implemented — durable storage and schema | Integrated regression and native storage checks pass; reconcile required physical acceptance | -| C1-S2-T05 / PYB-006.2 | Implemented — startup choices/coordinator/UI | Integrated regression passes; remaining physical interaction/restart checks | -| C1-S2-T06 / PYB-006.2 | Implemented — failure guidance/localization/volatile choices | Automated localization/accessibility/regression checks pass; applicable physical checks remain separate | -| C1-S2-T07 / PYB-006.2 | Implemented and checked — latest source has 984 ordinary tests, including 28 shell, one dismissal-fallback and six guide tests, with clean analysis | PR #40 baseline CI and all 36 PR #41 checks at `bef67bd` pass, including pinned goldens/native WebView; physical/release evidence remains separate | -| C1-S2-T08 / PYB-008.1 | Earlier Android continuation recorded; final-candidate issue under investigation | [Normal-app recovery and five Android Q rows](05_Android_Acceptance.md) pass on their stated sources; repeated Blocks startup watchdog during final-candidate checking remains unresolved | -| C1-S2-T09 / PYB-008.1 | Physical iPad execution complete; final integrated review pending | iPad native storage restart and normal Preview offline Restore/current-board Save/Run consent pass for the recorded artifact; generated-text handoff/recovery and the final Editor/Blocks palette regression also pass; all five iPad release-matrix rows pass with their recorded source and baseline scope | -| C1-S2-T10 / PYB-006.2 | In progress — integration/evidence review | Record final checks, immutable candidates, physical results and carried limitations | +| C1-S2-T01 / PYB-009.1 | Done — scoped operator recipe executed and reviewed | Actual setup/keyboard corrections incorporated; optional second-operator reproduction remains PYB-009.2 | +| C1-S2-T02 / PYB-006.2 | Done — checkpoint/relaunch/side-effect tests | Meaningful red/green evidence and integrated suite pass | +| C1-S2-T03 / PYB-006.2 | Done — storage failure/interruption/stale-operation tests | File-backed fault and controller/session oracles pass | +| C1-S2-T04 / PYB-006.2 | Done — durable storage and schema | Automated and both-platform native storage/restart evidence pass | +| C1-S2-T05 / PYB-006.2 | Done — startup choices/coordinator/UI | Normal-app offline Restore, explicit Discard and generated-text recovery observed | +| C1-S2-T06 / PYB-006.2 | Done — failure guidance/localization/volatile choices | Required widget/localization/semantics and scoped physical evidence pass | +| C1-S2-T07 / PYB-006.2 | Done — applicable automated regression | 984 ordinary tests; 36 frozen-runtime CI checks including pinned goldens/native WebView; later documentation integration tracked separately | +| C1-S2-T08 / PYB-008.1 | Done — Android observations reviewed | [Android report](05_Android_Acceptance.md): exact sources, final affected checks, OEM qualifier condition and retained failures | +| C1-S2-T09 / PYB-008.1 | Done — iPad observations reviewed | [iPad report](04_iPad_Acceptance.md): offline/consent/generated text, final palette regression and all five app/profile rows | +| C1-S2-T10 / PYB-006.2 | Done — scoped review, evidence reconciliation and device closeout | Actual policy restoration, owned-fixture cleanup and restored advertising recorded; final branch CI/review/merge remains an integration step | | C1-S2-T11 / PYB-011.2 | Awaiting participant evidence | No consenting activation dates or mature follow-up records supplied | ## Required scenario evidence @@ -174,21 +184,21 @@ source gates; physical observations remain bound to their recorded artifacts. | Scenario | Implemented evidence | Current acceptance state | |---|---|---| | DR-T01 | Real repository validation/round-trip tests: exact Unicode, filenames, content bound and invalid metadata | Automated integrated suite passing | -| DR-T02 | File-backed close/reopen retains the committed slot and generation | Automated suite and Lenovo separate-process harness passing; iPad separate-process profile harness passing; full interaction matrix pending | -| DR-T03 | Child-process SIGKILL before/after write checkpoints; whole old/new committed content oracle | Host fault-controlled interruption tests and both-platform killed-process restart checks pass; deterministic physical phase timing is not claimed; remaining normal-app interaction scenarios are recorded separately | +| DR-T02 | File-backed close/reopen retains the committed slot and generation | Automated suite and Lenovo separate-process harness passing; iPad separate-process profile harness passing; normal-app restart/Restore observed on both platforms | +| DR-T03 | Child-process SIGKILL before/after write checkpoints; whole old/new committed content oracle | Host fault-controlled interruption tests and both-platform killed-process restart checks pass; deterministic physical phase timing is not claimed; normal-app interaction scenarios are recorded separately | | DR-T04 | Real storage failure injection plus controller failure state retains previous copy and live edits | Automated integrated suite passing | | DR-T05 | Bad hash/metadata, corrupt/truncated database and unsupported version fixtures; bounded startup error UI | Automated integrated suite passing | | DR-T06 | Fresh v1/reopen, exported first schema and unsupported-version refusal; no fictional released v0 | Integrated schema tests pass; future schema migrations remain gated on new fixtures | -| DR-T07 | Explicit Restore/Discard, failed discard, volatile Retry, late hydration and no implicit board writes | Automated suite, Lenovo Restore/offline preview/relaunch, and iPad normal-app offline preview/Discard cancellation/Restore pass; final-candidate interaction matrix pending | +| DR-T07 | Explicit Restore/Discard, failed discard, volatile Retry, late hydration and no implicit board writes | Automated suite, Lenovo Restore/offline preview/relaunch, and iPad normal-app offline preview/Discard cancellation/Restore pass; final normal-app affected checks also pass with the Android OEM condition recorded | | DR-T08 | Deterministic 500ms / continuous-edit 2s scheduling; delayed commits, startup timeout and epoch tests | Integrated clock/epoch/lifecycle tests pass; candidate-specific physical interruption scope remains explicit | | DR-T09 | Active write/replacement serialization, tombstones and no queued resurrection | Automated integrated suite passing | -| DR-T10 | Recovered-target cancellation and stale document/path/session consent | Recording-connection tests and Lenovo/iPad current-target Save/Run consent with cancellation pass for their recorded candidates; iPad Files Upload cancellation preserves the empty destination, while confirmation writes only the selected file. Final affected checks remain separate | +| DR-T10 | Recovered-target cancellation and stale document/path/session consent | Recording-connection tests and Lenovo/iPad current-target Save/Run consent with cancellation pass for their recorded candidates; iPad Files Upload cancellation preserves the empty destination, while confirmation writes only the selected file. Final affected checks pass within their declared artifact/platform conditions | | DR-T11 | Stable-facade board swap, delayed GET, stale completion and PUT-to-Run attachment refusal | Integrated recording-connection/session regression passes | | DR-T12 | Explicit generated text handoff with editor-epoch/revision guards; existing workspace/sidecar behavior retained | Affected automated regression and representative Android/iPad device checks pass. The iPad normal Preview preserves the previous Unicode draft on handoff cancellation, adopts exact generated text only on confirmation, and offers that committed text after actual relaunch | | DR-T13 | Local/board status separation, ARB error/status copy, disconnected preview, keyboard and 2× text | Automated UI/localization/semantics and pinned golden CI pass; physical Lenovo 2× preview observed; local macOS mismatch remains documented separately | -| DR-T14 | Exact recorded Android/iPad candidate, offline restore and explicit current target consent | Lenovo observations and signed iPad native-storage checks retained; normal iPad offline Restore and current-target Save/Run consent now pass. Both-platform generated-text checks also pass; final iPad keyboard regression passes; the subsequent Android Blocks startup observation remains under investigation | +| DR-T14 | Exact recorded Android/iPad candidate, offline restore and explicit current target consent | Lenovo observations and signed iPad native-storage checks retained; normal iPad offline Restore and current-target Save/Run consent now pass. Both-platform generated-text checks also pass; final keyboard regressions and affected normal-app checks pass on both platforms with the Android qualifier condition explicit | -## Verification and remaining admission +## Verification and distribution boundary | Check | Reported result / limitation | |---|---| @@ -214,11 +224,48 @@ flowchart LR M01 -. "Independent evidence stream" .-> REVIEW ``` -The next required work is resolving the final-candidate Android Blocks startup -observation and reviewing the now-completed iPad release-matrix evidence. Preserve -failed/not-run rows rather than weakening the contract to meet a date. Human -pilot work continues as its own evidence stream. No full A-24 completion, -qualified release or publication follows from source commits alone. +## 31 October engineering acceptance and next stage + +The Codex integration operator, under the user's completion request, reviewed +DR-T01–14, the exact platform reports and the frozen candidate against the +selected story criteria and Definition of Done. This is an automated engineering +review with parallel source/evidence review; it does not invent an independent +human sign-off or a Scrum ceremony. + +- **PYB-006.2 / M-02 accepted:** one durable current-text slot, explicit local + Restore/Discard and current-board consent, with required failure/stale-work + coverage. Full A-24 projects/history, durable settings and Blocks graphs remain + outside this accepted slice. +- **PYB-008.1/.2 and app-only M-04 engineering pass:** all ten declared profile / + platform rows, exact unchanged firmware inputs, final affected keyboard and + generated-text checks, signed packaging and Android 16 KiB runtime evidence. + Earlier-row impact assessments and the Lenovo qualifier's temporary battery + condition remain part of the accepted scope. No new firmware qualification, + published-image equivalence on all five profiles or Ready badge is inferred. +- **Review scope:** source/red-green history, locked dependency/license/privacy + records and the [scoped dependency audit](06_Release_Readiness.md) were checked. + The website's remaining moderate toolchain findings are separate maintenance; + the audit is not a vulnerability-free claim. +- **Closeout complete:** the qualifier is back to Optimized with Unrestricted + off and removed from the device-idle allowlist. Global DuraSpeed settings are + unchanged, and the production package was not altered. All 19 authored files + were read/CRC-checked and backed up before removal; ten empty owned + directories were also removed across eight cleanup sessions. Unrelated root + entries were preserved. Classic + ESP32 returned to advertising after fresh ROM identity verification and an + ordinary RTS reset, with no firmware/filesystem write; all five boards then + advertised. That restoration is not counted as an app reconnect pass. The + platform/release reports retain the private receipts. Final branch + CI/review/merge remains separate from the 36 passing frozen-runtime checks. +- **Next release stage — M-05:** verify store access and unused build numbers, + upload only the admitted artifacts after final integration, then record processing, + actual availability and store-delivered upgrade/launch evidence separately. + Prepared binaries, local Preview installs and passing engineering tests do not + establish channel delivery. + +Human pilot work remains its own evidence stream. T11 and the earlier S1 +participant obligations are unfinished; no recruitment, consent, return-rate +result or human capacity is reconstructed from these engineering runs. ## Integrated source and CI review @@ -238,7 +285,7 @@ establish store publication or acceptance of unperformed physical scenarios. The final boundedness audit added SQL byte/count preflights before metadata or row materialization: corrupt metadata is capped before JSON reaches the UI -isolate. The final ordinary suite is 972 passing tests. [Platform results](02_Platform_Qualification.md) +isolate. At that earlier checkpoint, the ordinary suite had 972 passing tests. [Platform results](02_Platform_Qualification.md) include successful iPad profile assertion receipts and a killed-process boundary. All five boards now appear in the Lenovo scan after the [classic ESP32 recovery](03_Classic_ESP32_Workspace_Recovery.md). Its workspace exactly matched an intentional invalid-media fixture left by an diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/02_Platform_Qualification.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/02_Platform_Qualification.md index 243c55ca..f8958ba6 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/02_Platform_Qualification.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/02_Platform_Qualification.md @@ -8,7 +8,7 @@ | Date / operator | 31 October 2026, Asia/Bangkok; automated operator on the maintainer's Mac | | Source | App source candidate `0.3.0+9`; final bounded source `90311f3` (including storage preflight fix `8657e5a`); earlier source snapshots identified below | | Scope | Local storage, explicit offline recovery and platform builds; partial evidence toward DR-T02/03/07/13/14 | -| Acceptance | Engineering observations only; full physical board consent, interruption/interaction matrix and release qualification remain pending | +| Acceptance | Historical initial checkpoint; subsequent normal-app consent, recovery and app-only qualification are accepted in the linked 04/05/current execution records | | Raw evidence | Ignored `local/recovery-implementation/`: commands/results, source manifests, screenshots/UI dumps, retained checkpoint and APK; raw captures are not committed | | Review | [Execution record](00_Execution_Record.md), [operator recipe](01_Operator_Recipe.md), [merged PR #40](https://github.com/PyBLE-dev/PyBLE/pull/40) | @@ -141,7 +141,9 @@ The remaining normal-app interaction, current-target consent and Blocks handoff work from this historical record is reconciled in the [iPad](04_iPad_Acceptance.md), [Android](05_Android_Acceptance.md) and [current execution](00_Execution_Record.md) records. All five iPad Q rows now pass within their exact source/firmware scope; -the final Android Blocks startup observation remains under investigation. +the final Android Blocks/keyboard/generated-text checks pass under their +recorded qualifier-only OEM condition. Original watchdogs and selector failures +remain retained. Candidate provenance, retained failures and final admission stay explicit. Participant follow-up and unfinished M-01/SG0 pilot work remain separate from engineering recovery evidence. diff --git a/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md b/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md index 14d640cc..39f9d097 100644 --- a/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md +++ b/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md @@ -11,10 +11,10 @@ | Field | Value | |---|---| -| Document version | 1.7 — physical acceptance, declared firmware baselines and release preparation; original filename retained | +| Document version | 1.8 — accepted bounded recovery and app-only qualification; channel/pilot continuation; original filename retained | | Prepared | 25 September 2026 | -| Last reviewed | 31 October 2026; merged recovery baseline, physical acceptance continuation, firmware identity checks and release preparation reviewed; final candidate admission remains separate | -| Status | C1-S1 has six tasks Done, two Prepared awaiting pilot setup and four Awaiting evidence; Sprint and SG0 remain unfinished. Bounded recovery source is merged, with physical acceptance and release qualification underway. Human capacity and recruitment dates need replanning; no new protocol behavior approved | +| Last reviewed | 31 October 2026; bounded M-02 and app-only M-04 engineering acceptance recorded with exact candidate, firmware and OEM test conditions; device closeout complete; final integration and channel delivery separate | +| Status | C1-S1 has six tasks Done, two Prepared awaiting pilot setup and four Awaiting evidence; Sprint and SG0 remain unfinished. Bounded recovery and app-only qualification pass scoped engineering review; device closeout is complete; final integration and actual channel delivery remain separate. Human capacity and recruitment dates need replanning; no new protocol behavior approved | | Product | PyBLE — Python over Bluetooth Low Energy | | Organization | SciLabPro | | Planning horizon | Immediate 12-week delivery cycle, followed by conditional expansion through September 2028 | @@ -40,6 +40,7 @@ | 1.5 | Implemented bounded current-text recovery for source candidate 0.3.0+9; added candidate execution/operator records; preserved remaining pilot, platform and release gates | | 1.6 | Reconciled PR #40 merge, passing integrated CI and both local tablet candidates; selected acceptance → qualification → distribution continuation, with human capacity and participant evidence still explicit | | 1.7 | Recorded normal-app acceptance progress and exact current firmware inputs for app-only compatibility; tracked prepared signed artifacts and remaining candidate, release and channel evidence without inventing pilot results | +| 1.8 | Accepted bounded recovery and the declared ten-row app-only matrix after actual platform checks and scoped engineering review; moved remaining release work to final integration and M-05, preserving pilot gaps and original forecasts | ## Contents @@ -163,8 +164,8 @@ The [execution record](../developments/2026-q4-reliable-workflow/c1-s1/00_Execut | PYB-001 | Reviewed ledger; [Lenovo Play `0.2.0 (8)`](../developments/2026-q4-reliable-workflow/c1-s1/06_Android_Channel_Verification.md) and [iPad TestFlight `0.2.0 (6)`](../developments/2026-q4-reliable-workflow/c1-s1/07_iPad_Channel_Verification.md) existing installations, channel/Open and launch verified | iPad build-to-source mapping remains unknown; Android code/asset correspondence does not establish complete binary equivalence or store-console provenance. Fresh enrollment/reinstallation was not performed | | Residual PYB-002.1 | Accurate replacement TestFlight app-level description prepared after the public page exposed its older ESP/agent-0.4.0 baseline | Distribution owner must apply it and verify the public result; also reconcile build-6 installed `MinimumOSVersion` 18 with TestFlight notes stating 15 before asserting support. No store mutation performed; Android's earlier correction remains complete | | PYB-003/004 | Operational pilot protocol, safe Tasks A/B/C, consent/retention rules and empty observation/support templates | Human owner, reachable cohort, tested setup and collection decision unconfirmed; no participants or observed outcomes | -| PYB-006.1 | [Recovery contract](../specifications/App/current-draft-recovery.md), ADR-0048, source/peer review, scenario matrix and estimate | Bounded implementation now tracked in the [C1-S2 record](../developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md); platform/release acceptance and broader A-24/Blocks scope remain carried | -| PYB-009.1 | Existing tool/gate inventory, ten platform/profile rows, cost model and initial operator recipe; 110 focused host harness tests pass | S2 now supplies the scoped procedure and actual connected-device observations; final candidate acceptance and independent reproduction remain separate | +| PYB-006.1 | [Recovery contract](../specifications/App/current-draft-recovery.md), ADR-0048, source/peer review, scenario matrix and estimate | Bounded implementation now tracked in the [C1-S2 record](../developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md); scoped engineering acceptance is recorded; broader A-24/Blocks scope and actual channel delivery remain carried | +| PYB-009.1 | Existing tool/gate inventory, ten platform/profile rows, cost model and initial operator recipe; 110 focused host harness tests pass | S2 now supplies the scoped procedure and actual connected-device observations; scoped candidate acceptance is recorded; optional independent reproduction remains separate | The recovery estimate is **38–63 engineering hours**, or **45–72 hours** with the original recipe, representative-platform and follow-up allowances. The [design review](../developments/2026-q4-reliable-workflow/c1-s1/03_Recovery_Design_and_Sizing.md) offers a conditional 60-hour S2–S4 allocation, displacing earlier matrix and activation forecasts. The [validation inventory](../developments/2026-q4-reliable-workflow/c1-s1/04_Validation_Inventory_and_Operator_Recipe.md) estimates 13.5–26 operator hours for the app matrix and 30–59 for fresh full firmware qualification, excluding builds, unavailable access and defect repair. These are working estimates, not actual effort or promises. **SG0 remains blocked.** @@ -187,7 +188,7 @@ Do not spend the first sprint rebuilding a large analytics dashboard. A small pr | [Device information types](../../app/lib/pble/types.dart) | Negotiated chip, agent version, and capabilities | A support export must distinguish observed data from operator-supplied profile/provenance; current HELLO does not prove an artifact hash | | [Host conformance fixtures](../../tests/firmware_tests/host/conformance/README.md), [HIL guide](../../tests/firmware_tests/hil/README.md) | Shared vectors, compiled-native/portable tests, physical benches and release evidence tools | Add a coverage map and operator recipe before creating another harness or schema | -**Selected next-release engineering candidate:** PYB-006.2, the bounded part of the carried A-24 persistence gap. Implementation and evidence are tracked in the [C1-S2 record](../developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md). Its bounded specification and sizing are now recorded in C1-S1; select implementation against that estimate while collecting first-use observations; an already documented loss condition does not need rediscovery by participants. Start with durable recovery of the current text document and explicitly scope Blocks recovery. The existing ADR selects Drift and rejects an ad-hoc scratch-file workaround; any different design needs an explicit superseding decision. This does not approve a full project manager, automatic board writes, or new protocol operations.[^app-contract] +**Accepted next-release engineering increment:** PYB-006.2 closes the bounded current-text part of the carried A-24 persistence gap. The [C1-S2 record](../developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md) binds its 31 October engineering acceptance, exact artifacts, physical conditions and carried limits. One acknowledged Drift checkpoint can be restored offline; generated Blocks text is covered only after explicit adoption into Editor. Full projects, Blocks graphs and new protocol operations remain outside this increment. Complete final integration and M-05 distribution next, while arranging real pilot observations and confirmed human capacity. The original design/sizing estimates remain historical forecasts, not measured effort.[^app-contract] ## 3. Target users and positioning @@ -386,9 +387,12 @@ The cycle intentionally excludes a complete new protocol version, full classroom ### 8.2 Sprint plan -**31 October continuation:** PR #40 has merged and integrated CI passes. Complete -remaining M-02 physical acceptance, then the applicable M-04 app-release matrix -and M-05 channel delivery; prepare distribution in parallel where independent. +**31 October continuation:** bounded recovery M-02 and app-only M-04 pass +engineering review at frozen `bef67bd`, with required automated/platform +evidence, exact firmware inputs and the documented Lenovo qualifier condition. +Device closeout is complete. Finish final branch integration, then M-05 account, +submission and installed-channel verification. Do not schedule the same accepted +matrix again without changed scope or invalidated evidence. The [dated continuation order](../developments/2026-q4-reliable-workflow/04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records this selection and the human capacity/pilot inputs still needed. Source progress does not reconstruct the original Sprint schedule or participant @@ -446,7 +450,7 @@ Current execution states and the newly identified residual `PYB-002.1` are maint | PYB-003 | P0 / Lead + QA | Threat model, pilot boundaries, safe hardware scope, consent/data-handling procedure, and signed-off pilot decision | 001 | | PYB-004 | P0 / QA | One primary cohort/job; repeatable activation task and useful Task C; previous workflow, baseline timing, assistance, failure categories and prospective follow-up rules | 001, 003 | | PYB-005 | P0 if observed blocker / App | Improve the existing tutorial/readiness flow at the measured failure; novice distinguishes provisioning, permissions, discovery, and ready state | 004 | -| PYB-006 | P0 / App | A-24/ADR-0010 durable current-document recovery: accepted persistence boundary, relaunch recovery, interrupted-write/corrupt-state behavior, no implicit board overwrite/run; explicit Blocks scope; preserve session/lifecycle regression coverage | Current recorded gap; App specification/TDD and ADR review; 004 informs priority but is not a prerequisite | +| PYB-006 | P0 / App | A-24/ADR-0010 durable current-document recovery: accepted persistence boundary, relaunch recovery, interrupted-write/corrupt-state behavior, no implicit board overwrite/run; explicit Blocks scope; preserve session/lifecycle regression coverage | Bounded 006.2 accepted 31 October; broader A-24 remains carried. App specification/TDD and ADR govern any next slice; 004 informs priority | | PYB-007 | P1 / App + QA | Optional user-initiated diagnostic export with preview/redaction and observed/supplied/unknown identity fields; manual template is the first-cycle fallback | 003; export contract approved; no dependency on completing 006 | | PYB-008 | P0 for selected release claims / QA + Firmware | Staged exact-artifact five-profile × two-platform workflow matrix; pass/fail/not-run/blocked per row; map applicable normative gates before running | 001, initial 009 recipe, recorded candidate artifacts; rerun affected rows after relevant changes | | PYB-009 | P0 / Protocol + QA | Inventory existing suites; add operator recipe and coverage map; within assigned capacity, a second operator rehearses one existing exact profile and supplies a draft Ready record with assistance/gaps | 001 and source inventory; starts before 008; reproduction stays pending without an operator; no new port or badge award required | @@ -874,7 +878,7 @@ At cycle end, choose one principal next investment: Reliable Projects, partner p - [ ] Assign one owner and one review path for each initial issue. - [ ] Inventory exact test boards, tablets, cables, and available recovery equipment. - [ ] Freeze Task A/B/C definitions, assistance/timeout rules, prospective follow-up windows and task-opportunity questions, consent procedure, and manual support template; observe initial eligible participants. -- [x] Specify and peer-review the bounded current-text contract and its acceptance scenarios; size the safe increment. Runtime implementation is merged; final physical acceptance remains in progress in the C1-S2 record. The dated continuation order preserves and replans the original S2 forecast. +- [x] Specify and peer-review the bounded current-text contract and its acceptance scenarios; size the safe increment. Runtime implementation and bounded engineering acceptance are recorded in C1-S2. The dated continuation order preserves original forecasts and moves remaining release work to final integration and channel delivery. - [ ] If operator/capacity is available, include one existing-profile Ready rehearsal and draft record in PYB-009; show installation status and pending evidence explicitly. ### 20.2 Issue template diff --git a/docs/specifications/App/TDD.md b/docs/specifications/App/TDD.md index 53b32e9e..3c81cbe0 100644 --- a/docs/specifications/App/TDD.md +++ b/docs/specifications/App/TDD.md @@ -705,7 +705,7 @@ Drift schema versions with explicit `MigrationStrategy` step migrations (forward ### 9.3 Bounded current-text recovery (specified) -**C1-S1 / PYB-006.1 contract, 2026-09-25; C1-S2 / PYB-006.2 source merged in PR #40, 2026-10-31. Integrated CI passes; required physical acceptance remains pending.** +**C1-S1 / PYB-006.1 contract, 2026-09-25; C1-S2 / PYB-006.2 source merged in PR #40, 2026-10-31. Bounded recovery passes 31 October engineering acceptance with required automated and both-platform physical evidence; channel delivery remains separate.** [ADR-0048](../../decisions/0048-bounded-current-text-draft-recovery.md) and [current-draft-recovery.md](current-draft-recovery.md) own the bounded successor to ADR-0010. Start with the necessary `projects`/`project_files` subset and the diff --git a/docs/specifications/App/current-draft-recovery.md b/docs/specifications/App/current-draft-recovery.md index 0ba8e6e6..02f8422b 100644 --- a/docs/specifications/App/current-draft-recovery.md +++ b/docs/specifications/App/current-draft-recovery.md @@ -6,7 +6,7 @@ | Field | Value | |---|---| | Design baseline | 25 September 2026; C1-S1-T10/T11, PYB-006.1 | -| Status | Bounded `0.3.0+9` source merged in PR #40 on 31 October 2026; integrated checks pass; required physical acceptance remains pending | +| Status | Bounded `0.3.0+9` recovery accepted by 31 October engineering review at `bef67bd`; required automated and both-platform physical evidence pass; channel delivery remains separate | | Decision | [ADR-0048](../../decisions/0048-bounded-current-text-draft-recovery.md) | | Parent obligations | A-24; FR-EDIT-7, FR-PROJ-2/6, NFR-REL-3; their broader acceptance remains carried | | Delivery and sizing | [C1-S1 design review](../../developments/2026-q4-reliable-workflow/c1-s1/03_Recovery_Design_and_Sizing.md) | @@ -14,9 +14,9 @@ This is the normative contract for PYB-006.2. Candidate source now implements its bounded current-text storage, coordinator, recovery UI and guarded board actions. [The implementation record](../../developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md) -tracks automated and physical acceptance separately. Existing Play/TestFlight -installations remain the previously recorded versions; candidate source is not -store availability or release qualification. [ADR-0048](../../decisions/0048-bounded-current-text-draft-recovery.md) +records the scoped automated/physical acceptance and declared test conditions. +Existing Play/TestFlight installations remain the previously recorded versions; +channel availability is separate from this engineering acceptance. [ADR-0048](../../decisions/0048-bounded-current-text-draft-recovery.md) supersedes the volatile-only current-text limitation in ADR-0010 for this slice. No PBLE/1 change or board-identity allowlist is introduced. diff --git a/docs/specifications/App/specs.md b/docs/specifications/App/specs.md index 86eb9064..cec93342 100644 --- a/docs/specifications/App/specs.md +++ b/docs/specifications/App/specs.md @@ -167,8 +167,8 @@ The client implements the PBLE/1 wire contract; it references [protocol.md](../p **Working-loop increment — FROZEN (A-20 subset · `[docs]` 2026-07-02, amended 2026-08-22 by [ADR-0012](../../decisions/0012-flutter-code-editor-behind-editorsurface.md), [ADR-0010](../../decisions/0010-working-loop-in-memory-document.md), [TDD §11.1](TDD.md#111-editor)/[§11.6](TDD.md#116-working-loop-provider-contract-frozen); run path superseded 2026-07-27 by [ADR-0013](../../decisions/0013-clean-room-blockly-one-way-file-backed.md)).** In scope: the ADR-0012 `EditorSurface` seam with `flutter_code_editor` 0.3.5 as the default rich adapter and the existing plain `TextField` as a live fallback; Python highlighting, always-visible one-based line numbers, safe auto-indent/Tab handling, and an editor-only 10–24 sp font adjustment in one-point steps (default 14 sp). Code and gutter resize together, platform text scaling still applies, and resizing MUST NOT modify the document, selection, dirty state, or board path. The size is app-session state, independent of file and board, until A-24's single Drift `SettingsStore` makes it durable; a second preferences store MUST NOT be introduced. The single volatile in-memory current document (name/content/dirty/boardPath), **New**, and board-backed Save/Run behavior remain as frozen by ADR-0010/0013. Save and Run capture one normalized document snapshot; transfer completion marks it saved/bound only when the live document still equals that snapshot, so mid-transfer edits or a replacement document remain dirty. The editor binds to `Connection` only (FR-EDIT-6, CON-8), and editor source MUST NOT reach a network analyzer. **Still deferred to A-24 or later:** multi-file tabs, app-owned localized find/replace, the remaining external-keyboard shortcuts, durable display settings, Save-to-project, and buffers-survive-restart. The document provider's `openFromBoard`/`markSaved` and the session display provider are the A-24 persistence hooks (RECORDED deviations, ADR-0010/0012). -**Current-text recovery successor — MERGED CANDIDATE SOURCE, -automated checks passing; physical acceptance pending (31 October 2026, C1-S2/PYB-006.2; contract +**Current-text recovery successor — BOUNDED INCREMENT ACCEPTED, +required automated and physical evidence passing (31 October 2026, C1-S2/PYB-006.2; contract `[docs]` 2026-09-25, C1-S1/PYB-006.1, [ADR-0048](../../decisions/0048-bounded-current-text-draft-recovery.md)).** The [bounded recovery contract](current-draft-recovery.md) defines DR-01–07: @@ -182,7 +182,8 @@ requirements stay carried. The candidate uses durable local checkpoints and epoch/session guards; the older frozen working-loop paragraph above records the historical volatile release, not the candidate's persistence behavior. The [C1-S2 implementation record](../../developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md) -owns final integrated and physical acceptance. No store publication is implied, +records the 31 October engineering acceptance and its exact candidate/platform +limits. No store publication is implied, and FR-EDIT-7, FR-PROJ-2/6 and NFR-REL-3 are not satisfied in full. ### 4.7 Console Panel (`lib/console/`) — FR-CONSOLE From af210b124eb42080f8b554401642c96849f634b9 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 20:10:35 +0700 Subject: [PATCH 27/31] [docs] bind Android acceptance to final keyboard candidate Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/05_Android_Acceptance.md | 121 ++++++++++++++---- 1 file changed, 94 insertions(+), 27 deletions(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md index dbd79a30..7689c886 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/05_Android_Acceptance.md @@ -6,21 +6,24 @@ | Field | Record | |---|---| | Date / operator | 31 October 2026; automated operator on the maintainer's Mac | -| State | Completed Android continuation within the physical scope and limitations recorded below | +| State | Final-candidate affected checks passed; retained acceptance observations and candidate identities are distinguished below | | Physical device | Lenovo TB-J616X; Android 12 / API 31; landscape 2000 × 1200 pixels at 240 dpi | | App | `0.3.0 (9)`, normal `lib/main.dart`; isolated qualification application identity preserves the installed store app and its data | -| Final runtime source | `01a7ac8acab32e926c185c8567f9b8dca08d3d68`; Android worktree runtime is byte-equivalent. The native package name alone is changed for the isolated identity | -| Final profile APK SHA-256 | `afc50a741a07344047d3069c9d4a36c1111869b3286e67b0a9f8d4a61a408e89`; also verified against the installed `base.apk` | -| Final arm64 AOT SHA-256 | `2ddb34eb36169466b5aa5aa32515e007354389f1ebdd276c0fdd40638e6e47a4` | -| Final native DEX SHA-256 | `1b62aceb530a2d361980b18d009188994cf7c92118d22842af3a6293757b61bb` | +| 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 | +| Final profile APK SHA-256 | `945e9746559831c0d0f793d779bd53a0c53cc8395d02e50df3f45e9ff6790bcf`; also verified against the installed `base.apk` | +| Final arm64 AOT SHA-256 | `b4e42e6b50a2cdd565b2fbcccd457aab1c512c20a40933c9a8674cf38c214a9c` | +| Final `classes.dex` SHA-256 | `1b62aceb530a2d361980b18d009188994cf7c92118d22842af3a6293757b61bb` | +| Native-keyboard profile | Source `01a7ac8acab32e926c185c8567f9b8dca08d3d68`; APK SHA-256 `afc50a741a07344047d3069c9d4a36c1111869b3286e67b0a9f8d4a61a408e89`; arm64 AOT SHA-256 `2ddb34eb36169466b5aa5aa32515e007354389f1ebdd276c0fdd40638e6e47a4` | | Original debug APK | Source equivalent to `6f5b3ea`; SHA-256 `957982f5acec969f8003d04b2d6444eecbba9af26b7392d760badb5be5d6bd0e`; original failures retained | | Earlier profile APK | Runtime equivalent to `e54a78a`; SHA-256 `5b93b0c68bfc7bfa06a3a887ab70192a4d47c4786cf82e5428005ef94b199861` | | Governing evidence | [Recovery contract](../../../specifications/App/current-draft-recovery.md#7-required-evidence-before-acceptance), [operator recipe](01_Operator_Recipe.md), [execution record](00_Execution_Record.md), [validation inventory](../c1-s1/04_Validation_Inventory_and_Operator_Recipe.md) | | Private evidence | Ignored `local/recovery-completion/android/`: exact artifact/source manifests, native assertions, fresh UI XML/screenshots, logs, initial isolated-data backup and installed-artifact hash | -Both profile candidates were built from the normal application entry point. -The final candidate was built after `flutter clean`, with the new Dart keyboard -helper and native activity handler included. It is a qualification package; +All profile candidates were built from the normal application entry point. +The final candidate was built after `flutter clean`; its packaged Dart AOT +changed from the native-keyboard profile, and all eleven DEX payloads remain +identical. The final change adds the iOS keyboard-guide fallback; on Android +the wrapper returns the existing child without observing or replacing metrics. It is a qualification package; these observations do not independently establish Play delivery or production signing. The release record owns that separate packaging evidence. @@ -29,24 +32,26 @@ signing. The release record owns that separate packaging evidence. The initial isolated Editor was empty. Its private data was backed up before qualification, and the store app was not replaced or cleared. Only disposable text and uniquely named board fixtures were used. No firmware was flashed by -this Android workflow. +this Android workflow. The following observations use the native-keyboard +profile unless an earlier profile is named; the final-candidate recheck is +recorded separately below. | Recipe | Result / physical oracle | Evidence prefix | |---|---|---| -| 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` | +| 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` | | 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` | | P03 | Pass: explicit recovery save acknowledges the matching text; Saved locally and board Unsaved changes remain distinct | `profile-saved-local`, `nativefix-continuous-saved` | | P04 | Pass: actual force-stop/relaunch reproduces exact named text and checkpoint, including the generated Blocks text | `nativefix-typed-offline-relaunch`, `nativefix-generated-relaunch` | | P05 | Pass: Back leaves the unresolved recovery decision; relaunch presents the same complete generated checkpoint | `nativefix-recovery-before-back`, `nativefix-recovery-after-back` | -| P06 | Pass on final candidate: explicit Restore shows exact text in the disconnected local panel; connecting remains a separate action | `controlled-3dcb-local-restore` | +| 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` | | 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` | -| 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` | +| 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` | | 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` | | 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` | | 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` | -| 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` | -| 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-*` | -| 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` | +| 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` | +| 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-*` | +| 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` | | 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-*` | The generated-text recovery observation does not claim restoration of a Blocks @@ -54,8 +59,8 @@ workspace, revision history or companion files. The UI explicitly states that the local slot contains one current text draft. The retained earlier-profile observations cover unchanged storage, target-guard -and transport code. The final runtime changes keyboard dismissal; its affected -Editor/native-WebView behavior and Blocks handoff were repeated on the final +and transport code. The native-keyboard runtime changes keyboard dismissal; its affected +Editor/native-WebView behavior and Blocks handoff were repeated on that exact installed artifact. This is an impact assessment, not a claim that every earlier observation was rerun on identical bytes. @@ -66,6 +71,62 @@ phases. Their physical execution is not inferred from a successful ordinary restart. Error-panel localization/layout coverage also remains part of the host widget/semantics/golden evidence. +## Final candidate recheck + +The final APK was installed over the isolated app without clearing its data. +The installed hash was checked again after restoring it from the temporary +diagnostic and older-candidate comparisons. No diagnostic Activity or callback +logging remains in that APK or the restored qualification source copy. + +| Check | Result on final `945e9746…` APK | Evidence prefix | +|---|---|---| +| 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` | +| 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` | +| 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` | +| 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` | +| 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-*` | +| 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` | + +The final change adds an iOS-only keyboard-guide fallback; the Android wrapper +returns the existing child. The unchanged storage, target-guard, BLE, run and +Blocks code, together with identical native DEX and bundled Blocks inputs, +supports retaining the earlier matrix rows below. Those rows are not represented +as new five-board executions of the final APK. + +The startup investigation also found a device-environment condition. The +isolated package appeared in Lenovo's DuraSpeed suppression list while its +renderer service remained pending without a process or binder. Real watchdog +failures had no page or JavaScript bridge callbacks; a same-package native +Activity without Flutter reproduced them. A controlled native comparison +passed with the qualifier's Battery mode temporarily set to **Unrestricted**. +The accepted final-app sequence also used its actual, package-verified launcher +icon. Global DuraSpeed configuration was unchanged. These observations qualify +the recorded setup; they do not establish that every shell launch or OEM power +mode works, or that either setup step is universally necessary. The earlier +successful shell-launched profile did not retain a comparable policy snapshot. +No product startup code was changed for this investigation. + +After qualification, the original **Optimized** battery mode was restored and +the qualifier was removed from the device-idle exemption list. Global DuraSpeed +configuration remained byte-identical to the recorded baseline. Original radio, +accessibility, touch-exploration and font settings were verified restored; the +final APK and its recovery data remain installed, with the qualifier stopped +and temporary device helpers removed. + +Some helper waits were corrected against the retained UI evidence: an empty +initialized workspace offers Browse examples and disables Preview code with +“Add blocks to generate Python.” Waiting for Preview code in that state is not +a startup failure. Both the final and retained native-keyboard APKs reached +that valid state through the actual launcher. Those selector timeouts remain +separate from the genuine earlier watchdog failures. + +After radio restoration, the first generated-text C3 connection encountered a +15-second service-discovery timeout before Ready. Its explicit retry reached +Ready and completed both target-cancellation checks. This retained transient is +not counted as a successful first attempt. The separate Classic reconnect +errors are likewise retained; its subsequent board-restoration step does not +replace any app reconnect observation. + ## Physical app-only matrix Every passing core row covers edit, explicit Save, Run, observed stdout, Stop, @@ -75,11 +136,11 @@ receipts are retained with each row. A Ready scan result alone is not counted. | Row | Exact profile / board alias | App candidate | Result | Raw prefix | |---|---|---|---|---| -| Q02 | `esp32-4mb` / 8C9E | Final | Pass | `q8c9e` | -| Q04 | `esp32-s3-n16r8` / 5646 | Final | Pass | `q5646` | -| Q06 | `waveshare-esp32-s3-lcd-147b` / DA86 | Final | Pass | `qda86` | +| Q02 | `esp32-4mb` / 8C9E | Native-keyboard profile | Pass | `q8c9e` | +| Q04 | `esp32-s3-n16r8` / 5646 | Native-keyboard profile | Pass | `q5646` | +| Q06 | `waveshare-esp32-s3-lcd-147b` / DA86 | Native-keyboard profile | Pass | `qda86` | | Q08 | `esp32-c3-4mb` / C81A | Earlier profile; unchanged transport/run code | Pass, including both required real-UI Stop cases | `profile-c3-*`, `profile-tight-*`, `profile-flood-*` | -| Q10 | `rpi-pico2-w` / 3DCB | Final | Pass after an explicitly retained Android-133 connection failure and retry | `q3dcb` | +| Q10 | `rpi-pico2-w` / 3DCB | Native-keyboard profile | Pass after an explicitly retained Android-133 connection failure and retry | `q3dcb` | C3 ran both `while True:\n pass\n` and `while True:\n print(24680)\n`. The recorded UI changed from Running to @@ -124,9 +185,15 @@ All board connections were explicitly released; temporary diagnostic apps, device helper files and the debugging forward were removed. The isolated qualification app/data and private evidence remain available for review. An exact ownership manifest records the disposable board fixtures. Coordinated -cleanup removed nine authored files and five empty owned directories from the -Classic ESP32, generic S3, Waveshare and Pico. Each file was read and privately -backed up before deletion; unchanged unrelated root entries and disconnection -were verified for every board. The C3 fixtures remain reserved for the iPad -acceptance run. Private per-board cleanup receipts retain the commands, -readback hashes and before/after listings. +Android/iPad cleanup removed nineteen authored files and ten empty owned +directories across all five boards. Each file was read and privately backed up +before deletion; unchanged unrelated root entries and disconnection were +verified for all eight cleanup sessions. Private per-board receipts retain the +commands, readback hashes and before/after listings. + +Classic ESP32 remained absent from a fresh scan after the retained reconnect +failures. Its CP2102 endpoint and ROM chip identity were checked against the +earlier binding, then an ordinary RTS reset restored advertising. The ROM-only +command performed no firmware or VFS write. A fresh eight-second scan observed +all five boards advertising. This restores board availability and is not +counted as an app reconnect pass. From 8d21c5ddaa036ce1b807f14765a1ff6397b4157a Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 20:14:39 +0700 Subject: [PATCH 28/31] [docs] carry accepted Android setup into operator recipe Signed-off-by: Viwat Vchirawongkwin --- .../c1-s2/01_Operator_Recipe.md | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/01_Operator_Recipe.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/01_Operator_Recipe.md index 74afa0ce..fd45908b 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/01_Operator_Recipe.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/01_Operator_Recipe.md @@ -5,7 +5,7 @@ | Field | Record | |---|---| -| Status | Prepared 31 October 2026; candidate execution/reproduction and final results remain pending | +| Status | Executed, corrected and reviewed 31 October 2026 for accepted bounded recovery; optional independent reproduction remains separate | | Applies to | Bounded current-text candidate `0.3.0+9`, PYB-006.2; no full project/Blocks recovery claim | | Source | [Normative contract](../../../specifications/App/current-draft-recovery.md), [S1 inventory/cost model](../c1-s1/04_Validation_Inventory_and_Operator_Recipe.md) | | Result owner | Actual operator records name, date, immutable candidate/artifacts and raw-evidence location; no absent owner is invented | @@ -29,6 +29,30 @@ observations. Do not flash a different firmware merely to exercise this app-only storage feature; use a recorded applicable baseline and the selected affected matrix. +### Recorded Android qualifier setup + +The [final Lenovo run](05_Android_Acceptance.md#final-candidate-recheck) used the +normal `bef67bd` profile APK under its isolated qualification identity. Its +actual package-verified launcher icon and temporary **Unrestricted** battery +mode are part of the accepted setup. Earlier shell-launched attempts genuinely +hit the startup watchdog while the OEM suppressed the renderer service. No +product startup fix or general production-package workaround is implied. + +For a comparable rerun, record the original qualifier battery mode, device-idle +exemption and OEM configuration before changing any setup. Apply a temporary +qualifier-only change only for the scoped comparison; preserve global settings +and the production package. Bind the installed artifact again after diagnostic +or older-candidate substitutions. Restore the original policy and verify it +after the run; the accepted session restored **Optimized**, removed the qualifier +exemption and retained byte-identical global DuraSpeed settings. + +An initialized empty Blocks workspace exposes **Browse examples** while Preview +code is disabled with **Add blocks to generate Python**. Verify that state, +select the Hello example, then check generated text and keyboard behavior. +Do not classify an empty workspace as a startup failure merely because Preview +is disabled. Retain genuine watchdog, connection and selector failures with +their separate outcomes. + ## Automated checks Run commands from `app/` with the repository's pinned Flutter toolchain. Preserve From 36e7308655aab984b7498e1be4f31b71dd8abd5c Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 20:19:40 +0700 Subject: [PATCH 29/31] [docs] link final integration without predicting merge Signed-off-by: Viwat Vchirawongkwin --- CHANGELOG.md | 5 +++-- docs/ROADMAP.md | 5 +++-- .../decisions/0010-working-loop-in-memory-document.md | 4 ++-- .../0048-bounded-current-text-draft-recovery.md | 4 ++-- .../01_Overview_and_Scrum_Framework.md | 2 +- .../2026-q4-reliable-workflow/02_Product_Roadmap.md | 4 ++-- .../2026-q4-reliable-workflow/03_Milestones.md | 4 ++-- .../2026-q4-reliable-workflow/04_Sprint_Plan.md | 2 +- .../05_Product_Backlog_and_Stories.md | 4 ++-- .../2026-q4-reliable-workflow/06_Sprint_Backlogs.md | 4 ++-- .../c1-s2/00_Execution_Record.md | 9 +++++---- .../c1-s2/06_Release_Readiness.md | 4 ++-- .../PyBLE_Implementation_Plan_and_Strategy_v1.0.md | 11 ++++++----- 13 files changed, 33 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eef3a736..0bb968b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,9 @@ remains a separate historical baseline built from its annotated tag. The merged app source now targets `0.3.0+9`. Its local Android and iPad Preview installations support scoped engineering acceptance for bounded recovery and -the declared app-only matrix. Device closeout is complete; final integration and actual channel -delivery remain separate. The recorded existing-channel baseline is Android +the declared app-only matrix. Device closeout is complete. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final +integration; required CI and merge precede publishing. Actual channel delivery +remains pending. The recorded existing-channel baseline is Android Play `0.2.0 (8)` and iPad TestFlight `0.2.0 (6)`; the earlier build-5 Transporter and build-8 submission handoffs remain historical artifact records. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 81049d6b..25f5cc71 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -44,8 +44,9 @@ v0.7.0 remains non-normative and requires separate maintainer approval. estimate remains a forecast, not measured effort. - Correct the [stale public TestFlight description](developments/2026-q4-reliable-workflow/c1-s1/05_TestFlight_Metadata_Correction.md) through the distribution owner; replacement copy is prepared, not published. -- Complete [final integration and channel delivery](developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md) for qualified app `0.3.0+9`, - retaining the recorded 0.2.0 channel baseline until the new channel is verified. The +- Complete [channel delivery](developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md) for qualified app `0.3.0+9`. + [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. + Retain the recorded 0.2.0 channel baseline until the new channel is verified. The [Android publication review](testing/website/android-open-testing-2026-09-25.md) records live open-testing availability. The [prepared build-8 handoff](testing/google-play/0.2.0-build-8.md) remains a diff --git a/docs/decisions/0010-working-loop-in-memory-document.md b/docs/decisions/0010-working-loop-in-memory-document.md index aad7ac56..3c218b11 100644 --- a/docs/decisions/0010-working-loop-in-memory-document.md +++ b/docs/decisions/0010-working-loop-in-memory-document.md @@ -70,6 +70,6 @@ That 25 September inspection was design-only. The 31 October candidate now implements the bounded current-text successor; its [C1-S2 execution record](../developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md) records scoped engineering acceptance after integrated/physical checks, with -exact test conditions and completed device closeout; final integration and -channel delivery remain separate. The remaining A-24 project, settings, console, import and +exact test conditions and completed device closeout. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final +integration; required CI and merge precede publishing. Channel delivery remains pending. The remaining A-24 project, settings, console, import and Blocks obligations remain carried. diff --git a/docs/decisions/0048-bounded-current-text-draft-recovery.md b/docs/decisions/0048-bounded-current-text-draft-recovery.md index 32186d95..4e2bf853 100644 --- a/docs/decisions/0048-bounded-current-text-draft-recovery.md +++ b/docs/decisions/0048-bounded-current-text-draft-recovery.md @@ -8,8 +8,8 @@ 2026-09-25 during C1-S1. PR #40 merged the source and integrated CI passes. Scoped recovery acceptance and app-only qualification are recorded for frozen runtime `bef67bd` after required automated and physical checks. Device closeout -is complete; final branch integration and channel delivery remain separate; no -named human sign-off is claimed. +is complete. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede +publishing. Channel delivery remains pending; no named human sign-off is claimed. ## Context diff --git a/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md b/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md index a5df4088..1f740e61 100644 --- a/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md +++ b/docs/developments/2026-q4-reliable-workflow/01_Overview_and_Scrum_Framework.md @@ -18,7 +18,7 @@ This package derives execution views from the strategy. It does not replace normative specifications, expand hardware claims, create GitHub issues, or authorize store/website publication. The strategy and original package were recorded together in planning baseline `d039db0`. The [C1-S1 execution record](c1-s1/00_Execution_Record.md) owns actual results and blockers. -**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. Final branch integration and actual M-05 store delivery remain separate. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. +**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. Actual M-05 store delivery remains pending. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. ## Navigation and ownership of information diff --git a/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md b/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md index eafa16b0..2624a31a 100644 --- a/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md +++ b/docs/developments/2026-q4-reliable-workflow/02_Product_Roadmap.md @@ -5,7 +5,7 @@ | Control | Value | |---|---| -| Status | C1-S1 remains partial; bounded recovery and app-only qualification pass 31 October engineering review. Next release work is final integration and M-05 delivery; pilot/capacity inputs remain outstanding | +| Status | C1-S1 remains partial; bounded recovery and app-only qualification pass 31 October engineering review. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. M-05 delivery and pilot/capacity inputs remain outstanding | | Planning date | 25 September 2026; dates use Asia/Bangkok | | Source | [Implementation strategy revision 1.8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), particularly §§1, 6–9, 12, 14, and 19 | | Inspected baseline | `main` at `23ed764b0ef88dce9720c66fbd1c0655268860cf` | @@ -13,7 +13,7 @@ | Planning authority | Product Owner orders the Product Backlog; Developers forecast feasible work during Sprint Planning; names and capacity remain unassigned | | Related documents | [Framework](01_Overview_and_Scrum_Framework.md), [milestones](03_Milestones.md), [Sprint Plan](04_Sprint_Plan.md), [stories](05_Product_Backlog_and_Stories.md), [Sprint Backlogs](06_Sprint_Backlogs.md) | -**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. Final branch integration and actual M-05 store delivery remain separate. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. +**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. Actual M-05 store delivery remains pending. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. ## Product Goal and decision principle diff --git a/docs/developments/2026-q4-reliable-workflow/03_Milestones.md b/docs/developments/2026-q4-reliable-workflow/03_Milestones.md index fe212de2..290ae9d6 100644 --- a/docs/developments/2026-q4-reliable-workflow/03_Milestones.md +++ b/docs/developments/2026-q4-reliable-workflow/03_Milestones.md @@ -5,14 +5,14 @@ | Control | Value | |---|---| -| Status | M-01/SG0 remains Blocked on 25 September by pilot ownership/cohort/setup and capacity decisions; existing channel installations verified on retry. M-02 and scoped app-only M-04 pass 31 October engineering review; device closeout is complete, while final integration and M-05 channel delivery remain pending; forecast windows need replanning | +| Status | M-01/SG0 remains Blocked on 25 September by pilot ownership/cohort/setup and capacity decisions; existing channel installations verified on retry. M-02 and scoped app-only M-04 pass 31 October engineering review; device closeout is complete. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. M-05 channel delivery remains pending; forecast windows need replanning | | Planning date | 25 September 2026; dates use Asia/Bangkok | | Source | [Implementation strategy revision 1.8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), especially §§4, 8–10, 14, and 19 | | Inspected baseline | `main` at `23ed764b0ef88dce9720c66fbd1c0655268860cf` | | Related documents | [Framework](01_Overview_and_Scrum_Framework.md), [roadmap](02_Product_Roadmap.md), [Sprint Plan](04_Sprint_Plan.md), [stories](05_Product_Backlog_and_Stories.md), [Sprint Backlogs](06_Sprint_Backlogs.md) | | Meaning | Milestones describe inspectable outcomes and decision evidence; they are not additional Scrum events or promised releases | -**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. Final branch integration and actual M-05 store delivery remain separate. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. +**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. Actual M-05 store delivery remains pending. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. ## Assessment and evidence states diff --git a/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md b/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md index 972c862a..78328338 100644 --- a/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md +++ b/docs/developments/2026-q4-reliable-workflow/04_Sprint_Plan.md @@ -12,7 +12,7 @@ | Acceptance criteria | [Product backlog and stories](05_Product_Backlog_and_Stories.md) | | Task-level proposal | [Sprint backlogs](06_Sprint_Backlogs.md) | -**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. Final branch integration and actual M-05 store delivery remain separate. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. +**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. Actual M-05 store delivery remains pending. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. ## Forecast and commitment boundary diff --git a/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md b/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md index a63ea6d0..41eb2703 100644 --- a/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md +++ b/docs/developments/2026-q4-reliable-workflow/05_Product_Backlog_and_Stories.md @@ -9,11 +9,11 @@ | Source | [Implementation strategy revision 1.8](../../planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md), initially derived 25 September; reconciled 31 October 2026 | | Cycle | Proposed 28 September–20 December 2026; Asia/Bangkok | | Baseline | `23ed764b0ef88dce9720c66fbd1c0655268860cf`; completed publication work is evidence, not a new commitment | -| Status | C1-S1: PYB-001.1/.2 and PYB-006.1 scoped work Done; pilot preparation awaits setup and observation work awaits evidence. PYB-006.2/M-02, scoped 008/009 and app-only M-04 pass engineering review; final integration and M-05 delivery remain separate | +| Status | C1-S1: PYB-001.1/.2 and PYB-006.1 scoped work Done; pilot preparation awaits setup and observation work awaits evidence. PYB-006.2/M-02, scoped 008/009 and app-only M-04 pass engineering review; [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. M-05 delivery remains pending | | Accountabilities | Product Owner orders the backlog; Developers size and select work in Sprint Planning; named people and capacity remain to be assigned | | Navigation | [Overview and Scrum](01_Overview_and_Scrum_Framework.md) · [Roadmap](02_Product_Roadmap.md) · [Milestones](03_Milestones.md) · [Sprint plan](04_Sprint_Plan.md) · [Sprint Backlogs](06_Sprint_Backlogs.md) | -**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. Final branch integration and actual M-05 store delivery remain separate. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. +**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. Actual M-05 store delivery remains pending. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. ## 1. How to use this backlog diff --git a/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md b/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md index 7b701ac1..b45ffba7 100644 --- a/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md +++ b/docs/developments/2026-q4-reliable-workflow/06_Sprint_Backlogs.md @@ -5,7 +5,7 @@ | Field | Rule | |---|---| -| Status | C1-S1: six Done, two Prepared, four Awaiting evidence. C1-S2: ten engineering tasks Done, T11 Awaiting participant evidence. M-02 and app-only M-04 accepted 31 October; final integration and M-05 delivery pending. Original allowances/calendar remain historical | +| Status | C1-S1: six Done, two Prepared, four Awaiting evidence. C1-S2: ten engineering tasks Done, T11 Awaiting participant evidence. M-02 and app-only M-04 accepted 31 October; [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. M-05 delivery remains pending. Original allowances/calendar remain historical | | Product/Sprint Goals | [Framework](01_Overview_and_Scrum_Framework.md) and [Sprint plan](04_Sprint_Plan.md) | | Acceptance authority | [Product backlog and stories](05_Product_Backlog_and_Stories.md); task completion never overrides a parent story's acceptance criteria | | Selection | Developers confirm scope, ownership, estimates and task plan at each Sprint Planning | @@ -20,7 +20,7 @@ The initial tasks are small planning units, generally 1–4 hours. If a task or Record optional follow-up consent and the prospective day-7–14 window at each activation. Collect follow-up as windows arrive, starting with the first cohort; do not postpone early cohorts until S5. S1 observation allowances include any follow-up due within S1; S2-T11, S3-T10 and later follow-up rows continue it. Developers must reallocate headroom or other selected work if actual pilot effort exceeds these allowances, preserving required recovery review and tests. Record missed windows as missing/late evidence rather than reconstructing an on-time response. -**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. Final branch integration and actual M-05 store delivery remain separate. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. +**31 October acceptance update:** scoped current-text recovery (PYB-006.2 / M-02) and the app-only M-04 candidate pass engineering review at `bef67bd`: 984 ordinary tests, 36 frozen-runtime CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. The [C1-S2 record](c1-s2/00_Execution_Record.md) preserves exact artifacts, firmware baselines, earlier-row impact assessments and the temporary Android qualifier battery-policy condition. Signed packages and the release packet are prepared; original device policy and normal board advertising are restored, and owned fixtures are cleaned. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. Actual M-05 store delivery remains pending. S1 remains six Done / two Prepared / four Awaiting evidence; S2 has ten engineering tasks Done and participant follow-up unfinished. Original dates/hours remain the baseline; the [continuation plan](04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records the next work and unresolved human capacity. ## C1-S1 — reproduce the current workflow and size recovery diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md index 58a0772f..396a87b6 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md @@ -11,7 +11,7 @@ | Candidate | App `0.3.0+9`; recovery baseline merged at `6f5b3ea`, landscape repair `e54a78a`, native dismissal `01a7ac8`, and guide correction `bef67bd` under PR #41; platform and release reports bind each actual artifact | | Scope | PYB-006.2 bounded current-text recovery; supporting PYB-009.1 recipe and applicable PYB-008.1 observations | | Contract | [Current-draft recovery](../../../specifications/App/current-draft-recovery.md), [ADR-0048](../../../decisions/0048-bounded-current-text-draft-recovery.md) | -| Overall state | Scoped PYB-006.2 / M-02 and app-only M-04 pass engineering review at frozen runtime `bef67bd`: 984 ordinary tests, 36 runtime-head CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. Device policy, owned fixtures and normal board advertising are restored; final branch integration, M-05 channel delivery and S2 participant follow-up remain unfinished | +| Overall state | Scoped PYB-006.2 / M-02 and app-only M-04 pass engineering review at frozen runtime `bef67bd`: 984 ordinary tests, 36 runtime-head CI checks, both-platform recovery/keyboard evidence and all ten declared app/profile rows. Device policy, owned fixtures and normal board advertising are restored; [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. M-05 channel delivery and S2 participant follow-up remain unfinished | | S1 state | Unchanged: six Done, two Prepared, four Awaiting evidence; M-01/SG0 and pilot work remain unfinished | | Capacity/calendar | Original S2 allowance 24h and 12–25 October dates remain historical forecasts. The 45–72h estimate / 60h S2–S4 option is not measured effort or confirmed human capacity | | Method | Separate storage, coordinator and UI Git worktrees; root integrates board/session guards, regressions, release records and qualification attempts | @@ -54,7 +54,7 @@ scope; no M-02/M-04 acceptance follows from packaging alone. |---|---|---| | iPad normal workflow | [iPad acceptance continuation](04_iPad_Acceptance.md) | Normal Preview passes offline Unicode Restore/current-board consent at `e54a78a`, generated-text handoff/recovery at `01a7ac8`, and Editor/native Blocks palette Hide→Show/dismissal at `bef67bd`; exact text and usable viewports are retained. All five iPad Q rows pass on their recorded candidates; exact firmware baselines and unchanged-behavior impact assessment remain explicit | | Android normal workflow | [Android acceptance continuation](05_Android_Acceptance.md) | Recorded P01–P15 scope and all five Q rows pass with explicit earlier-source/accessibility limits. Final `bef67bd` normal profile `945e9746…` passes Editor/native Blocks keyboard checks and generated-text/offline recovery after actual launcher start under temporary qualifier-only Unrestricted battery policy; original watchdogs and the policy condition remain recorded | -| Production artifacts and channel packet | [Release readiness](06_Release_Readiness.md) | Current `bef67bd` signed Android/iOS artifacts pass packaging and repeated 16 KiB Android startup/storage checks. Earlier artifacts are historical; scoped engineering acceptance is recorded below, with device closeout complete and final integration/actual channel delivery separate | +| Production artifacts and channel packet | [Release readiness](06_Release_Readiness.md) | Current `bef67bd` signed Android/iOS artifacts pass packaging and repeated 16 KiB Android startup/storage checks. Earlier artifacts are historical; scoped engineering acceptance is recorded below, with device closeout complete. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. Actual channel delivery remains pending | | Pilot and capacity | [Pilot kit](../c1-s1/02_Pilot_Protocol_and_Observation_Kit.md) and [continuation order](../04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) | Human owner/cohort/setup/capacity and actual consented sessions remain pending | The subsequent guide correction is integrated at @@ -255,8 +255,9 @@ human sign-off or a Scrum ceremony. ESP32 returned to advertising after fresh ROM identity verification and an ordinary RTS reset, with no firmware/filesystem write; all five boards then advertised. That restoration is not counted as an app reconnect pass. The - platform/release reports retain the private receipts. Final branch - CI/review/merge remains separate from the 36 passing frozen-runtime checks. + platform/release reports retain the private receipts. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) + tracks final integration; required CI and merge precede publishing and remain + separate from the 36 passing frozen-runtime checks. - **Next release stage — M-05:** verify store access and unused build numbers, upload only the admitted artifacts after final integration, then record processing, actual availability and store-delivered upgrade/launch evidence separately. diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md index b2418232..883668c6 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s2/06_Release_Readiness.md @@ -9,7 +9,7 @@ | Scope | App-only bounded current-text recovery; existing Play open-testing and TestFlight channels | | Runtime source | Recovery baseline plus landscape layout, native keyboard dismissal and iPad palette-geometry repairs at `bef67bded9e5b83437e3eb0e2ec4be6a4cfd1a64` | | Build checkout | Release worktree `c6e685dd3ebe718ed89fcfe58e441331eb174648`; app tree `60b3a68b693551af5d83076547c502f69838e052`, verified identical to the runtime baseline | -| 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 | +| State | M-02 and app-only M-04 engineering admission accepted on 31 October for the frozen artifacts below. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing; M-05 delivery remains pending | | Local evidence | Ignored `local/recovery-completion/release/candidate-bef67bd/`: build/check logs, source/artifact manifests, runtime evidence and retained signed binaries | | Public copy | [Prepared release packet](../../../publication/app-0.3.0-build-9-release-packet.md); no submission or availability claim | @@ -29,7 +29,7 @@ claim a new firmware release, fresh firmware OI-1 qualification or a Ready badge | Gate | Required evidence | Current disposition | |---|---|---| | 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 | -| 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 frozen-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 | +| 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 frozen-runtime CI checks; pinned goldens and clean analysis/source gates. The final documentation/rebase head must pass required CI for [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) before merge and publishing | | 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 | | 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 | | 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 | diff --git a/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md b/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md index 39f9d097..57310f20 100644 --- a/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md +++ b/docs/planning/PyBLE_Implementation_Plan_and_Strategy_v1.0.md @@ -13,8 +13,8 @@ |---|---| | Document version | 1.8 — accepted bounded recovery and app-only qualification; channel/pilot continuation; original filename retained | | Prepared | 25 September 2026 | -| Last reviewed | 31 October 2026; bounded M-02 and app-only M-04 engineering acceptance recorded with exact candidate, firmware and OEM test conditions; device closeout complete; final integration and channel delivery separate | -| Status | C1-S1 has six tasks Done, two Prepared awaiting pilot setup and four Awaiting evidence; Sprint and SG0 remain unfinished. Bounded recovery and app-only qualification pass scoped engineering review; device closeout is complete; final integration and actual channel delivery remain separate. Human capacity and recruitment dates need replanning; no new protocol behavior approved | +| Last reviewed | 31 October 2026; bounded M-02 and app-only M-04 engineering acceptance recorded with exact candidate, firmware and OEM test conditions; device closeout complete; [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing; channel delivery pending | +| Status | C1-S1 has six tasks Done, two Prepared awaiting pilot setup and four Awaiting evidence; Sprint and SG0 remain unfinished. Bounded recovery and app-only qualification pass scoped engineering review; device closeout is complete. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. Actual channel delivery remains pending. Human capacity and recruitment dates need replanning; no new protocol behavior approved | | Product | PyBLE — Python over Bluetooth Low Energy | | Organization | SciLabPro | | Planning horizon | Immediate 12-week delivery cycle, followed by conditional expansion through September 2028 | @@ -188,7 +188,7 @@ Do not spend the first sprint rebuilding a large analytics dashboard. A small pr | [Device information types](../../app/lib/pble/types.dart) | Negotiated chip, agent version, and capabilities | A support export must distinguish observed data from operator-supplied profile/provenance; current HELLO does not prove an artifact hash | | [Host conformance fixtures](../../tests/firmware_tests/host/conformance/README.md), [HIL guide](../../tests/firmware_tests/hil/README.md) | Shared vectors, compiled-native/portable tests, physical benches and release evidence tools | Add a coverage map and operator recipe before creating another harness or schema | -**Accepted next-release engineering increment:** PYB-006.2 closes the bounded current-text part of the carried A-24 persistence gap. The [C1-S2 record](../developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md) binds its 31 October engineering acceptance, exact artifacts, physical conditions and carried limits. One acknowledged Drift checkpoint can be restored offline; generated Blocks text is covered only after explicit adoption into Editor. Full projects, Blocks graphs and new protocol operations remain outside this increment. Complete final integration and M-05 distribution next, while arranging real pilot observations and confirmed human capacity. The original design/sizing estimates remain historical forecasts, not measured effort.[^app-contract] +**Accepted next-release engineering increment:** PYB-006.2 closes the bounded current-text part of the carried A-24 persistence gap. The [C1-S2 record](../developments/2026-q4-reliable-workflow/c1-s2/00_Execution_Record.md) binds its 31 October engineering acceptance, exact artifacts, physical conditions and carried limits. One acknowledged Drift checkpoint can be restored offline; generated Blocks text is covered only after explicit adoption into Editor. Full projects, Blocks graphs and new protocol operations remain outside this increment. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and merge precede publishing. Complete M-05 distribution next, while arranging real pilot observations and confirmed human capacity. The original design/sizing estimates remain historical forecasts, not measured effort.[^app-contract] ## 3. Target users and positioning @@ -390,8 +390,9 @@ The cycle intentionally excludes a complete new protocol version, full classroom **31 October continuation:** bounded recovery M-02 and app-only M-04 pass engineering review at frozen `bef67bd`, with required automated/platform evidence, exact firmware inputs and the documented Lenovo qualifier condition. -Device closeout is complete. Finish final branch integration, then M-05 account, -submission and installed-channel verification. Do not schedule the same accepted +Device closeout is complete. [PR #41](https://github.com/PyBLE-dev/PyBLE/pull/41) tracks final integration; required CI and +merge precede publishing. M-05 account, submission and installed-channel +verification remain the next release stage. Do not schedule the same accepted matrix again without changed scope or invalidated evidence. The [dated continuation order](../developments/2026-q4-reliable-workflow/04_Sprint_Plan.md#31-october-continuation-order-and-reforecast) records this selection and the human capacity/pilot inputs still needed. Source From eccc639a5e00076cdf4f7b3a44752356db6d9ce4 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 20:20:48 +0700 Subject: [PATCH 30/31] [docs] date S1 inventory gaps and link accepted app results Signed-off-by: Viwat Vchirawongkwin --- ...alidation_Inventory_and_Operator_Recipe.md | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s1/04_Validation_Inventory_and_Operator_Recipe.md b/docs/developments/2026-q4-reliable-workflow/c1-s1/04_Validation_Inventory_and_Operator_Recipe.md index 5c5495f7..71333458 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s1/04_Validation_Inventory_and_Operator_Recipe.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s1/04_Validation_Inventory_and_Operator_Recipe.md @@ -3,7 +3,7 @@ # C1-S1 — validation inventory and operator recipe -| Field | Recorded state | +| Field | Recorded S1 state (25 September 2026) | |---|---| | Task / story | C1-S1-T12 / PYB-009.1; initial inventory and recipe, with scoped recovery completion planned in C1-S2-T01 | | Inspection date / source | 25 September 2026; `d039db09779ed45124874721f88b2e0931664743` before this documentation change | @@ -15,17 +15,23 @@ This is an operator entry point to maintained suites, not a new harness or release schema. Follow the selected candidate's versioned contracts and the current [HIL guide](../../../../tests/firmware_tests/hil/README.md). A host test proves the tested software contract; a physical run proves only its recorded artifact, device and scenario. Neither supplies participant-observation evidence or a PyBLE Ready award. -**31 October handoff:** this is the S1 design/inventory baseline. The -[C1-S2 implementation record](../c1-s2/00_Execution_Record.md) and -[scoped operator recipe](../c1-s2/01_Operator_Recipe.md) now track candidate source -and actual acceptance states. Original estimates are not measured effort or -confirmed future capacity; historical device access is not a new candidate run. +**31 October acceptance update:** this document preserves the 25 September S1 +design/inventory baseline. The [C1-S2 execution record](../c1-s2/00_Execution_Record.md) +now records accepted bounded recovery and all ten app-only Q01–Q10 rows, with +exact candidate/firmware identities, earlier-row impact assessments and physical +conditions in the [iPad](../c1-s2/04_iPad_Acceptance.md) and +[Android](../c1-s2/05_Android_Acceptance.md) reports. PYB-009.1's scoped +[operator recipe](../c1-s2/01_Operator_Recipe.md) was executed and reviewed. +The S1 “unassigned” and “not run” entries below are historical findings, not the +current app-only acceptance state. Fresh firmware qualification, PYB-009.2 +second-operator reproduction, Ready and pilot claims remain separate. Original +estimates are not measured effort or confirmed future capacity. ## 1. Evidence and gate selection | Proposed claim | Required evidence and authority | What remains separate | |---|---|---| -| Documentation task complete | Source/link/command review and applicable contributor gates | PYB-009.1 also needs the scoped recovery procedure completed/reviewed in S2; second-operator reproduction is PYB-009.2 | +| Documentation task complete | Source/link/command review and applicable contributor gates | PYB-009.1 includes the scoped recovery procedure, completed and reviewed in the [S2 recipe](../c1-s2/01_Operator_Recipe.md); second-operator reproduction is PYB-009.2 | | App source change works | Specification-first change, meaningful red/green tests, locked app CI, affected physical app scenarios and the accepted Definition of Done | Fake BLE, emulators and source version strings do not establish store installation or firmware qualification | | Candidate app supports the five existing profiles | At least the ten platform/profile rows below, affected lifecycle/recovery cases and declared exact firmware baselines; qualify the claimed capability on both platforms | An unchanged released firmware is a named compatibility input; an app-only increment does not automatically require rebuilding/requalifying all firmware bytes | | New automated-qualified v0.6.1 firmware release | Fresh atomic five-profile build/provenance/license/OI-1/hardening/provisioning/recovery matrix; both physical app rows in every V5 record; all applicable C3, Pico and Waveshare gates | A representative pair of app runs, a completed build or one Ready rehearsal cannot admit the release | @@ -78,11 +84,11 @@ Unless a row names another directory, commands run from the repository root in a | Private evidence | New access-controlled paths outside candidate/qualification checkouts for addresses, serial/UID bindings, raw capture and generated receipts; do not paste identifiers, user files or console content into Git | | Public evidence | Reviewed redacted output, hashes, timestamps, exact scope and failed/not-run rows; link existing release formats rather than creating competing result files | -## 3. Physical inventory and ten app rows +## 3. Physical inventory and ten app rows — 25 September S1 baseline Historical release evidence establishes which exact profiles exist, not whether the required bench hardware is presently available. No physical board inventory was performed in this task. The initial 25 September discovery found no ADB device and the paired iPad's app query was denied while locked. The later user-supplied device retry supersedes those access gaps: [Lenovo TB-J616X / Android 12](06_Android_Channel_Verification.md) has verified Play `0.2.0 (8)` and [iPad16,10 / iPadOS 26.6.2](07_iPad_Channel_Verification.md) has verified TestFlight `0.2.0 (6)`; both launch. These checks do not select a firmware candidate or execute BLE scenarios. Host discovery found no `/dev/cu.usbmodem*`, `/dev/cu.usbserial*`, `/dev/cu.SLAB*` or `/dev/cu.wch*` endpoint; that does not exclude separately powered BLE boards. Pairing is not an app-install or HIL pass. -| Resource | Current execution state | Required owner action before a physical batch | +| Resource | 25 September S1 execution state, including device retry | Action identified by S1 before a physical batch | |---|---|---| | Five exact boards, revisions/memory/module markings | Historical profiles recorded; current possession, condition and firmware identity unverified | Physical operator assigned at Planning checks and privately records each exact unit | | Android tablet / Play access | Available during retry; existing beta membership, Play installation `0.2.0 (8)` and launch verified | Reconfirm availability for the selected candidate; retain Android payload mapping and delivered minimum-SDK limitations | @@ -94,7 +100,7 @@ Historical release evidence establishes which exact profiles exist, not whether All ten rows below are **not run for C1-S1**. An unchanged historical pass must retain its date/artifact instead of becoming a current pass. Platform rows reference one exact firmware digest per selected profile; they do not require duplicating the host OI-1 workload as though it were a tablet test. -| Row | Exact provisioning profile | Platform | Required profile distinction | Current blocker | +| Row | Exact provisioning profile | Platform | Required profile distinction | Blocker recorded in the 25 September S1 inventory | |---|---|---|---|---| | Q01 | `esp32-4mb` | iPadOS | Classic ESP32, 4 MiB flash; PBLE chip `esp32` | Exact board/candidate/operator unassigned; channel installation now verified | | Q02 | `esp32-4mb` | Android | Same declared firmware bytes as Q01 | Exact board/candidate/operator unassigned; channel installation now verified | @@ -125,7 +131,7 @@ Every selected row covers the applicable edit/save/run/stdout/STOP/file-readback Across five fresh firmware profiles the fixed minimum OI-1 work therefore includes 50 reset samples, 25 PUT/GET pairs, 100 reliability files and 5 physical power cycles; v0.6.1 adds 250 sequential RUNs and 10 workspace acquisitions. Those totals exclude setup, retries as new retained attempts, manual provisioning/recovery, profile-specific observations and ten tablet rows. No additional 100-operation or 30-recovery floor is introduced. -## 5. Operator procedure for the next authorized run +## 5. Operator procedure proposed in the 25 September S1 inventory | Step | Action | Expected output / stop condition | |---|---|---| @@ -134,7 +140,7 @@ Across five fresh firmware profiles the fixed minimum OI-1 work therefore includ | 3 — Check host prerequisites | Use the pinned app/build tools where applicable; run focused harness/conformance checks; inspect full CI requirements for the selected change | Exit-zero host logs permit proceeding to physical execution only; failures stay visible | | 4 — Identify over BLE | Use service-filtered discovery, select the physically verified exact unit, run identity smoke with explicit chip and agent version | HELLO/DEVICE_INFO/INFO agree; no chip-family inference of board profile or flash size. Keep scan identities private | | 5 — Core physical app run | On each platform separately, record actual install/build; connect and inspect identity; create/edit/save a harmless named test file; run and verify output; STOP tight-loop/print-flood cases under the applicable gate; upload/read back exact bytes; disconnect/reconnect and verify workspace | Retain actual outcomes and timing evidence. Permission denial, wrong selection, timeout and stale session behavior are findings, not success | -| 6 — Recovery regression | For the current app, distinguish navigation/disconnect from OS process termination. Preserve user content before termination. For the later recovery candidate, execute the accepted write-boundary/restore/discard/failure/board-isolation scenarios from the [recovery design](03_Recovery_Design_and_Sizing.md) | Current source does not yet guarantee durable draft recovery. S2 supplies the executable recovery suite; this recipe does not mark proposed behavior passed | +| 6 — Recovery regression | For the app inspected in S1, distinguish navigation/disconnect from OS process termination. Preserve user content before termination. For the later recovery candidate, execute the accepted write-boundary/restore/discard/failure/board-isolation scenarios from the [recovery design](03_Recovery_Design_and_Sizing.md) | The 25 September inspected source did not guarantee durable draft recovery. The later executable suite and accepted physical results are recorded in [C1-S2](../c1-s2/00_Execution_Record.md); this S1 recipe itself supplies no physical pass | | 7 — Firmware-specific qualification if selected | Follow the maintained OI-1 verify command, profile overrides, private workspace acquisitions, seven-scenario bench and profile-specific gates against one protected candidate | Fresh, immutable, exclusive-created results. Destructive acquisition requires a separately authorized disposable target, not routine app qualification | | 8 — Recover a failed attempt | Stop running code where the link remains serviceable; disconnect/reconnect explicitly. If needed use documented safe boot/power reset, then the exact board's ESP bootloader or Pico BOOTSEL recovery procedure with a verified image | Preserve the first failed log. Reset is not evidence of recovery unless observed. Never erase/reflash user storage as an automatic troubleshooting step | | 9 — Close the record | Confirm only test-owned files are cleaned up and original reviewed configuration restored; retain every attempt with result and duration; redact logs before public use | Failed/unrun rows remain explicit; no handwritten passing HIL map. Re-run affected steps after a recipe correction before an independent reproduction claim | @@ -199,7 +205,7 @@ The app subtotal includes ten total rows: the S2 representative iPad/Android run Before S3/S5 selection, Developers must replace these ranges with the first measured batch and named access, choose app-only versus fresh-firmware claim, assign exact Q rows to batches, and reforecast anything exceeding capacity. A failed required row blocks the relevant claim; the Sprint calendar never changes its pass threshold. -## 7. Checks actually performed and remaining work +## 7. Checks performed and actions identified in the 25 September S1 inventory The following focused suites ran on macOS 26.6.2 arm64, Python 3.13.5, at source `d039db09779ed45124874721f88b2e0931664743`. All use host fixtures/fakes; they open no physical BLE or serial connection. @@ -213,10 +219,10 @@ The following focused suites ran on macOS 26.6.2 arm64, Python 3.13.5, at source The full firmware suite, app suite, cross-builds and hardware tests were not run by this task. A separate `test_v061_hardening_release_gate.py` invocation was stopped during this bounded inspection before a result was collected; it supplies no pass. The [execution record](00_Execution_Record.md) records integrated document/source checks separately. -| Remaining action | Owner assignment / next checkpoint | +| Action remaining at the 25 September S1 inventory | Owner assignment / next checkpoint proposed at S1 | |---|---| -| Confirm exact boards, safe fixtures, backups, candidate and physical operator | Product Owner/Developers name the actual operator at Planning; until then Q01–Q10 remain not run | +| Confirm exact boards, safe fixtures, backups, candidate and physical operator | Product Owner/Developers were to name the actual operator at Planning; Q01–Q10 were not run in S1 | | Reconfirm tablet availability and candidate identity for the selected physical batch | Device access and current channel installation checks are complete for this retry; device/channel owner rechecks when the candidate or session changes | -| Bind executable recovery cases and revise estimate from the accepted contract | App + QA during C1-S2-T01; proposed current-draft behavior has no physical result yet | +| Bind executable recovery cases and revise estimate from the accepted contract | App + QA during C1-S2-T01; the then-proposed current-draft behavior had no physical result in S1 | | Time the first representative pair; allocate remaining rows and reruns | QA/Developers before C1-S3 scope selection | | Independently review and reproduce the recipe if PYB-009.2 is selected | Named second operator with separately allocated time; assistance remains visible and triggers an affected-step rerun | From 34dd89e40bc69b97a0d1caf198f234eab6cf1e02 Mon Sep 17 00:00:00 2001 From: Viwat Vchirawongkwin Date: Sat, 31 Oct 2026 20:40:56 +0700 Subject: [PATCH 31/31] [docs] align S1 handoff with completed device acceptance Signed-off-by: Viwat Vchirawongkwin --- .../2026-q4-reliable-workflow/c1-s1/00_Execution_Record.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/developments/2026-q4-reliable-workflow/c1-s1/00_Execution_Record.md b/docs/developments/2026-q4-reliable-workflow/c1-s1/00_Execution_Record.md index c63a41ea..347ea1ce 100644 --- a/docs/developments/2026-q4-reliable-workflow/c1-s1/00_Execution_Record.md +++ b/docs/developments/2026-q4-reliable-workflow/c1-s1/00_Execution_Record.md @@ -72,8 +72,9 @@ The original 136-hour task allocation, 20-hour planned headroom and 84-hour rese ## 31 October handoff to bounded implementation The user requested the next-release implementation after the C1-S1 integration -and cleanup. The [C1-S2 record](../c1-s2/00_Execution_Record.md) now tracks candidate -merged source, passing integrated CI and outstanding physical acceptance. The +and cleanup. The [C1-S2 record](../c1-s2/00_Execution_Record.md) now records scoped +PYB-006.2 / M-02 and app-only M-04 engineering acceptance, including both-tablet +physical evidence; it tracks final integration and pending channel delivery. The 25 September findings above remain historical evidence. This handoff does not complete the two Prepared or four Awaiting-evidence S1 tasks, M-01/SG0, full A-24, participant observations, a Ready badge or store delivery.