AI HARNESS ·
1 / 1
Personal AI Harness · опыт ИТ-менеджера

Harness для
проектной работы

Мой harness — обвязка вокруг LLM-агента для ведения ИТ-проектов. Он сам расшифровывает встречи, раскладывает решения и поручения по проектам, следит за задачами в Redmine, держит свежим статус каждого из 10 проектов и раз в день присылает сводку. Решения по задачам принимаю я.

Работает на домашнем железе круглосуточно · агент Hermes + ядро данных RedProject · не про код продукта, а про управление проектами
ВНИЗ — ЧТО ТАКОЕ HARNESS · ВПРАВО — РАЗДЕЛЫ
Термин

Модель — заменяемая часть. Ценность — в обвязке

Harness — всё, что превращает «умный чат» в работающую систему. Модель у агента уже менялась, и не раз, а обвязка всё это время только росла.

Данные

Откуда агент знает контекст

Встречи, Redmine, заметки — и одно место, где хранится состояние, а не четыре

Могу подключить Jira, почту, Confluence — или совсем убрать Obsidian
Инструменты

Что агенту можно делать

Узкие MCP-инструменты вместо «полного доступа к файлам и shell»

Могу дописать инструмент под новый класс задач или отобрать лишний
Триггеры

Когда агент просыпается

Расписание и события, а не «когда я вспомнил и открыл чат»

Могу запускать чаще, реже, по вебхуку или только в рабочие часы
Гейты

Когда LLM вообще звать

Детерминированный код решает, есть ли что обрабатывать, — модель не тратит токены вхолостую

Могу поменять, что считать изменением, порог и модель на каждом шаге
Контроль

Кто принимает решения

Агент предлагает, человек подтверждает; каждое изменение оставляет след

Могу включить автоприменение уверенных предложений, а на ревью оставить остальные
Доставка

Как результат доходит до меня

Одно сообщение в день и витрина, а не поток уведомлений

Могу перенаправить в Slack, почту, канал команды или вики

Главное свойство harness — гибкость: каждый из шести пунктов — отдельная ручка. В своей системе любой параметр можно добавить, убрать или переделать, не трогая остальные. Дальше — как эти ручки выставлены у меня.

1 Где всё физически крутится

На чём это всё физически крутится

NAS держит инфраструктуру и сам агент — он работает круглосуточно. Ubuntu-сервер берёт GPU-нагрузку. MacBook — место, где я разрабатываю harness. VPS — единственное, что смотрит в интернет.

NAS

агент и ядро данных · 24/7
CPU · Celeron N5105, 4 ядра
RAM · 16 ГБ
SSD · 1 ТБ, RAID1
HDD · 15 ТБ, RAID0
45контейнеров
6из них — harness

Ubuntu-сервер

GPU-нагрузка
CPU · i5-13600K, 20 потоков
RAM · 32 ГБ
GPU · RTX 5080, 16 ГБ VRAM
SSD · 2×NVMe, ~3 ТБ
WhisperXрасшифровка встреч
Ollamaэмбеддинги

MacBook Pro

разработка harness
Chip · Apple M4
Ядра · 10 (4P + 6E)
RAM · 16 ГБ
SSD · ~500 ГБ
gitрепозиторий RedProject
2ИИ-разработчика

VPS

публичная точка · Казахстан
CPU · 1 vCPU
RAM · 1.8 ГБ
SSD · 40 ГБ
OS · Ubuntu 24.04
15сервисов

Контейнеры harness на NAS: hermes (агент) · project-radar-postgres (ядро данных) · project-kanban (API и доска) · project-dashboard (витрина) · qdrant (векторный индекс) · n8n + syncthing (конвейер встреч). Всё, кроме VPS, — домашнее железо; из облака только модели.

2 Какие LLM я использую

Какие LLM и для чего

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

OpenAI (подписка)

gpt-5.6-terra — «мозг» агента Hermes Work; Codex — второй ИИ-разработчик harness

$20/мес

Claude (подписка)

Sonnet 5 в основном, изредка Opus 5 — Claude Code как основной разработчик harness и разовые глубокие задачи

$20/мес

Корпоративная LLM

внутри обёртки OpenCode — для рабочих задач внутри контура компании

корпоративно

Ollama (локально, RTX 5080)

nomic-embed-text — эмбеддинги для поиска агента по хранилищу; qwen3 / deepseek-r1 / mistral 12–14B для экспериментов

$0

OpenRouter

qwen3.7-flash — дешёвая модель для домашнего профиля того же Hermes и для старта новых профилей

$3–5/мес

Gemini

Gemini 3.1 Pro

~$30/год
3 Хранилище знаний текст

Obsidian, который сам себя обслуживает

Раньше здесь была сетевая свалка заметок без единой логики. Сейчас агент сам раскладывает информацию по смысловой структуре, а всё хранилище проиндексировано для поиска по смыслу.

Подход Андрея Карпати

Переложить рутину обработки информации с человека на LLM. Вы собираете «сырые» данные (статьи, PDF, записи), а LLM их перерабатывает: пересказывает, выделяет концепты, строит связи, обновляет существующую базу.

~1000файлов в индексе, ~3700 фрагментов
30 мининкрементальная переиндексация — только изменённые файлы
вход + витринаObsidian больше не база данных: состояние проектов живёт в ядре (раздел 8)
Obsidian
Syncthing → NAS
Qdrant
Hermes
3 Хранилище знаний визуал

