Files
ESP32_Serial_Swiss_Army_Knife/docs/roadmap.md
T

34 KiB
Raw Blame History

Implementation roadmap

This document tracks the implementation and hardware-validation plan for the ESP32 Serial Swiss Army Knife. It describes intended sequencing rather than a release schedule. Completion requires implementation, documentation and build validation, plus relevant hardware tests or an explicitly recorded user waiver. A waiver is not a hardware-test pass.

Status legend

  • Complete — implemented and accepted, with target-hardware validation or an explicit phase-specific user waiver recorded below.
  • In progress — implementation or validation is actively underway, but the overall phase is not complete.
  • Implemented; validation pending — code is present and builds, but the current implementation still needs the listed hardware checks.
  • Planned — accepted project direction, not yet implemented.
  • Under evaluation — useful candidate whose feasibility, security, or resource cost must be measured before it becomes a commitment.

Project-wide design constraints

These constraints apply across all phases:

  • UART0 remains the trusted physical administration and recovery console.
  • UART1 and the MAX3243 provide the single physical RS-232 data port.
  • All serial transports use the central session broker: one writer, multiple observers.
  • A slow or failed client must not block UART reception or unrelated clients.
  • Serial data paths remain binary-transparent; transports must not reserve in-band control sequences.
  • Network serial access must be authenticated and encrypted. No unauthenticated plaintext TCP serial service is planned.
  • Secrets must not be exposed by routine status output, command completion, or logs.
  • Resource use must remain bounded and observable on the ESP32-S3 N16R8 target.
  • New work must preserve USB CDC and UART0 recovery when Wi-Fi or a network service fails.
  • Project code remains GPL-3.0-only; third-party license notices and compatibility must be preserved.

Phase overview

Phase Scope Status
0 RS-232 hardware characterization and diagnostics Complete
1 Persistent UART1 serial-service foundation Complete
2 Transport-neutral session broker Complete
3 Native USB CDC-ACM serial transport Complete
4 Wi-Fi station/AP foundation and network diagnostics Complete
5A Authenticated HTTPS administration foundation Complete
5B Offline xterm.js WebSocket serial terminal Complete
6 Authenticated SSH serial transport Complete
7 Local display and button interface Complete
8 Role-based users and administrative access Complete
9 Small intermittent-use security baseline Complete (user signoff 2026-09-18; new hardware check waived)
10 Simple admin web firmware upload Planned
11 BLE serial transport and provisioning evaluation Planned
12 Advanced network integration Under evaluation
13 Optional filesystem-backed features Under evaluation

Completed phases

Phase 0 — RS-232 hardware characterization

Implemented and hardware-validated:

  • Central board pin profile for the ESP32-S3 N16R8 and MAX3243 breakout.
  • MAX3243 enable, static driver, receiver, valid-voltage, and modem-signal checks.
  • UART loopback across supported framing and baud-rate combinations.
  • Hardware CTS transmit gating and RTS receive-backpressure tests.
  • Exclusive RS-232 port ownership and fault-safe cleanup.
  • RGB status indication for diagnostic state.
  • Phase 0 hardware diagnostics, including signal status, are isolated under the debug CLI submenu.

Detailed procedures are in Electrical tests and Hardware wiring.

Phase 1 — Serial-service foundation

Implemented and hardware-validated:

  • Persistent, versioned UART configuration with safe defaults.
  • UART1 lifecycle management and exclusive ownership.
  • Nonblocking RX and TX software streams.
  • Baud rate, data bits, parity, stop bits, RTS/CTS, DTR policy, and RTS threshold controls.
  • Runtime counters and safe restart after working-configuration changes.
  • Explicit save/load/default/reset behavior; edits are not silently persisted.

Phase 2 — Session broker

Implemented and hardware-validated:

  • Up to eight generation-safe broker clients.
  • Exactly one writer lease with multiple observers.
  • Bounded per-client output and event queues.
  • Slow-observer isolation and drop accounting.
  • Writer grant, release, denial, revocation, and forced administrative reassignment.
  • DTR on-connect integration.
  • Partial-transfer and retryable no-progress semantics for transports.
  • Broker payload storage placed preferentially in PSRAM while FreeRTOS control structures remain in internal RAM.

Phase 3 — Native USB CDC-ACM

