Перейти к содержимому

CrewsForge — Шаг 9: Декомпозиция и порядок поставки

Статус: черновик на подтверждение · Шаг 9 из 9 Основание: шаги 0–8. Формат под Claude Code: каждый эпик — самодостаточный контекст со ссылкой на проектный документ; критерии приёмки — инварианты и тесты из шагов.

Размеры: S ≈ 1–2 дня, M ≈ 3–5 дней, L ≈ 1–2 недели (с учётом вашего AI-tooling множителя 3–5x — консервативно).


Волна 1 — Фундамент (всё остальное стоит на этом)

Заголовок раздела «Волна 1 — Фундамент (всё остальное стоит на этом)»
ЭпикСодержимоеРазмерЗависитДокумент / приёмка
F1. Shared-либы ядраmoney (минорные единицы, ceil-комиссия, наибольшие остатки), domain-events (каталог, типы payload), platform-calendar (рабочие часы)Mшаг 5.4, 7.1, 7.3; юнит-тесты округления — сумма сплита всегда равна холду
F2. Либа outboxМодель, транзакционная запись, relay-механика (для F4)SF1шаг 1; тест атомарности: откат бизнес-транзакции не оставляет события
F3. Либа state-machineДекларации, executor (CAS → guards → effects → журнал → outbox), idempotentTarget, каскады, резолвер актораLF1, F2шаг 3.1, 4.2; тесты: конкурентный переход, идемпотентный повтор, запись отказа актора
F4. Baseline-схема + сидыSquash миграций в целевую схему целиком (+дельты шагов 6–7: templateVersion/documentHash, ConciergeThread/Message, частичный индекс QueueItem), raw-SQL констрейнты, сидыSшаг 8 (упрощён); чек-лист 8.3
F5. Auth: платформенные ролиclaim platformRole, три guard’а, запрет совмещения ролей, сиды ролейSF4шаг 4.1; негативные тесты кросс-ролевого доступа

Дополнение 2026-08-30 — пропущенный эпик и пропущенная модель

Заголовок раздела «Дополнение 2026-08-30 — пропущенный эпик и пропущенная модель»

Внесено сессией 0 контура поставки по правилу 3 настоящего документа (расхождение решается правкой документа, а не молчаливым отступлением). Основание: сверка спроектированных артефактов шагов 2–7 со списком эпиков.

Пропущен эпик «Домен Team». Шаг 2 §3 проектирует Team, TeamMember (оси rolecanSign/canSubmit), TeamInvitation и инвариант «последний admin не может уйти»; шаг 7 §2 содержит строку задачи «заявка команды на онбординг → TEAM_ONBOARDING → ADMIN, 3 дня»; шаг 2 §9 включает TEAM в SubjectType журнала переходов. Эпика в волнах ниже не было, при этом от домена команд зависят A1 (оффер команде), контрактинг (подписант с canSign), A2 (сдача с canSubmit) и B1 (PayoutAccount принадлежит команде).

ЭпикСодержимоеРазмерЗависитДокумент / приёмка
F6. Домен TeamTeam, TeamMember, TeamInvitation; две оси — доступа и полномочий; приглашения; инвариант последнего администратора; team-поверхность и админская верификация; машина статуса командыMF4, F5шаг 2 §3; шаг 7 §2 (TEAM_ONBOARDING); негативные тесты полномочий и последнего администратора

Машина статуса команды не имела таблицы переходов. SubjectType шага 2 §9 включает TEAM, но шаг 3 таблицы переходов для команды не содержит. Объявляется в F6: ONBOARDING → ACTIVE ⇄ SUSPENDED → ARCHIVED, актор — ADMINISTRATOR, приостановка требует причины.

ExternalPaymentDispute не объявлен в схеме. Шаг 5 §6 требует отдельной модели для карточных chargeback’ов (имя не должно пересекаться с Dispute), но в схеме шага 2 её нет. Модель вводится в эпике, реализующем chargeback’и; дельта схемы фиксируется там же.


Волна 2 — Домены (параллелизуется на 3 потока)

Заголовок раздела «Волна 2 — Домены (параллелизуется на 3 потока)»

Поток A (ядро сделки):

ЭпикСодержимоеРазмерЗависит
A1. Project reworkМашина проекта + суб-машина контрактинга на F3, Specification-версии, PlanVersion (+F-1 WHERE-правила), Party, Offer, мягкий бюджет-гейтLF3, F4, F5
A2. Milestone-доменMilestone + материализация из PlanVersion, критерии, артефакты, сдача с самопроверкой M-3, AcceptanceReview (R-1/R-2), пауза дедлайнов R-3LA1
A3. Dispute + TerminationОбе машины, позиции/доказательства (T-1 DTO), оценка по критериям X-2, связка основанийMA2

