---
title: "Лабораторія проєкту власника (Owner Project Lab)"
description: "My Projects покупця (/my-orders), спільний чат order_lab з інтегратором і Reggie та адмінська CRM-сторінка замовлення в /admin/crm — вкладки правої панелі й статус у hero-блоці"
locale: "uk"
---
# Лабораторія проєкту власника (Owner Project Lab)

> **Info**
> Використовуйте вкладки **Founder** / **Developer** на бічній панелі документації, щоб відфільтрувати цю сторінку. Спільні розділи нижче стосуються обох аудиторій.

Після оплати **замовлення проєкту** через калькулятор **покупець (власник)** відкриває **My Projects** за адресою `/my-orders` — статус, **Order Project Config** (назва/слоган/логотип), **секрети власника** (Firebase/RingBase), замаскований підсумок деплою та одну спільну **кімнату проєкту** з інтегратором і Reggie. Інтегратори працюють у цій самій кімнаті з `/my-jobs/[id]`, маючи ops env і повний projectConfig (без відкритого тексту секретів власника). Адміністратори керують замовленнями в `/admin/crm/orders/[id]`. Усі три детальні поверхні мають спільні **вкладки правої панелі Order Lab** (кольорове позначення готовності) та компактний hero-блок зі станом **pods / deploy / DB health**. Деплой доступний лише інтегратору/адміністратору; Reggie ніколи не виконує деплой.

| Роль | Поверхня | Що можна робити |
|------|---------|------------------|
| **Покупець** | `/my-orders`, `/my-orders/[id]` | Вкладки: overview · playbook · project · secrets · wiki · source · room; важливий **projectConfig**; env **owner_private**; **доступне для запису** overlay-джерело Forgejo (після scaffold); кімната проєкту — **без** deploy/scaffold |
| **Інтегратор** | `/my-jobs/[id]` Order Lab | Вкладки: overview · playbook · project · secrets · wiki · env · source · deploy (+ плаваюча панель чату); ops env + `imageTag`; повний projectConfig; **Request update** для ключів власника; deploy |
| **Адмін** | `/admin/crm/orders/[id]` | Вкладки: overview · manage · project · secrets · env · source · deploy · chats; блокування namespace; усі env + projectConfig |
| **Reggie** | Poller на `order_lab` | Заблокований у namespace/project метаданих; лише плани в чаті — **без deploy** |

### Оболонка Order Lab (1.97.20+)

Спільна оболонка: `OrderLabPageShell` → `RingRightRailLayout` + `DavinciCenterPane` + `OrderLabNavRail` (активна вкладка = beam chrome; статус через StatusDot) + `OrderLabHeroStats`. Deep-link: `?tab=`, `?source=` (відкриває вкладку Source), `#project-config` / `#secrets`. SSOT статусу: `computeOrderLabTabStatuses` (перше відображення на сервері) + живі оновлення клієнта (`refreshHero`, `tabStatusFromDeploySnapshot`, `tabStatusFromSourceTree` — порожнє значення/scaffold → помаранчевий незавершений стан). `GET /api/my-jobs/[id]/deployment/status` (серверний клон `/api/health` — без browser CORS). Клієнтські запити використовують `fetchJsonSafe`. Клієнтська частина Manage розташована в `features/crm/orders/crm-order-detail-client.tsx`.

### SSOT конфігурації замовлення проєкту

Сховище control plane: `project_orders.data.projectConfig` (дозволений overlay ring-config). Під час деплою `applyAndDeploy` записує ConfigMap `RING_ORDER_PROJECT_CONFIG` + дзеркала `NEXT_PUBLIC_BRAND_*`. Runtime: `ring-config-core` `mergeDeep(file, overlay)`. Встановлений `ring-config.json` ніколи не переписується.

```mermaid
flowchart TD
  buyer["/my-orders/[id]"] --> lab["order_lab roombuyer + integrator + Reggie"]
  integrator["/my-jobs/[id]"] --> lab
  admin["/admin/crm/orders/[id]"] --> lab
  admin --> dmI["Integrator DM"]
  admin --> dmC["Client DM"]
  reggie["Reggie poller"] --> lab
```

### For founders

## Чому це важливо для вашого клону

Індивідуальні замовлення Ringization потребують **панелі керування для покупця**, яка не є робочим столом інтегратора. Власники бачать прогрес і спілкуються в одній кімнаті; вони ніколи не бачать секретів кластера. Адміністратори зберігають приватні DM для ескалацій, а кімната проєкту залишається єдиним місцем обговорення проєкту. Кольорові вкладки показують, що ще потрібно заповнити (червоний = обов’язкове, помаранчевий = рекомендоване, м’ятний = готове).

  
  
  

