From b87183164dc24777a58e1ad472f9e8493d59d284 Mon Sep 17 00:00:00 2001 From: jackrescuer-gif Date: Wed, 3 Jun 2026 14:03:26 +0300 Subject: [PATCH] =?UTF-8?q?docs(moex-integration):=20design=20artifacts=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=81=D1=82=D1=80=D0=B0=D0=B8=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20FlowTask-=D0=B4=D0=BE=D1=81=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=B2=20moex-portal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ответ на спеку мейнтейнера #113 (FunctionTaskExecutionBoard). Артефакты: - execution-boards.html — макет по спеке #113 (доска внутри одной задачи) - two-layer-execution.html — промежуточная модель two-layer scope (устарела) - 113-response-two-layer-execution.md — ответный дизайн-док (устарел, требует rewrite) - boards-as-aggregates.html — v3, текущая концепция: * Board = тематический агрегат над набором FunctionTask (M:N через BoardTask) * Формальные источники из схемы Prisma (FunctionTaskSource, DirectiveSource, CollegialBody) * BoardScope: FUNCTION | INITIATIVE | PROGRAM | CROSS | PERSONAL (без Workspace) * UI на русском, enum-коды видны только в технических разделах --- .../113-response-two-layer-execution.md | 244 ++ .../boards-as-aggregates.html | 492 +++ .../execution-boards.html | 685 ++++ .../design/moex-portal-integration/index.html | 2742 +++++++++++++++++ .../two-layer-execution.html | 375 +++ 5 files changed, 4538 insertions(+) create mode 100644 docs/design/moex-portal-integration/113-response-two-layer-execution.md create mode 100644 docs/design/moex-portal-integration/boards-as-aggregates.html create mode 100644 docs/design/moex-portal-integration/execution-boards.html create mode 100644 docs/design/moex-portal-integration/index.html create mode 100644 docs/design/moex-portal-integration/two-layer-execution.html diff --git a/docs/design/moex-portal-integration/113-response-two-layer-execution.md b/docs/design/moex-portal-integration/113-response-two-layer-execution.md new file mode 100644 index 0000000..98d81c2 --- /dev/null +++ b/docs/design/moex-portal-integration/113-response-two-layer-execution.md @@ -0,0 +1,244 @@ +# Ответ на #113 — Двухслойная модель исполнения: делегированный + личный + +> Дата: 2026-05-28 | Статус: PROPOSAL, ответ на [#113](113-functiontask-execution-boards.md) | В ответ на: Codex | Размер: XL + +## TL;DR + +Спецификация #113 описывает **только верхний слой** — делегированную работу: руководитель ставит задачу → исполнитель внутри неё заводит доску. Это правильно, и мы это принимаем целиком. + +Но #113 в Non-goals **вырезает то, ради чего FlowTask вообще встраивают** — возможность сотруднику самостоятельно вести и структурировать *свою* ежедневную работу, а не только то, что ему явно спустили сверху. + +Предлагаем не «или», а **два слоя одной модели**: + +| Слой | Кто инициирует | Зачем | Видимость | +|---|---|---|---| +| **Делегированный** (#113) | Руководитель → исполнителю | Контроль сложного поручения | Управленческие surfaces: `/tasks`, weekly, свод | +| **Личный** (это предложение) | Сотрудник → себе | Управление собственной ежедневной работой | Только личный кокпит сотрудника | + +Оба слоя порождают одну и ту же пару `FunctionTask → ExecutionBoard`. Разница — **кто инициирует** и **в каком scope живёт** задача. Никакого второго трекера, никакого нового top-level домена. + +--- + +## 1. Что мы принимаем из #113 без изменений + +- `FunctionTask` остаётся единственной управленческой семантикой. `FunctionTaskStatus` **не меняем**. +- Доска исполнения живёт **внутри задачи**, находится через неё (`/tasks/[id]/execution`). +- Подзадачи — отдельная сущность `ExecutionSubtask`, не глобальные `FunctionTask`, плоские в MVP. +- Кастомные статусы — только внутри доски, обязательный semantic bucket. +- Roadmap по `startDate/dueDate`, цвета из semantic-токенов. +- Миграция только аддитивная, soft-delete, без backfill. +- ITOM workflow не трогаем. +- `FunctionTaskTopic` не заменяем. + +**Top-down модель #113 принимается как Слой 1 целиком.** Спор только об одном Non-goal — об исключении личного слоя. + +--- + +## 2. Точка несогласия + +#113 строит модель вокруг тезиса: *«доска нужна только для сложного делегированного поручения; всё личное — это шум, который надо держать вне портала»*. + +Конкретно мы оспариваем формулировки: + +- §69 «Не добавлять новый top-level sidebar domain» — **согласны** (домен не нужен), но из этого #113 делает вывод, что и личного входа быть не должно. Это не следует. +- Неявное допущение, что доску заводят только под *спущенную* задачу. На деле код портала **уже разрешает self-assign** (`function-tasks/route.ts:825` — `isSelfAssign` проходит без лидерства). То есть сотрудник уже может завести себе задачу — #113 просто не достраивает над этим рабочий слой. + +--- + +## 3. Зачем нужен личный слой (продуктовый аргумент) + +Коллеги, тестировавшие FlowTask, ждут от встроенной версии **ровно того же, что было в FlowTask** — не «урезанный канбан для чужих поручений», а инструмент, которым ведут свой день. + +Реальная работа сотрудника состоит из двух потоков: + +1. **Спущенное** — задачи, которые поставил руководитель (Слой 1). +2. **Самоорганизованное** — то, что сотрудник декомпозирует и ведёт сам: подготовка к спущенной задаче, свои инициативы, рутинные дела, личные дедлайны. + +Если портал поддерживает только (1), сотрудник всё равно ведёт (2) — но в Notion / стикерах / голове. Тогда портал теряет полноту картины, а руководитель — реальную загрузку команды. + +**Killer feature встраиваемого FlowTask = свести оба потока в одном месте**, не засоряя при этом управленческие сводки. + +--- + +## 4. Схема 1 — Делегированный слой (top-down) + +Это модель #113 без изменений. + +``` +РУКОВОДИТЕЛЬ + │ создаёт FunctionTask «Имплементировать портал» + │ назначает → Крылов (assignee ≠ self → нужен лидер/MANAGE_ALL) + ▼ +ЗАДАЧА (scope = FUNCTION, видна в /tasks, weekly, своде) + │ Крылов открывает /tasks/FT-128 + ▼ +ДОСКА ИСПОЛНЕНИЯ (1:1, заводит исполнитель) + ├─ ExecutionSubtask[] ← подзадачи + ├─ ExecutionWorkflow ← кастомные статусы + └─ Roadmap + ▲ + │ агрегированный summary (прогресс / просрочки / блокеры) +РУКОВОДИТЕЛЬ видит итог в той же задаче +``` + +**Свойства:** задача видна управленческим surfaces; статус закрывает руководитель вручную; доска — необязательное продолжение для сложного исполнения. + +--- + +## 5. Схема 2 — Личный слой (bottom-up, self-serve) + +Сотрудник управляет своей работой из личного кокпита. Точка входа — **существующий `/my` («Мои задачи»)**, расширенный, а не новый домен. + +``` +СОТРУДНИК (личный кокпит /my) + │ + ├─ создаёт себе задачу (assignee = self → лидерство НЕ нужно) + │ scope = PERSONAL + │ │ + │ └─ при желании заводит доску исполнения (1:1, та же модель #113) + │ ├─ ExecutionSubtask[] + │ ├─ ExecutionWorkflow (или дефолтный «To do / Doing / Done») + │ └─ Roadmap + │ + ├─ ведёт ежедневные задачи (короткие, без доски) + │ + └─ ВСЁ ЛИЧНОЕ видно только ему: + ✗ не попадает в /tasks функции + ✗ не попадает в weekly / management summary + ✗ не считается в управленческих метриках просрочки + ✓ видно сотруднику в /my как личный канбан/список/roadmap +``` + +**«Сколько угодно досок» = сколько угодно личных задач, каждая со своей доской 1:1.** Мы не ломаем правило `parentTaskId @unique` — мы даём свободу создавать сами задачи-контейнеры. Это сохраняет инвариант #113 и одновременно снимает ограничение, которое не понравилось. + +--- + +## 6. Точка схождения — это одна модель, а не две + +Ключевой тезис для мейнтейнера: **мы не строим второй трекер.** Оба слоя — это та же пара сущностей: + +``` +FunctionTask (+ поле scope) ExecutionBoard (1:1) → ExecutionSubtask[] / Workflow / Roadmap + │ + ├─ scope = FUNCTION → Слой 1 (делегированное, видно всем по RBAC) + └─ scope = PERSONAL → Слой 2 (личное, видно только автору) +``` + +Разница между слоями — **одно поле `scope` и правила видимости**. Доска, подзадачи, workflow, roadmap, API — идентичны. Это и закрывает страх #113 о «втором портале задач»: код, схема и UI доски — одни и те же. + +--- + +## 7. Модель данных — delta к #113 + +Добавляем к модели #113 ровно одно поле на `FunctionTask` и ничего нового сверху. + +```prisma +enum FunctionTaskScope { + FUNCTION // делегированное / управленческое (дефолт, текущее поведение) + PERSONAL // личное, видно только автору +} + +model FunctionTask { + // ...существующие поля без изменений... + scope FunctionTaskScope @default(FUNCTION) // NEW · аддитивно + @@index([scope]) +} +``` + +Всё остальное (`FunctionTaskExecutionBoard`, `ExecutionSubtask`, `ExecutionWorkflow*`) — **ровно как в #113**, без изменений. `scope = FUNCTION` по умолчанию → существующие задачи и поведение не меняются. + +> Осознанно НЕ вводим отдельную сущность `PersonalTask`. Отдельная сущность = именно тот «второй трекер», которого боится #113. Переиспользование `FunctionTask` + `scope` даёт личный слой бесплатно с точки зрения доски/подзадач/API. + +--- + +## 8. Видимость и фильтры — как НЕ засорить backlog + +Главный риск, который называет #113 (§470, §61): личные задачи как шум в `/tasks`, weekly, метриках. Закрывается правилом видимости по `scope`: + +| Surface | Что показывает | Правило | +|---|---|---| +| `/tasks` (функция) | только `scope = FUNCTION` | `WHERE scope = 'FUNCTION'` по умолчанию | +| Weekly / management summary | только `scope = FUNCTION` | personal исключены жёстко | +| Метрики просрочки функции | только `scope = FUNCTION` | personal не влияют на KPI функции | +| `/my` (личный кокпит) | `assignee = me` обоих scope | personal + делегированные мне вместе | +| Доска `/tasks/[id]/execution` | по доступу к задаче | personal-доску видит только автор | + +Ключ: **personal-задачи не существуют для управленческих surfaces вообще**. Руководитель не видит личную кухню сотрудника; сотрудник не мусорит в backlog функции. + +--- + +## 9. RBAC + +Опираемся на уже существующую логику (`function-tasks/route.ts`) — почти ничего нового: + +| Действие | Правило | +|---|---| +| Создать `scope = PERSONAL` задачу себе | `WRITE_FUNCTION_TASKS` + `assignee = self` (уже разрешено кодом, лидерство не нужно) | +| Назначить personal-задачу другому | ❌ запрещено — personal по определению только себе | +| Создать доску под своей personal-задачей | автор задачи (правило #113 §456 — author/assignee) | +| Читать чужие personal-задачи | ❌ только автор; не отдаются даже лидеру функции | +| Перевести personal → function (эскалация) | автор + наличие `WRITE_FUNCTION_TASKS` на функцию; assignee остаётся, задача «всплывает» в backlog | + +> Эскалация `PERSONAL → FUNCTION` — приятный бонус: сотрудник вёл что-то для себя, оно выросло в реальную задачу функции → одним действием делает её видимой руководителю, не пересоздавая. + +--- + +## 10. Точки входа — без нового домена + +Полностью соблюдаем Non-goal #113 §69 «нет top-level домена». + +- **Личный слой = расширение `/my`** («Мои задачи»), который уже есть в портале. Добавляем режимы просмотра: список (как сейчас) + канбан + roadmap по личным+делегированным задачам сотрудника. +- **Создание personal-задачи** — кнопка «+ Задача» в `/my` с дефолтом `scope = PERSONAL, assignee = self`. +- **Доска** — та же `/tasks/[id]/execution`, через задачу. +- Сайдбар не получает новых доменов. `/my` уже там. + +--- + +## 11. Ответ на Non-goals #113 по пунктам + +| Non-goal #113 | Наша позиция | +|---|---| +| Не менять `FunctionTaskStatus` | ✅ принимаем, не трогаем | +| Не добавлять кастомные статусы к обычным задачам | ✅ принимаем (кастом только в доске) | +| Не закрывать родителя автоматически | ✅ принимаем | +| **Не добавлять top-level domain Boards/FlowTask** | ✅ **принимаем** — личный слой живёт в существующем `/my` | +| Не переносить айдентику FlowTask, палитру | ✅ принимаем — палитра MOEX | +| Не заменять `FunctionTaskTopic` | ✅ принимаем | +| Не заменять ITOM workflow | ✅ принимаем | +| **(неявно) Доска только для делегированного** | ⚠️ **оспариваем** — доска доступна и для personal-задач; механика та же, scope разный | + +Из восьми Non-goals оспариваем **один неявный**. Остальные семь — принимаем дословно. + +--- + +## 12. Открытые вопросы + +1. **Группировка личных задач.** Оставляем строго 1 доска : 1 задача (как #113), или даём сотруднику лёгкую группировку нескольких personal-задач в одном личном представлении? (Предлагаем: группировка только как view в `/my`, без новой сущности-контейнера.) +2. **Лимит на personal-задачи.** Нужен ли мягкий лимит, чтобы `/my` не превратился в свалку? (Предлагаем: нет лимита, но архивация/soft-delete по умолчанию.) +3. **Personal-задачи в поиске / ⌘K.** Показывать ли свои personal-задачи в глобальном поиске? (Предлагаем: да, но только автору.) +4. **Data transfer / export.** Personal-задачи входят в экспорт функции или только в личный экспорт пользователя? +5. **Видит ли руководитель факт наличия** личной загрузки (агрегат «у сотрудника N личных задач») без доступа к содержимому — или личное полностью невидимо? (Предлагаем: полностью невидимо в MVP.) + +--- + +## 13. Фазы + +Слой 1 (делегированный) = фазы #113 без изменений. Личный слой добавляется поверх: + +- **Phase L0** — добавить `FunctionTaskScope` (аддитивная миграция), дефолт `FUNCTION`. Правила видимости в `/tasks`, weekly, метриках (исключить PERSONAL). Без UI. +- **Phase L1** — `/my`: создание personal-задачи (scope=PERSONAL, self-assign), список personal + делегированных. +- **Phase L2** — доска под personal-задачей (переиспользует доску #113 как есть). +- **Phase L3** — `/my` канбан + roadmap по личным+делегированным. +- **Phase L4** — эскалация `PERSONAL → FUNCTION`; экспорт; поиск. + +--- + +## 14. Резюме для мейнтейнера + +Мы **не предлагаем альтернативу #113** — мы предлагаем **достроить #113 одним полем**. + +- Делегированный слой = #113 целиком, принят. +- Личный слой = `FunctionTask.scope = PERSONAL` + правила видимости + расширение `/my`. +- Та же доска, те же подзадачи, тот же API, та же палитра. +- Никакого второго трекера, никакого нового домена, никакого шума в backlog. +- Закрываем главное ожидание тестировавших коллег: вести *свою* ежедневную работу там же, где спущенную. diff --git a/docs/design/moex-portal-integration/boards-as-aggregates.html b/docs/design/moex-portal-integration/boards-as-aggregates.html new file mode 100644 index 0000000..f36d300 --- /dev/null +++ b/docs/design/moex-portal-integration/boards-as-aggregates.html @@ -0,0 +1,492 @@ + + + + + +Доска = агрегат задач · макет v2 (формальные источники) + + + +
+ + +
+

