1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
id = "grok"
version = "2026.10.05.1"
min_engine_version = 3
updated_at = "2026-10-05T00:00:00Z"
aliases = ["grok-build"]
# Evidence: Grok Build 0.2.101 source and 1.0.34 live pane reads.
#
# Grok emits OSC 0 titles by default. Idle is "grok" or
# "<session> - grok". During a turn, the configured title gains a braille
# spinner and activity text. Permission prompts add "⚠ Action Required";
# that prefix blinks while the terminal is unfocused, so visible blocker
# rules outrank the title spinner rule.
#
# Grok also emits OSC 9;4 progress on supported terminals. Herdr retains the
# payload after "9;": "4;1;-1" while busy and "4;0;0" when idle.
#
# Working turns render one live status line directly above the prompt box:
# "⠧ Waiting on subagent… 2.8s 13s ⇣29.7k [stop]"
# "⠴ Explore /tmp/… + 1 more… 5.6s 19s ⇣29.7k [stop]"
# with a braille spinner and a trailing [stop] chip, plus an Esc:cancel
# footer hint. Permission prompts and ask-user-question dialogs replace the
# spinner with "◆" and draw a "┃"-guttered option list:
# "┃ 2 (○) Yes, proceed"
# "┃ z (○) Type your answer here"
# with footer hints "1/3:select │ Ctrl+o:yolo │ Ctrl+c:cancel" (permission)
# or "Esc:unselect │ Tab:scrollback │ Shift+x:dismiss" (question dialog).
# Idle footers end with "Ctrl+.:shortcuts" and never contain "Esc:cancel".
# The startup splash draws its logo with braille characters, so working
# rules must anchor on the [stop] chip, not on a bare spinner glyph.
[[rules]]
id = "osc_title_blocked"
state = "blocked"
priority = 1300
region = "osc_title"
visible_blocker = true
contains = ["Action Required"]
[[rules]]
id = "option_dialog_blocked"
state = "blocked"
priority = 1200
region = "whole_recent"
visible_blocker = true
line_regex = ['^\s*┃\s+[0-9a-z]+\s+\([●○]\)\s']
[[rules]]
id = "permission_hints_blocked"
state = "blocked"
priority = 1190
region = "bottom_non_empty_lines(2)"
visible_blocker = true
contains = [":select", "ctrl+o:yolo", "ctrl+c:cancel"]
[[rules]]
id = "question_dialog_hints_blocked"
state = "blocked"
priority = 1185
region = "bottom_non_empty_lines(2)"
visible_blocker = true
contains = ["tab:scrollback", "shift+x:dismiss"]
# Pre-0.2.x permission UI kept for older Grok Build releases.
[[rules]]
id = "permission_scope_selector"
state = "blocked"
priority = 1180
region = "whole_recent"
visible_blocker = true
contains = ["yes, proceed", "no, reject"]
any = [
{ contains = ["use ← → to choose permission whitelist scope"] },
{ contains = ["←/→:scope"] },
]
# Background commands, monitors, and subagents left running after Grok returns
# to its prompt do not count as working, matching Claude and agy (#1217, #4735).
[[rules]]
id = "osc_progress_working"
state = "working"
priority = 1150
region = "osc_progress"
visible_working = true
regex = ['^4;1;-1$']
[[rules]]
id = "osc_title_idle"
state = "idle"
priority = 1100
region = "osc_title"
visible_idle = true
regex = ['(?:^| - )grok$']
not = [
{ regex = ['[\x{2800}-\x{28FF}]'] },
]
# Title items are configurable; omitting "grok" does not imply activity.
# Require a spinner, with OSC progress covering titles that omit it.
[[rules]]
id = "osc_title_working"
state = "working"
priority = 1000
region = "osc_title"
visible_working = true
regex = ['(?:^|\s)[\x{2801}-\x{28FF}](?:\s|$)']
[[rules]]
id = "osc_progress_idle"
state = "idle"
priority = 950
region = "osc_progress"
visible_idle = true
regex = ['^4;0;0$']
# Visible activity outranks idle OSC signals: disabling title updates can
# leave the startup "grok" title unchanged throughout a turn.
[[rules]]
id = "spinner_status_working"
state = "working"
priority = 1160
region = "whole_recent"
visible_working = true
line_regex = ['^\s*[\x{2801}-\x{28FF}]\s.*\[stop\]\s*$']
[[rules]]
id = "esc_cancel_hints_working"
state = "working"
priority = 1155
region = "bottom_non_empty_lines(2)"
visible_working = true
contains = ["ctrl+.:shortcuts"]
any = [
{ contains = ["esc:cancel"] },
{ contains = ["ctrl+c:cancel"] },
]
# Pre-0.2.x working chrome kept for older Grok Build releases.
[[rules]]
id = "waiting_tool_working"
state = "working"
priority = 1140
region = "whole_recent"
visible_working = true
any = [
{ all = [{ contains = ["ctrl+c:cancel", "ctrl+enter:interject"] }, { contains = ["waiting"] }] },
{ line_regex = ['^\s*[\x{2801}-\x{28FF}]\s+(Run|Read|Search|List)\b'] },
]
[[rules]]
id = "prompt_hints_idle"
state = "idle"
priority = 100
region = "bottom_non_empty_lines(2)"
visible_idle = true
contains = ["ctrl+.:shortcuts"]
not = [
{ contains = ["esc:cancel"] },
{ contains = ["ctrl+c:cancel"] },
]
|