Вся структура хранилища

Было
Реальная структура vault
00 - Inbox
10 - Работа
11 - Стратегия
12 - Продукт (Доставка, Склад, Транспорт)
13 - Команда (1‑1, Планёрка ИТ)
14 - Проекты (Маршрутизация, ЭТП, ТЭУ…)
15 - Внешнее
20 - Личное
30 - Знания (в т.ч. Обучение)
40 - Шаблоны
50 - Медиа
60 - Архив
Meetings
4 Расшифровка встреч текст

От боли — к автоматике

Ни одного ручного действия после звонка: запись сама доходит до Obsidian и Telegram, уже разложенная по смыслу.

Было — боль
  • Записи встреч терялись — забывал зафиксировать по горячим следам
  • Договорённости оставались неясными — потом не вспомнить, кто что обещал
  • Ответственность размыта — никто не помнит, кто за что отвечал
  • Не помню, куда что положил — заметки разбросаны, потом не найти
Стало — решение
  • Полностью автоматический конвейер: запись → расшифровка → саммари → доставка → разбор по проектам → задачи на доску
  • Ноль ручных действий после звонка — не нужно даже помнить о фиксации
  • Договорённости и ответственные — отдельным разделом в каждом саммари
  • Общая встреча сама делится на выдержки по проектам, поручения становятся предложениями на доску
WaveLink
Recordia
Syncthing
n8n
WhisperX
LLM
Telegram
Obsidian
4 Этап 1 из 7

Запись

WaveLink сводит звонок и собственный микрофон в единый аудиопоток — так в записи слышно и меня, и собеседников с одной дорожки. Поток уходит в Recordia, которая пишет его в .wav.

Технические детали
WaveLink иногда подтормаживает на macOS, но со сведением потока справляется стабильно
Ручной шаг
Нужно не забыть включить запись в Recordia — авто-старт по запуску звонка пока не настроен
4 Этап 2 из 7

Синхронизация

Syncthing решает сразу две задачи: переносит записанный .wav с ноутбука на NAS, и отдельно синхронизирует само Obsidian-хранилище между всеми устройствами — поэтому готовая заметка потом одинаково доступна везде.

Две независимые папки
Папка записей и Obsidian vault синхронизируются раздельно, но оба через один и тот же Syncthing
Вне локальной сети
Если я не дома — просто включаю Tailscale, синхронизация продолжает работать как обычно
4 Этап 3 из 7

Обработка

n8n триггерится на появление нового файла в папке записей и отправляет его на GPU-сервер с WhisperX. Несколько служебных нод дальше подчищают технический мусор из транскрипта, прежде чем передать текст в LLM — чтобы не жечь токены зря.

WhisperX
192.168.50.7:9000 · модель Large · язык ru · диаризация спикеров (min/max speakers)
На выходе
JSON с таймкодами, сегментами речи и меткой спикера на каждый фрагмент
4 Этап 4 из 7

Саммари

Очищенный транскрипт уходит в LLM с фиксированным промптом: роль ассистента для итогов встреч, структура ответа строго по секциям — «Кратко», «Принятые решения», «Действия» в формате «кто → что → дедлайн».

Модель
Локальные модели до 14B давали слабый результат — не хватает контекста и VRAM. Стабильно работает только облачная модель
Промпт
Текущая версия — примерно 20-я по счёту итерация, отбор шёл методом проб и ошибок
4 Этап 5 из 7

Доставка

Готовый .md расходится сразу по двум адресам параллельно: летит в Telegram-бот для мгновенного уведомления на телефон, и одновременно пишется прямо в Obsidian-хранилище на NAS.

Telegram
Не нужно открывать Obsidian, чтобы узнать итоги — саммари приходит сразу в мессенджер
Obsidian
Файл пишется напрямую в vault на NAS — на устройствах он появится после синхронизации Syncthing
4 Этап 6 из 7 новое

Разбор по проектам

n8n кладёт саммари в одну папку, а на общей встрече обсуждают пять проектов сразу. Каждые 5 минут агент-разборщик находит новые общие встречи и отдаёт каждый пункт ровно одному адресату: проекту, общей доске IT management или в корзину, если это личное. В папку проекта ложится выдержка со ссылкой на оригинал.

Разделение труда
Модель пишет только смысловые разделы. Шапку, имя файла и ссылку на оригинал собирает код — так выдержку всегда можно проверить
Итог
37 общих встреч разложено с 1 сентября. Оригинал не переносится и не правится, пункт не дублируется в два проекта
4 Этап 7 из 7 новое

Задачи на доску

Как только в папке проекта появляется встреча или выдержка, агент извлекает поручения и предлагает карточки: создать, обновить, передвинуть, закрыть. На доску предложение попадает только после моего подтверждения.

Без выдумок
Срок — только если прозвучал. Исполнитель сверяется со справочником участников. Перед разбором агент видит текущую доску, поэтому обновляет существующие карточки, а не плодит дубли
Скорость
От конца встречи до предложения в инбоксе — минуты, без ручного запуска
4 Расшифровка встреч весь конвейер

Конвейер целиком

1

Запись

WaveLink сводит звонок и микрофон → Recordia пишет .wav

2

Синхронизация

Syncthing: запись → на NAS, хранилище → на все устройства

3

Обработка

n8n → WhisperX с диаризацией → очистка мусора

4

Саммари

