diff --git a/LifeTrac-v25/DESIGN-CONTROLLER/TODO.md b/LifeTrac-v25/DESIGN-CONTROLLER/TODO.md index 4f251911..7fa12aaf 100644 --- a/LifeTrac-v25/DESIGN-CONTROLLER/TODO.md +++ b/LifeTrac-v25/DESIGN-CONTROLLER/TODO.md @@ -2132,11 +2132,17 @@ Two consequences for what is worth doing next: Δcrc_err + Δtx_ok reconciles exactly; ring/host drops zero; CRC delta ≈ attributed loss). Eliminated: TX skips, host cmd TX, RX re-arm at start, prepare-ahead (A/B, spike unchanged), host drops, cumulative - in-train. Host+firmware audit clean at visible layers — root cause is - inside the L072 TX turnaround at the train tail (drain phase: all - submitted, last parked). Next: firmware discriminators — measured TX - duration in RFCO_PERTX, a counter on rearm-while-tx-pending, or one - run with inter-fragment RXCONT re-arm disabled. Also: (a) fix base + in-train. **Leg C (2026-08-02) also exonerated the RXCONT turnaround**: + with `LIFETRAC_RXCONT_ARM=0` (new daemon env + harness `-RxcontArm`, + production default 1 — NEVER ship 0, in-stream command delivery lives + in those listening gaps) the radio sat in STANDBY between fragments + and the spike was unchanged (idx11 22/66, Δcrc +62). Every + software-layer candidate is now eliminated; the cause is + physical/silicon (TX chain radiating corrupt bits, or deterministic + self-EMI). Next: **flash session** with firmware discriminators + (post-TX FIFO readback CRC at slot total−2, measured TX duration in + RFCO_PERTX, IRQ-flag capture) — or an SDR capture, which would settle + it without a flash. Also: (a) fix base gpio163 NRST (no longer resets the L072 — harness resets silently no-op; probe deltas are the workaround); (b) once fixed, revisit the CR-4/5 decision — its "zero CRC errors" basis was measured at the diff --git a/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_11_4_train_length_sweep_2026-08-02/RESULTS.md b/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_11_4_train_length_sweep_2026-08-02/RESULTS.md index 30246457..ce94f66a 100644 --- a/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_11_4_train_length_sweep_2026-08-02/RESULTS.md +++ b/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_11_4_train_length_sweep_2026-08-02/RESULTS.md @@ -172,18 +172,53 @@ opmode-guarded. The corruption source sits below host-side evidence — inside the fragment-turnaround (TX→STANDBY→RXCONT→TX cycling with the mailbox drain timing) or the PA/synth behaviour around it. -## 8. Session verdict and residuals +## 8. Leg C — RXCONT turnaround refuted; host-side discriminator space closed + +A daemon env gate (`LIFETRAC_RXCONT_ARM=0`, harness `-RxcontArm 0`, +production default unchanged) disables all RXCONT arming, so the +firmware's RS-4.12 re-arm chain never starts and the tractor radio sits +in STANDBY between fragments — no TX→RXCONT→TX cycling at all (command +downlink deliberately deaf for the run). 300 s @ 3000 B, probe-bracketed +(archive `radio_monitor_20260802_094053_86bf5d7f`): + +| leg | RXCONT cycling | Δcrc_err | attributed | idx 11 | +|-----|---------------:|---------:|-----------:|-------:| +| A/B | on | +75/+80 | 82/79 | 23/21 | +| C | **off** | +62 | 66 | **22** | + +The spike and the CRC rate are unchanged (Δ within run-to-run spread). +The inter-fragment turnaround is NOT the mechanism. + +Incidental: the idle bench accumulated +47 radio CRC errors over ~11 h +overnight (ambient noise false-demods at ~4/h) — negligible against +62–80 per 300 s run, but worth knowing the counter's noise floor. + +**With leg C, every software-layer candidate is eliminated** (TX skips, +host command TX, RX re-arm at start, prepare-ahead, host-side drops, +in-train cumulative, RXCONT turnaround). What remains is physical/ +silicon-level at slot total−2: the transmitter radiating corrupt bits +for a reason invisible to the C-code guards (FIFO/PLL/PA behaviour), or +deterministic self-EMI at the tractor (e.g., host UART burst timing). +Discriminating those needs an SDR capture of a corrupt slot, or firmware +instrumentation (post-TX FIFO readback CRC, IRQ-flag dumps) — a flash +session either way. + +## 9. Session verdict and residuals **Diagnosis: 11–18% of trains lose per-frame slot total−2 to on-air CRC -corruption; every other candidate eliminated; root cause is inside the -L072 TX turnaround at the train tail and needs firmware-level -instrumentation (or an SDR capture) to pin further.** +corruption; every software-layer candidate eliminated (including, via +leg C, the RXCONT turnaround); root cause is physical/silicon-level in +the transmit chain or deterministic self-EMI, and needs an SDR capture +or firmware instrumentation (post-TX FIFO readback CRC, IRQ-flag dumps, +measured TX duration in RFCO) to pin further — a flash session either +way.** Residuals for RS-11.5 follow-up: -- Firmware discriminator ideas: per-fragment RFCO with measured (not - estimated) TX duration; a counter on RXCONT-arm-while-TX-pending; - disabling the inter-fragment RXCONT re-arm for one run (firmware - toggle) to test the turnaround-interference theory directly. +- Firmware discriminators for the flash session: post-TX FIFO readback + CRC at slot total−2 (splits FIFO-corrupted-before-radiating from + radiated-clean-and-damaged-in-flight); measured (not estimated) TX + duration in RFCO_PERTX; SX1276 IRQ-flag capture per fragment. An SDR + capture of a corrupt slot would settle it without a flash. - Base board gpio163 NRST no longer resets the L072 (counters survived ~8 harness launches; harness resets silently no-op) — bench infrastructure fix needed; probe deltas are the workaround. diff --git a/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/params.txt b/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/params.txt new file mode 100644 index 00000000..569b919e --- /dev/null +++ b/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/params.txt @@ -0,0 +1,28 @@ +git_sha=86bf5d7f +duration_s=300 +synth_fps=2 +synth_budget_b=3000 +tx_pipeline=v3 +tx_pipeline_depth=2 +tx_batch=1 +tx_prepare_ahead=1 +train_gap_ms=40 +kf_request_disable=1 +parity_group=0 +aligned_pump=1 +reactive_fire=0 +probe_phase_sweep_ms= +probe_sizes_b= +ack_copies=2 +probe_echo=0 +fhss_farm_id=0 +fhss_link_id=0 +airtime_budget_us=0 +pacing_mode=smooth +pacing_headroom=0 +tx_feed=local +reg_profile=2 +tx_serial=2E2C1209DABC240B +rx_serial=2D0A1209DABC240B +host_ip=192.168.1.79 +timestamp=20260802_094053 diff --git a/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/rx_daemon.log b/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/rx_daemon.log new file mode 100644 index 00000000..5251d370 --- /dev/null +++ b/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/rx_daemon.log @@ -0,0 +1,754 @@ +2026-08-02 14:35:45,518 INFO image_rx_daemon: opening L072 HostLink on /dev/ttymxc3 @ 921600 + +2026-08-02 14:35:45,525 INFO image_rx_daemon: image_rx_daemon started; mqtt=127.0.0.1:1883 uart=/dev/ttymxc3 + +2026-08-02 14:35:45,531 INFO image_rx_daemon: MQTT connected; ready to publish lifetrac/v25/video/tile_delta + +2026-08-02 14:35:45,533 INFO image_rx_daemon: ctrl MQTT connected (192.168.1.79) + +2026-08-02 14:35:45,538 INFO image_rx_daemon: LIFETRAC_SKIP_RESET_REQ=1 — relying on external NRST; draining boot chatter only + +2026-08-02 14:35:45,549 INFO image_rx_daemon: accepting first retained lifetrac/v25/control/radio_profile pin after start (restart convergence) + +2026-08-02 14:35:45,551 WARNING image_rx_daemon: ignoring retained lifetrac/v25/control/radio_profile pin aged 62164 s (> 600 s) on reconnect + +2026-08-02 14:35:45,973 INFO image_rx_daemon: L072 VER warm-up ok (attempt 1) + +Initializing regulatory profile 2 on co-processor... + + FHSS mask: single channel 0 (0100000000000000) + +CFG_SET_REQ(FHSS_CHANNEL_MASK) OK: 07000800 + +CFG_SET_REQ(ANTENNA_GAIN_DBI) OK: 15000100 + +CFG_SET_REQ(HW_CEILING_DBM) OK: 16000100 + + FHSS seed: (0,0) legacy shared permutation [set LIFETRAC_FHSS_FARM_ID / LIFETRAC_FHSS_LINK_ID to separate pairs] + +CFG_SET_REQ(FHSS_FARM_ID) OK: 17000800 + +CFG_SET_REQ(FHSS_NODE_ID) OK: 18000800 + +CFG_SET_REQ(REG_PROFILE=2) OK: 14000100 + + forcing FRF -> 915.000 MHz (raw=0xE4C000 -> Msb=0xE4 Mid=0xC0 Lsb=0x00) + + FRF readback: 0xE4C000 = 915.000 MHz (OK) + +2026-08-02 14:35:46,418 INFO image_rx_daemon: LBT_ENABLE=0 (command uplink shares the image channel) + +PHY contract OK: image_bw500 == {'sf': 7, 'bw_khz': 500, 'cr_den': 5, 'preamble': 8} + +2026-08-02 14:35:46,502 INFO image_rx_daemon: SX1276 RXCONT autowake: opmode 0x81 -> 0x85 + +2026-08-02 14:35:46,503 INFO image_rx_daemon: RX worker ready; draining RX_FRAME_URC... + +2026-08-02 14:35:46,521 INFO image_rx_daemon: stats: rx_frames=0 rx_decode_err=0 frames_published=0 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=0 parity_recon=0 + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:46,782 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:47,339 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:47,883 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:48,428 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:48,974 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:49,525 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:50,066 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:50,614 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:51,172 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:51,720 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:52,278 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:52,822 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:53,365 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:53,908 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:54,445 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:54,991 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +RFCO_PERTX during TX wait: profile_id=2 tx_status=0x00(OK) hop_idx=0 channel_idx=0 epoch=0 freq_hz=0 pkt_toa_us=10304 legal_dwell_used_us_10s=0 + +2026-08-02 14:35:55,548 INFO image_rx_daemon: command TX opcode=0x63 copy=1/1 OK (on air) + +2026-08-02 14:35:55,814 WARNING image_rx_daemon: cmd 0x63 GAVE UP after 17 attempts (10.2 s) + +2026-08-02 14:35:56,527 INFO image_rx_daemon: stats: rx_frames=0 rx_decode_err=0 frames_published=0 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=0 parity_recon=0 + +2026-08-02 14:36:03,642 INFO image_rx_daemon: published frame_id=0 2983 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:05,196 INFO image_rx_daemon: published frame_id=0 2905 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:06,531 INFO image_rx_daemon: stats: rx_frames=59 rx_decode_err=0 frames_published=2 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=2 parity_recon=0 + +2026-08-02 14:36:06,533 INFO image_rx_daemon: air_gap: n=58 dt_med=116887us dt_p95=264929us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:36:06,537 INFO image_rx_daemon: air_gap_hist(ms): <40:2 <120:50 <200:2 <400:4 + +2026-08-02 14:36:06,538 INFO image_rx_daemon: phase_telemetry: valid=59 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:36:06,540 INFO image_rx_daemon: air_gap_by_class: seq: n=52 med=116.9ms | boundary: n=4 med=265.6ms | post_loss: n=2 med=232.6ms + +2026-08-02 14:36:06,542 INFO image_rx_daemon: lost_frag_idx: n=2 idx0=0 (0.00% of idx0 arrivals) other=2 (3.57%) verdict=not-clustered | top 7:1 11:1 + +2026-08-02 14:36:06,676 INFO image_rx_daemon: published frame_id=0 2915 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:09,772 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:11,332 INFO image_rx_daemon: published frame_id=0 2919 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:12,836 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:15,904 INFO image_rx_daemon: published frame_id=0 2991 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:16,544 INFO image_rx_daemon: stats: rx_frames=141 rx_decode_err=0 frames_published=7 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=4 parity_recon=0 + +2026-08-02 14:36:16,545 INFO image_rx_daemon: air_gap: n=82 dt_med=116865us dt_p95=234066us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:36:16,546 INFO image_rx_daemon: air_gap_hist(ms): <20:1 <40:4 <80:1 <120:67 <200:3 <400:6 + +2026-08-02 14:36:16,546 INFO image_rx_daemon: phase_telemetry: valid=82 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:36:16,547 INFO image_rx_daemon: air_gap_by_class: seq: n=73 med=116.8ms | boundary: n=7 med=262.1ms | post_loss: n=2 med=234.1ms + +2026-08-02 14:36:16,547 INFO image_rx_daemon: lost_frag_idx: n=2 idx0=0 (0.00% of idx0 arrivals) other=2 (2.60%) verdict=not-clustered | top 3:1 9:1 + +2026-08-02 14:36:17,462 INFO image_rx_daemon: published frame_id=0 2923 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:18,965 INFO image_rx_daemon: published frame_id=0 2992 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:20,511 INFO image_rx_daemon: published frame_id=0 2910 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:25,067 INFO image_rx_daemon: published frame_id=0 2934 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:26,543 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:26,550 INFO image_rx_daemon: stats: rx_frames=224 rx_decode_err=0 frames_published=12 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=6 parity_recon=0 + +2026-08-02 14:36:26,551 INFO image_rx_daemon: air_gap: n=83 dt_med=116893us dt_p95=192644us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:36:26,552 INFO image_rx_daemon: air_gap_hist(ms): <20:1 <40:3 <80:1 <120:71 <200:3 <400:4 + +2026-08-02 14:36:26,552 INFO image_rx_daemon: phase_telemetry: valid=83 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:36:26,553 INFO image_rx_daemon: air_gap_by_class: seq: n=76 med=116.9ms | boundary: n=6 med=262.3ms | post_loss: n=1 med=233.8ms + +2026-08-02 14:36:26,553 INFO image_rx_daemon: lost_frag_idx: n=2 idx0=0 (0.00% of idx0 arrivals) other=2 (2.53%) verdict=not-clustered | top 4:1 11:1 + +2026-08-02 14:36:28,018 INFO image_rx_daemon: published frame_id=0 2949 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:31,015 INFO image_rx_daemon: published frame_id=0 2991 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:32,590 INFO image_rx_daemon: published frame_id=0 2993 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:36,572 INFO image_rx_daemon: stats: rx_frames=303 rx_decode_err=0 frames_published=15 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=8 parity_recon=0 + +2026-08-02 14:36:36,574 INFO image_rx_daemon: air_gap: n=79 dt_med=116882us dt_p95=262265us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:36:36,578 INFO image_rx_daemon: air_gap_hist(ms): <40:2 <80:2 <120:66 <200:3 <400:6 + +2026-08-02 14:36:36,580 INFO image_rx_daemon: phase_telemetry: valid=79 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:36:36,580 INFO image_rx_daemon: air_gap_by_class: seq: n=70 med=116.8ms | boundary: n=6 med=262.3ms | post_loss: n=3 med=233.8ms + +2026-08-02 14:36:36,581 INFO image_rx_daemon: lost_frag_idx: n=4 idx0=1 (14.29% of idx0 arrivals) other=3 (3.95%) verdict=CLUSTERED-AT-0 | top 0:1 6:1 11:1 7:1 + +2026-08-02 14:36:37,140 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:38,724 INFO image_rx_daemon: published frame_id=0 2975 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:40,316 INFO image_rx_daemon: published frame_id=0 2986 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:41,904 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:43,468 INFO image_rx_daemon: published frame_id=0 2919 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:46,435 INFO image_rx_daemon: published frame_id=0 2959 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:46,595 INFO image_rx_daemon: stats: rx_frames=385 rx_decode_err=0 frames_published=21 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=10 parity_recon=0 + +2026-08-02 14:36:46,600 INFO image_rx_daemon: air_gap: n=83 dt_med=116849us dt_p95=264915us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:36:46,602 INFO image_rx_daemon: air_gap_hist(ms): <20:1 <40:5 <120:70 <200:2 <400:5 + +2026-08-02 14:36:46,602 INFO image_rx_daemon: phase_telemetry: valid=83 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:36:46,602 INFO image_rx_daemon: air_gap_by_class: seq: n=76 med=116.8ms | boundary: n=7 med=265.4ms + +2026-08-02 14:36:46,603 INFO image_rx_daemon: lost_frag_idx: n=1 idx0=0 (0.00% of idx0 arrivals) other=1 (1.30%) verdict=not-clustered | top 11:1 + +2026-08-02 14:36:49,378 INFO image_rx_daemon: published frame_id=0 2923 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:50,884 INFO image_rx_daemon: published frame_id=0 2992 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:52,432 INFO image_rx_daemon: published frame_id=0 2910 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:53,944 INFO image_rx_daemon: published frame_id=0 2983 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:56,621 INFO image_rx_daemon: stats: rx_frames=467 rx_decode_err=0 frames_published=25 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=11 parity_recon=0 + +2026-08-02 14:36:56,622 INFO image_rx_daemon: air_gap: n=81 dt_med=116886us dt_p95=194515us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:36:56,622 INFO image_rx_daemon: air_gap_hist(ms): <20:1 <40:1 <80:1 <120:71 <200:3 <400:4 + +2026-08-02 14:36:56,623 INFO image_rx_daemon: phase_telemetry: valid=81 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:36:56,623 INFO image_rx_daemon: air_gap_by_class: seq: n=74 med=116.9ms | boundary: n=6 med=261.9ms | post_loss: n=1 med=233.9ms + +2026-08-02 14:36:56,624 INFO image_rx_daemon: lost_frag_idx: n=3 idx0=0 (0.00% of idx0 arrivals) other=3 (3.85%) verdict=not-clustered | top 12:1 11:1 5:1 + +2026-08-02 14:36:58,452 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:36:59,932 INFO image_rx_daemon: published frame_id=0 2949 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:01,413 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:02,924 INFO image_rx_daemon: published frame_id=0 2991 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:06,629 INFO image_rx_daemon: stats: rx_frames=550 rx_decode_err=0 frames_published=29 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=14 parity_recon=0 + +2026-08-02 14:37:06,634 INFO image_rx_daemon: air_gap: n=83 dt_med=116896us dt_p95=167877us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:37:06,636 INFO image_rx_daemon: air_gap_hist(ms): <40:4 <80:2 <120:69 <200:4 <400:4 + +2026-08-02 14:37:06,637 INFO image_rx_daemon: phase_telemetry: valid=83 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:37:06,637 INFO image_rx_daemon: air_gap_by_class: seq: n=75 med=116.9ms | boundary: n=7 med=167.9ms | post_loss: n=1 med=232.8ms + +2026-08-02 14:37:06,638 INFO image_rx_daemon: lost_frag_idx: n=2 idx0=0 (0.00% of idx0 arrivals) other=2 (2.56%) verdict=not-clustered | top 1:1 11:1 + +2026-08-02 14:37:07,548 INFO image_rx_daemon: published frame_id=0 2915 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:09,052 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:12,230 INFO image_rx_daemon: published frame_id=0 2986 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:13,821 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:15,384 INFO image_rx_daemon: published frame_id=0 2919 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:16,641 INFO image_rx_daemon: stats: rx_frames=631 rx_decode_err=0 frames_published=34 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=16 parity_recon=0 + +2026-08-02 14:37:16,643 INFO image_rx_daemon: air_gap: n=81 dt_med=116887us dt_p95=233831us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:37:16,647 INFO image_rx_daemon: air_gap_hist(ms): <20:1 <40:4 <120:68 <200:2 <400:6 + +2026-08-02 14:37:16,647 INFO image_rx_daemon: phase_telemetry: valid=81 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:37:16,648 INFO image_rx_daemon: air_gap_by_class: seq: n=73 med=116.9ms | boundary: n=6 med=264.7ms | post_loss: n=2 med=233.8ms + +2026-08-02 14:37:16,648 INFO image_rx_daemon: lost_frag_idx: n=2 idx0=0 (0.00% of idx0 arrivals) other=2 (2.60%) verdict=not-clustered | top 9:1 4:1 + +2026-08-02 14:37:18,459 INFO image_rx_daemon: published frame_id=0 2959 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:19,931 INFO image_rx_daemon: published frame_id=0 2951 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:21,402 INFO image_rx_daemon: published frame_id=0 2923 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:22,904 INFO image_rx_daemon: published frame_id=0 2992 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:24,460 INFO image_rx_daemon: published frame_id=0 2910 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:26,653 INFO image_rx_daemon: stats: rx_frames=714 rx_decode_err=0 frames_published=39 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=17 parity_recon=0 + +2026-08-02 14:37:26,658 INFO image_rx_daemon: air_gap: n=83 dt_med=116903us dt_p95=192668us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:37:26,662 INFO image_rx_daemon: air_gap_hist(ms): <20:1 <40:4 <80:1 <120:69 <200:4 <400:4 + +2026-08-02 14:37:26,663 INFO image_rx_daemon: phase_telemetry: valid=83 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:37:26,664 INFO image_rx_daemon: air_gap_by_class: seq: n=75 med=116.9ms | boundary: n=7 med=192.7ms | post_loss: n=1 med=233.8ms + +2026-08-02 14:37:26,664 INFO image_rx_daemon: lost_frag_idx: n=1 idx0=0 (0.00% of idx0 arrivals) other=1 (1.30%) verdict=not-clustered | top 3:1 + +2026-08-02 14:37:29,000 INFO image_rx_daemon: published frame_id=0 2934 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:30,491 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:34,949 INFO image_rx_daemon: published frame_id=0 2991 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:36,547 INFO image_rx_daemon: published frame_id=0 2993 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:36,667 INFO image_rx_daemon: stats: rx_frames=796 rx_decode_err=0 frames_published=43 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=21 parity_recon=0 + +2026-08-02 14:37:36,669 INFO image_rx_daemon: air_gap: n=82 dt_med=116895us dt_p95=193433us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:37:36,673 INFO image_rx_daemon: air_gap_hist(ms): <40:3 <80:2 <120:69 <200:4 <400:4 + +2026-08-02 14:37:36,673 INFO image_rx_daemon: phase_telemetry: valid=82 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:37:36,674 INFO image_rx_daemon: air_gap_by_class: seq: n=74 med=116.9ms | boundary: n=6 med=193.4ms | post_loss: n=2 med=234.2ms + +2026-08-02 14:37:36,674 INFO image_rx_daemon: lost_frag_idx: n=4 idx0=0 (0.00% of idx0 arrivals) other=4 (5.00%) verdict=not-clustered | top 11:1 9:1 12:1 6:1 + +2026-08-02 14:37:41,068 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:42,672 INFO image_rx_daemon: published frame_id=0 2975 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:44,256 INFO image_rx_daemon: published frame_id=0 2986 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:45,844 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:46,677 INFO image_rx_daemon: stats: rx_frames=874 rx_decode_err=0 frames_published=47 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=23 parity_recon=0 + +2026-08-02 14:37:46,679 INFO image_rx_daemon: air_gap: n=78 dt_med=116924us dt_p95=264814us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:37:46,683 INFO image_rx_daemon: air_gap_hist(ms): <40:4 <120:65 <200:1 <400:8 + +2026-08-02 14:37:46,684 INFO image_rx_daemon: phase_telemetry: valid=78 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:37:46,687 INFO image_rx_daemon: air_gap_by_class: seq: n=69 med=116.9ms | boundary: n=7 med=264.8ms | post_loss: n=2 med=234.0ms + +2026-08-02 14:37:46,688 INFO image_rx_daemon: lost_frag_idx: n=3 idx0=0 (0.00% of idx0 arrivals) other=3 (4.05%) verdict=not-clustered | top 11:1 8:1 1:1 + +2026-08-02 14:37:50,360 INFO image_rx_daemon: published frame_id=0 2959 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:51,839 INFO image_rx_daemon: published frame_id=0 2951 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:54,817 INFO image_rx_daemon: published frame_id=0 2992 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:56,368 INFO image_rx_daemon: published frame_id=0 2910 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:37:56,691 INFO image_rx_daemon: stats: rx_frames=958 rx_decode_err=0 frames_published=51 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=26 parity_recon=0 + +2026-08-02 14:37:56,692 INFO image_rx_daemon: air_gap: n=84 dt_med=116924us dt_p95=172331us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:37:56,694 INFO image_rx_daemon: air_gap_hist(ms): <20:2 <40:2 <80:1 <120:71 <200:5 <400:3 + +2026-08-02 14:37:56,695 INFO image_rx_daemon: phase_telemetry: valid=84 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:37:56,696 INFO image_rx_daemon: air_gap_by_class: seq: n=76 med=116.9ms | boundary: n=7 med=172.3ms | post_loss: n=1 med=233.1ms + +2026-08-02 14:37:56,697 INFO image_rx_daemon: lost_frag_idx: n=2 idx0=0 (0.00% of idx0 arrivals) other=2 (2.53%) verdict=not-clustered | top 11:1 10:1 + +2026-08-02 14:37:57,874 INFO image_rx_daemon: published frame_id=0 2980 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:02,384 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:03,866 INFO image_rx_daemon: published frame_id=0 2949 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:05,351 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:06,703 INFO image_rx_daemon: stats: rx_frames=1042 rx_decode_err=0 frames_published=55 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=28 parity_recon=0 + +2026-08-02 14:38:06,704 INFO image_rx_daemon: air_gap: n=84 dt_med=116913us dt_p95=167659us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:38:06,704 INFO image_rx_daemon: air_gap_hist(ms): <40:5 <120:72 <200:4 <400:3 + +2026-08-02 14:38:06,705 INFO image_rx_daemon: phase_telemetry: valid=84 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:38:06,706 INFO image_rx_daemon: air_gap_by_class: seq: n=77 med=116.9ms | boundary: n=6 med=167.8ms | post_loss: n=1 med=233.8ms + +2026-08-02 14:38:06,706 INFO image_rx_daemon: lost_frag_idx: n=2 idx0=0 (0.00% of idx0 arrivals) other=2 (2.50%) verdict=not-clustered | top 11:1 5:1 + +2026-08-02 14:38:06,856 INFO image_rx_daemon: published frame_id=0 2991 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:11,476 INFO image_rx_daemon: published frame_id=0 2915 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:12,972 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:16,151 INFO image_rx_daemon: published frame_id=0 2986 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:16,721 INFO image_rx_daemon: stats: rx_frames=1120 rx_decode_err=0 frames_published=59 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=31 parity_recon=0 + +2026-08-02 14:38:16,723 INFO image_rx_daemon: air_gap: n=78 dt_med=116916us dt_p95=264684us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:38:16,727 INFO image_rx_daemon: air_gap_hist(ms): <40:3 <80:2 <120:64 <200:1 <400:8 + +2026-08-02 14:38:16,728 INFO image_rx_daemon: phase_telemetry: valid=78 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:38:16,730 INFO image_rx_daemon: air_gap_by_class: seq: n=67 med=116.9ms | boundary: n=7 med=264.7ms | post_loss: n=2 med=234.0ms + +2026-08-02 14:38:16,730 INFO image_rx_daemon: lost_frag_idx: n=3 idx0=0 (0.00% of idx0 arrivals) other=3 (4.05%) verdict=not-clustered | top 1:1 11:1 8:1 + +2026-08-02 14:38:16,731 INFO image_rx_daemon: frag_reordered: 2 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:38:17,753 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:19,313 INFO image_rx_daemon: published frame_id=0 2919 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:20,820 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:23,887 INFO image_rx_daemon: published frame_id=0 2991 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:25,438 INFO image_rx_daemon: published frame_id=0 2923 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:26,740 INFO image_rx_daemon: stats: rx_frames=1204 rx_decode_err=0 frames_published=64 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=32 parity_recon=0 + +2026-08-02 14:38:26,743 INFO image_rx_daemon: air_gap: n=84 dt_med=116913us dt_p95=172573us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:38:26,745 INFO image_rx_daemon: air_gap_hist(ms): <20:2 <40:3 <80:1 <120:71 <200:3 <400:4 + +2026-08-02 14:38:26,746 INFO image_rx_daemon: phase_telemetry: valid=84 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:38:26,747 INFO image_rx_daemon: air_gap_by_class: seq: n=76 med=116.9ms | boundary: n=6 med=262.4ms | post_loss: n=1 med=233.6ms + +2026-08-02 14:38:26,748 INFO image_rx_daemon: lost_frag_idx: n=1 idx0=0 (0.00% of idx0 arrivals) other=1 (1.27%) verdict=not-clustered | top 1:1 + +2026-08-02 14:38:26,749 INFO image_rx_daemon: frag_reordered: 1 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:38:26,950 INFO image_rx_daemon: published frame_id=0 2992 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:28,503 INFO image_rx_daemon: published frame_id=0 2910 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:30,004 INFO image_rx_daemon: published frame_id=0 2983 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:33,036 INFO image_rx_daemon: published frame_id=0 2934 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:34,527 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:35,996 INFO image_rx_daemon: published frame_id=0 2949 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:36,764 INFO image_rx_daemon: stats: rx_frames=1288 rx_decode_err=0 frames_published=70 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=33 parity_recon=0 + +2026-08-02 14:38:36,765 INFO image_rx_daemon: air_gap: n=84 dt_med=116904us dt_p95=168047us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:38:36,766 INFO image_rx_daemon: air_gap_hist(ms): <40:4 <80:1 <120:72 <200:4 <400:3 + +2026-08-02 14:38:36,766 INFO image_rx_daemon: phase_telemetry: valid=84 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:38:36,767 INFO image_rx_daemon: air_gap_by_class: seq: n=76 med=116.9ms | boundary: n=7 med=192.8ms + +2026-08-02 14:38:36,767 INFO image_rx_daemon: lost_frag_idx: n=1 idx0=0 (0.00% of idx0 arrivals) other=1 (1.28%) verdict=not-clustered | top 11:1 + +2026-08-02 14:38:36,768 INFO image_rx_daemon: frag_reordered: 1 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:38:37,483 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:38,983 INFO image_rx_daemon: published frame_id=0 2991 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:40,576 INFO image_rx_daemon: published frame_id=0 2993 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:46,687 INFO image_rx_daemon: published frame_id=0 2975 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:46,786 INFO image_rx_daemon: stats: rx_frames=1368 rx_decode_err=0 frames_published=74 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=36 parity_recon=0 + +2026-08-02 14:38:46,787 INFO image_rx_daemon: air_gap: n=80 dt_med=116949us dt_p95=261791us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:38:46,787 INFO image_rx_daemon: air_gap_hist(ms): <40:3 <80:2 <120:68 <200:2 <400:4 <1000:1 + +2026-08-02 14:38:46,788 INFO image_rx_daemon: phase_telemetry: valid=80 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:38:46,788 INFO image_rx_daemon: air_gap_by_class: seq: n=71 med=116.9ms | boundary: n=5 med=261.8ms | post_loss: n=2 med=420.5ms + +2026-08-02 14:38:46,789 INFO image_rx_daemon: lost_frag_idx: n=3 idx0=1 (16.67% of idx0 arrivals) other=2 (2.60%) verdict=CLUSTERED-AT-0 | top 11:1 0:1 4:1 + +2026-08-02 14:38:46,789 INFO image_rx_daemon: frag_reordered: 2 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:38:48,283 INFO image_rx_daemon: published frame_id=0 2986 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:49,876 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:51,444 INFO image_rx_daemon: published frame_id=0 2919 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:54,394 INFO image_rx_daemon: published frame_id=0 2959 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:55,883 INFO image_rx_daemon: published frame_id=0 2951 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:38:56,806 INFO image_rx_daemon: stats: rx_frames=1450 rx_decode_err=0 frames_published=79 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=37 parity_recon=0 + +2026-08-02 14:38:56,810 INFO image_rx_daemon: air_gap: n=82 dt_med=116905us dt_p95=233704us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:38:56,814 INFO image_rx_daemon: air_gap_hist(ms): <20:1 <40:4 <120:69 <200:3 <400:5 + +2026-08-02 14:38:56,814 INFO image_rx_daemon: phase_telemetry: valid=82 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:38:56,815 INFO image_rx_daemon: air_gap_by_class: seq: n=74 med=116.9ms | boundary: n=7 med=264.4ms | post_loss: n=1 med=233.7ms + +2026-08-02 14:38:56,815 INFO image_rx_daemon: lost_frag_idx: n=2 idx0=0 (0.00% of idx0 arrivals) other=2 (2.60%) verdict=not-clustered | top 11:1 2:1 + +2026-08-02 14:38:58,849 INFO image_rx_daemon: published frame_id=0 2992 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:00,397 INFO image_rx_daemon: published frame_id=0 2910 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:01,908 INFO image_rx_daemon: published frame_id=0 2983 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:04,946 INFO image_rx_daemon: published frame_id=0 2934 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:06,423 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:06,835 INFO image_rx_daemon: stats: rx_frames=1533 rx_decode_err=0 frames_published=84 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=39 parity_recon=0 + +2026-08-02 14:39:06,837 INFO image_rx_daemon: air_gap: n=83 dt_med=116894us dt_p95=172630us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:39:06,839 INFO image_rx_daemon: air_gap_hist(ms): <20:1 <40:3 <80:1 <120:71 <200:4 <400:3 + +2026-08-02 14:39:06,839 INFO image_rx_daemon: phase_telemetry: valid=83 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:39:06,840 INFO image_rx_daemon: air_gap_by_class: seq: n=75 med=116.9ms | boundary: n=7 med=192.2ms + +2026-08-02 14:39:06,840 INFO image_rx_daemon: lost_frag_idx: n=1 idx0=0 (0.00% of idx0 arrivals) other=1 (1.30%) verdict=not-clustered | top 11:1 + +2026-08-02 14:39:06,844 INFO image_rx_daemon: frag_reordered: 1 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:39:07,898 INFO image_rx_daemon: published frame_id=0 2949 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:09,387 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:10,895 INFO image_rx_daemon: published frame_id=0 2991 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:12,491 INFO image_rx_daemon: published frame_id=0 2993 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:15,516 INFO image_rx_daemon: published frame_id=0 2915 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:16,862 INFO image_rx_daemon: stats: rx_frames=1616 rx_decode_err=0 frames_published=89 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=40 parity_recon=0 + +2026-08-02 14:39:16,864 INFO image_rx_daemon: air_gap: n=84 dt_med=116873us dt_p95=167735us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:39:16,865 INFO image_rx_daemon: air_gap_hist(ms): <40:2 <80:2 <120:74 <200:3 <400:3 + +2026-08-02 14:39:16,865 INFO image_rx_daemon: phase_telemetry: valid=84 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:39:16,866 INFO image_rx_daemon: air_gap_by_class: seq: n=77 med=116.9ms | boundary: n=6 med=262.1ms + +2026-08-02 14:39:16,866 INFO image_rx_daemon: lost_frag_idx: n=1 idx0=0 (0.00% of idx0 arrivals) other=1 (1.28%) verdict=not-clustered | top 11:1 + +2026-08-02 14:39:16,866 INFO image_rx_daemon: frag_reordered: 1 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:39:17,015 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:18,595 INFO image_rx_daemon: published frame_id=0 2975 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:20,187 INFO image_rx_daemon: published frame_id=0 2986 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:21,788 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:23,342 INFO image_rx_daemon: published frame_id=0 2919 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:24,846 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:26,884 INFO image_rx_daemon: stats: rx_frames=1699 rx_decode_err=0 frames_published=95 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=40 parity_recon=0 + +2026-08-02 14:39:26,887 INFO image_rx_daemon: air_gap: n=82 dt_med=116845us dt_p95=264565us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:39:26,891 INFO image_rx_daemon: air_gap_hist(ms): <20:1 <40:6 <120:68 <200:2 <400:5 + +2026-08-02 14:39:26,892 INFO image_rx_daemon: phase_telemetry: valid=82 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:39:26,894 INFO image_rx_daemon: air_gap_by_class: seq: n=73 med=116.8ms | boundary: n=6 med=264.6ms | post_loss: n=1 med=381.4ms + +2026-08-02 14:39:26,896 INFO image_rx_daemon: lost_frag_idx: n=1 idx0=1 (14.29% of idx0 arrivals) other=0 (0.00%) verdict=CLUSTERED-AT-0 | top 0:1 + +2026-08-02 14:39:26,897 INFO image_rx_daemon: frag_reordered: 2 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:39:27,887 INFO image_rx_daemon: published frame_id=0 2951 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:29,361 INFO image_rx_daemon: published frame_id=0 2923 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:30,871 INFO image_rx_daemon: published frame_id=0 2992 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:33,925 INFO image_rx_daemon: published frame_id=0 2983 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:36,906 INFO image_rx_daemon: stats: rx_frames=1780 rx_decode_err=0 frames_published=99 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=42 parity_recon=0 + +2026-08-02 14:39:36,908 INFO image_rx_daemon: air_gap: n=81 dt_med=116863us dt_p95=233663us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:39:36,913 INFO image_rx_daemon: air_gap_hist(ms): <20:1 <40:2 <80:1 <120:69 <200:3 <400:5 + +2026-08-02 14:39:36,914 INFO image_rx_daemon: phase_telemetry: valid=81 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:39:36,917 INFO image_rx_daemon: air_gap_by_class: seq: n=72 med=116.9ms | boundary: n=6 med=262.0ms | post_loss: n=2 med=233.7ms + +2026-08-02 14:39:36,918 INFO image_rx_daemon: lost_frag_idx: n=3 idx0=0 (0.00% of idx0 arrivals) other=3 (3.85%) verdict=not-clustered | top 9:1 11:1 3:1 + +2026-08-02 14:39:36,919 INFO image_rx_daemon: frag_reordered: 1 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:39:38,444 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:41,413 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:42,921 INFO image_rx_daemon: published frame_id=0 2991 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:44,505 INFO image_rx_daemon: published frame_id=0 2993 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:46,927 INFO image_rx_daemon: stats: rx_frames=1860 rx_decode_err=0 frames_published=103 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=45 parity_recon=0 + +2026-08-02 14:39:46,929 INFO image_rx_daemon: air_gap: n=80 dt_med=116896us dt_p95=233832us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:39:46,933 INFO image_rx_daemon: air_gap_hist(ms): <40:3 <80:2 <120:65 <200:5 <400:4 <1000:1 + +2026-08-02 14:39:46,935 INFO image_rx_daemon: phase_telemetry: valid=80 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:39:46,939 INFO image_rx_daemon: air_gap_by_class: seq: n=68 med=116.9ms | boundary: n=6 med=168.0ms | post_loss: n=4 med=233.8ms + +2026-08-02 14:39:46,939 INFO image_rx_daemon: lost_frag_idx: n=5 idx0=1 (14.29% of idx0 arrivals) other=4 (5.06%) verdict=CLUSTERED-AT-0 | top 11:2 5:1 4:1 0:1 + +2026-08-02 14:39:46,940 INFO image_rx_daemon: frag_reordered: 2 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:39:49,043 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:50,628 INFO image_rx_daemon: published frame_id=0 2975 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:55,365 INFO image_rx_daemon: published frame_id=0 2919 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:56,876 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:56,953 INFO image_rx_daemon: stats: rx_frames=1942 rx_decode_err=0 frames_published=107 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=49 parity_recon=0 + +2026-08-02 14:39:56,955 INFO image_rx_daemon: air_gap: n=82 dt_med=116890us dt_p95=233840us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:39:56,959 INFO image_rx_daemon: air_gap_hist(ms): <20:1 <40:5 <120:68 <200:2 <400:6 + +2026-08-02 14:39:56,961 INFO image_rx_daemon: phase_telemetry: valid=81 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:39:56,962 INFO image_rx_daemon: air_gap_by_class: seq: n=72 med=116.9ms | boundary: n=6 med=264.5ms | post_loss: n=2 med=233.8ms + +2026-08-02 14:39:56,962 INFO image_rx_daemon: lost_frag_idx: n=2 idx0=0 (0.00% of idx0 arrivals) other=2 (2.60%) verdict=not-clustered | top 5:1 6:1 + +2026-08-02 14:39:56,962 INFO image_rx_daemon: frag_reordered: 2 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:39:58,451 INFO image_rx_daemon: published frame_id=0 2959 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:39:59,913 INFO image_rx_daemon: published frame_id=0 2951 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:02,898 INFO image_rx_daemon: published frame_id=0 2992 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:04,461 INFO image_rx_daemon: published frame_id=0 2910 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:06,983 INFO image_rx_daemon: stats: rx_frames=2024 rx_decode_err=0 frames_published=111 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=50 parity_recon=0 + +2026-08-02 14:40:06,985 INFO image_rx_daemon: air_gap: n=82 dt_med=116889us dt_p95=233574us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:40:06,988 INFO image_rx_daemon: air_gap_hist(ms): <20:1 <40:3 <80:1 <120:68 <200:4 <400:5 + +2026-08-02 14:40:06,988 INFO image_rx_daemon: phase_telemetry: valid=82 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:40:06,989 INFO image_rx_daemon: air_gap_by_class: seq: n=72 med=116.8ms | boundary: n=7 med=193.0ms | post_loss: n=2 med=233.7ms + +2026-08-02 14:40:06,990 INFO image_rx_daemon: lost_frag_idx: n=2 idx0=0 (0.00% of idx0 arrivals) other=2 (2.60%) verdict=not-clustered | top 1:1 2:1 + +2026-08-02 14:40:06,991 INFO image_rx_daemon: frag_reordered: 1 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:40:08,993 INFO image_rx_daemon: published frame_id=0 2934 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:10,475 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:11,963 INFO image_rx_daemon: published frame_id=0 2949 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:13,434 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:16,537 INFO image_rx_daemon: published frame_id=0 2993 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:16,996 INFO image_rx_daemon: stats: rx_frames=2106 rx_decode_err=0 frames_published=116 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=53 parity_recon=0 + +2026-08-02 14:40:16,999 INFO image_rx_daemon: air_gap: n=82 dt_med=116920us dt_p95=233215us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:40:17,003 INFO image_rx_daemon: air_gap_hist(ms): <40:4 <80:2 <120:67 <200:4 <400:5 + +2026-08-02 14:40:17,004 INFO image_rx_daemon: phase_telemetry: valid=82 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:40:17,007 INFO image_rx_daemon: air_gap_by_class: seq: n=71 med=116.9ms | boundary: n=7 med=167.9ms | post_loss: n=2 med=233.5ms + +2026-08-02 14:40:17,007 INFO image_rx_daemon: lost_frag_idx: n=3 idx0=0 (0.00% of idx0 arrivals) other=3 (3.85%) verdict=not-clustered | top 9:1 11:1 6:1 + +2026-08-02 14:40:17,008 INFO image_rx_daemon: frag_reordered: 2 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:40:19,568 INFO image_rx_daemon: published frame_id=0 2915 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:21,057 INFO image_rx_daemon: published frame_id=0 2985 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:24,252 INFO image_rx_daemon: published frame_id=0 2986 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:27,010 INFO image_rx_daemon: stats: rx_frames=2185 rx_decode_err=0 frames_published=119 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=55 parity_recon=0 + +2026-08-02 14:40:27,012 INFO image_rx_daemon: air_gap: n=79 dt_med=116905us dt_p95=268197us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:40:27,016 INFO image_rx_daemon: air_gap_hist(ms): <40:3 <120:70 <200:1 <400:5 + +2026-08-02 14:40:27,018 INFO image_rx_daemon: phase_telemetry: valid=79 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:40:27,020 INFO image_rx_daemon: air_gap_by_class: seq: n=72 med=116.9ms | boundary: n=5 med=268.2ms | post_loss: n=1 med=381.1ms + +2026-08-02 14:40:27,021 INFO image_rx_daemon: lost_frag_idx: n=3 idx0=1 (16.67% of idx0 arrivals) other=2 (2.63%) verdict=CLUSTERED-AT-0 | top 11:1 0:1 12:1 + +2026-08-02 14:40:27,021 INFO image_rx_daemon: frag_reordered: 1 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:40:27,408 INFO image_rx_daemon: published frame_id=0 2919 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:30,368 INFO image_rx_daemon: published frame_id=0 2959 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:31,835 INFO image_rx_daemon: published frame_id=0 2951 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:33,304 INFO image_rx_daemon: published frame_id=0 2923 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:34,809 INFO image_rx_daemon: published frame_id=0 2992 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:37,023 INFO image_rx_daemon: stats: rx_frames=2269 rx_decode_err=0 frames_published=124 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=57 parity_recon=0 + +2026-08-02 14:40:37,024 INFO image_rx_daemon: air_gap: n=84 dt_med=116900us dt_p95=192926us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:40:37,024 INFO image_rx_daemon: air_gap_hist(ms): <20:2 <40:2 <80:1 <120:70 <200:5 <400:4 + +2026-08-02 14:40:37,025 INFO image_rx_daemon: phase_telemetry: valid=84 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:40:37,025 INFO image_rx_daemon: air_gap_by_class: seq: n=74 med=116.8ms | boundary: n=7 med=172.5ms | post_loss: n=2 med=234.0ms + +2026-08-02 14:40:37,026 INFO image_rx_daemon: lost_frag_idx: n=2 idx0=0 (0.00% of idx0 arrivals) other=2 (2.53%) verdict=not-clustered | top 9:1 2:1 + +2026-08-02 14:40:37,026 INFO image_rx_daemon: frag_reordered: 1 late out-of-order arrivals had a provisional loss retracted (in-order assumption violated — see RS-11.4) + +2026-08-02 14:40:37,872 INFO image_rx_daemon: published frame_id=0 2980 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:42,378 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:45,341 INFO image_rx_daemon: published frame_id=0 2953 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:46,853 INFO image_rx_daemon: published frame_id=0 2991 B → lifetrac/v25/video/tile_delta + +2026-08-02 14:40:47,033 INFO image_rx_daemon: stats: rx_frames=2351 rx_decode_err=0 frames_published=128 publish_err=0 reassembler_decode_err=0 reassembler_timeouts=61 parity_recon=0 + +2026-08-02 14:40:47,035 INFO image_rx_daemon: air_gap: n=82 dt_med=116872us dt_p95=167772us len_med=247B cmd_tx_ok=17 cmd_tx_fail=0 + +2026-08-02 14:40:47,039 INFO image_rx_daemon: air_gap_hist(ms): <40:5 <80:1 <120:67 <200:5 <400:4 + +2026-08-02 14:40:47,040 INFO image_rx_daemon: phase_telemetry: valid=82 invalid=0 pre_f8=0 last_epoch=0 last_hop=0 slot_off=[0..0] + +2026-08-02 14:40:47,043 INFO image_rx_daemon: air_gap_by_class: seq: n=74 med=116.8ms | boundary: n=6 med=167.8ms | post_loss: n=2 med=234.1ms + +2026-08-02 14:40:47,044 INFO image_rx_daemon: lost_frag_idx: n=3 idx0=0 (0.00% of idx0 arrivals) other=3 (3.80%) verdict=not-clustered | top 5:2 11:1 + +2026-08-02 14:40:48,442 INFO image_rx_daemon: published frame_id=0 2993 B → lifetrac/v25/video/tile_delta + diff --git a/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/synth_pub.log b/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/synth_pub.log new file mode 100644 index 00000000..99399f8f --- /dev/null +++ b/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/synth_pub.log @@ -0,0 +1,28 @@ +Starting synthetic camera publisher (broker=127.0.0.1, fps=2.0, duration=310.0s, budget=3000B, prebuild=32)... + +PREBUILT: 32 frames, sizes 2892..3000 B + +[000] Publishing synthetic frame of size 2985 bytes... + +[050] Publishing synthetic frame of size 2979 bytes... + +[100] Publishing synthetic frame of size 2915 bytes... + +[150] Publishing synthetic frame of size 2951 bytes... + +[200] Publishing synthetic frame of size 2934 bytes... + +[250] Publishing synthetic frame of size 2993 bytes... + +[300] Publishing synthetic frame of size 2919 bytes... + +[350] Publishing synthetic frame of size 2903 bytes... + +[400] Publishing synthetic frame of size 2892 bytes... + +[450] Publishing synthetic frame of size 2983 bytes... + +[500] Publishing synthetic frame of size 2991 bytes... + +[550] Publishing synthetic frame of size 2975 bytes... + diff --git a/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/tx_daemon.log b/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/tx_daemon.log new file mode 100644 index 00000000..3ba7fcdf --- /dev/null +++ b/LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/tx_daemon.log @@ -0,0 +1,492 @@ +2026-07-31 00:32:31,045 INFO image_tx_daemon: opening L072 HostLink on /dev/ttymxc3 @ 921600 + +2026-07-31 00:32:31,048 INFO image_tx_daemon: image_tx_daemon started; mqtt=127.0.0.1:1883 uart=/dev/ttymxc3 + +2026-07-31 00:32:31,057 INFO image_tx_daemon: MQTT connected; subscribing to lifetrac/v25/cmd/image_frame + +2026-07-31 00:32:31,060 INFO image_tx_daemon: LIFETRAC_SKIP_RESET_REQ=1 — relying on external NRST; draining boot chatter only + +2026-07-31 00:32:31,074 INFO image_tx_daemon: link_budget: published n_frag=1 profile_idx=6 (profile 2) + +INFO: post-VER drain queued type=0xF1 seq=0 + +INFO: post-VER drain queued type=0xC1 seq=0 + +INFO: post-VER drain queued type=0xF1 seq=0 + +INFO: post-VER drain queued type=0xC1 seq=0 + +Initializing regulatory profile 2 on co-processor... + + FHSS mask: single channel 0 (0100000000000000) + +CFG_SET_REQ(FHSS_CHANNEL_MASK) OK: 07000800 + +CFG_SET_REQ(ANTENNA_GAIN_DBI) OK: 15000100 + +CFG_SET_REQ(HW_CEILING_DBM) OK: 16000100 + + FHSS seed: (0,0) legacy shared permutation [set LIFETRAC_FHSS_FARM_ID / LIFETRAC_FHSS_LINK_ID to separate pairs] + +CFG_SET_REQ(FHSS_FARM_ID) OK: 17000800 + +CFG_SET_REQ(FHSS_NODE_ID) OK: 18000800 + +CFG_SET_REQ(REG_PROFILE=2) OK: 14000100 + + forcing FRF -> 915.000 MHz (raw=0xE4C000 -> Msb=0xE4 Mid=0xC0 Lsb=0x00) + + FRF readback: 0xE4C000 = 915.000 MHz (OK) + +PHY contract OK: image_bw500 == {'sf': 7, 'bw_khz': 500, 'cr_den': 5, 'preamble': 8} + +2026-07-31 00:32:31,947 INFO image_tx_daemon: LBT_ENABLE=0 (matches W1-10b TX_BURST rationale) + +2026-07-31 00:32:31,948 WARNING image_tx_daemon: RS-11.5 diagnostic: RXCONT arming DISABLED — command downlink deaf for this run + +2026-07-31 00:32:31,948 INFO image_tx_daemon: TX worker ready (inter_cycle_s=0.050, max 8 frags/dwell) + +2026-07-31 00:32:32,048 INFO image_tx_daemon: stats: goodput=0.0 B/s util=0% pipeline=v3 frames_in=0 ok=0 fail=0 drop_full=0 drop_stale=0 frags_ok=0 frags_fail=0 qdepth=0 parity_tx=0 + +2026-07-31 00:32:42,060 INFO image_tx_daemon: stats: goodput=0.0 B/s util=0% pipeline=v3 frames_in=0 ok=0 fail=0 drop_full=0 drop_stale=0 frags_ok=0 frags_fail=0 qdepth=0 parity_tx=0 + +2026-07-31 00:32:46,451 INFO image_tx_daemon: frame seq=1 done (pipelined): 13 fragments ok + +2026-07-31 00:32:48,041 INFO image_tx_daemon: frame seq=2 done (pipelined): 13 fragments ok + +2026-07-31 00:32:49,642 INFO image_tx_daemon: frame seq=3 done (pipelined): 13 fragments ok + +2026-07-31 00:32:51,181 INFO image_tx_daemon: frame seq=4 done (pipelined): 12 fragments ok + +2026-07-31 00:32:52,073 INFO image_tx_daemon: stats: goodput=1352.1 B/s util=55% pipeline=v3 frames_in=15 ok=4 fail=0 drop_full=4 drop_stale=0 frags_ok=57 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:32:52,659 INFO image_tx_daemon: frame seq=5 done (pipelined): 12 fragments ok + +2026-07-31 00:32:54,169 INFO image_tx_daemon: frame seq=7 done (pipelined): 13 fragments ok + +2026-07-31 00:32:55,769 INFO image_tx_daemon: frame seq=10 done (pipelined): 13 fragments ok + +2026-07-31 00:32:57,333 INFO image_tx_daemon: frame seq=13 done (pipelined): 13 fragments ok + +2026-07-31 00:32:58,833 INFO image_tx_daemon: frame seq=16 done (pipelined): 13 fragments ok + +2026-07-31 00:33:00,405 INFO image_tx_daemon: frame seq=20 done (pipelined): 13 fragments ok + +2026-07-31 00:33:01,898 INFO image_tx_daemon: frame seq=22 done (pipelined): 13 fragments ok + +2026-07-31 00:33:02,097 INFO image_tx_daemon: stats: goodput=1955.9 B/s util=80% pipeline=v3 frames_in=35 ok=11 fail=0 drop_full=18 drop_stale=0 frags_ok=141 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:33:03,464 INFO image_tx_daemon: frame seq=26 done (pipelined): 13 fragments ok + +2026-07-31 00:33:04,964 INFO image_tx_daemon: frame seq=29 done (pipelined): 13 fragments ok + +2026-07-31 00:33:06,504 INFO image_tx_daemon: frame seq=32 done (pipelined): 12 fragments ok + +2026-07-31 00:33:08,028 INFO image_tx_daemon: frame seq=35 done (pipelined): 13 fragments ok + +2026-07-31 00:33:09,563 INFO image_tx_daemon: frame seq=38 done (pipelined): 12 fragments ok + +2026-07-31 00:33:11,073 INFO image_tx_daemon: frame seq=41 done (pipelined): 13 fragments ok + +2026-07-31 00:33:12,115 INFO image_tx_daemon: stats: goodput=1988.3 B/s util=81% pipeline=v3 frames_in=55 ok=17 fail=0 drop_full=31 drop_stale=0 frags_ok=225 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:33:12,545 INFO image_tx_daemon: frame seq=44 done (pipelined): 13 fragments ok + +2026-07-31 00:33:14,031 INFO image_tx_daemon: frame seq=47 done (pipelined): 13 fragments ok + +2026-07-31 00:33:15,513 INFO image_tx_daemon: frame seq=50 done (pipelined): 13 fragments ok + +2026-07-31 00:33:17,006 INFO image_tx_daemon: frame seq=53 done (pipelined): 13 fragments ok + +2026-07-31 00:33:18,597 INFO image_tx_daemon: frame seq=59 done (pipelined): 13 fragments ok + +2026-07-31 00:33:20,131 INFO image_tx_daemon: frame seq=60 done (pipelined): 12 fragments ok + +2026-07-31 00:33:21,613 INFO image_tx_daemon: frame seq=62 done (pipelined): 12 fragments ok + +2026-07-31 00:33:22,126 INFO image_tx_daemon: stats: goodput=1975.0 B/s util=80% pipeline=v3 frames_in=75 ok=24 fail=0 drop_full=45 drop_stale=0 frags_ok=309 frags_fail=0 qdepth=3 parity_tx=0 + +2026-07-31 00:33:23,134 INFO image_tx_daemon: frame seq=65 done (pipelined): 13 fragments ok + +2026-07-31 00:33:24,714 INFO image_tx_daemon: frame seq=71 done (pipelined): 13 fragments ok + +2026-07-31 00:33:26,305 INFO image_tx_daemon: frame seq=72 done (pipelined): 13 fragments ok + +2026-07-31 00:33:27,905 INFO image_tx_daemon: frame seq=74 done (pipelined): 13 fragments ok + +2026-07-31 00:33:29,473 INFO image_tx_daemon: frame seq=77 done (pipelined): 13 fragments ok + +2026-07-31 00:33:30,915 INFO image_tx_daemon: frame seq=81 done (pipelined): 12 fragments ok + +2026-07-31 00:33:32,138 INFO image_tx_daemon: stats: goodput=1951.0 B/s util=79% pipeline=v3 frames_in=95 ok=30 fail=0 drop_full=58 drop_stale=0 frags_ok=392 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:33:32,428 INFO image_tx_daemon: frame seq=84 done (pipelined): 13 fragments ok + +2026-07-31 00:33:33,908 INFO image_tx_daemon: frame seq=87 done (pipelined): 13 fragments ok + +2026-07-31 00:33:35,377 INFO image_tx_daemon: frame seq=90 done (pipelined): 13 fragments ok + +2026-07-31 00:33:36,876 INFO image_tx_daemon: frame seq=93 done (pipelined): 13 fragments ok + +2026-07-31 00:33:38,416 INFO image_tx_daemon: frame seq=96 done (pipelined): 12 fragments ok + +2026-07-31 00:33:39,930 INFO image_tx_daemon: frame seq=99 done (pipelined): 13 fragments ok + +2026-07-31 00:33:41,474 INFO image_tx_daemon: frame seq=102 done (pipelined): 12 fragments ok + +2026-07-31 00:33:42,149 INFO image_tx_daemon: stats: goodput=1996.1 B/s util=81% pipeline=v3 frames_in=115 ok=37 fail=0 drop_full=71 drop_stale=0 frags_ok=477 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:33:42,984 INFO image_tx_daemon: frame seq=105 done (pipelined): 13 fragments ok + +2026-07-31 00:33:44,466 INFO image_tx_daemon: frame seq=108 done (pipelined): 13 fragments ok + +2026-07-31 00:33:45,947 INFO image_tx_daemon: frame seq=111 done (pipelined): 13 fragments ok + +2026-07-31 00:33:47,428 INFO image_tx_daemon: frame seq=114 done (pipelined): 13 fragments ok + +2026-07-31 00:33:48,921 INFO image_tx_daemon: frame seq=117 done (pipelined): 13 fragments ok + +2026-07-31 00:33:50,512 INFO image_tx_daemon: frame seq=123 done (pipelined): 13 fragments ok + +2026-07-31 00:33:52,047 INFO image_tx_daemon: frame seq=124 done (pipelined): 12 fragments ok + +2026-07-31 00:33:52,160 INFO image_tx_daemon: stats: goodput=1977.3 B/s util=80% pipeline=v3 frames_in=135 ok=44 fail=0 drop_full=85 drop_stale=0 frags_ok=562 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:33:53,529 INFO image_tx_daemon: frame seq=126 done (pipelined): 12 fragments ok + +2026-07-31 00:33:55,050 INFO image_tx_daemon: frame seq=129 done (pipelined): 13 fragments ok + +2026-07-31 00:33:56,630 INFO image_tx_daemon: frame seq=135 done (pipelined): 13 fragments ok + +2026-07-31 00:33:58,231 INFO image_tx_daemon: frame seq=136 done (pipelined): 13 fragments ok + +2026-07-31 00:33:59,821 INFO image_tx_daemon: frame seq=138 done (pipelined): 13 fragments ok + +2026-07-31 00:34:01,386 INFO image_tx_daemon: frame seq=141 done (pipelined): 13 fragments ok + +2026-07-31 00:34:02,171 INFO image_tx_daemon: stats: goodput=1953.3 B/s util=79% pipeline=v3 frames_in=155 ok=50 fail=0 drop_full=98 drop_stale=0 frags_ok=645 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:34:02,885 INFO image_tx_daemon: frame seq=144 done (pipelined): 13 fragments ok + +2026-07-31 00:34:04,457 INFO image_tx_daemon: frame seq=148 done (pipelined): 13 fragments ok + +2026-07-31 00:34:05,937 INFO image_tx_daemon: frame seq=151 done (pipelined): 13 fragments ok + +2026-07-31 00:34:07,405 INFO image_tx_daemon: frame seq=154 done (pipelined): 13 fragments ok + +2026-07-31 00:34:08,904 INFO image_tx_daemon: frame seq=157 done (pipelined): 13 fragments ok + +2026-07-31 00:34:10,445 INFO image_tx_daemon: frame seq=160 done (pipelined): 12 fragments ok + +2026-07-31 00:34:11,968 INFO image_tx_daemon: frame seq=163 done (pipelined): 13 fragments ok + +2026-07-31 00:34:12,183 INFO image_tx_daemon: stats: goodput=1955.9 B/s util=80% pipeline=v3 frames_in=175 ok=57 fail=0 drop_full=112 drop_stale=0 frags_ok=729 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:34:13,503 INFO image_tx_daemon: frame seq=166 done (pipelined): 12 fragments ok + +2026-07-31 00:34:15,013 INFO image_tx_daemon: frame seq=169 done (pipelined): 13 fragments ok + +2026-07-31 00:34:16,495 INFO image_tx_daemon: frame seq=172 done (pipelined): 13 fragments ok + +2026-07-31 00:34:17,975 INFO image_tx_daemon: frame seq=175 done (pipelined): 13 fragments ok + +2026-07-31 00:34:19,457 INFO image_tx_daemon: frame seq=178 done (pipelined): 13 fragments ok + +2026-07-31 00:34:20,950 INFO image_tx_daemon: frame seq=181 done (pipelined): 13 fragments ok + +2026-07-31 00:34:22,195 INFO image_tx_daemon: stats: goodput=2018.5 B/s util=82% pipeline=v3 frames_in=195 ok=63 fail=0 drop_full=125 drop_stale=0 frags_ok=815 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:34:22,541 INFO image_tx_daemon: frame seq=187 done (pipelined): 13 fragments ok + +2026-07-31 00:34:24,076 INFO image_tx_daemon: frame seq=188 done (pipelined): 12 fragments ok + +2026-07-31 00:34:25,558 INFO image_tx_daemon: frame seq=190 done (pipelined): 12 fragments ok + +2026-07-31 00:34:27,072 INFO image_tx_daemon: frame seq=193 done (pipelined): 13 fragments ok + +2026-07-31 00:34:28,659 INFO image_tx_daemon: frame seq=199 done (pipelined): 13 fragments ok + +2026-07-31 00:34:30,260 INFO image_tx_daemon: frame seq=200 done (pipelined): 13 fragments ok + +2026-07-31 00:34:31,850 INFO image_tx_daemon: frame seq=202 done (pipelined): 13 fragments ok + +2026-07-31 00:34:32,206 INFO image_tx_daemon: stats: goodput=1909.4 B/s util=78% pipeline=v3 frames_in=215 ok=70 fail=0 drop_full=139 drop_stale=0 frags_ok=896 frags_fail=0 qdepth=3 parity_tx=0 + +2026-07-31 00:34:33,414 INFO image_tx_daemon: frame seq=205 done (pipelined): 13 fragments ok + +2026-07-31 00:34:34,857 INFO image_tx_daemon: frame seq=209 done (pipelined): 12 fragments ok + +2026-07-31 00:34:36,369 INFO image_tx_daemon: frame seq=212 done (pipelined): 13 fragments ok + +2026-07-31 00:34:37,849 INFO image_tx_daemon: frame seq=215 done (pipelined): 13 fragments ok + +2026-07-31 00:34:39,318 INFO image_tx_daemon: frame seq=218 done (pipelined): 13 fragments ok + +2026-07-31 00:34:40,816 INFO image_tx_daemon: frame seq=221 done (pipelined): 13 fragments ok + +2026-07-31 00:34:42,216 INFO image_tx_daemon: stats: goodput=2014.7 B/s util=82% pipeline=v3 frames_in=235 ok=76 fail=0 drop_full=152 drop_stale=0 frags_ok=982 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:34:42,357 INFO image_tx_daemon: frame seq=224 done (pipelined): 12 fragments ok + +2026-07-31 00:34:43,869 INFO image_tx_daemon: frame seq=226 done (pipelined): 13 fragments ok + +2026-07-31 00:34:45,414 INFO image_tx_daemon: frame seq=230 done (pipelined): 12 fragments ok + +2026-07-31 00:34:46,923 INFO image_tx_daemon: frame seq=233 done (pipelined): 13 fragments ok + +2026-07-31 00:34:48,405 INFO image_tx_daemon: frame seq=236 done (pipelined): 13 fragments ok + +2026-07-31 00:34:49,877 INFO image_tx_daemon: frame seq=239 done (pipelined): 13 fragments ok + +2026-07-31 00:34:51,364 INFO image_tx_daemon: frame seq=242 done (pipelined): 13 fragments ok + +2026-07-31 00:34:52,229 INFO image_tx_daemon: stats: goodput=1991.8 B/s util=81% pipeline=v3 frames_in=255 ok=83 fail=0 drop_full=166 drop_stale=0 frags_ok=1067 frags_fail=0 qdepth=3 parity_tx=0 + +2026-07-31 00:34:52,857 INFO image_tx_daemon: frame seq=245 done (pipelined): 13 fragments ok + +2026-07-31 00:34:54,447 INFO image_tx_daemon: frame seq=251 done (pipelined): 13 fragments ok + +2026-07-31 00:34:55,982 INFO image_tx_daemon: frame seq=252 done (pipelined): 12 fragments ok + +2026-07-31 00:34:57,465 INFO image_tx_daemon: frame seq=254 done (pipelined): 12 fragments ok + +2026-07-31 00:34:58,984 INFO image_tx_daemon: frame seq=1 done (pipelined): 13 fragments ok + +2026-07-31 00:35:00,566 INFO image_tx_daemon: frame seq=7 done (pipelined): 13 fragments ok + +2026-07-31 00:35:02,166 INFO image_tx_daemon: frame seq=8 done (pipelined): 13 fragments ok + +2026-07-31 00:35:02,244 INFO image_tx_daemon: stats: goodput=1958.6 B/s util=80% pipeline=v3 frames_in=275 ok=90 fail=0 drop_full=179 drop_stale=0 frags_ok=1150 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:35:03,756 INFO image_tx_daemon: frame seq=10 done (pipelined): 13 fragments ok + +2026-07-31 00:35:05,320 INFO image_tx_daemon: frame seq=13 done (pipelined): 13 fragments ok + +2026-07-31 00:35:06,820 INFO image_tx_daemon: frame seq=16 done (pipelined): 13 fragments ok + +2026-07-31 00:35:08,391 INFO image_tx_daemon: frame seq=20 done (pipelined): 13 fragments ok + +2026-07-31 00:35:09,884 INFO image_tx_daemon: frame seq=22 done (pipelined): 13 fragments ok + +2026-07-31 00:35:11,450 INFO image_tx_daemon: frame seq=26 done (pipelined): 13 fragments ok + +2026-07-31 00:35:12,260 INFO image_tx_daemon: stats: goodput=1952.6 B/s util=79% pipeline=v3 frames_in=295 ok=96 fail=0 drop_full=192 drop_stale=0 frags_ok=1234 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:35:12,948 INFO image_tx_daemon: frame seq=29 done (pipelined): 13 fragments ok + +2026-07-31 00:35:14,489 INFO image_tx_daemon: frame seq=32 done (pipelined): 12 fragments ok + +2026-07-31 00:35:16,012 INFO image_tx_daemon: frame seq=35 done (pipelined): 13 fragments ok + +2026-07-31 00:35:17,547 INFO image_tx_daemon: frame seq=38 done (pipelined): 12 fragments ok + +2026-07-31 00:35:19,056 INFO image_tx_daemon: frame seq=41 done (pipelined): 13 fragments ok + +2026-07-31 00:35:20,538 INFO image_tx_daemon: frame seq=44 done (pipelined): 13 fragments ok + +2026-07-31 00:35:22,010 INFO image_tx_daemon: frame seq=47 done (pipelined): 13 fragments ok + +2026-07-31 00:35:22,274 INFO image_tx_daemon: stats: goodput=1971.0 B/s util=80% pipeline=v3 frames_in=315 ok=103 fail=0 drop_full=206 drop_stale=0 frags_ok=1318 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:35:23,497 INFO image_tx_daemon: frame seq=50 done (pipelined): 13 fragments ok + +2026-07-31 00:35:24,991 INFO image_tx_daemon: frame seq=53 done (pipelined): 13 fragments ok + +2026-07-31 00:35:26,581 INFO image_tx_daemon: frame seq=59 done (pipelined): 13 fragments ok + +2026-07-31 00:35:28,116 INFO image_tx_daemon: frame seq=60 done (pipelined): 12 fragments ok + +2026-07-31 00:35:29,598 INFO image_tx_daemon: frame seq=62 done (pipelined): 12 fragments ok + +2026-07-31 00:35:31,118 INFO image_tx_daemon: frame seq=65 done (pipelined): 13 fragments ok + +2026-07-31 00:35:32,286 INFO image_tx_daemon: stats: goodput=1974.5 B/s util=80% pipeline=v3 frames_in=335 ok=109 fail=0 drop_full=219 drop_stale=0 frags_ok=1401 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:35:32,699 INFO image_tx_daemon: frame seq=71 done (pipelined): 13 fragments ok + +2026-07-31 00:35:34,299 INFO image_tx_daemon: frame seq=72 done (pipelined): 13 fragments ok + +2026-07-31 00:35:35,889 INFO image_tx_daemon: frame seq=74 done (pipelined): 13 fragments ok + +2026-07-31 00:35:37,453 INFO image_tx_daemon: frame seq=77 done (pipelined): 13 fragments ok + +2026-07-31 00:35:38,896 INFO image_tx_daemon: frame seq=81 done (pipelined): 12 fragments ok + +2026-07-31 00:35:40,407 INFO image_tx_daemon: frame seq=84 done (pipelined): 13 fragments ok + +2026-07-31 00:35:41,887 INFO image_tx_daemon: frame seq=87 done (pipelined): 13 fragments ok + +2026-07-31 00:35:42,297 INFO image_tx_daemon: stats: goodput=1977.0 B/s util=80% pipeline=v3 frames_in=355 ok=116 fail=0 drop_full=233 drop_stale=0 frags_ok=1486 frags_fail=0 qdepth=3 parity_tx=0 + +2026-07-31 00:35:43,357 INFO image_tx_daemon: frame seq=90 done (pipelined): 13 fragments ok + +2026-07-31 00:35:44,855 INFO image_tx_daemon: frame seq=93 done (pipelined): 13 fragments ok + +2026-07-31 00:35:46,396 INFO image_tx_daemon: frame seq=96 done (pipelined): 12 fragments ok + +2026-07-31 00:35:47,919 INFO image_tx_daemon: frame seq=99 done (pipelined): 13 fragments ok + +2026-07-31 00:35:49,453 INFO image_tx_daemon: frame seq=102 done (pipelined): 12 fragments ok + +2026-07-31 00:35:50,964 INFO image_tx_daemon: frame seq=105 done (pipelined): 13 fragments ok + +2026-07-31 00:35:52,308 INFO image_tx_daemon: stats: goodput=1989.6 B/s util=81% pipeline=v3 frames_in=375 ok=122 fail=0 drop_full=246 drop_stale=0 frags_ok=1570 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:35:52,436 INFO image_tx_daemon: frame seq=108 done (pipelined): 13 fragments ok + +2026-07-31 00:35:53,921 INFO image_tx_daemon: frame seq=111 done (pipelined): 13 fragments ok + +2026-07-31 00:35:55,403 INFO image_tx_daemon: frame seq=114 done (pipelined): 13 fragments ok + +2026-07-31 00:35:56,896 INFO image_tx_daemon: frame seq=117 done (pipelined): 13 fragments ok + +2026-07-31 00:35:58,487 INFO image_tx_daemon: frame seq=123 done (pipelined): 13 fragments ok + +2026-07-31 00:36:00,022 INFO image_tx_daemon: frame seq=124 done (pipelined): 12 fragments ok + +2026-07-31 00:36:01,504 INFO image_tx_daemon: frame seq=126 done (pipelined): 12 fragments ok + +2026-07-31 00:36:02,320 INFO image_tx_daemon: stats: goodput=1975.0 B/s util=80% pipeline=v3 frames_in=395 ok=129 fail=0 drop_full=260 drop_stale=0 frags_ok=1654 frags_fail=0 qdepth=3 parity_tx=0 + +2026-07-31 00:36:03,025 INFO image_tx_daemon: frame seq=129 done (pipelined): 13 fragments ok + +2026-07-31 00:36:04,605 INFO image_tx_daemon: frame seq=135 done (pipelined): 13 fragments ok + +2026-07-31 00:36:06,206 INFO image_tx_daemon: frame seq=136 done (pipelined): 13 fragments ok + +2026-07-31 00:36:07,796 INFO image_tx_daemon: frame seq=138 done (pipelined): 13 fragments ok + +2026-07-31 00:36:09,360 INFO image_tx_daemon: frame seq=141 done (pipelined): 13 fragments ok + +2026-07-31 00:36:10,860 INFO image_tx_daemon: frame seq=144 done (pipelined): 13 fragments ok + +2026-07-31 00:36:12,331 INFO image_tx_daemon: stats: goodput=1936.0 B/s util=79% pipeline=v3 frames_in=415 ok=135 fail=0 drop_full=273 drop_stale=0 frags_ok=1737 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:36:12,432 INFO image_tx_daemon: frame seq=148 done (pipelined): 13 fragments ok + +2026-07-31 00:36:13,912 INFO image_tx_daemon: frame seq=151 done (pipelined): 13 fragments ok + +2026-07-31 00:36:15,380 INFO image_tx_daemon: frame seq=154 done (pipelined): 13 fragments ok + +2026-07-31 00:36:16,879 INFO image_tx_daemon: frame seq=157 done (pipelined): 13 fragments ok + +2026-07-31 00:36:18,419 INFO image_tx_daemon: frame seq=160 done (pipelined): 12 fragments ok + +2026-07-31 00:36:19,942 INFO image_tx_daemon: frame seq=163 done (pipelined): 13 fragments ok + +2026-07-31 00:36:21,477 INFO image_tx_daemon: frame seq=166 done (pipelined): 12 fragments ok + +2026-07-31 00:36:22,342 INFO image_tx_daemon: stats: goodput=1971.4 B/s util=80% pipeline=v3 frames_in=435 ok=142 fail=0 drop_full=286 drop_stale=0 frags_ok=1821 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:36:22,987 INFO image_tx_daemon: frame seq=169 done (pipelined): 13 fragments ok + +2026-07-31 00:36:24,469 INFO image_tx_daemon: frame seq=172 done (pipelined): 13 fragments ok + +2026-07-31 00:36:25,950 INFO image_tx_daemon: frame seq=175 done (pipelined): 13 fragments ok + +2026-07-31 00:36:27,432 INFO image_tx_daemon: frame seq=178 done (pipelined): 13 fragments ok + +2026-07-31 00:36:28,925 INFO image_tx_daemon: frame seq=181 done (pipelined): 13 fragments ok + +2026-07-31 00:36:30,516 INFO image_tx_daemon: frame seq=187 done (pipelined): 13 fragments ok + +2026-07-31 00:36:32,050 INFO image_tx_daemon: frame seq=188 done (pipelined): 12 fragments ok + +2026-07-31 00:36:32,362 INFO image_tx_daemon: stats: goodput=1975.6 B/s util=80% pipeline=v3 frames_in=455 ok=149 fail=0 drop_full=300 drop_stale=0 frags_ok=1906 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:36:33,533 INFO image_tx_daemon: frame seq=190 done (pipelined): 12 fragments ok + +2026-07-31 00:36:35,053 INFO image_tx_daemon: frame seq=193 done (pipelined): 13 fragments ok + +2026-07-31 00:36:36,633 INFO image_tx_daemon: frame seq=199 done (pipelined): 13 fragments ok + +2026-07-31 00:36:38,234 INFO image_tx_daemon: frame seq=200 done (pipelined): 13 fragments ok + +2026-07-31 00:36:39,824 INFO image_tx_daemon: frame seq=202 done (pipelined): 13 fragments ok + +2026-07-31 00:36:41,388 INFO image_tx_daemon: frame seq=205 done (pipelined): 13 fragments ok + +2026-07-31 00:36:42,382 INFO image_tx_daemon: stats: goodput=1976.2 B/s util=80% pipeline=v3 frames_in=475 ok=155 fail=0 drop_full=313 drop_stale=0 frags_ok=1990 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:36:42,888 INFO image_tx_daemon: frame seq=208 done (pipelined): 13 fragments ok + +2026-07-31 00:36:44,460 INFO image_tx_daemon: frame seq=212 done (pipelined): 13 fragments ok + +2026-07-31 00:36:45,940 INFO image_tx_daemon: frame seq=215 done (pipelined): 13 fragments ok + +2026-07-31 00:36:47,408 INFO image_tx_daemon: frame seq=218 done (pipelined): 13 fragments ok + +2026-07-31 00:36:48,907 INFO image_tx_daemon: frame seq=221 done (pipelined): 13 fragments ok + +2026-07-31 00:36:50,447 INFO image_tx_daemon: frame seq=224 done (pipelined): 12 fragments ok + +2026-07-31 00:36:51,971 INFO image_tx_daemon: frame seq=227 done (pipelined): 13 fragments ok + +2026-07-31 00:36:52,393 INFO image_tx_daemon: stats: goodput=1955.9 B/s util=80% pipeline=v3 frames_in=495 ok=162 fail=0 drop_full=327 drop_stale=0 frags_ok=2074 frags_fail=0 qdepth=3 parity_tx=0 + +2026-07-31 00:36:53,506 INFO image_tx_daemon: frame seq=230 done (pipelined): 12 fragments ok + +2026-07-31 00:36:55,016 INFO image_tx_daemon: frame seq=233 done (pipelined): 13 fragments ok + +2026-07-31 00:36:56,498 INFO image_tx_daemon: frame seq=236 done (pipelined): 13 fragments ok + +2026-07-31 00:36:57,978 INFO image_tx_daemon: frame seq=239 done (pipelined): 13 fragments ok + +2026-07-31 00:36:59,460 INFO image_tx_daemon: frame seq=242 done (pipelined): 13 fragments ok + +2026-07-31 00:37:00,953 INFO image_tx_daemon: frame seq=245 done (pipelined): 13 fragments ok + +2026-07-31 00:37:02,405 INFO image_tx_daemon: stats: goodput=2018.5 B/s util=82% pipeline=v3 frames_in=515 ok=168 fail=0 drop_full=340 drop_stale=0 frags_ok=2160 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:37:02,544 INFO image_tx_daemon: frame seq=251 done (pipelined): 13 fragments ok + +2026-07-31 00:37:04,079 INFO image_tx_daemon: frame seq=252 done (pipelined): 12 fragments ok + +2026-07-31 00:37:05,561 INFO image_tx_daemon: frame seq=254 done (pipelined): 12 fragments ok + +2026-07-31 00:37:07,081 INFO image_tx_daemon: frame seq=1 done (pipelined): 13 fragments ok + +2026-07-31 00:37:08,661 INFO image_tx_daemon: frame seq=7 done (pipelined): 13 fragments ok + +2026-07-31 00:37:10,261 INFO image_tx_daemon: frame seq=8 done (pipelined): 13 fragments ok + +2026-07-31 00:37:11,852 INFO image_tx_daemon: frame seq=10 done (pipelined): 13 fragments ok + +2026-07-31 00:37:12,415 INFO image_tx_daemon: stats: goodput=1909.6 B/s util=78% pipeline=v3 frames_in=535 ok=175 fail=0 drop_full=354 drop_stale=0 frags_ok=2241 frags_fail=0 qdepth=3 parity_tx=0 + +2026-07-31 00:37:13,416 INFO image_tx_daemon: frame seq=13 done (pipelined): 13 fragments ok + +2026-07-31 00:37:14,859 INFO image_tx_daemon: frame seq=17 done (pipelined): 12 fragments ok + +2026-07-31 00:37:16,371 INFO image_tx_daemon: frame seq=20 done (pipelined): 13 fragments ok + +2026-07-31 00:37:17,851 INFO image_tx_daemon: frame seq=23 done (pipelined): 13 fragments ok + +2026-07-31 00:37:19,319 INFO image_tx_daemon: frame seq=26 done (pipelined): 13 fragments ok + +2026-07-31 00:37:20,818 INFO image_tx_daemon: frame seq=29 done (pipelined): 13 fragments ok + +2026-07-31 00:37:22,359 INFO image_tx_daemon: frame seq=32 done (pipelined): 12 fragments ok + +2026-07-31 00:37:22,430 INFO image_tx_daemon: stats: goodput=2013.0 B/s util=82% pipeline=v3 frames_in=555 ok=182 fail=0 drop_full=367 drop_stale=0 frags_ok=2327 frags_fail=0 qdepth=4 parity_tx=0 + +2026-07-31 00:37:23,872 INFO image_tx_daemon: frame seq=34 done (pipelined): 13 fragments ok + +2026-07-31 00:37:25,417 INFO image_tx_daemon: frame seq=38 done (pipelined): 12 fragments ok + +2026-07-31 00:37:26,920 INFO image_tx_daemon: frame seq=41 done (pipelined): 13 fragments ok + +2026-07-31 00:37:28,408 INFO image_tx_daemon: frame seq=44 done (pipelined): 13 fragments ok + +2026-07-31 00:37:29,888 INFO image_tx_daemon: frame seq=47 done (pipelined): 13 fragments ok + +2026-07-31 00:37:31,370 INFO image_tx_daemon: frame seq=50 done (pipelined): 13 fragments ok + +2026-07-31 00:37:32,446 INFO image_tx_daemon: stats: goodput=1992.0 B/s util=81% pipeline=v3 frames_in=575 ok=188 fail=0 drop_full=381 drop_stale=0 frags_ok=2412 frags_fail=0 qdepth=3 parity_tx=0 + +2026-07-31 00:37:32,864 INFO image_tx_daemon: frame seq=53 done (pipelined): 13 fragments ok + +2026-07-31 00:37:34,454 INFO image_tx_daemon: frame seq=59 done (pipelined): 13 fragments ok + +2026-07-31 00:37:35,989 INFO image_tx_daemon: frame seq=60 done (pipelined): 12 fragments ok + diff --git a/LifeTrac-v25/DESIGN-CONTROLLER/firmware/tractor_x8/image_tx_daemon.py b/LifeTrac-v25/DESIGN-CONTROLLER/firmware/tractor_x8/image_tx_daemon.py index 07b31caa..fbf390fd 100644 --- a/LifeTrac-v25/DESIGN-CONTROLLER/firmware/tractor_x8/image_tx_daemon.py +++ b/LifeTrac-v25/DESIGN-CONTROLLER/firmware/tractor_x8/image_tx_daemon.py @@ -395,6 +395,18 @@ def record(self, toa_us: int) -> None: TRACTOR_LINK_BUDGET_TOPIC = "lifetrac/v25/tractor/link_budget" # F10: stale-tile bitmaps from the base, handed to camera_service. TRACTOR_TILE_STALE_TOPIC = "lifetrac/v25/tractor/tile_stale" + +# RS-11.5 diagnostic (2026-08-02): 0 = never arm RXCONT, so the firmware's +# RS-4.12 re-arm chain (s_rearm_rx: re-arm iff armed at tx_begin) never +# starts and the radio stays STANDBY between fragments — no TX->RXCONT->TX +# turnaround cycling. This makes the tractor COMPLETELY DEAF to the +# command downlink; it exists only to discriminate whether the turnaround +# is the source of the slot-(total-2) on-air CRC corruption +# (bench-evidence/RS_11_4_train_length_sweep_2026-08-02 §8). NEVER ship 0: +# in-stream command delivery (99.8%) lives in the inter-fragment listening +# gaps this disables, and inter-train-only delivery would blow the 700 ms +# hydraulic-control latency budget. +RXCONT_ARM = os.environ.get("LIFETRAC_RXCONT_ARM", "1") == "1" # LINK_PHY_NAMES index (camera_service / lora_proto) for each radio profile: # profile 0/1 (BW250) -> "image_bw250" (idx 5); profile 2 (BW500) -> idx 6. _PROFILE_TO_LINK_PHY_IDX = {0: 5, 1: 5, 2: 6} @@ -605,16 +617,20 @@ def _tx_worker(self) -> None: # base's 0xFB command frames between its own transmissions (the # firmware re-arms RX after each TX when it was armed before — # sx1276_tx.c s_rearm_rx). - try: - opm, _ = read_reg(link, SX1276_REG_OP_MODE, timeout=0.5) - if opm != SX1276_OPMODE_LORA_RXCONT: - write_reg(link, SX1276_REG_OP_MODE, - SX1276_OPMODE_LORA_RXCONT, timeout=0.5) - LOG.info("RXCONT armed for command downlink (opmode " - "0x%02x -> 0x85)", opm) - except Exception as exc: # pragma: no cover - LOG.warning("RXCONT arm failed: %s — command downlink deaf " - "until next TX re-arm", exc) + if not RXCONT_ARM: + LOG.warning("RS-11.5 diagnostic: RXCONT arming DISABLED — " + "command downlink deaf for this run") + else: + try: + opm, _ = read_reg(link, SX1276_REG_OP_MODE, timeout=0.5) + if opm != SX1276_OPMODE_LORA_RXCONT: + write_reg(link, SX1276_REG_OP_MODE, + SX1276_OPMODE_LORA_RXCONT, timeout=0.5) + LOG.info("RXCONT armed for command downlink (opmode " + "0x%02x -> 0x85)", opm) + except Exception as exc: # pragma: no cover + LOG.warning("RXCONT arm failed: %s — command downlink deaf " + "until next TX re-arm", exc) LOG.info("TX worker ready (inter_cycle_s=%.3f, max %d frags/dwell)", self.inter_cycle_s, MAX_FRAMES_PER_DWELL_CAP) while not self._stop.is_set(): @@ -729,6 +745,8 @@ def _ensure_rxcont(self, link: HostLink) -> None: during continuous TX the tractor listens only in those gaps (acceptable: commands are retried ×2 and idempotent). """ + if not RXCONT_ARM: + return # RS-11.5 diagnostic: stay STANDBY, see the flag try: opm, _ = read_reg(link, SX1276_REG_OP_MODE, timeout=0.5) if opm != SX1276_OPMODE_LORA_RXCONT: diff --git a/LifeTrac-v25/DESIGN-CONTROLLER/firmware/x8_lora_bootloader_helper/run_live_radio_monitor.ps1 b/LifeTrac-v25/DESIGN-CONTROLLER/firmware/x8_lora_bootloader_helper/run_live_radio_monitor.ps1 index 4b2882a0..456c70de 100644 --- a/LifeTrac-v25/DESIGN-CONTROLLER/firmware/x8_lora_bootloader_helper/run_live_radio_monitor.ps1 +++ b/LifeTrac-v25/DESIGN-CONTROLLER/firmware/x8_lora_bootloader_helper/run_live_radio_monitor.ps1 @@ -126,6 +126,12 @@ param( # goodput but only until the rolling-window backstop starts firing again, # which is exactly the compounding failure headroom exists to prevent. [double]$PacingHeadroom = 0, + # RS-11.5 diagnostic (2026-08-02): 0 = tractor never arms RXCONT, so + # the firmware's per-fragment re-arm chain never starts and the radio + # stays STANDBY between fragments. Command downlink fully deaf — + # diagnostic runs only (discriminates the slot-(total-2) CRC + # corruption mechanism). Production default 1. + [int]$RxcontArm = 1, # Archive final logs + parameters under bench-evidence/ with the git # SHA in the folder name (evidence discipline per CODE REVIEWS docs). [switch]$Archive @@ -282,7 +288,7 @@ if ($TxFeed -eq "local" -or $TxFeed -eq "camera") { } Write-Host "[LAUNCH] Starting TX Daemon on Board $TxAdbSerial (mqtt=$txMqtt, depth=$TxPipelineDepth)..." -ForegroundColor Yellow -cmd /c "`"$adbExe`" -s $TxAdbSerial shell `"echo fio | sudo -S -p '' docker rm -f tx_smoke 2>/dev/null ; echo fio | sudo -S -p '' docker run -d --name tx_smoke --network=host --entrypoint python3 --device=/dev/ttymxc3 -v /tmp/lifetrac_strict:/work -w /work -e PYTHONPATH=/work:/work/paho -e LIFETRAC_MQTT_HOST=$txMqtt -e LIFETRAC_SKIP_RESET_REQ=1 $profEnv -e LIFETRAC_TX_PIPELINE=$TxPipeline -e LIFETRAC_TX_PIPELINE_DEPTH=$TxPipelineDepth -e LIFETRAC_TX_BATCH=$TxBatch -e LIFETRAC_TX_PREPARE_AHEAD=$TxPrepareAhead -e LIFETRAC_TRAIN_GAP_MS=$TrainGapMs -e LIFETRAC_PARITY_GROUP=$ParityGroup -e LIFETRAC_ACK_COPIES=$AckCopies -e LIFETRAC_PROBE_ECHO=$ProbeEcho hub.foundries.io/arduino/arduino-ootb-python-devel:738bc44 -u /work/image_tx_daemon.py --log-level INFO`"" +cmd /c "`"$adbExe`" -s $TxAdbSerial shell `"echo fio | sudo -S -p '' docker rm -f tx_smoke 2>/dev/null ; echo fio | sudo -S -p '' docker run -d --name tx_smoke --network=host --entrypoint python3 --device=/dev/ttymxc3 -v /tmp/lifetrac_strict:/work -w /work -e PYTHONPATH=/work:/work/paho -e LIFETRAC_MQTT_HOST=$txMqtt -e LIFETRAC_SKIP_RESET_REQ=1 $profEnv -e LIFETRAC_TX_PIPELINE=$TxPipeline -e LIFETRAC_TX_PIPELINE_DEPTH=$TxPipelineDepth -e LIFETRAC_TX_BATCH=$TxBatch -e LIFETRAC_TX_PREPARE_AHEAD=$TxPrepareAhead -e LIFETRAC_TRAIN_GAP_MS=$TrainGapMs -e LIFETRAC_PARITY_GROUP=$ParityGroup -e LIFETRAC_ACK_COPIES=$AckCopies -e LIFETRAC_PROBE_ECHO=$ProbeEcho -e LIFETRAC_RXCONT_ARM=$RxcontArm hub.foundries.io/arduino/arduino-ootb-python-devel:738bc44 -u /work/image_tx_daemon.py --log-level INFO`"" # 6. Launch RX daemon. # RX publishes to the BASE BOARD's own mosquitto (127.0.0.1 via