Правила ведення документації
В цьому розділі описано: типи сторінок, шапки, теги, обов’язкові секції — довідник формату для автора (людини або AI) у момент написання.
Шпаргалка
| Сутність в документації | Картка |
|---|---|
| Фронт та його поведінку | UI |
| Бек-логіку яка займається конкретною задачею | Service |
| Крон логіка | Worker |
| RMQ / БД / зовнішній API | Integration |
| Бізнес-фіча її взаємодія | Feature |
| Колекцію / таблицю БД | Entity |
| Індекс папки або root сервісу | Index |
| Послідовність кроків | Flow |
Спільне для всіх типів (шапка, теги, іменування, лінки, глибина) — у Спільній базі нижче.
Принципи
-
Один файл — одна одиниця. Не треба плодити кучу нод, які будуть переплітатись лінками. Кожна нода повинна бути відображена в змісті (index).
-
Людська мова. Описуємо що відбувається — без назв полів, ключів, параметрів і умов з коду. Документ читає людина, яка хоче зрозуміти систему, а не той хто дебажить змінні.
Неправильно:
Якщо status === 'pending' і isBlocked === false — запит проходить.Правильно:Якщо заявка ще не оброблена і акаунт не заблокований — запит проходить.Перевірка: прочитай опис вголос — якщо звучить як людська мова, добре. Якщо звучить як grep по коду — переписати.
Винятки — залишати як є:
- Числа, таймаути, ліміти:
30 сек,3 спроби. Мілісекунди — переводь у секунди (500 мс→0.5 сек). - Назви ролей і сутностей:
Lady,Operator,Course. - Назви полів у секції
## Поляentity-сторінок, ключі settings/env, назви колекцій і RMQ-черг — те, що читач шукатиме дослівно.
- Числа, таймаути, ліміти:
-
Рішення, не реалізація. Якщо рішення неочевидне — фіксуємо чому так зробили, не як зроблено.
-
В документації так само дуже важлива архітектура. Треба уникати дублювання інформації, подальше підтримування дублів буде неможливе (це не код який зламається).
-
Є сенс проганяти АІ агента, щоб він порівняв результат документації і реальний код з якого вона писалась. З великим шансом він помітить відмінність описаної умови чи значення (інтервалу) з реальним.
Спільна база
Шапка сторінки (обов’язковий початок)
#Тег1 #Тег2
[[назва-файлу]]
# Людська назва
`шлях у коді або "(UI-елемент)"` — одна фраза: що це і навіщо.- Теги — тип сторінки + стан. Один рядок, без ком.
- Backlink
[[назва-файлу]]— для зворотного пошуку в Obsidian. - H1 — як звемо в розмові (UI) або назва класу/сервісу (бек).
- Контекстна стрічка — для бек: шлях
`src/...`; для UI:(UI-елемент); ролі/ентіті-огляди пропускають шлях. Одна фраза опису обов’язкова — це «що це» для читача, який потрапив сюди з пошуку.
Скелет незаповненої сторінки
Коли сторінка створюється наперед (знань ще нема) — мінімальний чесний скелет, не полотно здогадок:
#Service #TODO
[[назва-файлу]]
# НазваСервісу
`src/шлях/` — одна фраза що це (з коду або від юзера).
**UI:** [[ui/сторінка]] або «немає».
## Заповнити
- відкриті питання списком- Верифіковані факти — одразу в
## Нюанси; невідоме — питаннями в## Заповнити. Не змішувати. - Здогадки не пишемо навіть з «мабуть» — тільки питання.
Теги типу
| Тип | Тег | Вміст |
|---|---|---|
| UI-елемент | #UI | екран, секція, колонка, діалог |
| Сервіс | #Service | бек-логіка: контролер + сервіс |
| Воркер | #Service #worker | фонова задача по таймеру/черзі |
| Інтеграція | #Service #integration | RMQ, ClickHouse, зовнішні API |
| Фіча | #Feature (root) · #Service #feature (сервісна) | бізнес-концепт цілком |
| Сутність | #Entity | колекція, таблиця, структура даних |
| Процес | #Flow | послідовність кроків |
| Система | #System | інфраструктура без бізнес-логіки |
| Архітектура | #Architecture | крос-сервісна картина, тільки root |
| Мета | #Meta | конвенції, індекси, глосарії |
Стан-теги
Документ за замовчуванням — чорновик (часто AI-генерація). Стан-теги — в тому ж рядку, що тег типу.
| Тег | Сенс |
|---|---|
#reviewed | людина перевірила відповідність реальності. Суттєво змінив документ — зніми |
#draft | документація яка пишеться до реалізації, а не по фактичній |
#TODO | незавершений або має відкриті питання (## Заповнити не порожній) |
#fix | описана логіка — костиль/борг; документуємо як є, при рефакторингу переписати і код, і док |
Сервісні теги (автоматичні)
Кожен файл під services/<service>/ на сайті отримує тег сервісу (#golden, #electron, …) — це робить inject-doc-meta при білді, руками не писати. Виняток: root-документ, який переважно про один сервіс — тоді сервісний тег додаємо руками.
Іменування
| Рівень | Стиль | Як виходить |
|---|---|---|
| Top-level stack-docs (Architecture, Features…) | Title Case | title: у frontmatter index.md |
| Сервіс (Stack Golden, Stack AI…) | Stack X | auto-inject у CI |
| Папки всередині сервісу | lowercase, kebab-case | слаг папки; title: не ставити |
| Файли (всі без винятку) | kebab-case lowercase | назва файлу |
- Файли завжди kebab-case lowercase (
course-service.md,login.md) — навіть для бек-класів; зв’язок з класом (CourseService) — через H1 і контекстну стрічку. Зміст всередині — українською. Home.mdне використовуємо — вхід черезCanvas.canvasіindex.md.
Папки сервісу (<service>/docs/): кожен сервіс бере тільки потрібне.
docs/
├── Canvas.canvas # локальна мапа сервісу
├── index.md # root-індекс (картка Index)
├── glossary.md # сервіс-специфічні терміни (опційно)
├── ui/ # фронт-екрани (фронт-сервіси)
├── ui-triggered/ # бек-логіки через фронтенд
├── services/ # generic бек-сервіси
├── workers/ # фонові задачі
├── integrations/ # зовнішні контракти
├── features/ # бізнес-фічі сервісу
├── entities/ # колекції / структури
└── flows/ # процеси
Без вкладеності. Потрібна підгрупа — нова top-level папка (senders/, intervals/), не services/workers/. Папок верхнього рівня може бути багато, вкладеності — ні.
Лінки
- Всередині сервісу:
[[назва-файлу]]. - На root: повний шлях —
[[glossary#ролі|роллю operator]],[[entities/Lady]],[[features/statistics]]. - На інший сервіс: через
services/—[[services/golden/workers/index|воркери golden]]. У режимі «один сервіс» такі лінки в Obsidian сірі — на сайті працюють, це не баг. - Swagger deeplink: звичайний URL на конкретний endpoint у Swagger UI.
- Не дублюй reverse-лінк на index/menu. Backlinks-панель сама покаже вхідні. Wikilinks у
Зв'язки— тільки семантичні (читає, тригерить, залежить).
Межа глибини
Описуємо: числа (таймаути, ліміти, пороги) · умови, фільтри, порядок кроків · залежності (хто кого тригерить) · неочевидні нюанси і чому. Не описуємо: синтаксис викликів · транспорт без впливу на поведінку · очевидні з коду поля й типи · запит/відповідь ендпоінтів (це Swagger).
Правило великого пальця: без цього факту читач прийме помилкове рішення → описуємо. Це лише «як зроблено» → пропускаємо. Сумнів → коротко в «Нюанси».
Картки типів
Картка — все потрібне для сторінки свого типу. Спільне (шапка, теги, лінки, глибина) — вище, у картках не повторюється.
Картка UI
- Коли: новий екран, вкладка, колонка, діалог у фронт-сервісі.
- Де:
ui/фронт-сервісу (у client —ui-family/,ui-shared/). - Шапка:
#UI; H1 — як звемо в команді («колонка фаворитів»), не ім’я компонента. - Обов’язкові секції:
## Use cases— хто (роль) і за яким сценарієм заходить. Абзац; якщо ролей з різними сценаріями кілька — bullets за ролями. Бізнес-контекст, не механіка кліків.- Таблиця кліків-фіч — карта екрану: рядок = дія/під-екран; колонки на роль, якщо доступ відрізняється. Деталі фіч — окремими секціями нижче.
- Ендпоінти — deeplinks на Swagger + 2-3 слова «що робить». Single-backend (
ui-shared/*): таблицяEndpoint | Що робитьпід кожною фічею. Per-Family (ui-family/*): одна таблиця, рядок = під-фіча, колонкиgolden / prime / udate / chathouse; немігроване —*TODO*. ## Зв'язки— звідки дані, що тригерить.
- Опційні: розбіжності полів по Family (таблиця «поле × Family» з ✓/—) · Числа / Обмеження · Нюанси.
- Не писати: верстку, стилі, компоненти, пропси · форму запиту/відповіді · бек-архітектуру (мігрований/legacy/routing-controllers — читачу фронт-доки байдуже).
- Приклад: Courses (single-backend) · Favorites (per-Family).
Картка Service
- Коли: бек-логіка, яку викликає фронт / Electron / розширення / інший HTTP-клієнт.
- Де:
ui-triggered/(тригер — UI). - Шапка:
#Service; контекстна стрічка — шлях у коді, обов’язково. - Обов’язкові:
- Рядки
**UI:**(лінк на ui-сторінку або «немає») і**Swagger:**(deeplink на тег). ## Логіка— порядок кроків, умови, фільтри (коли сторінка заповнена; у скелеті замість неї## Заповнити).
- Рядки
- Опційні:
## Числа·## Нюанси(найцінніше: stop-листи, watchdog, захисти від подвійного запуску, рандомізації) ·## Зв'язки·## Чому так. - Не писати: перелік ендпоінтів і контракти (Swagger) · ролі-гварди дослівно (Swagger показує; описуй тільки бізнес-причину обмеження, якщо неочевидна).
- Приклад: заповнена — Dashboard.
Картка Worker
- Коли: фонова задача — cron, Bull-черга, інтервал, разовий job.
- Де:
workers/. - Шапка:
#Service #worker; шлях у коді. - Обов’язкові:
## Інтервал(розклад, число) ·## Логіка(кроки) ·## Зв'язки(що читає/пише, кого тригерить). - Опційні:
## Нюанси— захист від подвійного запуску, isBusy, watchdog, чому такий таймаут ·## Чому так. - Не писати: механіку Bull/планувальника — платформа, описана в stack-docs.
- Приклад: воркери golden — 12 заповнених.
Картка Integration
- Коли: сервіс говорить із зовнішнім світом — RMQ-події, OLAP-таблиці, партнерський HTTP API.
- Де:
integrations/. - Шапка:
#Service #integration; шлях у коді, якщо є один вузол. - Обов’язкові: контракт сервісу — що публікує/слухає (події, routing-keys), що пише/читає (таблиці), що викликає (ендпоінти партнера) — і навіщо.
- Опційні: Числа (TTL сесій, ліміти) · Нюанси (retry, обробка помилок) · Зв’язки.
- Не писати: як влаштовані RMQ / ClickHouse самі по собі — платформа, у stack-docs.
- Приклад: Official API.
Картка Feature
- Коли: продуктовий концепт, що живе наскрізь: UI + бек + дані (Statistics, Favorites, Sender).
- Де і як: глобальний опис — раз у
stack-docs/features/(#Feature); сервісний —<service>/docs/features/(#Service #feature) з лінком на глобальний. - Обов’язкові (глобальна): суть фічі одним абзацом · де по Family · ролі, що користуються.
- Обов’язкові (сервісна): лінк на глобальну
[[features/<name>]]· що специфічно саме для цього бека. - Не писати: дублювання глобального опису в сервісній сторінці — тільки дельта.
- Не плутати з Entity: ентіті — структури даних, фічі — продуктові концепти.
- Приклад: Statistics (root) · Statistics (golden).
Картка Entity
- Коли: колекція/таблиця БД або крос-сервісна структура даних.
- Де: локальні —
<service>/docs/entities/; глобальні (RMQ-обмін, спільні таблиці, 2+ сервіси) —stack-docs/entities/. - Шапка:
#Entity; контекстна стрічка —`шлях до схеми` · колекція `ім'я`(для SQL — таблиця). - Обов’язкові:
## Поля— bullet-list полів з бізнес-значенням:**name** — опис. Типи вказуй тільки неочевидні (enum, кастомний DTO, ObjectId-ref); тривіальніrequired/defaultне описуй. - Опційні:
## Нюанси— індекси, каскадні видалення, кешовані поля, transform-плагіни. Загальний toJSON-плагін сервісу сюди не пиши (він у CLAUDE.md) · лінки на сервіси-продюсери/споживачі. - Не писати: Swagger request/response DTO — Entity-сторінка про storage shape, не API contract.
- Реєстр колекцій: сервіс з ≥3 сутностями веде
entities/index.md(#Meta) — список усіх колекцій, включно з тими, що без своєї сторінки: групи жирним підписом, рядок`колекція` — опис → [[Name]]або→ —. Кілька сховищ — H2 на сховище. Без полів — це індекс. - Приклад реєстру: entities golden. (не готово)
Картка Index
- Коли: кожна папка з файлами + root сервісу. Без index Quartz показує голий автолістинг.
- Шапка: frontmatter
tags: [Meta].title:— тільки в root сервісу (Stack X; для акронімів типуStack AI— вручну); у папкових НЕ ставити, інакше сайдбар зламає lowercase-канон. - Папковий index: призначення папки 1-2 фрази. ≤4-5 сторінок — bullets з описами; більше — таблиця з мітками покриття, групована по H2, зверху підсумок
X ✅ · Y 🟡 · Z ⬜ (з N). - Root-index сервісу: опис сервісу 1-3 речення людською мовою · таблиця
## Розділи(Розділ | Що там | ✅ | 🟡 | ⬜ | Разом+ рядок Разом) · рядок «Окремі сторінки» (glossary, tech-debt…) · для беків## Swagger— лінк на live Swagger UI + API Map. - Мітки покриття: ✅ заповнено · 🟡 частково · ⬜ скелет. Це повнота опису, не стан-теги: сторінка може бути ✅ і нести
#TODO, коли борг у коді. Цифри підтримуємо вручну: підняв ⬜→✅ — поправ підіндекс і root-таблицю. - Не писати в root-index: лінки на CONVENTIONS/AUTHORING (авторська мета — у CLAUDE.md) · платформенний стек · правила глибини · «як ми пишемо доки». Розділ з іншою одиницею виміру (entities: колекції, не сторінки) — прочерки в цифрах, пояснення в описі.
- Приклад: Stack Golden (root) · ui-triggered (папковий).
Картка Flow
- Коли: послідовність кроків — логін, логаут, ініціалізація.
- Де:
flows/сервісу; крос-сервісні (2+ сервіси, RMQ) —stack-docs/architecture/flows/. - Шапка:
#Flow. - Формат: пронумерований список кроків. ≤3 кроки — один файл; ≥4 — оглядова сторінка зі списком + окремий файл на крок. Кожен крок:
Що робить·Нюанси(якщо є) ·Зв'язки.
Canvas
Canvas.canvas — візуальна мапа документації.
- Глобальний
architecture/Canvas.canvas— мапа сервісів: ноди = сервіси, стрілки = HTTP/RMQ. Оновлюємо тільки при новому сервісі чи зміні топології. - Локальний
<service>/docs/Canvas.canvas— ноди = файлиdocs/цього сервісу.
Кольори по типах
| Тип | Колір | Hex |
|---|---|---|
| UI | блакитний | #2196f3 |
| Service | зелений | #66bb6a |
| Entity | фіолетовий | #ab47bc |
| Flow | помаранчевий | #ffa726 |
| System | сіро-зелений | #78909c |
| Meta | червоний | #e03131 |
Стрілки (підпис обов’язковий)
тригерить · оновлює · читає · стартує · викликає (крос-сервіс HTTP) · публікує / слухає (RMQ).
Групи
Обводимо ≥3 ноди одного типу в групу з кольоровим підписом («Інтервали оператора», «Сервіси TU»).