diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/style.css b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/style.css
index eeced9fc..4d3386d1 100644
--- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/style.css
+++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/style.css
@@ -575,6 +575,24 @@ input.status-input, select.status-input { width: 100%; padding: 0.45rem 0.5rem;
border-color: var(--accent-yellow);
color: var(--accent-yellow);
}
+/* One row, read left to right: step through the entries, hand the rig back,
+ then — fenced off — the entry actually on air. */
+.scheduler-action-row {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 0.35rem;
+}
+/* The rule belongs to the current-entry block, so it leaves with it: the
+ block is display-toggled whenever fewer than two entries are active. */
+.scheduler-action-row #scheduler-cycle-status::before {
+ content: "";
+ align-self: stretch;
+ width: 1px;
+ min-height: 1.7rem;
+ margin-inline: 0.3rem;
+ background: color-mix(in srgb, var(--border-light) 70%, transparent);
+}
.scheduler-step-controls {
display: flex;
flex-wrap: wrap;
diff --git a/src/trx-client/trx-frontend/trx-frontend-http/frontend/tests/browser-smoke.mjs b/src/trx-client/trx-frontend/trx-frontend-http/frontend/tests/browser-smoke.mjs
index 0ae6a4f2..46287af3 100644
--- a/src/trx-client/trx-frontend/trx-frontend-http/frontend/tests/browser-smoke.mjs
+++ b/src/trx-client/trx-frontend/trx-frontend-http/frontend/tests/browser-smoke.mjs
@@ -196,6 +196,15 @@ try {
await page.locator("summary", { hasText: "Audio controls" }).click();
assert.equal(await page.locator("#rx-audio-btn").count(), 1);
+ // Scheduler controls read left to right: step, hand back, then the entry on
+ // air. The separator is drawn by the current-entry block, so it can only sit
+ // in the right place if that block is last.
+ const schedulerRow = await page.evaluate(() => [...document.querySelectorAll(".scheduler-action-row > *")]
+ .map((el) => el.id || [...el.children].map((c) => c.id).join("+")));
+ assert.deepEqual(schedulerRow,
+ ["scheduler-prev-btn+scheduler-next-btn", "scheduler-release-btn", "scheduler-cycle-status"],
+ `scheduler control order is ${JSON.stringify(schedulerRow)}`);
+
// The footer status pill colours its dot from data-state, so a hint written
// straight to textContent would leave the dot stuck on the previous state.
const hint = await page.evaluate(() => {