LLM: решения, договорённости, ответственные, сроки

5

Доставка

.md в Telegram и в Obsidian на NAS

6

Разбор

Агент делит общую встречу на выдержки по проектам

7

Задачи

Предложения карточек в инбокс, решаю я

2–3 минот конца получасовой встречи до заметки
≤ 5 миндо выдержек по проектам и предложений на доску
0ручных действий после звонка — кроме «принять / отклонить»

Этапы 1–5 — детерминированный конвейер на n8n, он не менялся с прошлой версии. Этапы 6–7 добавил агент: там нужен смысл, а не правило.

5 Переломный момент сравнение

Скиллы на ноутбуке vs агент на сервере

Раньше у меня было 8 скиллов для Claude Code / OpenCode: статус проекта, дельта Redmine, отчёты к планёрке. Они работали, но упирались в одно — в меня.

Скиллы на MacBookHermes Work на NAS
Кто запускаетЯ, фразой в чатеРасписание и события: новый файл, изменения в Redmine
Когда работаетПока ноутбук открыт и я помнюКруглосуточно: каждые 5 минут, ежедневно, еженедельно
КонтекстЗаново в каждой сессии, всё зашито в промпт скиллаСостояние в БД, память профиля, роль в SOUL.md
ДоступШирокий: файлы, grep, любые API26 узких инструментов, ни одного «общего» доступа к файлам
Куда пишетПрямо в файлы ObsidianТолько через API ядра; задачи — только предложениями
КонтрольЯ смотрю на экран, пока он работаетИнбокс подтверждений и аудит каждого изменения
СтоимостьПолный прогон при каждом запускеLLM вызывается, только если данные изменились
5 Что на самом деле поменялось

Скилл остался скиллом. Поменялось всё вокруг

Hermes использует тот же формат SKILL.md, и промпты переехали почти без правок. Разница не в инструкции модели, а в четырёх вещах вокруг неё.

Триггер

Не «я попросил»

cron + monitor-скрипт. Скилл запускается сам, когда в источнике что-то изменилось

Инструменты

Не «всё, что есть»

Свои MCP-серверы под задачу. Агент физически не может сделать то, что не предусмотрено

Состояние

Не «в голове сессии»

Что обработано, что предложено, что принято — в Postgres, а не в frontmatter файла

Доставка

Не «ответ в чате»

Результат ложится в ядро и витрину; мне приходит одно утреннее сообщение

Claude Code никуда не делся: на нём я строю harness и решаю разовые глубокие задачи — например первичный разбор нового проекта в Redmine. Регулярное делает агент.

5 Пример 1 из 3 статус проекта

Статус проекта: из команды — в фоновый процесс

Было — скилл
  • Я пишу «обнови статус проекта X» — по одному проекту за раз
  • Список обработанных файлов хранится во frontmatter самого статус-файла
  • LLM переписывает весь _STATUS.md целиком
  • Забыл запустить — статус устарел, и никто об этом не знает
Стало — агент
  • Каждое утро monitor-скрипт по каждому из проектов хеширует новые источники
  • Хеш не изменился — модель не вызывается вообще
  • Изменился — агент получает готовый список «что нового» и обновляет только живые блоки через API
  • Задачи в статусе рендерит код из доски — модель их больше не пишет
5 Пример 2 из 3 отчёт по логистике

Отчёт по логистике: код считает, модель пишет

Было — скилл
  • В понедельник утром запускаю вручную перед планёркой
  • Модель сама ходит в Redmine: пагинация, фильтры, обход дерева инициатив
  • Десятки API-вызовов — каждый шанс ошибиться в фильтре
Стало — агент
  • Воскресенье, 20:00 — cron, без меня
  • Python-скрипт детерминированно собирает данные и раскладывает по 4 направлениям
  • Модель только группирует по темам и пишет текст по эталонному образцу
  • Полная и краткая версии — в Obsidian, итог — в Telegram

Приёмка: первый автоматический прогон совпал с ручным 1:1 — 177 закрытых задач, 107 в работе. Правило, которое я вынес: всё детерминированное — коду, смысловое — модели.

5 Пример 3 из 3 оркестратор планёрки

Скилл, который перестал быть нужен

Был мета-скилл «подготовь материалы к планёрке»: по очереди запускал отчёт по логистике, дельту Redmine и отчёт по проектам. Перед каждой планёркой — запуск и ожидание.

пн–пт 07:30

Redmine

Снимки и дельты по проектам уже посчитаны

+
каждое утро

Статусы

Обновлены там, где что-то изменилось

+
вс 20:00

Логистика

Недельный отчёт уже лежит в папке планёрки

=
к планёрке

Всё готово заранее

Оркестрировать нечего — расписание и есть оркестратор

Так же растворился скилл синхронизации роадмапа Google Sheets ↔ Redmine: вместо таблицы теперь вкладка IT management, которая читает Redmine напрямую (раздел 8).

6 Hermes Agent · профиль Work анатомия

Один контейнер, два агента

Hermes Agent — open-source фреймворк от Nous Research. На NAS в одном контейнере живут два профиля: ha — умный дом, work — проекты. У каждого свой процесс, свой Telegram-бот, своя модель и свой набор прав.

Роль

SOUL.md

Кто агент, какие у него инструменты и когда какой брать. Меняется в одном коммите с инструментами

Инструменты

4 MCP-сервера · 26 инструментов