Поток B (деньги и документы):

ЭпикСодержимоеРазмерЗависит
B1. billing-api каркас + PayoutAccountСервис, Stripe-конфиг, Express-онбординг, account.updated, машина аккаунта, Y-правилаMF3, F4, F5
B2. Холды и фондированиеCheckout Session, вебхуки интента, Hold-машина, каскад в FUNDED, ACH+картыLB1, A2
B3. Settlements и выплатыСистемный расчёт по основаниям, двухфазное исполнение D-6, transfer c source_transaction, маппинг payout.paid, refund/split, ExternalPaymentDisputeLB2, A3
B4. СверкаНочная reconciliation, зависшие состояния, алертыSB3
B5. Контракты и подписаниеШаблоны+PDF-рендер, порт SigningProvider, адаптер BoldSign (sandbox), конверты K-4, вебхуки, хэшиLA1

Поток C (операционка):

ЭпикСодержимоеРазмерЗависит
C1. platform-worker каркас + relayПриложение, консьюмеры-скелеты, DLX, метрикиSF2, F4
C2. task-generator + timer-schedulerТаблицы маппинга задач и окон, дедуп-индекс, SLA-расчёт по календарю, тест полноты Q-4MC1, F1
C3. notification-dispatcherТаблица адресности, F-1/T-1-фильтры, шаблоны 7.3, email через email-senderMC1
C4. admin-api: три рабочих местаОператорская поверхность (approve/reject/эскалация, DTO без денег + линтер), администраторская, арбитражная; core-модули из потоков A/BLF5, A1–A3, C2
C5. КонсьержТреды, первая линия, эскалацияSC4, C2
ЭпикСодержимоеРазмерЗависит
G1. ai-agent: типизация планаКонтракт вилок C-1, запись Specification-версий через core-модульMA1
G2. tracker-integration заглушкаПорт (no-op), TrackerLink, вебхук-приёмник, integration-dispatcher в workerSC1
G3. Кросс-QAМатрица-раннер шага 4.9, escrow-линтер (схема+шаблоны+уведомления), e2e сквозного happy path (проект → PAID → COMPLETED), e2e спора и расторженияMвсё
G4. Переключение на baseline + смоукОкно обслуживания, drop+baseline+сиды на проде, редеплой всех сервисов, чек-лист 8.3Sвсё выше
G5. Нагрузочное (k6)Целевые сценарии беты (регистрация→контракт, фондирование, приёмка) до публичного запускаSG4

F3 → A1 → A2 → B2 → B3 → C4 → G3 → G4 — машины, ядро сделки, деньги, рабочие места, сквозные тесты. Всё остальное параллелится вокруг него. B5 (контракты) не на критическом пути формально, но блокирует happy path e2e — держать в темпе потока B.

graph LR
F1 --> F2 --> F3
F4 --> F3
F3 --> A1 --> A2 --> A3
F5 --> A1
F3 --> B1 --> B2 --> B3 --> B4
A2 --> B2
A3 --> B3
A1 --> B5
F2 --> C1 --> C2
C1 --> C3
A3 --> C4
C2 --> C4 --> C5
A1 --> G1
C1 --> G2
C4 --> G3 --> G4 --> G5
B3 --> G3
B5 --> G3
  1. Один эпик = одна ветка = один контекст; в промпт эпика кладутся: соответствующий step-документ целиком, конвенции репо, декларации соседних машин (read-only).
  2. Инварианты-тесты пишутся внутри эпика, который вводит механизм (не отдельным QA-эпиком): денежный линтер — в C4, тест полноты Q-4 — в C2, тесты округления — в F1. G3 только собирает сквозные сценарии.
  3. Расхождение реализации с step-документом решается правкой документа через подтверждение (сессия продолжается как ревью), не молчаливым отступлением.
  4. Определение готовности эпика: тесты приёмки зелёные + документ актуален + чек-лист конвенций (*-core.module, барели, границы Nx).

Волны и критический путь выше остаются основанием, но исполняется проект по вертикальным срезам продукта, а не по эпикам-слоям: см. docs/delivery/ROADMAP.md — 27 единиц, каждая (кроме фундамента и закалки) заканчивается работающими эндпоинтами. Причина замены: эпик-слой закрывается формально зелёными тестами, не давая проверяемого продукта, — риск, который вертикальная нарезка снимает.