tm2027 · mobile companion · борд вариантов

Deckhand — флот в кармане, вход по QR

Мобильный компаньон деки: стена внимания + точечные действия, без эмулятора терминала. Телефон сам вступает в tailnet (встроенный userspace Tailscale) — один скан QR = подключён. Дизайн прогнан через /grill-ai (codex · gpt-5.6-sol · ultra): 10 решений, лог внизу. ★ — выбор гриля; отвечать можно строкой вида 2A 3A 4B 5A 6C 7A 8A 9A.

1

Концепция

Что это за приложение. Гриль выбрал 1A: видно весь флот, действия точечные, ограничение herdr «один мост на пан» не нарушается — чтение идёт снапшотами экрана, не attach'ем.

1AFleet glance + steer★ выбор гриля

Стена статусов агентов (снапшоты экранов через шлюз перед herdr-сокетом) + несколько ценных действий на пан: approve/deny, промпт, рестарт. Никакого терминала-эмулятора.

1BПолный мобильный терминал

Настоящий эмулятор с клавиатурой и скроллбеком — дека, пересобранная под тач. Дорого, дерётся за мост с декой, на телефоне почти не нужно.

1CNotification-first

Только событийный инбокс с кнопками; экраны панов — вторичны. Слишком слепо: не видно, чем флот занят.

1+

Четыре парадигмы управления

Четыре радикально разных ментальных модели «рулить флотом с телефона» — не вариации списка, а разные метафоры. Любая может заменить attention stream целиком или жить рядом с ним режимом. Переключай и выбирай: П1 Экипаж · П2 Пульт · П3 Нуль-экран · П4 Котодек.

💬 П1 · Экипаж
🎛️ П2 · Пульт
👻 П3 · Нуль-экран
🐾 П4 · Котодек

Метафора: флот = чаты в мессенджере; каждый пан — контакт, которому отвечаешь как человеку. Промпт агенту — первоклассное действие: клавиатура уже под пальцем, история решений читается как переписка.

9:41▲▲▲ ●●●
Экипаж
1 ждёт ответа · 4 работают
Вся дека
broadcast: промпт всем панам
📌
claude · pane 1 · tm2027
Bash(git push origin main)? [y/n]
2m
1
codex · pane 2
✓ cargo test: 214 passed
12m
𝕏
grok · pane 5
✖ exited 101
34m
kimi · pane 7
печатает…
now
список чатов · «ждут → упали → работают»; свайп вправо = approve
9:41▲▲▲ ●●●
claude · pane 1
tm2027
✔ tests 41/41 · commit c873d9c
⚠ Permission required Bash(git push origin main)?
Разрешить
Отклонить
✳ claude · main ✔ 41 passed (2.3s) ⚠ git push origin main? [y] allow · [n] deny
y
✓ доставлено в пан · push идёт…
Промпт для claude…
чат с паном · снапшот приходит «фото», ответ = реплика
LOOP

Пуш «claude просит разрешение» → тап → чат на пузыре с запросом → чип [y] или ответ текстом → галочка «доставлено», чат уходит вниз.


ЖЕСТЫ

Свайп по чату вправо = мгновенный approve; long-press по аватару = peek-снапшот; pull-down в чате = обновить «фото».

Сильнее streamПромпты — главное действие, не спрятанная кнопка; полная история диалога и решений по каждому пану — тредом.
СлабееНет взгляда на весь флот разом — молчащие скрыты списком; нет общей временной оси событий.
Лучший моментВечер на диване: «веду трёх агентов параллельно», главное — писать следующие промпты, а не тушить пожары.

Метафора: флот = каналы аппаратного микшера; ты — звукорежиссёр деки. Весь флот одним взглядом, без скролла и очереди; mute/solo = управление приоритетом внимания.

DECKHAND · MIXER1 WAITING
P1 CLD
cargo build --relea
SOLO
ACK
P2 CDX
cargo test --works
SOLO
ACK
P3 CLD
git push origin ma
SOLO
y?
P5 GRK
exit 101
SOLO
RST
P7 KMI
thinking · 84k tok
SOLO
ACK
5▶ 1⏳ 1✖MUTE ALL 30mALL ≠ QUIET
панель целиком · VU-метр = скорость изменения снапшота
LOOP

Глянул → P3 горит янтарным, по ЖК бежит «git push origin main» → нажал мигающий [y?] → лампа зелёная, VU ожил, панель снова вся зелёная.