vault 8 · board 7 · portfolio 6 · redmine 5. Все написаны под задачу

Навыки

8 своих скиллов

синтез статуса, радар Redmine, извлечение задач, разборщик встреч, дайджест, уточнения, выжимки, отчёт по логистике

Расписание

~40 cron-задач

Большинство с monitor-скриптом: модель запускается только при изменениях

Канал

Telegram-бот

Утренний дайджест, вопросы по неполным карточкам, диалог «что по проекту X»

Модель

gpt-5.6-terra

По подписке. Стартовал на дешёвой qwen-flash — для обкатки обвязки её хватало

6 Принцип 1 узкие инструменты

У агента нет доступа к файлам. Это фича

С Claude Code я заметил: если у агента есть и grep, и поиск по смыслу, он почти всегда выбирает перебор файлов и жжёт токены. Поэтому встроенный файловый toolset профилю не дан, а вместо него — свой MCP-сервер к хранилищу.

ИнструментЧто делаетПочему так
read_file · search_files · lsвыключеноВстроенный доступ Hermes к файлам: читать любой файл, грепать, листать папкиС ним агент перебирает хранилище вслепую и жжёт токены
vault_searchнайтиИщет заметки по смыслу запроса и отдаёт топ фрагментов; свежие заметки получают небольшой бонусОсновной способ найти что-то. Без бонуса свежести архив перебивал актуальное
vault_recentнайтиОтдаёт список заметок за период, новые сверху, — без содержимогоПоиск по смыслу не понимает «последняя встреча» и «сегодня»
vault_findнайтиИщет файлы по словам в имени и пути, например «этрн status»Статус-файлы всех проектов называются одинаково — по смыслу их не различить
vault_readпрочитатьЧитает одну заметку, путь к которой уже найден одним из трёх способов вышеПрочитать можно только найденное — бродить по папкам нельзя
vault_writeзаписатьСоздаёт или дополняет обычную заметку — например, недельный отчётСтатус-файлы так записать нельзя, для них отдельная дверь
vault_update_status_blocksзаписатьОбновляет в ядре только разрешённые блоки статуса проекта; файл потом пересобирает кодМодель физически не может испортить блоки, которые ей не принадлежат

Правило: если класс запросов не решается поиском по смыслу, я добавляю ещё один узкий инструмент, а не открываю общий grep.

6 Принцип 2 двухступенчатый гейт

LLM просыпается, только если есть что делать

Почти каждая cron-задача устроена одинаково: сначала дешёвый детерминированный скрипт, потом — по необходимости — модель.

Шаг 1 · код

Monitor-скрипт

Собирает снимок: новые встречи, дельты Redmine, заметки. Классифицирует источники и считает хеш

→
Хеш тот же

Стоп

0 токенов. Так проходит большинство прогонов

Хеш изменился

Вызов модели

Агент получает готовый JSON: какой проект, какие файлы, какого они типа

→
Шаг 2 · LLM

Смысловая работа

Прочитать, извлечь, предложить карточки, обновить блоки статуса — через API ядра

Модель не решает, есть ли работа, — это решает код. Модель решает, что с этой работой делать.

6 Принцип 3 код собирает рамку

Модель пишет только содержание

Всё, что имеет формат, — имена файлов, шапки, ссылки, порядок блоков, выборки из трекера — собирает код. Модели остаётся та часть, где нужен смысл. Чем меньше формата доверено модели, тем меньше мест, где она может его сломать.

АртефактДелает кодДелает модель
Выдержка встречиИмя файла с датой, frontmatter, ссылка на оригинал, выбор папки проектаРазделы «Кратко», «Решения», «Поручения», «Факты»
Статус проектаПорядок 15 блоков, шапка «не редактировать», задачи из доски, команда из справочникаТекст живых блоков: суть и фаза, риски, хронология
Отчёт по логистикеВыборка из Redmine, дерево инициатив, раскладка по 4 направлениямГруппировка по темам и человеческий текст по образцу
Выжимка IT managementКакой задаче нужна выжимка — по хешу описания; куда её сохранитьОдно предложение «зачем эта задача бизнесу»

Побочный эффект: результат можно проверить кодом. Выдержка без ссылки на оригинал или статус без нужного блока просто не соберутся.

6 Принцип 4 агент ничем не владеет

Состояние — в ядре, а не в агенте

Первая версия хранила «что уже обработано» во frontmatter статус-файлов и в файлах самого агента. Любая переделка грозила потерей памяти. Теперь агент — сменный исполнитель, а всё, что он знает о проектах, лежит в Postgres.

В ядре (Postgres + API)

Факты о проектах

Какие встречи и дельты уже обработаны · карточки и полная история изменений · очередь предложений и решения по ним · снимки Redmine · выжимки · справочник участников · блоки статусов

В агенте (Hermes)

Только «как работать»

Роль в SOUL.md · скиллы с инструкциями · расписание · короткая память диалога в Telegram. Ничего, что жалко потерять

Сменил модель

Модель меняется одной строкой в конфиге — история обработки и карточки остаются на месте

Пересоздал контейнер

Обновление образа Hermes не трогает данные: агент стартует и продолжает с того же места

Отладка

Claude Code или Codex разбирают сбой по базе и журналу событий, а не по логам чата

6 Принцип 5 агент предлагает

Как агент готовит предложение

Менять задачи агенту нельзя — он только предлагает. Но от качества предложения зависит, сколько моего времени уйдёт на разбор. Поэтому у предложения жёсткие правила. Что происходит с ним на моей стороне — в разделе 8.

1

Сначала смотрит на доску. Перед разбором встречи агент читает текущие карточки проекта и шлёт «обнови», «передвинь», «закрой», а не плодит дубли

2

Обязательный паспорт. У каждого предложения — файл-источник и уверенность от 0 до 1: без них сервер предложение не примет. Плюс причина одной фразой

3

Срок — только если прозвучал. Дату агент не придумывает: нет на встрече — поле остаётся пустым

4

Исполнитель — из справочника. Имя сверяется со списком участников проекта; не нашлось — владельцем становлюсь я, а не случайный человек

5

Ожидаемый результат — всегда. «Что будет считаться сделанным» агент формулирует из контекста, иначе треть карточек не была готова к работе

6

Удалённое не возвращается. Если я удалил карточку как галлюцинацию, предложение с тем же заголовком сервер отклонит сам

6 Принцип 6 один голос наружу

Вместо десятка уведомлений — одно сообщение

Hermes Work · 10:00
Доброе утро. За ночь обновились 3 проекта из 10.
Что изменилось: в «Межгородской маршрутизации» закрыт эпик по расчёту плеч; в «Опасных грузах» новый риск по срокам сервиса ограничений.
Ждут решения: 5 предложений карточек со вчерашних встреч, одно конфликтует с вашей ручной правкой.
Просрочено: 4 карточки, самая старая — 9 дней.
❓ Кто отвечает за «Уточнить декомпозицию и план запуска» в «Собственной ЭТП»? На встрече исполнитель не прозвучал.
условный пример в формате реального дайджеста
1

Дайджест собирает ответы ночных прогонов за 20 часов, движения доски, зависшие предложения и просрочки

2

Не больше 3 вопросов в день по неполным карточкам. Если вопрос дважды остался без ответа, он затихает на 30 дней

3

Ответ в чате проходит через узкую дверь: агент может заполнить только исполнителя, срок, ожидаемый результат или колонку — и только у карточки с открытым вопросом

4

Раньше каждая проектная задача писала в Telegram сама — сообщений стало столько, что я перестал их читать

6 Один день агента расписание

Пока я сплю, проекты обновляются

каждые 5 мин
Разборщик встреч и приём встреч по 10 проектам — новые файлы → выдержки и предложения карточек
каждые 30 мин
Переиндексация хранилища и рендер задач в статусы — оба без LLM
пн–пт 07:30
Радар Redmine — снимки по проектам и снимок эпиков департамента, дельты
08:00–09:55
Синтез статусов — по проекту раз в день, модель вызывается только при изменениях
10:00
Утренний дайджест — единственное сообщение в Telegram за день
пн 06:00
Медленные блоки статуса — метрики, дерево задач, трудозатраты, вехи
вс 20:00
Отчёт по логистике за неделю — в Obsidian и в Telegram
7 Статус-файлы было → стало

_STATUS.md больше никто не пишет

В прошлой версии статус-файл был «мотором» всего процесса — его переписывала модель. Оказалось, что у файла, в который пишут двое, в какой-то момент теряется текст.

Было — два владельца
  • LLM переписывает прозу во всех 15 блоках
  • Код рендерит задачи с доски в те же блоки
  • Первый же рендер кодом стёр блок с вехами проекта
  • Строгая проверка формата два дня молча блокировала обновление трёх проектов
Стало — проекция
  • Файл целиком собирается кодом из ядра, в шапке — «не редактировать»
  • Всё, что пишет человек, живёт в соседней заметке
  • Модель обновляет отдельные блоки через API, а не файл
  • Проверка: файл удалён → пересобран → SHA-256 совпал у всех проектов
7 Статус проекта кто пишет каждый блок

Статус проекта: 15 блоков — 4 автора

У каждого проекта есть статус-документ _STATUS.md: паспорт проекта и его текущее состояние. Из него витрина рисует карточку проекта — суть, метрики, задачи, риски (как это выглядит — в разделе 9). Блоки документа поделены по тому, кто их пишет и как часто: это решает, когда модель вообще к ним прикасается.

Человек

паспорт проекта — задаётся один раз, агент не трогает
problem · проблемаtarget · цельcriteria · критерии приёмкиtech · тех. контекстbiz · бизнес-контекст

Модель · ежедневно

только если в источниках появилось новое
status · суть и фазаrisk · блокеры и рискиtimeline · хронология

Модель · еженедельно

понедельник, 06:00
metrics · 4 метрикиtree · дерево задачeffort · трудозатратыdone · вехи

Код · каждые 30 минут

рендер без LLM из доски, Redmine и справочника участников
tasks · активные задачиwip · в работеteam · команда

Задачи в статусе — это проекция доски, а не пересказ модели. Если модель что-то «помнит» про задачу, а на доске этого нет, на карточку проекта это не попадёт.

8 RedProject эволюция

Из дашборда — в систему ведения проектов

Летом это была страница с Ганттом из Google Sheets. Каждый следующий шаг появлялся из конкретной боли предыдущего.

