Commit Graph
41 Commits
Author SHA1 Message Date
Torlando bff993b2f8 chore(deps): bump microLXMF pin to d7e05fd (metadata cache fixes)
Tracks microLXMF PR #11 head d7e05fd: archived-branch cache sync,
bulk-delete cache invalidation, and the uniform capped-content
contract for load_message_metadata(). No Pyxis code change — the
chat/list paths already rely on the capped preview and the full-view
accessor.
2026-09-04 02:36:44 +00:00
Torlando 403035f115 perf(messages): instant chat open/reopen + deferred full-message view
Uses the microLXMF in-process message-metadata cache (bumped pin
6bea23c -> 58a6eb0, branch feat/conversation-preview-cache):

- Reopening a conversation (and background page fill / paging) is now
  O(1) in-memory once warmed instead of re-reading each message file
  from SPI LittleFS (~230ms/read, ~2.3s per open measured on the T-Deck).
- The cache table is PSRAM-allocated on ESP32; a static .bss placement
  starved internal DRAM and the LVGL task's 8 KiB stack allocation
  failed at boot ("Failed to create LVGL task", hang at startup logo).
- Long-press full-message view now defers to the main loop: the LVGL
  event handler only records the hash; tick_pending_full_message() does
  load_message_content() (uncapped, no msgpack unpack) off the LVGL
  task, then builds the modal. Fixes the capped (600-char) text that
  the in-memory rows carry.
- A peer change cancels an in-flight background fill from the previous
  conversation (it would otherwise prepend the old conversation's
  rows into the new one).

Validated on the T-Deck (T-Deck Plus, 8MB PSRAM): warm opens
reads=3 sync=0-2ms total=15-35ms (was ~2.3s); cold first open per
conversation still pays ~0.6-1.2s disk while warming the cache; no
panics/watchdogs over a ~6-minute interaction session.
Host gates: microLXMF conformance 6/6 (incl. 32-assertion
test_message_metadata_cache), native reference test against pinned
58a6eb0, tdeck build SUCCESS.
2026-09-04 01:30:16 +00:00
Pike 8204506b3b perf(messages): persist preview warm-up; cache empty-content tails
On-device [PERF] capture decomposed the remaining ~1s tap latency:
each uncached conversation costs one SPI-LittleFS metadata read
(~230ms). Repeat taps still paid 2 perpetual fallbacks (empty-
content tails never got cached), and the first tap after every
boot paid all 9 (the in-memory repop was never committed to the
index).

- bump microLXMF pin c8d3156 -> 6bea23c (feat/conversation-
  preview-cache): preview_valid index flag so 'cached empty'
  differs from 'unpopulated'; bounded preview copy (the old
  strncpy read past the non-terminated content Bytes); public
  commit_index().
- refresh() re-pops empty-content tails as a valid cached
  preview and arms a one-shot deferred index commit;
  UIManager::update() drains it out-of-lock (flush_pending_
  index_commit, between drops and mark-read) so the warmed
  previews persist and the next cold boot reads them from the
  index.
- fix the [PERF] skip-log total= wrap (printed p_t_diff - p_t0,
  a uint32 underflow; total was already p_t_diff).

[PERF] instrumentation stays in this commit (temporary,
marked); it is removed before merge once the fix is validated
on-device.
2026-09-03 17:12:52 +00:00
Pike cb6a9d38e6 perf(messages): read conversation preview from store index cache
refresh() previously opened + parsed each conversation's newest message
file (load_message_metadata) on every list refresh, which dominated
list-load time on SPI LittleFS. It now reads the per-conversation
last-message preview + timestamp from the store's in-memory index
(O(1), zero I/O) and falls back to load_message_metadata only when the
index has no cached preview — the first refresh after a firmware
upgrade or after a corrupt-tail drop — then writes the preview back
through so the fallback happens at most once per conversation per
firmware generation. The write-through is skipped when drops were
queued (the drained deletes move the tail, so a preview written for the
old tail would be stale for one refresh).