Implemented and hardware-validated:

  • Native ESP32-S3 USB CDC-ACM serial transport.
  • Automatic broker connection when the host opens the port with DTR asserted.
  • Opportunistic writer acquisition with observer fallback.
  • Binary-transparent bidirectional serial data.
  • Host line-coding visibility for diagnostics; UART1 remains under explicit serial configuration control.
  • Disconnect cleanup, bounded buffering, counters, and UART0 lifecycle controls.

Phase 4 — Wi-Fi foundation

Implemented and hardware-validated:

  • Four persistent station profiles with priority ordering.
  • WPA2/WPA3 mixed mode and WPA3-SAE-required mode.
  • Explicit no-echo secret entry through UART0.
  • AP policies off, fallback, and always.
  • Random persistent fallback-AP password and MAC-derived default SSID.
  • Bounded profile attempts, DHCP deadlines, failover, and retry backoff.
  • Root and wifi aliases for ping, nslookup, and traceroute.
  • Wi-Fi/lwIP payload allocation configured to prefer PSRAM with capacities pinned in sdkconfig.defaults.

Post-validation enhancements implemented; regression validation pending:

  • Edits to disabled station profiles are staged without restarting the active radio; enable-state changes and edits affecting enabled radio policy apply asynchronously.
  • Configurable STA-only sak-<suffix>.local mDNS hostname with an independent versioned NVS record, live hostname updates, automatic withdrawal/restoration across STA IPv4 transitions, and nonfatal failure isolation. The responder initializes at most once and keeps its task stack internal while general metadata prefers PSRAM.

A WPA3-required profile correctly rejects an AP that does not advertise the required Protected Management Frame capability; mixed mode is the compatible choice for such an AP.

Phase 5A — Authenticated HTTPS foundation

Implemented and hardware-validated:

  • HTTPS-only service on TCP port 443 using ESP-IDF mbedTLS.
  • Persistent random shared admin credential, later retained only as migration/recovery material by Phase 8.
  • Persistent device-specific ECDSA P-256 certificate and private key.
  • Physical-console credential retrieval, rotation, certificate inspection, rotation, and recovery.
  • Explicit failure behavior that preserves UART0, USB, serial, and Wi-Fi recovery paths.
  • Credential rotation revocation hooks shared with WebSocket and SSH sessions.

Phase 5B — Offline browser terminal

Implemented and hardware-validated:

  • Vendored xterm.js and FitAddon assets; no Internet or CDN dependency.
  • CSP-compatible page structure with scripts served as separate resources.
  • Authenticated status and one-time WebSocket-ticket APIs.
  • Binary WebSocket serial frames and broker writer/observer integration.
  • Two bounded browser-terminal sessions.
  • Writer request/release controls and role indication.
  • Bounded TLS/socket behavior and slow-observer isolation.
  • Viewport-constrained terminal fitting without recursive page growth.
  • Validation with multiple clients, ANSI colors, advanced escape sequences, and full-screen terminal software.

Post-validation enhancement implemented; browser regression validation pending: the combined Connect/Disconnect control explicitly closes the terminal WebSocket and pauses automatic reconnect until Connect is selected.

Phase 6 — Authenticated SSH serial transport

Implemented and target-hardware validated:

  • wolfSSH on TCP port 22 with a separate persistent ECDSA P-256 host key.
  • Two bounded interactive shell/PTY sessions; no exec, file transfer, forwarding, or subsystems.
  • Authenticated, binary-transparent broker forwarding with opportunistic writer acquisition and observer fallback.
  • Bounded handshake attempts/deadlines, receive work, buffers, and a single wolfSSH owner task pinned to CPU 1.
  • UART0 lifecycle, session, counter, and host-key administration.
  • PSRAM-preferred allocations with internal fallback and internal task stacks.
  • Bounded broker/WebSocket work, software mbedTLS AES, and software wolfCrypt AES/SHA to avoid the validated shared-hardware-crypto/PSRAM watchdog failure while retaining ESP-IDF SHA/MPI acceleration.
  • Concurrent USB, WebSocket, and SSH operation validated with USB and SSH alternately holding the writer lease.

Phase 7 — Local display and buttons