APPROVE

Короткое нажатие [y?] = approve с haptic-щелчком; долгое удержание с прогресс-кольцом = deny; тап по ЖК-полоске = полный текст запроса.


ЖЕСТЫ

[SOLO] = полноэкранный монитор пана; фейдер вниз = «этот пан меня сегодня не дёргает».

Сильнее streamСемь панов считываются за полсекунды без скролла; mute/solo — управление приоритетом, которого у stream нет вовсе.
СлабееТекст на канале микроскопический — дифф всё равно через drill-in; промпт агенту не родное действие для метафоры.
Лучший момент«Дежурный по машинному залу»: телефон в док-станции как второй монитор, взгляд раз в минуту.

Метафора: приложения нет — флот живёт слоем поверх ОС: лок-скрин, виджеты, Live Activity, часы. Открыть полный app = провал парадигмы. Время реакции ~2 секунды из кармана.

деки 5▶ 1⏳ 1✖
9:41
понедельник, 25 августа
⌁ DECKHAND · сейчас
grok · pane 5
Bash(cargo test)?
Разрешить
Отклонить
Экран
long-press = 10 строк снапшота вокруг запроса;
inline-reply = промпт агенту прямо с лока
лок-скрин · approve там, где ты уже есть
9:41▲ ● ▮
DECKHAND · ФЛОТ
P1
P2
P3git push?
P5✖101
P4
P6
P7
+QR
y — разрешить P3
n
виджет 4×2 · кнопки прямо на виджете, app не открывается
9:41
⏳1
P3 · git push?
y
n
часы · компликация «⏳1», deny через удержание
LOOP

Телефон в кармане → фирменный haptic-ритм пана 3 (два коротких = claude) → поднял, не разблокируя → баннер на локе → тап [Разрешить] → «✓ y отправлен», пилюля стала «6▶ 0⏳».


ЖЕСТЫ

Каждому пану свой вибро-паттерн — узнаёшь, кто зовёт, не доставая телефон.

Сильнее streamApprove за ~2 секунды без ритуала «открыть и найти карточку»; мониторинг бесплатен — флот виден при каждом взгляде на часы/лок.
СлабееСложные решения (40 строк диффа) на локе не решаются; лимиты нотификаций iOS/Android диктуют дизайн.
Лучший моментДень вне дома — прогулка, магазин, зал: агенты мелют часами, твоя роль — не стать бутылочным горлышком.

Метафора: агенты = 8-битные коты-питомцы на полке; состояние флота читается позами зверей. Родная эстетика деки (кот-лапа, ZX, CRT) — приложение ощущается частью tm2027, а не дженерик-дашбордом.

КОТОДЕК5 работают · 1 просит · 1 спит
git push origin main? [y/n] погладь = y · смахни = n
claude·p1 ⌨
claude·p3 ⚠
zZ
codex·p2 ✔
grok·p5 ✖101
kimi·p7 ⌨
🐟🐟🐟перетащи рыбку на кота = промпт · потряси лежащего = рестарт · pinch = его глазами
пиксель-комната в CRT · поза = статус, облачко = запрос
LOOP

Кот с поднятой лапой → тап → облачко раскрылось в полный запрос + 6 строк контекста → погладил свайпом → мурчание (haptic), лапа опустилась, кот вернулся к клавиатуре.


APPROVE

Поглаживание = y (сердечко-пиксель); флик облачка прочь = n (кот отворачивается). Опасные команды — красная рамка, поглаживание в два прохода.


ЖЕСТЫ

Pinch-zoom на кота = «взгляд его глазами» — полноэкранный снапшот пана в CRT-рамке.

Сильнее streamПозы считываются периферийным зрением быстрее списков; дежурство — приятный ритуал, заходишь чаще и ловишь застрявших раньше пуша.
СлабееНизкая плотность: команды и логи только по тапу, очередь из пяти запросов разбирается медленнее; красный exit 101 выглядит мило — риск недооценить.
Лучший моментРасслабленный вечерний надзор, «проведать зверей» между делами.
2

Онбординг: скан QR = подключён

Дека минтит одноразовый pre-auth ключ (TTL 10 мин, tag:mobile) через Tailscale API и показывает QR = {authkey, gateway, nonce}. Телефон сканирует → встроенный Tailscale вступает в tailnet → шлюз меняет nonce на долгоживущий device-token (Keychain/Keystore) и сразу отзывает ключ. VPN-профиль не нужен, официальное приложение Tailscale не нужно.

