АРХ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: roadmap двусторонней доски внешних контуров

This commit is contained in:
DCCONSTRUCTIONS 2026-04-20 19:51:02 +03:00
parent 6cb0545957
commit 969c218e99
4 changed files with 550 additions and 1 deletions

View File

@ -0,0 +1,148 @@
# Шаг 11. Единый shell карточки внешнего контура
## Зачем нужен этот шаг
Сейчас карточка деталей во `Внешних контурах` решает прикладную задачу, но UX-паттерн у нее другой, чем во `Внутреннем контуре`.
Из-за этого:
- у пользователя ломается ожидаемая логика открытия карточки
- верхний action-bar живет по другим правилам
- повторяется UI-логика, которая уже есть у стандартного peek-shell
- дальнейшее развитие `Внешних контуров` начинает расходиться с остальным продуктом
Следующий шаг должен выровнять не данные, а каркас взаимодействия.
## Целевой результат
По клику на карточку во `Внешних контурах` пользователь получает тот же класс панели, что и во `Внутреннем контуре`:
- закрытие просмотра
- полноэкранный режим
- переключение макета
- подписка или отписка
- копирование ссылки
- меню дополнительных действий
При этом тело карточки остается отдельным и специфичным для `Внешних контуров`.
## Что обязательно сохраняем
Карточка внешнего контура не должна деградировать до обычной карточки `Issue`.
Нужно сохранить:
- source-side режим без обязательного membership в target project
- блок `Маршрутизация`
- зеркалирование комментариев, вложений и activity
- внешний lifecycle `Принять / Отклонить / Ответ во внешний контур`
- правила доступа, отличающиеся от обычного внутреннего рабочего элемента
Иначе мы потеряем главный смысл модуля.
## Что меняем
Меняем только shell и верхний UX-паттерн:
- каркас панели
- поведение открытия и закрытия
- поведение полноэкранного режима
- верхний блок действий
- раскладку заголовка и служебных controls
То есть цель шага — унификация оболочки, а не унификация доменной модели.
## Что не входит
В этот шаг не входят:
- новые колонки `Исходящие / Входящие`
- drag-and-drop
- пользовательские кастомные представления
- перенос всех операций внешнего контура на стандартные issue services
- удаление запроса как обязательное действие из header action set
## Архитектурный принцип
Нельзя копировать целиком реализацию `peek overview` внутреннего контура и натягивать ее поверх внешней сущности.
Правильный путь:
- переиспользовать shell-контракт
- переиспользовать header action pattern
- оставить внешний data-flow отдельным
- оставить body карточки отдельным
То есть нужен не clone существующей карточки, а повторное использование общего слоя представления.
## Рекомендуемое разбиение реализации
### 1. Общий слой shell
Нужен общий контракт боковой карточки, который умеет:
- sidebar-режим
- full-screen режим
- общий overlay и поведение закрытия
- общий header slot
- общий body slot
### 2. Отдельный adapter для `Внешних контуров`
Нужен внешний adapter, который подает в shell:
- title
- служебные действия
- доступные действия меню
- состояние source-only или target-access
- body контент внешнего контура
### 3. Отдельный action set
Нельзя слепо использовать меню обычной задачи.
Нужно отдельное правило доступных действий для внешнего контура:
- закрыть
- fullscreen
- layout toggle
- subscribe/unsubscribe
- copy link
- `...`
При этом `...` для внешнего контура должен быть ограничен собственным набором действий и не обязан повторять delete-flow внутреннего рабочего элемента.
## Риски, которые надо избежать
### 1. Смешение доменных сущностей
Если внешний запрос начать вести как обычный `Issue`, то быстро сломаются:
- source-side права
- логика bridge
- роутинг действий `Принять / Отклонить`
- зеркальная история
### 2. Дублирование shell-кода
Если сделать второй независимый peek-shell только для `Внешних контуров`, то дальше появятся:
- рассинхрон верхних action-bar
- повторная поддержка полноэкранного режима
- повторная поддержка keyboard и close behavior
### 3. Преждевременная универсальная платформа
Не нужно ради одного шага строить абстрактный UI-framework на все возможные будущие сущности.
Нужен только тот общий контракт, который уже доказан двумя режимами:
- `Внутренний контур`
- `Внешние контуры`
## Критерий приемки
- карточка `Внешних контуров` открывается по тому же UX-паттерну, что и во `Внутреннем контуре`
- верхняя панель действий выглядит и ведет себя единообразно
- body карточки остается внешнеконтурным
- source-only сценарий не ломается
- без прямого доступа в target project пользователь все равно видит рабочую карточку
## Зависимость следующего шага
Этот шаг желательно сделать до полной двусторонней доски.
Причина простая:
- доска `Исходящие / Входящие` увеличит число точек входа в карточку
- если shell не унифицирован заранее, новый board-layer закрепит текущую раздвоенную архитектуру
Следующий связанный шаг описан в:
- [12_STEP_external-contours-bidirectional-board.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/docs_prod/1_STEP_cross-project-task-routing/12_STEP_external-contours-bidirectional-board.md)