Implemented and target-hardware validated:

  • Optional 128×64 SSD1315-compatible I²C OLED on GPIO11/12 and active-low buttons on GPIO10/13/14; assignments remain centralized in board_pins.h.
  • Display service with a static framebuffer, bounded dirty-page commits, and separate yellow status rows 015 plus blue content rows 1663.
  • Low-priority status/control task built from copied public snapshots; no service lock is held across I²C and the UI never becomes a broker client.
  • Overview, RS-232, broker, and network/service pages with no credential or key material.
  • Confirmation-protected local controls for service lifecycle, Wi-Fi reconnect/profile rotation, writer release, display off, and reboot; the UI cannot assign a writer or edit secrets/configuration.
  • Persistent dim/off settings, bounded boot animation, consumed wake presses, stuck-button quarantine, and one-shot confirmations.
  • Missing, disconnected, or unresponsive display hardware remains nonfatal and can recover through one bounded reprobe.
  • Concurrent serial, UART0, USB, WebSocket, SSH, and injected display/button fault behavior validated. See Electrical tests and Hardware wiring.

Phase 8 — Role-based users and administrative access — Complete

Implemented and accepted: a bounded, persistent user system replaces the single shared network credential. Both roles can use the authenticated web serial/status interface. Over SSH, user routes to the broker-backed serial stream while admin routes exclusively to the administration shell and receives no broker client or writer lease. UART0 remains the physical recovery and bootstrap authority.

Completed implementation (8A8C target-hardware validated; 8D explicitly accepted at 8D.22 on 2026-09-13):

  1. Phase 8A — User database and UART0 administration — Complete
    • Versioned NVS database for up to eight user/admin accounts, random account IDs and authentication generations, final-admin protection, and three Ed25519/P-256 keys per account.
    • Salted PBKDF2-HMAC-SHA256 password verifiers, bounded no-echo entry, one-time generated passwords, and secret-free account/key status.
    • Historical migration/bootstrap supported the initial cutover. Current firmware instead commits missing storage empty, provisions the first admin with normal UART0 user add, and provides UART0-only unavailable-database recovery; legacy credential/bootstrap commands are removed.
    • Migration, bootstrap, CRUD, persistence, and command basics target-hardware validated; the full fault-injection matrix remains regression coverage. NVS remains unencrypted and offline guessing remains possible.
  2. Phase 8B — Role-aware HTTPS and SSH authentication — Complete
    • HTTPS and SSH authenticate through the common database and copied secret-free principals; unavailable user storage fails closed. The initial HTTPS Basic path was replaced by cookie authentication in 8D.
    • One-time principal-bound WebSocket tickets and ongoing principal-currentness checks prevent stale admission or input.
    • Account mutations request targeted WebSocket/SSH revocation; authentication generations provide fail-safe invalidation while unrelated accounts remain connected.
    • Password/key login, ticket behavior, targeted revocation, recovery, and concurrent transport operation are target-hardware validated. Legacy credentials were subsequently removed without changing established TLS identity or valid users.
  3. Phase 8C — SSH administrative shell — Complete
    • Authenticated admin SSH shell sessions route to a bounded administration worker and never create a broker client or acquire a serial writer lease. Normal user sessions retain the existing broker-backed serial stream.
    • UART0 and admin SSH now submit complete lines to one fixed-length request queue. A single dispatcher task is the sole caller of ESP-IDF's non-reentrant esp_console_run() and therefore executes the same registered command handlers for both entry routes. The former separately implemented reduced SSH command dispatcher has been removed.
    • The worker uses fixed per-session command/input and output buffers. Queue records contain copied secret-free principals and generation-tagged session tokens; late work is discarded after disconnect, slot reuse, role change, password/key mutation, or deletion. Task-local standard streams route canonical handler output into the applicable bounded SSH ring, and only the SSH owner task calls wolfSSH APIs.
    • Transport-neutral bounded prompts now support interactive user passwords/keys and Wi-Fi secrets over admin SSH without exposing hidden input or allowing another command while a prompt is active. Ping callbacks enqueue typed bounded events and the dispatcher alone formats their output. Four-entry per-session history and whole-line Tab completion are RAM-only and wiped on disconnect.
    • Authenticated administrators receive the operational registry, including HTTPS material rotation/reset, reboot, ping, and SSH lifecycle/session/host-key mutation. Self-terminating reboot and SSH actions are deferred until acknowledgement output drains, block further shell input, and execute through existing synchronous owner APIs from a separate bounded control task. First-admin provisioning and explicit user recover --force remain physical-UART0 operations (user bootstrap was later removed); admin SSH also rejects generating a replacement password for its own account.
    • ssh sessions and ssh counters identify broker versus admin-console routes, worker command state, queued admin output, admission failures, and input backpressure. exit and Ctrl+D on an empty command line request bounded deferred self-disconnect after best-effort application-buffer draining. Admin sessions are checked for a current admin principal before command execution and during the active-session reconciliation.
    • Keep SFTP, SCP, exec, forwarding, subsystems, and unauthenticated shells disabled.
    • Target-hardware validation passed for route separation, history/Tab editing, interactive visible/hidden prompts, output/backpressure, generated and entered user/password/key management including the longest ECDSA P-256 import, ping event routing, deferred reboot/SSH lifecycle drain behavior, bootstrap/recovery rejection, targeted self/other-user revocation during queued work, UART0/SSH administration serialization, and concurrent USB/WebSocket/user-SSH/admin-SSH operation. Stress at 460800 baud with SSH and WebSocket clients caused substantial expected packet drops and slower display controls, but did not exhaust memory or require lowering the supported baud-rate range.
  4. Phase 8D — Integrated web administration — Complete
    • User explicitly signed off tested firmware at 8D.22 on 2026-09-13, superseding earlier per-slice pending acceptance/review gates. Cookie login/logout replaces Basic; bounded digest-only sessions, same-origin/CSRF checks, principal currentness and targeted revocation protect serial and admin routes.
    • Admin-only Serial/Admin selection and Settings preserve connected terminal observation and serial writer ownership. The browser shell shares the serialized UART0/admin-SSH dispatcher, with bounded output, explicit admission and retained frontend restrictions—not unrestricted shell parity.
    • Typed Serial, Accounts/password/authorized-key, Network/Wi-Fi/mDNS, Display, Broker and SSH settings; confirmed HTTPS stop/restart/reboot and HTTPS/SSH identity rotation. Canonical owners compare reserved service/identity/target generations, preserve commit/failure semantics and expose no stored secrets. Admitted work is not cancelled by later logout/timeout; uncertain mutations are never automatically replayed.
    • Accessible Serial/Wi-Fi/client/writer contextual controls reuse existing controllers. Writer transfer is explicit and generation-safe; one writer, isolated observers, binary transparency, UART0 administrative recovery and network-independent native USB UART1 remain invariants.
    • Scope removed by user: 8D.15 dedicated typed network diagnostics (shell diagnostics retained) and the unimplemented 8D.19 ordinary browser-session/native-USB controls (SSH controls retained). Browser identity reset/recovery/export is excluded; canonical recovery remains available.
    • Acceptance evidence and legacy storage compatibility are condensed below. Web administration retains current API/owner/recovery contracts; regression procedures retain practical checks, not claims of execution.