tm2027 — подключить телефонEsc
одноразовый ключ · tag:mobile
истечёт через 09:32 — сгенерён по требованию
дека · Ctrl+Q → QR с таймером
9:41▲▲▲ ●●●
Подключить деку
наведи на QR в tm2027
Ввести код вручную
скан · первый запуск = сразу камера
9:41▲▲▲ ●●●
Подключаюсь…
ключ принят Tailscale
вступил в tailnet 100.87.14.2
пейринг со шлюзом (nonce → token)
·ключ отозван, токен в Keychain
3–5 секунд · ZX-лента живёт и тут
9:41▲▲▲ ●●●
Дека на связи
7 панов · 5 работают · 2 ждут
К флоту
device-token сохранён ·
про QR можно забыть
готово · повторный вход — без единого экрана
2AОдин скан, ноль вопросов★ выбор гриля

Флоу выше: скан → всё остальное само. Утечка QR ограничена одним заходом в 10-минутном окне, ключ отзывается сразу после обмена nonce.

2B+ подтверждение на деке

После вступления в tailnet дека показывает «новое устройство?» с emoji-хешем, совпадающим с экраном телефона. Сильнее против перехвата QR, на один шаг длиннее.

2CРучной fallback

Не вариант, а дополнение: под сканером «Ввести код вручную» — короткий код с деки, когда камера/экран недоступны. Дешёвый страховочный трос к 2A.

3

Домашний экран телефона

Гриль выбрал 3A — attention stream: дом показывает только то, что требует руки; весь флот — второй таб. Ниже 3A в обоих нативных скинах (iOS / Material You) + альтернативы 3B/3C.

9:41▲▲▲ ●●●
Внимание
2 ждут · 5 работают · шлюз 12 ms
claude · pane 3ждёт 2 мин
Bash(git push origin fix/rail-cache)
Разрешить
Отказать
grok · pane 7 упал4 мин
exit 101 · DirectWrite os error 3
Перезапустить
Экран
codex · pane 1 закончил12 мин
PR #207 готов к ревью — смахни, чтобы убрать
Внимание
Флот
Дека
3A · iOS · attention stream ★
9:41▲ ● ▮
Внимание
2 ждут · 5 работают · шлюз 12 ms
claude · pane 32 мин
Bash(git push origin fix/rail-cache)
Разрешить
Отказать
grok · pane 7 упал4 мин
exit 101 · DirectWrite os error 3
Перезапустить
Экран
Внимание
Флот
Дека
3A · Android · Material You, тот же скелет
9:41▲▲▲ ●●●
Всё тихо
кот спит — никто тебя не ждёт
▶ 7 панов работают
Внимание
Флот
Дека
3A · пустое состояние · «all quiet» ведёт во флот
9:41▲▲▲ ●●●
Флот
7 панов · main-workspace
claude · pane 341:32
grok · pane 7exit 101
codex · pane 112:03
kimi · pane 455:10
qwen · pane 508:47
shell · pane 2idle
Внимание
Флот
Дека
таб «Флот» — 3B-список живёт здесь
9:41▲ ● ▮
Флот
сетка мини-снапшотов
pane 3
✳ claude > git push… ⚠ permission [y] / [n]
pane 1
✳ codex tests 41/41 building… █▒▒▒▒ 23%
pane 7
✳ grok exit 101 DirectWrite os error 3
pane 4
✳ kimi thinking… tokens 84k ◐
Внимание
Флот
Дека
таб «Флот», вид-сетка — 3C как опция таба
3AAttention stream

Минимальное время до действия; пустое состояние явно ведёт во флот.


3BInbox-список

Один ряд на агента, свайп-действия. Не пропал: это вид таба «Флот».


3CСетка mission control

Мини-снапшоты плиткой. Тоже жив — второй вид таба «Флот» (переключатель списка/сетки).

4

Карточка внимания

Анатомия главного элемента attention stream. Вопрос: сколько контекста класть в карточку.

4AКомпакт
claude · pane 3
Bash(git push origin fix/rail-cache)
Разрешить
Отказать

Вопрос + две кнопки. Быстро, но решение вслепую.

4B+ контекст-сниппетрекомендую
claude · pane 3ждёт 2 мин
✔ tests 41/41 green ✔ commit c873d9c ⚠ Bash(git push origin fix/rail-cache)
Разрешить
Отказать
Экран