View File

@ -0,0 +1,197 @@
# Шаг 12. Двусторонняя доска внешних контуров
## Главная продуктовая задача
Во `Внешних контурах` пользователь должен видеть не только прилетевшие или уже принятые задачи, но и те запросы, которые его проект сам отправил в другие контуры.
Без этого теряется управляемость:
- пользователь отправляет запрос
- но не может нормально наблюдать его как отдельную рабочую сущность
- и не получает полноценный рабочий экран для исходящих запросов
Поэтому следующий обязательный этап — двусторонняя доска.
## Обязательный состав первой версии
В первой версии должны быть только две системные зоны:
- `Исходящие`
- `Входящие`
Это фиксированные рабочие представления, а не свободный конструктор колонок.
## Что означает каждая зона
### Исходящие
Запросы, которые текущий проект отправил в другие контуры.
Для них пользователь должен видеть:
- текущий статус исполнения
- целевой контур
- назначенного
- последнее изменение
- признаки новых изменений
### Входящие
Запросы, которые пришли в текущий проект из других контуров.
Они должны оставаться видимыми во `Внешних контурах` как отдельный контекст межконтурной работы, даже если фактическая работа по исполнению идет во `Внутреннем контуре`.
Это не отменяет текущий lifecycle появления задачи во `Внутреннем контуре`.
Наоборот, это добавляет отдельный рабочий слой наблюдения и управления межконтурным потоком.
## Обязательное ограничение
Во `Внешних контурах` нельзя реализовывать перетаскивание карточек между блоками.
Причина:
- блоки здесь не равны стадиям workflow
- это не kanban статусов
- это представления по направлению и фильтрам
Следовательно:
- никаких drag-and-drop переходов между `Исходящими` и `Входящими`
- никаких попыток “перетащить” запрос в другой блок как способ смены состояния
Смена состояния остается доменной операцией, а не визуальным переносом.
## Требования к фильтрации
Обе системные зоны должны поддерживать гибкую фильтрацию по аналогии с `Внутренним контуром`.
Минимально нужно уметь фильтровать:
- по пользователям
- по назначенным
- по автору
- по статусам
- по связанным контурам или проектам
- по приоритету
- по срокам и датам
Если часть фильтров недоступна на первой итерации из-за backend-модели, это нужно закрывать адаптером или агрегированным endpoint, а не урезать целевой продуктовый контракт.
## Текущее архитектурное препятствие
На сегодня `Исходящие` и `Входящие` живут в разных подсистемах:
- source-side отправленные запросы приходят из модуля `external-contours`
- входящие рабочие объекты и bridge-история живут вокруг `intake` и связанной target issue
Поэтому полноценная двусторонняя доска не собирается простым склеиванием текущего UI.
Нужен единый слой представления данных.
## Рекомендуемое архитектурное решение
### 1. Не собирать эту доску фронтовыми хаками
Можно временно склеить две разные выдачи на frontend, но это быстро упрется в:
- сортировки
- пагинацию
- счетчики
- консистентность фильтров
- unread-индикаторы
Поэтому базовый путь должен вести к агрегированному data contract.
### 2. Ввести единый board-level view model
Нужна единая проекция, условно:
- `direction`
- `source_project`
- `target_project`
- `status`
- `assignee`
- `created_by`
- `updated_at`
- `unread`
- `target_issue_id`
- `external_request_id`
Этот view model не обязан ломать существующие доменные сущности.
Он нужен как стабильный контракт уровня доски.
### 3. Сделать board как фиксированные системные представления
Первая версия не должна строиться как свободный пользовательский конструктор.
Нужны два системных блока:
- блок `Исходящие`
- блок `Входящие`
И только поверх этого позже можно добавлять дополнительные пользовательские представления.
## Как не уйти в крайности
### Плохой путь 1
Сделать поверх текущего экрана несколько разрозненных переоберток и локальных фильтров.
Результат:
- быстрое накопление технического долга
- отсутствие общего контракта
- трудная интеграция следующих board-type модулей
### Плохой путь 2
Остановить проект и начать строить универсальную платформу на все будущие доски сразу.
Результат:
- высокий срок поставки
- риск поломать текущий runtime
- потеря фокуса на реальной продуктовой потребности
### Рабочий путь
Сделать ограниченный, но расширяемый board contract именно для межконтурных задач:
- фиксированные системные зоны
- единый тип board item
- единый фильтровый слой
- переиспользуемый detail-shell из шага 11
## Связь с будущими пользовательскими колонками
Пользовательские представления нужны, но не должны быть частью первой двусторонней доски.
Их нужно проектировать как следующий слой поверх уже введенного board contract:
- пользователь создает свой блок
- задает имя
- задает фильтр
- получает еще одно представление рядом с системными блоками
Но это именно представление.
Это не новая стадия исполнения и не область для drag-and-drop.
## Связь с будущими типами досок
Архитектура этого шага должна допускать расширение на:
- агентные доски
- специализированные operational boards
- гибридные наблюдательные представления по нескольким контурам
Из этого следуют два правила:
- доска должна собираться вокруг контракта представления, а не вокруг одной конкретной сущности `Issue`
- колонка должна означать выборку или представление, а не обязательно статус workflow
## Критерий приемки
- пользователь видит во `Внешних контурах` две системные зоны: `Исходящие` и `Входящие`
- отправленные запросы не теряются после отправки и остаются видимыми как рабочие объекты
- обе зоны фильтруются через единый механизм
- открытие карточки из любой зоны ведет в единый shell шага 11
- между зонами нет drag-and-drop
## Что идет следующим шагом после этого
После стабилизации двусторонней доски можно переходить к пользовательским представлениям поверх того же контракта.
Но только после того, как:
- подтверждена стабильность системных зон
- подтверждена консистентность фильтров
- подтверждена работа detail-shell в обоих направлениях
Связанный документ:
- [11_STEP_external-contours-detail-shell.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/docs_prod/1_STEP_cross-project-task-routing/11_STEP_external-contours-detail-shell.md)