июль
Витрина. Гантт из Google Sheets, потом плашки из статус-файлов. Боль: статусы устаревают, их обновляю я
02.09
Радар проектов. Агент сам тянет Redmine и обновляет статусы по утрам. Боль: поручения со встреч живут только в прозе
04.09
Kanban + инбокс. Поручения становятся карточками, агент их предлагает. Боль: задачи записаны дважды — в статусе и на доске
06.09
Доска — единственный источник правды по задачам, статус рендерится из неё. Боль: код в NAS без истории, правки ломают соседнее
07.09
Git, ADR, имя RedProject. Статус-файл становится проекцией из ядра. Боль: агент ходит к данным в обход API
08.09
Одна дверь к данным. Все инструменты агента — только через API. Боль: общие встречи не доходят до проектов
14.09
Разборщик встреч. Общая встреча делится выдержками по проектам. Боль: нет картины по всему департаменту
22–23.09
IT management и «Что ждут от меня». Портфель департамента и один экран моих решений
10проектов под наблюдением агента
242карточки на досках
315предложений от агента
109участников в справочнике
8 Человек в контуре главный инвариант

Агент предлагает — человек решает

Я не готов доверить боту прямую запись в задачи, поэтому у агента нет права менять доску: он кладёт предложения в очередь.

источник

Встреча / Redmine

Новый файл или дельта

→
агент

Предложение

create / update / move / close + источник, уверенность, причина

→
человек

Инбокс

Принять, поправить или отклонить

→
ядро

Карточка + событие

Каждое изменение пишет неизменяемую запись аудита: кто, что, до/после, почему

Конфликт

Если я правил карточку в последние 7 дней, предложение агента не применяется молча: оно показывается первым, с разбором «сейчас → предлагается»

Правила колонок

В «Оценку» нельзя без исполнителя и ожидаемого результата, в «Работу» — ещё и без срока. Правила одни для меня и для агента: их проверяет API

Два способа убрать

«Не актуально» — осознанный отказ, остаётся видимым. Удаление — для галлюцинаций и дублей; повторно такую карточку агент уже не предложит

8 Доска проекта визуал

Как выглядит доска с агентом

redproject · Опасные грузы · Kanban
Обзор
Kanban
Backlog 20
Правила при обнаружении запрещённых вложенийиз встречи 18.09
Маркировка ОГ 9 классабез срока
Оценка 24
Грубая оценка трудозатрат по точкаманалитик · результат: оценка в часах
В работе 17
Список полей сервиса ограниченийвладелец продукта · до 30.09
Архитектурная судьба модуляруководитель проекта · до 03.10
Готово 63
Фиксация нарушений в МК, волна 1закрыто 12.09
Не актуально 118
Созвон по регламентуснято: не задача
📥 Предложение агента · move → «Готово»: «Правила при возгорании» — на встрече 26.09 регламент утверждён · уверенность 0.8 ПринятьОтклонить

Цифры в колонках — по всем проектам. Честная метрика шума: 118 из 242 карточек (49%) я отправил в «Не актуально». Агент хорошо находит поручения, но плохо отличает задачу от упоминания.

8 IT management портфель департамента

214 эпиков и инициатив — одна вкладка

Вместо таблицы, которую синхронизировал скилл, — снимок Redmine по 5 командам. Redmine остаётся источником фактов, агент добавляет только выжимку «зачем» из описания задачи.

ежедневно, 07:20свежий снимок эпиков и инициатив из Redmine
в том же прогоневыжимки «зачем» — только для новых и изменённых описаний
при открытиивитрина читает последний снимок из API ядра
redproject · IT management
Топ WSJF
⚠️ Протухшие
Просрочено
INI-11181
⭐ Поддержка сертификатов МинЦифры

Нужна, чтобы клиентские приложения оставались доступными и не было потерь при оплате.

WSJF 7.8
подзадачи 4/7 · до 30.09
MK-2173
Звонок из МК в суперапп — этап 2

Перевод звонков курьера в приложение завершит целевой сценарий связи и снизит расходы на сотовые вызовы.

WSJF 6.33
бэклог
EPIC-…
⚠️ Эпик без движения 21 день

Маркер протухлости считается по всей ветке подзадач, а не по самому эпику.

в работе
обновлён 08.09

Выжимка привязана к хешу описания: поменялось описание — выжимка пересчитается, старый ответ модели новую не перезапишет. При сбое Redmine неполный снимок не публикуется — остаётся прошлый.

8 Главный экран что ждут от меня

Один экран: где нужен я

Сводка из ядра по всем проектам: решения, которые ждут меня, сроки, блокеры. Сюда же попадают сбои разбора встреч — агент не должен молча терять встречу.

redproject · Что ждут от меня
Ждут решения
1
предложение агента
Просрочено
16
карточек и задач
Скоро срок
25
в ближайшие дни
Блокеры
9
риски из статусов
📥 Решения
Собственная ЭТП · create
Уточнить декомпозицию, владельца и план запуска инициативы — из встречи 26.09
⏰ Просрочено
Опасные грузы · в работе
Список полей сервиса ограничений · владелец продукта — срок 30.09, прошло 2 дня

Ещё недавно здесь висело больше сотни решений: агент генерировал больше, чем я успевал разобрать. Экран собрал всё в одну очередь — сейчас разобраны все 315 предложений, ждёт одно. Следующая задача — не «умнее извлекать», а «меньше, но точнее».

8 Справочник и мелочи что сделало систему живой

Детали, без которых не взлетало

109 участников

Справочник участников

Ведёт человек, агент сверяет с ним исполнителей. «Имя без отчества» — тот же человек. Блок команды в статусе — проекция справочника

