diff --git a/codec_dashboard.html b/codec_dashboard.html
index 1b5abc7..57915d0 100644
--- a/codec_dashboard.html
+++ b/codec_dashboard.html
@@ -666,7 +666,7 @@
-
+
diff --git a/docs/known-issues.md b/docs/known-issues.md
index 2e7c59d..8aa5c9e 100644
--- a/docs/known-issues.md
+++ b/docs/known-issues.md
@@ -427,7 +427,7 @@ waits on a model call (not traced yet). Pages are unreachable until then. Fix:
find that call and run it after startup, in the background, with a short timeout. Found in the Mac merge pass. Revisit:
the next item that touches dashboard startup.
-## Automatic triggers show their raw pattern as the title (2026-10-07)
+## Automatic triggers show their raw pattern as the title (2026-10-07) — FIXED (a sentence per type; the rule moved to the detail line)
The 'CODEC is watching' menu's Automatic triggers list (P3.7) titles each trigger
with `codec_triggers`' summary, which is the raw match rule, for example
diff --git a/routes/triggers.py b/routes/triggers.py
index af17eb7..06dce14 100644
--- a/routes/triggers.py
+++ b/routes/triggers.py
@@ -32,6 +32,21 @@
router = APIRouter(prefix="/api/triggers", tags=["triggers"])
+# A readable title for the pages; the raw rule stays in "summary".
+_TYPE_SENTENCE = {
+ "window_title_match": "when a window title matches",
+ "clipboard_pattern": "when you copy matching text",
+ "file_change": "when matching files change",
+ "time": "on a schedule",
+ "compound": "when several conditions match",
+}
+
+
+def _plain_label(trig) -> str:
+ name = str(trig.skill_name).replace("_", " ").strip()
+ return f"{name[:1].upper() + name[1:]}: {_TYPE_SENTENCE.get(trig.type, 'when its rule matches')}"
+
+
def _trigger_summary(trig) -> dict:
"""Render a Trigger to a JSON-safe dict for the API."""
from codec_triggers import _resolve_mute, cooldown_remaining, is_killed
@@ -41,6 +56,7 @@ def _trigger_summary(trig) -> dict:
"skill_name": trig.skill_name,
"type": trig.type,
"summary": trig.short_summary(),
+ "label": _plain_label(trig),
"cooldown_seconds": trig.cooldown_seconds,
"cooldown_remaining": cooldown_remaining(trig.key, trig.cooldown_seconds),
"require_confirmation": trig.require_confirmation,
diff --git a/static/codec-shell.js b/static/codec-shell.js
index 3136bee..b81a1c8 100644
--- a/static/codec-shell.js
+++ b/static/codec-shell.js
@@ -1471,9 +1471,9 @@
list.innerHTML = (d.global_enabled === false ? '
All triggers are off on this Mac (TRIGGERS_ENABLED).