View File

@ -116,6 +116,77 @@
На этом месте разработка следующего шага останавливается до фиксации продуктовых решений. На этом месте разработка следующего шага останавливается до фиксации продуктовых решений.
## Зафиксированные продуктовые решения на 2026-04-20
После freeze point приняты дополнительные продуктовые решения по следующему циклу развития `Внешних контуров`.
### 1. Нужны две обязательные системные зоны
Во `Внешних контурах` должны появиться:
- `Исходящие`
- `Входящие`
`Исходящие` обязательны, потому что пользователь должен видеть запросы, которые он сам отправил в другие контуры, до и после обработки.
`Входящие` обязательны, потому что проект должен видеть запросы, пришедшие к нему из других контуров, в отдельном специализированном режиме работы, а не только как обычные задачи `Внутреннего контура`.
### 2. Обе зоны должны фильтроваться так же гибко, как во `Внутреннем контуре`
Минимальный целевой принцип:
- фильтрация по пользователям
- фильтрация по статусам
- фильтрация по назначенным
- фильтрация по автору
- фильтрация по контурам и связанным проектам
То есть `Внешние контуры` должны получить не просто статичный список, а управляемое рабочее представление.
### 3. Карточка деталей внешнего контура должна перейти на тот же UX-паттерн, что и во `Внутреннем контуре`
При клике по карточке должна открываться панель того же класса:
- закрыть просмотр
- открыть на весь экран
- переключить макет
- подписка или отписка
- копирование ссылки
- меню дополнительных действий
При этом:
- действие удаления в этом shell не является обязательным
- тело карточки остается внешнеконтурным, а не превращается в обычную карточку внутренней задачи
### 4. Внешний контур — это не workflow-kanban
Важно зафиксировать заранее:
- пользователь не должен перетаскивать задачи между блоками
- блоки во `Внешних контурах` — это представления и выборки, а не стадии исполнения
- нельзя переносить сюда механику drag-and-drop из `Внутреннего контура`
### 5. Пользовательские колонки нужны, но не входят в ближайший обязательный срез
Собственные пользовательские блоки и сортировки нужны как следующий этап развития, но не должны размыть ближайшие обязательные поставки:
1. единый shell карточки внешнего контура
2. двусторонняя доска `Исходящие / Входящие`
### 6. Архитектура должна остаться расширяемой
Следующий слой развития не ограничивается только внешними контурами.
Дальше в проекте могут появиться:
- новые типы досок
- агентные доски
- специализированные мониторинговые представления
- пользовательские рабочие поверхности под разные роли
Поэтому нельзя решать следующий этап только переобертками и точечными хаками.
Но и полный демонтаж текущего проекта ради абстрактной платформы тоже недопустим.
Рабочий принцип:
- не ломать текущий runtime
- не дублировать уже существующие механики без причины
- выносить только те контракты, которые реально переиспользуются дальше
## Что нужно решить перед продолжением ## Что нужно решить перед продолжением
- Что именно делает действие `Принять`: - Что именно делает действие `Принять`:
@ -415,4 +486,6 @@
- определение границ MVP - определение границ MVP
Подробная поэтапная разработка описана в: Подробная поэтапная разработка описана в:
- [phase-roadmap.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/docs_prod/cross-project-task-routing/phase-roadmap.md) - [phase-roadmap.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/docs_prod/1_STEP_cross-project-task-routing/phase-roadmap.md)
- [11_STEP_external-contours-detail-shell.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/docs_prod/1_STEP_cross-project-task-routing/11_STEP_external-contours-detail-shell.md)
- [12_STEP_external-contours-bidirectional-board.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/docs_prod/1_STEP_cross-project-task-routing/12_STEP_external-contours-bidirectional-board.md)

