docs(spec): calendar_share co-editor/deputy and Time Arc alignment.

Back §2.1.3 API/ACL; Front §3.3 share busy/ghost. Refs EventHub/EventHubBack#73
This commit is contained in:
2026-08-15 23:20:39 +03:00
parent 1182568c9d
commit 4dd741ba48
7 changed files with 342 additions and 161 deletions
+144
View File
@@ -0,0 +1,144 @@
# EventHub — карта для AI-агентов (Zed / Cursor)
Кросс-репо ориентир: где какой модуль и куда класть правки. Детали API — в `EventHubBackSpec.md` / `EventHubFrontSpec.md` / `EventHubFrontAdminSpec.md`. Процесс — `WORKFLOW.md`.
## Репозитории
| Репо | Стек | Зона |
|------|------|------|
| `EventHubBack` | Erlang/OTP 28, Cowboy, Mnesia | Public + Admin API |
| `EventHubFront` | React + Vite + TanStack Query | Клиентский SPA (CalenTIQ) |
| `EventHubFrontAdmin` | React + Vite | Admin SPA |
| `EventHubSpec` | Markdown | Спеки, UI-PARITY, workflow |
| `EventHubAiRouter` | FastAPI + LiteLLM | Zed gateway / routing |
| `EventHubDevOps` | Docker Swarm | Стенды, deploy |
**Правило:** один агент / один PR — один репо. Не смешивать Front и Back в одной сессии правок.
Бренд UI: **CalenTIQ**. Внутренние имена репо `EventHub*` не менять.
## Домен (кратко)
- **User** — владелец календарей / запись на слоты
- **Calendar** — расписание, специалисты, follow
- **Event** — слоты (в т.ч. recurring)
- **Booking / booking-request** — запись / заявка
- **Ticket / Review / Report** — поддержка, отзывы, жалобы
- **Subscription** — подписка владельца
- **Specialist invite** — приглашение специалиста в календарь
- **Admin** — модерация, аудит, stats (отдельный JWT)
Стенды: **dev** локально, **IFT**, **stage** (`https://stage.calentiq.com`, admin `https://admin.stage.calentiq.com`).
---
## EventHubBack (`src/`)
Слои (сверху вниз):
| Слой | Путь | Ответственность |
|------|------|-----------------|
| HTTP | `handlers/`, `handlers/admin/` | Cowboy handlers, валидация входа/ответа |
| Logic | `logic/` | Бизнес-правила, оркестрация core |
| Core | `core/` | Mnesia-таблицы / CRUD сущности |
| Infra | `infra/` | Mnesia, auth helpers, workers, migrations |
| Middleware | `middlewares/` | Auth JWT и т.п. |
### Типичные пары handler → logic → core
| Домен | Handler(s) | Logic | Core |
|-------|------------|-------|------|
| Auth / session | `handler_login`, `handler_register`, `handler_auth`, `handler_refresh`, `handler_verify` | `logic_auth`, `logic_auth_session`, `logic_user` | `core_user`, `core_session`, `core_auth_session`, `core_verification` |
| Password reset | `handler_forgot_password`, `handler_reset_password` | `logic_password_reset` | `core_password_reset` |
| Calendars | `handler_calendars`, `handler_calendar_by_id`, `handler_calendar_view` | `logic_calendar` | `core_calendar` |
| Specialists | `handler_calendar_specialists`, `handler_specialist_invites`, `handler_calendar_specialist_invites` | `logic_calendar_specialist`, `logic_specialist_invite` | `core_calendar_specialist`, `core_specialist_invite` |
| Follow | `handler_calendar_follow`, `handler_user_following` | `logic_calendar_follow` | `core_calendar_follow` |
| Events | `handler_events`, `handler_event_by_id`, `handler_event_occurrences` | `logic_event`, `logic_recurrence` | `core_event` |
| Bookings | `handler_bookings`, `handler_booking_by_id`, `handler_user_bookings`, `handler_user_booking_requests` | `logic_booking` | `core_booking` |
| Reviews | `handler_reviews`, `handler_review_by_id`, `handler_user_reviews`, `handler_review_vote` | `logic_review` | `core_review`, `core_review_vote` |
| Tickets | `handler_tickets`, `handler_ticket_by_id` | `logic_ticket` | `core_ticket` |
| Reports | `handler_reports` | `logic_report` | `core_report` |
| Search / lookup | `handler_search`, `handler_users_lookup` | `logic_search`, `logic_user_lookup` | — |
| Subscription | `handler_subscription` | `logic_subscription` | `core_subscription` |
| Notifications | — | `logic_notification` | `core_notification` |
| Admin API | `handlers/admin/admin_handler_*` | `logic_admin`, `logic_moderation`, `logic_automoderation`, `logic_stats` | `core_admin`, `core_admin_*`, `core_banned_words`, `core_automod_*` |
Миграции: `src/migrations/`. Сборка/тесты: **только WSL** (`source scripts/wsl-dev-env.sh`, `rebar3 eunit`).
---
## EventHubFront (`src/`)
| Путь | Зачем |
|------|--------|
| `pages/` | Экраны маршрутов |
| `api/*Api.ts` | HTTP к Back |
| `components/calendar/` | UI календаря / workspace |
| `layouts/AppShell.tsx` | Оболочка |
| `store/` | Zustand (auth, mood, locale, calendar context) |
| `hooks/` | React hooks (API, WS, swipe) |
| `lib/` | Утилиты (payloads, schedule, booking display) |
| `i18n/` | Локали |
### Страницы → смысл
| Page | Маршрут (ориентир) | Тема |
|------|-------------------|------|
| `DiscoverPage` | discover | Поиск / лента |
| `CalendarsPage` | calendars | Список календарей |
| `CalendarWorkspacePage` | `/c/:id` | Основной workspace слотов |
| `BookingsPage` | bookings | Мои записи / inbox заявок |
| `ReviewsPage` | reviews | Отзывы |
| `TicketsPage` / `TicketDetailPage` | tickets | Тикеты |
| `SubscriptionPage` | subscription | Подписка |
| `FollowingPage` | following | Подписки на календари |
| `SpecialistInvitesPage` | invites | Инвайты специалиста |
| `ProfilePage` / `MorePage` | profile / more | Профиль / меню |
| `pages/auth/*` | login/register/… | Auth |
npm / Playwright — **только WSL** (см. `.cursor/rules/npm-wsl.mdc`).
---
## EventHubFrontAdmin (`src/`)
| Путь | Зачем |
|------|--------|
| `pages/dashboard` | Дашборд |
| `pages/users`, `calendars`, `events` | Справочники |
| `pages/tickets`, `reports`, `inbox` | Модерация / inbox |
| `pages/reviews`, `automod`, `banned-words` | Контент / автомод |
| `pages/subscriptions`, `admins`, `audit`, `monitoring` | Биллинг / админы / аудит / метрики |
| `api/*Api.ts` | Admin API client |
| `store/authStore.ts` | Admin session |
---
## EventHubAiRouter (`router/`, `config/`)
| Файл / папка | Зачем |
|--------------|--------|
| `router/router.py` | Zed `/v1/chat/completions`, ветка tools vs text |
| `router/hierarchical.py` | Plan (Qwen3.8-Max) / workers / verify (DeepSeek) / plan_confirm |
| `router/agent_hier.py` | При `tools`: Coder-30B executor + tool_calls (Zed Write) |
| `router/orchestrator.py` | Tiers / lanes ABC, Redis session |
| `config/orchestration.yaml` | Модели plan/verify/executor, таймауты, synthetic=never |
| `config/providers.yaml` | Novita / VPN (`novita-planner` = Max) |
| `scripts/gen-litellm-config.py` | Генерация LiteLLM YAML |
IFT: `https://ai-router.ift.calentiq.com/v1`, модель `smart-router`.
Клиент-канон: **Zed Agent** (openai-compatible) → AiRouter; не Claude Code/Codex ACP как primary (обход бюджета).
---
## Куда править (шпаргалка)
| Задача | Репо | Куда смотреть |
|--------|------|----------------|
| Баг API / Mnesia | Back | `handlers``logic``core` |
| UI клиент | Front | `pages` + `api` + `components/calendar` |
| UI админки | FrontAdmin | `pages` + `api` |
| Контракт / процесс | Spec | `*Spec.md`, `WORKFLOW.md`, `design/` |
| Zed routing / hierarchical | AiRouter | `router/*`, `config/orchestration.yaml` |
Перед крупным планом: **утвердить** шаги с пользователем; не раздувать scope (не трогать соседний репо «заодно»).