Greptile round 7 remediation:
The CLI's advisory flock and the web flasher's Web Locks name live in
incompatible lock namespaces, so a CLI install and a browser install
on the same card could each hold "their" lock, both pass preflight on
identical slot state, and clobber each other's records (orphaning a
pack, or writing the same generation into two slots).
Both producers now share two symmetric layers:
1. An on-disk install marker (.pyxis-installing in pyxis-map/,
token "PYXI 1 <owner> <epoch_ms>") claimed at install start via an
atomic exclusive create, with ownership verified by read-back. A
fresh foreign marker refuses the install before any mutation; a
stale one (30-minute TTL; a future epoch counts as fresh under
clock skew) is reclaimed. Release only deletes the releasee's own
token.
2. Commit-time revalidation: activate_map_set / activateMapSet
snapshot the raw slot and style bytes at derivation, re-read them
immediately before the record writes, and abort if the activation
state moved or a fresh foreign marker is present. The published
pack is kept (device-harmless: the firmware only reads packs named
by an active selection) and the existing retry/resume path
converges it.
Regression tests on both producers: marker refusal before any
publication, stale-marker reclamation and release, and
commit-time-race abort with retry convergence. The in-memory flasher
FS now models getFileHandle({exclusive:true}) -> FileExistsError.
CLI: 85 passed. Flasher: 24 passed.
Pyxis Tests
Three test surfaces, each runnable independently.
1. Pyxis-unique pytest suite
Native C++ tests of pyxis-unique code (BLE fragmenter, HDLC, etc.) and Python tests of build scripts.
/usr/bin/python3 -m pytest tests/build_scripts tests/native -v
System Python 3.9 has pytest pre-installed; Homebrew Python does not.
build_scripts/test_patch_nimble.py— verifiespatch_nimble.pyidempotency, drift detection, missing-file handlingbuild_scripts/test_patch_littlefs_paths.py— verifies non-destructive LittleFS mounting, patch idempotency/drift handling, and persistent-partition isolationnative/test_hdlc.{cpp,py}— HDLC escape/unescape/frame round-trip + golden vector against Python RNSnative/test_ble_fragmenter.{cpp,py}— BLEFragmenter ↔ BLEReassembler: in-order, out-of-order, duplicate, dropped+timeout, per-peer isolation, MTU changenative/test_ble_peer_manager.{cpp,py}— connection-map state machine: discover, identity promotion, blacklist, handle map cleanup, MAC rotation, pool exhaustionnative/test_ble_operation_queue.{cpp,py}— GATT op queue: FIFO, busy-state, timeout, clearForConnection, buildernative/test_ring_buffers.{cpp,py}— PCM + encoded SPSC ring buffers, including 100k-frame multithreaded producer/consumer stressnative/test_audio_filters.{cpp,py}— VoiceFilterChain frequency response, peak limiting, multichannelnative/test_call_command_mailbox.{cpp,py}— generation-scoped LXST hangup/mute command handoff and producer/consumer stressnative/test_call_start_mailbox.{cpp,py}— exact 16-byte LXST outgoing-call handoff, duplicate rejection, and reusable producer/consumer stressnative/test_call_generation_guard.{cpp,py}— atomic, generation-scoped call admission, stale-owner protection, and repeated two-thread reservation racesnative/test_call_link_ownership.{cpp,py}— exact 128-bit LXST link ownership publication, mixed-ID publication stress, and generation-bound deferred-close concurrencynative/test_lxst_signal_parser.{cpp,py}— bounded MessagePack parsing for legacy one-signal and current LXST profile+duplex signalling arrays
Adding a new native C++ test
Pattern: pure C++ unit + thin pytest wrapper.
- Write
tests/native/test_<thing>.cpp— include from../../{src,lib/...}for the unit under test, use the existingEXPECT_EQ/EXPECT_TRUE/RUN(name)framework, return non-zero on any failure. - If the unit pulls in microReticulum types, the shims in
tests/native/cover what's been needed so far:Bytes.h→bytes_shim.h(minimalRNS::Bytes— append/data/size/writable/resize/mid)Log.h(no-opTRACE/WARNING/INFO/ERRORmacros)Utilities/OS.h(OS::time()withset_fake_time()/clear_fake_time())
- Write
tests/native/test_<thing>.py— copy thetest_hdlc.pytemplate, swap source/include paths, run. - Confirm:
/usr/bin/python3 -m pytest tests/native/test_<thing>.py -v
2. LXST audio interop tests
Python tests verifying wire format and codec compatibility between pyxis (C++), Python LXST, and LXST-kt (Kotlin).
/usr/bin/python3 -m pytest tests/interop -v
Requires pycodec2 and access to $HOME/repos/public/LXST.
3. microReticulum native unit tests (PlatformIO)
The fork's microReticulum tests live under deps/microReticulum/test/ and run via PlatformIO Unity.
cd deps/microReticulum && pio test -e native17
Use native17, not native — the C++11 env is broken (static-constexpr ODR-use). Baseline as of 2026-05-02: 94/114 PASS, 7 FAIL, 5 SKIPPED, 7 suites ERRORED. The clean suites are
test_os, test_bytes, test_msgpack, test_crypto, test_filesystem, test_objects, test_interop, test_general, test_reference, test_example, test_collections.