Phase8 acceptance evidence

8D.22 signoff, 2026-09-13: the user explicitly accepted the tested firmware, superseding earlier per-slice target, review and integration gates for the retained scope above. Earlier scoped acceptance covered browser login/logout, shared administration, Serial/account/Network presentation and legacy cleanup. Prior host regression suites and independent reviews were reported passing; this consolidation asserts no new build or test execution.

Prior final Phase 8 build: PASS, 100,556 B linked RAM / 1,828,573 B flash, CPU 160 MHz. The combined binary WebSocket-send fix was separately accepted at 160 MHz / 230400 baud with the full client mix including browser admin; retain combined send and bounded failed-send isolation, not the earlier frequency-only experiment. Ordinary HTTPS idle cleanup was accepted, not every possible admission failure or owner delay.

Latest reported Phase 8 telemetry (bytes):

Sample / capability Free Minimum free Largest block
Boot internal 8-bit 59,808 58,840 31,744
Boot internal DMA 52,052 51,084 31,744
Boot PSRAM 8,196,968 8,183,972 8,126,464
Loaded after burst, internal 8-bit 31,508 2,052 18,432
Loaded after burst, internal DMA 23,752 460 18,432
Loaded after burst, PSRAM 8,136,624 8,065,972 7,995,392

Loaded SSH minimum-free stack: 15,028 B. This sample had two SSH sessions (serial/admin), two serial WebSockets and USB, with SSH as writer. Browser admin had been used then closed; it was not active in this capture. Web send/queue/protocol and SSH IO errors were zero; one SSH handshake failure and one session revocation were reported without an established cause.

