Лендинг продукта. Как описать платформу из N сервисов по JTBD
«Технической информации присуще качество, когда ею легко пользоваться, её легко понять и легко найти.»
— Gretchen Hargis, Michelle Carey и др., Developing Quality Technical Information (IBM Press)
В статье «README — это продукт» мы сделали так, чтобы каждый файл в репозитории сервиса знал своего потребителя. У README — четыре потребителя, и каждый нанимает его на свою работу.
В статье «Композиция корректности» мы показали, что корректность системы из N сервисов выводится из корректности каждого сервиса и совместимости их контрактов. Один сервис никому не нужен — нужна система.
И вот тут вылезает дыра. Сервис описан хорошо. А продукт — платформа из десяти, двадцати, ста сервисов — не описан нигде. У системы нет входной двери. Менеджер не понимает, что это за зверь. Новый потребитель не понимает, из каких кусков он состоит. ИИ-агент, которого позвали делать фичу на три сервиса, не понимает, с чего начать и куда писать план.
В этой статье вводим лендинг продукта — витрину платформы. Разберём: кто его нанимает, что в него писать (и чего не писать), как это делают в индустрии, и как кросс-сервисная фича стартует именно здесь. Плюс скиллы для слабой модели и мат-часть.
Сквозной живой пример — concept-репозиторий codemonstersteam/pinout: экосистема инструментов для проверки совместимости сервисов по их OpenAPI/AsyncAPI-спецификациям. Платформа из четырёх модулей, у которой есть та самая входная дверь. Удобно, что pinout построен по той же методологии рациональной разработки, что мы разбираем в серии (его модули стоят на service-template и компонентных тестах) — так что лендинг тут не выдуман под статью, а живёт в проде.
GL HF DD!
Что нужно заранее
- Прочитанная «README — это продукт» — четыре JTBD-потребителя одного сервиса
- Прочитанная «Композиция корректности» — продукт как система из N сервисов
- Распределённый продукт: несколько репозиториев-сервисов под одной платформой (полирепо)
В этой главе:
- Продукт — это не сервис
- Пятый потребитель: кто читает лендинг
- Как это делают в индустрии
- Что пишем в лендинг и чего НЕ пишем
- Кросс-сервисная фича стартует в лендинге
- Вот скиллы
- Вот мат-часть
- Замыкание
Продукт — это не сервис
Сделаем различение, без которого дальше каша.
- Сервис — один репозиторий, один деплой, один контракт (OpenAPI/AsyncAPI). У него есть
README.md,docs/architecture.md, компонентные тесты. Его потребители описаны в статье про JTBD-README. - Продукт — платформа из N сервисов, которые ходят друг к другу через сеть и вместе решают задачу пользователя. У продукта нет одного README, потому что у него нет одного репозитория.
Возьмите pinout: валидатор синхронных контрактов pinout-openapi, валидатор асинхронных pinout-asyncapi, координатор графа зависимостей pinout-netlist, единый фронт pinout-cli. По отдельности каждый описан своей спекой и README. А что это вместе? Из каких кусков состоит система? Что с чем разговаривает? Где входная дверь?
В индустрии эту дверь ставят в отдельный репозиторий-концепт (он же meta-repo, он же coordination-root). Это не код — это описание системы целиком. Для pinout это codemonstersteam/pinout: зонтичный репозиторий, где живут модель контракта, обоснование и верхнеуровневый бэклог всей экосистемы.
И у его главной страницы — лендинга — свой потребитель, свой JTBD. Не такой, как у README сервиса.
Пятый потребитель: кто читает лендинг
У README сервиса четыре потребителя. У лендинга продукта — пятый, и он другой.
Сегмент: потребитель concept-уровня (менеджер, CTO, новый потребитель, ИИ-агент-оркестратор).
Job: за 60 секунд решить «годится ли мне эта платформа», затем сделать первый шаг.
Боль:
- Менеджер / CTO не лезет в технические детали — ему нужна картина целого за минуту, чтобы принять управленческое решение. Он редкий гость в своём хозяйстве. А зря: разве CTO не может взглянуть на репозитории своего хозяйства и оценить масштаб великолепия? Или бардака?
- Инженер-потребитель оценивает: эта платформа решает мою проблему или нет? Из чего она состоит? С чего начать?
- ИИ-агент-оркестратор, которому поручили фичу на три сервиса, должен понять структуру системы и найти, куда писать общий план.
Что нужно в лендинге этому потребителю:
- что это за платформа — одно предложение, не абзац;
- из каких кусков состоит — список сервисов/нод со статусом готовности, картина целого;
- стек платформы и схема верхнего уровня;
- границы — что платформа сознательно НЕ делает (отсекает ложные ожидания за минуту);
- позиционирование — чем отличается от известных альтернатив (потребитель сравнивает не в вакууме);
- первый шаг — ссылка на пошаговое подключение и на сервисы-примеры.
Чего не нужно: API конкретного сервиса, его модель данных, команды запуска, детали реализации. Это утопит картину целого в деталях одного куска. Лендинг описывает систему, не сервис.
Это уточняет четвёртый сегмент из прошлой статьи. Там «менеджер» читал README сервиса и тонул. Теперь у него своя дверь — лендинг продукта в concept-репо. README сервиса в первых строках ставит ссылку наверх: «Часть экосистемы pinout. Модель контракта и концепция — там».
Как это делают в индустрии
Прежде чем изобретать — посмотрим на лучшие открытые продукты. Все они платформы из N сервисов, и у всех есть «дверь», описывающая систему целиком.
Supabase — open-source бэкенд-платформа. README и страница архитектуры прямо перечисляют куски: Kong (gateway) → GoTrue (auth), PostgREST (REST поверх Postgres), Realtime (websockets), Storage. Это образцовый ответ на «из чего состоит система» — не реализация одного сервиса, а карта платформы.
Dapr — CNCF-проект, распределённый рантайм. Его Overview построен вокруг building blocks (pub/sub, state, secrets, workflow, actors): концепт описывает возможности системы как набор кубиков, а не как один бинарь.
Backstage (Spotify) — каталог ПО и портал разработчика. Его System Model — это готовая онтология для описания продукта из N сервисов: Domain → System → Component → API. Ровно тот язык, на котором лендинг продукта говорит про целое: какие домены, какие системы, какие компоненты, какие API между ними.
GitHub Spec Kit и AWS Kiro — инструменты spec-driven development. Они показывают, где в 2025–2026 живёт план фичи: спецификация (spec.md), план (plan.md), задачи (tasks/). Не в голове, не в чате — в версионируемом артефакте рядом с кодом. Мы используем тот же скелет для кросс-сервисной фичи (ниже).
monorepo.tools и стандарт AGENTS.md — про координацию. Для полирепо консенсус такой: завести solution-root репозиторий как слой координации для агентов, с одним каноническим набором правил. Это и есть роль concept-репо.
Вывод из всех референсов один: у зрелого распределённого продукта есть отдельное место, которое описывает систему, а не сервис. Витрина + каталог + координация. Мы собираем это в concept-репо — и ниже разбираем на живом pinout, как каждый из этих элементов ложится в один README.
Что пишем в лендинг и чего НЕ пишем
Лендинг — это README.md concept-репо плюс парная страница docs/get-started.md (пошаговое подключение). Главная ошибка — натащить туда деталей сервиса. Поэтому начинаем с анти-контента.
Анти-контент: чего в лендинге быть НЕ должно
| Если в лендинге есть… | …куда вынести |
|---|---|
| API-эндпоинты, pipe-описания | README сервиса |
| Архитектура конкретного сервиса | docs/architecture.md сервиса |
| Модель данных, команды запуска, структура проекта | README сервиса |
| Детали реализации любого уровня | репозиторий сервиса |
| Длинный quickstart, troubleshooting | docs/get-started.md концепта |
| Манифест / архитектура платформы / roadmap (развёрнуто) | docs/manifesto.md / docs/architecture.md / docs/roadmap.md концепта |
Правило одно: concept описывает систему, не сервис. Concept ссылается, не копирует.
Что писать: шесть проходов
Лендинг собирается за проходы, каждый с жёстким лимитом (это важно для слабой модели — см. скиллы ниже):
- Hero. Что за платформа — одно предложение ≤ 25 слов. Затем: для кого.
- Из чего состоит. Список нод/сервисов/форматов, каждый — одна строка ≤ 12 слов, со статусом готовности (✅ работает / 📋 проектируется / 🚧 концепт). Картина целого, без деталей куска.
- Анти-контент чистка. Прогон по таблице выше: всё, что про один сервис, — вынести.
- Стек и схема. Таблица
компонент платформы → технология+ одна диаграмма верхнего уровня (ноды и связи, не внутренности сервиса). ASCII годится, ноmermaid/C4-Context в GitHub рендерится как картинка и читается лучше — предпочтителен. - Границы и позиционирование. Короткая таблица «что платформа НЕ делает → чем закрывается» и таблица «альтернатива → чем мы отличаемся». Оба режут ложные ожидания за минуту.
- Первый шаг. Ссылка на
docs/get-started.mdи на модуль-пример, который уже работает (у pinout этоpinout-asyncapi✅). Текст ссылки описателен, не «здесь».
Лимит-ориентир — одна–две прокрутки. Строгий порог «≤ 60 строк» держим для витринной части (проходы 1–4, 6). Обоснование, границы и позиционирование могут добавить объёма — и это нормально для раннего концепта, где инвариант, границы и сравнение с альтернативами ещё не заслужили отдельных docs/-страниц (см. оговорку ниже). Правило-детектор остаётся прежним: если объём растёт из-за деталей одного сервиса — возврат к проходу 3.
Разбор живого лендинга: README pinout
Посмотрим, как эти проходы ложатся на реальный README pinout — концепт-репозиторий экосистемы валидаторов контрактов:
| Проход | Где в README pinout |
|---|---|
| Hero | Первая строка: «Экосистема инструментов, которая проверяет совместимость сервисов по их машиночитаемым спецификациям (OpenAPI, AsyncAPI) на pre-merge стадии в CI» — ~20 слов, ровно одна работа |
| Из чего состоит | Таблица «Состав экосистемы»: pinout-asyncapi ✅, pinout-openapi 📋, pinout-netlist 📋, pinout-cli 📋 — каждый модуль со статусом и ссылкой на репо |
| Стек и схема | Диаграмма mermaid C4-Context «Экосистема pinout»: ноды-валидаторы, внешние consumer/provider, стрелки связей — картина целого, без внутренностей модуля |
| Границы | Таблица «Границы (что pinout сознательно не делает)»: пять строк «граница → как закрывается» — отсекает ожидание «это заменит мне компонентные тесты» |
| Позиционирование | Таблица vs Pact / Microcks / oasdiff — «что делает → чем отличается pinout» |
| Первый шаг | Ссылки на модули-репозитории; рабочий вход — pinout-asyncapi (✅ работает) |
Обратите внимание на приём аналогии в hero-блоке: pinout объясняет себя через распиновку микросхемы (какие сигналы на какие пины). Одна точная метафора экономит потребителю concept-уровня абзац объяснений — это чистая clarity из мат-части ниже.
Оговорка: где pinout стоит подрезать
Живой пример честнее идеала. README pinout длиннее витринного порога: он держит инлайн развёрнутое «Обоснование» (несущий инвариант, семь преимуществ перед генерацией клиентских либ) и «Принципы». По анти-контент-правилу это кандидаты на вынос в docs/manifesto.md / docs/architecture.md концепта.
Почему это пока допустимо: pinout — ранний концепт (🚧), где обоснование ещё активно обсуждается и является главным содержанием репо, а не сервиса. Пока читатель — это в основном тот, кто решает «а стоит ли вообще так делать», обоснование рядом с витриной оправдано. Как только модулей станет больше и появятся внешние потребители, «Обоснование» и «Принципы» переезжают в docs/, а лендинг сжимается к витрине. Это и есть работающее правило: не «никогда инлайн», а «инлайн, пока обоснование — главный продукт репо; выносим, когда главным становится сама платформа».
Кросс-сервисная фича стартует в лендинге
Теперь главное, ради чего concept-репо — это не только витрина, но и coordination-root.
Фича затрагивает один сервис → её проектируют и реализуют в его репозитории (скиллы program-design и program-implementation из прошлых статей).
Фича затрагивает больше одного сервиса → проектирование стартует в лендинге, как кросс-сервисная фича. Где живёт артефакт — по практике spec-driven development:
codemonstersteam/pinout/docs/features/<slug>/
spec.md — что и зачем (SDD spec)
plan.md — кросс-сервисная декомпозиция + ссылки на бэклоги сервисов + статусы
spec.md → plan.md — это тот же скелет spec → plan, что у Spec Kit и Kiro, только на уровне продукта. Полный жизненный цикл:
- Specify (
spec.md): проблема и outcome, затронутые сервисы (≥ 2), границы scope, constraints, прежние решения (ссылки на ADR/concept), критерии приёмки — кросс-сервисный сценарий. - Дизайн: какие контракты между сервисами появляются или меняются (OpenAPI/AsyncAPI), кто кого вызывает, последовательность. Контракт проектируется spec-first.
- Plan (
plan.md): таблица — на каждый затронутый сервис строка со ссылкой на задачу в егоbacklog.md, в порядке зависимости. Пример для реальной фичи pinout «структурированный JSON-отчёт валидаторов → приём в netlist»:
| # | Сервис (репо) | Что делает | Backlog-задача | Зависит от | Статус |
|---|-------------------|------------------------------|---------------------------------|------------|--------|
| 1 | pinout-netlist | схема отчёта + endpoint приёма| pinout-netlist/backlog.md#... | — | todo |
| 2 | pinout-asyncapi | эмит отчёта в формате схемы | pinout-asyncapi/backlog.md#... | 1 | todo |
| 3 | pinout-openapi | эмит отчёта в формате схемы | pinout-openapi/backlog.md#... | 1 | todo |
- Связывание: в каждом сервисе заводим задачу со ссылкой обратно на фичу; дальше сервис идёт своим флоу. Единое имя ветки во всех репо
feat/<slug>; PR в порядке зависимости, в теле —Depends on <repo>#<PR>. Это прямые polyrepo-практики координации: backend → shared → frontend. - Синхронизация статусов:
plan.md— единственный источник правды о прогрессе фичи. Обновляется при каждом merge в сервисе. - Закрытие: все строки
doneИ кросс-сервисный сценарий из критериев приёмки проходит (контрактные/компонентные тесты зелёные).
Заметьте симметрию с композицией корректности: как корректность системы собирается из корректности сервисов плюс совместимости контрактов, так и разработка кросс-фичи собирается из локальных бэклогов сервисов плюс согласованного плана в лендинге. Лендинг — точка композиции на уровне процесса.
Вот скиллы
Документация и оркестрация — не разовый акт вдохновения, а детерминированная процедура. Мы вынесли её в три скилла формата SKILL.md — они живут в открытом харнесе rationaldev-ai-sdlc-skills (папка skills/lib/). Все три рассчитаны на слабую модель (уровня Qwen 37B): пошаговые проходы, таблицы-роутеры вместо суждений, жёсткие числовые лимиты, STOP-правила, финальные чеклисты. Сильная модель (Opus) проектирует скилл — слабая исполняет.
| Скилл | Зона | Что делает |
|---|---|---|
documentation |
один сервис | Роутер «контент → файл», проходы сборки README и docs/architecture.md, триггеры обновления |
doc-quality-review |
любой документ | Рубрика ревью качества по ядру характеристик из книги (см. мат-часть) |
platform-landing |
concept-репо | PART I — витрина (шесть проходов), PART II — жизненный цикл кросс-сервисной фичи |
У platform-landing есть и готовые шаблоны: landing-README.md.tmpl, get-started.md.tmpl, component-row.md.tmpl — скелет лендинга и пошагового подключения под проходы из этой статьи.
Ключевой приём для слабой модели — роутер вместо суждения. Не «реши, куда положить текст» (это требует вывода, на котором маленькая модель плывёт), а «найди строку в таблице — положи туда». То же с лимитами: не «пиши кратко», а «одно предложение ≤ 25 слов». И STOP-правила: не понял сегмент, нет контракта, правка удаляет факт → остановись и спроси оператора, не угадывай.
Вот мат-часть
Под скиллами — две теоретические опоры.
JTBD: документация как продукт
Documentation «для всех» — а значит ни для кого. Каждый документ нанимается на конкретную работу конкретного потребителя. Лендинг продукта — это просто ещё один продукт с ещё одним потребителем (concept-уровень), который мы спроектировали по JTBD, как и README сервиса.
Цена вопроса не абстрактна. Качественная документация повышает производительность команды на 25% (DORA 2023); команды с качественной докой в 2.4 раза чаще показывают высокую производительность доставки. У распределённого продукта без лендинга самый дорогой потерянный человек — тот, кто неделю собирает картину системы по десяти разрозненным README.
Девять характеристик качества: IBM «Developing Quality Technical Information»
Чтобы ревью доки не было «нравится/не нравится», нужна рубрика. Берём её из классической книги Gretchen Hargis, Michelle Carey и др. (IBM Press). Она задаёт девять характеристик качества в трёх группах:
| Группа | Характеристики |
|---|---|
| Easy to use (легко пользоваться) | Task orientation · Accuracy · Completeness |
| Easy to understand (легко понять) | Clarity · Concreteness · Style |
| Easy to find (легко найти) | Organization · Retrievability · Visual effectiveness |
Для dev-доков мы взяли ядро из шести (task orientation, accuracy, completeness, clarity, organization, retrievability) и переформулировали каждую проверку под markdown-репозиторий. Примеры того, во что они превращаются в doc-quality-review:
- Task orientation → «документ написан под конкретный JTBD-сегмент, а не для всех»; «заголовки раскрывают задачу, а не абстрактны».
- Accuracy → «таблица API и pipe соответствуют
api-specification/»; «команды запуска реально работают». - Completeness → «покрыто всё, что нужно сегменту, и только это»; «один источник правды, без дублей».
- Clarity → «овервью ≤ 20 слов»; «каждый новый термин определён».
- Organization → «каждый кусок в своём файле по роутеру»; «видно, как части складываются».
- Retrievability → «все ссылки резолвятся и описательны»; «есть указатель на concept».
Книга даёт и готовую рейтинговую шкалу (Appendix A: каждую характеристику оцениваешь 1–5). В скилле для слабой модели мы свели её к ✓/✗ и правилу «если ✗ → действие», чтобы убрать субъективность.
Зачем характеристики Style / Concreteness / Visual оставили за бортом ядра? Они про типографику, иллюстрации и художественный стиль — для лендинга и dev-доки вторичны. Лендинг проверяется на «легко найти суть и решить за минуту», а не на красоту шрифтов.
Замыкание
Серия про рациональную разработку прошла путь снизу вверх: модуль → сервис → спецификация → система. Документация шла тем же путём:
- README сервиса знает четырёх потребителей (статья 02).
- Корректность системы собирается из сервисов и контрактов (статья 08).
- Лендинг продукта даёт системе входную дверь и точку старта для кросс-фич (эта статья).
Распределённый продукт без лендинга — это дом без входной двери: внутри всё на месте, но войти можно только зная, где сломан забор. Лендинг ставит дверь: потребитель concept-уровня за минуту решает, годится ли платформа, а кросс-сервисная фича получает один артефакт, из которого видно весь план.
Живой пример этой двери — codemonstersteam/pinout: hero в одну строку, состав со статусами, C4-схема, границы и позиционирование в одном README. Не идеальный (обоснование ещё инлайн — и мы честно разобрали, когда его выносить), но рабочий.
И всё это — не вдохновение, а процедура: три скилла, две теоретические опоры, проверяемые лимиты. Дорогая модель проектирует процедуру. Дешёвая — исполняет. Человек — решает.
GG!