[object Object]

← back to Terminal Status

TK-11794: green 'waiting' variant — brighter static green (0,255,120) for an idle/waiting green session

ea41eb3b5a923b75011066418aa6ea1b36e6d967 · 2026-09-15 18:47:40 -0700 · Steve Abrams

A green-only tint parallel to monitoring (teal): distinguishes an idle/waiting
green session from an actively-working one WITHOUT pulsing — green stays SOLID
per Steve's dot directive. Guarded at set-time (dropped on any non-green base),
accepted by load()/set()/set-variant validation, wired to CLI --waiting +
set-variant waiting. Variant precedence: stopped > monitoring > waiting. Render-
only rgb; stored title recomputes byte-identically so no record goes invalid.
39/39 tests pass incl test_waiting_shade_is_brighter_green_and_survives_repaint.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HKMY3eXqwFUCfqDShfUVnH

Files touched

Diff

commit ea41eb3b5a923b75011066418aa6ea1b36e6d967
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Sep 15 18:47:40 2026 -0700

    TK-11794: green 'waiting' variant — brighter static green (0,255,120) for an idle/waiting green session
    
    A green-only tint parallel to monitoring (teal): distinguishes an idle/waiting
    green session from an actively-working one WITHOUT pulsing — green stays SOLID
    per Steve's dot directive. Guarded at set-time (dropped on any non-green base),
    accepted by load()/set()/set-variant validation, wired to CLI --waiting +
    set-variant waiting. Variant precedence: stopped > monitoring > waiting. Render-
    only rgb; stored title recomputes byte-identically so no record goes invalid.
    39/39 tests pass incl test_waiting_shade_is_brighter_green_and_survives_repaint.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01HKMY3eXqwFUCfqDShfUVnH
---
 terminal_status.py      | 33 ++++++++++++++++++++++++++-------
 test_terminal_status.py | 13 +++++++++++++
 2 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/terminal_status.py b/terminal_status.py
index 7f23d36..280d374 100644
--- a/terminal_status.py
+++ b/terminal_status.py
@@ -589,7 +589,17 @@ def osc_payload(record):
     if record["state"] == "none":
         return b"\x1b]6;1;bg;*;default\x07\x1b]1;\x07\x1b]2;\x07\x1b]1337;SetBadgeFormat=\x07"
     title = display_title(record)
-    rgb = (0, 150, 136) if record.get("variant") == "monitoring" else COLORS[record["state"]][1]
+    # Green VARIANT tints (both green-only, guarded at set-time): waiting = a distinct
+    # brighter STATIC green for an idle/waiting green session; monitoring = teal, a
+    # scheduled deadline. Any other variant/base uses the base colour's rgb (stopped
+    # keeps its base dot and rides the additive marker instead of changing the tint).
+    variant = record.get("variant")
+    if variant == "waiting":
+        rgb = (0, 255, 120)
+    elif variant == "monitoring":
+        rgb = (0, 150, 136)
+    else:
+        rgb = COLORS[record["state"]][1]
     text = "".join(
         f"\x1b]6;1;bg;{channel};brightness;{value}\x07"
         for channel, value in zip(("red", "green", "blue"), rgb))
@@ -716,7 +726,7 @@ class Store:
             ticket = r.get("ticket", "")
             if (ticket and not re.fullmatch(r"TK-\d+", ticket)) or not isinstance(r.get("ticket_at", 0), (int, float)):
                 return None, "invalid"
-            if r.get("variant", "") not in ("", "monitoring", "stopped"):
+            if r.get("variant", "") not in ("", "monitoring", "stopped", "waiting"):
                 return None, "invalid"
             expected = status_title(r["state"], r["label"], ticket, r.get("variant", ""))
             if r["title"] != expected or (r["state"] == "none" and r["label"]):
@@ -753,7 +763,7 @@ class Store:
     def set(self, owner, color, label="", *, issued_ns=None, ticket_update=None,
             variant="", deferential=False):
         issued_ns = issued_ns if issued_ns is not None else issued_clock()
-        if color not in COLORS or not valid_label(label) or variant not in ("", "monitoring", "stopped"):
+        if color not in COLORS or not valid_label(label) or variant not in ("", "monitoring", "stopped", "waiting"):
             raise StatusError("Invalid status or label")
         label, embedded_ticket = label_ticket(label)
         if embedded_ticket:
@@ -858,7 +868,7 @@ class Store:
         status — colour, label, ticket and timestamps are preserved. This is what the
         flasher pulses, so a crashed loop can never corrupt the real dot: the worst case
         is the marker left on or off beside an otherwise-correct base colour."""
-        if variant not in ("", "monitoring", "stopped"):
+        if variant not in ("", "monitoring", "stopped", "waiting"):
             raise StatusError("Invalid variant")
         with self.lock(owner):
             record, reason = self.load(owner)
@@ -866,7 +876,8 @@ class Store:
                 raise StatusError("Cannot set variant on unknown status: " + reason)
             self.assert_owner(owner)
             color = record["state"]
-            if variant == "monitoring" and color != "green":
+            # monitoring AND waiting are green-only tints; drop either on a non-green base.
+            if variant in ("monitoring", "waiting") and color != "green":
                 variant = ""
             record["variant"] = variant
             record["title"] = status_title(color, record["label"], record.get("ticket", ""), variant)
@@ -999,7 +1010,7 @@ def main(argv=None):
     parser = argparse.ArgumentParser(description=__doc__)
     sub = parser.add_subparsers(dest="command", required=True)
     sv = sub.add_parser("set-variant")
-    sv.add_argument("variant", nargs="?", default="", choices=["", "monitoring", "stopped"])
+    sv.add_argument("variant", nargs="?", default="", choices=["", "monitoring", "stopped", "waiting"])
     sv.add_argument("--if-blocked", action="store_true",
                     help="only apply when the base dot is a NEEDS-STEVE colour (yellow/purple/"
                          "orange); a cheap no-op otherwise. Used by the Stop hook so the 🔵 "
@@ -1031,6 +1042,9 @@ def main(argv=None):
                                   "record must still match the live process table, so a stale "
                                   "writer is refused exactly as for the caller's own tab.")
             cmd.add_argument("--monitoring", action="store_true")
+            cmd.add_argument("--waiting", action="store_true",
+                             help="brighter STATIC green (rgb 0,255,120) for an idle/"
+                                  "waiting green session; a green-only tint like --monitoring")
             cmd.add_argument("--stopped", action="store_true",
                              help="keep the base colour dot and place \U0001F535 next to it "
                                   "(any stop that requires Steve's input)")
@@ -1198,9 +1212,14 @@ def main(argv=None):
         elif args.command == "repaint":
             record = store.repaint(owner)
         else:
+            # Variant precedence when more than one flag is somehow passed: stopped (the
+            # needs-Steve additive marker) wins over the two green tints; between the tints,
+            # monitoring (teal — an active scheduled deadline) wins over waiting (brighter
+            # idle green), since a live deadline is the more informative signal.
             record = store.set(owner, color, label,
                                variant=("stopped" if getattr(args, "stopped", False)
-                                        else "monitoring" if getattr(args, "monitoring", False) else ""),
+                                        else "monitoring" if getattr(args, "monitoring", False)
+                                        else "waiting" if getattr(args, "waiting", False) else ""),
                                deferential=getattr(args, "deferential", False))
         if not getattr(args, "quiet", False):
             print(f'/terminal-status → /dev/{owner.tty} {record["title"] or "CLEARED"}')
diff --git a/test_terminal_status.py b/test_terminal_status.py
index faaf347..c0744f7 100644
--- a/test_terminal_status.py
+++ b/test_terminal_status.py
@@ -83,6 +83,19 @@ class StatusTests(unittest.TestCase):
         self.assertEqual(self.paints[-1]["variant"], "monitoring")
         self.assertEqual(self.store.row(self.owner)["color"], "green")
 
+    def test_waiting_shade_is_brighter_green_and_survives_repaint(self):
+        # Parallel to the monitoring variant: waiting paints a distinct brighter STATIC
+        # green rgb(0,255,120), stays state=="green" (a green variant, not a new colour),
+        # and survives a repaint.
+        record = self.store.set(self.owner, "green", "Idle", variant="waiting")
+        packet = ts.osc_payload(record)
+        self.assertIn(b"red;brightness;0", packet)
+        self.assertIn(b"green;brightness;255", packet)
+        self.assertIn(b"blue;brightness;120", packet)
+        self.store.repaint(self.owner)
+        self.assertEqual(self.paints[-1]["variant"], "waiting")
+        self.assertEqual(self.store.row(self.owner)["color"], "green")
+
     def test_lightblue_preserves_underlying_needs_steve_reason(self):
         # T1-c (TK-11779): an explicit lightblue on a purple/orange/yellow base must NOT
         # erase the specific reason — it rides as the additive 🔵 stopped marker on the

← 585ee06 TK-11794: pulse the 4 needs-Steve dot states; green/pink sta  ·  back to Terminal Status  ·  dot.sh: forward all set args so --tty/--force reach the engi a1139e9 →