Host benchmark (x86 + POSIX fs, 24 msgs/conv): the per-conversation
store-load work drops from ~0.149ms (9 convs) / ~0.342ms (20 convs) to
~0.002ms / ~0.005ms, and the cold-boot path (store reconstructed from
disk) matches the warm path because the preview now persists in the
index.

Bumps the microLXMF pin to c8d3156 (feat/conversation-preview-cache)
in platformio.ini, the release audit, and the native reference test.
Adds tests/microlxmf/bench_conversation_list_load.cpp (baseline vs
index warm/cold) and the bench target in tests/microlxmf/CMakeLists.txt.
2026-09-03 14:30:03 +00:00
Torlando 48ee2d4d71 chore(deps): re-point microLXMF pin to merge commit df1b01a
PR #10 merged to main; swap the temporary branch-head pin (59ca70a) for
the merge commit so the consumer tracks a stable main revision. Update
the release-audit allowlist in the same commit. Firmware source is
byte-identical to 59ca70a (the merge added only the CI workflow commit).
2026-09-03 03:24:51 +00:00
Torlando 15239e67c4 chore(release): bump microLXMF pin assertion to 59ca70a (PR #10 head) 2026-09-03 02:50:32 +00:00
Torlando 562776fe2c fix: distinguish committed activation durability from failed activation
Greptile P2 (round 1): a post-rename parent-fsync failure during activation now reports that the record is committed and visible with only durability uncertain, instead of the generic 'activation failed' message; and the subprocess lock-holder helper repr-escapes the pyxis-map path so a path containing a quote still yields valid child Python.
2026-08-30 18:37:36 +00:00
Torlando ac7e380c96 fix: guard legacy PMAS decode and document v3 strictness 2026-08-30 07:12:26 +00:00
Torlando 9897f1d895 docs: document PMPK v3 CLI installation contract 2026-08-30 05:56:05 +00:00
Torlando 0fb4256aa6 feat: enable safe CLI PMAS v3 activation 2026-08-30 05:51:40 +00:00
Torlando 3595fdaa1c feat: validate inherited packs before activation
feat: publish activation atomically with read-back
2026-08-30 02:48:47 +00:00
Torlando 59d2805d5f feat: derive PMAS v3 activation plans 2026-08-30 02:35:13 +00:00
Torlando cc280cdf78 feat: build style-qualified PMPK v3 packs
fix: serialize CLI map installs with flock
2026-08-30 02:30:21 +00:00
Torlando 7cccca3a75 test: freeze PMPK and PMAS v3 wire vectors
feat: parse indexless PMPK v3 manifests

feat: serialize indexless PMPK v3 manifests

feat: encode and decode PMAS v3 selections
2026-08-30 02:17:57 +00:00
torlando-agent[bot] f9e23a5825 docs: split esptool provisioning into separate erase_flash and write_flash
esptool accepts exactly one operation per invocation; the combined
'erase_flash write_flash 0x0 ...' form is rejected with a usage error.
Document erase_flash and write_flash as separate commands in the README
and the merge tool docstring (verified against esptool 5.3.1).
2026-08-18 16:37:50 +00:00
torlando-agent[bot] 01fc9adc79 release: ship merged full-flash binary on releases
Add tools/merge_pyxis_release.py, which assembles the four validated
release assets (bootloader, partition table, OTA selector, application)
into a single 8 MiB image at their fixed flash offsets on an erased
canvas, with per-image read-back and gap checks.

Wire it into release-firmware.yml so every tag build publishes
pyxis-<tag>-merged.bin as a release asset, and document the
provisioning semantics in the README: the merged image is a
first-install image (it erases NVS and LittleFS); data-preserving
updates keep using firmware.bin or the Columba .pyxis package.
2026-08-18 16:28:02 +00:00
torlando-agent[bot] 2f0f7900ca feat: enforce NomadNet limits and observability 2026-08-17 09:11:10 +00:00
torlando-agent[bot] 050289a1bc test: track secure microReticulum pin 2026-08-16 21:44:50 +00:00
torlando-agent[bot] 98dca8e516 feat: add bounded NomadNet forms 2026-08-16 21:36:30 +00:00
torlando-agent[bot] 1238fa7c2a Pin microStore compaction fix locally 2026-08-15 00:37:32 +00:00
torlando-agent[bot] fd776d7b78 Bound NomadNet pages and preserve decompression headroom 2026-08-14 22:50:00 +00:00
torlando-agent[bot] 12def2c746 fix(nomadnet): use JetBrains Mono NL faces 2026-08-14 00:47:52 +00:00
torlando-agent[bot] b5aae24e77 fix: safely initialize erased LittleFS partitions 2026-08-12 15:44:26 +00:00
torlando-agent[bot] 49fa03ba68 feat: add composable offline map packs 2026-08-07 16:58:14 +00:00
torlando-agent[bot] 117d3894bd feat: make maps SD-pack only 2026-08-07 05:26:34 +00:00
torlando-agent[bot] 525ab5022d [verified] feat: build secure offline map packs 2026-08-07 03:27:18 +00:00
torlando-agent[bot] 9791de8149 build: isolate T-Deck test hooks 2026-08-07 01:25:10 +00:00
torlando-agent[bot] 1c8af97548 fix(nomadnet): bound remote page responses 2026-08-05 18:48:58 +00:00
Torlando e0287c1a0e keep release audit aligned with dependency pin 2026-08-03 19:19:59 +00:00
torlando-agent[bot] dcf863e581 [verified] fix: accept LXST profile and mode signals 2026-08-03 01:20:59 +00:00
Torlando 9c0997befa fix: make firmware updates persistence-safe 2026-08-02 23:06:44 +00:00
torlando-agent[bot] e5f00a8b39 ci: audit release flags and dependency pins 2026-08-02 03:57:34 +00:00
torlando-agent[bot] 61872480c9 fix: enforce ULBW-only LXST voice profile 2026-08-02 00:39:45 +00:00
torlando-agent[bot] 1a9dcf8cd1 docs: sanitize voice harness endpoint example 2026-08-01 14:18:38 +00:00
torlando-agent[bot] b7733c925e test: drain busy callbacks and restore BLE state 2026-08-01 14:14:56 +00:00
torlando-agent[bot] cfa6fa3afa test: harden LXST contention harness 2026-08-01 14:14:56 +00:00
torlando-agent[bot] 34b5ffeea1 test: assert timeout recovery hangup 2026-08-01 14:14:56 +00:00
torlando-agent[bot] 8e66739002 test: cover incoming call identification contention 2026-08-01 14:14:56 +00:00
torlando-agent[bot] 9e151877cc fix(voice): stabilize LXST call lifecycle and add E2E harness 2026-07-22 10:25:45 -04:00
torlando-agent[bot]andClaude Opus 4.8 658c6f921b test(voice): Mac-side LXST mic test harness (acoustic loopback + Whisper STT scoring)
Drives the firmware T: hooks to capture raw mic audio (UDP tap or the reliable
PSRAM/serial recorder), plays TTS references out the Mac speaker, and scores the
round-trip with envelope/STOI metrics and Whisper transcription. venv + recorded
WAVs are gitignored.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UWZuYkHBRqNb6BZHV8sTG5
2026-06-24 17:21:25 -04:00
torlando-techandClaude Opus 4.6 e263e1e7a6 Add OTA flashing and wireless UDP log broadcasting
ArduinoOTA enables wireless firmware uploads (pio run -e tdeck-ota -t upload).
UDP log callback via RNS::setLogCallback sends all log lines plus Serial.printf
diagnostics to multicast group 239.0.99.99:9999 for untethered monitoring.
Includes safety guards: UDP suspended during WiFi transitions, reentrancy
protection, and WiFi status check before each send.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 17:43:48 -05:00