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✅ decode2
0x02STATUS_ACK✅ ratified✅ decode✅ encode2
0x03JOIN✅ ratified✅ encode✅ decode2
0x04JOIN_ACK✅ ratified✅ decode✅ encode2
0x05ANNOUNCE✅ ratified✅ encode✅ decode2
0x06WHO_ARE_YOU⬜ no payload2/4
0x07COMMAND✅ ratified✅ decode✅ encode🟡 1/12 cmds2
0x08COMMAND_ACK✅ ratified✅ encode✅ decode2
0x10ROUTING_BEACON⬜ pending3
0x11ROUTER_UPLINK⬜ type only3
0x12ROUTER_DOWNLINK⬜ type only3
0x20KEY_ROLLOVER⬜ type only5
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_intervalfieldPhase 2 sensing
0x07wake_blefieldPhase 4
0x01set_router_listadminPhase 3
0x02add_router_to_listadminPhase 3
0x03remove_router_from_listadminPhase 3
0x04reorder_router_listadminPhase 3
0x08rotate_keyadminPhase 5
0x09request_announcenonePhase 2/4
0x0Afactory_reset_remoteadminPhase 4
0x0Bset_low_batt_thresholdadminPhase 2
0x0Cset_autonomous_reorderadminPhase 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 bootendpoint↔hub direct
Build-time per-board node IDsstand-in for the Phase-4 wizard
Board-onboarding harness + tooling/spec-check, /build-all, spec-guard hook
Endpoint deep sleeptimed 5 s loop today; Phase 2
Reed-switch triggerPhase 2 — the “trap tripped” half
Hub SQLite historyPhase 2
Hub web UIPhase 2 — the “alert in UI” half
MQTT relay (hub)Phase 2, default off
Router tier (DV routing)Phase 3
BLE provisioning + deployment wizardPhase 4
Real RTC / wall-clock sourcetime_valid stubbed for now
Key rotation (KEY_ROLLOVER)Phase 5
Deep-sleep current baselineblocked 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 tier2-hop endpoint→R→R→hub + failover
4MVPProvisioning & opsdeploy a node with only the wizard
5MVPCrypto hardeningrotate K_group cluster-wide, no lost check-in
6MVPField pilot + Trap.NZ2 wks live, ≥95% check-ins, Trap.NZ ≤5 min
7v1.0Headless / outdoor hubhub with no station, outbound only
8v1.0Cellular huboff-grid + remote reporting
8bv1.0Central servicecontainerised, single-org
9v1.5Multi-tenant + web flasherpublic buyer self-onboards in 10 min
10v2.0+Hardening / OIDC / OTAenterprise features
11OSSRelease & adoptionopen 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.