Skip to content

P0 Studio: protect SMV/PTP baseline, send live phase table, improve operator layout - #245

Merged
masarray merged 16 commits into
feature/studio-matched-ptp-sv-auto-20261017from
fix/studio-operator-ux-phase-ssot-20261018
Oct 18, 2026
Merged

masarray merged 16 commits into
feature/studio-matched-ptp-sv-auto-20261017from
fix/studio-operator-ux-phase-ssot-20261018

Conversation

@masarray

Copy link
Copy Markdown
Owner

Preserve baseline

No changes to ESP32-P4 SV/PTP engine, smpCnt, AUTO phase servo or wire encoder. Existing 120s capture proves 480,294 canonical frames with no discontinuities, local smpSynch=1, aligned SV/PTP epochs (host-relative). Do not regress M3C.5/M3C.6.

Operator fixes

  • Bounded voltage and current matrices are vertically stacked, not stretched across huge blank panels; tighten main workspace.
  • Increase logo and SMV Injector brand typography to normal Windows operator scale.
  • CalmButton icon + label now use centered content root rather than invalid managed Item anchors, maintaining dark text on light hover.
  • Preserve single custom-checkbox indicator normal/hover/focus.
  • 3-phase link live toggle now sends every active model setpoint to device; do not assume changing a checkbox transmits phases. START still flushes pending 90ms editors, serializes ALL eight model phases as integer millidegree SET commands before START, preserving device path SSOT.
  • Default verified-session PTP SOURCE ON through the same guarded profile control (not silent on boot), no new dialogs; AUTO remains AUTO.
  • Add structural gates for logo, layout, PTP and phase payload.

Verification

Qt CI, Windows Lifecycle, native installer Preview with exact matching firmware. Distinguish GUI model from on-wire proof: physical readback per-channel is absent; no claim the displayed angle was transmitted until verified with independent PCAP. Final acceptance: preview install, all 8 angles and phase link RUNNING, PTP AUTO=1, loss/dup=0.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-18T06:05:42.983450Z 763f3c9 PR opened
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 763f3c9098

ℹ️ 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".

Comment on lines +1105 to +1106
ok = root.sendSignal(group, row) && ok
if (ok) root.pendingApply = false

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep the draft pending until every SET is admitted

When the device command queue is full or locked by an exclusive transaction, each sendSignal() still returns true because DeviceController::sendCommandBatch() reports only whether the queued Qt invocation was scheduled; the actual admission failure occurs later in DeviceIoWorker::enqueueCommandsInternal(). Consequently, toggling 3-phase link can reject some or all eight SETs while this line clears pendingApply, falsely presenting the visible table as applied. Send these SETs as one admission-checked batch or retain the pending state until worker acceptance is reported.

AGENTS.md reference: AGENTS.md:L116-L116

Useful? React with 👍 / 👎.

Comment on lines +82 to +84
require("Layout.preferredWidth: bar.compact ? 232 : 286" in ribbon
and "font.pixelSize: bar.compact ? 21 : 25" in ribbon,
"operator brand/logo must stay legible")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Replace the stale structural assertions

The Qt CI workflow runs this script, but the newly required layout and branding strings contradict assertions that remain later in the same function. Running python3 apps/arstack_studio/tests/check_operator_workspace.py on this commit already exits at the old Layout.minimumHeight: root.compactLayout ? 180 : 210 requirement; after updating that, lines 120–122 still require the old 220 : 270, 20 : 22, and width: 44 branding that this new assertion and ModernRibbon.qml explicitly replace. The gate therefore cannot pass until the obsolete expectations are removed or updated.

Useful? React with 👍 / 👎.

Comment thread apps/arstack_studio/qml/Main.qml Outdated
Comment on lines +1122 to +1125
Layout.fillHeight: false
Layout.preferredHeight: root.compactLayout ? 378 : 410
Layout.maximumHeight: 420
Layout.minimumHeight: root.compactLayout ? 340 : 370

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve the supported minimum-height layout

At the declared 960×620 minimum window, the footer, outer margins, 78-pixel workflow bar, and split handle leave roughly 490 pixels for the workspace. Inside the injection panel, its margins plus the header, 48-pixel frequency row, 57-pixel timing tray, quality row, separators, and spacing leave substantially less than the new 340-pixel compact table minimum, so the bottom timing/quality controls are clipped or forced through layout constraints. The previous 180-pixel minimum explicitly allowed this viewport to shrink; retain a shrinkable minimum and use preferred/maximum heights only to prevent stretching on tall windows.

Useful? React with 👍 / 👎.

Comment thread apps/arstack_studio/qml/Main.qml Outdated
Comment on lines +263 to +266
Timer {
interval: 350
repeat: true
running: root.ptpDefaultPending

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Consolidate the duplicate automatic PTP start state

This timer starts PTP without setting the pre-existing ptpDefaultStartAttempted flag, while the original 500 ms timer remains armed on that flag. If this first guided start is accepted but subsequently fails asynchronously—such as a command rejection, ACK timeout, or readback mismatch—ptpStarting eventually becomes false and the original timer automatically launches a second attempt, violating the documented one-shot behavior and producing an implicit retry. Use the existing attempted state for the first request or replace the old timer rather than maintaining two independent default-start state machines.

AGENTS.md reference: AGENTS.md:L76-L83

Useful? React with 👍 / 👎.

@masarray
masarray merged commit 0a3e916 into feature/studio-matched-ptp-sv-auto-20261017 Oct 18, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant