21 KiB
Planning — Team Board
Дата: 2026-02-23
Принципы
- Каждый эпик = самодостаточный блок, можно релизить независимо
- Порядок = зависимости + приоритет из Architecture Review
- Никаких параллельных эпиков — строго последовательно
- Каждая story имеет чёткие критерии приёмки
Эпик 1: WebSocket Foundation — Исправить критические баги
Цель: Устранить P0 блокеры из Architecture Review — WS collision и отсутствие task events Зависимости: нет
Story 1.1: Исправить WebSocket connection collision
Как системный разработчик я хочу чтобы множественные подключения одного пользователя не вытесняли друг друга чтобы система работала корректно при multiple tabs/reconnect
Критерии приёмки:
ConnectionManager.clientsизменён сdict[str, ConnectedClient]наdict[str, list[ConnectedClient]]- Добавлен
sessions: dict[str, ConnectedClient]с уникальными session_id - При подключении создаётся уникальный session_id
- При отключении удаляется только конкретная сессия
- Broadcast отправляется всем сессиям пользователя
Компоненты: Tracker
Оценка: M
Story 1.2: Добавить broadcast task events
Как агент я хочу получать уведомления о создании/изменении задач чтобы реагировать на новую работу в проекте
Критерии приёмки:
POST /api/v1/tasksвызываетbroadcast_task_event("task.created")PATCH /api/v1/tasks/{id}вызываетbroadcast_task_event("task.updated")DELETE /api/v1/tasks/{id}вызываетbroadcast_task_event("task.deleted")- События содержат полную информацию о задаче
- WebSocket клиент получает события в формате
{"type": "task.created", "data": task}
Компоненты: Tracker
Оценка: M
Story 1.3: Добавить REST token auth для агентов
Как агент я хочу аутентифицироваться через токен в REST API чтобы делать запросы напрямую к Tracker
Критерии приёмки:
- Middleware
verify_agent_token()проверяет заголовокAuthorization: Bearer tb-xxxxx - Токен валидируется по таблице Member.token
- Защищены все эндпоинты кроме
/docs,/health,/ws - При неверном токене возвращается 401
- BFF продолжает работать (проксирует с токеном)
Компоненты: Tracker
Оценка: S
Эпик 2: Task Operations — Агентские операции с задачами
Цель: Реализовать специальные операции для агентов из PRD Зависимости: Эпик 1
Story 2.1: Реализовать take task API
Как агент я хочу атомарно взять задачу в работу чтобы не было race condition с другими агентами
Критерии приёмки:
POST /api/v1/tasks/{id}/takeendpoint создан- Проверяется что задача в статусе backlog или todo
- Атомарно устанавливается assignee_slug = текущий агент и status = in_progress
- При конфликте возвращается 409 Conflict
- Broadcast task.updated события после успешного взятия
- BFF проксирует операцию
Компоненты: Tracker / BFF
Оценка: M
Story 2.2: Реализовать reject task API
Как агент я хочу отклонить назначенную мне задачу чтобы вернуть её в backlog с объяснением
Критерии приёмки:
POST /api/v1/tasks/{id}/rejectс body{"reason": "string"}- Проверяется что assignee_slug = текущий агент
- Устанавливается assignee_slug = null, status = backlog
- Добавляется комментарий-сообщение "Задача отклонена: {reason}"
- Broadcast task.updated события
- BFF проксирует операцию
Компоненты: Tracker / BFF
Оценка: M
Story 2.3: Реализовать assign task API
Как участник я хочу назначить задачу другому участнику чтобы делегировать работу
Критерии приёмки:
POST /api/v1/tasks/{id}/assignс body{"assignee_slug": "string"}- Проверяется существование assignee в проекте
- Устанавливается assignee_slug и status = todo (если был backlog)
- Broadcast task.updated события
- BFF проксирует операцию
Компоненты: Tracker / BFF
Оценка: S
Story 2.4: Реализовать watch/unwatch task API
Как участник я хочу подписываться на уведомления по задаче чтобы отслеживать её прогресс
Критерии приёмки:
POST /api/v1/tasks/{id}/watchдобавляет текущий slug в watchers[]DELETE /api/v1/tasks/{id}/watchудаляет slug из watchers[]- Дубликаты в watchers игнорируются
- Broadcast task.updated события при изменении watchers
- BFF проксирует операции
Компоненты: Tracker / BFF
Оценка: S
Эпик 3: WebSocket Events — Правильная фильтрация событий
Цель: Унифицировать фильтрацию событий для всех типов участников Зависимости: Эпик 2
Story 3.1: Реализовать project.subscribe для humans
Как пользователь веб-клиента я хочу подписываться только на события нужных проектов чтобы не получать лишний трафик
Критерии приёмки:
- Humans/bridges могут отправлять
project.subscribeсообщения connection.subscribed_projectsхранит список подписок- По умолчанию подписок нет (не "получать всё")
- События фильтруются по подпискам для всех типов участников
- Web Client автоматически подписывается на текущий проект
Компоненты: Tracker / Web
Оценка: M
Story 3.2: Унифицировать фильтрацию по listen_mode
Как агент с chat_listen="mentions" я хочу получать только сообщения где меня упоминают чтобы снизить шум в канале
Критерии приёмки:
- Функция
should_receive_event(client, event_type, data)для всех типов - chat_listen="mentions" → только сообщения с mentions[] содержащими агента
- chat_listen="all" → все сообщения в подписанных проектах
- task_listen="mentions" → только задачи где агент assignee/reviewer/watcher
- task_listen="all" → все task события в подписанных проектах
- Humans используют ту же логику с listen_mode="all" по умолчанию
Компоненты: Tracker
Оценка: M
Story 3.3: Исправить on_behalf_of validation
Как BFF я хочу валидировать on_behalf_of пользователей чтобы предотвратить коллизии slug
Критерии приёмки:
- При on_behalf_of проверяется существование Member с таким slug
- Несуществующие users получают префикс
web-{slug} - Все proxy подключения логируются с уровнем INFO
- Bridge не может перехватить slug существующего агента
- Добавлены unit тесты для collision cases
Компоненты: BFF
Оценка: S
Эпик 4: Agent Management — UI для управления агентами
Цель: Создать интерфейс для создания и мониторинга агентов Зависимости: Эпик 3
Story 4.1: Страница Agent Management
Как администратор я хочу видеть список всех агентов с их статусами чтобы мониторить работу системы
Критерии приёмки:
- Страница
/agentsдоступна в навигации - Таблица агентов с колонками: name, slug, status, capabilities, last_seen_at
- Статусы показаны цветами: 🟢 online, 🔴 offline, 🟡 busy
- Обновление статусов через WebSocket в реальном времени
- Кнопка "Create Agent" ведёт на форму создания
Компоненты: Web
Оценка: M
Story 4.2: Форма создания агента
Как администратор я хочу создать нового агента и получить его токен чтобы подключить к системе
Критерии приёмки:
- Форма с полями: name, slug, capabilities (чекбоксы), chat_listen, task_listen, model
- Slug валидируется на уникальность
- При создании генерируется токен формата
tb-{32 random chars} - Токен показывается один раз с предупреждением "Сохраните токен"
- После создания редирект на
/agentsсо списком - Токен копируется в clipboard кнопкой
Компоненты: Web / BFF / Tracker
Оценка: M
Story 4.3: Agent configuration UI
Как администратор я хочу редактировать настройки агента чтобы корректировать его поведение
Критерии приёмки:
- В таблице агентов кнопка "Edit" открывает модальное окно
- Поля: name, capabilities, chat_listen, task_listen, model, prompt
- Slug не редактируется (readonly)
- Кнопка "Regenerate Token" с подтверждением
- Изменения сохраняются через PATCH API
- Обновление конфигурации применяется без перезапуска агента
Компоненты: Web / BFF / Tracker
Оценка: M
Эпик 5: Task Steps UI — Интеграция steps в интерфейс
Цель: Показывать прогресс задач через steps UI Зависимости: Эпик 4
Story 5.1: Steps в TaskModal
Как пользователь я хочу видеть этапы задачи в виде чеклиста чтобы отслеживать прогресс выполнения
Критерии приёмки:
- Секция Steps между описанием и комментариями в TaskModal
- Список шагов с чекбоксами и заголовками
- Прогресс-бар "3 из 7 выполнено" вверху секции
- Чекбоксы интерактивны — клик отмечает/снимает выполнение
- Обновления сохраняются через PATCH API
- Live обновления через WebSocket
Компоненты: Web
Оценка: M
Story 5.2: Управление steps в TaskModal
Как исполнитель задачи я хочу добавлять и удалять этапы чтобы планировать свою работу
Критерии приёмки:
- Кнопка "+ Add Step" в секции Steps
- Инлайн добавление шага с автосохранением
- Кнопка удаления у каждого шага (только для незавершённых)
- Drag & drop для изменения порядка шагов
- Завершённые шаги визуально отличаются (зачёркнутый текст)
Компоненты: Web
Оценка: S
Эпик 6: Files & Attachments — Загрузка файлов
Цель: Реализовать upload/download файлов в сообщениях Зависимости: Эпик 5
Story 6.1: Upload API для attachments
Как пользователь я хочу прикреплять файлы к сообщениям чтобы делиться документами с командой
Критерии приёмки:
POST /api/v1/messages/{id}/attachmentsпринимает multipart/form-data- Файлы сохраняются в
/var/lib/team-board/attachments/{message_id}/ - Создаётся Attachment запись в БД с metadata
- Поддерживаются файлы до 10MB
- Валидация MIME типов (изображения, документы, код)
- BFF проксирует загрузку с авторизацией
Компоненты: Tracker / BFF
Оценка: M
Story 6.2: Download API для attachments
Как пользователь я хочу скачивать прикреплённые файлы чтобы просматривать их локально
Критерии приёмки:
GET /api/v1/attachments/{id}отдаёт файл с правильными заголовками- Content-Type, Content-Length, Content-Disposition установлены
- Проверка доступа — пользователь должен иметь доступ к сообщению
- Обслуживание статичных файлов через FastAPI
- BFF проксирует скачивание с авторизацией
Компоненты: Tracker / BFF
Оценка: S
Story 6.3: File preview в UI
Как пользователь я хочу видеть превью файлов в чате чтобы не скачивать их для просмотра
Критерии приёмки:
- Изображения показываются как thumbnail в сообщении
- Клик на thumbnail открывает полноразмерное изображение
- Документы показываются как ссылки с иконками типов файлов
- Код файлы (.js, .py, .md) показываются с syntax highlighting
- Кнопка скачивания у каждого attachment
Компоненты: Web
Оценка: M
Эпик 7: MCP Tools — Инструменты для агентов
Цель: Создать MCP Tools для взаимодействия агентов с системой Зависимости: Эпик 6
Story 7.1: Базовые Task Tools
Как агент я хочу создавать и управлять задачами через MCP чтобы автоматизировать workflow
Критерии приёмки:
create_task(title, description, project_slug, priority?, labels?)→ task_idtake_task(task_id)→ success/errorupdate_task(task_id, fields)→ updated taskcomplete_task(task_id)→ устанавливает status=donelist_tasks(project_slug?, status?, assignee?)→ task list- Все tools используют существующий REST API с токен авторизацией
Компоненты: Picogent
Оценка: M
Story 7.2: Communication Tools
Как агент я хочу отправлять сообщения и читать чат чтобы участвовать в обсуждениях
Критерии приёмки:
send_message(content, chat_id?, task_id?, mentions?)→ message_idlist_messages(chat_id?, task_id?, limit?)→ message listadd_task_comment(task_id, content)→ comment messagemention_user(slug, message)→ автодобавление в mentions[]- Все сообщения получают правильный author_slug агента
Компоненты: Picogent
Оценка: S
Story 7.3: Project & Member Tools
Как агент я хочу получать информацию о проектах и участниках чтобы понимать контекст работы
Критерии приёмки:
list_projects()→ project list с основными полямиget_project(slug)→ детальная информация о проектеlist_members(project_slug?)→ список участниковget_member(slug)→ информация об участникеwatch_task(task_id)/unwatch_task(task_id)→ управление подписками
Компоненты: Picogent
Оценка: S
Эпик 8: Advanced Features — Дополнительные возможности
Цель: Реализовать отложенные features для полноценной работы Зависимости: Эпик 7
Story 8.1: Telegram Bridge Foundation
Как пользователь я хочу получать уведомления в Telegram чтобы не пропускать важные события проекта
Критерии приёмки:
- Bridge агент подключается как member типа "bridge"
- Принимает все события проектов (listen_mode="all")
- Фильтрует важные события: task.assigned на меня, mentions в чате
- Отправляет уведомления в личный чат Telegram
- Конфигурация через переменные окружения
Компоненты: Picogent (отдельный bridge agent)
Оценка: L
Story 8.2: Voice Messages Support
Как пользователь я хочу отправлять голосовые сообщения чтобы быстро комментировать задачи
Критерии приёмки:
- Web Client записывает аудио через MediaRecorder API
- Upload аудио как attachment с типом audio/*
- Message.voice_url ссылается на attachment
- Аудио плеер в UI для воспроизведения
- Агенты могут транскрибировать voice_url через STT
Компоненты: Web / Tracker / Picogent
Оценка: L
Story 8.3: Advanced Task Dependencies
Как PM я хочу видеть граф зависимостей задач чтобы планировать последовательность работ
Критерии приёмки:
- UI для добавления зависимостей в TaskModal (autocomplete других задач)
- Валидация циклических зависимостей на бэкенде
- Визуализация зависимостей в виде граф-диаграммы
- Блокировка взятия задач с незавершёнными зависимостями
- Автоматическое уведомление при разблокировке задачи
Компоненты: Web / Tracker
Оценка: L