Skip to content

Status matrix

spec v0.5.0

A single-glance comparison of the spec/ contract against what is built, functioning, and bench-tested in firmware, plus the roadmap ahead.

This is a derived view, hand-maintained. The source of truth is spec/frames.yaml, the firmware in firmware/, and the dated entries in status.md. When code lands, update this file (or regenerate it) — run tools/spec-check.sh to catch spec-version drift. Structured as stable tables so a future web status page can parse it.

  • As of: 2026-06-29
  • Spec version: frames.yaml v0.5.0
  • Current phase: Phase 2 — single-cluster MVP (firmware bring-up)
  • Working link: Zephyr field node (T114 + XIAO nRF52840) ⇄ ESP-IDF hub (Heltec V3.1), endpoint↔hub direct (no router tier yet).

Legend: ✅ done · 🟡 partial · ⬜ not started · — n/a

CodeMessageSpec payloadField FWHub FWBench-testedPhase
0x01STATUS✅ ratified✅ encode✅ decode✅2
0x02STATUS_ACK✅ ratified✅ decode✅ encode✅2
0x03JOIN✅ ratified✅ encode✅ decode✅2
0x04JOIN_ACK✅ ratified✅ decode✅ encode✅2
0x05ANNOUNCE✅ ratified✅ encode✅ decode✅2
0x06WHO_ARE_YOU⬜ no payload⬜⬜⬜2/4
0x07COMMAND✅ ratified✅ decode✅ encode🟡 1/12 cmds2
0x08COMMAND_ACK✅ ratified✅ encode✅ decode✅2
0x10ROUTING_BEACON⬜ pending⬜⬜⬜3
0x11ROUTER_UPLINK⬜ type only⬜⬜⬜3
0x12ROUTER_DOWNLINK⬜ type only⬜⬜⬜3
0x20KEY_ROLLOVER⬜ type only⬜⬜⬜5
0x21HELP⬜ no payload🟡 help-mode flag in STATUS, not a HELP frame—🟡3

The full single-link message layer (0x01–0x08, minus the optional 0x06 WHO_ARE_YOU) is built and hardware-verified on two field boards + hub. Everything ⬜ is router-tier (Phase 3) or later.

The COMMAND frame is complete (decode + inner CMAC verify + replay-check

  • COMMAND_ACK). Only one command has an apply handler; the rest decode and verify, then return unknown_cmd_type.
CmdNamePrivilegeApply handlerNeeded for
0x06set_ack_intervalfield✅(working, persisted)
0x05set_check_in_intervalfield⬜Phase 2 sensing
0x07wake_blefield⬜Phase 4
0x01set_router_listadmin⬜Phase 3
0x02add_router_to_listadmin⬜Phase 3
0x03remove_router_from_listadmin⬜Phase 3
0x04reorder_router_listadmin⬜Phase 3
0x08rotate_keyadmin⬜Phase 5
0x09request_announcenone⬜Phase 2/4
0x0Afactory_reset_remoteadmin⬜Phase 4
0x0Bset_low_batt_thresholdadmin⬜Phase 2
0x0Cset_autonomous_reorderadmin⬜Phase 3
CapabilityStatusNotes
AES-128-CCM envelope (K_group)✅both MCU families, cross-library (PSA + mbedTLS)
Inner COMMAND auth (AES-CMAC / K_field)✅
Replay protection (frame + command layers)✅mod-2¹⁶ seq window + cmd_seq
NVS persistence (seq / cmd_seq / config)✅reboot-safe, both sides
ACK/retry → help-mode state machine✅
JOIN discovery handshake on boot✅endpoint↔hub direct
Build-time per-board node IDs✅stand-in for the Phase-4 wizard
Board-onboarding harness + tooling✅/spec-check, /build-all, spec-guard hook
Endpoint deep sleep⬜timed 5 s loop today; Phase 2
Reed-switch trigger⬜Phase 2 — the “trap tripped” half
Hub SQLite history⬜Phase 2
Hub web UI⬜Phase 2 — the “alert in UI” half
MQTT relay (hub)⬜Phase 2, default off
Router tier (DV routing)⬜Phase 3
BLE provisioning + deployment wizard⬜Phase 4
Real RTC / wall-clock source⬜time_valid stubbed for now
Key rotation (KEY_ROLLOVER)⬜Phase 5
Deep-sleep current baseline⬜blocked on a PPK2 / power analyser
BoardRoleFirmware verifiedNode ID
Heltec T114 v1trap (endpoint only, ADR-16)✅ JOIN handshake0x1
Heltec T114 v2trap / router✅ (same build as v1)0x1
Seeed XIAO nRF52840trap / router✅ JOIN handshake0x2
Heltec WiFi LoRa 32 V3.1hub✅ hub firmware0xA0
Seeed XIAO ESP32-S3hub🟡 Arduino-validated only; hub FW targets V3.1 pins—
SenseCAP Indicatorhub (Phase 2 target)⬜—
PhaseBandThemeStatusExit criterion
0MVPSpecification✅ donedocs reviewed & agreed
1MVPBring-up (hello-LoRa)✅ done¹T114 → RX plaintext, repeatable
2MVPSingle-cluster MVN🟡 in progressreed-switch trip → hub web-UI alert in 30 s
3MVPMulti-cluster / router tier⬜2-hop endpoint→R→R→hub + failover
4MVPProvisioning & ops⬜deploy a node with only the wizard
5MVPCrypto hardening⬜rotate K_group cluster-wide, no lost check-in
6MVPField pilot + Trap.NZ⬜2 wks live, ≥95% check-ins, Trap.NZ ≤5 min
7v1.0Headless / outdoor hub⬜hub with no station, outbound only
8v1.0Cellular hub⬜off-grid + remote reporting
8bv1.0Central service⬜containerised, single-org
9v1.5Multi-tenant + web flasher⬜public buyer self-onboards in 10 min
10v2.0+Hardening / OIDC / OTA⬜enterprise features
11OSSRelease & adoption⬜open repo, BOM, manual

¹ Phase 1’s wire-link is met; the deep-sleep current baseline is the one outstanding item, gated on test equipment (PPK2).

The protocol axis is done (the ✅ block above). What remains is the application / sensing axis the exit criterion measures, in two tracks:

  • Trap side: reed-switch trigger + endpoint deep sleep, plus the set_check_in_interval (0x05) and set_low_batt_threshold (0x0B) apply handlers.
  • Hub side: SQLite history → minimal web UI (nodes + last-seen) → optional MQTT relay.

The exit demo (“trip the reed switch, alert in the hub web UI within 30 s”) needs at least one deliverable from each track. Neither has started. See roadmap.md Phase 2 for the full list.