Доска как тематический агрегат задач

+

Задача — атомарная управляемая единица с формальным источником (поле sourceType, уже есть в схеме). Доска — полотно, группирующее набор задач тематически и катящее по ним сводный статус. Доска НЕ внутри задачи — задачи лежат на доске.

+
Правка v3: источники формальные — из enum FunctionTaskSource и связок CollegialBody/DirectiveSource. В интерфейсе системные коды (enum) НЕ показываем — только человекочитаемые русские названия. Коды остаются лишь в технических разделах ⑦⑧ и в коде. «Пространство» = существующие Function/Initiative/Program; сущности Workspace нет.
+ +

⎈ Единица vs агрегат

+
+
+
▢ Задача (FunctionTask) — управляемая единица
+
    +
  • Статус, исполнитель, срок, приоритет, ITOM, weekly
  • +
  • Формальный источник: sourceType + sourceRef
  • +
  • Существует сама по себе, даже без доски
  • +
  • Может лежать на нескольких досках (M:N)
  • +
+
+
+
▦ Доска (Board) — тематический агрегат
+
    +
  • Группирует набор задач по теме/потоку
  • +
  • Канбан / список / roadmap по этим задачам
  • +
  • Катит сводный статус (вычисляет, не хранит)
  • +
  • Scope = существующий контейнер: Function / Initiative / Program / Cross / Personal
  • +
+
+
+ +

① Источники задачи — три оси и их названия в интерфейсе

+

Слева — системное значение (enum, только в коде/спеке), справа — что видит пользователь. Enum в UI не показываем.

+
+
+
Ось A — ИсточникFunctionTaskSource
+
Вручную MANUAL
+
Директива CIO CIO_DIRECTIVE
+
Коллег. орган COLLEGIAL_BODY
+
Протокол совещания MEETING_PROTOCOL
+
Jira · Pulsar JIRA/PULSAR
+
Эл. почта · Другое EMAIL/OTHER
+
+
+
Ось B — ВидFunctionTaskKind
+
Обычная REGULAR
+
ITOM + источник директивы
+
У ITOM тип директивы показываем по-русски:
Исполнительный / Коллег. орган / Внутр. аудит / Внеш. аудит / Безопасность / Риск / Инцидент
DirectiveSourceType
+
+
+
Ось C — Делегированиеauthor vs assignee (выводится)
+
📥 делегирована — поставил другой
+
🙋 себе — автор и исполнитель один
+
Не enum, а отношение полей. «Сверху вниз» и «личная» — про это, а не про источник.
+
+
+
Для коллег. органа / ITOM в интерфейсе вместо кода показываем короткое имя органа (КПК, Правление, ОКИТА, Архком) — оно уже человекочитаемое и хранится в CollegialBody.shortName.
+ +

② Иерархия: Функция → Доски → Задачи

+

«Пространство» = существующая страница Function (или Initiative/Program). К ней добавляется вкладка «Доски» — без нового домена в сайдбаре. Доски живут внутри контейнера или поперёк него (scope = CROSS).

+ /functions/it-infra · вкладка «Доски» +
+
ОР
+
+
Моё
+
Главная
+
Мои задачи
+
Рабочие задачи
+
Функции
+
ИТ-инфраструктура
+
Стратегия
+
Инициативы
+
Цифровизация 2026
+
+
+

Функция · ИТ-инфраструктура

Руководитель: Орлов А. · 14 задач · 3 доски
+
ОбзорЗадачиДоскиКомандаМетрикиWeekly
+
+
+
+
▦ Имплементация портала Функция
+
5 задач из 2 функций · владелец Крылов А.
+
5задач
1готово
1просроч.
1блокер
+
+
+
+
▦ ITOM-директивы Q2 Функция
+
8 задач вида ITOM · владелец Орлов А.
+
8задач
3готово
2просроч.
0блокер
+
+
+
+
▦ Миграция в K8s Кросс-функц.
+
кросс-функциональная: ИТ-инфра + Безопасность + DevOps
+
12задач
5готово
1просроч.
2блокер
+
+
+
+
Кросс-функциональная доска (scope=CROSS) видна со страниц всех вовлечённых функций. Задача остаётся в своей функции — доска её только агрегирует.
+
+
+
+ Функция — в рамках функции + Инициатива + Кросс-функциональная + Личная (в «Мои задачи») +
+ +

③ Доска · Канбан задач

+

Карточки — полноценные задачи. Формальный источник чипом (+ shortName коллег. органа / ITOM). Сверху — сводный статус доски.

+ /functions/it-infra/boards/portal-impl?view=board +
+
КР
+
+
Функции
ИТ-инфраструктура
+
Стратегия
+
Инициативы
Цифровизация 2026
+
+
+
ИТ-инфраструктура / Доски / Имплементация портала
+

▦ Имплементация портала Функция

5 задач · владелец Крылов А.
+ +
+
5задач
1готово
+
1просрочено
1блокер
+
20%прогресс
+
+
+
+
К рассмотрению1
+
FT-131
Обновить SSL-сертификаты
КПК05.06
+
+
+
В работе2
+
FT-128
Backend портала
КРВручнуюделегир.
+
FT-140
Нагрузочные тесты
КРВручнуюсебе
+
+
+
Блокер1
+
FT-119
Миграция почтового кластера
СДДиректива CIO15.05
+
+
+
Готово1
+
FT-110
Подтвердить ITOM-директиву #109
КРITOMОКИТА
+
+
+
+ Вручную + Директива CIO + Коллег. орган (+ имя) + ITOM +
+
+
+ +

④ Доска · Список со сводным статусом

+ /functions/it-infra/boards/portal-impl?view=list +
+
КР
+
Функции
ИТ-инфраструктура
Стратегия
+
+

▦ Имплементация портала · Список

+ +
+
5задач
1/5готово
+
1просроч.
1блокер
+
+ + + + + + + +
КлючЗадачаИсточникВидИсполнительСрокСтатус
FT-128Backend порталаВручную делегир.ОбычнаяКрылов А.30.06В работе
FT-119Миграция почтового кластераДиректива CIOОбычнаяСидоров К.15.05Блокер
FT-131Обновить SSL-сертификатыКоллег. орган · КПКОбычнаяПетров И.05.06К рассм.
FT-110Подтвердить ITOM-директиву #109Коллег. орган · ОКИТАITOMКрылов А.12.06Готово
FT-140Нагрузочные тестыВручную себеОбычнаяКрылов А.В работе
+
+
+ +

⑤ Сборка доски (с выбором scope)

+

Доску создают на странице контейнера (функции/инициативы). Scope определяет, где она видна. Наполняют существующими задачами или заводят новые на доску.

+ +
Добавление на доску не меняет задачу: её статус, исполнитель, источник и видимость в /tasks остаются. Доска — организующий оверлей.
+ +

⑥ Карточка задачи — формальный источник + доски

+

Источник показывается формально (sourceType + ссылка на CollegialBody/DirectiveSource). Плюс — на каких досках задача состоит.

+ /tasks/FT-119 +
+
СД
+
Моё
Главная
Рабочие задачи
Функции
ИТ-инфраструктура
+
+
Рабочие задачи / FT-119
+

Миграция почтового кластера

Функция: ИТ-инфраструктура · Исполнитель: Сидоров К. · Срок 20.06
Блокер
+
+
Источник
Директива CIO · № DIR-2026-044 · поставил Орлов А.
+
Вид
Обычная
+
Делегирование
Орлов А. → Сидоров К. (делегирована)
+
На досках (M:N)
▦ Имплементация портала ↗▦ Миграция в K8s ↗
+
+
Описание
Перенос почтового кластера на новые ноды. Блокер: ждём окно обслуживания от ДЦ.
+
Задача управляется как обычно (статус, срок, weekly). Параллельно «считается» в двух тематических досках — каждая берёт её статус в агрегат.
+
+
+ +

⑦ Откуда берётся сводный статус доски

+

Доска не хранит статус — вычисляет из задач-членов. Спущенная сверху (директива CIO) задача автоматически в агрегате.

+
Доска «Имплементация портала»  (scope = FUNCTION: it-infra)
+  members = BoardTask[] → [FT-128, FT-119, FT-131, FT-110, FT-140]
+
+  агрегат (вычисляется по FunctionTask.status):
+    всего      = 5
+    готово     = count(status = DONE)                 → 1   (FT-110)
+    в работе   = count(status in {DOING})             → 2   (FT-128, FT-140)
+    блокер     = count(status = BLOCKED)              → 1   (FT-119)
+    просрочено = count(status ∉ {DONE,CANCELLED}      → 1   (FT-119)
+                       AND deadline < сегодня)
+    прогресс   = готово / всего                       → 20%
+
+  ▸ FunctionTaskStatus НЕ меняется — доска только читает.
+  ▸ Изменили статус задачи где угодно (/tasks, другая доска, ITOM)
+    → агрегат всех её досок пересчитывается.
+ +

⑧ Модель данных и границы #113

+

Источник у задачи уже есть в схеме — не добавляем. Новое: Board + BoardTask (M:N). Воркспейс не вводим.

+
// УЖЕ В СХЕМЕ — не трогаем:
+model FunctionTask {
+  kind        FunctionTaskKind      // REGULAR | ITOM
+  sourceType  FunctionTaskSource    // MANUAL | CIO_DIRECTIVE | COLLEGIAL_BODY | ...
+  sourceRef   String?               // → CollegialBody / DirectiveSource / номер
+  sourceUrl   String?
+  authorId    String                // делегирование выводится из author vs assignee
+  assigneeId  String?
+  status      FunctionTaskStatus    // НЕ меняем
+}
+
+// НОВОЕ — тематический агрегат:
+model Board {
+  id      String @id
+  name    String                    // тема
+  scope   BoardScope                // FUNCTION | INITIATIVE | PROGRAM | CROSS | PERSONAL
+  functionId   String?              // привязка к существующему контейнеру
+  initiativeId String?
+  programId    String?
+  ownerId String
+  // статус НЕ хранится — вычисляется из members
+}
+model BoardTask {                    // M:N, видимая связь
+  boardId String
+  taskId  String                     // → FunctionTask
+  @@id([boardId, taskId])
+}
+enum BoardScope { FUNCTION INITIATIVE PROGRAM CROSS PERSONAL }
+ + + + + + + + + +
Аспект#113Эта модель v2
Что такое доскапод-контейнер одной задачиагрегат набора задач
Карточки доскиExecutionSubtaskполноценные FunctionTask
Связь1 доска : 1 задачаM:N (BoardTask)
Источник задачиформально: sourceType + sourceRef (уже в схеме)
«Пространство»существующие Function / Initiative / Program (новой сущности нет)
Точка входачерез задачувкладка «Доски» на странице контейнера
FunctionTaskStatusне меняетсяне меняется ✓
+
На согласование мейнтейнеру: (1) разворот концепции доски — над задачами, а не под одной; (2) подзадачи #113 сохраняем как внутреннюю декомпозицию задачи, не конфликтуют; (3) Workspace из нашего v4 выброшен — роль играют существующие контейнеры.
+
+
+ + diff --git a/docs/design/moex-portal-integration/execution-boards.html b/docs/design/moex-portal-integration/execution-boards.html new file mode 100644 index 0000000..c4831da --- /dev/null +++ b/docs/design/moex-portal-integration/execution-boards.html @@ -0,0 +1,685 @@ + + + + + +#113 — Доска исполнения FunctionTask · макет + + + +
+ + +
+

Доска исполнения FunctionTask

+

Сложное поручение разбивается на подзадачи внутри одной управленческой задачи. Руководитель видит агрегат, исполнитель — рабочее пространство. FunctionTaskStatus не меняется, подзадачи не попадают в общий backlog.

+ +
Модель #113: FunctionTask → FunctionTaskExecutionBoard (1:1) → ExecutionSubtask[] · ExecutionWorkflow · Roadmap. Доска находится через родительскую задачу по роуту /tasks/[id]/execution — нового top-level домена в сайдбаре нет.
+ + +

⎈ Маршрут целиком

+

Постановка задачи происходит там же, где сегодня в портале — /tasks (Рабочие задачи) или внутри функции. Доска исполнения не меняет точку постановки, а добавляется внутрь уже созданной задачи.

+
+
Руководитель
/tasks
+
+
Руководитель
+ Задача → форма
+
+
Исполнитель
/tasks/FT-128
+
+
Исполнитель
+ Доску из шаблона
+
+
+
Исполнитель
…/execution?view=board
+
+
Исполнитель
…?view=roadmap|list|workflow
+
+
Руководитель
/tasks/FT-128
+
+ + +

⓪ Рабочие задачи — где ставится задача

+

Существующая страница портала. Руководитель ставит задачу кнопкой «+ Задача». Бейдж «⚙ доска» подсказывает, у каких задач уже есть исполнение.

+ /tasks +
+
РК
+
+
Моё
+
Главная
+
Мои задачи
+
Рабочие задачи
+
Функции
+
ИТ-инфраструктура
+
Стратегия
+
+
+

Рабочие задачи

ИТ-инфраструктура · 14 задач
+
+
Функция: ИТ-инфраструктура ▾
Статус: активные ▾
Тип: все ▾
☐ есть доска
+ + + + + + +
КлючЗадачаТипОтветственныйСрокСтатусИсполнение
FT-128Имплементировать порталРабочаяКрылов А.30.06В работе⚙ доска · 2/6
FT-131Обновить SSL-сертификатыITOMПетров И.05.06К рассмотрению
FT-119Миграция почтового кластераРабочаяСидоров К.20.06В работе
FT-110Подтвердить ITOM-директиву #109ITOMКрылов А.12.06Перенос
+
Подзадачи доски FT-128 здесь не показываются как отдельные строки — только бейдж агрегата. Backlog не засоряется (Интеграции §470).
+
+
+ + +

① Создание задачи и назначение ответственного

+

Обычная форма постановки FunctionTask — без изменений по #113. Тип REGULAR / ITOM, ответственный, срок, приоритет. Доска появится позже, внутри задачи.

+ /tasks → модалка «Новая задача» + +
На этом шаге доска не создаётся. Постановка = управленческая единица. Разбиение на исполнение — отдельный осознанный шаг исполнителя (Client Journey §90).
+ + +

② Задача создана — исполнитель открывает, доски ещё нет

+

Пустое состояние блока «Исполнение» — короткое пояснение и кнопка создания (если есть право).

+ /tasks/FT-128 +
+
+ +
+ +
КР
+
+
+
Моё
+
Главная
+
Мои задачи
+
Рабочие задачи
+
Функции
+
ИТ-инфраструктура
+
Стратегия
+
Аналитика
+
Сводка
+
Дерево целей
+
+
+
Рабочие задачи / FT-128
+
+
+

Имплементировать портал

+
Функция: ИТ-инфраструктура · Ответственный: Крылов А. · Срок 30.06
+
+
+ В работе +
+ +
Описание
Полная имплементация внутреннего портала: backend, UI, миграции, QA, rollout, коммуникации.
+ +
+
⚙ Доска исполнения
+
+
Доски исполнения пока нет
+
Разбейте задачу на подзадачи с собственным процессом и сроками. Подзадачи не попадут в общий список задач.
+ +
+
+
+
+
Пустое состояние без маркетингового текста (UI Contract §369). Кнопка видна, только если пользователь может редактировать задачу или является assignee / author / ITOM-куратором.
+ + +

③ Исполнитель заводит доску исполнения

+

Из шаблона workflow или пустую. Шаблон задаёт стартовый набор статусов с semantic-бакетами — их можно отредактировать позже во вкладке Workflow.

+ /tasks/FT-128 → «Создать доску исполнения» + +
Одна активная доска на задачу (parentTaskId @unique). RBAC: создать может тот, кто редактирует задачу, либо assignee / author / ITOM-куратор / co-assignee.
+ + +

④ Доска исполнения · Канбан

+

Колонки = кастомные статусы workflow доски. Каждый статус имеет обязательный semantic bucket (цвет точки).

+ /tasks/FT-128/execution?view=board +
+
+ +
КР
+
+
+
Моё
+
Главная
+
Мои задачи
+
Рабочие задачи
+
Функции
+
ИТ-инфраструктура
+
+
+
Рабочие задачи / FT-128 / Доска исполнения
+
+

Доска исполнения · Имплементировать портал

+
Владелец: Крылов А. · Родительский статус: В работе
+
+ +
+ + +
+
Исполнитель: все ▾
+
Семантика: open ▾
+
Срок: квартал ▾
+
☐ только мои
+
☐ блокеры
+
+
+
2/6выполнено
+
1просрочено
+
1блокер
+
20.05ближайший срок
+
+ +
+
+
К проработке2
+
QA smoke-прогон
P221–25.05
+
Rollout + коммуникации
P226–30.05
+
+
+
Дизайн0
+
+
+
Разработка1
+
UI: канбан подзадач
ИВP1до 20.05
+
+
+
Заблокировано1
+
OpenAPI-контракт доски
СДP0просрочка 15.05
+
+
+
Готово2
+
Backend: API доски
КРdone
+
Миграция Prisma
ПТdone
+
+
+
+ todo + in_progress + blocked + done + — кастомный label свободный, semantic bucket обязателен +
+
+
+ + +

⑤ Roadmap

+

Бары по startDate/dueDate, today line всегда, zoom неделя/месяц/квартал. Цвет — из semantic token, не из raw hex. Просрочка только для не-done/cancelled.

+ /tasks/FT-128/execution?view=roadmap&zoom=month +
+
+ +
КР
+
+
+
Моё
+
Главная
+
Мои задачи
+
Рабочие задачи
+
+
+
Рабочие задачи / FT-128 / Доска исполнения
+

Доска исполнения · Roadmap

+ +
+ + +
+
+
Подзадача
+
нед.18
нед.19
нед.20
нед.21
нед.22
+
+
+
Backend: API доски
done
+
Миграция Prisma
done
+
OpenAPI-контракт
просрочка
+
UI: канбан подзадач
в работе
+
QA smoke
todo
+
Rollout + коммуникации
+
+
+ done + in_progress + overdue (semantic ≠ done, due < сегодня) + milestone (нет startDate) +
+
+
+
Milestones и зависимости — отдельная фаза. MVP: только date-based bars (Roadmap Contract §361).
+ + +

⑥ Список

+ /tasks/FT-128/execution?view=list +
+
КР
+
Моё
Главная
Мои задачи
Рабочие задачи
+
+
Рабочие задачи / FT-128 / Доска исполнения
+

Доска исполнения · Список

+ + + + + + + + + +
ПодзадачаСтатусИсполнительСтартСрокПриоритет
Backend: API доскиГотовоКрылов А.01.0510.05P1
Миграция PrismaГотовоПетров И.02.0506.05P1
OpenAPI-контракт доскиЗаблокированоСидоров К.10.0515.05P0
UI: канбан подзадачРазработкаИванова М.08.0520.05P1
QA smoke-прогонК проработке21.0525.05P2
Rollout + коммуникацииК проработке26.0530.05P2
+
+
+ + +

⑦ Workflow-редактор

+

Кастомные статусы с обязательным semantic bucket. Нельзя удалить статус с подзадачами без migration action; нельзя оставить workflow без initial и хотя бы одного final-статуса.

+ /tasks/FT-128/execution?view=workflow +
+
КР
+
Моё
Главная
Мои задачи
Рабочие задачи
+
+
Рабочие задачи / FT-128 / Доска исполнения
+

Доска исполнения · Workflow

+
Шаблон: «Разработка ПО» · применён к этой доске
+ +
+
К проработке initial
semantic: todo
+
+
Дизайн
semantic: in_progress
+
+
Разработка
semantic: in_progress
+
+
Заблокировано
semantic: blocked
+
+
Готово final
semantic: done
+
+
+
+
+
Если transition-строк нет — разрешены все переходы (simple mode). Если есть — backend валидирует каждый переход (Data Model §319).
+ + +

⑧ Карточка подзадачи (drawer)

+

Детали, редактирование, комментарии и история — внутри доски. Audit подзадач пишется отдельно от parent task audit.

+
+
+
ЗаблокированоP0
+

OpenAPI-контракт доски

+
+
+
Исполнитель
СД Сидоров К.
+
+
Старт
10.05
+
Срок
15.05 · просрочка
+
+
Описание
Описать Zod/OpenAPI для всех routes доски исполнения. Заблокировано: ждём ревью схемы от архитектора.
+
КомментарииИстория
+
КР
Крылов А.14.05 16:02
@Сидоров что по ревью схемы? Срок завтра.
+
СД
Сидоров К.15.05 09:40
Архитектор в отпуске до 19.05, поставил блокер.
+
+ + +
+
+
+
Смена статуса идёт через POST /api/execution-items/[id]/transition с backend-валидацией перехода.
+ + +

⑨ Возврат к руководителю — агрегированный summary

+

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

+ /tasks/FT-128 +
+
+ +
РК
+
+
+
Моё
+
Главная
+
Мои задачи
+
Рабочие задачи
+
Функции
+
ИТ-инфраструктура
+
Стратегия
+
+
+
Рабочие задачи / FT-128
+
+

Имплементировать портал

+
Функция: ИТ-инфраструктура · Ответственный: Крылов А. · Срок 30.06
+
В работе +
+ +
+
⚙ Доска исполнения владелец: Крылов А.
+
+
2/6
Выполнено
+
1
Просрочено
+
1
Блокер
+
20.05
Ближайший срок
+
+
+
Последний апдейт: Иванова М. перевела «UI: канбан подзадач» → Разработка · сегодня 11:24
+
+ + +
+
+
+
+
Агрегат считается только по semantic bucket подзадач: просрочка — где semantic ≠ done/cancelled и dueDate < сегодня. Статус родителя не выводится из подзадач (Status Algebra §146).
+ + +

⑩ Закрытие родительской задачи с открытыми подзадачами

+

Не блокируем — показываем предупреждение. Решение остаётся ручным (Non-goal §68).

+
+
+

Закрыть основную задачу?

+

В доске исполнения есть незавершённые подзадачи (4 из 6). Статус «Имплементировать портал» будет переведён в «Готово». Подзадачи останутся как есть.

+
+ + +
+
+
+
То же предупреждение при переводе ITOM-задачи в IMPLEMENTED/CONFIRMED — но ITOM-статус не выводится из подзадач и меняется только через ITOM endpoints.
+ + +

⑪ Контракт и границы (что НЕ делаем)

+ + + + + + + + + + +
ГраницаРешение #113
FunctionTaskStatusНе меняем. Кастомные статусы — только внутри доски
SidebarНет нового домена «Boards» / «FlowTask». Доска — через задачу
ПодзадачиПлоские, отдельная сущность ExecutionSubtask. Не глобальные FunctionTask. Без materialized path в MVP
FunctionTaskTopicНе заменяется. Тема — группировка задач; доска — исполнение одной задачи
/tasks, /my, weeklyПоказывают только parent task + compact summary. Подзадачи не попадают в backlog
АйдентикаПалитра MOEX, токены статусов. Без mock-фреймов, бейджей и бренда FlowTask
МиграцияТолько аддитивная, soft-delete, без db push/reset, без backfill
RoadmapMVP — date-based bars. Зависимости/critical path — отдельная фаза
+
Маршруты: GET/POST /api/function-tasks/[id]/execution-board · /api/execution-boards/[boardId] · /items · /api/execution-items/[id]/transition · /roadmap · /workflow. Все — через Zod/OpenAPI.
+
+
+ + diff --git a/docs/design/moex-portal-integration/index.html b/docs/design/moex-portal-integration/index.html new file mode 100644 index 0000000..bf098db --- /dev/null +++ b/docs/design/moex-portal-integration/index.html @@ -0,0 +1,2742 @@ + + + + + +FlowTask × MOEX Portal — эволюция управления задачами (v4) + + + + + + + +
+ + + +
+ + +
+

v4 Что изменилось

+

По фидбэку владельца портала. Документ переработан: сначала визуал, потом функции, в конце техника.

+
    +
  • новое Управление задачами — единая точка входа /work со всеми функциями
  • +
  • убрано Задачи стратегии — мигрируем в основные задачи, убираем дублирование
  • +
  • изменено Обзор — позиционирование: эволюция задач портала, 3 ключевых фичи
  • +
  • изменено Анализ — секция «Что убираем» вместо «Что не добавляем»
  • +
  • изменено Мои задачи — таб «Стратегия» вместо дублирования
  • +
  • изменено Точки входа — задачи стратегии помечены как устаревшие
  • +
  • изменено Фазы — добавлена миграция, обновлён «Что убираем»
  • +
  • изменено Риски — добавлены риски миграции + обновлены вопросы
  • +
+
+ + +
+

FlowTask × MOEX Portal — эволюция управления задачами v4 изменено

+

FlowTask становится развитием существующих FunctionTask (рабочие) и FunctionTask kind=ITOM — двух типов задач портала. Три ключевые фичи: вложенность задач (materialized path), кастомные workflow (Workflow → Status → Transition), roadmap задач (таймлайн W/M/Q). Стратегические задачи (ActionItem) убираем — дублирование. Workspace и Board — организационный слой над задачами, не ломающий legacy.

+ +
Принцип v4. FlowTask = эволюция пункта 2 (рабочие задачи + ITOM) с облегчённым интерфейсом. Три фокуса: вложенность подзадач, кастомизация workflow, roadmap. ActionItem (задачи стратегии) — убираем, излишний дублирующий слой. Workspace/Board — надстройка над Function / FunctionTaskTopic, не замена. Существующие маршруты /functions/[slug]/*, TopicsWorkspace, TasksWorkspace, FunctionDetail — расширяются.
+ +
+
+
3 ключевых фичи FlowTask → портал v4
+

Что внедряем

+
    +
  • ① Вложенность задач — parentId/path/depth (materialized path, неограниченная иерархия)
  • +
  • ② Кастомные workflow — Workflow → WorkflowStatus → WorkflowTransition (3 режима: FORWARD_ONLY / BIDIRECTIONAL / CUSTOM)
  • +
  • ③ Roadmap задач — таймлайн с зумом W/M/Q, цветные бары по статусу, milestone-ромбы
  • +
  • Custom labels с цветами
  • +
  • Trash + 30-дневный restore
  • +
  • @mention в комментариях
  • +
  • Inline-edit статуса / исполнителя
  • +
+
+
+
Как меняется портал v4
+

Эволюция задач + убираем дублирование

+ + + + + + + + + + + +
─── FunctionTask обогащается ───
TaskFunctionTask есть · +parentId/path/depth · +customStatusId · +startDate · +boardId
TopicFunctionTaskTopic есть · +workflowId · +boardId
─── новые таблицы (организация) ───
Workspace+new организационный слой над Function
Board+new доска внутри Workspace
Workflow+new кастомные статусы + переходы
Roadmap+new view на трёх уровнях
─── убираем дублирование ───
ActionItemудалить задачи стратегии → мигрируем в FunctionTask. Избавляемся от дублирования
+
+
+ +
Главное — три фичи FlowTask обогащают FunctionTask. (1) Вложенность: parentId/path/depth — подзадачи без ограничений. (2) Кастомный workflow: вместо жёсткого enum — гибкие статусы и переходы. (3) Roadmap: таймлайн задач с зумом. Workspace и Board — организационный слой, Topic → swimlane внутри доски. Legacy UI работает без изменений для тем без boardId.
+ +
ActionItem убираем. Стратегические задачи (ActionItem) дублируют FunctionTask. Мигрируем данные в FunctionTask с тегом source: strategy, привязкой к Initiative через Topic.initiativeId. Один тип задачи на весь портал.
+ +
Дорожные карты на трёх уровнях: /workspaces/[slug]/roadmap (агрегат досок) · /boards/[id]/roadmap (одна доска, формат как в FlowTask) · /strategy-viz?view=roadmap (Programs/Initiatives — без ActionItem). Все в едином визуальном языке: zoom week/month/quarter, цветные бары по workflow status, milestone-ромбы.
+
+ + +
+

01 Что есть и где «болит»

+ +

Уже реализовано в портале

+
+
Сотрудники и оргструктура

CRUD сотрудников (штат / ПАП), иерархия подразделений, должности, ставки per-role / per-employee, импорт/экспорт Excel.

+
Дерево целей OKR / KPI

Стратегические → бизнес-план → OKR-декомпозиция, квартальные метрики (план/факт), история (EntityHistory).

+
Команды и стримы

БФК · поток · платформа. Стримы с CPO/CTO. Lifecycle OPEN→CLOSE/PROLONG. Цели с весами 100%.

+
Стратегия и программы

Программы → инициативы → задачи инициатив → milestones → approval chains.

+
Дашборды и структура

6 режимов структуры компании. Граф @xyflow + dagre. Recharts. Фильтры «на дату» с дельтами.

+
FunctionTask (есть)

Kanban + list, comments, фильтры, ITOM-режим с двусторонним Jira-синком, bulk-parse, теги.

+
+ +

Гэпы — что нужно дописать в существующие сущности

+ + + + + + + + + + + +
Что не хватаетВ какую существующую сущность портала добавляем
Кастомный workflow на тему (доску). Сейчас статусы зашиты в enum FunctionTaskStatusПоле workflowId String? в FunctionTaskTopic. Новые таблицы Workflow, WorkflowStatus, WorkflowTransition. Если у Topic нет workflow — используется legacy enum
Подзадачи. Сейчас FunctionTask — плоский список, иерархии нетparentId · path · depth в FunctionTask (materialized path). Все nullable, не ломает legacy
Kanban-вью с drag-and-drop на странице Topic. Сейчас TopicsWorkspace — список темНовый маршрут /functions/[slug]/topics/[topicId]. Компонент TopicBoardView рядом с существующим TaskBoardView из components/functions/tasks/
Custom labels per topic с цветами. Сейчас словарь STANDARD_TASK_TAGS глобальныйНовые таблицы LabeltopicId nullable + functionId nullable), TaskLabel. STANDARD_TASK_TAGS остаётся как seed
«Мои задачи» как единый inbox по источникамРасширение существующего /tasks (TasksWorkspace уже умеет scope="my"). Добавить табы по типам: мой Topic / FunctionTask без темы / ActionItem / на ревью / Milestone
Trash + restore. Сейчас у FunctionTaskTopic уже есть deletedAt, у FunctionTask — только hard-deletedeletedAt · deletedBy · purgeAt в FunctionTask. Cron на purge через 30 дней. Reuse существующего паттерна Topic
Daily / Weekly digest менеджерамСуществующая страница /functions/[slug]/weekly расширяется + новый /digest. Vercel Cron + email через существующую Notification
@mention в комментарияхСуществующий TaskCommentEditor + mention-popup. Push в существующую Notification
Roadmap-вью для Initiative · ProgramСуществующие сущности Initiative · Program · StrategyTask · Milestone рисуем в timeline. Reuse существующего app/(strategy)
+ +

Что УБИРАЕМ из портала (дублирование) v4 убрано

+
ActionItem → удалить. Стратегические задачи (ActionItem, StrategyTask) дублируют FunctionTask. Держать два параллельных типа задач — лишняя сложность. Решение: мигрировать ActionItem в FunctionTask (с тегом source: strategy) и привязать к Initiative через Topic.initiativeId. Таблицы ActionItem и связанные — deprecate, затем drop.
+ +

Что сохраняется без изменений

+
    +
  • FunctionTask (рабочие) — основная сущность задач. FlowTask обогащает её тремя фичами
  • +
  • FunctionTask kind=ITOMFunctionTaskItomDetails, Jira-синк. Не трогаем, workflow ITOM сохраняется
  • +
  • Member rolesUserPermission · RolePreset с scopes READ_FUNCTION_TASKS · MANAGE_FUNCTION_TASKS_ALL · WRITE_FUNCTION_TASKS
  • +
  • Calendar / Workload/functions/[slug]/calendar · /workload · /weekly · /dynamics
  • +
  • Goals bindingFunctionTaskTopic.goalId уже есть. FunctionTask.goalId тоже
  • +
+
+ + +
+

02 Способы встраивания (отсечённые отброшены)

+

Поскольку FunctionTaskTopic уже выполняет роль Board, а Function — Workspace, варианты с iframe / отдельным сервисом / поддоменом теряют смысл. Остаются только три:

+ + + + + + + + + + + + + + + + + +
ПодходСутьРешение
A. Расширение существующих сущностей
рекомендуется
Добавить nullable-поля в FunctionTask и FunctionTaskTopic. Новые таблицы Workflow / WorkflowStatus / WorkflowTransition / Label / TaskLabel. Расширить существующие компоненты TopicsWorkspace · TasksWorkspaceПринято. Никаких новых страниц / маршрутов / понятий. Один деплой, одна БД, один auth, один Prisma client
B. Headless движокFlowTask backend как отдельный сервис, портал вызывает по APIОтброшено: два источника истины для FunctionTask, latency, cross-DB sync для employee/RBAC
C. iframe / module federationFlowTask мается в /work через iframe или MFОтброшено: ломает портал-нативность, дублирует sidebar/header, страдает мобильная версия
+
Решение. Подход A. Дальше документ описывает только его — детальный mapping, маршруты, фазы.
+
+ + + + + +
+

04 Маппинг сущностей и расширение схемы

+ +

Полная карта соответствия

+ + + + + + + + + + + + + + + + + + +
FlowTaskВ moex-portalДействие
Workspace+ new WorkspaceНовая таблица. functionId? · initiativeId? · programId? (любое из них может быть задано, но взаимоисключаемы). Для каждой существующей Function создаётся зеркальный Workspace при first-use. Cross-функциональный — без functionId
Board+ new BoardНовая таблица. Принадлежит Workspace. Может агрегировать N тем (Topic) и/или содержать задачи напрямую. Хранит свой workflowId, prefix для issueKey, viewMode (kanban/list/calendar/roadmap)
TopicFunctionTaskTopic есть+ nullable boardId. Если задан — тема живёт «внутри» доски. Если null — legacy-режим (тема показывается как раньше в TopicsWorkspace)
TaskFunctionTask есть+ nullable parentId · path · depth · customStatusId · boardId · startDate · deletedAt · deletedBy · purgeAt. boardId для задач, помещённых на доску без привязки к Topic. startDate — для отображения бара на Roadmap
Workflow+ new Workflow · WorkflowStatus · WorkflowTransition3 новые таблицы. Привязка через Board.workflowId (или, для legacy-Topic без доски, FunctionTaskTopic.workflowId). Если null — legacy FunctionTaskStatus enum
Roadmap+ new view + поляНовый view-режим. На каждом уровне — свой URL: /workspaces/[slug]/roadmap · /boards/[id]/roadmap · /strategy-viz?view=roadmap. Использует FunctionTask.startDate · dueDate, цвета статусов из WorkflowStatus.color
Label+ new Label · TaskLabel2 новые таблицы. Label.boardId? · Label.workspaceId? · Label.functionId?. STANDARD_TASK_TAGS остаётся как seed
CommentComment · TaskCommentEditor естьВ компонент добавляется mention-popup. В Notification — новый тип TASK_MENTIONED
ChecklistFunctionTask.resultChecklist Json естьОпционально вытаскиваем в реляционную ChecklistItem. На фазе 1 не трогаем
Subtask↩ self-ref на FunctionTaskРешается полями parentId · path · depth в FunctionTask
RBACUserPermission · RolePreset · RolePermission естьДобавляются scopes уровня доски (MANAGE_BOARD, WRITE_BOARD_TASKS) и спейса (MANAGE_WORKSPACE)
HistoryEntityHistory естьpolymorphic — пишем туда же с entityType='WORKSPACE' / 'BOARD' / 'FUNCTION_TASK' / 'FUNCTION_TASK_TOPIC'
NotificationNotification естьНовые типы: TASK_MENTIONED, BOARD_ASSIGNED, TASK_DUE_TOMORROW, DIGEST_DAILY
MFA per workspace+ new в WorkspaceПоля requireMfa · mfaGraceDays в новой таблице Workspace. Гейт в resolvePermissions
Trash+ unified patternНа FunctionTaskTopic.deletedAt уже есть. На FunctionTask · Board · Workspace добавляются deletedAt · deletedBy · purgeAt
Digest+ new /digestVercel Cron → Notification + email
+ +

Что добавляется в схему Prisma

+
+
+
// ─── NEW · Workspace (надстройка) ────────────
+model Workspace {
+  id           String @id @default(cuid())
+  name         String
+  slug         String @unique
+  description  String?
+  // ровно ОДИН из трёх FK задан
+  functionId   String? @unique // зеркало функции
+  function     Function? @relation(...)
+  initiativeId String?
+  initiative   Initiative? @relation(...)
+  programId    String?
+  program      Program? @relation(...)
+  // конфигурация
+  requireMfa   Boolean @default(false)
+  mfaGraceDays Int     @default(7)
+  ownerId      String
+  boards       Board[]
+  // soft-delete
+  deletedAt    DateTime?
+  deletedBy    String?
+  purgeAt      DateTime?
+  createdAt    DateTime @default(now())
+  updatedAt    DateTime @updatedAt
+}
+
+// ─── NEW · Board (внутри Workspace) ──────────
+model Board {
+  id          String @id @default(cuid())
+  workspaceId String
+  workspace   Workspace @relation(...)
+  name        String
+  prefix      String  // для issueKey: "SP", "OPS"
+  description String?
+  workflowId  String? // если null — legacy enum
+  workflow    Workflow? @relation(...)
+  viewMode    BoardViewMode @default(KANBAN)
+  // соотносится с дорожной картой
+  startDate   DateTime?  // окно для Roadmap-вью
+  endDate     DateTime?
+  topics      FunctionTaskTopic[] // M:N через boardId
+  tasks       FunctionTask[]      // напрямую
+  labels      Label[]
+  // soft-delete
+  deletedAt   DateTime?
+  createdAt   DateTime @default(now())
+
+  @@unique([workspaceId, prefix])
+}
+
+enum BoardViewMode { KANBAN LIST CALENDAR ROADMAP }
+
+
+
// ─── existing models · ДОБАВЛЯЕМ поля ────────
+model FunctionTaskTopic {
+  // существующие поля без изменений
+  boardId      String?   // NEW · принадлежность доске
+  board        Board?    @relation(...)
+  workflowId   String?   // NEW · legacy режим (если нет доски)
+  initiativeId String?   // NEW · кросс-функц
+  // labels per topic — через boardId.labels
+}
+
+model FunctionTask {
+  // существующие поля без изменений
+  // НОВЫЕ — все nullable
+  boardId        String?  // прямо на доске (без topic)
+  parentId       String?  // self-ref
+  path           String   @default("/")
+  depth          Int      @default(0)
+  customStatusId String?  // → WorkflowStatus
+  startDate      DateTime? // для Roadmap (бар: start..due)
+  labels         TaskLabel[]
+  deletedAt      DateTime?
+  deletedBy      String?
+  purgeAt        DateTime?
+  @@index([boardId, customStatusId])
+  @@index([parentId])
+  @@index([path])
+}
+
+// ─── NEW · Workflow + status + transition ────
+model Workflow {
+  id    String @id @default(cuid())
+  name  String
+  type  WorkflowType  // FORWARD_ONLY | BIDIRECTIONAL | CUSTOM
+  statuses    WorkflowStatus[]
+  transitions WorkflowTransition[]
+  boards      Board[]
+  topics      FunctionTaskTopic[]
+}
+model WorkflowStatus {
+  id String @id @default(cuid())
+  workflowId String
+  name String; color String; category String
+  sortOrder Int
+}
+model WorkflowTransition {
+  id String @id @default(cuid())
+  workflowId String; fromId String; toId String
+  requireApproval Boolean @default(false)
+}
+// + Label / TaskLabel — см. предыдущую версию
+
+
+ +
Объём миграции. ALTER TABLE: 2 (FunctionTaskTopic, FunctionTask) добавление nullable полей. CREATE TABLE: 6 новых (Workspace, Board, Workflow, WorkflowStatus, WorkflowTransition, Label + TaskLabel). Все аддитивные. Legacy UI (TopicsWorkspace, TasksWorkspace) не ломается: пока у темы boardId IS NULL — она показывается по-старому.
+ +

Как сосуществуют новые сущности и существующие

+
+ + + + + + + + + +
СценарийКак работает
Функция «strategy-partnership» сегодня4 темы без boardId. Старый UI показывает их в TopicsWorkspace
Руководитель создаёт первый WorkspaceАвтоматически создаётся Workspace с functionId=strategy-partnership, slug=strategy-partnership. В нём — одна дефолтная доска «Все темы», которая агрегирует 4 существующих темы
Создание второй доски «Портфельное управление 2026»Новая Board с workflowId = новый workflow «Portfolio». Часть тем (или новых) присваивается этой доске через FunctionTaskTopic.boardId
Просмотр Roadmap спейса/workspaces/strategy-partnership/roadmap — агрегирует обе доски на одной timeline-канве
Просмотр Roadmap доски/boards/[id]/roadmap — только задачи этой доски, формат как в FlowTask
Кросс-функциональная инициатива «K8s migration»Создаётся Workspace без functionId, с initiativeId. Темы из 3-х функций перепривязываются на доску этого спейса через boardId
Старая страница /functions/[slug]/topicsПродолжает работать. Темы без boardId показываются в общем списке. Темы с boardId — со стрелкой «↗ Доска» и линком
+
+
+ + +
+

05 Архитектура встраивания

+
+ + + + + + + Пользователь + SSO / JWT + + + Next.js 16 · App Router · единый shell портала + + Layout · Sidebar + + /goals · /teams + + /work · /tasks + + /initiatives · /streams + + /admin · /api + + + Route Handlers · OpenAPI 3.1 · Zod + + Work API (новое) + workspaces · boards · tasks + + Tasks API (есть) + function-tasks · itom · topics + + Domain API (есть) + goals · teams · streams + + Cron · Digest · Sync + jira · digest · purge + + + Service layer (lib/) · единый Prisma, единый auth + + work-service + + tasks-service (есть) + + access · permissions + + entity-history · audit-log + + + PostgreSQL 16 · Prisma 7 · единая БД + + + Workspace · Board + + Workflow · Label + + Trash pattern + + FunctionTask + ext + workspaceId · parentId · path + issueKey · labels[] + + Goal · Team · Stream + Initiative · Program + существующие модели + + User · Permission + EntityHistory · Notification + единый RBAC + + + + + + + + +
+
Принципы: единый shell · единый auth/RBAC · единая БД · единый Prisma. Новый Work-домен живёт в тех же папках app/work/, lib/work/, components/work/. Существующие модули портала остаются — расширяются адаптерами.
+
+ + +
+

06 Точки входа FlowTask по всему порталу

+

FlowTask не отдельный остров — он «прорастает» в существующие блоки портала. Из каждой ключевой страницы есть короткий путь в нужный функционал управления задачами. Ниже — полная карта переходов.

+ +
+
+
Источник/my
+
Моя панель
+
Существующий виджет «Рабочие задачи» получает таб «По темам». Клик по задаче → существующий TaskDetailDrawer
+
/my → drawer
+
+
+
Источник/tasks
+
Рабочие задачи
+
Существующий TasksWorkspace scope="my". Добавляются табы по источникам: тема / без темы / action item / ревью / milestone
+
/tasks → drawer
+
+
+
Источник/functions
+
Список функций
+
В существующей карточке функции — счётчик активных тем и просрочек. Никаких новых страниц
+
/functions/[slug]
+
+
+
Источник/functions/[slug]
+
Карточка функции (главная точка)
+
Существующий FunctionDetail. К существующим вкладкам Метрики/Обязательства добавляется блок «Темы и доски»
+
/functions/[slug]/topics
+
+
+
Источник/functions/[slug]/topics
+
Темы функции
+
Существующий TopicsWorkspace. Кросс-функциональные темы — уже есть в коде («одна тема может объединять задачи из разных функций»)
+
/functions/[slug]/topics/[topicId] new
+
+
+
Источник/functions/[slug]/tasks
+
Задачи функции
+
Существующий TasksWorkspace scope="function". Добавляется иерархия подзадач, inline-edit статуса
+
drawer / subtask tree
+
+
+
Источник/functions/[slug]/calendar
+
Календарь функции
+
Существующая страница. Слой: дедлайны задач из всех тем функции дополняются к существующим FunctionEvent
+
+ tasks layer
+
+
+
Источник/functions/[slug]/workload
+
Нагрузка функции
+
Существующая heatmap нагрузки. Клик по ячейке сотрудник×неделя → drawer со списком задач из всех тем
+
cell → tasks list
+
+
+
Источник/functions/[slug]/weekly
+
Weekly функции
+
Существующий weekly-отчёт. Расширяется секциями closed / in progress / blocked / new this week
+
+ task summary
+
+
+
Источник/goals/[id]
+
Цель OKR / KPI
+
К существующей карточке цели добавляется блок «Привязанные темы (FunctionTaskTopic.goalId) и задачи»
+
linked topics + tasks
+
+
+
Источник/goal-tree
+
Дерево целей
+
Существующий @xyflow-граф. Клик на узел → side-panel со списком связанных тем и задач
+
node → side-panel
+
+
+
Источник/initiatives/[id]
+
Инициатива (Strategy)
+
К существующей карточке Initiative добавляется блок «Темы инициативы» (кросс-функциональные через новое поле Topic.initiativeId)
+
cross-function topics
+
+
+
Источник/programs/[id]
+
Программа
+
Существующая страница. Roadmap-таб с инициативами и milestones как Gantt. Drag-resize меняет даты + history в EntityHistory
+
timeline view
+
+
+
Источник/employees/[id]
+
Карточка сотрудника
+
К существующей карточке — таб «Задачи» через FunctionTask.assigneeId. Просрочки, нагрузка
+
drawer per task
+
+
+
Источник/dashboard
+
Дашборд
+
К существующим Recharts-виджетам — «Здоровье задач»: просрочки, lead time, blockers. RBAC-фильтр
+
drill-down → drawer
+
+
+
Источник⌘+K
+
Глобальная палитра
+
Существующий app/api/search/route.ts. Расширяется индексами по Topic / Task / Function. Scope-префиксы t: g: p:
+
любая сущность
+
+
+ v4 убрано +
УбираемActionItem
+
Задачи стратегии (ActionItem)
+
ActionItem мигрируется в FunctionTask с тегом source: strategy. Привязка к Initiative через Topic.initiativeId. Один тип задачи вместо двух
+
deprecated
+
+
+
Источник/notifications
+
Колокольчик
+
Существующая NotificationBell в Header. Каждое уведомление кликается → drawer задачи
+
bell → drawer
+
+
+
Источник/itom
+
ITOM монитор
+
Существующий монитор + FunctionTaskItomDetails. Сохраняется, синхронизация Jira не трогается
+
kind=ITOM
+
+
+ +
Главный принцип навигации. Точка входа — всегда функция (или цель/инициатива). Из любой существующей страницы портала, где есть привязка к функции, цели или сотруднику, открываются связанные темы и задачи. Никакой отдельной «свалки задач», никаких новых пунктов в sidebar.
+
+ + +
+

07 Пользовательские пути (откуда → куда → как)

+

Пять типовых сценариев. Для каждого показано: кто пользователь, с какого экрана стартует, какие шаги делает, что в конце получает. В макетах ниже эти пути отмечены breadcrumb-ом «Путь N».

+ +

Путь №1 · Руководитель функции ставит задачу в тему

+

Сценарий: руководитель функции strategy-partnership добавляет задачу в тему «Портфельное управление» к концу Q3. Привязать к цели ИТ-стратегии, назначить исполнителя.

+
+
СтартМоя панельВиджет «Функции под руководством» и блок «Цели Q3 без активности»/my
+
Шаг 1Карточка функцииКлик на «Стратегия и бизнес-партнёрство» → блок «Темы»/functions/strategy-partnership
+
Шаг 2Список темСуществующий TopicsWorkspace. Клик на «Портфельное управление»/functions/strategy-partnership/topics
+
Шаг 3Доска темы (новая)Открывается kanban темы с её workflow. Жмёт «+ Задача»/functions/[slug]/topics/[topicId]
+
ИтогЗадача созданаFunctionTask привязана к теме и цели. assignee получает Notificationdrawer + Notification
+
+ +

Путь №2 · Исполнитель берёт задачу в работу

+

Сценарий: PO «Портфельное управление» получил уведомление о новой задаче.

+
+
СтартNotificationКолокольчик в Header портала. Клик по строкеNotificationBell
+
Шаг 1Рабочие задачиСуществующий TasksWorkspace scope=my. Видит новую задачу в табе «Все»/tasks
+
Шаг 2Drawer задачиСуществующий TaskDetailDrawer. Читает описание, чек-лист, подзадачи (новое), связи с цельюdrawer
+
Шаг 3Переход статусаInline-popover на статусе. Workflow темы: TODO → Принято. Событие в EntityHistoryworkflow transition
+
ИтогВидна руководителюСуществующий weekly-отчёт функции показывает «принято в работу на этой неделе»/functions/[slug]/weekly
+
+ +

Путь №3 · OKR-куратор смотрит прогресс цели

+

Сценарий: CTO Иванов смотрит, как идёт «Цифровая трансформация» (goalS2 из seed). Хочет понять, что блокирует.

+
+
СтартДерево целейСуществующий @xyflow-граф. Узел goalS2 «Цифровая трансформация» подсвечен амбером/goal-tree
+
Шаг 1Карточка целиСуществующая страница цели + новый блок «Привязанные темы (5)» через FunctionTaskTopic.goalId/goals/[id]
+
Шаг 2Тема под цельюКлик на «Migration to Kubernetes» — кросс-функциональная тема (operations-office + it-tooling)/functions/[slug]/topics/[topicId]
+
Шаг 3Фильтр blockersВ существующем TasksWorkspace применяет фильтр. Видит 3 задачи в Блокированофильтр статуса
+
ИтогЭскалация@mention в комментарии. Push в Notification ответственному кураторуcomment + notify
+
+ +

Путь №4 · Поиск задачи через ⌘+K

+

Сценарий: аналитик ищет задачу про Kubernetes-миграцию из любого места портала.

+
+
СтартЛюбая страница⌘+K на любой странице портала. Открывается существующая CommandPalette⌘+K
+
Шаг 1Запрос«kubernetes». Существующий app/api/search расширен индексами по Topic и Taskapp/api/search
+
Шаг 2ВыборВидит группы: Темы (1), Задачи (4), Функции (1). Жмёт на тему «Migration to K8s»scoped result
+
ИтогОткрыта доска темыПрямой переход без потери контекста — 3 секунды от старта/functions/[slug]/topics/[topicId]
+
+ +

Путь №5 · ITOM-куратор синхронизирует с Jira (без изменений)

+

Сценарий: куратор ITOM-задачи. Существующий поток сохраняется — Jira sync, FunctionTaskItomDetails, workflow ITOM. FlowTask его не ломает.

+
+
СтартРабочие задачиСуществующий /tasks. Фильтр kind=ITOM/tasks?kind=ITOM
+
Шаг 1Drawer ITOMСуществующий TaskItomPassport — Jira-снимок, директива, риск, ПЦМ-дедлайнexisting drawer
+
Шаг 2RefreshСуществующая кнопка «Обновить из Jira» работает по-старомуJira API
+
ИтогСнимок и историяСуществующий EntityHistory. Никаких изменений в потоке ITOMhistory + notify
+
+ +
Принцип навигации. Точка входа всегда — функция или цель. Из них вниз через темы (Topic) к конкретным задачам. Никаких новых уровней навигации в sidebar — только расширения существующих страниц.
+
+ + +
+

M1 Главная: Моя панель

+

Стартовая страница после логина. Показывает виджет «Мои задачи» с FlowTask-данными интегрированный в существующий /my. Путь №1, шаг 0 — старт.

+ +
+ Цветовая разметка макетов: + расширение существующего (компонент уже в портале, FlowTask добавляет поля/табы/виджет) + полностью новое (новая страница/таб/блок, не существовал в портале) + inline-маркер (точечная новая фича внутри существующей кнопки/таба) +
+
+
moex-portal.vercel.app/my
MOEX design
+
+
+
+
+
ГлавнаяМоя панель
+
+

Добрый день, Алексей 👋

Сводка по вашим задачам, командам под кураторством и целям Q3
+
+
+ +
+
Мои задачи открыто14+2 за неделю
+
Просрочено3⚠ требуют ответа
+
Завершено за неделю9+44%
+
+ +
+
+

Мои задачи 14

+
+
FIN-92
Интеграция с КИБ overdue 3д
Блок.
P1
BFK-FIN / Backend Q3
29 мая
+
FIN-101
API: история ордеров
В работе
P2
BFK-FIN / Backend Q3
30 мая
+
FIN-119
Миграция БД: trade_settlement
Принято
P0
BFK-FIN / Backend Q3
02 июн
+
FIN-110
ITOM мониторинг ↗ Jira PAY-1023
В работе
P1
Function: Платежи
12 июн
+
+ Открыть все «Мои задачи» → +
+
+

Функции под руководством 3

+
+
СП
Стратегия и бизнес-партнёрство
strategy-partnership · FTE 1/1 · 4 темы
2 просрочки
87 задач
+
РИ
Развитие ИТ (Офис развития)
operations-office · FTE 1/1 · 6 тем
здорова
132 задачи
+
УР
Управление релизами
releases-management · FTE 4/5 · 3 темы
5 blockers
68 задач
+
+ Перейти в функцию → +
+
+ +
+
+

Цели Q3 — нужно внимание

+
+ + +
+
+
+

Календарь · ближайшие 7 дней

+
+
сегодня
RV-2 Ревью FIN-117 SOAP→REST
ждёт меня
+
завтра
FIN-119 Миграция БД
принято
+
04 июн
FIN-104 Webhook сделок
в работе
+
05 июн
FIN-122 Сидинг БД
принято
+
+
+
+ +
Что новое. Виджет «Мои задачи» и «Команды под кураторством» подтягивают данные из FlowTask. Старые виджеты дашборда сохраняются. Виджеты настраиваются через «Настроить» — можно добавить «Roadmap H2», «Workload команды», «Просрочки команды».
+
+
+
+
+ + +
+

M2 Функция — страница /functions/[slug]

+

Существующая страница портала. Реальная функция из seed-данных портала: strategy-partnership «Стратегия и бизнес-партнёрство». Используется существующий компонент FunctionDetail. Что добавляется FlowTask: блок «Темы» с агрегатной статистикой и шорткатами в существующий TopicsWorkspace. Путь №1, шаг 1.

+
+
moex-portal.vercel.app/functions/strategy-partnership
+
+
+
+
+
Функции/CTO ITG/Стратегия и бизнес-партнёрство
+
+
+

Стратегия и бизнес-партнёрство active

+
slug strategy-partnership · родитель itg-cto · руководитель А. Яковенко · FTE 1/1 · transformation IN_PROGRESS
+
+
+
+ + +
+
Обзор
+
Цели
+
Метрики
+
Обязательства
+
Зависимости
+
Темы 4
+
Задачи 87
+
Календарь
+
Нагрузка
+
Weekly
+
Динамика
+
+ +
+
+

Мандат функции

+

Стратегия ИТ, портфельное управление инициативами, бизнес-партнёрство с заказчиками, инновации.

+

Зоны ответственности

+
it-strategyportfolio-mgmtbusiness-partnershipinnovations
+

Цели функции (FunctionGoal)

+ +
+
+

Параметры

+ + + + + + + + +
FTE actual / potential1 / 1
Подчинённые функции3 (it-partners, it-strategy-innovation, accounting-processes)
Открытые задачи87 · 2 просрочки
Темы (Topic)4 активных, 1 archived
Задачи ITOM4 (Jira-синк, без изменений)
Lead time avg4.2 дня
Стратегические целиЦифровая трансформация
+
+
+ + +
+
+
+
Рабочее пространство функции · НОВОЕ
+

Workspace strategy-partnership 2 доски · 4 темы · 87 задач

+
Workspace.functionId = strategy-partnership. Создан автоматически при first-use. Содержит доски; на каждой доске — N тем (Topic) и/или задачи напрямую
+
+
+
+
+
+
Доска · АКТИВНА · свой рабочий процесс
+
Портфельное управление 2026
+
prefix SP · рабочий процесс Портфельный · 1 тема + 8 задач напрямую
+
22 задачи2 просрочки↗ ДК доски
+
+
+
Доска · АКТИВНА · рабочий процесс: Стандартный
+
Default · Текущая работа
+
prefix SPS · 3 темы (Innovation Pilots, NPS, ITOM)
+
34 задачи↗ ДК доски
+
+
+
Темы без доски · LEGACY (boardId IS NULL)
+
Без доски — 0 тем
+
Все темы функции принадлежат доске
+
0 задач
+
+
+
+ +
Слой над существующим. Workspace и Board — новые таблицы, но не заменяют существующие FunctionTaskTopic и FunctionTask. Тема может: (а) принадлежать доске через boardId — показывается в ней; (б) не иметь boardId — показывается «как раньше» в legacy-странице /functions/[slug]/topics. У одной доски может быть несколько тем — Topic становится «swimlane» внутри Board.
+
+
+
+
+ + +
+

M3 Workspace функции — /workspaces/[slug]

+

Новая страница — обзор Workspace со списком его досок и тем. Workspace.slug = strategy-partnership совпадает со slug функции — это «зеркало» функции. Сверху — переключатель режима представления (Доски / Темы / Roadmap). Путь №1, шаг 2.

+
+
moex-portal.vercel.app/workspaces/strategy-partnership
+
+
+
+
+ +
+
+

Workspace strategy-partnership

+
Workspace.functionId = strategy-partnership · owner А. Яковенко · 2 доски · 4 темы · 87 задач · ↗ Функция
+
+
+ ДК спейса → + + +
+
+ +
+
Доски 2
+
Roadmap
+
Темы без доски (legacy) 0
+
Все задачи 87
+
Участники
+
Настройки
+
+ +
+ Поиск доски… + + + + сеткасписок +
+ +
+
+
Доска · АКТИВНА · prefix SP
+
Портфельное управление 2026
+
рабочий процесс Портфельный (Draft → Proposed → Approved → Active → Achieved) · 1 тема + 8 задач напрямую
+
+ Draft 4 + Proposed 3 + Approved 5 + Active 4 + Achieved 6 +
+ +
+
+
Доска · АКТИВНА · prefix SPS
+
Default · Текущая работа
+
workflow Standard (TODO → DOING → DONE) · содержит 3 темы (Innovation Pilots H2, NPS бизнес-заказчиков, ITOM)
+
+ TODO 12 + DOING 16 + DONE 6 +
+ +
+
+
+ +
Новая доска
+
Выбрать шаблон workflow или создать с нуля
+
+
+
+ +
Связь с функцией. Этот Workspace — «зеркало» функции strategy-partnership. У него только одна функция-источник (functionId). Все темы из этой функции мигрируются в одну из досок workspace-а (или остаются в legacy без доски). Для кросс-функционального workspace создаётся отдельный экземпляр с initiativeId или programId вместо functionId.
+
+
+
+
+ + +
+

M4 Board · Kanban — /boards/[id]

+

Доска внутри Workspace. Board.workflowId определяет колонки (через WorkflowStatus[]). Внутри доски swimlane-ами идут темы (FunctionTaskTopic.boardId = X) — это позволяет визуально разделить «потоки работы». Путь №1, шаг 3.

+ +
+
moex-portal.vercel.app/boards/portfolio-mgmt-2026
+
+
+
+
+
Моё/Рабочие пространства/strategy-partnership/Портфельное управление 2026
+
+

Портфельное управление 2026 prefix SP

Board.workspaceId = strategy-partnership · рабочий процесс Портфельный (custom) · 1 swimlane-тема + 8 задач напрямую · 22 задачи · ↗ цель «Исполнение ИТ-стратегии ≥90%»
+
+ + + +
+
+ +
+
Kanban
+
Список
+
Календарь
+
Roadmap ↗
+
Аналитика
+
Настройки
+
+ +
+ + + + + + + +
+ +
+
+
+
Draft 4
+
SP-128
Шаблон Portfolio Review для квартального цикла
ПНportfolioP1
+
SP-131
Гипотеза: автоматическая привязка инициатив к сегментам
АСresearch
+
SP-134
RFC: критерии «strategic fit» инициатив
МВresearch
+
SP-137
Согласование с СБ — доступ к Insights
ДК
+
+
+
Proposed 3
+
SP-119
Привязка 100% инициатив к segment в moex-portal
ПНmigrationP0
+
↳ SP-122
Subtask: разбор 240 unmatched инициатив
ПНsubtask
+
SP-129
Дашборд «Portfolio Review»
ЕКanalytics
+
+
+
Approved 5
+
SP-101
Запуск первого Portfolio Review (Q3 2026)
ПНportfolio↗ goal G3
+
SP-104
Сегментирование инициатив v2
АСP2
+
SP-110
Опрос NPS бизнес-заказчиков Q3
МВsurvey
+
SP-115
Performance review pilot для 3 функций
ДКpilot
+
SP-117
План синхронизации с дочерними функциями
ЕКcomms
+
+
+
Active 4
+
SP-92
Эксперимент с CFO over budget alerts
ПНP1
+
SP-96
Доска инноваций (для гипотез)
АС
+
+
+
Achieved 6
+
SP-78
Шаблон стратегической инициативы готов
ПН
+
SP-81
3 пилотных Portfolio Review проведены
АС
+
SP-83
Каталог сегментов инвестирования
МВdeliverable
+
+
+
+ +
+
+
Ключ
Название
Статус
Приоритет
Исполнитель
Дедлайн
+
▾ EPIC · Интеграция с КИБ overdue 3/8
+
FIN-92
Интеграция с КИБ: ждём контракт
Блок.
P1
ПН Новак
29 мая · -3д
+
↳ FIN-101
API: история ордеров
В работе
P2
ПН Новак
30 мая
+
↳ FIN-101a
Спека OpenAPI
Готово
ПН
20 мая ✓
+
↳ FIN-101b
Реализация query-builder
В работе
P2
ПН
27 мая
+
↳ FIN-110
ITOM-мониторинг ↗ Jira
В работе
P1
МВ
12 июн
+
▾ EPIC · Миграция БД на 2026
+
FIN-119
Миграция БД: trade_settlement
Принято
P0
ПН
02 июн
+
↳ FIN-122
Сидинг 200к записей
Принято
P2
ПН
05 июн
+
↳ FIN-96
Доступ к prod-БД
Блок.
P1
АС
28 мая
+
▸ EPIC · Tech-debt H1 2026 свёрнут
+
+
+ +
+
+
Пн
Вт
Ср
Чт
Пт
Сб
Вс
+
26
+
27
FIN-78 ✓
+
28
+
29
FIN-92 просрочка
+
30
FIN-101
+
31
+
1
+
2
FIN-119 миграция
+
3
+
4
FIN-104 webhook
+
5
FIN-122 seed
+
6
7
+
8
9
+
10
FIN-128
+
11
+
12
FIN-110 ITOM
+
13
14
+
15
FIN-115 perf
+
16
17
+
18
19
+
20
21
+
22
+
+
+ +
+
+
Эпик / задача
Май W1
W2
W3
W4
Июн W1
W2
W3
W4
+
FIN-101 API история
FIN-101
+
FIN-119 Миграция БД
FIN-119
+
↳ FIN-122 seed
FIN-122
+
FIN-128 Rate-limit
FIN-128
+
FIN-110 ITOM
FIN-110
+
FIN-92 КИБ blocker
FIN-92 overdue
+
+
+ +
+
+
Lead time avg4.2 дн-12% за месяц
+
Throughput / неделю9+2 к прошлой
+
Cycle time p9511 дн+3 за месяц
+
+
Burn-up по эпикам
факт   план
+
+
+
+
+
+ + +
+

M5 Карточка задачи (drawer)

+

Открывается поверх любой страницы по клику на задачу. Сохраняет контекст «откуда пришёл». Путь №1, шаг 3 / №2, шаг 2 / №3, шаг 3 / №4, шаг 2.

+
+
moex-portal.vercel.app/functions/strategy-partnership/topics/portfolio-mgmt-2026?task=SP-101
+
+
+
+
+ +

Портфельное управление 2026

+
+ +
+
+ SP-101 +

Запуск первого Portfolio Review Q3 2026

+ +
+ +
+
+
Описание
+
Запустить первый полный цикл Portfolio Review для Q3 2026. Включить все ИТ-инициативы, привязанные к сегменту в moex-portal. Включить CFO, CTO, кураторов сегментов.
+
Связи в портале
+ + + + +
Чек-лист результата (resultChecklist Json)
+
+ + + + + +
+ +
Подзадачи
+
+
SP-101a Шаблон карточки инициативы Achieved
+
SP-101b Расчёт «strategic fit score» Active
+
SP-101c Сборка дашборда Approved
+ +
+ +
Обсуждение (TaskCommentEditor + @mention)
+
АС
А. Смирнов
Предлагаю включить в Q3 review всё, что в этапе Approved или выше. Иначе CFO встретит ~ 240 инициатив сразу.
+
ПН
П. Новак
Согласен. @yakovenkoalg, давайте сначала отметим в фильтре scope=approved+ и пройдём через 80 шт.
+
ЯВ
А. Яковенко
Принято, ставлю фильтр в существующий analytics-presets. Утром в среду — синк с CFO.
+
+
+ +
+
+
+
+
Контекстуальность. Drawer всегда показывает «откуда пришёл» и связи в портале (Topic · Function · FunctionGoal). История пишется в существующую EntityHistory, комментарии — в существующий TaskCommentEditor. Что новое: подзадачи (parentId/path), labels (per topic), @mention в комментариях.
+
+ + +
+

M6 Рабочие задачи — существующий /tasks v4 изменено

+

Существующая страница портала app/tasks/page.tsx с компонентом TasksWorkspace scope="my". Что добавляется FlowTask: табы по источникам (тема / без темы / стратегия / ITOM / на ревью), счётчики по табам, цветовая кодировка статуса. Бывшие ActionItem теперь живут как обычные FunctionTask с тегом source: strategy. Путь №2 — основной экран для исполнителя.

+
+
moex-portal.vercel.app/tasks
+
+
+
+
+
МоёРабочие задачи
+
+

Рабочие задачи

Текущие поручения, дедлайны и блокеры — собрано из всех источников портала через существующий TasksWorkspace
+
+
+ +
+
Открыто14
+
Просрочено3требуют ответа
+
Завершено / неделя9
+
+ +
+
Все 14
+
В теме 7
+
Без темы 4
+
ITOM 1
+
Стратегия 2
+
На моё ревью 1
+
+ +
+
Просрочено
+
+
SP-92
Эксперимент CFO over-budget alerts -3д
Active
P1
Тема: Портфельное
29 мая
+
ST-12
Материалы к ИТ-комитету стратегия
Просрочка
P1
Тема: Portfolio Review
28 мая
+
+
На этой неделе
+
+
SP-101
Запуск Portfolio Review Q3
Approved
P2
Тема: Портфельное
30 мая
+
SP-119
Привязка инициатив к segment
Proposed
P0
Тема: Портфельное
02 июн
+
FT-203
Тех-задача от функции без темы · legacy
TODO
P2
strategy-partnership
03 июн
+
MS-7
Закрытие квартала OKR milestone
К сроку
Existing Milestone
30 июн
+
RV-2
Ревью FIN-117 SOAP→REST review
Ждёт меня
operations-office
сегодня
+
+
+
Только задачи, принадлежащие FunctionTaskTopic (через function_task_topic_assignments). Видна тема и её workflow в каждой строке.
+
Задачи без темы — FunctionTask с пустым набором topics. Legacy-категория. UI показывает легаси-enum статусов.
+
Существующий ITOM с двусторонним Jira-синком. FunctionTask.kind = ITOM. Никаких изменений в работе.
+
Бывшие ActionItem, мигрированные в FunctionTask с тегом source: strategy. Привязаны к Initiative через Topic.initiativeId. Один интерфейс работы — такой же как для рабочих задач.
+
Запросы на ревью из существующих ApprovalChainStep · InitiativeApproval.
+
+
+
+
+ + +
+

M7 Цель — существующая страница /goals/[id]

+

Существующая страница цели в портале. Что добавляется FlowTask: блок «Привязанные темы и задачи» через существующие связи FunctionTaskTopic.goalId и FunctionTask.goalId — без новых полей в Goal. Путь №3, шаг 1.

+
+
moex-portal.vercel.app/goals/digital-transformation
+
+
+
+
+
Аналитика/Дерево целей/STRATEGIC/Цифровая трансформация
+
+
+

Цифровая трансформация и технологическое лидерство отстаёт

+
level=STRATEGIC · format=OKR · куратор Иванов (CTO) · год 2026 · 3 декомпозиции 2-го уровня · 12 на 3-м уровне
+
+
+
+ +
+
+

Метрики (existing GoalMetric)

+ + + + + + +
МетрикаTargetCurrent%
Time-to-Market (дней)213855%
Запуск 4 новых цифровых продуктов4125%
Сервисов на K8s60%15%25%
Подключённые источники данных20735%
+
+
+

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

+ + + +
+
+ +
+

Темы под целью (FunctionTaskTopic.goalId)

+
+
Topic · ACTIVE · функция strategy-partnership
Портфельное управление 2026
22 задачи2 просрочки
+
Topic · ACTIVE · функция operations-office
K8s Migration H2
34 задачи5 в работе
+
Topic · ACTIVE · кросс (3 функции)
Mobile MOEX Invest
48 задач14 в работе
+
+
+ +

Задачи под целью напрямую (FunctionTask.goalId)

+
+
Ключ
Название
Статус
Приоритет
Исполнитель
Дедлайн
+
SP-101
Portfolio Review Q3
Approved
P2
ПН Новак
30 мая
+
SP-119
Привязка инициатив к segment
Proposed
P0
ПН Новак
02 июн
+
OO-32
K8s pilot для некритичных сервисов
Done
АН
22 мая ✓
+
+
Прогресс цели по задачам — опционально. В существующей Goal добавляется enum progressMode: METRIC (как сейчас, по GoalMetric) / TASKS / HYBRID. По умолчанию остаётся METRIC — обратно совместимо.
+
+
+
+
+ + +
+

R3 Дорожная карта стратегии/strategy-viz?view=roadmap

+

Существующая страница «Визуализация» из группы «Стратегия» — в портале уже есть @xyflow-граф. Что добавляется FlowTask: новый tab «Roadmap» в формате 1-в-1 как ДК спейса и доски. Сущности: Program · Initiative · StrategyTask · Milestone — все существуют в портале. Кросс-ссылки в доски через новое FunctionTaskTopic.initiativeId.

+
+
moex-portal.vercel.app/strategy-viz?view=roadmap&year=2026
+
+
+
+
+ +

Дорожная карта · Стратегия 2026 NEW view

Программы, инициативы, milestones и стратегические задачи. Связь с досками и темами через FunctionTaskTopic.initiativeId
+ +
+
@xyflow-граф (existing)
+
Roadmap
+
Recharts dashboards (existing)
+
+ +
+
+ + + +
+ + + +
+ Planned + Active + In Progress + Closed + At Risk + Milestone +
+
+ +
+
+
+
Program / Initiative / Milestone
+ +
Program · Цифровая трансформация 2026–28
+
INIT-12 MOEX Invest mobile
+
MS-32 Beta launch
+
MS-44 Production release
+
INIT-14 Migration to Kubernetes
+
MS-58 Pilot done
+
INIT-17 Data Platform v2
+ +
Program · Эффективность операций
+
INIT-22 Автоматизация клиринга
+
INIT-25 STP processing
+ +
Program · Регуляторика
+
INIT-31 ЦБ отчётность v3
+
MS-71 Approval ЦБ
+ +
Program · Стратегия и партнёрство
+
INIT-42 Portfolio Review цикл
+
↗ Board SP через initiativeId
+
+ +
+
+
Q1 26
Q2 26
Q3 26
Q4 26
Q1 27
Q2 27
Q3 27
Q4 27
+
+
+
+ +
+
+
INIT-12 MOEX Invest mobile
+
+
+
+
+
+
+
+
+
+
+
+
INIT-14 K8s migration
+
+
+
+
+
+
+
+
INIT-17 Data Platform v2
+
+ +
+ +
+
+
INIT-22 Автоматизация клиринга
+
+
+
+
INIT-25 STP at risk
+
+ +
+ +
+
+
INIT-31 ЦБ отчётность v3
+
+
+
+
+
+ +
+ +
+
+
INIT-42 Portfolio Review цикл
+
+
+
+
↗ Board SP
+
+ +
+
+
+
+
+ +
Drill-down. Клик по бару инициативы → drawer с её Milestone[] + связанные доски (через FunctionTaskTopic.initiativeId и Workspace.initiativeId). Под каждой Initiative — линк «↗ Board SP» на доску спейса, который реализует эту инициативу. Прогресс — сумма прогресса milestone и связанных задач.
+ +
+
+

Единый формат для всех трёх уровней ДК

+
    +
  • Та же toolbar (zoom · фильтры · легенда)
  • +
  • Та же сетка времени (week / month / quarter / year — выбирается)
  • +
  • Те же бары, milestone-ромбы, today-вертикаль, пульсация просрочек
  • +
  • Та же иерархия в left-panel (отступы для children)
  • +
  • Те же горячие клавиши: W / M / Q
  • +
  • Тот же tooltip при hover
  • +
+
+
+

Связи между уровнями ДК

+
    +
  • ДК стратегии: клик по Initiative → drawer + линк на доски, связанные через Workspace.initiativeId / Topic.initiativeId
  • +
  • ДК спейса: клик по бару задачи → drawer + крошка наверху позволяет вернуться на ДК доски
  • +
  • ДК доски: можно «промотать вверх» — справа есть линк «↗ ДК спейса»
  • +
  • Везде используется FunctionTask.startDate / dueDate — для задач, Initiative.startDate / endDate — для инициатив (уже есть в портале)
  • +
+
+
+
+
+
+
+ + +
+

M9 Workflow привязывается к теме (FunctionTaskTopic.workflowId)

+

Workflow — новые таблицы (см. секцию «Маппинг»). На каждой теме можно задать свой workflow. Если поле workflowId у темы равно null — задачи темы используют legacy enum FunctionTaskStatus.

+
+
+

Workflow «Legacy» (default · null workflowId)

+
+
TODO
+
ACCEPTED
+
DOING
+
BLOCKED
+
DONE
+
+
Существующий enum FunctionTaskStatus. Не меняем. Применяется ко всем темам без workflowId
+
+
+

Workflow «Portfolio» (новый, для доски «Портфельное управление»)

+
+
Draft
+
Proposed approval
+
Approved
+
Active
+
Achieved · Missed · Cancelled
+
+
Тип CUSTOM. Proposed→Approved требует существующую ApprovalChain
+
+
+
+

Workflow ITOM (существующий, без изменений)

+
+
Открыта
+
Анализ ИБ
+
Согласование куратором
+
Реализация (Jira)
+
Реализована
+
Подтверждена
+
Закрыта
+
+
Существующий мапинг к Jira через FunctionTaskItomDetails.jiraSnapshot. Никаких изменений
+
+
UI конструктора workflow: новая страница доступная из настроек темы. Drag-and-drop узлов, «+ Статус», стрелки переходов, чек-боксы «требует approval / комментарий / роли». При сохранении — превью «как изменится для текущих открытых задач».
+
+ + +
+

M10 ⌘+K — расширение существующего CommandPalette

+

В коде портала уже есть components/layout/CommandPalette.tsx. Что добавляется FlowTask: индексы по FunctionTask · FunctionTaskTopic, scope-префиксы (t: task, p: topic, g: goal, f: function). Использует существующий app/api/search/route.ts. Путь №4.

+
+
moex-portal.vercel.app/dashboard
+
+
+
+
+
Аналитика › Дашборд
+

Дашборд

+
+
+
+ + + esc +
+
+
+
Темы — FunctionTaskTopic (1)
+
+
+ +
+
Migration to Kubernetes H2
+
Topic · operations-office · 34 задачи · цель «Цифровая трансформация»
+
+ +
+
+
Задачи — FunctionTask (4)
+
+
+ +
+
OO-32 K8s pilot для некритичных сервисов
+
Topic Migration to K8s · done · @АН
+
+
+
+ +
+
OO-44 Helm-чарты для Kubernetes кластера
+
Topic Migration to K8s · в работе · @АН
+
+
+
Функции — existing
+
+ +
+
operations-office (содержит «Migration to K8s»)
+
Development office · 132 задачи
+
+
+
Подсказки
+
+ навигация + открыть + t: task · p: topic · g: goal · f: function +
+
+
+
+
+
Скорость. 3 секунды от любого экрана до Topic или задачи. Расширение существующего CommandPalette, не новый компонент.
+
+ + +
+

M11 Управление задачами — /work v4 новое

+

Единая точка входа для тех, кому удобнее работать с задачами напрямую, без навигации через функции. Все возможности — рабочие пространства, доски, канбан, подзадачи, рабочие процессы, дорожные карты — собраны на одной странице. Пункт «Управление задачами» в группе «Моё» в боковом меню. Коллеги, работавшие в FlowTask, получат привычный функционал в дизайне портала.

+ +
+
moex-portal.vercel.app/work
+
+
+
+
+
МоёРабочее пространство
+
+
+

Управление задачами

+
Все рабочие пространства, доски и задачи. Единая точка входа для управления работой
+
+
+ + +
+
+ + +
+
Обзор
+
Пространства 4
+
Доски 9
+
Мои задачи 14
+
Дорожная карта ↗
+
+ + +
+
+
Мои открытые задачи14+2 за неделю
+
Просрочено3требуют ответа
+
Пространств активных49 досок
+
+ +

Мои пространства

+
+
+
СП
+
Стратегия и бизнес-партнёрство
+
strategy-partnership · 2 доски · 4 темы
+
87 задач2 просрочки
+
+
+
РИ
+
Развитие ИТ (Офис развития)
+
operations-office · 3 доски · 6 тем
+
132 задачиздорова
+
+
+
УР
+
Управление релизами
+
releases-management · 2 доски · 3 темы
+
68 задач5 blockers
+
+
+
K8
+
K8s Migration (кросс)
+
Кросс-функциональный · initiativeId · 1 доска
+
34 задачи5 в работе
+
+
+ +

Горящие задачи (по всем доскам)

+
+
Ключ
Название
Статус
Приоритет
Доска
Дедлайн
+
SP-92
Эксперимент CFO over-budget alerts -3д
Active
P1
Портфельное упр.
29 мая
+
OO-17
CI/CD пайплайн для K8s -1д
Блок.
P0
K8s Migration
1 июн
+
RM-44
Rollback script для hotfix pipeline
В работе
P1
Release cycle Q3
3 июн
+
+ +
+
+

Дорожная карта (ближайшие 4 недели)

+
+
Доска / задача
Нед 1
Нед 2
Нед 3
Нед 4
+
SP-92 CFO alerts
overdue
+
SP-101 Review Q3
SP-101
+
OO-17 K8s CI/CD
OO-17
+
RM-44 Rollback
RM-44
+
+ Полная дорожная карта → +
+
+

Здоровье досок

+ + + + + + +
ДоскаОткр.Блокир.Просроч.Ср. время
SP Портфельное16024.2д
SPS Текущая работа28103.1д
K8S K8s Migration19317.8д
RM Release cycle22502.5д
+
+
+
+ + +
+
+ Поиск пространств… + + + сеткасписок +
+
+
+
СП
+
Стратегия и бизнес-партнёрство
+
strategy-partnership · владелец А. Яковенко
+
2 доски87 задач
+ +
+
+
РИ
+
Развитие ИТ
+
operations-office · владелец М. Петров
+
3 доски132 задачи
+ +
+
+
УР
+
Управление релизами
+
releases-management · владелец К. Лебедев
+
2 доски68 задач
+ +
+
+
K8
+
K8s Migration
+
Кросс-функциональный · Initiative #14
+
1 доска34 задачи
+ +
+
+
+ +
Новое пространство
+
Из функции, инициативы или с нуля
+
+
+
+
+ + +
+
+ Поиск досок… + + + +
+
+
Префикс
Доска / пространство
Рабочий процесс
Задачи
Просроч.
Ср. время
+
▾ Стратегия и бизнес-партнёрство
+
SP
Портфельное управление 2026
свой рабочий процесс · 1 тема
Портфельный
22
2
4.2д
+
SPS
Default · Текущая работа
3 темы (Innovation, NPS, ITOM)
Стандартный
34
0
3.1д
+
▾ Развитие ИТ
+
OO
DevOps & Infra
4 темы
Стандартный
48
0
3.4д
+
EA
Enterprise Architecture
Свой
31
0
5.1д
+
▾ K8s Migration (кросс)
+
K8S
K8s Rollout H2 2026
задачи из 3 функций
Свой
34
1
7.8д
+
+
+ + +
+
Полный список «Мои задачи» со всех досок. Тот же компонент что в M6 · Рабочие задачи, но без навигации через /tasks — прямо внутри хаба.
+
+ + +
+
Агрегатная дорожная карта по всем доскам пользователя. Та же визуализация что в R1 · ДК пространства, но агрегирует все пространства сразу.
+
+
+ + + +
+ + +
+ К выполнению + В работе + Завершено + Просрочено +
+
+
+
+
+
Пространство · доска · задача
+
Стратегия · Доска СП
+
SP-92 CFO alerts
+
SP-101 Portfolio Review Q3
+
Миграция K8s · Доска K8S
+
OO-17 CI/CD pipeline
+
OO-32 K8s pilot
+
Релизы · Доска РМ
+
RM-44 Rollback script
+
+
+
+
Май W4
Июн W1
Июн W2
Июн W3
Июн W4
Июл W1
+
+
+
+
SP-92 −3д
+
SP-101 Approved
+
+
OO-17 blocked
+
OO-32 ✓
+
+
RM-44 Rollback
+
+
+
+
+
+
+ +
+
+
+
Два пути к задачам. (1) Через функции: /functions/[slug] → пространство → доски → задачи (для тех, кто мыслит в терминах оргструктуры). (2) Через «Управление задачами»: /work → все пространства, доски и задачи сразу (для тех, кому нужен единый рабочий стол). Оба пути ведут к одним и тем же данным.
+ +
+
+

Что видно на странице

+
    +
  • Мои пространства — карточки с метриками по каждому
  • +
  • Все доски — таблица со здоровьем: открытые / блокированные / просроченные / среднее время
  • +
  • Мои задачи — сводка задач со всех досок
  • +
  • Дорожная карта — все доски на одном таймлайне (неделя / месяц / квартал)
  • +
  • Горящие задачи — топ просроченных и заблокированных по всем доскам
  • +
+
+
+

Навигация из хаба

+
    +
  • Клик по спейсу → /workspaces/[slug] (M3)
  • +
  • Клик по доске → /boards/[id] (M4, kanban)
  • +
  • Клик по задаче → TaskDetailDrawer (M5)
  • +
  • Клик «Дорожная карта» → /workspaces/[slug]/roadmap (R1)
  • +
  • Из любого места — ⌘+K быстрый поиск (M10)
  • +
+
+
+
+ + +
+

R1 Дорожная карта спейса/workspaces/[slug]/roadmap

+

Агрегатная ДК всего рабочего пространства. Группирует задачи по доскам, доска → swimlane. Визуальный язык 1-в-1 как в FlowTask RoadmapView.tsx: zoom Week / Month / Quarter, бары по цвету workflow status, milestone-ромбы для задач только с dueDate, красная вертикаль «сегодня», пульсация просрочек.

+ +
+
moex-portal.vercel.app/workspaces/strategy-partnership/roadmap
+
+
+
+
+ +
+

Дорожная карта · Workspace strategy-partnership

Все доски и задачи спейса на временной шкале. Группировка по доскам
+
+
+ +
+
+ + + +
+ + + +
+ Draft / TODO + Proposed + Approved / Doing + Active + Done / Achieved + Milestone + Просрочка +
+
+ +
+
+ +
+
Доска · задача
+ +
Board SP · Портфельное управление 2026
+
SP-92 Эксперимент CFO over-budget alerts
+
SP-101 Запуск Portfolio Review Q3
+
SP-119 Привязка инициатив к segment
+
↳ SP-122 Subtask: 240 unmatched
+
SP-128 Шаблон Portfolio Review
+
SP-104 Сегментирование v2
+ +
Board SPS · Default · Текущая работа
+
SPS-7 Innovation pilot 2026
+
SPS-12 NPS опрос Q3
+
SPS-22 Доклад на CIO Forum
+
SPS-44 ITOM directive 2025-Q4 ↗ Jira
+
+ + +
+
+
Май
Июн
Июл
Авг
Сен
Окт
Ноя
+
+
+
+ +
+
+
SP-92 −3д
+
+
+
+
SP-101 Approved
+
+
+
+
SP-119 Proposed
+
+
+
+
↳122
+
+
+
+
SP-128 Draft
+
+
+
+
SP-104 Active
+
+ +
+ +
+
+
SPS-7 Innovation pilot
+
+
+
+
SPS-12 NPS
+
+
+
+
+
+
+
+
+
SPS-44 ITOM ↗ Jira
+
+ +
+
+
+
+
+ +
Источник данных. FunctionTask где boardId IN (доски этого workspace) ИЛИ topicId.boardId IN (...). У задачи есть startDate и dueDate — рисуется бар; если только dueDate — ромб-milestone. Цвет берётся из WorkflowStatus.color для customStatusId, либо из мапы статусов legacy enum.
+
+
+
+
+ + +
+

R2 Дорожная карта доски/boards/[id]/roadmap

+

ДК одной доски — точно как в FlowTask. Только задачи этой доски, цвета колонок workflow, milestone-ромбы для задач без startDate. Zoom Week / Month / Quarter с горячими клавишами W / M / Q.

+ +
+
moex-portal.vercel.app/boards/portfolio-mgmt-2026/roadmap
+
+
+
+
+ +
+

Дорожная карта · Board «Портфельное управление 2026»

рабочий процесс Портфельный · 22 задачи · 1 swimlane-тема · 8 задач напрямую
+
Канбан →
+
+ +
+
+ + + +
+ + +
+ Draft + Proposed + Approved + Active + Achieved + Milestone +
+ WMQ +
+ +
+
+
+
Задача · исполнитель
+ +
Swimlane · Portfolio Review (Topic)
+
SP-101 Portfolio Review Q3 ПН
+
↳ SP-101a Шаблон карточки ПН
+
↳ SP-101b Расчёт fit score АС
+
SP-119 Привязка инициатив ПН
+
↳ SP-122 240 unmatched ПН
+ +
Прямые задачи доски (без темы)
+
SP-92 CFO alerts ПН
+
SP-104 Сегментирование v2 АС
+
SP-128 Шаблон Review ПН
+
SP-78 Шаблон инициативы АС
+
SP-83 Каталог сегментов МВ
+
SP-110 NPS опрос Q3 МВ
+
+ +
+
+
Май W3
Май W4
Июн W1
Июн W2
Июн W3
Июн W4
Июл W1
+
+
+
+ +
+
+
SP-101 Approved
+
+
+
+
↳ 101a ✓
+
+
+
+
↳ 101b Active
+
+
+
+
SP-119 Proposed
+
+
+
+
↳ 122 240 unmatched
+
+ +
+ +
+
+
SP-92 −3д
+
+
+
+
SP-104 Active
+
+
+
+
SP-128 Draft
+
+
+
+
SP-78 ✓
+
+
+
+
SP-83 ✓
+
+
+
+
+
+ +
+
+
+
+
+ +
Совпадение с FlowTask. Колонки workflow доски → цвета баров (читаются из WorkflowStatus.color). Иерархия подзадач отображается отступом в left-panel. Просроченные задачи пульсируют красным. rm-today — вертикальная линия «сегодня» (FlowTask RoadmapView делает то же самое).
+ +
+
+

Что показывается на баре (как в FlowTask)

+
    +
  • startDate + dueDate → бар от старта до дедлайна
  • +
  • Только dueDate → ромб-milestone в день дедлайна
  • +
  • Только startDate → бар «открытый справа» с градиентом
  • +
  • dueDate < today и status ≠ DONE → пульсирующий красный
  • +
  • Цвет — из WorkflowStatus.color (custom) или из категории legacy
  • +
  • При hover — tooltip с историей статусов и оставшимся временем
  • +
+
+
+

Источник данных

+
    +
  • SQL: SELECT * FROM function_task WHERE boardId = ? AND (startDate IS NOT NULL OR dueDate IS NOT NULL)
  • +
  • + UNION SELECT * FROM function_task ft JOIN function_task_topic_assignments fta ON ... WHERE fta.topicId IN (SELECT id FROM topic WHERE boardId = ?)
  • +
  • Иерархия — по parentId / path / depth (новые поля)
  • +
  • История статусов — из EntityHistory WHERE entityType='FUNCTION_TASK' AND entityId=...
  • +
+
+
+
+
+
+
+ + +
+

08 UX-апгрейды портала (поверх существующих компонентов)

+

Все апгрейды — это либо расширения существующих компонентов, либо разовые добавки к уже существующим страницам. Нет ни одного нового «модуля» в навигации.

+ + + + + + + + + + + + + + +
АпгрейдГде живётЭффект
⌘+K глобальная палитраСуществующий components/layout/CommandPalette.tsx + app/api/search/. Добавляются индексы Topic / TaskНавигация ×3–5 быстрее
Quick add из headerСуществующая кнопка «+» в Header. Контекст preset (текущая функция / тема / цель из URL)−3 клика на создание задачи
Trash + Restore для FunctionTaskСуществующий паттерн (Topic уже использует deletedAt). Добавляем те же поля в FunctionTaskСнижает риск случайного delete
Daily digestНовый маршрут /digest. Vercel Cron → существующая Notification с новым типом + emailМенеджер ловит проблемы заранее
@mentionСуществующий TaskCommentEditor. Mention-popup. Новый тип в существующей NotificationПрямая адресация в коммментариях
Inline-edit статуса / исполнителяСуществующий QuickAssigneePopover и TaskStatusBadge. Расширить на любое место списка−50% времени на массовые операции
Saved viewsСуществующий AnalyticsPreset расширяем на TasksWorkspace«Мои просрочки», «Открытые в моих темах» — один клик
Bulk-actionsСуществующий TaskBulkActionsBar распространяется на все табличные вьюМассовое переназначение
Permalink на любую сущностьСуществующее поведение URL drawer-а. Кнопка «Копировать ссылку» в TaskDetailDrawerРешает кейс «скинь ссылку»
MFA для чувствительных функцийСуществующая инфра sessionMfa + новые поля Function.requireMfa · mfaGraceDaysСтратегические функции защищены 2FA
Перетаскивание дедлайнов в дорожной картеНовый view существующей /strategy-viz. Запись в существующий EntityHistoryРеальное планирование «руками»
Полировка состоянийСуществующие loading.tsx файлы — расширяются skeleton-ами. Empty states в существующих компонентахОсобенно для новой страницы Topic-доски
+
+ + +
+

09 Дорожная карта внедрения (4 фазы) v4 изменено

+
+

Фаза 1 · Схема + миграция ActionItem 1–2 недели

    +
  • ALTER TABLE: добавить parentId · path · depth · customStatusId · startDate · deletedAt · deletedBy · purgeAt в FunctionTask (nullable)
  • +
  • ALTER TABLE: workflowId · initiativeId · boardId в FunctionTaskTopic
  • +
  • CREATE TABLE: Workspace · Board · Workflow · WorkflowStatus · WorkflowTransition · Label · TaskLabel
  • +
  • Миграция ActionItem → FunctionTask: скрипт переноса данных, тег source: strategy, привязка через Topic.initiativeId
  • +
  • OpenAPI + Zod DTO для API расширений
  • +
+

Фаза 2 · UI расширения 3–4 недели

    +
  • Новый маршрут /functions/[slug]/topics/[topicId] с kanban на WorkflowStatus[]
  • +
  • Расширение TopicsWorkspace: переключатель списка/полос, фильтр workflow
  • +
  • Расширение TasksWorkspace: иерархия подзадач, inline-edit статуса
  • +
  • Расширение TaskDetailDrawer: дерево подзадач, labels
  • +
  • Конструктор Workflow (новая страница в настройках темы)
  • +
+

Фаза 3 · Связи и поиск 2 недели

    +
  • Блок «Темы под целью» на /goals/[id]
  • +
  • Опциональный Goal.progressMode (METRIC / TASKS / HYBRID)
  • +
  • Roadmap-вью на /strategy-viz + Topic.initiativeId
  • +
  • Расширение CommandPalette + app/api/search индексами Topic/Task
  • +
  • Расширение «Мои задачи» scope=my табами по источникам
  • +
+

Фаза 4 · Полировка 2–3 недели

    +
  • Новый маршрут /digest + Vercel Cron + email через существующий канал
  • +
  • @mention в TaskCommentEditor + новый тип в Notification
  • +
  • Trash + restore на FunctionTask (через 30-дневный purge)
  • +
  • MFA per function (через requireMfa)
  • +
  • E2E-тесты (Playwright уже настроен в портале)
  • +
+

Что НЕ делаем / убираем

    +
  • Убираем ActionItem — мигрируем в FunctionTask, таблицу deprecate
  • +
  • Не мигрируем FunctionTask в новую таблицу — обогащаем существующую
  • +
  • Не трогаем ITOM / Jira sync — workflow ITOM сохраняется
  • +
  • Не ломаем legacy UI — темы без boardId работают как раньше
  • +
  • Не дублируем типы задач — один FunctionTask для всего
  • +
+

Итого ~2–3 мес

Команда: 1 fullstack + 1 designer + 1 PO. MVP-горизонт — конец фазы 2 (4–6 недель): пилотная команда (одна функция) пробует kanban-тему с кастомным workflow на проде.

+
+
+ + +
+

10 Риски и открытые вопросы v4 изменено

+ + + + + + + + + + + + +
РискSeverityМитигация
Поломка ITOM/Jira-синхронизации при добавлении полей в FunctionTaskHIGHFunctionTaskItomDetails не трогаем. Все новые поля nullable. Регрессионные E2E на существующих ITOM-сценариях перед merge
Существующий FunctionTaskStatus enum vs новый customStatusId: двойственностьHIGHПравило: если у задачи customStatusId IS NOT NULL — он приоритет. Иначе используется legacy enum. UI рендерит то, что выбрано. Документировано в SDD
Производительность materialized path при глубокой иерархии подзадачMEDИндексы на path · depth · parentId. Ограничение depth ≤ 10 в API-валидации. Pagination листьев
Кросс-функциональные темы (function_task_topic_assignments M2M) с разными workflowMEDWorkflow привязан к Topic, не к Function. Все задачи в Topic используют один workflow Topic-а. Тесты на cross-function
Тренировка пользователей: новые понятия Workflow / Subtasks / LabelsMEDOnboarding-тур. Шаблоны Workflow (Legacy/Portfolio/Research/ITOM) в сидинге. Документация на /docs
Конкурс с существующими STANDARD_TASK_TAGSMEDSTANDARD_TASK_TAGS остаётся как seed-словарь меток уровня функции. Topic-уровневые labels — дополняют, не конфликтуют
Vercel cold-start на больших темахLOWRSC + streaming. Pagination. Virtualized lists. Текущий TasksWorkspace уже использует виртуализацию
Миграция resultChecklist Json в ChecklistItemLOWНа фазе 1 не трогаем JSON-поле. Опционально в фазе 4
Миграция ActionItem → FunctionTask: потеря данных, ссылки из Initiative/MilestoneHIGHСкрипт миграции с dry-run. Связи ActionItem → InitiativeTopic.initiativeId. Обратно-совместимый alias в API на переходный период. E2E на стратегических flow перед drop таблицы
UI стратегических блоков после drop ActionItemMEDСтраницы /strategy/initiatives/[id] переходят на FunctionTask через Topic. UI визуально не меняется, только источник данных
+ +

Открытые вопросы для согласования с владельцем

+
    +
  1. ActionItem → FunctionTask миграция: какие поля ActionItem обязательно сохранить? Есть ли внешние системы (кроме UI портала), которые читают ActionItem по API?
  2. +
  3. Стратегический UI: страницы /strategy/initiatives/[id] показывали ActionItem — после миграции показываем FunctionTask с тегом source: strategy. Нужны ли визуальные отличия?
  4. +
  5. Можно ли менять FunctionTaskStatus enum или нужен полный backward-compat для Jira-маппинга в ITOM?
  6. +
  7. Какие функции — пилотные на фазе 2? Предложение: strategy-partnership (по структуре подходит для свой рабочий процесс «Portfolio»)
  8. +
  9. Какой workflow по умолчанию для новых Topic? Legacy enum или новый «Standard» через WorkflowStatus?
  10. +
  11. Когда у Goal появляется progressMode=TASKS — расчёт через привязанные задачи или через темы? И что считать «прогрессом задачи» (бинарно done или % чек-листа)?
  12. +
+
+ +
+

Документ подготовлен как стартовая точка для обсуждения с владельцем moex-portal. Все макеты — интерактивные прототипы в реальной дизайн-системе портала. Для перехода к разработке необходимы: (1) согласование с владельцем, (2) детальная SDD по каждой фазе, (3) BDD-сценарии для критичных flow.

+

FlowTask × MOEX Portal · v4 · эволюция FunctionTask (подзадачи + workflow + roadmap) + ActionItem deprecated · Workspace/Board как организационный слой · MOEX design system · Arial · #FF0508

+
+ +
+
+ + +
+
+
+ FIN-101 +

API: история ордеров с фильтром по дате

+ +
+ +
+
+
Описание
+
Подробности задачи с описанием, чек-листом, связями. Здесь — реальная карточка с теми же полями что в макете M5.
+
Связи
+ + +
Комментарии (3)
+
АС
А. Смирнов
Предлагаю ограничить выборку 90 днями.
+
ЯВ
А. Яковенко
Принято. DTO обновлён.
+
+ +
+
+
+ + + + + + + diff --git a/docs/design/moex-portal-integration/two-layer-execution.html b/docs/design/moex-portal-integration/two-layer-execution.html new file mode 100644 index 0000000..13a114e --- /dev/null +++ b/docs/design/moex-portal-integration/two-layer-execution.html @@ -0,0 +1,375 @@ + + + + + +Двухслойная модель исполнения · макет (ответ на #113) + + + +
+ + +
+

Двухслойная модель исполнения

+

Делегированная работа (от руководителя) и личная (сотрудник ведёт сам) — это одна пара сущностей FunctionTask → ExecutionBoard. Разница — поле scope и правила видимости. Не второй трекер, не новый домен.

+ +

⎈ Два слоя — одна механика

+
+
+
🔴 Слой 1 · Делегированный #113 as-is
+
+
scope = FUNCTION
+
    +
  • Инициирует руководитель
  • +
  • Назначает исполнителю (нужно лидерство)
  • +
  • Видно в /tasks, weekly, своде
  • +
  • Контроль сложного поручения
  • +
+
+
+
+
🔵 Слой 2 · Личный наше дополнение
+
+
scope = PERSONAL
+
    +
  • Инициирует сам сотрудник
  • +
  • Назначает себе (лидерство не нужно)
  • +
  • Видно только ему в /my
  • +
  • Управление своей ежедневной работой
  • +
+
+
+
+
Обе колонки используют ту же доску исполнения, те же подзадачи, тот же workflow, тот же API и палитру MOEX. Меняется только кто создаёт и кому видно.
+ +

① Схема делегированного слоя (top-down)

+

Модель #113 без изменений. От задачи руководителя — вниз к доске, обратно — агрегат.

+
+
Руководитель
Создаёт задачу «Имплементировать портал», назначает Крылову
scope = FUNCTION · видна в /tasks, weekly
+
+
Исполнитель
Открывает задачу, заводит доску исполнения (1:1)
/tasks/FT-128/execution
+
+
Исполнитель
Подзадачи · кастомный workflow · roadmap
+
+
Руководитель
↑ Видит агрегированный summary в той же задаче
прогресс · просрочки · блокеры · ближайший срок
+
+ +

② Схема личного слоя (bottom-up, self-serve)

+

Сотрудник управляет своей работой из /my. Создаёт себе задачи, при желании — доску под каждую. «Сколько угодно досок» = сколько угодно личных задач, каждая со своей доской 1:1 (правило parentTaskId @unique не ломается).

+
+
Сотрудник · /my
Создаёт себе задачу (self-assign)
scope = PERSONAL · видно только автору
+
+
Сотрудник
При желании — доска исполнения (та же модель #113)
/tasks/FT-2009/execution
+
+
Сотрудник
Ведёт ежедневные задачи без доски (короткие)
+
+
Границы
✗ не в /tasks функции · ✗ не в weekly/своде · ✗ не в метриках просрочки · ✓ только в /my
+
+ +

③ Точка схождения — это одна модель

+

Ключевой аргумент мейнтейнеру: не строим второй трекер. Оба слоя — одна сущность, развилка по полю scope.

+
+
FunctionTask + scope  →  ExecutionBoard (1:1) → подзадачи · workflow · roadmap
+
+
scope = FUNCTIONДелегированное. Видно по RBAC функции. Поведение = текущее (дефолт).
+
scope = PERSONALЛичное. Видно только автору. Исключено из управленческих surfaces.
+
+
+
Delta к #113 = одно аддитивное поле FunctionTask.scope (FUNCTION|PERSONAL), default FUNCTION. Доска/подзадачи/workflow/API — без изменений. Существующие задачи остаются FUNCTION.
+ +

④ Личный кокпит — /my (список)

+

Существующая страница «Мои задачи», расширенная. В одном месте: спущенное мне (красная метка) + моё личное (синяя). Без нового домена в сайдбаре.

+ /my +
+
КР
+
+
Моё
+
Главная
+
Мои задачи
+
Рабочие задачи
+
Функции
+
ИТ-инфраструктура
+
+
+

Мои задачи

Крылов А. · спущенные мне + личные
+ + + + + + + + +
ЗадачаСлойДоскаСрокСтатус
Имплементировать порталделегир.⚙ 2/630.06В работе
Подготовить демо для советаделегир.10.06К рассм.
Разобрать backlog инфраструктурыличное⚙ 1/4В работе
Прочитать про K8s operatorsличное02.06To do
Созвон с подрядчикомличноевчераTo do
+
Личные строки (синие) видит только Крылов. В /tasks функции и в своде их нет.
+
+
+ +

⑤ Личный кокпит — /my (канбан)

+

Тот же набор, но как личная доска. Метка слоя на карточке: красная полоса — делегированное, синяя — личное.

+ /my?view=board +
+
КР
+
Моё
Главная
Мои задачи
Рабочие задачи
+
+

Мои задачи · Канбан

+ +
+
+
To do2
+
Прочитать про K8s operators
личное02.06
+
Созвон с подрядчиком
личноевчера
+
+
+
В работе2
+
Имплементировать портал
делегир.⚙ 2/6
+
Разобрать backlog инфраструктуры
личное⚙ 1/4
+
+
+
К рассм.1
+
Подготовить демо для совета
делегир.10.06
+
+
+
Готово1
+
Обновить личный план обучения
личноеdone
+
+
+
+
+ +

⑥ Создание личной задачи

+

Кнопка «+ Задача» в /my: дефолт scope = PERSONAL, исполнитель = я. Опционально сразу завести доску для разбивки.

+ +
Опирается на уже существующее правило кода (function-tasks/route.ts:825): self-assign разрешён без лидерства. Личный слой — достройка над этим, а не новая привилегия.
+ +

⑦ Кто что видит

+

Главный страх #113 — шум в backlog — закрывается правилом видимости по scope.

+
+
+
🔴 Руководитель / управленческие surfaces
+
+
Делегированные задачи (scope=FUNCTION) в /tasks
+
Их доски, summary, weekly, свод
+
Личные задачи сотрудника — не видит вообще
+
Личные доски и подзадачи
+
Личное не влияет на метрики просрочки функции
+
+
+
+
🔵 Сотрудник / личный кокпит /my
+
+
Делегированные мне задачи (scope=FUNCTION)
+
Свои личные задачи (scope=PERSONAL)
+
Доски и подзадачи обоих слоёв
+
Личный канбан / список / roadmap по всему
+
Чужие личные задачи — недоступны
+
+
+
+ +

⑧ Эскалация PERSONAL → FUNCTION

+

Бонус модели: личная задача выросла в реальную работу функции — одним действием «всплывает» руководителю, без пересоздания.

+ +
Требует WRITE_FUNCTION_TASKS на функцию. Обратно (FUNCTION→PERSONAL) — не делаем: то, что увидел руководитель, нельзя тихо спрятать.
+
+
+ +