temporality
Изменить страницу↗
Инженерные документы

Пересмотр роли проектов: активность глобальна, проект — атрибуция [L1-3]

#1. Цель [L3-5]

Разделить четыре роли, которые сегодня неявно выполняет project_id, и убрать жёсткую привязку активности (раны, триггеры, операции, вопросы) к проектам. Проект остаётся доменом знаний и рабочих артефактов, но перестаёт быть partition'ом для всего интерфейса и API.

#2. Ограничения предыдущей модели [L5-21]

Модель «всё фильтруется по текущему выбранному проекту» показала пределы:

Общий корень: проект — обязательный разрез всего. Любой поток событий, приходящий без проекта (вебхук, сообщение в канале, расписание), нуждается в маршрутизации до того, как система сможет его показать.

#3. Что такое проект сегодня [L21-45]

Фактическая карта привязок (миграции 000018–000059, controlplane, UI):

Роль Где закреплена Нужна ли после пересмотра
Домен знаний knowledge: scope_kind=project по рождению, промоушен в org/organization да — это главная роль
Рабочие артефакты песочница .sandbox/projects/<id>/…, задачи/раны работают «в проекте» да — как контекст исполнения рана
Граница доступа gate.Allow(..., project): пустой проект = 403 для не-админов; project_member; связи с org-юнитами нет — доступ через org-структуру и членство; проект остаётся фильтром
Граница учёта kernel_run_quota_day, cost-ролапы по проектам частично — проект остаётся разрезом отчётов, не границей лимитов
Partition активности workspace_task/run/trigger.project_id NOT NULL, все списки UI нет — становится атрибутом-атрибуцией

Журнал (observation_events.project_id TEXT NOT NULL DEFAULT '') уже мягкий: события без проекта возможны. Это подсказывает направление.

#4. Принцип [L45-60]

Активность глобальна, проект — атрибуция.

Инвариант: у рана, который трогал артефакты проекта, проект известен всегда (через задачу/триггер/классификацию) — атрибуция не становится опциональной для ранов, работающих с проектными данными. Опциональна только фильтрация.

#5. Модель доступа [L60-78]

Сегодня: пустой ?project= разрешён только принципалам с доступом во все проекты (controlplane.Gate.Allow, контроль 403 «may not query across projects»). Для остальных любое глобальное представление недоступно.

Целевое поведение:

Для single-team установок (все видят всё) поведение вырождается в глобальные списки без фильтров — без отдельного режима.

#6. Триггеры и маршрутизация [L78-95]

#7. Что меняется в UI [L95-109]

#8. Фазы [L109-126]

#Фаза 1 — списки без обязательного проекта (без смены схемы) [L112-116]

#Фаза 2 — триггеры глобально [L116-121]

#Фаза 3 — разгрузка учёта и очистка [L121-126]

#9. Критерии готовности [L126-140]

#Фаза 1 [L127-131]

#Фаза 2 [L131-135]

#Фаза 3 [L135-140]

#10. Открытые вопросы [L140-150]