3 последние строки терминала в mono — видно, что привело к вопросу. «Экран» — в полный снапшот.

4C+ risk и таймер
high claude · pane 3
Bash(rm -rf target/ && cargo clean)
автоотказ через 09:12, если промолчать
Разрешить
Отказать

Бейдж риска от шлюза + автоотказ по таймеру. Хорош как слой поверх 4B для high-risk.

5

Экран пана: snapshot viewer

Точный monospace-рендер экрана пана (обновление ~1 c, пока открыт), пинч-зум кегля, снизу панель действий. Read-only — мост деки не отнимаем. Варианты — про «хром» вокруг терминала.

9:41▲▲▲ ●●●
‹ pane 3 · claude⚠ 41:32
claude · fix/rail-cache Running tests… ✔ 41 passed (2.3s) git commit ✔ c873d9c rail cache memo ⚠ Permission required Bash(git push origin fix/rail-cache) [y] allow · [n] deny tokens 82k · 41 min · $4.10
✔ Разрешить
✖ Отказ
5A · нативный хром, тёмный терминал ★
‹ PANE 3 · CLAUDE⚠ 41:32
claude · fix/rail-cache ● Running tests… ✔ 41 passed (2.3s) ● git commit ✔ c873d9c rail cache memo ⚠ PERMISSION REQUIRED Bash(git push origin fix/rail-cache) [y] allow · [n] deny tokens 82k · 41 min
✔ Y
✖ N
5B · полный CRT — красиво, хуже на солнце
claude · fix/rail-cache Running tests… ✔ 41 passed git commit ✔ c873d9c ⚠ Permission required Bash(git push…) [y] / [n]
5C · fullbleed + плавающие пилюли
6

Пуш и approve с лок-скрина

Шлюз шлёт минимальные «опаковые» пуши напрямую в APNs/FCM (без посредников; данные агента не покидают tailnet — детали приложение забирает уже внутри). Гриль выбрал 6C — двухуровневый approve: кнопки прямо в пуше только для allowlist-действий с шлюза, остальное — deep-link в контекстный шит.

9:41
понедельник, 25 августа
⌁ DECKHAND · сейчас
claude ждёт разрешения
Bash(git push origin fix/rail-cache)
Разрешить
Отказать
low-risk по allowlist — кнопки прямо тут:
фоновая задача поднимает tailnet и шлёт ответ
6 · iOS лок-скрин · happy path без открытия UI
9:41▲ ● ▮
⌁ Deckhand · pane 3 · сейчас
claude ждёт разрешения
Bash(git push origin fix/rail-cache)
РазрешитьОтказатьОткрыть
⌁ Deckhand · pane 7
grok упал (exit 101)
ПерезапуститьОткрыть
6 · Android-шторка · те же действия
9:41▲▲▲ ●●●
Внимание
high risk
claude · pane 3 хочет:
$ rm -rf target/ && cargo clean освободит 41 GB ⚠ необратимо · вне allowlist
Разрешить
Отказать
Показать живой экран пана ›
6 · high-risk · тап по пушу → шит с контекстом
6AКнопки на всём

Approve/Deny в каждом пуше. Быстрее всего — и опаснее всего: слепой allow на rm -rf.

6BВсегда через шит

Любой пуш только открывает контекст. Безопасно, но рутинные «git push» начинают раздражать.

6CДвухуровневый★ выбор гриля

Кнопки в пуше — только для allowlist-действий (правится на шлюзе); остальное — шит. Риск: allowlist становится security-critical — держать его коротким и явным.

7

iPad

Гриль выбрал 7A — master-detail: слева attention + флот одной колонкой, справа живой снапшот. NavigationSplitView / ListDetailPaneScaffold — складной телефон получает стековую навигацию бесплатно.

Deckhand
внимание · 2
claude · pane 3
git push origin fix/rail-cache
grok · pane 7
exit 101 · перезапустить?
флот · 5
claude · 341:32
codex · 112:03
kimi · 455:10
qwen · 508:47
shell · 2idle
pane 3 · claude · fix/rail-cache⚠ ждёт 2 мин
claude · fix/rail-cache Running tests… ✔ 41 passed (2.3s) git commit → c873d9c rail cache memo ⚠ Permission required Bash(git push origin fix/rail-cache) [y] allow · [n] deny tokens 82k · 41 min · $4.10
✔ Разрешить
✖ Отказать
⌨ Промпт
↻ Рестарт
7A · master-detail ★ · выбор слева, живой экран справа
claude · 3
✳ claude ⚠ git push? [y] / [n]
codex · 1
✳ codex tests 41/41 █▒▒▒ 23%
grok · 7
✳ grok exit 101
kimi · 4
✳ kimi thinking ◐
qwen · 5
✳ qwen rg -n "epoch"
shell · 2
$ _
7B · mission-control wall — стена деки; красиво, но дальше от «глянул-действовал»
8

