Перейти к содержанию

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-approval DSH спрашивает подтверждение; без него мутация отказывает (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

См. также