Skip to content

feat(symbian): run PocketJS apps on Nokia E7#176

Merged
doodlewind merged 7 commits into
mainfrom
scented-dance
Jul 24, 2026
Merged

feat(symbian): run PocketJS apps on Nokia E7#176
doodlewind merged 7 commits into
mainfrom
scented-dance

Conversation

@doodlewind

@doodlewind doodlewind commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add a pinned linux/amd64 Qt 4.7.4, Belle SDK, GCCE 4.6.3, GnuPoc, Rust, and QuickJS toolchain for Nokia E7 development
  • implement the no-std PocketJS Rust core ABI and a Qt/QuickJS Symbian host with embedded application JavaScript and PAK assets
  • expose the workflow through pocket symbian ..., including exact E7 MTP staging with readback verification, direct USB CODA health checks, and repeatable coda usb launch
  • run PocketJS at the E7 native viewport: 640x360 landscape and 360x640 portrait, with Qt automatic orientation and in-place Solid/Vue Vapor relayout that preserves application state
  • retain the Hero fixed 480x272 PSP/Vita contract while adding a dynamic E7 variant and portrait-safe responsive rows

Review follow-up

  • guard the Symbian global allocator against alignments above the platform malloc guarantee in both alloc and realloc
  • derive core ticks as 60 / POCKETJS_FRAME_RATE and reject non-positive or non-divisor rates at compile time
  • allocate experimental host ABI 4 and pass the resolved plan value through build-app → qmake → C++ instead of duplicating it
  • move the shared live-viewport hook lifecycle into host.ts; Solid and Vue Vapor tests now retain a real content node and component state across resize without remounting
  • remove dead viewport keys, keep docs/SYMBIAN_E7.md git-only, document the container Bash exception, update repository structure, and add the standalone Symbian bridge test to the release workflow
  • keep Hero admission target-neutral, including macOS widget, and keep the experimental profile tool-owned until its production graduation gates are met
  • make doctor require the locally installed pinned nightly, its Cargo component, and exact rust-src state without implicitly downloading a missing toolchain; app builds invoke that selected nightly explicitly
  • acquire the runtime output lock before resetting or writing the shared payload, and hold it through guest build, Rust core build, container packaging, and final output validation
  • replace live Bullseye repositories with exact Debian and Debian Security snapshot imports; package resolution is now part of the implementation digest, extra sources are removed, and bounded APT retries cover transient snapshot CDN failures

Follow-up design work is tracked in #178, #179, #180, #181, and #182.

Physical-device validation

  • pocket symbian doctor --device --coda-usb passes against an RM-626 Nokia E7 in Nokia Suite mode
  • CODA reports 4.0.23:app; the TCF Locator handshake completes over USB without an IP address or legacy Nokia macOS driver
  • pocket symbian coda usb launch remotely starts the installed PocketJsE7Runtime.exe; the final public CLI validation returned CODA process context p2399
  • the Qt UI probe is visible on the E7
  • the Rust probe displays PocketJS Rust core linked on Symbian
  • the QuickJS probe displays QuickJS + Promise jobs: 42
  • adaptive runtime 1.1.1 was staged to Mass memory/Installs and read back byte-for-byte; SHA-256: 49e40c39d9bc0aaab93ad0d62f4722f956180aa40c1dfa87d6dae3379bfd35b8
  • runtime 1.1.1 installation, launch, visible output, and native 640x360 landscape / 360x640 portrait live relayout are confirmed on the RM-626
  • final review build 1.1.2 with host ABI 4 packages successfully from the fixed-snapshot toolchain; SHA-256: e23903d0dbeb8535dac4f1644cb3cdf0fd6587c1984f3e95b338cd889a8662a8

Validation

  • bun run test — 221 + 170 + 1 + 7 + 4 + 10 + 13 tests pass
  • bun tests/golden.ts — 49/49 web pixel goldens pass without updates
  • bun run tape:check — 180/180 deterministic frame hashes match
  • the CODA protocol fixture checks the exact 59-byte launch payload, fragmented/coalesced frames, progress then reply, NAK, command errors, reply overflow, and invalid process IDs
  • the shipped C client compiles with C11 -Wall -Wextra -Werror
  • bunx tsc --noEmit
  • cargo fmt --manifest-path engine/symbian/Cargo.toml -- --check
  • cargo clippy --manifest-path engine/symbian/Cargo.toml --all-targets -- -D warnings
  • cargo test --locked --manifest-path engine/symbian/Cargo.toml — 2/2 pass
  • custom armv6-symbian-eabi no-std release build
  • no-cache Docker image rebuild installs amd64+i386 packages exclusively from the exact Debian snapshots; package-set SHA-256: fe3bf96a06fa3051d08e8c7d9e1d5084a9447b80c2a71f18c15a107dd7add95c
  • rebuilt bun tools/symbian.ts setup --yes with native qmake, Qt code-generator, GCCE/E32, SIS, and signing smoke checks
  • final bun tools/symbian.ts doctor passes Docker, pinned Rust/Cargo/rust-src, download hashes, native tools, and host MTP prerequisites
  • final application build passes GCCE 4.6.3/C++98 compilation, Rust/QuickJS/Qt linking, elf2e32, SIS packaging, signing, and host ABI 4 propagation
  • simulator visual QA at 640x360 and 360x640 confirms a full opaque canvas, portrait wrapping, and no clipping or overlap
  • shell syntax and git diff --check

Boundary

The private symbian-e7-dev profile remains outside the production target registry until repeatable physical-device acceptance and golden testing are complete. The current public input wire has 9-bit touch coordinates, so the E7 host does not advertise touch and suppresses native-size touch snapshots rather than truncating the 640-pixel axis.

The new CODA command is remote launch, not a full source-level debugger. CODA exposes run control, logging, memory, registers, and breakpoints, but PocketJS does not yet ship a CODA-to-GDB adapter, matching native symbol artifacts, or a Symbian GDB. QuickJS source-level breakpoints remain a separate PocketJS DevTools transport task.

@doodlewind doodlewind changed the title feat(symbian): add Nokia E7 development toolchain feat(symbian): run PocketJS apps on Nokia E7 Jul 24, 2026
@doodlewind
doodlewind marked this pull request as ready for review July 24, 2026 18:25
@doodlewind
doodlewind merged commit a5746e7 into main Jul 24, 2026
@doodlewind
doodlewind deleted the scented-dance branch July 24, 2026 18:25
doodlewind added a commit to wonderbeel/pocketjs that referenced this pull request Jul 25, 2026
pocket-stack#176 landed symbian-e7-dev on hostAbi 4 while this branch was open, so
two contracts claimed the same wire generation. assertNativeHostContract
checks (target, abi) so nothing mis-binds, but the number is a
registry-wide sequence — the incoming target yields to 5 (psp=1, vita=2,
macos-widget=3, symbian-e7-dev=4).

Also register pocketbook in tests/symbian-runtime.test.ts (a second
exhaustive target-key assertion) and record the on-device re-confirm plus
the WIP status in the README.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant