COMMAND_WIRE_LEN change log (jun11-good fork only) Purpose: small incremental parser changes with rollback IDs. Primary product IDs are now EG A.B.C.D — see EG_CHANGELOG.md. 2026-09-12 EG 4.1.0.8 parser_build=eg-4.1.0.8-ohd-irq-affinity-quiet uartd_abi=4.1.0.7 xr=2.2.2.12 - Quiet ohd-irq-affinity oneshot (install under /usr/local/lib/ohd; no red Job failed on update.sh) - Rollback / prior tip: EG 4.1.0.7 pi-hs-gpiochip-clock-de 2026-09-12 EG 4.1.0.7 parser_build=eg-4.1.0.7-pi-hs-gpiochip-clock-de uartd_abi=4.1.0.7 xr=2.2.2.12 - Pi HS: gpiochip v2 ioctl hot path (no pinctrl fork per DE/IN); de_hold = one air+margin nanosleep - Rollback / prior tip: EG 4.1.0.6 install-pi-expected-from-version 2026-09-12 EG 4.1.0.6 parser_build=eg-4.1.0.6-install-pi-expected-from-version uartd_abi=4.1.0.5 xr=2.2.2.12 - install_pi.sh EXPECTED_VER from VERSION file (was stuck at 2.2.2.11). - Rollback / prior tip: EG 4.1.0.5 ext-de-no-wire-sleep 2026-09-12 EG 4.1.0.5 parser_build=eg-4.1.0.5-ext-de-no-wire-sleep uartd_abi=4.1.0.5 xr=2.2.2.12 - EXTERNAL_DE return-after-bulk; Pi HS one air wait; skip Pi HS post-inject gpio7_rx. - Rollback / prior tip: EG 4.1.0.4 scr-allow-slave-retry 2026-09-11 EG 4.0.0.67 parser_build=eg-4.0.0.67-health-cards-hub-spoke-inject uartd_abi=4.0.0.10 - Health: Collector gray n/a on bridge; WiFi Hub/Spoke cards; Inject = software TX path. - Rollback / prior tip: EG 4.0.0.66 health-mode-by-config 2026-09-11 EG 4.0.0.66 parser_build=eg-4.0.0.66-health-mode-by-config uartd_abi=4.0.0.10 - Health cards by profile/role (listen vs bridge); bridge expects inject=1. - Rollback / prior tip: EG 4.0.0.65 promote-tip-apply-defer-http 2026-09-11 EG 4.0.0.65 parser_build=eg-4.0.0.65-promote-tip-apply-defer-http uartd_abi=4.0.0.10 - WEB_APPLY Promote: defer HTTP restart until tip apply finishes inject/USB. - Rollback / prior tip: EG 4.0.0.64 web-promote-apply 2026-09-11 EG 4.0.0.64 parser_build=eg-4.0.0.64-web-promote-apply uartd_abi=4.0.0.10 - Web Promote overlays /dev (no --delete) + tip apply; USB Disconnected/Reconnected UI. - Bridge start/stop + sync_capture Status buttons. Field channel stays prod-only. - Rollback / prior tip: EG 4.0.0.63 listen-until-x1 2026-09-11 EG 4.0.0.63 parser_build=eg-4.0.0.63-listen-until-x1 uartd_abi=4.0.0.10 - Empty peel: defer AUTO_CLOSE_DONE miss until pending expire (~120 ms); harvest=5. - Rollback / prior tip: EG 4.0.0.62 ohd-proxy-df 2026-08-12 EG 3.1.0.4 parser_build=eg-3.1.0.4-pogcc-com-update-sync driver=2.2.2.10 - update.sh syncs ethergold-pogcc-com; auto enable only when DF owner=ethergold. - Rollback / prior tip: EG 3.1.0.3 pogcc-com-df-local-http 2026-08-12 EG 3.1.0.3 parser_build=eg-3.1.0.3-pogcc-com-df-local-http driver=2.2.2.10 - DYZINEFRAME_HTTP=127.0.0.1:31235; DF local Bottle when ethergold-http owns 31234. - Rollback / prior tip: EG 3.1.0.2 pogcc-com-runtime-dir 2026-08-12 EG 3.1.0.2 parser_build=eg-3.1.0.2-pogcc-com-runtime-dir driver=2.2.2.10 - RuntimeDirectory=/run/ethergold for pogcc-com status; fix crash-loop as topbox. - Rollback / prior tip: EG 3.1.0.1 pogcc-com-service 2026-08-12 EG 3.1.0.1 parser_build=eg-3.1.0.1-pogcc-com-service driver=2.2.2.10 - ethergold-pogcc-com.service owns Heltec CDC + P3 /credits; DF pogcc_com_owner kill-switch. - Rollback / prior tip: EG 3.0.2.14 df-except-eg-mask 2026-08-10 EG 3.0.2.14 parser_build=eg-3.0.2.14-df-except-eg-mask driver=2.2.2.10 - DF taskset 0-2 (not core2-only); EG remains core3 exclusive. - Rollback / prior tip: EG 3.0.2.13 df-live-cpu-pin 2026-08-10 EG 3.0.2.13 parser_build=eg-3.0.2.13-df-live-cpu-pin driver=2.2.2.10 - install_cpu_affinity: live taskset pin DF + uartd/bridge on update.sh. - Rollback / prior tip: EG 3.0.2.12 txn-restart-local-x0 2026-08-10 EG 3.0.2.12 parser_build=eg-3.0.2.12-txn-restart-local-x0 driver=2.2.2.10 - Local x0 same-seq restart: clear open wait + hand gen; drop stale late 41/0D. - Rollback / prior tip: EG 3.0.2.11 cpu-affinity-lane 2026-08-09 EG 3.0.2.3 parser_build=eg-3.0.2.3-jpot-hub-seal-fanout driver=2.2.2.10 - Hub jpot: keep award_x9 on arm; non-local clear after eth x1+fanout; soft peer injects. - Fanout only mapped/carrier peers (cut 25-port EDGE blast). - Rollback / floor: EG 3.0.2.1; prior tip 3.0.2.2 inject-async-auto-close 2026-08-09 EG 3.0.2.2 parser_build=eg-3.0.2.2-inject-async-auto-close driver=2.2.2.10 - inject() returns after DONE; success AUTO_CLOSE async (cut ~21 ms spoke x9 scoop). - Rollback / known-good floor: EG 3.0.2.1 inject-noblock-scoop 2026-08-09 EG 3.0.2.1 parser_build=eg-3.0.2.1-inject-noblock-scoop driver=2.2.2.10 - Non-blocking post-DONE inject scoop (cut ~80 ms quiet-socket pad under lock). - Rollback: EG 3.0.1.58 inject-rpc-marks 2026-08-09 EG 3.0.1.58 parser_build=eg-3.0.1.58-inject-rpc-marks driver=2.2.2.10 - uartd pre/burst/post marks + Python inject_rpc_wait on inject_stage_diag. - Rollback: EG 3.0.1.57 inject-stage-forensics 2026-08-09 EG 3.0.1.57 parser_build=eg-3.0.1.57-inject-stage-forensics driver=2.2.2.10 - Log idle_wait / pre_bulk / bulk_wall / de_hold (inject_stage_diag). No policy change. - Rollback: EG 3.0.1.56 jpot-lift-no-thrash 2026-08-08 EG 3.0.1.56 parser_build=eg-3.0.1.56-jpot-lift-no-thrash driver=2.2.2.10 - Stop bank_jpot_x1_priority_lift thrash/console spam after jackpot. - Rollback: EG 3.0.1.55 hand-open-on-miss 2026-08-08 EG 3.0.1.55 parser_build=eg-3.0.1.55-hand-open-on-miss driver=2.2.2.10 - Empty harvest: hand open; no Python 0D/infer; allow Master re-49 inject. - Rollback: EG 3.0.1.54 restore-x1-peel 2026-08-08 EG 3.0.1.54 parser_build=eg-3.0.1.54-restore-x1-peel driver=2.2.2.10 - Revert .53 20 ms hunt; restore peel stack / HS / pending. Continuous MRT. - Rollback: EG 3.0.1.52 x9-done-before-0d 2026-08-08 EG 3.0.1.53 parser_build=eg-3.0.1.53-x1-hunt-20ms driver=2.2.2.10 - FAILED: post-x9 x1 insurance ≤20 ms; continuous field MRT - Rollback: EG 3.0.1.54 restore-x1-peel 2026-08-08 EG 3.0.1.52 parser_build=eg-3.0.1.52-x9-done-before-0d driver=2.2.2.10 - INJECT_DONE after x9+x1 peel before synth 0D; 0D idle wait 150→25 ms. - Rollback: EG 3.0.1.51 local-game-txn-exclusive 2026-08-08 EG 3.0.1.51 parser_build=eg-3.0.1.51-local-game-txn-exclusive driver=2.2.2.10 - Local slave x0→0D exclusive eth→UART fence; no long miss-defer; CGS-on-miss no Python 0D; second same-seq 49 peel hold. - Rollback: EG 3.0.1.49 or .50 2026-08-08 EG 3.0.1.50 parser_build=eg-3.0.1.50-late-x1-miss-defer driver=2.2.2.10 - NO_X1 Python fallback defer 250 ms (CGS peer 40: 350); late x1 promotes before premature recovery 0D (soak 1634 pos5 terminal MRT). - Rollback: EG 3.0.1.49 reopen-recovery-ok - Superseded as policy: 3.0.1.51 (defer is not the MRT fix) 2026-08-08 EG 3.0.1.49 parser_build=eg-3.0.1.49-reopen-recovery-ok driver=2.2.2.10 - Recovery/miss/late_0d closes reopen same-seq immediately; ok close settle 400 ms (fix .48 continuous latch + keep 1513 CGS no-reopen). - Rollback: EG 3.0.1.48 reopen-settled-only 2026-08-08 EG 3.0.1.48 parser_build=eg-3.0.1.48-reopen-settled-only driver=2.2.2.10 - Same-seq reopen only after close-done age ≥ 2500 ms (soak 1513: .47 reopen on CGS re-wager after good close → late_0d_after_x1). - Rollback: EG 3.0.1.47 reopen-same-seq-close 2026-08-08 EG 3.0.1.47 parser_build=eg-3.0.1.47-reopen-same-seq-close driver=2.2.2.10 - Same-seq local wager reopens close-done (pos5 continuous MRT latch); spoke WG keys fall through unwritable /etc/ethergold/spoke. - Rollback: EG 3.0.1.46 revert-deal-open-guard 2026-08-07 EG 3.0.1.46 parser_build=eg-3.0.1.46-revert-deal-open-guard driver=2.2.2.10 - REVERT 3.0.1.45 deal-open serialize: foreign 0x40 / same-TID re-wager no longer deferred while trunk open (soak 0011 master-no-slave-cgs: queue_cap + CGS). - Rollback from bad tip: skip .45; use .46 or .44. 2026-08-07 EG 3.0.1.45 parser_build=eg-3.0.1.45-master-deal-open-guard driver=2.2.2.10 - Master: defer same-TID CGS re-wager inject for 140 ms open-deal guard; serialize foreign 0x40 while any trunk open (pos5 MRT 2258: second 40 stomped first deal). - FIELD FAIL soak 2026-08-08_0011 — use 3.0.1.46. - Rollback: EG 3.0.1.44 x1-rx-pending-100 2026-08-07 EG 3.0.1.44 parser_build=eg-3.0.1.44-x1-rx-pending-100 driver=2.2.2.10 AUTO_CLOSE_PENDING 100ms; imm peel hunts x1 to hard_cap (no early exit on non-x1 frame); Python NO_X1 fallback defer 20ms for late AUTO_CLOSE_DONE. Rollback: 3.0.1.43 0d-single-owner. 2026-08-07 EG 3.0.1.43 parser_build=eg-3.0.1.43-0d-single-owner driver=2.2.2.10 Deal 0D single owner: uartd auto-close only; no Python second inject after auto_done; Python P0 only on auto_close_miss; queue_synth no longer bypasses uartd gate. Rollback: 3.0.1.42 jpot-seal-reopen-hand. 2026-08-07 EG 3.0.1.42 parser_build=eg-3.0.1.42-jpot-seal-reopen-hand driver=2.2.2.10 JP14 class: progressive reopen after empty close; seal needs award+post-arm; reinject stamps eth_queued; purge never stores pre-arm last_frame; progressive inject front/priority; Master 0D allowed while bank-jpot armed; clear on miss. Rollback: 3.0.1.41 pogcc-telemetry-diag. 2026-08-07 EG 3.0.1.41 parser_build=eg-3.0.1.41-pogcc-telemetry-diag driver=2.2.2.10 status/ chown+hint when pogcc-telemetry missing; DF path default ~/EtherGold. Rollback: 3.0.1.40 machine-status-json. 2026-08-07 EG 3.0.1.40 parser_build=eg-3.0.1.40-machine-status-json driver=2.2.2.10 status/machine-status.json (POG-CC telemetry + progressives + last hit); durable under ~/EtherGold/status/. Rollback: 3.0.1.39 heltec-boot-arm-force-cg. 2026-08-07 EG 3.0.1.39 parser_build=eg-3.0.1.39-heltec-boot-arm-force-cg driver=2.2.2.10 Heltec /hello → DF pogcc-boot-arm.json; next local play force-publishes current-game (SDS still primary). Rollback: 3.0.1.38 jpot-award-before-seal. 2026-08-06 EG 3.0.1.38 parser_build=eg-3.0.1.38-jpot-award-before-seal driver=2.2.2.10 Purge pre-arm empty x1; seal only post-arm; peer no progressive UART inject; no hold_timeout fanout flood. Rollback: 3.0.1.37 jpot-award-never-dedupe. 2026-08-06 EG 3.0.1.37 parser_build=eg-3.0.1.37-jpot-award-never-dedupe driver=2.2.2.10 Local progressive grant never eth inject dedupe (cash→jpot award path); fanout port_names(). Rollback: 3.0.1.36 jpot-seal-abort-window. 2026-08-06 EG 3.0.1.36 parser_build=eg-3.0.1.36-jpot-seal-abort-window driver=2.2.2.10 BANK_JPOT_X1_SEAL_MS=250 (was 10000) — Master progressive abort ~200ms race only. Rollback: 3.0.1.35 jpot-copper-seal-reset. 2026-08-06 EG 3.0.1.35 parser_build=eg-3.0.1.35-jpot-copper-seal-reset driver=2.2.2.10 Dealkiller: copper-seal x1 only (not eth); reinject on Master progressive retries after seal. Rollback: 3.0.1.34 jpot-clear-on-x1-evidence. 2026-08-06 EG 3.0.1.34 parser_build=eg-3.0.1.34-jpot-clear-on-x1-evidence driver=2.2.2.10 - Bank jpot arm clears on eth_rx x1 / inject echo match (not copper-PC-only). Rollback: eg-3.0.1.33-jpot-never-defer-close. 2026-08-05 EG 3.0.1.33 parser_build=eg-3.0.1.33-jpot-never-defer-close driver=2.2.2.10 - Never transaction-defer gameplay x1 / 0x0D while bank jpot armed (any TID). Rollback: eg-3.0.1.32-jpot-eth-no-repeat. 2026-08-05 EG 3.0.1.32 parser_build=eg-3.0.1.32-jpot-eth-no-repeat driver=2.2.2.10 - No eth re-arm peers / no winner re-flood fanout / bank-jpot eth inject dedupe. Rollback: eg-3.0.1.31-jpot-defer-fanout (or .30). 2026-08-05 EG 3.0.1.31 parser_build=eg-3.0.1.31-jpot-defer-fanout driver=2.2.2.10 - Bank progressive eth: winner unicast until Master has x1, then multiport fanout. Rollback: eg-3.0.1.30-auto-edge-cgs-path. 2026-08-05 EG 3.0.1.30 parser_build=eg-3.0.1.30-auto-edge-cgs-path driver=2.2.2.10 - Spoke Master path on map miss; auto hub state dir + learn hub IP enroll. Rollback: eg-3.0.1.29-spoke-tx-arbiter. 2026-08-05 EG 3.0.1.29 parser_build=eg-3.0.1.29-spoke-tx-arbiter driver=2.2.2.10 - Per-spoke inject queues + TidTxFsm arbiter; no eth flood on missing TID→gretap map; soft 0A yields to open tx. Rollback: eg-3.0.1.28-jpot-x1-copper-clear. 2026-08-04 EG 3.0.1.28 parser_build=eg-3.0.1.28-jpot-x1-copper-clear driver=2.2.2.10 - Clear bank jpot x1 priority only on Master copper packet_complete of winner x1; reinject on empty echo / Master progressive retry; close_miss on hold/max. Rollback: eg-3.0.1.27-jpot-close-primary. 2026-08-04 EG 3.0.1.27 parser_build=eg-3.0.1.27-jpot-close-primary driver=2.2.2.10 - Bank progressive close exclusive: only winner x1 + progwin issue inject while armed; cancel competing pending; never dedupe/starve Master grant retries; only progwin x9 full-floods; empty only_ports is not flood. Rollback: eg-3.0.1.26-superball-sheet11. 2026-08-04 EG 3.0.1.26 parser_build=eg-3.0.1.26-superball-sheet11 driver=2.2.2.10 - SuperBall Phase 2 cash: SGVI sheet-11 mults (pos5 T340_0002 @ $0.25); last-ball ×4; BAJ not used (progwin Phase 1). Rollback: eg-3.0.1.25-superball-keno-p2. 2026-08-04 EG 3.0.1.25 parser_build=eg-3.0.1.25-superball-keno-p2 driver=2.2.2.10 - Phase 2 early-win SuperBall Keno (930A): allowlist + last-ball ×4 (cash matrix still sheet-10; fixed in 3.0.1.26). Rollback: eg-3.0.1.24-bank-jpot-x1-prio. 2026-08-04 EG 3.0.1.24 parser_build=eg-3.0.1.24-bank-jpot-x1-prio driver=2.2.2.10 - eth→UART inject priority class: after Master bank progressive jpot (progwin>0), winner-TID gameplay x1 is INJECT_PRIORITY_BANK_JPOT_X1 (ahead of FIFO and STOM) for 30s. Arms on uart_to_eth and eth_rx of jpot; lifts from transaction defer; never gate-deferred. Fixes star/lab soak where lab synth stalled jpot 0x81 ~429ms before Master UART. Rollback: eg-3.0.1.23-hub-hot-enroll-eth. 2026-08-03 EG 3.0.1.23 parser_build=eg-3.0.1.23-hub-hot-enroll-eth driver=2.2.2.10 - Hub Master hot-adds eg-sNN into live DirectionalEthRouter on enroll/restore; eth select loop refreshes sockets; spoke auto-enroll UDP. No Master restart for late-joining spokes. Rollback: eg-3.0.1.22-lab-withhold-status-0d. 2026-08-02 EG 3.0.1.22 parser_build=eg-3.0.1.22-lab-withhold-status-0d driver=2.2.2.10 - LAB: withhold local status 0x0D (uartd auto-close + Python synth) for N rounds (default 1) to force Slave MRT; x1 eth-forward still allowed. LAB_WITHHOLD_STATUS_0D=1 / COUNT. Not for --prod. Rollback: eg-3.0.1.21-x1-ack-wire-len. 2026-08-02 EG 3.0.1.21 parser_build=eg-3.0.1.21-x1-ack-wire-len driver=2.2.2.10 - Catastrophic: 3.0.1.20 first-EOP x1 extract accepted 6 B false frames (EOP==0x0D); early eth latched and blocked real 12 B 0x81 (pos2 SpinBall progwin ~$2824, no meter reset). Wire-len extract + Python reject-before- latch. Rollback: eg-3.0.1.20-x1-ack-eth-before-0d. 2026-08-01 EG 3.0.1.20 parser_build=eg-3.0.1.20-x1-ack-eth-before-0d driver=2.2.2.10 - Catastrophic: auto-close imm peel of local 0x81 never eth-forwarded to Master before synth 0D (pos4 SpinBall progwin ~$3126, no meter reset). IPC_X1_ACK_FRAME before 0D + imm→POST_DE merge. Rollback: eg-3.0.1.19-auto-close-skip-closed-seq. 2026-07-31 EG 3.0.1.19 parser_build=eg-3.0.1.19-auto-close-skip-closed-seq driver=2.2.2.10 - Skip C auto-close arm on Master same-seq x9 after synth 0D (false auto_close_miss harvest=0 / seq_already_closed). Rollback: eg-3.0.1.18-auto-close-0d-wait-hs. 2026-07-31 EG 3.0.1.18 parser_build=eg-3.0.1.18-auto-close-0d-wait-hs driver=2.2.2.10 - Auto-close synth 0D waits for HS inactive (require_idle+150ms) instead of instant EBUSY; pending idle retry if still busy after harvest. Fixes pos5 3.0.1.17 peel-hit / 0D-EBUSY MRT. Rollback: eg-3.0.1.17-x9-immediate-rx-peel. 2026-07-31 EG 3.0.1.17 parser_build=eg-3.0.1.17-x9-immediate-rx-peel driver=2.2.2.10 - Post-x9 immediate UART RX peel (no HS gate): 20 ms first-byte activity gate, extend while RX until local x1 or 45 ms hard cap; harvest=4. Python defers same-seq eth→UART x9 while await_x1 (await_x1_peel). Pos1 stacked-x59 MRT. Rollback: eg-3.0.1.16-hs-sample-tristate. 2026-07-30 EG 3.0.1.16 parser_build=eg-3.0.1.16-hs-sample-tristate driver=2.2.2.10 - Fix slv_hs_misalign false storm from 3.0.1.15 (1442 = 2/inject, pos5 2336Z): DE-high HS sample now polls GET_GPIO1_EVENT (driver cache, no USB ctrl) in the drain loop; SLV-IN samples tri-state 0/1/2 with UNKNOWN suppressing the alarm instead of reading as low. DE timing unchanged; driver unchanged. Rollback: eg-3.0.1.15-de-hold-hard-cap. 2026-07-30 EG 3.0.1.15 parser_build=eg-3.0.1.15-de-hold-hard-cap driver=2.2.2.10 - Kill 5s MANUAL_DE/HS stalls: GPIO7 USB ctrl timeout 100ms (was 5000 via set_reg); driver hard-cap delayed_work at air+20ms; no GET_REG/capture_poll while DE high; INJECT_WAIT_S_DEFAULT 5.0->0.75. pos5 soak attribution. Rollback: eg-3.0.1.14-clear-capture-keep-hs-gpio (+ driver 2.2.2.9). 2026-07-30 EG 3.0.1.14 parser_build=eg-3.0.1.14-clear-capture-keep-hs-gpio - CLEAR_CAPTURE wipe now preserves hs_gpio* companion captures; hs_gpio_logger reopens its path if unlinked (type=reopen marker). Logger-first + bridge CLEAR_CAPTURE=1 was orphaning the open fd, so 1276 counted edges never appeared in ls/rclone. run_hs_gpio_logger.sh env source path fixed (sync/, not dev/ - banner said pos=0) and tap line moved to hs_gpio.env (GPIO3) with a numeric guard. No wire length or checksum change. Rollback: eg-3.0.1.13-bank-jpot-grant-flood. 2026-07-30 EG 3.0.1.13 parser_build=eg-3.0.1.13-bank-jpot-grant-flood - Skill jpot grants 0x5A/0x7A (Master answer to slave claim 0x52/0x72) join the bank fanout exemption: progwinval>0 on a grant now floods to all spokes and publishes a clear-WLAN jackpot announce. 3.0.1.12 keyed on is_gameplay_response only, which excludes 0x5A/0x7A - poker royal / SpinJack wins stayed per-seat. Claims are not flooded (no progwinval, addressed to Master). No wire length change. Rollback: eg-3.0.1.12-bank-jpot-x9-flood. 2026-07-30 EG 3.0.1.12 parser_build=eg-3.0.1.12-bank-jpot-x9-flood - Bank progressive jackpot x9 (progwinval BE32 @ 13-16 > 0) is exempt from EDGE_TID_UNICAST: flood to all spokes so every T340+ sees it and rings its bell. Ordinary gameplay x9 stays unicast. Defer abandon/queue_cap now keep those frames (source=bank_jpot_late, kept_bank_jpot) instead of dropping. No wire length or checksum change. Rollback: eg-3.0.1.11-ohd-fireworks-http. 2026-07-29 EG 3.0.1.11 parser_build=eg-3.0.1.11-ohd-fireworks-http - ethergold-http serves the existing fireworks-request.json to Win11 OHD. Display IPC only; no wire/UART behavior change. Rollback: eg-3.0.1.10-hs-gpio-ground-truth. 2026-07-29 EG 3.0.1.10 parser_build=eg-3.0.1.10-hs-gpio-ground-truth - Bench-only Pi GPIO tap on SLV_HS (hs_gpio_logger/analyze + run_hs_gpio_logger.sh, HS_GPIO_TAP.md). Kernel-stamped edges, CLOCK_MONOTONIC, no wire-path change. XR Table-8 INT proven 8 ms-quantized; GET_REG poll floors ~2.75 ms. Rollback: eg-3.0.1.9-exar-only-fuser. 2026-07-29 EG 3.0.1.9 parser_build=eg-3.0.1.9-exar-only-fuser - update.sh fuser-kill Exar ttyXRUSB/04e2 only — never FTDI P3 / PermDevMapper. Rollback: eg-3.0.1.8-hs-timing-driver-floor. 2026-07-29 EG 3.0.1.8 parser_build=eg-3.0.1.8-hs-timing-driver-floor - Raise XR driver floor to 2.2.2.9 so normal update installs the timing-ring ABI automatically. Runtime ring stays off unless enabled. Rollback: eg-3.0.1.7-hs-timing-env. 2026-07-29 EG 3.0.1.7 parser_build=eg-3.0.1.7-hs-timing-env - Timing trace via fixture-bridge.env (pos5 only; enable_hs_timing_env.sh) + env export allowlist; default trace path ${OUTPUT_DIR}/hs_timing_.jsonl. No wire-path change. Rollback: eg-3.0.1.6-hs-timing-trace. 2026-07-29 EG 3.0.1.6 parser_build=eg-3.0.1.6-hs-timing-trace - Runtime-gated HS/RX timing ring (driver 2.2.2.9) + uartd JSONL; analyzer/docs. No wire-path change. Rollback: eg-3.0.1.5-c-close-always. 2026-07-28 EG 3.0.1.5 parser_build=eg-3.0.1.5-c-close-always - C pending close after NO_X1 (WINDOW/grace); Python synth off when uartd. Rollback: eg-3.0.1.4-auto-close-hs-x1. 2026-07-28 EG 3.0.1.4 parser_build=eg-3.0.1.4-auto-close-hs-x1 - Auto-close peels HS WINDOW/FIFO x1 (pos5 Shamrock MRT NO_X1). Rollback: eg-3.0.1.3-uartd-auto-reinit. 2026-07-28 EG 3.0.1.3 parser_build=eg-3.0.1.3-uartd-auto-reinit - Auto-respawn uartd after USB/daemon death (pos5 CGS zombie). Rollback: eg-3.0.1.2-abort-de-hs-peel. 2026-07-27 EG 3.0.1.2 parser_build=eg-3.0.1.2-abort-de-hs-peel - Abort DE must stick (IPC write deadline + GPIO7 retry); HS-high x1 peel for auto-close; post-timeout inject cooldown (no stacked 79). Rollback: eg-3.0.1.1-uart-auto-close. 2026-07-27 EG 3.0.1.1 parser_build=eg-3.0.1.1-uart-auto-close - Minor-feature spin: uartd auto-synth 0D after local x9+x1; DONE before echo/forensics. - Same change briefly as 3.0.0.13; rollback: eg-3.0.0.12-current-game-catalog. 2026-07-27 EG 3.0.0.12 parser_build=eg-3.0.0.12-current-game-catalog - Wire→DF current-game catalog 13/16 from Jun 19 census. - Rollback: eg-3.0.0.11-current-game-ipc. 2026-07-27 EG 3.0.0.10 parser_build=eg-3.0.0.10-field-ui-drop-spe - Drop SPE from field config UI; keep EDGE_UPLINK=spe fatal guard. - Rollback: eg-3.0.0.9-inject-abort-de-drop. 2026-07-27 EG 3.0.0.9 parser_build=eg-3.0.0.9-inject-abort-de-drop - uartd inject worker + early echo; timeout→GPIO7 abort+requeue; driver 2.2.2.8 DE wall. - Rollback: eg-3.0.0.8-inject-log-after-tx. 2026-07-26 EG 3.0.0.8 parser_build=eg-3.0.0.8-inject-log-after-tx - Defer inject_echo/packets.raw flush until after synth/close (not under _tx_lock). - Rollback: eg-3.0.0.7-uart-xrusb-reopen. 2026-07-26 EG 3.0.0.7 parser_build=eg-3.0.0.7-uart-xrusb-reopen - uartd: dead XRUSB detect → channel re-resolve → reopen; IPC LOST/REOPEN. - Bridge: hold/requeue eth→UART _pending across UART outage. - Rollback: eg-3.0.0.6-pipe-probe. 2026-07-26 EG 3.0.0.6 parser_build=eg-3.0.0.6-pipe-probe - EDGE gretap pipe PING/PONG (no POG inject); retry until ready + RTT metrics. Rollback: eg-3.0.0.5-field-config-ui 2026-07-26 EG 3.0.0.5 parser_build=eg-3.0.0.5-field-config-ui - Field config UI + matrix; OIS WiFi HMAC plane; dual listen; edge --display-on. Rollback: eg-3.0.0.4-master-uart-x9-no-synth 2026-07-25 EG 3.0.0.4 parser_build=eg-3.0.0.4-master-uart-x9-no-synth - Master UART-origin x9 ⇒ no synth 0D (native close). Slave eth x9 still synths. Rollback: eg-3.0.0.3-hub-peer-inject 2026-07-25 EG 3.0.0.3 parser_build=eg-3.0.0.3-hub-peer-inject - Hub: do not freeze other spokes' gameplay behind await_local_0d / await_local_x1 (0A still deferred). Rollback: eg-3.0.0.2-spoke-tunnel-fix 2026-07-25 EG 3.0.0.2 parser_build=eg-3.0.0.2-spoke-tunnel-fix - Spoke tunnel_up: fix endpoint check order; no gretapN fallback; edge.env topology wins over bench.env; wg syncconf when wg0 already up. Rollback: eg-3.0.0.1-hub-spoke 2026-07-25 EG 3.0.0.1 parser_build=eg-3.0.0.1-hub-spoke - Major BOM: wlan-star hub/spoke underlay. Rollback: eg-2.2.2.75-edge-env-canonical 2026-07-25 EG 2.2.2.75 parser_build=eg-2.2.2.75-edge-env-canonical - One canonical /etc/ethergold/edge.env; /etc/fixture/edge.env is now a symlink (no dual-write). sed --follow-symlinks in apply_chain CRLF strip. Rollback: eg-2.2.2.74-edge-env-overlay 2026-07-25 EG 2.2.2.74 parser_build=eg-2.2.2.74-edge-env-overlay - run_ethergold/pog_edge_env: fixture edge.env overlays ethergold so star config is not ignored. Rollback: eg-2.2.2.73-hub-spoke-provision 2026-07-25 EG 2.2.2.73 parser_build=eg-2.2.2.73-hub-spoke-provision - Pre-seed hub/spoke WG identity so a zero-peer hub can bind gretaps on first start (provision_hub_spoke.sh + sync/provision_wlan_star.ps1). No parser behavior change. Rollback: eg-2.2.2.72-enroll-crypto-stealth 2026-07-25 EG 2.2.2.72 parser_build=eg-2.2.2.72-enroll-crypto-stealth - Enrollment: silent on bad HMAC only; signed diagnostic deny after valid crypto. Rollback: eg-2.2.2.71-hub-spoke-underlay 2026-07-25 EG 2.2.2.71 parser_build=eg-2.2.2.71-hub-spoke-underlay - Hub/spoke underlay: TID-unicast, clear-WLAN meters/jackpots, enrollment, eg-sNN gretaps; preserve EDGE_MODE=0 + single-hop EDGE. Rollback: eg-2.2.2.70-echo-armed-wait 2026-07-25 EG 2.2.2.70 parser_build=eg-2.2.2.70-echo-armed-wait - Echo-armed inject wait: bus evidence extends 0.55s budget once (+1.0s) for late DONE; recv timeout tracks remaining budget. Fixes 00:09 MRT false uartd_inject_timeout. - Rollback: eg-2.2.2.69-peel-inject-budget 2026-07-24 EG 2.2.2.69 parser_build=eg-2.2.2.69-peel-inject-budget - Bidirectional peel (leading 61|x9); gameplay inject wait 0.55s; late_0d keeps queued 0D. - Rollback: eg-2.2.2.68-x1-always-0d 2026-07-23 EG 2.2.2.68 parser_build=eg-2.2.2.68-x1-always-0d - Always synth 0D on real local x1 (drop no_open_await skip after infer close). - Rollback: eg-2.2.2.67-infer-0d-25ms 2026-07-23 EG 2.2.2.67 parser_build=eg-2.2.2.67-infer-0d-25ms - MRT_X1_INFER_* 125/100 → 25 ms so miss-backstop synth 0D beats slave ~100 ms post-x1 watchdog. - Rollback: eg-2.2.2.66-early-0d-queue 2026-07-23 EG 2.2.2.66 parser_build=eg-2.2.2.66-early-0d-queue - Early inject ECHO/POST_DE bus harvest queues 0D under tx_lock; skip post-DE when echo already has peer / for non-x9 (incl. 0D); P0 close skips post-HS settle + fail-fast idle. - Rollback: eg-2.2.2.65-edge-bench-entry-guard 2026-07-22 EG 2.2.2.65 parser_build=eg-2.2.2.65-edge-bench-entry-guard - run_bridge_edge_bench: pass ETHERGOLD_ENTRY=1 into sudo -u jun11 env (stops EDGE redirect loop). - tunnel_up: re-apply wg Endpoint from conf when wg0 already up; EDGE_UPLINK accepts wlanN. - Rollback: eg-2.2.2.64-edge-uplink-wlann 2026-07-22 EG 2.2.2.64 parser_build=eg-2.2.2.64-edge-uplink-wlann - EDGE_UPLINK accepts wlanN (USB 6E stick as wlan1), not only wlan0; prep skips reassociate if iface already has IPv4. - Rollback: eg-2.2.2.63-deploy-dev-sync-only 2026-07-22 EG 2.2.2.63 parser_build=eg-2.2.2.63-deploy-dev-sync-only - To Deploy = dev+sync only; drop bridge/Daemon; install_field builds prod on Pi. - Rollback: eg-2.2.2.62-no-windows-in-deploy 2026-07-22 EG 2.2.2.62 parser_build=eg-2.2.2.62-no-windows-in-deploy - To Deploy excludes *.ps1/*.bat/*.cmd; rclone filter blocks them on Pi pull. - Rollback: eg-2.2.2.61-pull-from-to-deploy 2026-07-22 EG 2.2.2.61 parser_build=eg-2.2.2.61-pull-from-to-deploy - Bench rclone pull from To Deploy/EtherGold (dev+sync); build_to_deploy stages both. - Rollback: eg-2.2.2.60-update-run-ethergold 2026-07-22 EG 2.2.2.60 parser_build=eg-2.2.2.60-update-run-ethergold - update.sh → print/exec unified run_ethergold.sh; UPDATE_START=1 optional. - Rollback: eg-2.2.2.59-cli-from-env 2026-07-22 EG 2.2.2.59 parser_build=eg-2.2.2.59-cli-from-env - Single entry bash run_ethergold.sh; role/EDGE/profile/POS/CHANNEL from env; EDGE auto-sudo. - Rollback: eg-2.2.2.58-env-pos-autoload 2026-07-22 EG 2.2.2.58 parser_build=eg-2.2.2.58-env-pos-autoload - Launchers autoload FIXTURE_POS from fixture-bridge.env (run_ethergold / prod / listen). - Rollback: eg-2.2.2.57-unified-bridge-entry 2026-07-22 EG 2.2.2.57 parser_build=eg-2.2.2.57-unified-bridge-entry - run_ethergold.sh unified entry; copper launchers redirect when EDGE_MODE=1. - Rollback: eg-2.2.2.56-shim-private-reexport 2026-07-20 EG 2.2.2.56 parser_build=eg-2.2.2.56-shim-private-reexport - Compat shim re-exports private names; uart_capture imports pog422_core; echo shows where/message. - Rollback: eg-2.2.2.55-prod-role-ethergold-rename 2026-07-20 EG 2.2.2.55 parser_build=eg-2.2.2.55-prod-role-ethergold-rename - Field packaging: ETHERGOLD_ROLE=topbox|listen|edge; /etc/ethergold; ethergold.service. - Phase A/B rename: fixture→ethergold supervisors; pog422_bridge/core/listen + hat_bridge shims. - Rollback: eg-2.2.2.54-superpick-9508-replicate 2026-07-20 EG 2.2.2.54 parser_build=eg-2.2.2.54-superpick-9508-replicate - SuperPick lab synth: game 9508 + capture-replicate (Master was silent on 9507/random picks). - Rollback: eg-2.2.2.53-lab-seat-close-on-x1 2026-07-20 EG 2.2.2.53 parser_build=eg-2.2.2.53-lab-seat-close-on-x1 - Lab seat SM: close round on forged x1 (no 0D synth / skill / jpot). - Rollback: eg-2.2.2.52-lab-seat-sm-eth-rx 2026-07-20 EG 2.2.2.52 parser_build=eg-2.2.2.52-lab-seat-sm-eth-rx - Lab seat SM: ack on eth_rx of Master x9 (not only eth→UART inject). - Rollback: eg-2.2.2.51-lab-gameplay-seat-sm 2026-07-20 EG 2.2.2.51 parser_build=eg-2.2.2.51-lab-gameplay-seat-sm - Lab gameplay synth: full seat SM for all games (x0→x9→x1→0D). - Rollback: eg-2.2.2.50-lab-synth-env-preserve 2026-07-20 EG 2.2.2.50 parser_build=eg-2.2.2.50-lab-synth-env-preserve - Preserve CLI LAB_GAMEPLAY_* across source_fixture_env (synth was stuck off). - Rollback: eg-2.2.2.49-touch6-autoplay-golden 2026-07-20 EG 2.2.2.49 parser_build=eg-2.2.2.49-touch6-autoplay-golden - Touch6 golden refreshed from pos2 full-Dev autoplay (1-card byte8=0x04). - Rollback: eg-2.2.2.48-touch6-golden-replicate 2026-07-20 EG 2.2.2.48 parser_build=eg-2.2.2.48-touch6-golden-replicate - Touch6 synth: copper golden replicate (TID+seq+CRC only); template from pos2 2026-07-03 success packets.raw; allow TID 40CC (any 4-hex). - Rollback: eg-2.2.2.47-lab-gameplay-msg-fix 2026-07-20 EG 2.2.2.47 parser_build=eg-2.2.2.47-lab-gameplay-msg-fix - Fix lab_gameplay_synth_wager emit crash (duplicate msg= kwarg killed synth thread). - Rollback: eg-2.2.2.46-lab-gameplay-synth 2026-07-20 EG 2.2.2.46 parser_build=eg-2.2.2.46-lab-gameplay-synth - Lab-only synthetic T340+ seat: rotating multi-game UART→ETH wager forge (lab_gameplay_synth.py); bet tiers from Game_Bet_Tiers.xlsx; Dev Lite events. - Prod hard-refuse unless LAB_GAMEPLAY_SYNTH_ALLOW_PROD=1. - Rollback: eg-2.2.2.45-dev-light-outcome-eth 2026-07-20 EG 2.2.2.45 parser_build=eg-2.2.2.45-dev-light-outcome-eth - Dev Lite: gameplay eth_tx/eth_to_uart_done; peer_msgs on early_eth; peer_gameplay_eth_fwd; eth_tx outcome_retry on same-seq x9. - Python-only soak crumbs (Master 59 serve/retry visibility). - Rollback: eg-2.2.2.44-eth-thread-ipc-timeout 2026-07-19 pog-edge: empty EDGE_GAME_IF / "none" = tunnel-only (no eth1 default) - pog_edge_env.sh + prep_edge_uplink.sh no longer map empty GAME_IF → eth1. - Pos5 end-of-bank WiFi edge: EDGE_GAME_IF=none → ETH_PORTS=gretap only. - Rollback: restore ${EDGE_GAME_IF:-eth1} in pog_edge_env.sh. 2026-07-19 install (no EG tip bump): NM eth0/eth1 unmanaged via conf.d - install_nm_eth_unmanaged.sh → 10-ethergold-unmanaged.conf (both eth unmanaged). - enable_edge: 20-ethergold-edge.conf re-manages EDGE_UPLINK only. - Wired into commission_prod_boot.sh + update.sh; fan-out apply_nm_eth_unmanaged.ps1. - Fixes unprivileged nmcli in run_bridge_prod (was silently failing). - Rollback: remove conf.d files + systemctl reload NetworkManager. 2026-07-19 EG 2.2.2.44 parser_build=eg-2.2.2.44-eth-thread-ipc-timeout - eth→UART threads catch exceptions (keep hop alive); eth_rx_queued uses cached SLV-IN. - slv_in_active returns cache on IPC timeout (no TimeoutError kill). - BOM: pog422_ipc.h + pog422_uart_client.py → 2.2.2.44. - Rollback: eg-2.2.2.43-infer-retry-100ms 2026-07-19 EG 2.2.2.43 parser_build=eg-2.2.2.43-infer-retry-100ms - Infer after x9_retry_seen: 250ms → 100ms (miss-backstop only; harvest synth remains immediate). - Keep .42 orphan solo_x1 await gate. - BOM: pog422_ipc.h + pog422_uart_client.py → 2.2.2.43. - Rollback: eg-2.2.2.42-await-gate-infer-retry 2026-07-19 EG 2.2.2.42 parser_build=eg-2.2.2.42-await-gate-infer-retry - Gate uart_window solo_x1 synth to open await_x1/await_0d/logged_x1 (no orphan 0D). - Infer at 250ms when x9_retry_seen still missing local x1 (overnight T2 backstop). - BOM: pog422_ipc.h + pog422_uart_client.py → 2.2.2.42. - Rollback: eg-2.2.2.41-x1-harvest-ipc-queue 2026-07-18 EG 2.2.2.41 parser_build=eg-2.2.2.41-x1-harvest-ipc-queue - Class A: uart_client side-queues WINDOW/HS/DISCARD during inject()/RPC waits. - Class B: uartd re-arms post-x9 grace after flush_post_de. - Class D: mismatch peel finds embedded self-echo; peer x1 prefers local TID; mrt_x1_after_x9 msg+trigger; x1_harvest_path event. Infer kept. - Instrumentation: dttty_sink stderr tags; post_de_vs_hs_steal; DEV_LIGHT harvest events. - late_0d abandon clears _status_0d_synth_sent. - BOM: pog422_ipc.h + pog422_uart_client.py → 2.2.2.41. - Rollback: eg-2.2.2.40-narrow-tx-lock-fast-0d 2026-07-18 EG 2.2.2.40 parser_build=eg-2.2.2.40-narrow-tx-lock-fast-0d - Narrow _tx_lock to uartd.inject; peer/x1/synth after release (pos2 late-0D MRT). - Keep .39 x1-infer. Log synth_deferred_tx_lock + mrt_x9_inject_slow (>=100ms). - BOM: pog422_ipc.h + pog422_uart_client.py → 2.2.2.40. - Rollback: eg-2.2.2.39-x1-infer-no-x9-retry 2026-07-17 EG 2.2.2.39 parser_build=eg-2.2.2.39-x1-infer-no-x9-retry - Infer local x1 + synth close when Master does not retry same-seq x9 within 125ms after armed await_x1 (pos4 copper-had-81 / bridge-miss class). - Same-seq Master x9 sets retry_seen → no infer; 3s abandon still applies. - BOM: pog422_ipc.h + pog422_uart_client.py → 2.2.2.39. - Rollback: eg-2.2.2.38-tx-gate-cleanup 2026-07-17 EG 2.2.2.38 parser_build=eg-2.2.2.38-tx-gate-cleanup - Cap transaction_deferred at 64; abandon on overflow. - await_local_x1_timeout at 3s: clear await_x1, close local trunk, drop deferred. - Stale trunk rounds abandon at 8s (game_transaction_gate stick fix). - BOM: pog422_ipc.h + pog422_uart_client.py → 2.2.2.38. - Rollback: eg-2.2.2.37-relay-skip-log-throttle 2026-07-16 EG 2.2.2.37 parser_build=eg-2.2.2.37-relay-skip-log-throttle - Rate-limit status_0d_relay_synth_skip (local_same_game_active) — expected under multi-seat Jacks soak; guard unchanged. - BOM: pog422_ipc.h + pog422_uart_client.py → 2.2.2.37. - Rollback: eg-2.2.2.36-tx-defer-log-throttle 2026-07-16 EG 2.2.2.36 parser_build=eg-2.2.2.36-tx-defer-log-throttle - Rate-limit transaction_defer logs (game_transaction_gate flood during multi-seat soak). Queue/flush behavior unchanged. - BOM: pog422_ipc.h + pog422_uart_client.py → 2.2.2.36. - Rollback: eg-2.2.2.35-x1-synth-nonblocking 2026-07-16 EG 2.2.2.35 parser_build=eg-2.2.2.35-x1-synth-nonblocking - UART x1 synth must not block on _tx_lock during eth inject (pos5 .34 residual MRT: capture_tick starved ~900 ms). Queue/retry instead; tick heals await_0d. - Refresh hint from last_x9 when seq matches latest instead of superseded abandon. - BOM: pog422_ipc.h + pog422_uart_client.py → 2.2.2.35. - Rollback: eg-2.2.2.34-local-x1-synth-guard 2026-07-16 EG 2.2.2.34 parser_build=eg-2.2.2.34-local-x1-synth-guard - Local x1 is now enough to mark x1_pending and schedule synth 0D, including peer_x1_in_echo during eth→UART x9 inject; actual inject runs after tx lock. - Skip same-game foreign relay synth when local state exists (pos1/pos5 both Jacks or Better) so foreign x9/x1 cannot poison local close seq/hints. - Dev-light exposes synth triggers, local_round_superseded, same-game relay skips, and status_0d_synth_skip superseded_seq / await_passthrough. - BOM: pog422_ipc.h + pog422_uart_client.py → 2.2.2.34. - Rollback: eg-2.2.2.33-inject-tip-match 2026-07-16 EG 2.2.2.33 parser_build=eg-2.2.2.33-inject-tip-match - Policy: uartd/inject must match EG_VERSION tip (update.sh rebuild + session_start ok flags). Range lag left pos5 on 2.2.2.29 after Python spun to .32 twice. - BOM: pog422_ipc.h + pog422_uart_client.py → 2.2.2.33. XR driver still uses [EG_COMPONENT_MIN_VERSION, tip]. - Rollback: eg-2.2.2.32-await-0d-local-only 2026-07-16 EG 2.2.2.32 parser_build=eg-2.2.2.32-await-0d-local-only - Fix CGS Master-not-responding from 2.2.2.31: foreign solo/last-in-window x1 armed sticky await_0d; P0 gate then deferred ALL eth→UART (incl SCR/STOM) forever after status_0d_synth_skip no_x9. Now: arm await_0d / note_local_x1 only for local TID; abandon await_0d on synth-fail (no_x9 etc.) and on late_0d timeout; _local_close_pending ignores non-local keys; tick evicts stale foreign await_0d. New event: mrt_risk_await_0d_abandon. - Python-only; C stays 2.2.2.29. - Rollback: eg-2.2.2.31-await-0d-priority-dev-light 2026-07-16 EG 2.2.2.31 parser_build=eg-2.2.2.31-await-0d-priority-dev-light - Absolute P0 priority for local synth 0x0D: while await_0d / status_0d_synth queued, defer ALL other eth→UART (foreign TIDs, STOM/SCR, progressives) so synth close is never stuck behind A45B/relay inject (~700 ms overnight MRT). - Promote queued status_0d_synth to queue head; inject_deferred reason await_local_0d; flush deferred after close. - Dev-light logging tier (FIXTURE_DEV_LIGHT=1 / --dev-light): fault+MRT/synth events.jsonl only; no packets.raw/inject_echo. Soak default on run_bridge_jun11_good.sh. Skip debug log rotate on inject hot path. - Python-only; C stays 2.2.2.29. - Rollback: eg-2.2.2.30-early-x1-eth-forward 2026-07-15 EG 2.2.2.30 parser_build=eg-2.2.2.30-early-x1-eth-forward - Forward peer x1 ACK via eth BEFORE packet_complete hooks fire. Hooks trigger 0D synth inject (~55 ms blocking); the x51 eth_tx was stuck behind the 0D inject and arrived ~60 ms late — after the Master's ~125 ms retry timer. Now forwarded via forward_uart_origin_window immediately after inject echo return; hooks then run using finalize_handshake_window (unpatched, no duplicate eth send) so 0D synth still fires but no longer blocks the x1 from reaching the Master. - New log event: inject_peer_early_eth (echo_to_fwd_us tracks latency improvement). - Python-only fix; C stays 2.2.2.29. - Rollback: eg-2.2.2.29-post-de-all-x9 2026-07-15 EG 2.2.2.29 parser_build=eg-2.2.2.29-post-de-all-x9 - Extend post-DE drain to ALL x9 gameplay-response injects (low nibble == 0x09), not just 0x79. Position 1 MRT on Jacks or Better Poker (game 9400): bridge injected x59 with clean exact echo but rx_fifo_after=10 — terminal's x51 ACK (12 bytes) arrived during/after echo drain, post-DE flush skipped because frame[1]==0x59 was not covered. Without x51 capture → no 0D synth → terminal MRT. Now covers 0x59 (poker), 0x79 (spinjack/keno), 0x89 (slots), etc. - C change only (pog422_uartd.c); Python stays 2.2.2.29 (version bump only). - Rollback: eg-2.2.2.28-log-rotate-thread-safe 2026-07-15 EG 2.2.2.28 parser_build=eg-2.2.2.28-log-rotate-thread-safe - Fix _reopen_capture_files thread race: open new file handle before closing old. Two threads (uart_to_eth + eth_to_uart) share EventLog; GIL switch between close() and open() left self._events as a closed handle → ValueError crash after ~8 hours / 11 rotations. Open-before-close + retry guard in emit(). - Python-only fix; no C/uartd changes (stays 2.2.2.27). - Rollback: eg-2.2.2.27-flush-passive-pre-inject-postde-x79 2026-07-14 EG 2.2.2.27 parser_build=eg-2.2.2.27-flush-passive-pre-inject-postde-x79 - Fix D: Flush pending passive capture at inject start — cap_drain_uart + cap_end_window before cap_begin_window wipes cap_buf. Prevents 71 ACK bytes from being swallowed into the next inject's raw echo (wrong context) → no packet_complete → MRT. - Fix D2: Post-DE drain for 0x79 injects regardless of SLV-IN state. 25+15 ms poll catches fast 71 ACK with accurate inject-to-ACK timing. 0x70 polls still skip when SLV-IN is active (no 25 ms stall on the hot path). - Rollback: eg-2.2.2.26-zero-mrt-secondary-drain-peer-x1 2026-07-14 EG 2.2.2.26 parser_build=eg-2.2.2.26-zero-mrt-secondary-drain-peer-x1 - Fix C: Recognize x1 ACK in 54/prefix echo peer bytes — skip MRT arm immediately. - Fix B: uartd secondary drain (15 ms) after first echo EOP to catch fast-following x1. - Fix A: Enlarge IPC socket send buffer (256 KB) to prevent GPIO polling stalls. - Extend MRT_RISK_MISSING_X1_MS 400 ms → 3000 ms (diagnostic only, no processing impact). - Witness gap: analyze_fixture_timing.py flags bytes_discarded_inactive near MRT windows. - Rollback: eg-2.2.2.25-empty-echo-reinject-no-arm 2026-07-14 EG 2.2.2.25 parser_build=eg-2.2.2.25-empty-echo-reinject-no-arm - Empty local x9 echo: immediate reinject; skip miss-timer arm until bus RX. - Rollback: eg-2.2.2.24-mrt-x9-x1-inject-diag 2026-07-14 EG 2.2.2.24 parser_build=eg-2.2.2.24-mrt-x9-x1-inject-diag - Compact mrt_x9_inject_diag / mrt_x1_after_x9; enrich x9_no_local_x1. - Rollback: eg-2.2.2.23-mrt-arm-skip-closed-seq 2026-07-14 EG 2.2.2.23 parser_build=eg-2.2.2.23-mrt-arm-skip-closed-seq - Skip MRT await re-arm on dup eth x9 after close / same-seq await. - Rollback: eg-2.2.2.22-listen-ipc-desync-seq-wrap 2026-07-14 EG 2.2.2.22 parser_build=eg-2.2.2.22-listen-ipc-desync-seq-wrap - Listen: wait payload after IPC header; desync reconnect; auto-restart keep logs. - Bridge: seq wrap/reset (7→0) no longer false superseded_seq / late 0D. - Rollback: eg-2.2.2.21-local-seq-supersede-close 2026-07-14 EG 2.2.2.21 parser_build=eg-2.2.2.21-local-seq-supersede-close - Local TID: play_sequence >N (or missing) supersedes open close-wait / trunk gate. - Rollback: eg-2.2.2.20-listen-ipc-eagain-retry 2026-07-14 EG 2.2.2.20 parser_build=eg-2.2.2.20-listen-ipc-eagain-retry - Listen: finish IPC payload on EAGAIN mid-frame; retry loop instead of process exit. - Rollback: eg-2.2.2.19-post-de-await-local-x1 2026-07-14 EG 2.2.2.19 parser_build=eg-2.2.2.19-post-de-await-local-x1 - uartd post-DE 25ms + no mid-frame idle-exit; hold lone SOH for x1 glue (MRT fix). - Rollback: eg-2.2.2.18-await-x1-hold-rate-limit 2026-07-13 EG 2.2.2.18 parser_build=eg-2.2.2.18-await-x1-hold-rate-limit - Local-x9 inject hold 2s (not forever); rate-limit inject_deferred logs. - Rollback: eg-2.2.2.17-await-local-x1-defer-relay 2026-07-13 EG 2.2.2.17 parser_build=eg-2.2.2.17-await-local-x1-defer-relay - Defer non-local eth→UART while local x9 awaits x1 (no wall-clock expiry). - Rollback: eg-2.2.2.16-listen-uart-busy-diag 2026-07-13 EG 2.2.2.16 parser_build=eg-2.2.2.16-listen-uart-busy-diag - UART busy on listen: dump fuser + systemd fixture-prod/ethergold + stop hints. - Rollback: eg-2.2.2.15-fixture-pos-1-99-witness 2026-07-13 EG 2.2.2.15 parser_build=eg-2.2.2.15-fixture-pos-1-99-witness - FIXTURE_POS / --fixture-pos accept 1..99 (witness e.g. 51=pos5 copper listen). - Rollback: eg-2.2.2.14-clear-capture-wipe-dirs 2026-07-13 EG 2.2.2.14 parser_build=eg-2.2.2.14-clear-capture-wipe-dirs - CLEAR_CAPTURE=1 wipes data/ + logs/ contents (incl. rotates); listen --append after shell wipe. - Rollback: eg-2.2.2.13-mrt-means-late-0d-after-x1 2026-07-13 EG 2.2.2.13 parser_build=eg-2.2.2.13-mrt-means-late-0d-after-x1 - Logs: x9_no_local_x1 vs mrt_risk_late_0d_after_x1 (true MRT = x1 without timely 0x0D). - Rollback: eg-2.2.2.12-early-win-after-tx-lock 2026-07-13 EG 2.2.2.12 parser_build=eg-2.2.2.12-early-win-after-tx-lock - Early-win/fireworks after TX lock + after status_0d synth defer (MRT hygiene). - Rollback: eg-2.2.2.11-uartd-post-x9-grace-absorb 2026-07-13 EG 2.2.2.11 parser_build=eg-2.2.2.11-uartd-post-x9-grace-absorb - uartd: 25 ms post-inject FIFO grace hold/absorb for local x1 (Keno MRT / v16bf on uartd path). - Bridge: mrt_risk_missing_x1 / mrt_risk_late_0d; still 49→41→0D only (no early 0x0D). - Rollback: eg-2.2.2.10-component-version-range 2026-07-13 EG 2.2.2.10 parser_build=eg-2.2.2.10-component-version-range - Component OK = version in [EG_COMPONENT_MIN=2.2.2.7, MAX=tree tip]; not identical BOM. - update.sh / bridge probe use range; C/ipc MODULE_VERSION stays at last binary change (2.2.2.7). - Rollback: eg-2.2.2.9-keno-balls-offset-21-raw 2026-07-13 EG 2.2.2.9 parser_build=eg-2.2.2.9-keno-balls-offset-21-raw - Keno 0x49 balls fixed @21 raw 1-80; lab synth no longer wire-2@19. - Rollback: eg-2.2.2.8-phase2-toucheasy-keno 2026-07-13 EG 2.2.2.8 parser_build=eg-2.2.2.8-phase2-toucheasy-keno - Phase 2 TouchEasy Keno cash early win (sheet-10 paytable). - Rollback: eg-2.2.2.7-partial-0e-wire-len-598 2026-07-13 EG 2.2.2.7 parser_build=eg-2.2.2.7-partial-0e-wire-len-598 - Partial Master reply 0x0E: primary 598 (live HS); alt 397 (census mid-EOP). - Rollback: eg-2.2.2.6-partial-04-wire-len-32 2026-07-13 EG 2.2.2.6 parser_build=eg-2.2.2.6-partial-04-wire-len-32 - Partial Transfer 0x04@32 wire len (live pos4); was eth_tx_skip wire_len_crop. - Rollback: eg-2.2.2.5-mtc-inject-chunk-writesize 2026-07-13 EG 2.2.2.5 parser_build=eg-2.2.2.5-mtc-inject-chunk-writesize - INJECT_TX chunks wide OUT to writesize (MTC 09@1170 was ETIMEDOUT on one URB). - Rollback: eg-2.2.2.4-mtc-inject-frame-max-2048 2026-07-13 EG 2.2.2.4 parser_build=eg-2.2.2.4-mtc-inject-frame-max-2048 - INJECT_TX / inject lib: POG422_INJECT_FRAME_MAX 256→2048 (MTC 0x09@1170 was EINVAL). - Rollback: eg-2.2.2.3-mtc-09-wire-len-1170 2026-07-13 EG 2.2.2.3 parser_build=eg-2.2.2.3-mtc-09-wire-len-1170 - MTC Master reply 0x09: primary wire len 1170 (live HS 2026-07-13); alt 1094. - UARTD C pog422_wire_len*_ synced. Stops eth_tx_skip wire_len_crop on real 09. - Rollback: eg-2.2.2.2-peer-pkt-complete-hooks 2026-07-12 EG 2.2.2.2 parser_build=eg-2.2.2.2-peer-pkt-complete-hooks - Bridge: inject-window peer TxD → finalize_handshake_window (packet_complete + eth_tx) after TX lock so status_0d_synth can fire on glued x1. - Rollback: eg-2.2.2.1-inject-peer-uart-eth 2026-07-12 EG 2.2.2.1 parser_build=eg-2.2.2.1-inject-peer-uart-eth - Bridge: peel peer/Master TxD from inject_echo/post_de after eth→UART inject and UART→ETH both ports (same path as HS capture). Opcode-agnostic. - BOM stamp inject/uartd/driver → 2.2.2.1 (no C path change). - Rollback: eg-2.2.1.17-scr-transaction-path 2026-07-12 EG 2.2.1.17 parser_build=eg-2.2.1.17-scr-transaction-path - Bridge: 0x0B SCR enroll reply bypasses game_transaction_gate + post_x9 grace defer; queue head-of-line priority (extends v16bo STOM comm bypass beyond 01/02/03). - inject_echo prefix-match: glued SCR+0B echo scores match=True (match_kind=prefix). - BOM stamp: inject/uartd/driver MODULE_VERSION → 2.2.1.17 (no C path change). - Rollback: eg-2.2.1.16-wide-rx-9bit-flag0 2026-07-12 EG 2.2.1.16 parser_build=eg-2.2.1.16-wide-rx-9bit-flag0 - UARTD CS5/9-bit so wide RX flag bit0 is 9th data bit (was 8-bit wide parity-error). - Rollback: eg-2.2.1.15-wide-rx-tee 2026-07-12 EG 2.2.1.15 parser_build=eg-2.2.1.15-wide-rx-tee - Always-on wide RX tee: driver parallel ring preserves data+RAMCTL; HS cached in flag bit 0x10; uartd logs data/wide_rx.bin. - Rollback: eg-2.2.1.14-slv-in-sample-restore 2026-07-12 EG 2.2.1.14 parser_build=eg-2.2.1.14-slv-in-sample-restore - Restore cheap SLV-IN samples during DE (fix false slv_hs_misalign from 2.2.1.13). - Rollback: eg-2.2.1.13-ioctl-de-defer 2026-07-12 EG 2.2.1.13 parser_build=eg-2.2.1.13-ioctl-de-defer - MANUAL_DE: GPIO7 assert inside INJECT_TX after mutex; skip FIFO get_reg on DE-high path. - Rollback: eg-2.2.1.12-hybrid-de-deadline 2026-07-12 EG 2.2.1.12 parser_build=eg-2.2.1.12-hybrid-de-deadline - Hybrid DE: release at min(TEMT, air+400us margin); reason=deadline|temt; pre_tx=0. - Rollback: eg-2.2.1.11-fall-stamp-clamp 2026-07-12 EG 2.2.1.11 parser_build=eg-2.2.1.11-fall-stamp-clamp - Clamp fall-drain byte stamps to HS fall; note de_hold_us~25ms TEMT lag vs post_hold=0. - Rollback: eg-2.2.1.10-hs-porch-stream 2026-07-12 EG 2.2.1.10 parser_build=eg-2.2.1.10-hs-porch-stream - HW_DEBUG UARTD streams during HS; hs_porch front/byte/back/hs_width µs fields. - Rollback: eg-2.2.1.9-listen-session-start-fix 2026-07-12 EG 2.2.1.9 parser_build=eg-2.2.1.9-listen-session-start-fix - Fix listen session_start duplicate uartd_version TypeError; uartd stop SIGKILL after TERM. - Rollback: eg-2.2.1.8-uartd-listen 2026-07-12 EG 2.2.1.8 parser_build=eg-2.2.1.8-uartd-listen - UARTD listen witness (inject=0); HW_DEBUG passthrough on uartd make; same C capture as bridge. - Rollback: eg-2.2.1.7-custom-driver-en-act-txdone 2026-07-11 EG 2.2.1.7 parser_build=eg-2.2.1.7-custom-driver-en-act-txdone - Fix CUSTOM_DRIVER bit0 on B1422 map (was skipped); EN_ACT+FIFO TX-done without fake LSR. - Rollback: eg-2.2.1.6-hw-debug-compile 2026-07-11 EG 2.2.1.6 parser_build=eg-2.2.1.6-hw-debug-compile - Compile-out POG422_HW_DEBUG rings (uartd/inject/driver); GPIO5 edges via USB Table-8 INT only. - Rollback: EG 2.2.1.5 / eg-2.2.1.5-no-pre-tx. 2026-07-11 EG 2.2.1.5 parser_build=eg-2.2.1.5-no-pre-tx - Kill PRE_TX settle (was 3000 µs uartd default): C ignores pre_tx_us; bridge forces 0. - Rollback: EG 2.2.1.4 / eg-2.2.1.4-no-post-hold. 2026-07-11 EG 2.2.1.4 parser_build=eg-2.2.1.4-no-post-hold - Remove C post-DE sleep_us(200); force POST_TX/post_air defaults to 0 (TEMT path). - Rollback: EG 2.2.1.3 / eg-2.2.1.3-wire-len-c-sync. 2026-07-11 EG 2.2.1.3 parser_build=eg-2.2.1.3-wire-len-c-sync - uartd pog422_wire_lens synced to Python COMMAND_WIRE_LEN(+ALTS); fix C 0x20 41→37. - install_pi.sh EXPECTED_VER aligned to 2.2.1.3 (was stuck at 2.2.1.1 → BOM never reloadable). - Rollback: EG 2.2.1.2 / eg-2.2.1.2-packets-raw-full-hs. 2026-07-11 EG 2.2.1.2 parser_build=eg-2.2.1.2-packets-raw-full-hs - packets.raw always stores the full HS copper window (success or window_skip). - Rollback: EG 2.2.1.1 / eg-2.2.1.1-temt-gpio-mode-match. 2026-07-11 EG 2.2.1.1 parser_build=eg-2.2.1.1-temt-gpio-mode-match - Inject hat_init was writing GPIO_MODE 0x0300 (stomped driver 0x030B GPIO5 TX-sense). - Align inject MANUAL_SLV to 0x030B so USB interrupt IN TEMT can fire; shortens DE hold. - Rollback: EG 2.2.1.0 / eg-2.2.1.0-temt-usb-int-tx-sense. 2026-07-11 EG 2.2.1.0 parser_build=eg-2.2.1.0-temt-usb-int-tx-sense - WAIT_TX_EMPTY via USB interrupt IN (GPIO5 RS485_EN_ACT sense); GPIO7 manual DE. - Rollback: EG 2.2.0.0 / eg-2.2.0.0-temt-de-rx-harvest. 2026-07-11 EG 2.2.0.0 parser_build=eg-2.2.0.0-temt-de-rx-harvest - Product BOM EG_VERSION=2.2.0.0 (bridge/uartd/inject/driver MODULE_VERSION). - MANUAL_DE skips kernel air usleep; WAIT_TX_EMPTY synthesizes TEMT (LSR bit6). - C DE release on TEMT only; poll_fn harvest during DE-high; POST_DE_RX 5 ms. - Forensics: de_hold_us, lsr, de_release_reason. - Rollback: EG 2.1.0.0 / eg-2.1.0.0-uart-c-spine-inject-gate. 2026-07-11 EG 2.1.0.0 parser_build=eg-2.1.0.0-uart-c-spine-inject-gate - Product BOM EG_VERSION=2.1.0.0 (bridge/uartd/inject/driver MODULE_VERSION). - Mode C spine locked: UARTD=1+INJECT=1 defaults; MARK/SPACE Python TX hard-fail. - C INJECT require_idle + idle_wait_ms; post-x9 via arm_post_x9_inject_grace on INJECT_DONE. - CHANNEL=both = two uartd instances (no pyserial dual). - Rollback: last pre-EG2 tip v16cb + uartd 1.0.60 + driver 1W. 2026-07-11 v16cb parser_build=jun11-good-gpio7-wire-len-parser-v16cb-raw-bus-framing - Keep driver 1W TX_FIFO errno encode. Focus: raw POG422 bus bytes after inject. - uartd/inject 1.0.60: inject_raw_capture — no MARK-strip during inject SW window (preserve leading SPACE / chopped SOH); post-DE RX poll 15 ms. - inject_echo: bus_rx_raw + soh_ok/eop_ok/framing_ok/chop_hint (echo or post_de); wide_mark_only_first on TX wide rebuild (MARK flag only on first data byte). - packet_complete / window_skip: first/last byte + soh_ok/eop_ok hex_prefix/suffix. - Hypothesis under test: DE/HS too late (lose 0x05) or too early (lose 0x0D). - Rollback: …v16ca + uartd 1.0.59. 2026-07-11 v16ca parser_build=jun11-good-gpio7-wire-len-parser-v16ca-tx-fifo-errno-ch - Driver 1W: on TX_FIFO get_reg fail, encode 0xE0|ch|errno (not opaque 0xFFFFFFFF); retry UART block 2; ratelimited dmesg. 1V confirmed loaded but samples still failed. - Rollback: …v16bz + driver 1V. 2026-07-11 v16bz parser_build=jun11-good-gpio7-wire-len-parser-v16bz-tx-fifo-dma-buf - Driver 1V: TX_FIFO sample uses kmalloc(2) for usb_control_msg (same as GET_REG ioctl). 1U still returned 0xFFFFFFFF with matched loaded/installed — stack buffer fails DMA on Pi. - Expect inject_echo tx_fifo_after_bulk to be a real 0..1023 count (often >0 right after bulk). - Rollback: FIXTURE_PARSER_BUILD …v16by + driver 1U. 2026-07-11 v16by parser_build=jun11-good-gpio7-wire-len-parser-v16by-driver-loaded-vs-installed - session_start: driver_version_loaded (sysfs) vs driver_version_installed (modinfo); driver_version_mismatch=true + component_versions_ok=false when disk != RAM. - install_pi.sh: stop using modinfo to decide "already loaded — skip reload" (that left 1T running after 1U install). Use /sys/module/.../version; FAIL if still stale. - verify_driver.sh: FAIL on loaded!=installed; print both probes explicitly. - Rollback: FIXTURE_PARSER_BUILD …v16bx (driver still 1U). 2026-07-11 v16bx parser_build=jun11-good-gpio7-wire-len-parser-v16bx-post-de-rx-inject-overlap - Driver 1U: TX_FIFO via get_reg_ext(ep-4) UART block (ep6→2), not get_reg *(ep-4)*2. Fixes ttyXRUSB1 kernel samples stuck at 0xFFFFFFFF under confirmed 1T. - uartd/inject 1.0.59: after DE off, poll RX ~5 ms → IPC POST_DE_RX (separate from inject-window echo). Logged as post_de_rx_len / post_de_rx on inject_echo. - Python: tag window_skip / packet_complete / hs_window_raw / hs_inactive that overlap a recent eth→UART inject (inject_overlap*, hex_prefix already on window_skip). - Rollback: FIXTURE_PARSER_BUILD …v16bw + driver 1T + uartd 1.0.58. 2026-07-11 v16bw parser_build=jun11-good-gpio7-wire-len-parser-v16bw-component-versions-log - session_start always logs loaded stack versions (Dropbox-visible, no SSH ask): driver_version (+ expected/ok), uartd_version(_client/_daemon), inject_version, component_versions_ok. Bridge prints WARN on mismatch at startup. - uartd/inject 1.0.58: IPC GET_VERSION / VERSION so daemon reports live strings. - Driver still 1T (no ioctl change). Rebuild inject-shim; no driver rebuild required. - Rollback: …v16bv + uartd 1.0.57. 2026-07-11 v16bv parser_build=jun11-good-gpio7-wire-len-parser-v16bv-copper-proxy-1t - On-board copper proxy (no scope): inject phase timeline GPIO_STAT + TX/RX FIFO (pre_de → de_on → pre_done → post_ioctl → pre_off → post_off) into inject_echo as copper[] + copper_tx_fifo_peak / copper_gpio7_high / copper_gpio1_high. - Driver 1T: fix TX_FIFO get_reg success check (usb_control_msg returns 2, not 0) — 1S always reported tx_fifo_*=0xFFFFFFFF. Same ioctl size as 1S. - uartd/inject 1.0.57 — IPC INJECT_COPPER (14). Rebuild inject-shim + reload driver 1T. - Rollback: …v16bu + driver 1S + uartd 1.0.56. 2026-07-11 v16bu parser_build=jun11-good-gpio7-wire-len-parser-v16bu-eth-marshal-tx-fifo - ETH→UART marshal integrity: eth_rx_queued + uart_marshal_pull carry marshal_crc32 / head/tail; inject_echo includes same fingerprint. Proves queue buffer == TX buffer. - Driver 1S: INJECT_TX returns tx_fifo_before / tx_fifo_after_bulk / tx_fifo_after_drain + usb_actual (sample after USB bulk, before wire wait — expect FIFO not empty). - uartd/inject 1.0.56: forensics IPC carries TX_FIFO samples into inject_echo.jsonl (tx_fifo_not_empty_after_bulk bool). Rebuild driver + inject-shim together (ioctl size). - Note: TX_FIFO_COUNT was unreliable as a DE-hold gate (1K); here it is diagnostic only. - Rollback: FIXTURE_PARSER_BUILD …v16bt + driver 1R + uartd 1.0.55. 2026-07-10 v16bt parser_build=jun11-good-gpio7-wire-len-parser-v16bt-uartd-inject-pre-tx-3000 - When POG422_UARTD_INJECT=1: default PRE_TX_US=3000 POST_TX_US=1000 (xr README 1N/1O manual-GPIO7 settle band). Prior bench SCR runs used 500/300 — Master BSY+RCV INT, no DATA GOOD, empty bus echo. - inject_echo.jsonl: mark forensics wide as wide_reconstructed=true (rebuild of sent, not a copper dump). - No uartd C rebuild required. Master: UARTD=1 UARTD_INJECT=1 (same as last run). - Rollback: FIXTURE_PARSER_BUILD …v16bs-inject-echo-forensics + PRE_TX 500/POST 300. 2026-07-10 v16bs parser_build=jun11-good-gpio7-wire-len-parser-v16bs-inject-echo-forensics - inject_echo.jsonl: include uartd inject forensics (wide_is_wire, wide_len, wide hex, rx_fifo_before/after, drain_wait_us, driver_errno, inject_method) beside sent/echo. - No uartd C change (forensics IPC already present). Python inject rows omit forensics. - Rollback: FIXTURE_PARSER_BUILD …v16br-inject-echo-log. 2026-07-10 v16br parser_build=jun11-good-gpio7-wire-len-parser-v16br-inject-echo-log - Log bus TX echo after eth→UART inject to data/inject_echo.jsonl (sent vs echo hex, match bool). Python path reads ser.in_waiting after set_rx; uartd path forwards inject-window RX via new IPC INJECT_ECHO (was drained and discarded). - uartd 1.0.55 — rebuild inject-shim on bridge Pis (Master especially). - Purpose: see what copper actually looped back vs what we intended to send (SCR DATA GOOD debug) — not a timing knob change. - Rollback: FIXTURE_PARSER_BUILD …v16bq-python-inject-manual-gpio + uartd 1.0.54. 2026-07-10 v16bq parser_build=jun11-good-gpio7-wire-len-parser-v16bq-python-inject-manual-gpio - HandshakeMonitor: stop writing GPIO_MODE=0 on every open/python inject; restore manual SLV MODE 0x0300 + DIR 0xA8 (match pog422_inject.c / driver 1N). - Bug: with POG422_UARTD_INJECT=0, python set_tx toggled HS but wiped manual DE — Master Local Net Test saw HS-only, no SCR payload (eth_to_uart_done still logged). - UARTD inject path was fine (C holds 0x0300); python/suspend path was not. - Rollback: FIXTURE_PARSER_BUILD …v16bp-progressives-http + MODE=0/DIR=0x80. 2026-07-10 v16bp parser_build=jun11-good-gpio7-wire-len-parser-v16bp-progressives-http - EtherGold ethergold-http.service: progressives.csv + progressives-sync.json + floor-games.json on port 31234 (stdlib HTTP; P3 GAMESTATS cache). - install_ethergold_http.sh + p3_floor_games_refresh.py; DyzineFrame skips Bottle when ETHERGOLD_HTTP_EXTERNAL=1. - Parser wire table unchanged from v16bo; build string bump for field deploy track. - Rollback: v16bo parser_build string. 2026-07-09 v16bo parser_build=jun11-good-gpio7-wire-len-parser-v16bo-stom-comm-inject-bypass - Bridge: STOM comm requests (0x01 config / 0x02 partial / 0x03 SCR) bypass game_transaction_gate defer and queue with inject priority on Master Pi. - Fixes relayed config/partial reaching pos3 ETH (eth_rx_queued) but never injecting to Master POG422 copper (Local Net Test SLV_REC blank). - Prod trace: eth_to_uart_done + inject_deferred for opcodes 01/02/03/09/0A/0B. - STOM comm also bypasses post_x9_grace_machine_relay defer on Master inject. - Rollback: v16bn parser_build string. 2026-07-09 v16bn parser_build=jun11-good-gpio7-wire-len-parser-v16bn-config-transfer-trace - Prod trace: packet_complete + eth_tx/eth_rx_queued for config opcodes 01/02/09/0A/0B. - Prod trace: window_skip when window_bytes is 32/82/1094 or >= 500 (catch truncated 0x09). - v16bm wire-len table unchanged; use for next Transfer Master Config attempt. - Rollback: v16bm parser_build string. 2026-07-09 v16bm parser_build=jun11-good-gpio7-wire-len-parser-v16bm-config-chain-prod-log - Prod log eth_rx_skip/eth_tx_skip wire_len_crop for config opcodes (01/02/09/0A/0B). - v16bl wire-len table unchanged; deploy required on every daisy-chain hop (not office only). - Rollback: v16bl parser_build string. 2026-07-09 v16bl parser_build=jun11-good-gpio7-wire-len-parser-v16bl-master-config-selftest - v16bk self-test vector for 0x01 config req was 33 B (line break duplicated a 00) — install.sh / run_bridge_prod.sh refused to start bridge (supervisor crash loop). - Corrected to exact 32 B office capture; wire-len table unchanged from v16bk. - Rollback: v16bk parser_build string. 2026-07-09 v16bk parser_build=jun11-good-gpio7-wire-len-parser-v16bk-master-config-wire-len - Transfer Master Config: slave POG_CONF uses 0x01 @ 32 B (comlengs[1]); parser only had 0x01 @ 17 B (poker grant) → window_skip split_empty, frame never relayed. - Master config response 0x09 @ 1094 B (comlengs[9]) added to COMMAND_WIRE_LEN. - Self-test: office fixture capture 05,01,…,0D @ 32 B + synthetic 0x09 @ 1094 B. - Rollback: v16bj parser_build string. 2026-07-09 v16bj parser_build=jun11-good-gpio7-wire-len-parser-v16bj-fixture-status-led - fixture_status_led.sh: green ACT LED heartbeat while fixture-prod supervisor runs; mmc0 restore on supervisor stop. FIXTURE_STATUS_LED=1 in fixture-pos.env (0=off). - install_edge_sudoers.sh → /etc/sudoers.d/ethergold-fixture (edge + LED NOPASSWD). - Rollback: v16bi parser_build string. 2026-07-08 v16bi parser_build=jun11-good-gpio7-wire-len-parser-v16bi-pog-edge-field - Promoted pog-edge/ into flat dev/ for bank-to-bank tunnel endpoints. - EDGE_MODE=0|1 in /etc/fixture/edge.env; enable_edge.sh / disable_edge.sh. - EDGE_UPLINK=eth0|wlan0 (WG transport); EDGE_GAME_IF=eth1 or empty (gretap-only). - run_bridge_edge_prod.sh + supervisor branch; install_edge_sudoers.sh. - prep_edge_uplink.sh: DHCP once on uplink; game ports unmanaged (no DHCP). - run_bridge_prod.sh: nmcli managed no on eth0+eth1 when EDGE_MODE=0. - FIELD_EDGE.txt documents bank POG422 + single edge adapter topology. - Parser wire logic unchanged from v16bh. - Rollback: v16bh parser_build string. 2026-07-08 v16bh parser_build=jun11-good-gpio7-wire-len-parser-v16bh-prod-posfree - Production stack made POSITION-FREE + HEADLESS (30-hop daisy-chain adapters): * run_bridge_prod.sh / fixture_supervisor.py / install_prod_service.sh / commission_prod_boot.sh no longer require FIXTURE_POS. It defaults to an internal 1 (timing/bookkeeping only); field identity = OS hostname (topbox_) via --pi-label. Internal guard widened 1..4 -> 1..99. * commission_prod_boot.sh disables DyzineFrame autostart by default (DISABLE_DYZINEFRAME=0 to keep it) for display-less adapters. * build_prod.sh (new): builds self-contained ~/EtherGold/prod from dev/ (strips dev/test/lab launchers, sessions, docs, caches). dev/ deletable. * No log collection: prod service installs no rclone sync. - Parser wire logic unchanged from v16bg; bump reflects Pi runtime/boot behavior. - Rollback: v16bg parser_build string. 2026-07-08 v16bg parser_build=jun11-good-gpio7-wire-len-parser-v16bg-flat-dev-layout - Flat EtherGold/dev runtime (no jun11-good/ subfolder, no mirror to bridge/). - prod_log_manager import path: same dir as core (was parent/jun11-prod). - Rollback: v16bf parser_build string. 2026-07-07 v16be parser_build=jun11-good-gpio7-wire-len-parser-v16be-keno-ball-offset-19 2026-07-07 v16bf parser_build=jun11-good-gpio7-wire-len-parser-v16bf-grace-x1-fragment - post_x9_inject_grace_hold: buffer lone SOH during local post-x9 grace; prepend to next FIFO read before absorb — v16be Keno pos2 MRT had 0x41 ack split across two grace_skip reads (count=1 first_byte=05, then count=11 first_byte=41) so status_0d_synth never fired (missing synthed 0x0D). - Rollback: v16be parser_build string. - KENO_RESULT_BALL_OFFSET 17 → 19: balls live @ bytes 19–38; byte 17 = bank counter. - v16af/v16bd @ 17 clobbered counter + left native tail @ 37–38 → GDE (dup ball 20). - Keep keno_wire_byte_for_display (display = wire + 2); v16bd x49 dedupe unchanged. - Rollback: v16bd parser_build + KENO_RESULT_BALL_OFFSET=17. 2026-07-07 v16bd parser_build=jun11-good-gpio7-wire-len-parser-v16bd-keno-lab-x49-dedupe - Lab Keno: pos3 Master suppresses duplicate native 0x49 UART→ETH synth fan-out (lab_keno_jpot_skip reason=duplicate_master_x49). - Relay: x9_eth_inject_dedupe applies to local-slave Keno 0x49 (Game Data Error fix). - Rollback: v16bc parser_build string + revert bridge dedupe blocks. 2026-07-04 v16ax parser_build=jun11-good-gpio7-wire-len-parser-v16ax-superpick-zero-draw - SuperPick lab draw: all zeros (000000) not 0–5; default game id 9508 (floor bench). - Rollback: v16aw parser_build string + SUPERPICK_LAB_DEFAULT_BALLS 0..5 + game 9507. 2026-07-03 v16aw parser_build=jun11-good-gpio7-wire-len-parser-v16aw-superpick-first5-or-6 - SuperPick jpot: first_hits>=5 (FIRST 5 or ALL 6), not legacy MASTER k==5 (excluded 6/6). - Rollback: v16av parser_build string + restore superpick_master_jpot_k path. 2026-07-03 v16av parser_build=jun11-good-gpio7-wire-len-parser-v16av-superpick-jpot-synth - Lab SuperPick 0x69 synth: forced balls 0–5 @ byte 21–26, jpot from 0x60 wager (MASTER k==5). - Hook mirrors Touch 6 lab path on pos3 Master UART egress. - Rollback: v16au parser_build string + remove superpick lab symbols. 2026-07-03 v16au parser_build=jun11-good-gpio7-wire-len-parser-v16au-touch6-ball-offset-21 - TOUCH6_RESULT_BALL_OFFSET 19 → 21 on 30-byte 0x29 (T340 bench; same +2 class as Keno 17). - v16at wrote forced 1–6 @ 19–24; bytes 21–26 stayed native → UI 3,4,5,6,24,2, 5/6 $150 + false jpot. - Rollback: v16at parser_build string + TOUCH6_RESULT_BALL_OFFSET=19. 2026-07-03 v16aq parser_build=jun11-good-gpio7-wire-len-parser-v16aq-spinjack-72-7a-wire-len - COMMAND_WIRE_LEN: add 0x7A: 24 + alt 20 (parallel to poker 0x5A family; +0x20 opcode map). - Preempt return-path wire_len_crop on Master grant relay (pos2 eth → slave UART). - Natural 0x7A still unwitnessed on bench — lengths inferred, not copper-verified. - Rollback: v16ap parser_build string + remove 0x7A entry. 2026-07-03 v16aq-bench SpinJack jackpot success (archive 2026-07-03_2000-UTC_spinjack-jackpot-success-v16aq) - Copper confirms 0x7A grant @ 24 B; 0x72/0x7A full round-trip OK on pos2/pos3 loop. - progwin BE32 0x000193A5 on grant; skill_grant_inject + status_0d close counter 129. 2026-07-03 v16ap parser_build=jun11-good-gpio7-wire-len-parser-v16ap-spinjack-72-wire-len - COMMAND_WIRE_LEN: add 0x72: 32 (SpinJack / blackjack skill claim — bench 2026-07-03). - Fixes pos2 eth_tx_skip wire_len_crop on every 0x72 → Master never saw claim → "Contacting Game Server" hang (same class as poker 0x52 pre-v16ag). - 0x7A grant length still TBD (no natural capture — claim never reached Master). - Rollback: v16ao parser_build string + remove 0x72 entry. 2026-07-02 v16an parser_build=jun11-good-gpio7-wire-len-parser-v16an-poker-back-to-back-skill-once - Fix back-to-back jackpot deal MRT: drop global-counter check from post_skill_x1_echo suppress (was false-positive on next hand's deal 0x51 after skill close). - One skill 0x0D synth per skill round (skill_grant_burst_dup on 2nd/3rd 0x5A retry). - Bench 2026-07-02 repeat: 4/4 skill OK, 2/6 deal MRT on attempts #3/#5. Rollback: v16am. 2026-07-02 v16am parser_build=jun11-good-gpio7-wire-len-parser-v16am-poker-skill-0d-local-tid - Fix v16al skill 0x0D synth never armed: 0x5A grant carries local TID (38D7) so _remember_gameplay_round_eth_inject hit local-terminal early return (not x9). - Arm skill_grant_inject before local/relay split; extend post-skill x1 suppress when global close counter already past deal x9 byte 17. - Bench v16al: build correct but zero skill_grant_inject events — same MRT as v16ak. - Rollback: v16al parser_build string. 2026-07-02 v16al parser_build=jun11-good-gpio7-wire-len-parser-v16al-poker-skill-0d-synth - Bridge: dual status_0d_synth — deal path (x1 → 0x0D from x9 byte 17) unchanged; skill path (0x5A/0x7A grant eth inject → synth 0x0D counter global+1 immediately). - Suppress post-grant spurious x1 relay echo (v16ak injected stale counter 181, blocked native 182). - Bench v16ak: grant OK; skill MRT fail on close. Rollback: v16ak parser_build string. 2026-07-02 v16ak parser_build=jun11-good-gpio7-wire-len-parser-v16ak-poker-5a-24-grant - Fix 0x5A: 24 (was 20 TBD). Bench v16aj: 34× copper grants, 36× window_skip opcode_guess=5A wire_len_short_by=-4; zero eth_tx 5A to slave. - Alt 0x5A: 20 kept for legacy doc. - Rollback: v16aj parser_build string. 2026-07-02 v16aj parser_build=jun11-good-gpio7-wire-len-parser-v16aj-poker-skill-01-grant - Add 0x01: 17 (Master draw-poker skill reply on machine SOH path after 0x52 claim). - Bench 2026-07-02 v16ai: pos3 packet_complete msg=01 len=17 ×38 then eth_tx_skip wire_len_crop. - Rollback: v16ai parser_build string. 2026-07-02 v16ai parser_build=jun11-good-gpio7-wire-len-parser-v16ai-window-skip-raw - window_skip (split_empty / no_05_0D): log hs_window_raw hex, opcode_guess (byte after SOH), wire_len_expected / wire_len_short_by; mirror hex line to packets.raw. - Bench: decode 24 B HS fragments during poker skill wait without scope. - Rollback: v16ah parser_build string. 2026-07-02 v16ah parser_build=jun11-good-gpio7-wire-len-parser-v16ah-lab-poker-royal-uart-egress - Bridge: close game_transaction_gate on native Master UART 0x0D (tid=null → match game). - Bench 2026-07-02 v16ag: pos3 deferred every 0x52 and 0x03 SCR after deal — Master silent. - Rollback: v16ag parser_build string. 2026-07-02 v16ag parser_build=jun11-good-gpio7-wire-len-parser-v16ag-lab-poker-royal-uart-egress - Add 0x52: 32 (Draw Poker skill jpot claim, slave → master). - Bench 2026-07-02: pos2 dropped every 0x52 with wire_len_crop → T340 "Contacting Game Server" on STAND. - Rollback: v16af parser_build string. 2026-06-15 v16ac parser_build=jun11-good-gpio7-wire-len-parser-v16ac-progressive-0a-csv - Master 0x0A (tid=0000, 82 B wire): decode 16×uint32 LE @ byte 15 → progressives.csv (DyzineFrame format: game_id,pennies,updated_utc; game 15 forced 0; atomic temp+rename). - Hook on ETH ingress + UART packet_complete; content dedupe (relay/ETH+UART duplicates). - Path: $ETHERGOLD_PROGRESSIVES_CSV or $ETHERGOLD_ROOT/progressives.csv (default /home/topbox/EtherGold/). - Rollback: v16ab parser_build string. 2026-06-25 v16ab parser_build=jun11-good-gpio7-wire-len-parser-v16ab-local-tid-always-pass-transaction-gate - eth_rx Queue B: local-terminal TID traffic never transaction_defer (game_transaction_gate); Master x79 poll retries inject immediately after handoff miss (with v16aa no dedupe). - Progressive 0x0A (tid 0000) still latest-wins defer during open rounds. - Rollback: v16aa parser_build string. 2026-06-25 v16aa parser_build=jun11-good-gpio7-wire-len-parser-v16aa-local-tid-x9-never-dedupe-master-retry - eth_rx: local-TID x9 outcomes (Master poll retries) never x9_eth_inject_dedupe skip; relay/other TID duplicate 79 suppress unchanged (500 ms). - Fixes pos2 MRT when first x79 inject handoff misses x71 and Master fast-retries. - Keeps v16z transaction gate + 0A latest-wins defer. - Rollback: v16z parser_build string. 2026-06-25 v16z parser_build=jun11-good-gpio7-wire-len-parser-v16z-game-transaction-gate-0a-latest - Game transaction gate (Queue B): from trunk x0 until 0D close, defer non-leg eth→UART injects (transaction_defer reason=game_transaction_gate); eth→eth relay unchanged. - Progressive 0x0A during any open round: latest-wins stash (transaction_defer reason=0a_latest_wins); single flush after last round closes (transaction_defer_flush). - Per-TID trunk round: first x9 inject allowed; duplicate/relay x9 deferred until x1/0D; closes on status_0d_synth_done / eth_to_uart_done 0D. - Keeps v16y grace relay defer + handoff x1 guard + v16x OIS defer. - Rollback: v16y parser_build string. 2026-06-25 v16y parser_build=jun11-good-gpio7-wire-len-parser-v16y-grace-relay-handoff-dedupe - Machine channel: defer non-local eth→UART injects during local-TID post-x9 grace (inject_deferred reason=post_x9_grace_machine_relay); keeps v16x OIS defer. - Handoff capture guard: local-origin post_x9_inject_handoff keeps solo gameplay x1 only (post_x9_handoff_capture_reject/filter); rejects 0D/0A glue windows. - Skip relay status_0d_x9_inject_store when local wager awaits local x9 (status_0d_x9_inject_store_skip reason=local_wager_in_flight); relay no longer seeds x9_eth_inject_dedupe timestamps. - Rollback: v16x parser_build string. 2026-06-25 v16x parser_build=jun11-good-gpio7-wire-len-parser-v16x-defer-ois-during-local-grace - Dual bridge: defer OIS eth→UART inject while machine post-x9 local-TID grace active; queued OIS forwards after grace (inject_deferred reason=post_x9_grace_ois). v16w MRT: OIS 0x01 inject blocked machine capture_tick grace poll; x71 discarded 35 ms after x79 (12 bytes first_byte=05). - Keeps v16w POST_X9_INJECT_LOCAL_TID_FIFO_GRACE_MS=25. - Rollback: v16w parser_build string. 2026-06-25 v16w parser_build=jun11-good-gpio7-wire-len-parser-v16w-local-tid-grace-25ms - POST_X9_INJECT_LOCAL_TID_FIFO_GRACE_MS=25 (local TID x9 inject, SLV-IN low only). Relay / SLV-live handoff stays 15 ms — v16v pos4 SpinJack MRT after soak: x71 missing when grace expired before late ack under UART contention. - Rollback: v16v parser_build string. 2026-06-25 v16v parser_build=jun11-good-gpio7-wire-len-parser-v16v-grace-all-x1-ack - post_x9_inject_grace_absorb: accept any gameplay x1 ack (0x21/31/41/51/61/71/81) via is_gameplay_ack — v16u only absorbed 0x71 (blackjack), discarding 0x51 poker acks (pos2 Shamrock 7's Poker MRT: grace_skip count=12 first_byte=05). - Rollback: v16u parser_build string. 2026-06-25 v16u parser_build=jun11-good-gpio7-wire-len-parser-v16u-local-x9-grace-defer-synth - Local-origin x9 inject only: arm 15 ms FIFO grace when SLV-IN low after inject (post_x9_inject_grace_arm) so late x1 ack is absorbed — all local wager games (0x70/0x79/0x71 blackjack, 0x50/0x59/0x51 poker, etc.), not game-ID specific. - Relay x9 inject unchanged (echo drain, no silent grace) — avoids v16t duplicate 0D. - Defer status-0D synth until after send_frame releases _tx_lock — fixes relay_x1_inject deadlock (synth_built with no GPIO / no eth_to_uart_done / Contacting Game Server). - Rollback: v16s parser_build string. 2026-06-25 v16t parser_build=jun11-good-gpio7-wire-len-parser-v16t-post-x9-grace-silent-x1 (REVERTED) - Arm 15 ms FIFO grace when SLV-IN low after x9 inject caused Contacting Game Server / inject-queue stall (pos4 queue_depth 36+, no eth_to_uart_done after relay x51). - grace_absorb on SpinJack fixed round-6 MRT but duplicate 0D passthrough+inject followed. - Rollback to v16s; keep is_gameplay_ack import in bridge only. 2026-06-25 v16s parser_build=jun11-good-gpio7-wire-len-parser-v16s-uart-learn-relay-synth - tid_le(): T340+ wire order (bytes 3–4) — logs match terminal display (no byte swap). - local_slave_tid: first UART→ETH origin only (0x02/0x03 config, x0, x1, …); no FIXTURE_POS map. - eth_inject_tid blacklist unchanged — inject echo must not seed learn. - Relay status-0D synth when ETH inject TID != learned local (after local TID known). - native_uart_status_close on UART→ETH 0x0D disables relay synth (Master path). - Rollback: v16q parser_build string. 2026-06-25 v16r parser_build=jun11-good-gpio7-wire-len-parser-v16r-terminal-tid-relay-synth (SUPERSEDED — static map removed in v16s) - FIXTURE_TERMINALS seed — do not use; v16s uses UART learn only. 2026-06-24 v16q parser_build=jun11-good-gpio7-wire-len-parser-v16q-dual-channel-bridge - CHANNEL=both: one bridge process on ttyXRUSB0 (OIS) + ttyXRUSB1 (machine). - Machine path unchanged (parsed packets, status-0D synth). OIS path: opaque raw HS forward. - Fixture ETH payload tag byte on 0x88B5: 0x4D ('M') machine, 0x4F ('O') OIS — all four Pis required. - Requires POG422_UARTD=0 (pyserial both UARTs); uartd and br0 legacy rejected for dual. - Rollback: CHANNEL=machine or CHANNEL=ois per-UART single-bridge (v16p, no ETH tag). 2026-06-23 v16q parser_build=jun11-good-gpio7-wire-len-parser-v16q-uartd-capture-python-inject - Default POG422_UARTD_INJECT=0: uartd passive HS capture only; python/pyserial inject via suspend/resume IPC. - pog422_uartd 1.0.54: POG422_IPC_UART_SUSPEND/RESUME release fd for pyserial inject. - Re-enables handshake_post_x9_inject_handoff when inject_engine=python (v16p uartd inject skipped it). - Rollback to full uartd inject: POG422_UARTD_INJECT=1 or --uartd-inject. 2026-06-23 v16p parser_build=jun11-good-gpio7-wire-len-parser-v16p-uartd-window-kwarg-fix - OIS channel (CHANNEL=ois): GPIO HS gating unchanged; on hs_inactive log full window as hs_window_raw + packets.raw hex line (no 0x05/0x0D parse). v16o listen. - OIS bridge (CHANNEL=ois): same HS timing; UART→ETH and ETH→UART forward opaque raw window bytes (variable length, no parse/synth/TID policy). v16p. - Fixes v16o total traffic stall: every WINDOW raised TypeError before eth_tx. 2026-06-23 v16o parser_build=jun11-good-gpio7-wire-len-parser-v16o-uartd-hs-capture-inject - Default POG422_UARTD=1: pog422_uartd passive HS capture (WINDOW IPC) replaces poll capture_tick. - All ETH→UART inject via uartd cap_end_inject_window (fixes pos1 seq=4 MRT class). - Python handshake_post_x9_inject_handoff skipped when inject_engine=uartd. - Rollback: POG422_UARTD=0 or --no-uartd for v16n pyserial path. 2026-06-23 v16n parser_build=jun11-good-gpio7-wire-len-parser-v16n-eth-inject-tid-blacklist - eth_rx: blacklist TID (FIFO cap 100) when queued for UART inject — ETH origin. - local_slave_tid learn: reject blacklisted TIDs (post-inject multi-drop echo). - Keeps v16m handoff + v16k dedupe/echo guards unchanged. 2026-06-23 v16m parser_build=jun11-good-gpio7-wire-len-parser-v16m-post-x9-handoff-drain - Fix v16l: drain inject echo when !SLV live (post_x9_inject_echo_drain); never pre-read FIFO. - When SLV live after x9 inject: burst-on-fall window only (uartd cap_end_inject_window). - Grace absorbs late pc71 only (not echo pc79); keeps v16k dedupe/echo guards. 2026-06-23 v16l parser_build=jun11-good-gpio7-wire-len-parser-v16l-post-x9-inject-handoff - eth_to_uart: post_x9_inject_handoff after x9 inject — mirror uartd cap_end_inject_window. - capture_tick: 15 ms grace absorbs late 71 FIFO bytes instead of bytes_discarded_inactive. - Keeps v16k x9_eth_inject_dedupe + uart_x9_echo_status unchanged. 2026-06-23 v16k parser_build=jun11-good-gpio7-wire-len-parser-v16k-x9-eth-inject-dedupe - eth_rx: x9_eth_inject_dedupe — first 79 injects to T340+; skip duplicate ETH relays (500 ms). - eth_tx: uart_x9_echo_status — skip false 0D relay from post-inject echo tail (keep 71 path). 2026-06-23 v16j parser_build=jun11-good-gpio7-wire-len-parser-v16j-echo-guard-narrow - Narrow v16i uart_x9_echo_window: block false glued pc70 and echo-led pc70 only. - Always allow pc71 eth_tx and status_0d_synth even when uart_first_byte is x9 echo. 2026-06-23 v16i parser_build=jun11-good-gpio7-wire-len-parser-v16i-x9-inject-collision-guard - eth_to_uart: strict SLV-IN idle before gameplay response (x9) inject — no timeout bypass. - eth_tx: skip wager relay in uart_x9_echo_window (uart_first_byte is x9 opcode). - eth_tx: x9_inject_dedupe — skip duplicate pc70 within 200 ms of injected x9 (same TID+seq). - status_0d_synth: skip uart_x9_echo_window glued windows (false pc70+pc71 from inject tail). - Rollback: v16h parser_build string + remove uart_window_lead_* / strict_slv_idle guards. 2026-06-23 v16h parser_build=jun11-good-gpio7-wire-len-parser-v16h-eop-crop-suppress - split_packets: drop interior EOP-hunt for opcodes in COMMAND_WIRE_LEN* (fixes 18/15 B false 0x79 on glued Master windows — blackgold21 3-MRT session). - eth_forward_ok: reject frames where len not in wire_lengths_for_cmd (wire_len_crop). - Unknown opcodes: EOP only when segment ends at buffer tail (no mid-buffer hunt). - Rollback: v16g parser_build string + restore split_packets EOP-hunt fallback block. 2026-06-19 v1 parser_build=jun11-good-gpio7-wire-len-parser - Backport split_packets + 0x03=32 SCR fix only. - Rollback: restore pog422_fixture_core.py from sessions/.../scripts snapshot or git. 2026-06-19 v2 parser_build=jun11-good-gpio7-wire-len-parser-v2 - Full gameplay wire lengths from 2045 twelve-games golden capture. - Fix 0x20 primary 37 (was 41). - Add 0x50/59/51 poker, 0x60/69/61 SuperPick, 0x70/71/79 blackjack, 0x29 Touch 6 result. - COMMAND_WIRE_LEN_ALTS for variable 0x20/59/69/79 (try longest valid frame first). - parser_self_test vectors from golden packets.raw. - session_start logs parser_build on pos 1-4. - Rollback: set FIXTURE_PARSER_BUILD back to v1 string and restore v1 COMMAND_WIRE_LEN* block from git/archive, or sync prior Dropbox revision of jun11-good/pog422_fixture_core.py. Test after sync: cd fixture-timing/jun11-good && bash install.sh Expect: OK parser_self_test + parser_build v2 in session_start. Re-run pos4 multi-game session; compare to archive 2026-06-19_1731-UTC_jun11-good-pos4-games-mixed. 2026-06-19 v3 parser_build=jun11-good-gpio7-wire-len-parser-v3 - Wire lengths from 1835 POG422-only census (pos1 AF1D trunk). - Add 0x30=58, 0x39=74, 0x31=12 (SuperGold Bingo). - 0x20 alt 48 (Touch 6 four-card, seq=1). - parser_self_test vectors from 1835 packets.raw. - Rollback: set FIXTURE_PARSER_BUILD to v2 and restore v2 COMMAND_WIRE_LEN* block. Test after sync: cd fixture-timing/jun11-good && bash install.sh Expect: OK parser_self_test + parser_build v3 in session_start. 2026-06-19 v4 parser_build=jun11-good-gpio7-wire-len-parser-v4 - Drop 0x20 alt 41 — phantom from pre-v2 parser/EOP-hunt, not T340+ wire. - Touch 6 wager is only 37 B (1 card) or 48 B (2+ cards) per 1859 card-matrix. - Rollback: restore v3 COMMAND_WIRE_LEN_ALTS 0x20 line. 2026-06-19 v4-selftest (same parser_build string v4) - parser_self_test: replace error-prone fromhex() strings with _pkt() CSV literals copied from archived packets.raw (0x60/0x79/0x30/0x39/0x20). - Several fromhex vectors were 1 B short → split_packets EOP-hunt false pass. 2026-07-04 v16ay parser_build=jun11-good-gpio7-wire-len-parser-v16ay-bingo-wire-len-80 - SuperGold Bingo 0x30 alt wire len 80 (T340+ 4-card wager, SLAVE.C formslavtail(77)). Session 2026-07-04_0219-UTC_bingo-CGS-wire-len-80: parser expected 58 only → CGS loop. - bingo_grid_to_card_bytes / bingo_cards_from_wager + operator reference cards (bench). - Rollback: v16ax-superpick-zero-draw (drops 80 B bingo alt). 2026-07-04 v16az parser_build=jun11-good-gpio7-wire-len-parser-v16az-bingo-wire-len-play-count - SuperGold Bingo 0x30 variable PLAY-card lengths (Touch 6 pattern): 44/56/68/80 B alts (T340+ skips OFF-card 0xFF blocks; 29 + 12×N + CRC/EOP). Primary 58 B = 1835 census (2 PLAY cards + 2 trailing bytes). Helpers: bingo_play_card_count_from_wager, bingo_wager_wire_len_for_play_count. - Rollback: v16ay-bingo-wire-len-80 (80 B alt only). 2026-07-04 v16ba parser_build=jun11-good-gpio7-wire-len-parser-v16ba-bingo-wire-len-two-length - Collapse bingo 0x30 to T6-style two-length hypothesis: primary 44 B (1 PLAY), alts 80/58 B (2–4 PLAY share 80 B per SLAVE.C formslavtail(77); 58 B = 1835 census until bench). Drop phantom 56/68 B per-card steps. Bench: log len for 1/2/3/4-card PLAY rounds. - Rollback: v16az-bingo-wire-len-play-count (44/56/68/80 alts). 2026-07-04 v16bb parser_build=jun11-good-gpio7-wire-len-parser-v16bb-bingo-card-codec-unknown - Bench 2026-07-04_0251-UTC: T340+ uses 80 B for all PLAY counts; byte 8 = credits (0x04/0x08/0x0C/0x10); OFF slots zero-filled (not 0xFF). Primary 0x30=80; alt 58 only. - Card codec: legacy BINGO.C savebingcard hypothesis invalidated (29/96 overlap vs operator grids, same session). BINGO_CARD_CODEC_STATUS=unknown; validate_bingo_wager_cards.py bench. - 0x39 calls: 50 balls @ offset 21 on 74 B wire (bench). - Rollback: v16ba-bingo-wire-len-two-length. 2026-07-03 v16at parser_build=jun11-good-gpio7-wire-len-parser-v16at-touch6-game-9107 - Fix TOUCH6_GAME_ID default 0791 → 9107 (parse_packet_meta byte6+byte5); lab synth was skipped → native draw passed through on trunk. - Rollback: v16as-touch6-hook-fix (wrong game id still no synth). 2026-07-03 v16as parser_build=jun11-good-gpio7-wire-len-parser-v16as-touch6-hook-fix - Fix Touch 6 lab packet_complete hook arg order (v16ar TypeError on every 0x0A/0x29 uart_to_eth → slave CGS, zero eth_tx 0x29). Session: 2026-07-03_2129-UTC_touch6-CGS-master-busy. - Rollback: v16ar-touch6-lab-synth (broken hook).