docs: typography hygiene + 2 in-body H1 removals across 5 pages

Replaced 112 typography characters (curly quotes, apostrophes, em/en
dashes, non-breaking hyphens) with ASCII equivalents per
docs/CLAUDE.md heading and content hygiene rules.

- docs/help/gpt55-codex-agentic-parity.md: 22 chars; removed the
  duplicate '# GPT-5.5 / Codex Agentic Parity in OpenClaw' H1 (Mintlify
  renders the title from frontmatter; the in-body H1 with the slash
  produced a brittle anchor).
- docs/platforms/mac/menu-bar.md: 21 chars; removed the duplicate
  '# Menu Bar Status Logic' H1.
- docs/tools/acp-agents.md: 23 chars
- docs/concepts/qa-matrix.md: 23 chars
- docs/concepts/qa-e2e-automation.md: 23 chars
This commit is contained in:
Vincent Koc
2026-05-05 19:34:52 -07:00
parent b9f711089a
commit 2b8d91d9ee
5 changed files with 87 additions and 91 deletions

View File

@@ -5,22 +5,20 @@ read_when:
title: "Menu bar"
---
# Menu Bar Status Logic
## What is shown
- We surface the current agent work state in the menu bar icon and in the first status row of the menu.
- Health status is hidden while work is active; it returns when all sessions are idle.
- A root Context submenu contains recent sessions instead of expanding them directly in the root menu.
- The Nodes block in the root menu lists **devices** only (paired nodes via `node.list`), not client/presence entries.
- A root Usage section appears below Context when provider usage snapshots are available, followed by usage-cost details when available.
- A root "Context" submenu contains recent sessions instead of expanding them directly in the root menu.
- The "Nodes" block in the root menu lists **devices** only (paired nodes via `node.list`), not client/presence entries.
- A root "Usage" section appears below Context when provider usage snapshots are available, followed by usage-cost details when available.
## State model
- Sessions: events arrive with `runId` (per-run) plus `sessionKey` in the payload. The main session is the key `main`; if absent, we fall back to the most recently updated session.
- Priority: main always wins. If main is active, its state is shown immediately. If main is idle, the most recently active nonmain session is shown. We do not flipflop midactivity; we only switch when the current session goes idle or main becomes active.
- Sessions: events arrive with `runId` (per-run) plus `sessionKey` in the payload. The "main" session is the key `main`; if absent, we fall back to the most recently updated session.
- Priority: main always wins. If main is active, its state is shown immediately. If main is idle, the most recently active non-main session is shown. We do not flip-flop mid-activity; we only switch when the current session goes idle or main becomes active.
- Activity kinds:
- `job`: highlevel command execution (`state: started|streaming|done|error`).
- `job`: high-level command execution (`state: started|streaming|done|error`).
- `tool`: `phase: start|result` with `toolName` and `meta/args`.
## IconState enum (Swift)
@@ -42,13 +40,13 @@ title: "Menu bar"
### Visual mapping
- `idle`: normal critter.
- `workingMain`: badge with glyph, full tint, leg working animation.
- `workingMain`: badge with glyph, full tint, leg "working" animation.
- `workingOther`: badge with glyph, muted tint, no scurry.
- `overridden`: uses the chosen glyph/tint regardless of activity.
## Context submenu
- The root menu shows one Context row with a session count/status and opens a submenu.
- The root menu shows one "Context" row with a session count/status and opens a submenu.
- The Context submenu header shows the active session count for the last 24 hours.
- Each session row keeps its token bar, age, preview, thinking/verbose, reset, compact, and delete actions.
- Loading, disconnected, and session-load error messages appear inside the Context submenu.
@@ -62,7 +60,7 @@ title: "Menu bar"
## Event ingestion
- Source: controlchannel `agent` events (`ControlChannel.handleAgentEvent`).
- Source: control-channel `agent` events (`ControlChannel.handleAgentEvent`).
- Parsed fields:
- `stream: "job"` with `data.state` for start/stop.
- `stream: "tool"` with `data.phase`, `name`, optional `meta`/`args`.
@@ -74,7 +72,7 @@ title: "Menu bar"
## Debug override
- Settings ▸ Debug ▸ Icon override picker:
- Settings ▸ Debug ▸ "Icon override" picker:
- `System (auto)` (default)
- `Working: main` (per tool kind)
- `Working: other` (per tool kind)
@@ -84,7 +82,7 @@ title: "Menu bar"
## Testing checklist
- Trigger main session job: verify icon switches immediately and status row shows main label.
- Trigger nonmain session job while main idle: icon/status shows nonmain; stays stable until it finishes.
- Trigger non-main session job while main idle: icon/status shows non-main; stays stable until it finishes.
- Start main while other active: icon flips to main instantly.
- Rapid tool bursts: ensure badge does not flicker (TTL grace on tool results).
- Health row reappears once all sessions idle.