Repository navigation
Conversation
…rance; leave PTP/SV untouched
… event-driven re-identification
…, firmware action or extra polling
…no duplicate reconnect regressions
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a9cc5321e8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| and "PTP STOP" not in scan | ||
| and "SV STOP" not in scan.replace("// NEVER issue SV/PTP STOP,", "") |
There was a problem hiding this comment.
Exclude comments from the STOP-command structural check
Running python3 apps/arstack_studio/tests/check_operator_workspace.py fails on this assertion because refreshPortsInternal() contains the comment NEVER issue SV/PTP STOP, which includes the forbidden substring PTP STOP despite issuing no such command. This breaks the existing “Studio operator workspace layout and PTP authority contract” step in .github/workflows/arstack-studio-qt.yml on every run. Strip comments or check actual command expressions so the guard accepts the implementation while still detecting prohibited writes.
Useful? React with 👍 / 👎.
…, health loss not manual disconnect
… for event-driven recovery
…ed, including stalled same-COM hotplug
…sor; keep manual disconnect distinct
…COM asynchronously
…g same-name quick USB replug
…se reconnect for same COM
|
Integrated into main through PR #299 — historical stacked review closed. Verified on 24 Oct 2026: this PR's exact HEAD This PR targeted an intermediate stacked branch, not |
|
Integrated into main through PR #299 — stacked review closed. Exact PR HEAD |
Field capture audit (2026-10-24)
Captured PCAP: 21,824 correctly ordered SV packets all
smpSynch=2(0 malformed, 0 duplicates, no missingsmpCntinside each live publishing segment) and 24 L2 PTP packets (8 Announce, 8 Sync, 8 Follow_Up) with one unchanged GM clock identity, domain 0 and sequence IDs 67–74. Active SV ~4000 fps, 2.783s STOP→START gap but first resumed SV frame stillsmpSynch=2. The 8.238s PCAP is INVALID_CAPTURE/partial, not a 120s acceptance test. PTP advertises simulated class 6 / GPS timeSource metadata and Jan 1 2026 synthetic epoch; neither external UTC-traceable Global GM nor sub-µs physical accuracy can be established from PC host timestamps. Freeze M3.E firmware/clock as a working isolated lab simulation baseline, not certified global clock conformance.Independent Studio-only fix
Root cause: DeviceIoWorker's 750-ms OS port inventory emitted a list change, but did not retire a QSerialPort handle which Windows USB drivers can leave
isOpen()after a physical unplug. The supervisor sees the phantomconnected=true, blocking rediscovery until Studio restart.Acceptance
Native Windows and CI tests must pass; physical plug/unplug/replug test required (especially quick reconnect and same COM). Do NOT merge/rebase/fiddle the stable M3.E PTP/SV firmware or main. Keep draft until device FAT passes.
M3.G Hotplug latency field follow-up (2026-10-24)
Operator evidence: after USB OTG unplug/replug, Studio sometimes remains 'ESP32-P4 not verified' before later showing Device ready/COM15. The GUI had two competing USB disconnect owners, and pending rediscovery depended on 2.5s periodic discovery or bounded health timeout. This was independently reproduced in source paths.
portsChangeddisconnect which defeated the DeviceIoWorker's two consecutive 750ms snapshot hysteresis. There is now exactly one low-rate USB absence authority.DeviceIoWorkerretires the stale QSerialPort and emitsunexpectedPortLoss(generation, port)after handle close; intentional manual DISCONNECT never emits it.recoverUnresponsivePort; the old code treated this as a manual disconnect and waited for the 2.5s discovery timer.unexpectedTransportLoss; SmartSessionController immediately re-enters semantic discovery once generation, firmware ownership, session, and port visibility gates pass. New port arrival uses the existing 750ms enumerator; no additional serial polling, thread, QML busy loop or board restart.CI and artifact
HEAD
a8ca25293311575d170d1f9ef1cd3aa388a8c002, 4/4 named workflows PASS (Studio Qt, Windows Lifecycle, Native Preview, Naming). Inno clean install/running upgrade/uninstall and NSIS→Inno acceptance all PASS. Firmware build is a packaging requirement but no embedded/ESP32/PTP/SV source was changed; existing compatible M3.E firmware need not be flashed. Source/firmware build IDs differ by packaging SHA only. Physical rapid/same-COM/renumbered-COM unplug–replug timing remains unmeasured in CI. Keep Draft for user board FAT.