View File

@ -27,6 +27,21 @@
Дальше по roadmap пока не идем, пока не приняты продуктовые решения по внутреннему жизненному циклу принятого запроса. Дальше по roadmap пока не идем, пока не приняты продуктовые решения по внутреннему жизненному циклу принятого запроса.
## Новая рамка после freeze point на 2026-04-20
После дополнительной продуктовой фиксации следующий цикл делится на три слоя:
1. единый shell карточки внешнего контура
2. двусторонняя доска `Исходящие / Входящие`
3. пользовательские представления поверх той же доски
При этом обязательное архитектурное ограничение фиксируется заранее:
- во `Внешних контурах` нет drag-and-drop между блоками
- блоки здесь означают представления, а не стадии workflow
Подробные архитектурные шаги вынесены в:
- [11_STEP_external-contours-detail-shell.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/docs_prod/1_STEP_cross-project-task-routing/11_STEP_external-contours-detail-shell.md)
- [12_STEP_external-contours-bidirectional-board.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/docs_prod/1_STEP_cross-project-task-routing/12_STEP_external-contours-bidirectional-board.md)
## Этап 0. Термины и навигация ## Этап 0. Термины и навигация
### Цель ### Цель
@ -236,6 +251,122 @@
- тест-кейсы - тест-кейсы
- регламент эксплуатации - регламент эксплуатации
## Этап 6. Единый shell карточки внешнего контура
### Цель
Привести карточку деталей `Внешних контуров` к тому же UX-паттерну, что и во `Внутреннем контуре`, не ломая при этом внешний data-flow.
### Что входит
- общий shell открытия карточки
- тот же класс верхнего action-bar:
- закрытие просмотра
- полноэкранный режим
- переключение макета
- подписка или отписка
- копирование ссылки
- меню дополнительных действий
- переиспользование общего представления shell без подмены доменной модели внешнего контура
- сохранение внешнеконтурного body:
- `Маршрутизация`
- зеркальные комментарии
- зеркальные вложения
- external lifecycle
### Что не входит
- две системные зоны `Исходящие / Входящие`
- пользовательские колонки
- drag-and-drop
- насильственный перевод внешнего запроса в обычный issue detail
### Критерий приемки
- карточка `Внешних контуров` открывается по тому же UX-паттерну, что и внутренний peek
- source-only сценарий не ломается
- body карточки остается внешнеконтурным
### Статус
Запланировано.
Подробно описано в:
- [11_STEP_external-contours-detail-shell.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/docs_prod/1_STEP_cross-project-task-routing/11_STEP_external-contours-detail-shell.md)
## Этап 7. Двусторонняя доска `Исходящие / Входящие`
### Цель
Дать проекту единый рабочий экран межконтурной работы, где видны и отправленные, и полученные запросы.
### Что входит
- две фиксированные системные зоны:
- `Исходящие`
- `Входящие`
- единый board-level data contract
- фильтрация обеих зон по аналогии с `Внутренним контуром`
- счетчики
- открытие карточки в shell этапа 6
### Важное правило
Это не kanban статусов.
Во `Внешних контурах`:
- нет drag-and-drop между блоками
- блоки означают представления по направлению и фильтрам
- смена состояния не должна кодироваться визуальным переносом карточки
### Что не входит
- пользовательские кастомные зоны
- свободный конструктор колонок
- превращение доски во второй workflow движок
### Критерий приемки
- пользователь видит и `Исходящие`, и `Входящие`
- отправленные запросы не теряются после отправки
- обе системные зоны фильтруются через единый механизм
- карточка из любой зоны открывается единообразно
### Статус
Запланировано.
Подробно описано в:
- [12_STEP_external-contours-bidirectional-board.md](/Users/dcconstructions/Downloads/mnt/data/dc_taskmanager/NODEDC_TASKMANAGER/docs_prod/1_STEP_cross-project-task-routing/12_STEP_external-contours-bidirectional-board.md)
## Этап 8. Пользовательские представления поверх двусторонней доски
### Цель
Разрешить пользователю собирать собственные рабочие выборки поверх уже стабилизированной двусторонней доски.
### Что входит
- пользовательские блоки или представления
- пользовательское имя блока
- сохранение набора фильтров
- персональные рабочие выборки по контурам, статусам, пользователям и другим признакам
### Важное правило
Пользовательские блоки не меняют базовый принцип:
- это не стадии workflow
- это не drag-and-drop
- это не замена `Внутреннего контура`
### Зависимость
Этап начинается только после стабилизации этапов 6 и 7.
### Статус
Запланировано как следующий слой развития, но не входит в ближайший обязательный срез.
## Технические решения, которые желательно держать с самого начала ## Технические решения, которые желательно держать с самого начала
### 1. Не ломать штатный intake ### 1. Не ломать штатный intake