Blame
|
1 | # Руководство по написанию технической документации SKIF.PRO |
||||||
| 2 | ||||||||
| 3 | > **Для кого этот документ:** авторы статей (техподдержка, продакт-менеджеры, разработчики, аналитики) и AI-агент первичной проверки. |
|||||||
| 4 | > |
|||||||
| 5 | > **Почему это важно:** статья работает правильно только если автор точно знает, кто её будет читать и зачем. От этого зависят структура, язык и глубина проработки. |
|||||||
| 6 | > |
|||||||
| 7 | > **Связанные документы:** |
|||||||
| 8 | > - `wiki-structure-guidelines.md` — правила размещения статьи в структуре Wiki |
|||||||
| 9 | > - `ai-checklist.md` — единый чек-лист для AI-агента проверки |
|||||||
| 10 | ||||||||
| 11 | --- |
|||||||
| 12 | ||||||||
| 13 | ## Часть 1. Принцип «От кого → Кому»: фундамент качества статьи |
|||||||
| 14 | ||||||||
| 15 | Каждая статья в вики — это **канал коммуникации между двумя конкретными сторонами**. Перед началом работы автор обязан ответить на два вопроса: |
|||||||
| 16 | ||||||||
| 17 | 1. **Кто источник информации?** (кто владеет знанием) |
|||||||
| 18 | 2. **Кто получатель?** (кто будет читать и зачем) |
|||||||
| 19 | ||||||||
| 20 | Качество статьи измеряется тем, насколько точно она закрывает потребность получателя — не больше и не меньше. |
|||||||
| 21 | ||||||||
| 22 | --- |
|||||||
| 23 | ||||||||
| 24 | ### 1.1. Матрица стейкхолдеров |
|||||||
| 25 | ||||||||
| 26 | #### Получатели (читатели) |
|||||||
| 27 | ||||||||
| 28 | | ID | Роль | Кто это | Контекст чтения | |
|||||||
| 29 | |----|------|---------|-----------------| |
|||||||
| 30 | | `R1` | **Конечный клиент** | Пользователь продукта SKIF.PRO: диспетчер, логист, руководитель автопарка | Решает конкретную задачу прямо сейчас. Не знает технических деталей. Ожидает пошаговые инструкции. | |
|||||||
| 31 | | `R2` | **Интегратор** | Технический специалист компании-партнёра, который внедряет или настраивает SKIF.PRO у клиента | Ищет точные технические параметры: форматы, схемы, ограничения. Умеет читать технические тексты. | |
|||||||
| 32 | ||||||||
| 33 | #### Источники (авторы и владельцы информации) |
|||||||
| 34 | ||||||||
| 35 | | ID | Роль | Кто это | Что может рассказать | |
|||||||
| 36 | |----|------|---------|----------------------| |
|||||||
| 37 | | `S1` | **Техподдержка** | Специалисты первой и второй линии поддержки | Типовые проблемы пользователей, сценарии ошибок, FAQ по реальным обращениям | |
|||||||
| 38 | | `S2` | **Продакт-менеджер** | Владелец продукта или менеджер по продукту | Описание новых фич, бизнес-логика, критерии использования функций | |
|||||||
| 39 | | `S3` | **Разработчик** | Backend/Frontend/DevOps инженер | Технические детали реализации, форматы данных, ограничения системы | |
|||||||
| 40 | | `S4` | **Системный/бизнес-аналитик** | Аналитик, участвовавший в проектировании | Логика работы функциональности, граничные случаи, бизнес-правила | |
|||||||
| 41 | | `S5` | **Технический писатель** | Специалист по документации | Структура, стиль, архитектура информации — не источник фактов, но имплементатор канала | |
|||||||
| 42 | ||||||||
| 43 | --- |
|||||||
| 44 | ||||||||
| 45 | ### 1.2. Определение пары «Источник → Получатель» |
|||||||
| 46 | ||||||||
| 47 | **Алгоритм выбора для автора:** |
|||||||
| 48 | ||||||||
| 49 | ``` |
|||||||
| 50 | 1. Кто инициировал создание статьи? |
|||||||
| 51 | → Это подсказка по источнику (S1–S4) |
|||||||
| 52 | ||||||||
| 53 | 2. Кто будет читать эту статью? |
|||||||
| 54 | → Конечный клиент (R1) или интегратор (R2)? |
|||||||
| 55 | ||||||||
| 56 | 3. Какую задачу решает читатель? |
|||||||
| 57 | → Одна задача = одна статья |
|||||||
| 58 | ``` |
|||||||
| 59 | ||||||||
| 60 | **Типовые пары и их смысл:** |
|||||||
| 61 | ||||||||
| 62 | | Пара | Когда используется | Пример статьи | |
|||||||
| 63 | |------|--------------------|---------------| |
|||||||
| 64 | | `S1 → R1` | Техподдержка передаёт решение частой проблемы клиенту | «Почему трекер не отображается на карте» | |
|||||||
| 65 | | `S2 → R1` | Продакт рассказывает клиенту о новой функции | «Как использовать автоматические отчёты» | |
|||||||
| 66 | | `S2 → R2` | Продакт объясняет интегратору логику новой фичи | «Модель данных объектов: структура и ограничения» | |
|||||||
| 67 | | `S3 → R2` | Разработчик документирует технические детали интеграции | «Протокол обмена данными с трекерами» | |
|||||||
| 68 | | `S4 → R2` | Аналитик описывает бизнес-правила для интеграции | «Правила расчёта пробега: алгоритм и исключения» | |
|||||||
| 69 | | `S1 → R2` | Поддержка описывает типовые ошибки при внедрении | «Частые ошибки при настройке CAN-шины» | |
|||||||
| 70 | ||||||||
| 71 | > ⚠️ **Запрещённые ситуации:** |
|||||||
| 72 | > - Статья адресована «всем» — это означает, что она не адресована никому |
|||||||
| 73 | > - Один документ одновременно объясняет концепцию клиенту и содержит технический справочник для интегратора |
|||||||
| 74 | > - Автор пишет то, что знает сам, не думая о получателе |
|||||||
| 75 | ||||||||
| 76 | --- |
|||||||
| 77 | ||||||||
| 78 | ## Часть 2. Типы статей и их структуры |
|||||||
| 79 | ||||||||
| 80 | Тип статьи определяется **парой «Источник → Получатель»** и **задачей читателя**. |
|||||||
| 81 | ||||||||
| 82 | В Wiki SKIF.PRO используются **четыре типа статей**: |
|||||||
| 83 | ||||||||
| 84 | | Тип | Название | Отвечает на вопрос | Аудитория | |
|||||||
| 85 | |-----|----------|-------------------|-----------| |
|||||||
| 86 | | **A** | Инструкция | «Как сделать X?» | R1 | |
|||||||
| 87 | | **B** | Концепция | «Что это и зачем?» | R1 или R2 | |
|||||||
| 88 | | **C** | Справочник интерфейса | «Что означают эти поля/настройки?» | R1 | |
|||||||
| 89 | | **D** | Troubleshooting | «Почему не работает и что делать?» | R1 или R2 | |
|||||||
| 90 | ||||||||
| 91 | > **Вне scope этого документа:** |
|||||||
| 92 | > - API-документация ведётся в Postman (отдельный workflow) |
|||||||
| 93 | > - Release Notes публикуются на сайте (отдельный workflow) |
|||||||
| 94 | ||||||||
| 95 | --- |
|||||||
| 96 | ||||||||
| 97 | ### Тип A: Инструкция для конечного клиента |
|||||||
| 98 | *Пары: `S1→R1`, `S2→R1`* |
|||||||
| 99 | ||||||||
| 100 | **Когда создаётся:** клиент должен самостоятельно выполнить задачу в интерфейсе системы. |
|||||||
| 101 | ||||||||
| 102 | **Признаки правильной статьи типа A:** |
|||||||
| 103 | - Написана от второго лица («нажмите», «выберите», «перейдите») |
|||||||
| 104 | - Не содержит технических терминов без объяснения |
|||||||
| 105 | - Каждый шаг — одно действие |
|||||||
| 106 | - Есть скриншоты для неочевидных шагов |
|||||||
| 107 | - Скриншоты сопровождаются текстовым описанием (AI-агент не видит изображения) |
|||||||
| 108 | ||||||||
| 109 | **Обязательная структура:** |
|||||||
| 110 | ||||||||
| 111 | | Секция | Обязательность | Назначение | |
|||||||
| 112 | |--------|:---:|---| |
|||||||
| 113 | | `# [Глагол + задача]` | ✅ обязательно | Заголовок = поисковый запрос | |
|||||||
| 114 | | `## Когда это нужно` | ✅ обязательно | Жизненный сценарий, 1–3 предложения | |
|||||||
| 115 | | `## Что потребуется` | ⚙️ условно | Только если есть предусловия (права, данные). Если нет — пропускается | |
|||||||
| 116 | | `## Пошаговая инструкция` | ✅ обязательно | Нумерованные шаги, одно действие на шаг | |
|||||||
| 117 | | `## Частые вопросы и ошибки` | ✅ обязательно | Симптом → причина → решение | |
|||||||
| 118 | | `## Что дальше` | 💡 рекомендуемо | 2–3 ссылки на следующие действия | |
|||||||
| 119 | ||||||||
| 120 | **Пример:** |
|||||||
| 121 | ||||||||
| 122 | ```markdown |
|||||||
| 123 | # Как добавить транспортное средство |
|||||||
| 124 | ||||||||
| 125 | ## Когда это нужно |
|||||||
| 126 | Вы приобрели новый трекер и хотите начать отслеживать транспортное средство в системе SKIF.PRO. |
|||||||
| 127 | ||||||||
| 128 | ## Что потребуется |
|||||||
| 129 | - Роль «Редактор» или выше |
|||||||
| 130 | - IMEI-номер трекера (указан на корпусе устройства или в документации к нему) |
|||||||
| 131 | ||||||||
| 132 | ## Пошаговая инструкция |
|||||||
| 133 | ||||||||
| 134 | 1. Перейдите в раздел **Объекты**. |
|||||||
| 135 | 2. Нажмите кнопку **Создать объект** в правом верхнем углу. |
|||||||
| 136 | 3. В поле **Название** введите имя транспортного средства. |
|||||||
| 137 | Используйте описательное название, например, «МАЗ-5440 А123ВС» вместо «М1». |
|||||||
| 138 | 4. В поле **IMEI** введите номер трекера. |
|||||||
| 139 | 5. Нажмите **Сохранить**. |
|||||||
| 140 | ||||||||
| 141 | ## Частые вопросы и ошибки |
|||||||
| 142 | ||||||||
| 143 | **Не вижу кнопку «Создать объект».** |
|||||||
| 144 | Кнопка доступна только пользователям с ролью «Редактор» и выше. Обратитесь к администратору аккаунта. |
|||||||
| 145 | ||||||||
| 146 | **После сохранения объект не появляется на карте.** |
|||||||
| 147 | Объект появится на карте после того, как трекер передаст первые координаты. Убедитесь, что трекер включен и настроен на сервер SKIF.PRO. |
|||||||
| 148 | ||||||||
| 149 | ## Что дальше |
|||||||
| 150 | - Настройте датчики объекта — см. статью «Карточка объекта — вкладка Датчики» |
|||||||
| 151 | - Добавьте объект в группу — см. статью «Как добавить объект в группу» |
|||||||
| 152 | ``` |
|||||||
| 153 | ||||||||
| 154 | --- |
|||||||
| 155 | ||||||||
| 156 | ### Тип B: Концепция (описание функциональности) |
|||||||
| 157 | *Пары: `S2→R1`, `S2→R2`, `S4→R2`* |
|||||||
| 158 | ||||||||
| 159 | **Когда создаётся:** нужно объяснить, *что* делает функция и *зачем*, прежде чем показывать *как*. |
|||||||
| 160 | ||||||||
| 161 | **Признаки правильной статьи типа B:** |
|||||||
| 162 | - Отвечает на вопрос «зачем это нужно» и «как это устроено», а не «как нажать» |
|||||||
| 163 | - Описывает бизнес-логику и сценарии применения |
|||||||
| 164 | - Может содержать схемы и диаграммы |
|||||||
| 165 | - Не дублирует пошаговые инструкции — даёт ссылки на них |
|||||||
| 166 | - Для R1 — аналогии и примеры из жизни, для R2 — логика системы и модели данных |
|||||||
| 167 | ||||||||
| 168 | **Обязательная структура:** |
|||||||
| 169 | ||||||||
| 170 | | Секция | Обязательность | Назначение | |
|||||||
| 171 | |--------|:---:|---| |
|||||||
| 172 | | `# [Название функциональности]` | ✅ обязательно | Для R1: «Что такое X в SKIF.PRO». Для R2: «X: модель данных и логика» | |
|||||||
| 173 | | `## Для чего это нужно` | ✅ обязательно | Бизнес-задача языком получателя | |
|||||||
| 174 | | `## Как это работает` | ✅ обязательно | Принцип работы. Для R1 — простым языком. Для R2 — техническая логика | |
|||||||
| 175 | | `## Сценарии применения` | ✅ обязательно | 2–4 сценария использования | |
|||||||
| 176 | | `## Ограничения и важные условия` | ✅ обязательно | Граничные случаи, зависимости от тарифа/настроек | |
|||||||
| 177 | | `## Связанные инструкции` | 💡 рекомендуемо | Ссылки на статьи типа A | |
|||||||
| 178 | ||||||||
| 179 | --- |
|||||||
| 180 | ||||||||
| 181 | ### Тип C: Справочник интерфейса |
|||||||
| 182 | *Пары: `S2→R1`, `S3→R1`* |
|||||||
| 183 | ||||||||
| 184 | **Когда создаётся:** нужно описать конкретный экран, вкладку или форму — перечислить все поля с их назначением и допустимыми значениями. |
|||||||
| 185 | ||||||||
| 186 | **Признаки правильной статьи типа C:** |
|||||||
| 187 | - Привязана к одному конкретному экрану или вкладке (одна вкладка = одна статья) |
|||||||
| 188 | - Перечисляет поля, их назначение, допустимые значения, значения по умолчанию |
|||||||
| 189 | - Не учит «как», описывает «что» — пошаговые действия выносятся в тип A |
|||||||
| 190 | - Содержит скриншот экрана с текстовым описанием |
|||||||
| 191 | ||||||||
| 192 | **Обязательная структура:** |
|||||||
| 193 | ||||||||
| 194 | | Секция | Обязательность | Назначение | |
|||||||
| 195 | |--------|:---:|---| |
|||||||
| 196 | | `# [Название экрана — вкладка/форма]` | ✅ обязательно | Точное название как в интерфейсе | |
|||||||
| 197 | | `## Назначение` | ✅ обязательно | 1–2 предложения: для чего используется экран | |
|||||||
| 198 | | `## Как открыть` | ✅ обязательно | Краткий путь навигации (без полной инструкции) | |
|||||||
| 199 | | `## Описание полей` | ✅ обязательно | Таблица: поле, описание, допустимые значения, по умолчанию | |
|||||||
| 200 | | `## Связанные инструкции` | 💡 рекомендуемо | Ссылки на статьи типа A, которые используют этот экран | |
|||||||
| 201 | ||||||||
| 202 | **Пример:** |
|||||||
| 203 | ||||||||
| 204 | ```markdown |
|||||||
| 205 | # Карточка объекта — вкладка «Основные» |
|||||||
| 206 | ||||||||
| 207 | ## Назначение |
|||||||
| 208 | Вкладка содержит базовые параметры объекта мониторинга: название, тип, привязку к трекеру. |
|||||||
| 209 | ||||||||
| 210 | ## Как открыть |
|||||||
| 211 | **Объекты** → выберите объект → вкладка **Основные**. |
|||||||
| 212 | ||||||||
| 213 | ## Описание полей |
|||||||
| 214 | ||||||||
| 215 | | Поле | Описание | Допустимые значения | По умолчанию | |
|||||||
| 216 | |------|----------|---------------------|--------------| |
|||||||
| 217 | | **Название** | Отображаемое имя объекта на карте и в отчётах | Текст, до 100 символов | — | |
|||||||
| 218 | | **IMEI** | Идентификатор трекера | 15 цифр | — | |
|||||||
| 219 | | **Тип объекта** | Категория транспорта | Легковой, Грузовой, Спецтехника, Человек | Легковой | |
|||||||
| 220 | | **Иконка** | Значок объекта на карте | Выбор из библиотеки | Автомобиль | |
|||||||
| 221 | ||||||||
| 222 | ## Связанные инструкции |
|||||||
| 223 | - Как создать объект — см. статью «Как добавить транспортное средство» |
|||||||
| 224 | - Как изменить тип объекта — см. статью «Как редактировать объект» |
|||||||
| 225 | ``` |
|||||||
| 226 | ||||||||
| 227 | --- |
|||||||
| 228 | ||||||||
| 229 | ### Тип D: Устранение неполадок (Troubleshooting) |
|||||||
| 230 | *Пары: `S1→R1`, `S1→R2`, `S3→R2`* |
|||||||
| 231 | ||||||||
| 232 | **Когда создаётся:** техподдержка или разработчики фиксируют повторяющиеся проблемы с решениями. |
|||||||
| 233 | ||||||||
| 234 | **Признаки правильной статьи типа D:** |
|||||||
| 235 | - Заголовок — описание симптома словами получателя, а не технической причиной |
|||||||
| 236 | - Решения идут от простого к сложному |
|||||||
| 237 | - Есть явный раздел «когда обращаться в поддержку» |
|||||||
| 238 | - Для R2: допустимы технические детали (коды ошибок, логи, curl-примеры) |
|||||||
| 239 | ||||||||
| 240 | **Обязательная структура:** |
|||||||
| 241 | ||||||||
| 242 | | Секция | Обязательность | Назначение | |
|||||||
| 243 | |--------|:---:|---| |
|||||||
| 244 | | `# [Симптом словами получателя]` | ✅ обязательно | Для R1: «Трекер не выходит на связь». Для R2: «Запрос возвращает ошибку 502» | |
|||||||
| 245 | | `## Симптом` | ✅ обязательно | Точное описание: что видит получатель | |
|||||||
| 246 | | `## Возможные причины и решения` | ✅ обязательно | H3 для каждой причины: диагностика + решение | |
|||||||
| 247 | | `## Если ничего не помогло` | ✅ обязательно | Что сообщить в поддержку, какие данные подготовить | |
|||||||
| 248 | ||||||||
| 249 | **Пример для R1:** |
|||||||
| 250 | ||||||||
| 251 | ```markdown |
|||||||
| 252 | # Трекер не выходит на связь |
|||||||
| 253 | ||||||||
| 254 | ## Симптом |
|||||||
| 255 | Объект на карте отображается серым. В карточке объекта в поле **Последняя связь** указано время более 30 минут назад. |
|||||||
| 256 | ||||||||
| 257 | ## Возможные причины и решения |
|||||||
| 258 | ||||||||
| 259 | ### Причина 1: Трекер выключен или разряжен |
|||||||
| 260 | Проверьте, горит ли индикатор питания на трекере. |
|||||||
| 261 | **Решение:** Подключите трекер к питанию и дождитесь загрузки (1–3 минуты). |
|||||||
| 262 | ||||||||
| 263 | ### Причина 2: Нет покрытия GSM-сети |
|||||||
| 264 | Трекер находится в зоне без мобильной связи (подземная парковка, удалённая территория). |
|||||||
| 265 | **Решение:** Переместите транспорт в зону покрытия. Данные передадутся автоматически. |
|||||||
| 266 | ||||||||
| 267 | ## Если ничего не помогло |
|||||||
| 268 | Обратитесь в техподдержку и сообщите: |
|||||||
| 269 | - IMEI трекера |
|||||||
| 270 | - Время последней связи из карточки объекта |
|||||||
| 271 | - Какие шаги уже выполнены |
|||||||
| 272 | ``` |
|||||||
| 273 | ||||||||
| 274 | **Пример для R2:** |
|||||||
| 275 | ||||||||
| 276 | ```markdown |
|||||||
| 277 | # Webhook не доставляет события |
|||||||
| 278 | ||||||||
| 279 | ## Симптом |
|||||||
| 280 | Настроенный webhook-эндпоинт не получает POST-запросы от SKIF.PRO при наступлении события. |
|||||||
| 281 | ||||||||
| 282 | ## Возможные причины и решения |
|||||||
| 283 | ||||||||
| 284 | ### Причина 1: Эндпоинт недоступен извне |
|||||||
| 285 | SKIF.PRO не может установить TCP-соединение с указанным URL. |
|||||||
| 286 | **Решение:** Убедитесь, что URL доступен из интернета. Проверьте командой: |
|||||||
| 287 | `curl -X POST https://your-endpoint.com/webhook -d '{"test": true}'` |
|||||||
| 288 | ||||||||
| 289 | ### Причина 2: Эндпоинт отвечает не 200 |
|||||||
| 290 | SKIF.PRO считает доставку успешной только при HTTP 200. |
|||||||
| 291 | **Решение:** Убедитесь, что ваш сервер возвращает именно статус 200 (не 201, не 204). |
|||||||
| 292 | ||||||||
| 293 | ## Если ничего не помогло |
|||||||
| 294 | Обратитесь в техподдержку и сообщите: |
|||||||
| 295 | - URL webhook-эндпоинта |
|||||||
| 296 | - Тип события, на которое подписаны |
|||||||
| 297 | - Логи вашего сервера за последний час |
|||||||
| 298 | ``` |
|||||||
| 299 | ||||||||
| 300 | --- |
|||||||
| 301 | ||||||||
| 302 | ## Часть 3. Требования к тексту |
|||||||
| 303 | ||||||||
| 304 | ### 3.1. Заголовки |
|||||||
| 305 | ||||||||
| 306 | | Правило | Правильно | Неправильно | |
|||||||
| 307 | |---------|-----------|-------------| |
|||||||
| 308 | | Для инструкций (A) — начинать с глагола | «Как создать геозону» | «Геозоны. Создание» | |
|||||||
| 309 | | Для концепций (B) — R1: «Что такое…»; R2: объект + контекст | «Что такое геозоны в SKIF.PRO» / «Геозоны: модель данных и ограничения» | «Введение в геозоны» | |
|||||||
| 310 | | Для справочников (C) — название экрана | «Карточка объекта — вкладка Основные» | «Основные настройки объекта» | |
|||||||
| 311 | | Для troubleshooting (D) — симптом словами получателя | «Почему трекер офлайн» | «Статус трекера» | |
|||||||
| 312 | | Не использовать аббревиатуры без расшифровки | «Настройка CAN-шины (бортовой сети)» | «Настройка CAN» | |
|||||||
| 313 | ||||||||
| 314 | ### 3.2. Язык для R1 (конечный клиент) |
|||||||
| 315 | ||||||||
| 316 | - Одна мысль — одно предложение. Ориентир: не более 25 слов на предложение. |
|||||||
| 317 | - Нет жаргона: вместо «задеплоить» → «применить изменения» |
|||||||
| 318 | - Нет пассивного залога: вместо «значение должно быть введено» → «введите значение» |
|||||||
| 319 | - Названия кнопок и разделов — **жирным**, точь-в-точь как в интерфейсе |
|||||||
| 320 | - Каждый шаг — одно действие |
|||||||
| 321 | ||||||||
| 322 | ### 3.3. Язык для R2 (интегратор) |
|||||||
| 323 | ||||||||
| 324 | - Технические термины допустимы и ожидаемы |
|||||||
| 325 | - Все типы данных указываются явно: `string`, `integer`, `boolean`, `ISO 8601` |
|||||||
| 326 | - Граничные случаи и исключения — обязательны |
|||||||
| 327 | - Конкретные значения вместо абстрактных описаний |
|||||||
| 328 | ||||||||
| 329 | ### 3.4. Атомарность |
|||||||
| 330 | ||||||||
| 331 | **Одна статья = один вопрос читателя.** |
|||||||
| 332 | ||||||||
| 333 | Статья нарушает принцип атомарности, если: |
|||||||
| 334 | - В ней несколько заголовков уровня H2, которые могут быть самостоятельными статьями |
|||||||
| 335 | - Она одновременно объясняет концепцию И содержит пошаговую инструкцию (разбить на тип B + тип A) |
|||||||
| 336 | - Она одновременно описывает «как сделать» И перечисляет все поля формы (разбить на тип A + тип C) |
|||||||
| 337 | - Она адресована и R1, и R2 одновременно |
|||||||
| 338 | ||||||||
| 339 | ### 3.5. Глубина заголовков |
|||||||
| 340 | ||||||||
| 341 | Максимальная глубина заголовков внутри статьи — **H3** (`###`). Если требуется более глубокая вложенность — это сигнал, что статья нарушает атомарность и должна быть разделена. |
|||||||
| 342 | ||||||||
| 343 | Исключение: тип D (Troubleshooting) использует H3 для отдельных причин внутри секции «Возможные причины и решения». Вложенность внутри причины не допускается. |
|||||||
| 344 | ||||||||
| 345 | ### 3.6. Самодостаточность секций (для AI-агента) |
|||||||
| 346 | ||||||||
| 347 | AI-агент техподдержки извлекает фрагменты статей, а не читает их целиком. Поэтому: |
|||||||
| 348 | ||||||||
| 349 | - Каждая секция (блок под H2) должна быть понятна без чтения остальных секций |
|||||||
| 350 | - Запрещены ссылки «как описано выше», «см. предыдущий раздел» |
|||||||
| 351 | - Называйте сущности явно: вместо «эта функция» → «функция геозон» |
|||||||
| 352 | - Короткие повторяющиеся факты (роль доступа, версия) дублируйте в каждой статье |
|||||||
| 353 | - Развёрнутые блоки (описание алгоритма, большая таблица) не дублируйте — давайте ссылку с кратким резюме в 1 предложение |
|||||||
| 354 | ||||||||
| 355 | ### 3.7. Скриншоты |
|||||||
| 356 | ||||||||
| 357 | - Каждый скриншот обязательно сопровождается текстовым описанием действия. AI-агент не видит изображения. |
|||||||
| 358 | - Скриншот размещается непосредственно после шага, который он иллюстрирует |
|||||||
| 359 | - Критичную информацию из таблиц на скриншотах дублируйте в текстовой таблице |
|||||||
| 360 | ||||||||
| 361 | ### 3.8. Перекрёстные ссылки |
|||||||
| 362 | ||||||||
| 363 | **Внутри одной аудитории (R1→R1 или R2→R2):** свободно, по полному названию статьи. |
|||||||
| 364 | ||||||||
| 365 | **Между аудиториями (R1↔R2):** допустимы, но обязательно маркируются: |
|||||||
| 366 | ||||||||
| 367 | ```markdown |
|||||||
| 368 | > 🔧 Техническая статья для интеграторов: [Протокол обмена данными с трекерами](ссылка) |
|||||||
| 369 | ``` |
|||||||
| 370 | ||||||||
| 371 | ```markdown |
|||||||
| 372 | > 📱 Статья для пользователей: [Как добавить транспортное средство](ссылка) |
|||||||
| 373 | ``` |
|||||||
| 374 | ||||||||
| 375 | **Формат ссылок:** |
|||||||
| 376 | - ✅ `см. статью «Как создать объект»` |
|||||||
| 377 | - ❌ `см. здесь` |
|||||||
| 378 | - ❌ `подробнее по ссылке` |
|||||||
| 379 | ||||||||
| 380 | --- |
|||||||
| 381 | ||||||||
| 382 | ## Часть 4. Чек-лист перед публикацией |
|||||||
| 383 | ||||||||
| 384 | Используется автором при самопроверке. Полный машиночитаемый чек-лист для AI-агента — в файле `ai-checklist.md`. |
|||||||
| 385 | ||||||||
| 386 | ### Блок 1: Стейкхолдеры (критично) |
|||||||
| 387 | ||||||||
| 388 | - [ ] Указана пара «Источник → Получатель» в метаданных |
|||||||
| 389 | - [ ] Получатель однозначно определён: `R1` (клиент) или `R2` (интегратор), не оба |
|||||||
| 390 | - [ ] Содержание соответствует нуждам указанного получателя |
|||||||
| 391 | - [ ] Тип статьи (A/B/C/D) соответствует паре и задаче читателя |
|||||||
| 392 | ||||||||
| 393 | ### Блок 2: Место в структуре Wiki (критично) |
|||||||
| 394 | ||||||||
| 395 | - [ ] Определён раздел верхнего уровня (Объекты / Геозоны / Отчёты / ...) |
|||||||
| 396 | - [ ] Определён подраздел, статья размещена в правильном месте иерархии (см. `wiki-structure-guidelines.md`) |
|||||||
| 397 | - [ ] Название статьи соответствует правилам именования для её типа |
|||||||
| 398 | - [ ] Статья не дублирует уже существующую — при пересечении тем используется ссылка |
|||||||
| 399 | ||||||||
| 400 | ### Блок 3: Структура и содержание (критично) |
|||||||
| 401 | ||||||||
| 402 | - [ ] Используется обязательная структура для данного типа статьи |
|||||||
| 403 | - [ ] Все обязательные секции присутствуют |
|||||||
| 404 | - [ ] Статья атомарна: одна задача — один документ |
|||||||
| 405 | - [ ] Заголовки не глубже H3 |
|||||||
| 406 | - [ ] Для типа A: каждый шаг проверяем в реальном интерфейсе |
|||||||
| 407 | - [ ] Для типа C: все поля имеют описание и допустимые значения |
|||||||
| 408 | - [ ] Для типа D: решения идут от простого к сложному |
|||||||
| 409 | ||||||||
| 410 | ### Блок 4: Язык и оформление (важно) |
|||||||
| 411 | ||||||||
| 412 | - [ ] Язык соответствует аудитории (простой для R1, технический для R2) |
|||||||
| 413 | - [ ] Названия элементов интерфейса выделены жирным и совпадают с реальным UI |
|||||||
| 414 | - [ ] Нет пассивного залога в инструкциях для R1 |
|||||||
| 415 | - [ ] Нет неопределённых местоимений («это», «данный», «соответствующий») |
|||||||
| 416 | - [ ] Скриншоты сопровождаются текстовым описанием |
|||||||
| 417 | - [ ] Перекрёстные ссылки R1↔R2 маркированы |
|||||||
| 418 | ||||||||
| 419 | ### Блок 5: Тестирование (критично для типов A, D) |
|||||||
| 420 | ||||||||
| 421 | **Каждая статья, содержащая шаги, должна пройти практическое тестирование до публикации.** Тестирование проводит тестировщик или ответственный стейкхолдер — не автор. |
|||||||
| 422 | ||||||||
| 423 | **Как проводится тестирование:** |
|||||||
| 424 | ||||||||
| 425 | 1. Тестировщик открывает статью и выполняет все описанные шаги в реальной системе — строго по тексту, без использования других источников. |
|||||||
| 426 | 2. Каждый шаг должен воспроизводиться точно так, как написано: кнопка с указанным названием существует, поле называется именно так, переход происходит туда, куда указано. |
|||||||
| 427 | 3. По итогу тестировщик должен получить тот результат, который заявлен в статье. |
|||||||
| 428 | ||||||||
| 429 | **Результат тестирования:** |
|||||||
| 430 | ||||||||
| 431 | - `✅ Пройдено` — все шаги воспроизводятся, результат достигнут. Статья может быть опубликована. |
|||||||
| 432 | - `❌ Возвращено на доработку` — тестировщик фиксирует, на каком шаге возникло расхождение, и возвращает статью автору с конкретными замечаниями. |
|||||||
| 433 | ||||||||
| 434 | **Чек-лист тестировщика:** |
|||||||
| 435 | ||||||||
| 436 | - [ ] Все шаги выполнены в реальном интерфейсе системы |
|||||||
| 437 | - [ ] Названия всех кнопок, полей и разделов совпадают с реальным UI |
|||||||
| 438 | - [ ] Итоговый результат соответствует заявленному в статье |
|||||||
| 439 | - [ ] Раздел «Частые ошибки» проверен: описанные ошибки реально воспроизводятся и решаются указанным способом |
|||||||
| 440 | ||||||||
| 441 | > **Обязательность тестирования по типам:** |
|||||||
| 442 | > - Тип A (Инструкция) — **обязательно** |
|||||||
| 443 | > - Тип D (Troubleshooting) — **обязательно** |
|||||||
| 444 | > - Тип B (Концепция) — не требуется (нет шагов) |
|||||||
| 445 | > - Тип C (Справочник интерфейса) — **рекомендуется** (проверить, что описания полей соответствуют реальному UI) |
|||||||
| 446 | ||||||||
| 447 | ### Блок 6: AI-специфические требования (для агента поддержки) |
|||||||
| 448 | ||||||||
| 449 | - [ ] Каждый раздел самодостаточен при извлечении фрагментами |
|||||||
| 450 | - [ ] Симптомы и ошибки описаны словами пользователя, а не техническими кодами |
|||||||
| 451 | - [ ] Нет ссылок вида «как описано выше» или «см. предыдущий раздел» |
|||||||
| 452 | - [ ] Ключевые термины и синонимы присутствуют в тексте (не только в заголовке) |
|||||||
| 453 | ||||||||
| 454 | --- |
|||||||
| 455 | ||||||||
| 456 | ## Часть 5. Метаданные статьи |
|||||||
| 457 | ||||||||
| 458 | Каждая статья должна начинаться с блока метаданных (YAML front matter): |
|||||||
| 459 | ||||||||
| 460 | ```yaml |
|||||||
| 461 | --- |
|||||||
| 462 | type: A | B | C | D # Тип статьи |
|||||||
| 463 | source: S1 | S2 | S3 | S4 # Роль источника информации |
|||||||
| 464 | audience: R1 | R2 # Получатель (только один) |
|||||||
| 465 | section: [раздел/подраздел] # Место в структуре Wiki (из wiki-structure-guidelines.md) |
|||||||
| 466 | owner: [имя или команда] # Кто отвечает за актуальность |
|||||||
| 467 | last_verified: ГГГГ-ММ-ДД # Дата последней проверки на актуальность |
|||||||
| 468 | tested_by: [имя тестировщика] # Кто провёл практическое тестирование (обязательно для A, D) |
|||||||
| 469 | version: [версия продукта] # Версия, к которой относится |
|||||||
| 470 | --- |
|||||||
| 471 | ``` |
|||||||
| 472 | ||||||||
| 473 | **Правила заполнения:** |
|||||||
| 474 | ||||||||
| 475 | - Поле `audience` принимает **только одно значение**. Если информация нужна обеим аудиториям — создаются два документа. |
|||||||
| 476 | - Поле `section` должно точно соответствовать разделу/подразделу из `wiki-structure-guidelines.md`. |
|||||||
| 477 | - Поле `tested_by` обязательно для типов A и D. Пустое поле блокирует публикацию. |
|||||||
| 478 | ||||||||
| 479 | --- |
|||||||
| 480 | ||||||||
| 481 | ## Часть 6. Жизненный цикл статьи |
|||||||
| 482 | ||||||||
| 483 | Каждая статья проходит следующие обязательные этапы перед публикацией: |
|||||||
| 484 | ||||||||
| 485 | ``` |
|||||||
| 486 | [1] ПОСТАНОВКА ЗАДАЧИ |
|||||||
| 487 | Определить: пару Source→Receiver, тип статьи, место в структуре Wiki. |
|||||||
| 488 | Заполнить: шаблон задачи на документирование (см. раздел 6.1). |
|||||||
| 489 | ↓ |
|||||||
| 490 | [2] НАПИСАНИЕ |
|||||||
| 491 | Автор создаёт черновик по обязательной структуре для своего типа. |
|||||||
| 492 | ↓ |
|||||||
| 493 | [3] РЕВЬЮ |
|||||||
| 494 | ├── Фактчекинг: стейкхолдер-источник проверяет точность данных |
|||||||
| 495 | ├── Структура и стиль: технический писатель проверяет соответствие гайду |
|||||||
| 496 | └── AI-агент: первичная автоматическая проверка по чек-листу (ai-checklist.md) |
|||||||
| 497 | ↓ |
|||||||
| 498 | [4] ТЕСТИРОВАНИЕ (обязательно для типов A, D; рекомендуется для C) |
|||||||
| 499 | Тестировщик проходит все шаги в реальной системе строго по тексту статьи. |
|||||||
| 500 | Результат: ✅ Пройдено → переход к публикации |
|||||||
| 501 | ❌ Возвращено → автор дорабатывает → повторное тестирование |
|||||||
| 502 | ↓ |
|||||||
| 503 | [5] ПУБЛИКАЦИЯ |
|||||||
| 504 | Статья размещается в правильном разделе/подразделе Wiki. |
|||||||
| 505 | ↓ |
|||||||
| 506 | [6] АКТУАЛИЗАЦИЯ (ongoing) |
|||||||
| 507 | Владелец обновляет статью при каждом изменении функциональности. |
|||||||
| 508 | ``` |
|||||||
| 509 | ||||||||
| 510 | ### 6.1. Шаблон задачи на документирование |
|||||||
| 511 | ||||||||
| 512 | При постановке задачи на создание или обновление статьи инициатор заполняет: |
|||||||
| 513 | ||||||||
| 514 | | Поле | Описание | Пример | |
|||||||
| 515 | |------|----------|--------| |
|||||||
| 516 | | **Триггер** | Что вызвало необходимость | «Добавлена фича X в релизе 2.5» | |
|||||||
| 517 | | **Стейкхолдеры** | Источник → Получатель | `S2 → R1` | |
|||||||
| 518 | | **Тип статьи** | A / B / C / D | A (Инструкция) | |
|||||||
| 519 | | **Объём** | Какая функциональность покрывается | «Создание геозоны через UI» | |
|||||||
| 520 | | **Эксперт для интервью** | Кто владеет знанием | «Иванов И.И., backend-разработчик» | |
|||||||
| 521 | | **Дедлайн** | Когда нужна готовая статья | «До конца спринта 14» | |
|||||||
| 522 | ||||||||
| 523 | --- |
|||||||
| 524 | ||||||||
| 525 | ## Часть 7. Правила актуализации |
|||||||
| 526 | ||||||||
| 527 | **Статья устаревает в момент, когда:** |
|||||||
| 528 | - Изменился интерфейс или поведение функции |
|||||||
| 529 | - Изменились бизнес-правила или логика работы |
|||||||
| 530 | - Пользователи задают вопросы, ответы на которые должны быть в статье |
|||||||
| 531 | ||||||||
| 532 | **Ответственность за актуализацию:** |
|||||||
| 533 | ||||||||
| 534 | | Триггер | Кто обновляет | Срок | |
|||||||
| 535 | |---------|--------------|------| |
|||||||
| 536 | | Новый релиз с изменением фичи | Автор статьи (владелец) | В рамках спринта релиза | |
|||||||
| 537 | | Сигнал от техподдержки (статья вводит в заблуждение) | Техписатель + владелец | Не позднее 2 рабочих дней | |
|||||||
| 538 | | Плановая проверка | Технический писатель | Ежеквартально | |
|||||||
| 539 | ||||||||
| 540 | **Признак «протухшей» документации:** пользователи или интеграторы задают вопросы, ответы на которые должны быть в статье. Если этот паттерн возникает — статья требует ревизии. |
|||||||