@@ -14,6 +14,10 @@ Run the narrowest gate that covers the release risk:
1414- ** Always:** version metadata, release preflight, GitHub release dry run or
1515 release workflow, TestPyPI install validation, PyPI publish, post-publish
1616 verification, then Flathub stable PR.
17+ - ** When application code, UI code, or runtime-sensitive packaging changed:**
18+ live GTK/AT-SPI/PipeWire smoke. Public release workflow dispatches run this
19+ as a blocking job for app-sensitive changes before building publishable
20+ artifacts.
1721- ** When PipeWire, routing, analyzer, Flatpak permissions, runtime dependencies,
1822 or shutdown changed:** local Flatpak install, Flatpak runtime smoke, and
1923 interactive real-music testing before merge or release. Public release
@@ -73,6 +77,22 @@ on widget internals when a unit test can cover the state transition directly.
7377When in doubt, add a small state-level unit test first, then one AT-SPI smoke
7478assertion for the visible contract.
7579
80+ The automated release gates are confidence checks, not a proof that every user
81+ graph behaves correctly. Treat their claims narrowly:
82+
83+ - Unit and seam tests verify deterministic model, routing, metadata, and UI
84+ state transitions.
85+ - The release preflight verifies source cleanliness, package build/install,
86+ dependency importability, metadata, and the full default pytest suite.
87+ - The Flatpak routing smoke verifies the installed Flatpak can route and
88+ restore a synthetic stream in an isolated PipeWire/WirePlumber graph.
89+ - The live UI smoke verifies the real GTK app can be driven through AT-SPI
90+ while PipeWire routing, output following, monitor capture, preset reset, and
91+ shutdown are exercised.
92+ - Manual real-session audio testing is still required for changes that depend
93+ on host devices, real music playback, WirePlumber policy, or analyzer
94+ behavior users can perceive.
95+
7696## Prepare Version
7797
7898Set the release version once for the shell session:
@@ -192,21 +212,26 @@ run the app interactively with real music before release. Exercise
192212enable/disable, output switching, preset changes, analyzer display, shutdown,
193213and stream restoration against the actual desktop audio graph.
194214
195- Before the manual real-music pass, run the opt-in live UI smoke. It starts a
196- private PipeWire/WirePlumber graph, synthetic playback, nested headless GNOME
197- Shell, the real Mini EQ GTK process, and AT-SPI UI controls:
215+ Before the manual real-music pass, run the live UI smoke. It starts a private
216+ PipeWire/WirePlumber graph, synthetic playback, nested headless GNOME Shell,
217+ the real Mini EQ GTK process, and AT-SPI UI controls:
198218
199219``` bash
200220python3 tools/check_live_ui_runtime.py --timeout 35 --cycles 1
201221MINI_EQ_RUN_LIVE_UI=1 python3 -m pytest tests/test_mini_eq_live_ui_runtime.py -q
202222```
203223
224+ The ` Release ` workflow runs this live UI smoke as a blocking job for app and UI
225+ runtime-sensitive publish dispatches. The pytest wrapper remains opt-in for
226+ local development so ordinary unit test runs stay fast and do not require
227+ nested GNOME Shell or AT-SPI services.
228+
204229There is an optional hosted Flatpak runtime smoke path in the ` CI ` workflow.
205230Use it as extra signal or for smoke-harness work; keep the local runtime smoke
206231as the release check when app/runtime routing behavior changed. The ` Release `
207232workflow also runs release preflight as a blocking job and has its own blocking
208- copy of the Flatpak routing smoke gate for public TestPyPI, PyPI, and GitHub
209- release dispatches.
233+ copy of the Flatpak routing smoke and live UI smoke gates for public TestPyPI,
234+ PyPI, and GitHub release dispatches.
210235
211236## Package Channels
212237
0 commit comments