### Чекліст оператора

1. Покупець платить через калькулятор → переходить до деталей цього замовлення в **My Projects**.
2. Мітка навігації **My Projects** (`navigation.myProjectOrders`) містить оплачену роботу та роботу в процесі.
3. У деталях у hero-блоці та вкладці Overview відображаються статус оплати/роботи, прогрес, URL проєкту / статус останнього деплою (замасковано — без секретів env).
4. Чат: одна вкладка **кімнати проєкту** — та сама кімната, яку використовують інтегратор і Reggie.
5. Адмін відкриває `/admin/crm/orders/[id]` для Manage + Chats (кімната Reggie | DM інтегратора | DM клієнта) і за потреби встановлює блокування namespace.

Старі URL сторінок `/admin/email-*` **видалені**. Для закладок використовуйте `/admin/crm/{inbox,drafts,contacts,tasks,analytics,orders}`. Шляхи API залишаються `/api/admin/email/*`.

### For developers

## API та сторінки покупця

| Частина | Шлях |
|-------|------|
| Сторінка списку | `app/[locale]/my-orders/page.tsx` → `MyOrdersListClient` |
| Сторінка деталей | `app/[locale]/my-orders/[id]/page.tsx` → `BuyerOrderPanel` → `OrderLabPageShell` |
| API списку | `GET /api/my-orders` — `ProjectOrderService.listForUser` (власник сесії) |
| API деталей | `GET /api/my-orders/[id]` — власник або адміністратор платформи; підсумок деплою **без** секретів env |
| Статус (hero) | `GET /api/my-jobs/[id]/deployment/status` — `allowBuyer`; pods + метадані деплою + серверна health probe |
| Env власника | `GET/PATCH /api/my-orders/[id]/env` — лише `owner_private` + `public_shared` |
| Конфігурація проєкту | `GET/PATCH /api/my-orders/[id]/project-config` — життєво важливе маскування покупця |
| Конфігурація проєкту інтегратора | `GET/PATCH /api/my-jobs/[id]/project-config` — повний allowlist |
| Запит env | `POST /api/my-jobs/env-request` (+ `/cancel`) — публікує `env_request` в `order_lab` |
| Маршрути | `ROUTES.MY_ORDERS`, `ROUTES.MY_ORDER(id)` у `constants/routes.ts` |
| CTA після успішної оплати | `app/[locale]/calculator/success/page.tsx` → `ROUTES.MY_ORDER(order.id)` |
| SSOT оболонки | `features/crm/lab/order-lab-page-shell.tsx`, `order-lab-tabs.ts`, `order-lab-tab-status.ts`, `safe-fetch-json.ts` |

Відповідь деталей містить order і необов’язкові `{ edge, namespace, projectName, deploymentName, projectUrl, lastDeployAt, lastDeployStatus, lastError? }`, а також `edgeLabels` з `RING_EDGES`.

## Авторизація Lab і запуск чату

| Частина | Шлях / контракт |
|-------|-----------------|
| Авторизація | `features/crm/lab/lab-auth.ts` — ролі `admin` \| `integrator` \| `buyer`; `allowBuyer` для читання/чату + source file PUT/suggest-message |
| Відхилення мутацій покупця | Маршрути Deploy/env/scaffold не містять `allowBuyer` (403); коміти source overlay дозволені покупцю |
| Запуск чату | `GET /api/my-jobs/[id]/chat` з `allowBuyer: true` |
| Спільне навантаження | `labConversationId` (+ застарілий `orderLabConversationId`) для всіх ролей |
| Додатково лише для адміна | `integratorDmId`, `clientDmId` (псевдоніми включають застарілий `customerConversationId`) |
| Сервіс кімнати | `getOrCreateOrderLabConversation` + `syncOrderLabMetadata` у `order-lab-chat-service.ts` |

`syncOrderLabMetadata` копіює `namespace`, `deploymentName`, `edge`, `projectName`, `buyerUserId`, `integratorId` у метадані розмови (`kind: order_lab`, `hiddenFromInbox: true`).

### Матриця ролей (перевірено)

