Human Harness¶
Human Harness — персональный рабочий ассистент сотрудника поверх Control Plane: показывает, что требует решения человека, помогает поручать работу и решать согласования, помнит факты через память платформы. Статья для оператора и для инженера, который запускает Human Harness на рабочей машине.
Срез v0
Human Harness — ранний срез продукта (TAI-ADR-0033, основа — TAI-ADR-0024 «Human Work Surface»). Часть действий доступна только через ассистента, проекции Focus/Work/Updates считаются на хосте харнесса, а не сервером. Контракты могут меняться.
Что это¶
Human Harness собран как набор плагинов для DeepSeek Harness (DSH) без форка: upstream
даёт цикл агента, веб-клиент и PWA-оболочку, а пакеты @taimen/* — нативную связь с
сервисами платформы.
flowchart LR
U(("Человек")) --> UI["DSH Web UI (PWA)"]
UI --> HOST["DSH host (Node,<br/>на машине человека)"]
subgraph HOST_P["Плагины Taimen в host"]
ID["@taimen/dsh-identity<br/>PAT → access token"]
CPP["@taimen/dsh-control-plane<br/>сессия, taimen_*, /api/taimen/*"] <!-- drift:external human-harness (сабмодуль после M3.4) -->
UIP["@taimen/dsh-client-ui-human-harness<br/>Focus / Work / Updates"]
B["@taimen/dsh-human-harness<br/>bundle + persona"]
end
HOST --- HOST_P
ID -- "exchange" --> IAM["IAM"]
CPP -- "HTTPS, bearer" --> CP["Control Plane<br/>задачи, approvals, события,<br/>контекст и память"]
Термины: в документации ядра эта поверхность называется Human Work Surface (HWS);
«Human Harness» — продуктовое имя сборки. Это не harness_type исполнения: харнесс
регистрируется обычной сессией Control Plane как клиент human principal'а
(harness.type = deepseek-harness, clientName = taimen-human-harness).
Принципы¶
- Нативно, без MCP-моста. Инструменты модели и панели говорят с Control Plane типизированным клиентом; identity — обмен PAT в IAM.
- Память — только через Control Plane.
POST /api/v1/contextиPOST /api/v1/observations; прямого клиента memory-service у харнесса нет. - Ничего не остаётся только в переписке. Просьба «поручи», «создай» заканчивается типизированной задачей; решение по согласованию — approval; факт для памяти — observation.
- Каждая мутация — с подтверждением человека. Seam
user-approvalDSH спрашивает подтверждение; без него мутация отказывает (fail closed). Отключается только для отладки (TAIMEN_CONFIRM_MUTATIONS=false). - Проекции детерминированы. Focus / Work / Updates — чистые функции над задачами,
approvals и событиями; ответ помечен
projection: human-harness-host. - PAT не попадает в браузер. Браузер ходит в маршруты
/api/taimen/*host-половины под cookie сессии DSH.
Экраны¶
| Экран | Что показывает |
|---|---|
| Focus | «что требует вас сегодня», ранжированно: ожидающие вашего решения approvals (группа decide; gate — выше), задачи на проверку (review), ваши заблокированные и просроченные задачи (act), близкие сроки (upcoming); у каждого пункта — правило (ruleKey) и причина (reasonCode) |
| Work | все ваши обязательства по корзинам: active (назначено мне), review, waiting, delegated (я владелец, исполняет другой), blocked, completed (последние 20) |
| Updates | что произошло без вас (события), с отметкой «прочитано» |
| Search | поиск задач в выбранном Workspace |
| Ассистент | беседа DSH с persona Human Harness и инструментами taimen_* |
Шапка tenant / workspace ▾ выбирает Workspace ядра (дерево GET /api/v1/workspaces/tree).
Выбор хранится per-principal в $DSH_HOME/taimen/read-state.json и работает как scope:
задачи запрашиваются с workspaceId и includeDescendants, approvals, runs и события
фильтруются по Workspace с потомками, поиск ограничен им же. «Все workspace» снимает scope.
Действия из панелей¶
- Карточка approval в Focus: «Согласовать» / «Отклонить» открывают диалог с объектом,
эффектом, механикой и обратимостью; комментарий при отклонении обязателен. Подтверждение
уходит в
POST /api/taimen/approvals.decide, host выполняетPOST /api/v1/approvals/{id}:approve|rejectсIdempotency-Key, после чего проекции перечитываются. - Смена статуса задачи — маршрут
POST /api/taimen/tasks.transitionс версией дляIf-Match; в интерфейсе карточки пока не выведена, делается через ассистента.
Инструменты ассистента¶
| Инструмент | Назначение |
|---|---|
taimen_whoami |
кто я, текущий scope |
taimen_workspaces, taimen_select_workspace |
дерево Workspace и смена scope |
taimen_focus |
проекция Focus с причинами (rule_key, reasonCode, источники) |
taimen_work |
проекция Work |
taimen_updates, taimen_acknowledge_updates |
что изменилось без меня; отметить прочитанным |
taimen_get_task, taimen_find_tasks |
задача; поиск (по умолчанию в текущем scope) |
taimen_create_task, taimen_update_task |
создать и изменить задачу — после показа черновика и подтверждения |
taimen_comment_task |
комментарий в тред задачи |
taimen_decide_approval |
решение по согласованию |
taimen_recall, taimen_remember |
вспомнить из памяти (с provenance) и сохранить факт |
Persona ассистента требует: сначала показывать то, что требует решения; отделять текущее
состояние, содержание источников, память и собственный вывод; не обходить 403,
task_claimed, stale_claim, а объяснять их; ссылаться на объекты их идентификаторами.
Права principal'а¶
Human Harness работает под human principal'ом. Чтобы панели были полными, binding должен давать, помимо обычных прав на задачи:
| Право | Без него |
|---|---|
approvals.read |
пуста секция Decide в Focus |
approvals.decide |
нельзя решать согласования |
approvals.manage |
нельзя запрашивать и отменять согласования |
task_types.read |
пуста секция Review |
workspaces.read |
нет выбора scope |
observations.write |
taimen_remember отказывает |
Ответ проекций несёт degraded[] — список того, что не удалось прочитать; панель это
показывает, а не делает вид, что данных нет.
Установка и запуск¶
Требуется Node.js ≥ 22.19, pnpm 11 (через corepack), PAT человека в
~/.config/iam/credentials.json и провайдер модели, настроенный в самом DSH
(Settings → Models; ключ модели хранит DSH).
cd human-harness
pnpm install
pnpm build # tsc -b + сборка host lib и браузерного бандла
pnpm test # проекции, клиент, identity
pnpm smoke # живой Control Plane: обмен PAT → whoami → focus/work/updates
pnpm profile:init # профиль dsh `human-harness` = шаблон web + ссылки на пакеты
pnpm dev # сборка и `dsh --profile human-harness web`
Переменные окружения¶
Читаются при старте процесса (packages/bundle/cordis.patch.yml):
| Переменная | По умолчанию | Смысл |
|---|---|---|
TAIMEN_IAM_URL |
http://taimen.localhost/iam |
IAM (issuer) |
TAIMEN_IAM_TENANT |
— (обязательна) | IAM tenant id |
TAIMEN_IAM_PRINCIPAL |
— | IAM principal id; нужен, если на машине несколько PAT одного tenant'а |
TAIMEN_CONTROL_PLANE_URL |
http://taimen.localhost |
базовый URL Control Plane |
TAIMEN_CONFIRM_MUTATIONS |
включено | false — отключить подтверждение мутаций (только для отладки) |
DSH_HOME |
~/.dsh |
домашний каталог DSH: профили, настройки, read-state |
PAT берётся из ~/.config/iam/credentials.json (ключ issuer|tenant[|principal]) либо из
IAM_PLATFORM_ACCESS_TOKEN вместе с IAM_CREDENTIAL_MODE=environment, обменивается на
access token audience control-plane со scopes control-plane:read и
control-plane:write и обновляется за 60 секунд до истечения. Сессия Control Plane
открывается при старте и поддерживается heartbeat'ом (TTL 300 с).
Версия Node
Лончер upstream запускает CLI только под import.meta.main, которого нет в Node
< 22.18 и < 24.2 — на таких версиях dsh молча завершается с кодом 0. Скрипты
репозитория используют обёртку scripts/dsh.mjs (pnpm dsh …), которая вызывает CLI
явно.
Ограничения текущего среза¶
- Одна беседа на Workspace; список сессий и файловая панель DSH не смонтированы.
- Смена статуса задачи с карточки не выведена в интерфейс; прочие мутации — через ассистента с подтверждением.
- Тексты интерфейса — русские; переключатель языка DSH знает только свои локали.
- Persisted attention items, отложить/напомнить, отдельные экраны Search/Ask — вне среза.
- Версия DSH закреплена; при её обновлении первыми проверяются контракты слотов, регистрации
маршрутов и инструментов,
ctx.approval.requestи формат клиентского бандла.
Human Harness или MCP-плагин¶
| MCP-плагин для Claude Code | Human Harness | |
|---|---|---|
| Для чего | работа в коде репозитория по задаче | внимание, решения, поручения |
| Центр | задача, которую я выполняю | то, что требует моего решения |
| Claim и run | да, в явном цикле | нет, харнесс не исполняет задачи |
| Approvals | cp_approve / cp_reject |
карточка в Focus, taimen_decide_approval |
| Память | cp_get_context, cp_remember |
taimen_recall, taimen_remember |
| Транспорт | MCP → control-plane-mcp |
нативный клиент в плагинах DSH |