ОбзорKanban

Доска внутри вкладки проекта

Переключатель «Обзор / Kanban» на каждой вкладке; общая тема и стили с витриной

🗄 Архив

Архив вместо удаления

Проекты не удаляются: история карточек и событий сохраняется целиком

ожидаемый результат: …

Ожидаемый результат

Обязательное поле у каждой карточки: «что будет считаться сделанным». Без него задачи с встреч оставались размытыми

🔁 повтор через 30 мин

Повтор разбора встреч

Незавершённый разбор повторяется автоматически, а на экране видно, насколько свежий снимок

⚠️⭐

Сквозные маркеры

Протухшее, просроченное и топ по WSJF подсвечиваются на карточках во всех секциях

9 Витрина текст

Все проекты — на одном экране

Витрина — одностраничное приложение на NAS за nginx с basic auth. Раньше она только читала статус-файлы, теперь это в первую очередь клиент ядра.

1

Главный экран, доски, IT management читают JSON из API ядра; доска проксируется по пути /kanban/

2

Статус-плашки по-прежнему из _STATUS.md: папка проектов смонтирована read-only, браузер парсит callout-блоки

3

У каждого проекта своя вкладка с переключателем «Обзор / Kanban»; программы с фазами дополнительно тянут Гантт из Google Sheets

4

Кто правит, берётся из basic auth и пишется в аудит: человек и агент различимы в каждой записи

Парсер markdown в браузере и Гантт из Sheets — известный долг: шаги 5–6 дорожной карты (раздел 12)
9 Витрина визуал

Как это выглядит вживую

192.168.50.2:3002
Что ждут от меня
Опасные грузы
IT management
ОПАСНЫЕ ГРУЗЫ — Discovery / Оценка
обновлено 30 июля 2026
INI-10943 · Ответственный · Суть проекта: переход от стихийного, нигде не фиксируемого осмотра грузов к системе автоматических триггеров («Сервис ограничений»), которая на создании заказа помечает груз «Осмотр нужен» — по истории нарушений клиента и подозрительному описанию вложения.
Прогресс инициативы
21%
INI-10943, Discovery
Риск потери объекта
от 1 млрд ₽
при разрыве аренды из-за ОГ
Штрафы с нарушителей
~200 млн ₽/год
потенциальная выручка
Простой склада
~500 тыс ₽/ч
эвакуация блока при инциденте
✅ Активная работа
🔴 Судьба модуля «Сервис ограничений» (критический путь)
Руководитель проекта — выяснить архитектурную судьбу модуля (~1–1,5 недели)
Ответственный за продукт — зафиксировать список полей сервиса (к вторнику)
Оценка часов — грубая оценка трудозатрат (ориентир ~500ч на все точки)
🟡 Доработки МЭК/МК
Модуль осмотра отправлений — приостановлен, пересмотр схемы автоназначения
Фиксация нарушений в МК — 2-я волна для курьеров, 33%
🟡 Прочие направления (Backlog)
Маркировка ОГ 9 класса / шин — 0%
Правила при обнаружении оружия / запрещёнки — 0%
Правила при возгорании / задымлении — 66%, дедлайн просрочен ⚠
9 Витрина вкладка с Ганттом

Не все вкладки одинаковые

Программы с датами по фазам (например ЭДО и ЭТрН) дополнительно тянут диаграмму Ганта прямо из Google Sheets — поверх тех же статус-плашек.

192.168.50.2:3002
ЭТрН
Опасные грузы
Микро‑ПВЗ
ЭДО и ЭТрН — план по фазам
ДеньНеделяМесяцГод
Фаза 1 — Методология
— BPMN-маппинг аналитик
Фаза 2 — Пилот
— Реестр ГосЛог разработчик
— ЭДО через ГИС ЭПД интегратор
Фаза 3 — Масштабирование
СЕГОДНЯ
завершено
в работе
под риском
9 Витрина прочие параметры

Что ещё умеет интерфейс

Мелкие, но полезные детали — набирались по одной, по мере того как чего-то не хватало на практике.

☀️
🌙

Светлая / тёмная тема

Переключатель темы, выбор хранится в localStorage браузера

Ответственный: аналитик ▾

Фильтр по ответственному

Сузить Гантт и задачи до одного человека

INI-10943 · 21% · due 30.09

Тултип при наведении

Детали задачи всплывают прямо над баром на Гантте

▾ Фаза 2 — Пилот
— 3 подзадачи

Сворачивание фаз

Клик по строке фазы — схлопывает все подзадачи внутри

ДеньНеделяМесяцГод

Масштаб таймлайна

Один и тот же план — от дневной детализации до годовой

⏱ обновлено сегодня, 10:02

Автообновление

При открытии вкладки и раз в сутки — данные агента всё равно обновляются по утрам

10 Архитектура было · июль

Было: всё сходится в Obsidian

Прошлая версия: оркестратор OpenCode на ноутбуке запускал скиллы по запросу, а Obsidian был общей базой для всего. Листайте вниз — как стало.

Я
принимает решения
Флоу встреч
WaveLink → n8n → WhisperX → LLM
Obsidian (vault)
общая база: заметки, статусы, срезы
OpenCode
оркестратор: скиллы, отчёты, статусы
Redmine
задачи, статусы, история
Google Sheets
роадмап инициатив
Telegram
саммари в мессенджер
NAS-дашборд
монтирует Obsidian напрямую, read-only
чем управляет OpenCode напрямую
автономный поток встреч — без OpenCode
дашборд читает Obsidian напрямую, в обход OpenCode
10 Архитектура стало · сентябрь