Limits, not reopened acceptance gates: missing latest broker/serial counters prevent an exact zero-drop or byte-integrity inference. No latest browser-admin-active full-mix, individual fault-injection, exact duration, soak, cleanup-cycle or reserve-floor result is inferred. Internal/DMA lifetime minima remain a nonblocking transient-headroom follow-up, not approved reserves or proof of allocation failure: capability pools overlap and per-region minima may be non-simultaneous, so do not sum them. HTTPD/dispatcher stack margins, correlated peaks and allocation-reserve policy remain unmeasured/unapproved here. SDK TLS -0x004C means NET_RECV_FAILED, not an OOM diagnosis; stale cookies as the cause of two boot authentication failures remain unconfirmed.

Phase8 legacy credential compatibility

Cleanup was accepted 2026-09-08, with unchanged certificate fingerprint and usable preexisting test users. This is not an unreported provisioning, recovery, power-loss or all-key pass.

  • Users: missing user_db/database is committed as an empty v1 database, with no legacy account/password import. First-admin provisioning is physical UART0 user add <username> admin (optional --generate); entered passwords use hidden confirmation and generated passwords appear once. UART0-only user recover --force rebuilds only an unavailable database empty, refuses healthy databases (including empty ones), and leaves other configuration and TLS/SSH identities untouched; follow with normal user add.
  • Valid existing v1 user bytes load without rewrite or changes to accounts, roles, IDs, authentication generations, verifiers or authorized keys; migrated user accounts are not promoted. Private v1_admin_marker preserves the old wire byte and is derived from admin count on mutation, not a new role/schema/public bootstrap state. Public bootstrap and legacy migration/synchronization APIs are removed; final-admin protection, conditional mutations, principal currentness and targeted revocation remain.
  • TLS: at unchanged web_sec/material, a private reader validates the 1,392-byte v1 layout and migrates to 1,340-byte TLS-only v2, preserving exact private-key DER, certificate DER, SHA-256 fingerprint and material generation—not rotating identity. The candidate is validated and committed before publication; temporary credential-bearing input is wiped. Malformed/unknown material, read/crypto failures and migration write/commit failures fail closed without regeneration or overwrite; truly missing material may be generated normally.
  • web credentials show, web credentials rotate --force and user bootstrap are removed. web certificate info / web certificate rotate --force retain frontend policy. web reset --force replaces TLS identity only, not accounts/passwords/verifiers; replacement/restart may close browser sessions and require renewed certificate trust/login, without revoking unrelated SSH sessions. No public legacy credential reader, display, rotation or authentication path remains.
  • Downgrade/security: older v1-only firmware cannot read v2 HTTPS storage; user-database v1 compatibility does not make HTTPS downgrade safe or restore removed credentials. Logical NVS replacement is not secure flash wiping: historical plaintext legacy credentials may remain, Wi-Fi secrets and TLS/SSH private keys remain unencrypted, and PBKDF2 verifiers permit offline guessing. No erase is required or authorized by cleanup.
  • Prior host tests used NVS fault doubles and a generated identity wrapped in the historical layout, not an independently captured old-device fixture; they do not prove flash durability or power-loss behavior. Focused runners: tests/web_security/run.py, tests/admin_console_boundary/accounts.py, tests/admin_ssh_policy/run.py. See legacy-removal regressions.

Phase 9 — Security and production hardening

Complete — user signoff 2026-09-18; new hardware check explicitly waived. Reduced scope: an intermittently powered wireless serial cable on a trusted network, not a permanently exposed Internet service. The earlier extensive Phase 9 implementation was abandoned in favor of the accepted pre-Phase-9 baseline. Short exposure reduces risk; it does not make upstream defects harmless or certify this firmware secure.

