You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
numeric values remain provisional until derived from retained baseline samples.
121
-
The current pre-v1 qualification is profile-scoped:
121
+
The v0.4.2 candidate qualification scope is profile-scoped:
122
122
123
123
| Profile | Current numeric status | Release effect |
124
124
|---|---|---|
125
-
|`esp32-4mb`| Measure, derive, freeze, and verify on the owned exact profile | Required for the current pre-v1 installer |
126
-
|`esp32-s3-n16r8`| Measure, derive, freeze, and verify on the owned exact N16R8 profile | Required for the current pre-v1 installer |
127
-
|`esp32-c3-4mb`| Deferred; no current threshold or HIL row | Blocks C3 enablement and v1.0, but not the two-profile pre-v1 release|
125
+
|`esp32-4mb`| Measure, derive, freeze, and verify on the owned exact profile | Required before v0.4.2 candidate qualification and installer activation|
126
+
|`esp32-s3-n16r8`| Measure, derive, freeze, and verify on the owned exact N16R8 profile | Required before v0.4.2 candidate qualification and installer activation|
127
+
|`esp32-c3-4mb`| Deferred; no current threshold or HIL row | Blocks C3 enablement and v1.0, but not qualification of the two-profile candidate|
Copy file name to clipboardExpand all lines: docs/specifications/firmware/specs.md
+10-9Lines changed: 10 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -90,7 +90,7 @@ Where this document and [TDD.md](TDD.md) touch the same topic, this document win
90
90
-**Workspace jail** — the constraint that PBLE/1 file commands may only read/write within `fs_root`.
91
91
-**Runner** — the task that executes user code (file or inline source).
92
92
-**HIL** — hardware-in-the-loop testing on every exact real-hardware profile
93
-
claimed by a release. The current pre-v1 release matrix is exactly
93
+
claimed by a release. The current pre-v1 candidate matrix is exactly
94
94
`esp32-4mb` and `esp32-s3-n16r8`; the v1.0 matrix additionally requires
95
95
`esp32-c3-4mb` (PRD §1B.3, §10.12).
96
96
-**Frozen-Python agent** — agent modules baked into the firmware image as `.py` (frozen at build); the recommended first implementation.
@@ -251,7 +251,7 @@ are screenless.
251
251
-**FR-LIB-1** — Every `esp32`, `esp32-s3`, and `esp32-c3` firmware image MUST make the pinned upstream MicroPython `neopixel.NeoPixel` API importable offline by user file/source runs and after a soft reboot. MUST (*source: PRD §9.8, §11.3; verify: resolved-manifest/build/HIL; story: F-24/A-31*)
252
252
-**FR-LIB-2** — The module MUST be selected from the pristine pinned MicroPython/micropython-lib tree through each target's frozen manifest; PyBLE MUST NOT copy, fork, patch, or replace it with a custom WS2812 driver. MUST (*source: PRD §1A, §10.9, §10.10; verify: build/structure; story: F-24*)
253
253
-**FR-LIB-3** — Bundling NeoPixel MUST NOT add an agent GPIO abstraction, PBLE/1 opcode/capability, board/onboard-LED name, pin/count/colour default, or target-specific user-code routing. GPIO, pixel count, index, colour, timing, and physical suitability remain explicit user-program/runtime concerns. MUST (*source: PRD §9.8, §11.3; verify: unit/no-leak/HIL; story: F-24/A-31*)
254
-
-**FR-LIB-4** — Release validation MUST resolve exactly one `neopixel.py` for each of the three build targets, record the per-target firmware-size delta, and run a runtime import smoke on every exact profile included in that release. The current pre-v1 runtime matrix is the two profiles in §2.2; `esp32-c3-4mb` runtime smoke remains required before that profile is enabled and before v1.0. Any visual LED smoke MUST take an operator-supplied GPIO, use a bounded dim sequence, and turn the pixel off on exit. MUST (*source: PRD §10.11, §10.13, §13.3; verify: build/size/HIL; story: F-24*)
254
+
-**FR-LIB-4** — Release validation MUST resolve exactly one `neopixel.py` for each of the three build targets, record the per-target firmware-size delta, and run a runtime import smoke on every exact profile included in that release. The current pre-v1 candidate runtime matrix is the two profiles in §2.2; `esp32-c3-4mb` runtime smoke remains required before that profile is enabled and before v1.0. Any visual LED smoke MUST take an operator-supplied GPIO, use a bounded dim sequence, and turn the pixel off on exit. MUST (*source: PRD §10.11, §10.13, §13.3; verify: build/size/HIL; story: F-24*)
255
255
256
256
This NeoPixel contract applies to the three initial ESP32-family images.
257
257
A future platform port MUST NOT claim equivalent support until it validates the
@@ -283,7 +283,7 @@ upstream package and required runtime primitive for that target.
283
283
> and evidence schema before any threshold is selected. It does not invent or
284
284
> claim a numeric threshold.
285
285
286
-
The current pre-v1 qualification set is exactly, and in this order,
286
+
The current pre-v1 candidate qualification set is exactly, and in this order,
287
287
`esp32-4mb` and `esp32-s3-n16r8`. Each MUST have a complete numeric policy and
288
288
final-candidate HIL record before the current public installer can be enabled.
289
289
`esp32-c3-4mb` MUST NOT have a threshold entry or HIL row in this pre-v1
@@ -322,7 +322,7 @@ matrix remains all three profiles.
322
322
story: X-03, F-13/14)*
323
323
-**NFR-FP-CLOSE** — Every exact profile included in a release is
324
324
**release-blocking** until all of its thresholds are frozen and its
325
-
hash-locked final-candidate evidence passes. For the current pre-v1 release
325
+
hash-locked final-candidate evidence passes. For the current pre-v1 candidate
326
326
this means exactly the two profiles above. The still-open C3 portion blocks
327
327
any C3 release and v1.0, but it does not block an otherwise-qualified
@@ -664,7 +665,7 @@ This is software-level safety of the IDE/agent, **not** hardware/actuator safety
664
665
verification MUST inspect generated frozen content or the running image, not
665
666
stale intermediate `.mpy` files. — *(source: FR-LIB, ADR-0018; verify:
666
667
build/HIL; story: F-24)*
667
-
-**BLD-17** — The current pre-v1 browser release MUST expose exactly
668
+
-**BLD-17** — The current pre-v1 browser candidate MUST target exactly
668
669
`esp32-4mb` and `esp32-s3-n16r8`, with the memory qualifications, merge
669
670
settings, browser-image base offsets, and component offsets frozen in
670
671
[browser-flashing §1](browser-flashing.md#1-release-image-profiles). Family
@@ -762,7 +763,7 @@ These are tracked, release-blocking where noted; they MUST be closed before the
762
763
763
764
-**OI-1 — Per-profile resource numbers pending HIL.** The measurement method,
764
765
exact current scope, evidence contract, and threshold derivation are frozen
765
-
in §5.3. Numeric thresholds remain open. The current pre-v1 portion closes
766
+
in §5.3. Numeric thresholds remain open. The current pre-v1 candidate portion closes
766
767
only when `esp32-4mb` and `esp32-s3-n16r8` each have committed
767
768
evidence-derived policy values and passing final-candidate HIL. That state
768
769
MUST be described as **“qualified for the current two-profile pre-v1
@@ -776,7 +777,7 @@ These are tracked, release-blocking where noted; they MUST be closed before the
776
777
Before release builds and HIL, its exact committed bytes MUST be selected as
777
778
candidate-frozen immutable inputs. That selection is not hardware approval:
778
779
the exact candidate MUST still pass HIL on every exact profile included in
779
-
that release. The current pre-v1 set is the two profiles in §5.3; C3 remains
780
+
that release. The current pre-v1 candidate set is the two profiles in §5.3; C3 remains
780
781
mandatory before C3 enablement and before v1.0. A pin change creates a new
781
782
candidate and resets all candidate-bound evidence. — *(verify: build, HIL)*
782
783
-**OI-3 — Frozen → native split point TBD.** The agent starts frozen-Python; the decision of which hot paths (BLE I/O, framing, file chunking) move to a native `USER_C_MODULE`, and on which chip the budget forces it, is open and determined by HIL footprint/throughput measurement ([firmware.md §2](../firmware.md#2-agent-base-native-vs-frozen), [PRD §10.2](../prd.md)). The PBLE/1 wire contract MUST NOT change across the move (NFR-MAINT-3). — *(verify: size, conformance, HIL)*
| Gate | Metric and direction | Current pre-v1 profiles | ESP32-C3 / v1.0 |
858
+
| Gate | Metric and direction | Current pre-v1 candidate profiles | ESP32-C3 / v1.0 |
859
859
|---|---|---|---|
860
860
|**FP-FLASH**| Total shipped application-image ceiling plus factory-partition headroom floor | Freeze separately for `esp32-4mb` and `esp32-s3-n16r8`| Remains open for `esp32-c3-4mb`; C3 is the hard constraint |
861
861
|**FP-HEAP**| Python GC and internal-IDF current/largest/minimum heap floors after HELLO and transfer workloads | Freeze separately for both included profiles; default-capability `free_mem` is diagnostic only | Must leave usable user-code and control-plane headroom |
@@ -864,7 +864,7 @@ rounding formulas, and evidence contract are normative in
864
864
865
865
Requirements:
866
866
867
-
- The current pre-v1 public set is exactly the two profiles in §10.12. Their
867
+
- The current pre-v1 candidate set is exactly the two profiles in §10.12. Their
868
868
numeric thresholds and hash-locked final-candidate HIL are release-blocking.
869
869
`esp32-c3-4mb` MUST remain absent from that release's policy, HIL rows,
870
870
artifacts, recovery, and installer selection.
@@ -1101,7 +1101,7 @@ Exact per-package licenses MUST be generated mechanically at build time (not han
1101
1101
### §15.3 Distribution
1102
1102
1103
1103
- The app MUST be distributed **free** on the **Apple App Store** and **Google Play**, at feature parity across iPadOS and Android tablets (see §13.6 and §19). No account, no paywall, no in-app purchase.
1104
-
- A browser-based **web flasher** MUST be hosted at `pyble.dev/flash`, built on **esp-web-tools**, with one profile-scoped, single-build manifest per exact profile included in that release (see [firmware.md §6](firmware.md#6-build--distribution)). It MUST allow a user to flash the agent from a supported desktop browser over USB without installing a toolchain, and MUST NOT give ESP Web Tools a multi-family manifest that could override the user's selected profile. The current pre-v1 set is the two profiles in §10.12; C3 is unavailable until separately qualified.
1104
+
- A browser-based **web flasher** MUST be hosted at `pyble.dev/flash`, built on **esp-web-tools**, with one profile-scoped, single-build manifest per exact profile included in that release (see [firmware.md §6](firmware.md#6-build--distribution)). It MUST allow a user to flash the agent from a supported desktop browser over USB without installing a toolchain, and MUST NOT give ESP Web Tools a multi-family manifest that could override the user's selected profile. The current pre-v1 candidate set is the two profiles in §10.12; C3 is unavailable until separately qualified.
`manifest.json` files, and `THIRD_PARTY_LICENSES`) MUST be published at the
1107
1107
canonical immutable `pyble.dev/firmware/v<version>/` path, one set per exact
@@ -1390,7 +1390,7 @@ The entry flow is scan → connect → use, with no QR pairing, no account, and
1390
1390
These are the production targets the project measures itself against. Numeric
1391
1391
BLE/throughput targets are validated on hardware for every exact profile
1392
1392
included in a release and MUST be frozen per profile after measurement. The
1393
-
current pre-v1 matrix has two profiles; the v1.0 matrix has all three. Until a
1393
+
current pre-v1 candidate matrix has two profiles; the v1.0 matrix has all three. Until a
1394
1394
profile's values are frozen, they are stated as intent, not asserted.
1395
1395
1396
1396
| Metric | Definition | v1.0 target | Status |
@@ -1543,7 +1543,7 @@ The foundational product decisions are resolved and recorded as Architecture Dec
1543
1543
file MUST first be candidate-frozen as the immutable release-build/HIL
1544
1544
input; that state is not approval. The same candidate MUST then pass the
1545
1545
complete exact-profile HIL matrix before its pins and resource gates are
1546
-
approved. The current pre-v1 subset is exactly the two profiles in §10.12;
1546
+
approved. The current pre-v1 candidate subset is exactly the two profiles in §10.12;
1547
1547
all three, including C3, are required for v1.0 (§10.9, §17.1, §21.2). A pin
1548
1548
change creates a new candidate. New ADRs are added if a pin or budget
1549
1549
changes materially.
@@ -1564,4 +1564,4 @@ New significant decisions MUST be captured as additional ADRs (`docs/decisions/N
1564
1564
|**Control plane**| The agent's protected layer that owns BLE, the runner, and the filesystem bridge. It MUST NOT be editable by user code; a frozen `while True` in user code MUST NOT be able to wedge BLE or block `STOP`. |
1565
1565
|**Workspace**| The user's own files on the board — `/main.py`, `/lib/*.py`, `/data/*` (Layer 4). Just programs the agent runs; never the control plane. |
1566
1566
|**Platform port / target adapter**| Layer-2 integration for a MicroPython target: BLE host, scheduler/interrupt boundary, storage/config, identity, build, and provisioning. The initial ESP32 port uses per-chip board overlays for `esp32` / `esp32-s3` / `esp32-c3`, copied into the upstream tree at build prep so the submodule stays pristine. |
1567
-
|**HIL**| Hardware-in-the-loop — validation and measurement performed on a real board (as opposed to host-side or fake-transport tests). Resource and BLE/goodput numbers are frozen only after HIL measurement for every exact profile claimed by a release. The current pre-v1 matrix is `esp32-4mb` plus `esp32-s3-n16r8`; v1.0 additionally requires `esp32-c3-4mb`. |
1567
+
|**HIL**| Hardware-in-the-loop — validation and measurement performed on a real board (as opposed to host-side or fake-transport tests). Resource and BLE/goodput numbers are frozen only after HIL measurement for every exact profile claimed by a release. The current pre-v1 candidate matrix is `esp32-4mb` plus `esp32-s3-n16r8`; v1.0 additionally requires `esp32-c3-4mb`. |
0 commit comments