Ядро владеет, агент предлагает

Центр сместился: вместо Obsidian и оркестратора на ноутбуке — Project Core (Postgres + HTTP API). У каждой сущности один владелец; Obsidian — вход и витрина.

Redmine
факты о задачах
Встречи
n8n → WhisperX → LLM
Я
принимаю решения
Obsidian
вход и витрина, не база
Hermes Work
мониторы, скиллы, 26 инструментов
Telegram
один дайджест в день
Project Core
Postgres + HTTP API · владелец
Витрина + доска
клиент API, basic auth
агентный контур: читает источники, пишет только через API
детерминированные потоки без LLM: встречи, проекция _STATUS.md, витрина
человек: принимает предложения и правит карточки
11 Инженерия harness — тоже продукт

Два ИИ-разработчика, одни правила

Пока код жил только на NAS и правился через ssh, каждая доработка ломала что-то соседнее. Переломом стала не новая модель, а обычная инженерная гигиена.

Git и деплой

Только из закоммиченного

Скрипт гоняет тесты, делает бэкап и кладёт на NAS git bundle со всей историей. Правка руками на сервере теряется при следующем деплое — и это правильно

Документация

AGENTS.md + docs/

Архитектура, дорожная карта, грабли, карта «исходник vs производный файл». Агентно-нейтрально: одинаково читают Claude Code и Codex

Решения

8 ADR

Владение данными, проекция статуса, одна дверь к данным, разборщик встреч… Новый ADR — когда меняется граница компонента или владелец данных

61коммит за 3 недели
2ИИ-разработчика на равных: Claude Code и Codex
10граблей в PITFALLS.md — каждая стоила вечера
11 Грабли чтобы вы не наступали

Что ломалось на самом деле

Агент отрицал свои инструменты

Подключил хранилище, а бот отвечал «у меня нет доступа к Obsidian». Модель честно следовала старому SOUL.md с этапа бутстрапа.

системный промпт — часть конфигурации, меняется в одном коммите с инструментами

3 дня молчаливого бага

Свой MCP-сервер назвал kanban — так же, как встроенную подсистему Hermes. Её гейт тихо отключал все мои инструменты, а тест сервера при этом проходил.

не называть свои компоненты именами встроенных; проверять вызов из реальной сессии

Эмбеддинги не знают времени

«Дай итоги последней встречи» не находилось, а свежий статус проигрывал архиву мартовской планёрки.

отдельный инструмент по дате и мягкий бонус свежести поверх семантики

Два владельца у файла

Модель писала прозу, код рендерил задачи в тот же файл. Первый рендер стёр блок с вехами проекта.

у каждой сущности ровно один владелец; всё остальное — проекция

Сбой сети чуть не стёр данные

23.09 Redmine отвечал частично, и монитор едва не опубликовал «пустой» портфель вместо 214 эпиков.

неполный снимок не публикуется; при ошибке остаётся последний проверенный

Синхронизация перетирала права

Syncthing при каждой синхронизации ставил права с ноутбука, и агент на NAS не мог перезаписать собственный отчёт.

когда агент «не может записать», сначала смотреть права и uid, а не код
12 Итоги честно

Что получилось — и что ещё плохо

452

встречи расшифрованы и саммаризированы с февраля — около 65 в месяц

315

предложений карточек от агента за 3,5 недели — все разобраны

37

общих встреч разложено выдержками по проектам с 1 сентября

10

проектов ведёт агент без моего запуска

~40

фоновых задач, почти все с гейтом по хешу

1

сообщение в день вместо потока уведомлений

Что точно стало лучше
  • Любой отчёт система сделает сама — по расписанию и правилам
  • Мне можно не вести заметки на встречах — запись, саммари и поручения появятся без меня
  • Мне можно быть рассеянным — ни одно поручение со встречи не потеряется, у каждого есть источник
  • Статус любого проекта и любую задачу могу спросить у бота в Telegram
  • Система переживает смену модели и пересоздание контейнера
Что ещё плохо
  • Принято 312 из 315 предложений, но 118 из 242 карточек потом ушли в «Не актуально» — фильтровать приходится мне, а не агенту
  • Время подготовки к планёрке «до/после» — ощущение, а не замер
  • Просрочено 16 карточек: сроки агент ставит только прозвучавшие, но следить за ними пока тоже мне
  • Гантт всё ещё в Google Sheets, витрина парсит markdown
12 Что дальше дорожная карта

7 шагов: 4 закрыты

✓

Git и воспроизводимый деплой

Код из NAS — в репозиторий, выкладка только из закоммиченного

✓

Решение о владении данными

У каждой сущности один владелец; конфликты — человеку

✓

Статус-файл как проекция

Проверено удалением и пересборкой с совпадением хеша

✓

Одна дверь к данным

MCP агента — тонкий HTTP-клиент к API, прямого доступа к БД нет

7

Мультипользовательность — отложено осознанно

Классическая ловушка — продуктизировать личный инструмент до того, как он стабилен. Вернусь, когда появится конкретный второй пользователь

Главный вывод за это лето: модель — самая заменяемая часть. То, что работает, — это данные с одним владельцем, узкие инструменты, гейты перед LLM и человек, который принимает решения.