Small implementation:

  • Keep the baseline PlatformIO/ESP-IDF and managed-library versions and upstream sources. No generated dependency patches, custom SSH state machine, crypto-policy replacement, allocator hooks, or SDK migration in this phase.
  • Explicitly disable core dumps and select silent panic reboot through standard sdkconfig.defaults options. Keep ordinary logging; reduced crash diagnostics are a deliberate trade-off. Existing generated configurations must be checked because defaults do not override saved selections.
  • Follow the operational checklist: unique credentials, trusted identity verification, no Internet forwarding, networking off/power off after use, and existing rotation/recovery procedures.
  • Review upstream maintenance releases occasionally and before planned upgrades. Evaluate reachable issues against actual use; any stock dependency upgrade is a separate build/device-tested task, not a reason to accumulate local backports. Preserve existing license notices.

Excluded: secure boot, NVS/flash/PSRAM encryption, eFuse changes, partition changes, exhaustive CVE/zeroization audits, new authentication throttling, and production certification. Existing authentication, session isolation and recovery behavior remain unchanged. There is no protection against physical extraction or replacement of firmware. Phase 10 uses administrator-selected firmware, without a separate image-signing system.

Host/build evidence (2026-09-18): normal pio run passed on PlatformIO 6.12.0 / ESP-IDF 5.5.0 with the original 20241119 toolchains: 94,196 B linked RAM / 1,828,565 B flash. Generated configuration confirms no dumps and silent panic reboot; compilation inputs contain none of the abandoned Phase 9 source overlays or wolf crypto guards. No device operation or target validation was performed.

Acceptance (2026-09-18): the user signed off this small Phase 9 and explicitly waived a new whole-phase hardware check of boot, UART0 recovery, native USB serial, HTTPS/SSH login and normal serial sharing. Application code is unchanged, but crash-diagnostic defaults changed; this is a waiver, not evidence of target or panic-path validation. The prior build/configuration evidence above remains the validation record; no new hardware test was performed. A separately controlled panic check with synthetic secrets remains optional, not a completion gate; do not add a production panic endpoint or erase flash. Disabling dumps does not erase old contents.

Current and planned phases

Phases 8 and 9 are complete for their accepted scopes; Phase 9 completion includes the explicit new-hardware-check waiver above. Phase 10 is planned, not implemented; later work remains planned or under evaluation. Optional features must not weaken completed serial and recovery paths. General release gates below guide future work, not claims that every fault, soak or reserve measurement was performed for Phase 8 or that Phase 9 received new target validation.

Phase 10 — Simple admin web firmware upload

Plan only. Add a file picker and upload button in the existing admin web interface. The owner builds the firmware locally and chooses the application firmware.bin; there is no release server, automatic download or update service. Treat an authenticated administrator as authorized to replace the application, as the physical owner can through wired flashing.

Planned work:

  • Reuse existing HTTPS admin authentication, same-origin and CSRF protections; ordinary user accounts cannot upload firmware. Require an explicit upload/reboot confirmation and show progress, success or an actionable error. Never automatically retry a possibly completed update.
  • Use standard ESP-IDF OTA APIs (esp_ota_begin, esp_ota_write, esp_ota_end, esp_ota_set_boot_partition) to stream one upload at a time through a bounded buffer into the inactive application slot. Use the existing two 4 MiB slots and otadata; no custom flash protocol or whole-image RAM buffer.
  • Accept an ESP32-S3 application binary for this board/layout, not an ELF, ZIP, merged full-flash image, bootloader or partition-table image. Check nonempty/complete upload, target/header compatibility and actual destination capacity; use SDK image validation before selecting the new boot partition. A .bin filename alone is not validation. Basic format/integrity checks do not prove authenticity or that the application will work.
  • On interrupted, invalid or failed uploads, abort the OTA operation and leave the current boot selection unchanged. Select the new slot only after successful final validation, report completion and reboot in a controlled way. Upload may disrupt network/serial activity; reboot interrupts every transport, so do not promise uninterrupted operation.
  • Preserve NVS: write only the inactive application slot and the OTA selection metadata. Do not erase the chip, rewrite the partition table/bootloader, or touch nvs, nvs_key, PHY, storage or other data partitions. Existing users, passwords, Wi-Fi/serial settings and HTTPS/SSH identities remain stored, as with an application-only wired update without erase. This preserves stored bytes; the uploaded firmware must still understand the existing schemas and must not itself erase/migrate them incompatibly.
  • Keep wired USB-to-UART flashing documented as recovery if the uploaded application does not boot or no longer serves the web UI. Basic image validation cannot prevent a valid but broken application from requiring wired recovery.

