RS-11.5 leg C: RXCONT turnaround exonerated — software discriminator space closed - #93
Merged
Merged
Conversation
…are space closed New diagnostic gate LIFETRAC_RXCONT_ARM (daemon env + harness -RxcontArm, production default 1): 0 disables all RXCONT arming so the firmware's RS-4.12 re-arm chain never starts and the radio sits in STANDBY between fragments. NEVER ship 0 — in-stream command delivery (99.8%) lives in those listening gaps and inter-train-only delivery would blow the 700 ms control latency budget. Leg C result (300 s @ 3000 B, probe-bracketed, archive committed): the slot-(total-2) spike is UNCHANGED with no turnaround cycling (idx11 22/66 attributed, CRC delta +62 vs +75/+80 in legs A/B). With this, every software-layer candidate is eliminated; the corruption is physical/silicon in the TX chain or deterministic self-EMI. Next discriminators need a flash session (post-TX FIFO readback CRC, measured TX duration in RFCO, IRQ-flag capture) or an SDR capture. Also recorded: idle-bench ambient false-demod CRC floor ~4/h (negligible vs 62-80 per 300 s run). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
This PR completes the RS-11.5 host-side discriminator by adding a diagnostic gate to disable RXCONT arming on the tractor TX daemon (while keeping the production default behavior unchanged), and it records the resulting “leg C” evidence and conclusions in the design notes and bench-evidence bundle.
Changes:
- Add
LIFETRAC_RXCONT_ARM/-RxcontArmdiagnostic toggle and wire it into the TX daemon’s RXCONT arming paths. - Update design TODO + RESULTS writeups to document leg C and the conclusion that the RXCONT turnaround hypothesis is refuted.
- Commit an archived probe-bracketed run (logs + params) for leg C under
bench-evidence/.
Reviewed changes
Copilot reviewed 5 out of 8 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| LifeTrac-v25/DESIGN-CONTROLLER/TODO.md | Updates RS-11.5 notes to include leg C results and next steps. |
| LifeTrac-v25/DESIGN-CONTROLLER/firmware/x8_lora_bootloader_helper/run_live_radio_monitor.ps1 | Adds -RxcontArm parameter and passes LIFETRAC_RXCONT_ARM into the TX container. |
| LifeTrac-v25/DESIGN-CONTROLLER/firmware/tractor_x8/image_tx_daemon.py | Adds LIFETRAC_RXCONT_ARM env gate to disable RXCONT arming/re-arming logic for diagnostics. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_11_4_train_length_sweep_2026-08-02/RESULTS.md | Documents leg C methodology and conclusion; updates session verdict residuals accordingly. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/tx_daemon.log | Adds archived TX daemon log for leg C evidence bundle. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/synth_pub.log | Adds archived synthetic publisher log for leg C evidence bundle. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/rx_daemon.log | Adds archived RX daemon log for leg C evidence bundle. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260802_094053_86bf5d7f/params.txt | Adds archived run parameters for leg C evidence bundle. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
|
||
| 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`"" |
Contributor
Author
dorkmo
added a commit
that referenced
this pull request
Aug 2, 2026
…dation, power clamp Copilot findings, all valid: - Archived params.txt now records rxcont_arm and tx_power_dbm (the two new run-affecting knobs were invisible in evidence bundles — the PR #93 catch, applied here on the stacked branch). - -RxcontArm gets [ValidateSet(0,1)] — any non-1 int silently disabled RXCONT (the daemon checks == "1"). - LIFETRAC_TX_POWER_DBM is range-checked host-side to 2..17 before the wire: a negative value wrapped via & 0xFF to 255, which the firmware normalizes DOWN to 17 dBm — junk input could silently RAISE power. Out-of-range now warns and leaves the profile default. Suite 1103/2446 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Continues the RS-11.5 diagnosis from PR #92 with the last host-side discriminator.
The experiment
New diagnostic gate
LIFETRAC_RXCONT_ARM(daemon env + harness-RxcontArm, production default 1, unchanged): setting 0 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 turnaround cycling at all. The code comment and TODO both carry the warning: never ship 0 — in-stream command delivery lives in those inter-fragment listening gaps, and inter-train-only delivery would blow the 700 ms hydraulic-control latency budget.The result
One 300 s probe-bracketed run at the pinned operating point (archive committed):
Unchanged. The turnaround hypothesis is refuted, and with it the software-layer candidate space is closed: TX skips, host command TX, RX re-arm at train start, prepare-ahead, host-side drops, in-train cumulative, and now RXCONT cycling are all eliminated by direct measurement.
Where this leaves the diagnosis
11–18% of trains lose per-frame slot total−2 to on-air CRC corruption whose cause is physical/silicon-level: either the TX chain radiates corrupt bits for a reason invisible to the C-code guards (FIFO/PLL/PA behaviour), or deterministic self-EMI at the tractor. The next discriminators need a flash session (post-TX FIFO readback CRC at slot total−2, measured TX duration in RFCO_PERTX, IRQ-flag capture) — or an SDR capture of a corrupt slot, which would settle it without touching firmware.
Also recorded: the idle bench accumulates ambient false-demod CRC errors at ~4/h (the counter's noise floor; negligible against 62–80 per 300 s run).
Suite: 1103/2446 green (default-path behavior unchanged).
🤖 Generated with Claude Code