Repository navigation
P0: ARStack Studio 4I+4V Quick Start reference profile - #79
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0e418ba3ef
ℹ️ 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".
Merge-preparation checkpoint — 2026-09-15Progress is now preserved and PR #79 has been repaired for eventual merge without changing the board-tested runtime. Preserved exact states
PR head preparation
Physical evidence interpretationThe interrupted soak is retained as useful positive/negative evidence, not final RC2 acceptance: 10/10 Start/Stop and checkpoints through 2520 s were clean at 4000 fps / missed=0 / txFail=0; Windows Modern Standby then interrupted the USB/session and invalidated the uninterrupted >=3600 s gate. The board recovered healthy/stopped after resume. Therefore:
|
Final P0 merge-preparation checkpointPhysical P0 acceptance has been closed pragmatically in issue #83. Validated real-board evidence:
Capture SHA-256: Board evidence SHA-256: Exact PR head The only delta after the board-tested blocker runtime Disposition: READY FOR REVIEW / READY FOR MERGE. Legacy strict-lab evidence items deferred in #83 are not being represented as physically executed. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d9b5b68484
ℹ️ 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".
| github-release: | ||
| name: Publish tagged release | ||
| if: startsWith(github.ref, 'refs/tags/') | ||
| needs: clean-windows-smoke |
There was a problem hiding this comment.
Gate tagged releases on physical acceptance
When v0.1.0 is tagged, this job proceeds from package smoke directly to action-gh-release; it neither checks the freeze manifest (currently FROZEN_PENDING_PHYSICAL_ACCEPTANCE) nor evaluates RC2 evidence tied to the tagged SHA. Consequently, an accidental or premature tag can publicly publish artifacts despite physicalAcceptanceRequiredBeforeMergeOrTag and the release-freeze contract; add an explicit exact-SHA physical-acceptance gate before this job.
AGENTS.md reference: AGENTS.md:L253-L263
Useful? React with 👍 / 👎.
| const QString recommended = device_->recommendedPort().trimmed(); | ||
| if (recommended.isEmpty() || !device_->ports().contains(recommended)) { | ||
| blankBoardDetected_ = false; | ||
| blankBoardPort_.clear(); | ||
| return; |
There was a problem hiding this comment.
Retain the manually selected recovery port
When the operator explicitly selects a blank board on a low-confidence port, or selects one board while multiple Espressif ports are attached, recommendedPort() is empty even though the attempted port remains visible. This branch therefore clears the recovery offer, and because firmware mutations are no longer exposed directly to QML, the operator cannot reach the guarded chip probe/install flow. Use the explicitly attempted port after the bounded identification failure (or the existing, currently unused recovery-port selector) rather than requiring an automatic recommendation.
Useful? React with 👍 / 👎.
| connect(presenceTimer_, &QTimer::timeout, this, [this] { | ||
| refreshPortsInternal(false); | ||
| }); |
There was a problem hiding this comment.
Isolate port enumeration from lease heartbeats
While output is running, the 700 ms lease heartbeat and this 750 ms presence poll execute on the same worker event loop, but refreshPortsInternal() synchronously calls QSerialPortInfo::availablePorts(). If Windows device enumeration stalls because of a slow or failing USB driver, heartbeat callbacks cannot run and the firmware's 2.5-second lease expires, stopping otherwise healthy SMV output. Move enumeration off the heartbeat/serial owner or suspend it during RUNNING so unrelated discovery latency cannot violate the control lease.
AGENTS.md reference: AGENTS.md:L88-L94
Useful? React with 👍 / 👎.
| pendingRx_.append(serial_->readAll()); | ||
| if (pendingRx_.size() > kMaxRxBytesWithoutLine && pendingRx_.indexOf('\n') < 0) { | ||
| handleSerialFailure(QStringLiteral("Serial receive line exceeded the bounded input size.")); | ||
| return; |
There was a problem hiding this comment.
Reject oversized terminated serial lines
If a corrupt or unexpected serial peer delivers a line larger than 16 KiB with its newline in the same readyRead batch, indexOf('\n') < 0 is false, so the declared bound is bypassed and the entire line is copied and converted to QString. Repeated terminated oversized lines can therefore impose unbounded allocation and processing despite the transport limit; compare the first newline offset with the maximum before extracting the line.
AGENTS.md reference: AGENTS.md:L55-L64
Useful? React with 👍 / 👎.
Public release published — v0.1.0ARStack Studio / SMV Injector v0.1.0 is now publicly available as a stable GitHub Release. Release: https://github.com/masarray/arstack61850/releases/tag/v0.1.0 Provenance:
Published assets:
Release is |
Target
Start P0 productization of ARStack Studio for the first public release, intentionally bounded to 4I + 4V / 4000 fps / 9-2LE-style reference workflow.
What this PR adds
4I+4Vreference SCL with one deterministic SV stream.SclProfileModel::loadReferenceTemplate()path; the template is parsed and compiled through the same ARIEC61850 SCL/profile engine as customer SCD/CID/IID files.smpCntmodulus 4000, so the bundled profile resolves as Class A without weakening the Class-B confirmation rule for arbitrary external SCL.referenceTemplateActiveUI/model state.--check-reference-templateregression gate verifying exactly one stream, Class A,deviceSupport=ready,ARSTACK_SV01, 4000 fps, smpCnt modulus 4000, 64-byte payload and 16 FCDA leaves.Amp/Voland 9-2LE-styleAmpSv/VolSvsemantic names, while retaining the fixed TCTR/TVTR order, INT32+Quality, 16-leaf and 64-byte fail-closed boundary.docs/SMV_STUDIO_P0_RELEASE.mdto prevent scope creep beyond 4I+4V for the first release.Why the classifier change is needed
The supplied 4I+4V 9-2LE reference uses
TCTR*.AmpSvandTVTR*.VolSv. The previous classifier only recognizedAmp/Vol, so a semantically correct 4I+4V 64-byte profile compiled as Class A but was blocked asunsupported-layout. The new alias recognition does not accept arbitrary same-sized datasets; LN class/instance, channel order, basic type, Quality pairing and payload shape remain mandatory.Safety / truth boundary
This does not broaden embedded layout support. The release target remains the physically proven 4I+4V runtime. External SCL continues to use the normal Class A/B/C and device-support gates.
smpSynchclaims are unchanged.Next P0 increments