RS-11.4 closed: in-train gradient gone under smooth pacing; boundary event is the new loss lead - #92
Conversation
…is the new lead Train-length sweep (3000/1500/750 B, n=2, all six -Archive bundles committed): the D1 cumulative-with-index gradient is not reproduced under smooth pacing — the mechanism was the token bucket, fixed 2026-07-30. The dominant remaining loss is a per-train-boundary event (~0.20-0.25/boundary, ~1.3-1.8 fragments each): raw loss scales inversely with train length (4.9% at 13-frag -> 10% at 4-frag), timing out 23-34% of trains. Also surfaced: lost_frag_idx never attributes timed-out trains (2-8 attributed vs 118-190 raw — caught by the standing reconcile rule), so every prior per-index claim described only completing trains; and the retained 0x63 pending-ack retries radiate forever unacked (~1/18 s) on synth benches. RS-11.5 opened: timeout attribution, then the index-0-vs- tail discrimination of the boundary event, plus bounded 0x63 retries. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Not ready to approve
The new evidence summaries in TODO/RESULTS contain a couple of statements that conflict with the committed log artifacts (notably bounded 0x63 retries and the “no third bucket” claim), so the documentation should be corrected for internal consistency.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Pull request overview
This PR documents and closes RS-11.4 by committing a prescribed train-length sweep’s evidence bundle(s) and summarizing the re-baselined findings, while opening RS-11.5 as the next investigation step.
Changes:
- Mark RS-11.4 as closed in
TODO.mdwith a summary of findings and create the RS-11.5 follow-up item. - Add the sweep write-up (
RESULTS.md) describing the train-length scaling results and implications. - Commit the referenced
radio_monitor_..._bb21b053evidence artifacts (logs + params) for the six-Archivebundles.
File summaries
| File | Description |
|---|---|
| LifeTrac-v25/DESIGN-CONTROLLER/TODO.md | Records RS-11.4 closure summary and opens RS-11.5 follow-up tasks. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_11_4_train_length_sweep_2026-08-02/RESULTS.md | Captures the sweep analysis, tables, and conclusions for RS-11.4. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_214147_bb21b053/synth_pub.log | Evidence artifact for the 750B synth publisher run. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_214147_bb21b053/params.txt | Run parameters for the 750B evidence bundle. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_213622_bb21b053/synth_pub.log | Evidence artifact for the 750B synth publisher run (twin). |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_213622_bb21b053/params.txt | Run parameters for the 750B evidence bundle (twin). |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_213057_bb21b053/tx_daemon.log | Evidence artifact for the 1500B TX daemon run. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_213057_bb21b053/synth_pub.log | Evidence artifact for the 1500B synth publisher run. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_213057_bb21b053/params.txt | Run parameters for the 1500B evidence bundle. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_212534_bb21b053/tx_daemon.log | Evidence artifact for the 1500B TX daemon run (twin). |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_212534_bb21b053/synth_pub.log | Evidence artifact for the 1500B synth publisher run (twin). |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_212534_bb21b053/params.txt | Run parameters for the 1500B evidence bundle (twin). |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_212010_bb21b053/tx_daemon.log | Evidence artifact for the 3000B TX daemon run. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_212010_bb21b053/synth_pub.log | Evidence artifact for the 3000B synth publisher run. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_212010_bb21b053/rx_daemon.log | Evidence artifact for the 3000B RX daemon run. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_212010_bb21b053/params.txt | Run parameters for the 3000B evidence bundle. |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_211446_bb21b053/tx_daemon.log | Evidence artifact for the 3000B TX daemon run (twin). |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_211446_bb21b053/synth_pub.log | Evidence artifact for the 3000B synth publisher run (twin). |
| LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/radio_monitor_20260801_211446_bb21b053/params.txt | Run parameters for the 3000B evidence bundle (twin). |
Review details
- Files reviewed: 8/26 changed files
- Comments generated: 3
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
| completing trains; and the retained 0x63 pending-ack retries radiate | ||
| ~1/18 s forever when nothing acks (bench artifact + robustness point). |
| `published + timeouts ≈ trains` in every run (122+64≈190, 280+94≈382, | ||
| 436+133≈569) — every train either completes or times out; there is no | ||
| third bucket. Loss events per boundary are near-constant at ~0.20–0.25 |
| - **17 × 0x63 (ENCODE_MODE) radiations in every run** — the retained | ||
| encode-mode override retries unacked for the whole session because the | ||
| synth feed has no camera_service to ack it (pending-ack machinery never | ||
| gives up; throttled to ~1/18 s). Each TX blinds the base's RX briefly: |
…timate-locked The "2-8 attributed vs 118-190 raw" instrument-gap claim was an ANALYSIS error: lost_frag_idx logs are per-10s-window (histogram reset at image_rx_daemon.py:1630), and the first parser read the last window as a run cumulative. Summing windows: 68-143 attributed = 55-75% of raw. Recorded per the corrections discipline. The corrected per-index histograms answer RS-11.5's discrimination outright: the loss is position-locked to the SECOND-TO-LAST fragment at every train length (30%/50%/75% of attributed at 13/7/4-frag; index 0 near-baseline). TX_DONE accounting + the synth size mix rule out TX-side skips; 17 command TXs/run rule out host-TX blinding arithmetically. The remaining split (demodulated-but-dropped vs never-demodulated) gets the rs115_stats_probe.py L072 counter readout, committed here. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Correction pushed (97b2b5f), per the corrections discipline: finding 3 ("instrument gap: 2–8 attributed vs 118–190 raw") was an analysis error in my parser, not an instrument defect — The corrected per-index histograms strengthen the headline finding and answer the RS-11.5 discrimination outright: the boundary event is position-locked to the second-to-last fragment of the train at every train length (30% / 50% / 75% of attributed loss at 13/7/4-frag; index 0 near-baseline). TX_DONE accounting plus the synth size mix rule out TX-side skips; 17 command TXs per run rule out host-TX blinding arithmetically. The L072 counter readout to split demodulated-but-dropped vs never-demodulated ( |
…rruption Probe-bracketed L072 counter split (two 300 s runs, prepare-ahead A/B): dio0 = rx_ok + crc_err + tx_ok reconciles exactly in both legs — every fragment reaches the base demodulator, and the lost ones arrive CORRUPT (+75/+80 CRC per run ~= the attributed loss). Host-side drops zero at every counter. The prepare-ahead hypothesis is refuted (spike unchanged at 21/79 with PA=0); the synth 12/13-frag size mix refines the lock to per-frame slot total-2 — the v3 drain phase — not train-last. Also recorded: base gpio163 NRST no longer resets the L072 (counters survived ~8 harness launches); the CR-4/5 "zero CRC errors" basis was measured at a layer that cannot see radio-CRC failures (radio-layer rate 3.2-3.4%); daemon-vs-L072 frame gap is the synth DurationS+10 overrun. Three run archives committed; RS-11.5 reframed to the fix. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… two-bucket claim Copilot caught two evidence-vs-text mismatches, both valid: - The 0x63 pending-ack machinery is BOUNDED, not unbounded: all 17 radiations land in the first ~10 s and the log says "cmd 0x63 GAVE UP after 17 attempts (10.3 s)". The "radiates ~1/18 s forever" claim was an averaging artifact (17/300 s without checking the distribution). Corrected in RESULTS §4 + TODO; the retry-bound follow-up dissolves, and the startup confinement strengthens the command-TX exoneration. - "Every train either completes or times out; no third bucket" overstated the reconcile: 4-13 trains/run remain (whole-train losses + in-flight at teardown). Softened. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Evidence-only PR closing RS-11.4 with the prescribed train-length sweep (SynthBudgetB 3000/1500/750 → 13/7/4 fragments per train, n=2, pinned operating point, all six
-Archivebundles committed). Full analysis:bench-evidence/RS_11_4_train_length_sweep_2026-08-02/RESULTS.md.The three findings
The original question is moot. The D1 cumulative-with-index gradient (67 in-train losses, indices 8–11 taking 55%) does not reproduce under smooth pacing — in-train attributed loss collapsed to 2–8 per run (~0.15%) with no gradient at any train length. The mechanism was the AirtimeBudget token bucket (the index-10-notch family), fixed when smooth pacing shipped 2026-07-30, the day after RS-11.4 was opened.
The dominant remaining loss is a per-train-boundary event, and it's bigger than the old floor. Raw fragment loss scales inversely with train length — 4.9% at 13-frag → 10% at 4-frag — with a near-constant ~0.20–0.25 events per boundary costing ~1.3–1.8 fragments each, timing out 23–34% of all trains (
published + timeouts ≈ trainsin every run). This is now the single largest known throughput lever.Instrument gap caught by the standing reconcile rule:
lost_frag_idxattributes 2–8 losses against raw deltas of 118–190 — it never attributes fragments of trains that time out, so every prior per-index claim (including the F4 gate answer) described only completing trains.Also recorded: the retained 0x63 encode-mode pending-ack retries radiate forever (~1/18 s) on synth benches where nothing acks — bench artifact plus a real bounded-retry robustness item.
Follow-up opened (RS-11.5)
Host-side: (1) attribute timed-out trains' missing indices before eviction, restoring the reconcile invariant; (2) re-run one 13-frag + one 4-frag pair and read the per-index histogram of failed trains — mass at index 0–1 discriminates the RX re-arm race from TX-side teardown; (3) bound the 0x63 retries.
No code changes; CI does not run on these paths (evidence + TODO only).
🤖 Generated with Claude Code