From 87d3957484ce32712f97347445d229ea3a5dfa16 Mon Sep 17 00:00:00 2001 From: Velascat <32967198+Velascat@users.noreply.github.com> Date: Fri, 8 May 2026 14:04:41 -0400 Subject: [PATCH] style(watcher): reorder sections by operator timeline (campaigns before board) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Final order: Workers / Active (Present) → Recent (Past) → Campaigns / Board / Queue (Future) → Global Rate / Backend Limits (Capacity) → Services (Infra) → System Resources / Global Gate (bottom-anchored). Campaigns are higher-level workstreams (multi-task), so they read naturally before Board (per-task plane state). Board feeds Queue. --- .console/log.md | 8 ++++++ src/operator_console/watcher_status_pane.py | 30 ++++++++++----------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/.console/log.md b/.console/log.md index 29cf328..0d4f476 100644 --- a/.console/log.md +++ b/.console/log.md @@ -147,3 +147,11 @@ board, queue, backend rows, action submenu, log view header. ## 2026-05-08 — Global Gate three-liner; Execution Budget → Global Rate (single-line); spacers + ≥ spacing + +## 2026-05-08 — Reorder pane sections by operator timeline + +Swapped board ↔ campaigns in section build order. Final timeline: +Workers / Active (Present) → Recent (Past) → Campaigns / Board / Queue +(Future) → Global Rate / Backend Limits (Capacity) → Services (Infra) +→ System Resources / Global Gate (bottom-anchored). + diff --git a/src/operator_console/watcher_status_pane.py b/src/operator_console/watcher_status_pane.py index 647e6e2..663492e 100644 --- a/src/operator_console/watcher_status_pane.py +++ b/src/operator_console/watcher_status_pane.py @@ -874,21 +874,7 @@ def _build_sections( recent_lines.append((f" {icon} {ts} {_tc(role):<10} {tag:<22} {title}", attr)) sections.append({"id": "recent", "lines": recent_lines, "sel_local": -1}) - # ── board ── - board_items = plane.get("board", []) - if board_items: - board_lines: list[tuple[str, int]] = [ - (f" Board ({len(board_items)} Queued)", C["HEAD"] | curses.A_BOLD), - ] - for item in board_items: - repo = _tc(item.get("repo", "?"))[:14] - state = item.get("state", "") - icon = "·" if "backlog" in state.lower() else "→" - title = item.get("title", "?")[:max(w - 20, 8)] - board_lines.append((f" {icon} {repo:<14} {title}", C["DIM"])) - sections.append({"id": "board", "lines": board_lines, "sel_local": -1}) - - # ── campaigns ── + # ── campaigns ── (Future — high-level workstreams) campaigns = data.get("campaigns", []) if campaigns: camp_lines: list[tuple[str, int]] = [ @@ -906,6 +892,20 @@ def _build_sections( camp_lines.append((f" {icon} {slug}", attr)) sections.append({"id": "campaigns", "lines": camp_lines, "sel_local": -1}) + # ── board ── (Future — items in motion) + board_items = plane.get("board", []) + if board_items: + board_lines: list[tuple[str, int]] = [ + (f" Board ({len(board_items)} Queued)", C["HEAD"] | curses.A_BOLD), + ] + for item in board_items: + repo = _tc(item.get("repo", "?"))[:14] + state = item.get("state", "") + icon = "·" if "backlog" in state.lower() else "→" + title = item.get("title", "?")[:max(w - 20, 8)] + board_lines.append((f" {icon} {repo:<14} {title}", C["DIM"])) + sections.append({"id": "board", "lines": board_lines, "sel_local": -1}) + # ── queue ── queue = data.get("queue", []) if queue: