docs(da07): record the post-Refresh STATUS lag as accepted firmware behavior

The ~H operational-statistics frame is the only source of device status and
is not solicitable; it arrives once per second only after the full refresh
sequence drains into SVC_POLL. Reviewed and accepted as-is; candidate
perception-only mitigations noted in the entry instead of BACKLOG.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 11:07:38 -04:00
parent a665993a7c
commit d83a61e65f

View File

@@ -39,6 +39,38 @@ Tag-name write and two device toggles through the new write queue.
---
## 2026-06-12 — Devices-tab STATUS lags ~10 s after Refresh (known behavior, not a bug)
**Symptom:** after a Refresh on real hardware, the Devices tab renders its rows
quickly but the STATUS column stays "—" for roughly ten seconds before filling in.
**Root cause — station firmware design, nothing tool-side:** STATUS has exactly one
source, the `~H` operational-statistics frame (one status nibble per device slot,
`controller._apply_status`). Per the ICD (§4.3/§5.H) the firmware only sends `~H`
after the *entire* refresh sequence (config → settings → devices → averages →
current → names → device details) has drained and it settles into steady-state
`SVC_POLL`, where `~H` repeats once per second. **`~H` is not solicitable** — there
is no command that requests one early. Device rows appear early (the `~D` frames),
then the station spends the rest of the load streaming at 9600 baud, one frame per
ACK; only then does the first `~H` arrive. Both real captures confirm the refresh
stream itself contains no `~H`. Our ACKs are immediate (`_send_link`, bypassing the
write queue), so the pace is entirely the station's. The legacy VB6 behaved
identically but hid it behind its modal progress dialog, which only closed on the
first `~H` (`Case "H" … CloseProgress`, `Main.frm`).
**Status: accepted as-is (2026-06-12).** Deliberately **not** in BACKLOG.md — Andy
reviewed and chose to leave it alone for now. If it ever bothers users enough to
revisit, the candidate mitigations (perception-only; the wire-level wait cannot be
shortened) were:
1. Carry last-known per-slot statuses across `controller.refresh()` instead of
blanking them, rendered dimmed ("off" status role) until the first `~H`
reconfirms — instant repopulate, but shows stale data for the gap, which is why
it should never render full-strength.
2. Cosmetic only: a clearer "pending" placeholder than "—" while loading.
---
## 2026-06-12 — Burst writes silently dropped by the station ("only the second toggle stuck")
**Symptom:** toggle device A's Active off, wait ~2 s, toggle device B's off, then