| Дія | Покупець | Інтегратор | Адмін | Reggie |
|--------|-------|------------|-------|--------|
| Читання замовлення + замаскований деплой | так | так (My Jobs) | так | — |
| Чат кімнати проєкту | так | так | так | відповідь poller |
| Env `owner_private` | **запис** | лише запит | запис | ні |
| Env `integrator_ops` | ні | запис | запис | ні |
| Order Project Config (життєво важливе) | **запис** | запис | запис | ні |
| Order Project Config (повне) | лише vital | **повне** | повне | ні |
| Deploy / pods | ні | так | так | **ні** |
| Блокування namespace / edge | ні | ні | так | ні |

## UI адмінської CRM

| Частина | Шлях |
|-------|------|
| Вкладки чату | `features/crm/lab/admin-crm-chat-tabs.tsx` — кімната Reggie \| DM інтегратора \| DM клієнта |
| Редактор namespace | `features/crm/lab/admin-namespace-editor.tsx` |
| Оболонка CRM | `features/admin/crm/crm-admin-shell.tsx` — `showRightRail={false}`; вкладки Orders \| Inbox \| Drafts \| Contacts \| Tasks \| Analytics |
| pageContexts | `crm-orders`, `crm-inbox`, `crm-drafts`, `crm-contacts`, `crm-tasks`, `crm-analytics` |
| Маршрути | Канонічні `ADMIN_CRM_*`; псевдоніми `ADMIN_EMAIL_*` вказують на `/admin/crm/*` |
| Повторний експорт | `features/admin/email/email-admin-shell.tsx` → `CrmAdminShell` (застарілий псевдонім) |

**HTTP** API адміністратора електронної пошти не змінені — див. [Email AI-CRM API](/docs/api/email-ai-crm.md). Ідентифікатор cron `email-analytics` не змінений.

### Простежте доступ покупця

Підтвердьте, що користувач сесії володіє замовленням для `GET /api/my-orders/[id]`. Покупці не повинні отримувати env-мапи — лише наведені вище поля замаскованого підсумку деплою.

### Запустіть чат з allowBuyer

Викличте `GET /api/my-jobs/[id]/chat`. Очікуйте `labConversationId` і `role: 'buyer' | 'integrator' | 'admin'`. Підключіть UI до однієї кімнати проєкту (патерн `LabThread` / бічної панелі order-lab).

### Не знімайте блокування Reggie

Після змін namespace/projectName переконайтеся, що виконується `syncOrderLabMetadata` (під час запуску чату та шляхів patch деплою). Poller (`AI-REGGIE/scripts/reggie-order-lab-poller.mjs`) читає метадані й відмовляється працювати з іншими namespace/project.

## Пов’язана документація

  
- **[Email AI-CRM](/docs/features/email-ai-crm.md)** — Вхідні в /admin/crm/*; API все ще в /api/admin/email/*.

  
- **[Консоль адміністратора](/docs/features/admin.md)** — CrmAdminShell, pageContexts і панель вкладок CRM.

  
- **[PaymentConductor](/docs/features/payment-conductor.md)** — Депозити project_order, які наповнюють My Projects.

  
- **[Обмін повідомленнями](/docs/features/messaging.md)** — Типи розмов і приховування кімнат інструментів / lab у вхідних.

- [configuration](/docs/configuration.md) — Наступний крок: центр конфігурації Order Lab — public vars, secrets, WalletConnect, wiki, playbook.

- [configuration/walletconnect](/docs/configuration/walletconnect.md) — Той самий процес: покупець задає NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID у Secrets.

- [configuration/secrets](/docs/configuration/secrets.md) — Поглиблення: потік збереження вкладки Secrets для owner_private / public_shared.

- [customization/ringization-playbook](/docs/customization/ringization-playbook.md) — Наступний крок: чекліст feature-overlay рівнів Tier-1/2/3 для самостійної збірки та робочих столів інтеграторів.

- [features/admin-wiki](/docs/features/admin-wiki.md) — Той самий процес: кожне замовлення проєкту може зберігати Markdown wiki-сховище на робочих столах покупця та інтегратора.

- [features/admin](/docs/features/admin.md) — Див. також: робочий стіл замовлень CRM розташований в оболонці консолі адміністратора.

- [features/payment-conductor](/docs/features/payment-conductor.md) — Передумова: замовлення проєктів оплачуються через PaymentConductor до розблокування My Projects.

- [development/ring-mcp](/docs/development/ring-mcp.md) — Залежність: агенти можуть записувати сховища проєкту через ring-wiki-*, тоді як Reggie залишається в режимі планування для деплою.
