Toolchain verified: watchapp/ scaffolded, builds and runs on emery + gabbro #75

Merged
robert merged 1 commit from tooling/pebble-sdk-emulators into main 2026-09-03 22:24:41 +02:00
Owner

Closes #2.

What this does

Scaffolds watchapp/ and takes D54 from recalled (a planning-stage review claim) to verified by actually running the whole pipeline on this machine, 2026-09-03.

Verified (ran on this machine — commands and output in docs/DEV.md)

  • pebble --version → Pebble Tool v5.0.40 (active SDK: v4.33.1). Matches D54 exactly.
  • Installed at ~/.local/share/pebble-sdk/ (with a /var/tmp/pebble-sdk symlink to it), not the ~/.pebble-sdk/ of 2016-era docs — confirms D54's callout.
  • pebble-tool's own venv pins Python 3.13.15 (~/.local/share/uv/tools/pebble-tool/pyvenv.cfg) regardless of the system interpreter (3.14.7 here) — the pin is a uv-managed build-time venv, not a system requirement. Clarifies D54's "Python 3.13 pin is mandatory" note: mandatory for pebble-tool's venv, not for the system python3 the issue's own AC ("completes on Python 3.10+") refers to.
  • SDK vendors its own arm-none-eabi-gcc 14.2.1 and QEMU — confirmed via the linker path in build output. No system ARM toolchain or qemu-system-arm needed.
  • pebble new-project watchapp scaffolded cleanly; targetPlatforms trimmed to ["basalt", "emery", "gabbro"] per the issue's 2026-08-31 update.
  • pebble build: clean 3-platform build, 2.171s wall clock (time after pebble clean) — consistent with D54's "2.5 seconds" (normal run-to-run variance). Single build/watchapp.pbw confirmed via unzip -l to contain basalt/, emery/ and gabbro/ sub-bundles.
  • pebble install --emulator emery and --emulator gabbro: both App install succeeded.
  • Interactivity, not just install: took a screenshot on each emulator, sent pebble emu-button click select, and re-screenshotted — the scaffold's TextLayer updates from "Press a button" to "Select" on both emery (200×228 rectangular) and gabbro (260×260 round). This is a real running app, not a stale installed binary.
  • Per-platform heap headroom from the build's memory report: gabbro 130242 B free, emery 130242 B free, basalt 64706 B free — recorded in docs/DEV.md as a baseline for NFR-B1 tracking as the app grows.

A note, not a doc reopen (D48)

The SDK's own linker emits ld: warning: ... has a LOAD segment with RWX permissions on every platform, on the unmodified scaffold — before a line of app C was written. This comes from the vendored linker script, not from project code, and -Wall -Wextra -Werror (PROCESS.md §2's warning-free gate) doesn't touch it since that's a compiler flag set, not a linker one. Not a contradiction of any decision, just flagging it now for whoever wires up that CI gate so a pre-existing, benign SDK warning isn't mistaken later for a regression this PR introduced. Recorded in docs/DEV.md.

Files

  • watchapp/ — scaffold (package.json, wscript, src/c/watchapp.c), SDK template unmodified except targetPlatforms
  • docs/DEV.md — new; install/build/run steps, all tagged verified
  • README.md — Status section and docs table updated; it previously said the repo was documentation-only, which stopped being true

Not in scope here

No app logic — that's #8 (watchapp skeleton, field store) per PROCESS.md §8's execution order. This issue was specifically the toolchain + emulator round-trip.

