From f3606a1bd91536be1c33cb9e014970775c5ed601 Mon Sep 17 00:00:00 2001
From: dot-agi
Date: Sat, 24 Oct 2026 00:35:52 +0530
Subject: [PATCH 1/2] Release 1.2.2
---
.claude-plugin/plugin.json | 2 +-
README.md | 2 +-
docs/usage.md | 2 +-
hooks/views.tsx | 17 +++++++----------
4 files changed, 10 insertions(+), 13 deletions(-)
diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json
index d562f76..bfe56ca 100644
--- a/.claude-plugin/plugin.json
+++ b/.claude-plugin/plugin.json
@@ -1,6 +1,6 @@
{
"name": "high-command",
- "version": "1.2.1",
+ "version": "1.2.2",
"description": "See the messages your teammates, named subagents, and other Claude Code sessions send you, grouped by peer with unread counts: a pane, a band above the prompt, and /highcommand.",
"author": { "name": "dot-agi" },
"license": "MIT",
diff --git a/README.md b/README.md
index 2fdb189..482e1b3 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
-
+
One inbox for agent-team teammates, named subagents, and other Claude Code sessions.
diff --git a/docs/usage.md b/docs/usage.md
index e7838c8..c5efb53 100644
--- a/docs/usage.md
+++ b/docs/usage.md
@@ -61,7 +61,7 @@ A roster or a thread reads from the top down:
6. In a roster, the agent lanes.
7. The dim order note, `Order: observation time. Counts cover retained messages.`
-The roster lists peers you received messages from or tried to message: peers with unread messages first, then the peer with the most recent message. In a pane of 90 columns or more, each row is one line of fixed columns under a dim header: the peer, the unread count, the time of the latest message, the sender level, the peer's last reported state with its time, and the latest message. Any `suspicious` and `(not delivered)` marks start the latest message. A narrower pane gives each row two lines (see **Narrow panes** in [Known limits](#known-limits)). `suspicious` and `unverified` show in your theme's warning color, and `(not delivered)` in its error color. The words stay, so a terminal without color loses nothing. On a row with nothing unread, the time, the state, and the message summary are dim. The arrow, the kind of message, and the marks are not. Press a peer, or its digit, to open its thread. The digits follow the roster order, so they move when a new message arrives. Rows past the ninth have no digit. A roster page shows up to 50 peers, with **Previous peers** and **More peers** on one row. When long names and messages would pass Claude Code's drawing limit, a page shows fewer, and a dim line says how many peers moved to the next page.
+The roster lists peers you received messages from or tried to message: peers with unread messages first, then the peer with the most recent message. In a pane of 90 columns or more, each row is one line of fixed columns under a dim header: the peer, the unread count, the time of the latest message, the sender level, the peer's last reported state with its time, and the latest message. Any `suspicious` and `(not delivered)` marks start the latest message. A narrower pane gives each row two lines (see **Narrow panes** in [Known limits](#known-limits)). `suspicious` shows in your theme's warning color, and `(not delivered)` in its error color. Sender labels, `unverified sender` too, are plain text: in tmux, each teammate runs in its own pane, so every message can be `unverified sender`, and a color there would hide a real `suspicious` mark. The words stay, so a terminal without color loses nothing. On a row with nothing unread, the time, the state, and the message summary are dim. The arrow, the kind of message, and the marks are not. Press a peer, or its digit, to open its thread. The digits follow the roster order, so they move when a new message arrives. Rows past the ninth have no digit. A roster page shows up to 50 peers, with **Previous peers** and **More peers** on one row. When long names and messages would pass Claude Code's drawing limit, a page shows fewer, and a dim line says how many peers moved to the next page.
A thread starts with **Back**, the peer's last reported state with its source, and a facts line: the sender label, the count of kept messages, the count of new messages, and the page. **Show identity** and **Mark read** follow the facts, or move to a line of their own when the line does not fit. A thread shows up to 20 messages per page with that peer, newest first. When long messages would pass the drawing limit, a thread page shows fewer, and a dim line says how many moved to the next page. Each message starts with `new` while it is new, its time, `←` for a message to you or `→` for a send attempt, and its kind: `message`, `finished`, `failed`, or `send attempted`. The sender label and any `suspicious` mark follow. A dim day line comes before the first message of an earlier day. The summary shows only when the sender wrote one that differs from the first line of the message. A long message shows its first 2,000 characters and says how many more are in the transcript. **Newer** and **Older** page through the kept messages, on one row with the page number and the count of messages on other pages.
diff --git a/hooks/views.tsx b/hooks/views.tsx
index 4bdf1f6..a5b7872 100644
--- a/hooks/views.tsx
+++ b/hooks/views.tsx
@@ -1,6 +1,6 @@
import type { BoxProps, ButtonProps, ElementConstructor, RenderElement, TextProps } from 'claude-code'
-import type { HighCommandAgent, HighCommandCapture, HighCommandEntry, HighCommandTrust } from '../types'
+import type { HighCommandAgent, HighCommandCapture, HighCommandEntry } from '../types'
import { isNewer, labelOf, unreadTotal, type RosterRow, type Thread } from './inbox'
import { LIMITS } from './limits'
import {
@@ -255,11 +255,6 @@ function laneTitle(model: PaneModel): string {
return `Agent observations: ${agentName(model.agents?.find(agent => agent.id === model.laneId), model.laneId)}`
}
-/** Color `warning` for the weakest sender label, as for `suspicious`; the words stay, so color only adds a signal. */
-function trustColor(trust: HighCommandTrust | undefined): TextProps {
- return trust === 'unverified' ? { color: 'warning' } : {}
-}
-
/**
* Row 1 of every view: Back where there is a level above, a dim prefix that truncates from its start, the current place
* in bold, and the dim key hint when the row and the hint fit `columns`, the band's rule. While the place fits the row
@@ -368,7 +363,9 @@ function twoLineRow(ui: HighCommandElements, args: RosterRowArgs, columns: numbe
const trust = trustLabel(row.trust)
const button = peerButton(ui, args)
const marks = dotted([
- trust !== undefined && [styled(Text, trust, trustColor(row.trust))],
+ // Every sender label is plain text: in tmux each teammate's pane makes every message `unverified sender`, and a
+ // color there would hide a real `suspicious`.
+ trust !== undefined && [trust],
row.isSuspicious && [suspicious],
isRefused(row.last) && [{NOT_DELIVERED}],
])
@@ -448,7 +445,7 @@ function columnsRow(ui: HighCommandElements, args: RosterRowArgs, stateWidth: nu
{isSameDay(row.last.at, now) ? timeLabel(row.last.at) : dayLabel(row.last.at)}
- {row.trust !== undefined && {row.trust}}
+ {row.trust !== undefined && {row.trust}}
{state !== undefined && {state}}
@@ -595,7 +592,7 @@ function entryView(ui: HighCommandElements, entry: HighCommandEntry, args: Entry
const weight: TextProps = isFresh ? { bold: true } : {}
const { arrow, word } = labelOf(entry)
const marks = dotted([
- entry.trust !== undefined && [styled(Text, trustLabel(entry.trust)!, trustColor(entry.trust))],
+ entry.trust !== undefined && [trustLabel(entry.trust)!],
entry.isSuspicious === true && [suspicious],
])
const delivery = entry.delivery
@@ -656,7 +653,7 @@ function threadView(ui: HighCommandElements, model: PaneModel, thread: Thread, a
const { Box, Text, Button } = ui
const { row, since, shown, hidden, fresh } = thread
const facts = dotted([
- row.trust !== undefined && ['Sender ', styled(Text, row.trust, trustColor(row.trust))],
+ row.trust !== undefined && [`Sender ${row.trust}`],
[count(shown.length + hidden, 'retained message')],
fresh > 0 && [`${fresh} new`],
thread.pages > 1 && [`page ${thread.page + 1} of ${thread.pages}`],
From 333b468c92e9e079c84e1fc3acf1c1a4235ded34 Mon Sep 17 00:00:00 2001
From: dot-agi
Date: Sat, 24 Oct 2026 00:43:39 +0530
Subject: [PATCH 2/2] Describe the thread's Sender line as drawn
---
docs/usage.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/usage.md b/docs/usage.md
index c5efb53..e65ef5f 100644
--- a/docs/usage.md
+++ b/docs/usage.md
@@ -63,7 +63,7 @@ A roster or a thread reads from the top down:
The roster lists peers you received messages from or tried to message: peers with unread messages first, then the peer with the most recent message. In a pane of 90 columns or more, each row is one line of fixed columns under a dim header: the peer, the unread count, the time of the latest message, the sender level, the peer's last reported state with its time, and the latest message. Any `suspicious` and `(not delivered)` marks start the latest message. A narrower pane gives each row two lines (see **Narrow panes** in [Known limits](#known-limits)). `suspicious` shows in your theme's warning color, and `(not delivered)` in its error color. Sender labels, `unverified sender` too, are plain text: in tmux, each teammate runs in its own pane, so every message can be `unverified sender`, and a color there would hide a real `suspicious` mark. The words stay, so a terminal without color loses nothing. On a row with nothing unread, the time, the state, and the message summary are dim. The arrow, the kind of message, and the marks are not. Press a peer, or its digit, to open its thread. The digits follow the roster order, so they move when a new message arrives. Rows past the ninth have no digit. A roster page shows up to 50 peers, with **Previous peers** and **More peers** on one row. When long names and messages would pass Claude Code's drawing limit, a page shows fewer, and a dim line says how many peers moved to the next page.
-A thread starts with **Back**, the peer's last reported state with its source, and a facts line: the sender label, the count of kept messages, the count of new messages, and the page. **Show identity** and **Mark read** follow the facts, or move to a line of their own when the line does not fit. A thread shows up to 20 messages per page with that peer, newest first. When long messages would pass the drawing limit, a thread page shows fewer, and a dim line says how many moved to the next page. Each message starts with `new` while it is new, its time, `←` for a message to you or `→` for a send attempt, and its kind: `message`, `finished`, `failed`, or `send attempted`. The sender label and any `suspicious` mark follow. A dim day line comes before the first message of an earlier day. The summary shows only when the sender wrote one that differs from the first line of the message. A long message shows its first 2,000 characters and says how many more are in the transcript. **Newer** and **Older** page through the kept messages, on one row with the page number and the count of messages on other pages.
+A thread starts with **Back**, the peer's last reported state with its source, and a facts line: the word Sender with the sender level, such as `Sender unverified`, the count of kept messages, the count of new messages, and the page. **Show identity** and **Mark read** follow the facts, or move to a line of their own when the line does not fit. A thread shows up to 20 messages per page with that peer, newest first. When long messages would pass the drawing limit, a thread page shows fewer, and a dim line says how many moved to the next page. Each message starts with `new` while it is new, its time, `←` for a message to you or `→` for a send attempt, and its kind: `message`, `finished`, `failed`, or `send attempted`. The sender label and any `suspicious` mark follow. A dim day line comes before the first message of an earlier day. The summary shows only when the sender wrote one that differs from the first line of the message. A long message shows its first 2,000 characters and says how many more are in the transcript. **Newer** and **Older** page through the kept messages, on one row with the page number and the count of messages on other pages.
A send shows `send attempted` with the recipient and text that High Command observed. Its reported send result shows on a line of its own, in the error color when the send was not delivered. A dim note above the first send of a page says that sends show observed text and that a reported result is not a receipt. **Show send details** shows the refusal reason, up to 2,000 characters. When available, it also shows the core lines: the recipient, text, and queue outcome that Claude Code itself received for the latest call. A dim note above the core lines says that this evidence covers only the latest traced call. It does not prove that the recipient read the message. **Hide send details** closes them again. `/highcommand` labels sends as attempts.