Not in scope: secure boot, image signatures/signing-key management, anti-rollback/version-downgrade enforcement, automatic rollback/post-boot health-confirmation machinery, remote release discovery, partition migration or NVS backup/restore. Use upstream OTA support without dependency patches. The administrator is responsible for selecting trusted, compatible firmware, including when deliberately installing an older build.

Acceptance: test a successful application upload/reboot, invalid/wrong-target/oversized and interrupted uploads, authorization rejection, and retained configuration/identities after update. Confirm wired recovery remains possible. These are future tests, not execution claims; no new cryptographic certification or exhaustive fault campaign is required.

Phase 11 — BLE

Evaluate and, if resource limits permit, add BLE as another bounded transport or provisioning path.

Planned work:

  • Decide whether BLE is primarily a serial transport, a provisioning interface, or both.
  • Require authenticated pairing/bonding appropriate to the device threat model.
  • Integrate serial access through the existing broker rather than bypassing writer ownership.
  • Preserve binary transparency through explicit framing and MTU-aware partial transfers.
  • Bound connections, queues, retries, and advertising behavior.
  • Measure coexistence with 2.4 GHz Wi-Fi, HTTPS, WebSocket, SSH, USB CDC, and UART service.
  • Store bond/provisioning data under the hardened secret-storage policy.
  • Provide UART0 controls and a physical recovery path for clearing BLE state.

BLE remains subordinate to stable Wi-Fi and serial operation; it should be omitted if coexistence or memory costs cannot be bounded acceptably.

Phase 12 — Advanced network integration

These features are candidates, not current commitments:

  • Additional DNS-SD service advertisement and any certificate-name integration beyond the implemented configurable STA hostname.
  • Enterprise Wi-Fi support, subject to credential-storage and certificate-validation design.
  • IPv6 behavior and diagnostics beyond the current basic support.
  • WireGuard feasibility evaluation, including RAM, CPU, licensing, key storage, routing, and recovery impact.

The device is not intended to become a general-purpose router. Captive-portal interception, unauthenticated DNS redirection, NAPT, and a plaintext serial listener remain out of scope unless the project requirements are explicitly revised.

Phase 13 — Optional filesystem-backed features

The storage partition is reserved but not currently mounted. Possible uses must be justified individually:

  • LittleFS-backed web assets to decouple large static files from the application image.
  • Bounded diagnostic logs with explicit retention and secret-redaction rules.
  • Import/export of non-secret configuration.
  • Optional user files needed by later administration features.

Before enabling storage, define corruption recovery, wear limits, quotas, atomic update behavior, compatibility across OTA slots, and whether encryption is required. Serial operation and recovery must not depend on a mountable filesystem.

Cross-phase release gates

Every phase should satisfy the following before being marked complete, with any user-waived check explicitly recorded in that phase rather than reported as passed:

  1. A clean release build for the ESP32-S3 N16R8 target.
  2. No new compiler or project diagnostics attributable to the change.
  3. Focused automated tests where practical and documented hardware tests where hardware behavior is involved.
  4. UART0, native USB CDC, and previously completed network transports still operate.
  5. Broker writer/observer semantics and binary transparency remain intact.
  6. Failure, disconnect, stop/start, reboot, and stale-session cleanup paths are exercised.
  7. Runtime memory, stack, socket, and queue bounds are measured under maximum supported concurrency.
  8. Secrets remain absent from ordinary status output and logs.
  9. Command reference, Hardware wiring, electrical tests, and this roadmap are updated as applicable.
  10. New dependencies receive security, maintenance, and GPL-3.0 compatibility review.

Explicitly deferred work

The following are not implemented merely because flash partitions or library support exist:

  • NVS, flash, or PSRAM encryption.

  • Secure boot or production eFuse provisioning.

  • Automatic OTA downloads, image signing, post-boot health confirmation and automatic rollback. The simple admin upload is planned in Phase 10.

  • Core-dump collection or secret-safe core-dump processing.

  • Filesystem mounting.

  • SFTP, SCP, SSH exec, forwarding, or subsystems.

  • General routing, NAPT, captive-portal interception, or unauthenticated serial access.

Deferring these features is intentional: each changes the security model, recovery behavior, or bounded-resource assumptions and therefore requires its own design and validation gate.