Closes #2. ## What this does Scaffolds `watchapp/` and takes D54 from *recalled* (a planning-stage review claim) to *verified* by actually running the whole pipeline on this machine, 2026-09-03. ## Verified (ran on this machine — commands and output in docs/DEV.md) - `pebble --version` → `Pebble Tool v5.0.40 (active SDK: v4.33.1)`. Matches D54 exactly. - Installed at `~/.local/share/pebble-sdk/` (with a `/var/tmp/pebble-sdk` symlink to it), **not** the `~/.pebble-sdk/` of 2016-era docs — confirms D54's callout. - `pebble-tool`'s own venv pins Python **3.13.15** (`~/.local/share/uv/tools/pebble-tool/pyvenv.cfg`) regardless of the system interpreter (3.14.7 here) — the pin is a `uv`-managed build-time venv, not a system requirement. Clarifies D54's "Python 3.13 pin is mandatory" note: mandatory for pebble-tool's venv, not for the system python3 the issue's own AC ("completes on Python 3.10+") refers to. - SDK vendors its own `arm-none-eabi-gcc 14.2.1` and QEMU — confirmed via the linker path in build output. No system ARM toolchain or qemu-system-arm needed. - `pebble new-project watchapp` scaffolded cleanly; `targetPlatforms` trimmed to `["basalt", "emery", "gabbro"]` per the issue's 2026-08-31 update. - `pebble build`: clean 3-platform build, **2.171s** wall clock (`time` after `pebble clean`) — consistent with D54's "2.5 seconds" (normal run-to-run variance). Single `build/watchapp.pbw` confirmed via `unzip -l` to contain `basalt/`, `emery/` and `gabbro/` sub-bundles. - `pebble install --emulator emery` and `--emulator gabbro`: both `App install succeeded`. - **Interactivity, not just install**: took a screenshot on each emulator, sent `pebble emu-button click select`, and re-screenshotted — the scaffold's `TextLayer` updates from "Press a button" to "Select" on both `emery` (200×228 rectangular) and `gabbro` (260×260 round). This is a real running app, not a stale installed binary. - Per-platform heap headroom from the build's memory report: `gabbro` 130242 B free, `emery` 130242 B free, `basalt` 64706 B free — recorded in docs/DEV.md as a baseline for NFR-B1 tracking as the app grows. ## A note, not a doc reopen (D48) The SDK's own linker emits `ld: warning: ... has a LOAD segment with RWX permissions` on **every** platform, on the **unmodified scaffold** — before a line of app C was written. This comes from the vendored linker script, not from project code, and `-Wall -Wextra -Werror` (PROCESS.md §2's warning-free gate) doesn't touch it since that's a compiler flag set, not a linker one. Not a contradiction of any decision, just flagging it now for whoever wires up that CI gate so a pre-existing, benign SDK warning isn't mistaken later for a regression this PR introduced. Recorded in docs/DEV.md. ## Files - `watchapp/` — scaffold (`package.json`, `wscript`, `src/c/watchapp.c`), SDK template unmodified except `targetPlatforms` - `docs/DEV.md` — new; install/build/run steps, all tagged verified - `README.md` — Status section and docs table updated; it previously said the repo was documentation-only, which stopped being true ## Not in scope here No app logic — that's #8 (watchapp skeleton, field store) per PROCESS.md §8's execution order. This issue was specifically the toolchain + emulator round-trip.
D54 recorded pebble-tool 5.x as the solved toolchain from a planning-stage
review; this makes it verified rather than recalled. Ran the install, the
scaffold, a clean three-platform build and an interactive emulator session
on both emery and gabbro (button press updates on-screen text), not just an
install log.

- watchapp/ scaffolded via 'pebble new-project'; targetPlatforms trimmed to
  basalt/emery/gabbro per the issue's 2026-08-31 update. No app logic yet —
  this is the SDK's own template, to prove the pipeline.
- docs/DEV.md records the verified install/build/run steps, including a
  Python-3.13-pin clarification (build-time venv pin via uv, independent of
  the system python3) and a note for whoever owns the CI warning-free gate:
  the SDK's own linker emits an RWX-LOAD-segment warning on every platform
  on the unmodified scaffold, unrelated to -Wall -Wextra -Werror.
- README.md Status section and docs table updated; it previously said the
  repo was documentation-only, which stopped being true.

Closes #2
Claude-Session: https://claude.ai/code/session_01DAoXbRmJUf2uxNYBfdAXPt
robert merged commit 2ce6c247ac into main 2026-09-03 22:24:41 +02:00
Sign in to join this conversation.
No description provided.