Раскладушки

Развёрнутая книжка = тот же master-detail (шов уходит в границу колонок). Полусложенный tabletop — своя поза: экран сверху, руки снизу.

Deckhand
внимание · 2
claude · 3
git push origin…
grok · 7
exit 101
флот · 5
claude41:32
codex12:03
kimi55:10
pane 3 · claude
claude ✔ 41 passed ⚠ Permission git push origin… [y] / [n]
8A · развёрнутая книжка · шов = граница master/detail
claude · pane 3 ✔ tests 41/41 ⚠ Permission required Bash(git push origin fix/rail-cache)
✔ Разрешить
✖ Отказать
⌨ быстрый промпт агенту…
↻ Рестарт
▦ Флот
8B · tabletop-поза · терминал сверху, пульт снизу
9

Визуальный язык

Гриль выбрал 9A: структура и контролы — нативные (дневная читаемость, привычные жесты), душа деки — в акцентах: глифы статусов ▶ ✔ ✖ ⚠, пиксельный кот в пустых состояниях, DONE-вспышка, ZX-лента в онбординге, терминал внутри снапшота.

9ANative chrome, 8-bit soul★ выбор гриля
SF / Roboto · системный тип
кот · DONE-flash · ZX-лента — только там, где несут смысл
9BFull deck skin
MONO EVERYTHING
▶ RUN ✔ DONE ✖ FAIL
CRT · scanlines · ZX
максимум бренда, минимум солнца
9CNeutral utility
Стоковые компоненты
Без глифов, без кота, без вспышек.
Быстрее всех строится — теряет язык статусов, который ты уже читаешь бегло.
10

Имя

Гриль имена не выбирал — это твой вкус. Мой фаворит — Deckhand.

Deckhand рекомендую

«матрос при деке» — компаньон, а не замена. Читается на обоих языках.

H
Herdr Pocket

Прямая принадлежность экосистеме herdr.

L
Leash

«поводок для флота» — дерзко и коротко.

G
Glance

Про суть — «глянул и действовал», но слишком generic.

Архитектура (решения 2, 4, 8 гриля)

ТелефонSwiftUI / Compose
Go-ядро (gomobile):
libtailscale + клиент + стейт
Gatewayмаленький Go HTTP/WS
перед herdr unix-сокетом
снапшоты · события · действия · allowlist
herdrWSL · protocol 20
паны · агенты · события
APNs / FCMтолько «опаковый» пинг от шлюза напрямую —
без своих серверов-посредников; детали приложение тянет из tailnet

Лог гриля (codex · gpt-5.6-sol · ultra)

#РешениеВыборПочему (одной строкой)
1КонцепцияFleet glance + steerвидно флот + действия, без нарушения «один мост на пан»
2СвязностьВстроенный userspace Tailscale (libtailscale)единственный путь к «скан → подключён» без чужого VPN-слота
3Ключ и пейрингОдноразовый ключ TTL 10 мин + nonce → device-tokenутечка QR ограничена одним заходом; ключ отзывается сразу
4СтекGo-ядро (gomobile) + SwiftUI и Compose оболочкирискованное (VPN, сеть) — общее; UI — нативный и маленький
5Дом телефонаAttention stream + таб «Флот»минимум времени до действия; «всё тихо» ведёт во флот
6Экран панаSnapshot viewer + панель действийчестный экран TUI без brittle-парсинга и без attach
7Большие экраныMaster-detail splitвнимание-первым + место для живого снапшота
8УведомленияСвой вариант: шлюз → APNs/FCM напрямую, пуш «опаковый»надёжный фон без третьих сервисов; данные — только в tailnet
9Approve с пушаДвухуровневый: кнопки для allowlist, шит для остальногоскорость для рутины, контекст для опасного; allowlist = security-critical
10Визуальный языкNative chrome, 8-bit soulдневная читаемость + язык статусов деки там, где он несёт смысл