Руководство по написанию технической документации SKIF.PRO

Для кого этот документ: авторы статей (техподдержка, продакт-менеджеры, разработчики, аналитики) и AI-агент первичной проверки.

Почему это важно: статья работает правильно только если автор точно знает, кто её будет читать и зачем. От этого зависят структура, язык и глубина проработки.

Связанные документы:

  • wiki-structure-guidelines.md — правила размещения статьи в структуре Wiki
  • ai-checklist.md — единый чек-лист для AI-агента проверки

Часть 1. Принцип «От кого → Кому»: фундамент качества статьи

Каждая статья в вики — это канал коммуникации между двумя конкретными сторонами. Перед началом работы автор обязан ответить на два вопроса:

  1. Кто источник информации? (кто владеет знанием)
  2. Кто получатель? (кто будет читать и зачем)

Качество статьи измеряется тем, насколько точно она закрывает потребность получателя — не больше и не меньше.


1.1. Матрица стейкхолдеров

Получатели (читатели)

ID Роль Кто это Контекст чтения
R1 Конечный клиент Пользователь продукта SKIF.PRO: диспетчер, логист, руководитель автопарка Решает конкретную задачу прямо сейчас. Не знает технических деталей. Ожидает пошаговые инструкции.
R2 Интегратор Технический специалист компании-партнёра, который внедряет или настраивает SKIF.PRO у клиента Ищет точные технические параметры: форматы, схемы, ограничения. Умеет читать технические тексты.

Источники (авторы и владельцы информации)

ID Роль Кто это Что может рассказать
S1 Техподдержка Специалисты первой и второй линии поддержки Типовые проблемы пользователей, сценарии ошибок, FAQ по реальным обращениям
S2 Продакт-менеджер Владелец продукта или менеджер по продукту Описание новых фич, бизнес-логика, критерии использования функций
S3 Разработчик Backend/Frontend/DevOps инженер Технические детали реализации, форматы данных, ограничения системы
S4 Системный/бизнес-аналитик Аналитик, участвовавший в проектировании Логика работы функциональности, граничные случаи, бизнес-правила
S5 Технический писатель Специалист по документации Структура, стиль, архитектура информации — не источник фактов, но имплементатор канала

1.2. Определение пары «Источник → Получатель»

Алгоритм выбора для автора:

1. Кто инициировал создание статьи?
   → Это подсказка по источнику (S1–S4)

2. Кто будет читать эту статью?
   → Конечный клиент (R1) или интегратор (R2)?

3. Какую задачу решает читатель?
   → Одна задача = одна статья

Типовые пары и их смысл:

Пара Когда используется Пример статьи
S1 → R1 Техподдержка передаёт решение частой проблемы клиенту «Почему трекер не отображается на карте»
S2 → R1 Продакт рассказывает клиенту о новой функции «Как использовать автоматические отчёты»
S2 → R2 Продакт объясняет интегратору логику новой фичи «Модель данных объектов: структура и ограничения»
S3 → R2 Разработчик документирует технические детали интеграции «Протокол обмена данными с трекерами»
S4 → R2 Аналитик описывает бизнес-правила для интеграции «Правила расчёта пробега: алгоритм и исключения»
S1 → R2 Поддержка описывает типовые ошибки при внедрении «Частые ошибки при настройке CAN-шины»

⚠️ Запрещённые ситуации:

  • Статья адресована «всем» — это означает, что она не адресована никому
  • Один документ одновременно объясняет концепцию клиенту и содержит технический справочник для интегратора
  • Автор пишет то, что знает сам, не думая о получателе

Часть 2. Типы статей и их структуры

Тип статьи определяется парой «Источник → Получатель» и задачей читателя.

В Wiki SKIF.PRO используются четыре типа статей:

Тип Название Отвечает на вопрос Аудитория
A Инструкция «Как сделать X?» R1
B Концепция «Что это и зачем?» R1 или R2
C Справочник интерфейса «Что означают эти поля/настройки?» R1
D Troubleshooting «Почему не работает и что делать?» R1 или R2

Вне scope этого документа:

  • API-документация ведётся в Postman (отдельный workflow)
  • Release Notes публикуются на сайте (отдельный workflow)

Тип A: Инструкция для конечного клиента

Пары: S1→R1, S2→R1

Когда создаётся: клиент должен самостоятельно выполнить задачу в интерфейсе системы.

Признаки правильной статьи типа A:

  • Написана от второго лица («нажмите», «выберите», «перейдите»)
  • Не содержит технических терминов без объяснения
  • Каждый шаг — одно действие
  • Есть скриншоты для неочевидных шагов
  • Скриншоты сопровождаются текстовым описанием (AI-агент не видит изображения)

Обязательная структура:

Секция Обязательность Назначение
# [Глагол + задача] ✅ обязательно Заголовок = поисковый запрос
## Когда это нужно ✅ обязательно Жизненный сценарий, 1–3 предложения
## Что потребуется ⚙️ условно Только если есть предусловия (права, данные). Если нет — пропускается
## Пошаговая инструкция ✅ обязательно Нумерованные шаги, одно действие на шаг
## Частые вопросы и ошибки ✅ обязательно Симптом → причина → решение
## Что дальше 💡 рекомендуемо 2–3 ссылки на следующие действия

Пример:

# Как добавить транспортное средство

## Когда это нужно
Вы приобрели новый трекер и хотите начать отслеживать транспортное средство в системе SKIF.PRO.

## Что потребуется
- Роль «Редактор» или выше
- IMEI-номер трекера (указан на корпусе устройства или в документации к нему)

## Пошаговая инструкция

1. Перейдите в раздел **Объекты**.
2. Нажмите кнопку **Создать объект** в правом верхнем углу.
3. В поле **Название** введите имя транспортного средства.
   Используйте описательное название, например, «МАЗ-5440 А123ВС» вместо «М1».
4. В поле **IMEI** введите номер трекера.
5. Нажмите **Сохранить**.

## Частые вопросы и ошибки

**Не вижу кнопку «Создать объект».**
Кнопка доступна только пользователям с ролью «Редактор» и выше. Обратитесь к администратору аккаунта.

**После сохранения объект не появляется на карте.**
Объект появится на карте после того, как трекер передаст первые координаты. Убедитесь, что трекер включен и настроен на сервер SKIF.PRO.

## Что дальше
- Настройте датчики объекта — см. статью «Карточка объекта — вкладка Датчики»
- Добавьте объект в группу — см. статью «Как добавить объект в группу»

Тип B: Концепция (описание функциональности)

Пары: S2→R1, S2→R2, S4→R2

Когда создаётся: нужно объяснить, что делает функция и зачем, прежде чем показывать как.

Признаки правильной статьи типа B:

  • Отвечает на вопрос «зачем это нужно» и «как это устроено», а не «как нажать»
  • Описывает бизнес-логику и сценарии применения
  • Может содержать схемы и диаграммы
  • Не дублирует пошаговые инструкции — даёт ссылки на них
  • Для R1 — аналогии и примеры из жизни, для R2 — логика системы и модели данных

Обязательная структура:

Секция Обязательность Назначение
# [Название функциональности] ✅ обязательно Для R1: «Что такое X в SKIF.PRO». Для R2: «X: модель данных и логика»
## Для чего это нужно ✅ обязательно Бизнес-задача языком получателя
## Как это работает ✅ обязательно Принцип работы. Для R1 — простым языком. Для R2 — техническая логика
## Сценарии применения ✅ обязательно 2–4 сценария использования
## Ограничения и важные условия ✅ обязательно Граничные случаи, зависимости от тарифа/настроек
## Связанные инструкции 💡 рекомендуемо Ссылки на статьи типа A

Тип C: Справочник интерфейса

Пары: S2→R1, S3→R1

Когда создаётся: нужно описать конкретный экран, вкладку или форму — перечислить все поля с их назначением и допустимыми значениями.

Признаки правильной статьи типа C:

  • Привязана к одному конкретному экрану или вкладке (одна вкладка = одна статья)
  • Перечисляет поля, их назначение, допустимые значения, значения по умолчанию
  • Не учит «как», описывает «что» — пошаговые действия выносятся в тип A
  • Содержит скриншот экрана с текстовым описанием

Обязательная структура:

Секция Обязательность Назначение
# [Название экрана — вкладка/форма] ✅ обязательно Точное название как в интерфейсе
## Назначение ✅ обязательно 1–2 предложения: для чего используется экран
## Как открыть ✅ обязательно Краткий путь навигации (без полной инструкции)
## Описание полей ✅ обязательно Таблица: поле, описание, допустимые значения, по умолчанию
## Связанные инструкции 💡 рекомендуемо Ссылки на статьи типа A, которые используют этот экран

Пример:

# Карточка объекта — вкладка «Основные»

## Назначение
Вкладка содержит базовые параметры объекта мониторинга: название, тип, привязку к трекеру.

## Как открыть
**Объекты** → выберите объект → вкладка **Основные**.

## Описание полей

| Поле | Описание | Допустимые значения | По умолчанию |
|------|----------|---------------------|--------------|
| **Название** | Отображаемое имя объекта на карте и в отчётах | Текст, до 100 символов | — |
| **IMEI** | Идентификатор трекера | 15 цифр | — |
| **Тип объекта** | Категория транспорта | Легковой, Грузовой, Спецтехника, Человек | Легковой |
| **Иконка** | Значок объекта на карте | Выбор из библиотеки | Автомобиль |

## Связанные инструкции
- Как создать объект — см. статью «Как добавить транспортное средство»
- Как изменить тип объекта — см. статью «Как редактировать объект»

Тип D: Устранение неполадок (Troubleshooting)

Пары: S1→R1, S1→R2, S3→R2

Когда создаётся: техподдержка или разработчики фиксируют повторяющиеся проблемы с решениями.

Признаки правильной статьи типа D:

  • Заголовок — описание симптома словами получателя, а не технической причиной
  • Решения идут от простого к сложному
  • Есть явный раздел «когда обращаться в поддержку»
  • Для R2: допустимы технические детали (коды ошибок, логи, curl-примеры)

Обязательная структура:

Секция Обязательность Назначение
# [Симптом словами получателя] ✅ обязательно Для R1: «Трекер не выходит на связь». Для R2: «Запрос возвращает ошибку 502»
## Симптом ✅ обязательно Точное описание: что видит получатель
## Возможные причины и решения ✅ обязательно H3 для каждой причины: диагностика + решение
## Если ничего не помогло ✅ обязательно Что сообщить в поддержку, какие данные подготовить

Пример для R1:

# Трекер не выходит на связь

## Симптом
Объект на карте отображается серым. В карточке объекта в поле **Последняя связь** указано время более 30 минут назад.

## Возможные причины и решения

### Причина 1: Трекер выключен или разряжен
Проверьте, горит ли индикатор питания на трекере.
**Решение:** Подключите трекер к питанию и дождитесь загрузки (1–3 минуты).

### Причина 2: Нет покрытия GSM-сети
Трекер находится в зоне без мобильной связи (подземная парковка, удалённая территория).
**Решение:** Переместите транспорт в зону покрытия. Данные передадутся автоматически.

## Если ничего не помогло
Обратитесь в техподдержку и сообщите:
- IMEI трекера
- Время последней связи из карточки объекта
- Какие шаги уже выполнены

Пример для R2:

# Webhook не доставляет события

## Симптом
Настроенный webhook-эндпоинт не получает POST-запросы от SKIF.PRO при наступлении события.

## Возможные причины и решения

### Причина 1: Эндпоинт недоступен извне
SKIF.PRO не может установить TCP-соединение с указанным URL.
**Решение:** Убедитесь, что URL доступен из интернета. Проверьте командой:
`curl -X POST https://your-endpoint.com/webhook -d '{"test": true}'`

### Причина 2: Эндпоинт отвечает не 200
SKIF.PRO считает доставку успешной только при HTTP 200.
**Решение:** Убедитесь, что ваш сервер возвращает именно статус 200 (не 201, не 204).

## Если ничего не помогло
Обратитесь в техподдержку и сообщите:
- URL webhook-эндпоинта
- Тип события, на которое подписаны
- Логи вашего сервера за последний час

Часть 3. Требования к тексту

3.1. Заголовки

Правило Правильно Неправильно
Для инструкций (A) — начинать с глагола «Как создать геозону» «Геозоны. Создание»
Для концепций (B) — R1: «Что такое…»; R2: объект + контекст «Что такое геозоны в SKIF.PRO» / «Геозоны: модель данных и ограничения» «Введение в геозоны»
Для справочников (C) — название экрана «Карточка объекта — вкладка Основные» «Основные настройки объекта»
Для troubleshooting (D) — симптом словами получателя «Почему трекер офлайн» «Статус трекера»
Не использовать аббревиатуры без расшифровки «Настройка CAN-шины (бортовой сети)» «Настройка CAN»

3.2. Язык для R1 (конечный клиент)

  • Одна мысль — одно предложение. Ориентир: не более 25 слов на предложение.
  • Нет жаргона: вместо «задеплоить» → «применить изменения»
  • Нет пассивного залога: вместо «значение должно быть введено» → «введите значение»
  • Названия кнопок и разделов — жирным, точь-в-точь как в интерфейсе
  • Каждый шаг — одно действие

3.3. Язык для R2 (интегратор)

  • Технические термины допустимы и ожидаемы
  • Все типы данных указываются явно: string, integer, boolean, ISO 8601
  • Граничные случаи и исключения — обязательны
  • Конкретные значения вместо абстрактных описаний

3.4. Атомарность

Одна статья = один вопрос читателя.

Статья нарушает принцип атомарности, если:

  • В ней несколько заголовков уровня H2, которые могут быть самостоятельными статьями
  • Она одновременно объясняет концепцию И содержит пошаговую инструкцию (разбить на тип B + тип A)
  • Она одновременно описывает «как сделать» И перечисляет все поля формы (разбить на тип A + тип C)
  • Она адресована и R1, и R2 одновременно

3.5. Глубина заголовков

Максимальная глубина заголовков внутри статьи — H3 (###). Если требуется более глубокая вложенность — это сигнал, что статья нарушает атомарность и должна быть разделена.

Исключение: тип D (Troubleshooting) использует H3 для отдельных причин внутри секции «Возможные причины и решения». Вложенность внутри причины не допускается.

3.6. Самодостаточность секций (для AI-агента)

AI-агент техподдержки извлекает фрагменты статей, а не читает их целиком. Поэтому:

  • Каждая секция (блок под H2) должна быть понятна без чтения остальных секций
  • Запрещены ссылки «как описано выше», «см. предыдущий раздел»
  • Называйте сущности явно: вместо «эта функция» → «функция геозон»
  • Короткие повторяющиеся факты (роль доступа, версия) дублируйте в каждой статье
  • Развёрнутые блоки (описание алгоритма, большая таблица) не дублируйте — давайте ссылку с кратким резюме в 1 предложение

3.7. Скриншоты

  • Каждый скриншот обязательно сопровождается текстовым описанием действия. AI-агент не видит изображения.
  • Скриншот размещается непосредственно после шага, который он иллюстрирует
  • Критичную информацию из таблиц на скриншотах дублируйте в текстовой таблице

3.8. Перекрёстные ссылки

Внутри одной аудитории (R1→R1 или R2→R2): свободно, по полному названию статьи.

Между аудиториями (R1↔R2): допустимы, но обязательно маркируются:

> 🔧 Техническая статья для интеграторов: [Протокол обмена данными с трекерами](ссылка)
> 📱 Статья для пользователей: [Как добавить транспортное средство](ссылка)

Формат ссылок:

  • см. статью «Как создать объект»
  • см. здесь
  • подробнее по ссылке

Часть 4. Чек-лист перед публикацией

Используется автором при самопроверке. Полный машиночитаемый чек-лист для AI-агента — в файле ai-checklist.md.

Блок 1: Стейкхолдеры (критично)

  • Указана пара «Источник → Получатель» в метаданных
  • Получатель однозначно определён: R1 (клиент) или R2 (интегратор), не оба
  • Содержание соответствует нуждам указанного получателя
  • Тип статьи (A/B/C/D) соответствует паре и задаче читателя

Блок 2: Место в структуре Wiki (критично)

  • Определён раздел верхнего уровня (Объекты / Геозоны / Отчёты / ...)
  • Определён подраздел, статья размещена в правильном месте иерархии (см. wiki-structure-guidelines.md)
  • Название статьи соответствует правилам именования для её типа
  • Статья не дублирует уже существующую — при пересечении тем используется ссылка

Блок 3: Структура и содержание (критично)

  • Используется обязательная структура для данного типа статьи
  • Все обязательные секции присутствуют
  • Статья атомарна: одна задача — один документ
  • Заголовки не глубже H3
  • Для типа A: каждый шаг проверяем в реальном интерфейсе
  • Для типа C: все поля имеют описание и допустимые значения
  • Для типа D: решения идут от простого к сложному

Блок 4: Язык и оформление (важно)

  • Язык соответствует аудитории (простой для R1, технический для R2)
  • Названия элементов интерфейса выделены жирным и совпадают с реальным UI
  • Нет пассивного залога в инструкциях для R1
  • Нет неопределённых местоимений («это», «данный», «соответствующий»)
  • Скриншоты сопровождаются текстовым описанием
  • Перекрёстные ссылки R1↔R2 маркированы

Блок 5: Тестирование (критично для типов A, D)

Каждая статья, содержащая шаги, должна пройти практическое тестирование до публикации. Тестирование проводит тестировщик или ответственный стейкхолдер — не автор.

Как проводится тестирование:

  1. Тестировщик открывает статью и выполняет все описанные шаги в реальной системе — строго по тексту, без использования других источников.
  2. Каждый шаг должен воспроизводиться точно так, как написано: кнопка с указанным названием существует, поле называется именно так, переход происходит туда, куда указано.
  3. По итогу тестировщик должен получить тот результат, который заявлен в статье.

Результат тестирования:

  • ✅ Пройдено — все шаги воспроизводятся, результат достигнут. Статья может быть опубликована.
  • ❌ Возвращено на доработку — тестировщик фиксирует, на каком шаге возникло расхождение, и возвращает статью автору с конкретными замечаниями.

Чек-лист тестировщика:

  • Все шаги выполнены в реальном интерфейсе системы
  • Названия всех кнопок, полей и разделов совпадают с реальным UI
  • Итоговый результат соответствует заявленному в статье
  • Раздел «Частые ошибки» проверен: описанные ошибки реально воспроизводятся и решаются указанным способом

Обязательность тестирования по типам:

  • Тип A (Инструкция) — обязательно
  • Тип D (Troubleshooting) — обязательно
  • Тип B (Концепция) — не требуется (нет шагов)
  • Тип C (Справочник интерфейса) — рекомендуется (проверить, что описания полей соответствуют реальному UI)

Блок 6: AI-специфические требования (для агента поддержки)

  • Каждый раздел самодостаточен при извлечении фрагментами
  • Симптомы и ошибки описаны словами пользователя, а не техническими кодами
  • Нет ссылок вида «как описано выше» или «см. предыдущий раздел»
  • Ключевые термины и синонимы присутствуют в тексте (не только в заголовке)

Часть 5. Метаданные статьи

Каждая статья должна начинаться с блока метаданных (YAML front matter):

---
type: A | B | C | D               # Тип статьи
source: S1 | S2 | S3 | S4         # Роль источника информации
audience: R1 | R2                  # Получатель (только один)
section: [раздел/подраздел]        # Место в структуре Wiki (из wiki-structure-guidelines.md)
owner: [имя или команда]           # Кто отвечает за актуальность
last_verified: ГГГГ-ММ-ДД         # Дата последней проверки на актуальность
tested_by: [имя тестировщика]      # Кто провёл практическое тестирование (обязательно для A, D)
version: [версия продукта]         # Версия, к которой относится
---

Правила заполнения:

  • Поле audience принимает только одно значение. Если информация нужна обеим аудиториям — создаются два документа.
  • Поле section должно точно соответствовать разделу/подразделу из wiki-structure-guidelines.md.
  • Поле tested_by обязательно для типов A и D. Пустое поле блокирует публикацию.

Часть 6. Жизненный цикл статьи

Каждая статья проходит следующие обязательные этапы перед публикацией:

[1] ПОСТАНОВКА ЗАДАЧИ
    Определить: пару Source→Receiver, тип статьи, место в структуре Wiki.
    Заполнить: шаблон задачи на документирование (см. раздел 6.1).
         ↓
[2] НАПИСАНИЕ
    Автор создаёт черновик по обязательной структуре для своего типа.
         ↓
[3] РЕВЬЮ
    ├── Фактчекинг: стейкхолдер-источник проверяет точность данных
    ├── Структура и стиль: технический писатель проверяет соответствие гайду
    └── AI-агент: первичная автоматическая проверка по чек-листу (ai-checklist.md)
         ↓
[4] ТЕСТИРОВАНИЕ (обязательно для типов A, D; рекомендуется для C)
    Тестировщик проходит все шаги в реальной системе строго по тексту статьи.
    Результат: ✅ Пройдено → переход к публикации
               ❌ Возвращено → автор дорабатывает → повторное тестирование
         ↓
[5] ПУБЛИКАЦИЯ
    Статья размещается в правильном разделе/подразделе Wiki.
         ↓
[6] АКТУАЛИЗАЦИЯ (ongoing)
    Владелец обновляет статью при каждом изменении функциональности.

6.1. Шаблон задачи на документирование

При постановке задачи на создание или обновление статьи инициатор заполняет:

Поле Описание Пример
Триггер Что вызвало необходимость «Добавлена фича X в релизе 2.5»
Стейкхолдеры Источник → Получатель S2 → R1
Тип статьи A / B / C / D A (Инструкция)
Объём Какая функциональность покрывается «Создание геозоны через UI»
Эксперт для интервью Кто владеет знанием «Иванов И.И., backend-разработчик»
Дедлайн Когда нужна готовая статья «До конца спринта 14»

Часть 7. Правила актуализации

Статья устаревает в момент, когда:

  • Изменился интерфейс или поведение функции
  • Изменились бизнес-правила или логика работы
  • Пользователи задают вопросы, ответы на которые должны быть в статье

Ответственность за актуализацию:

Триггер Кто обновляет Срок
Новый релиз с изменением фичи Автор статьи (владелец) В рамках спринта релиза
Сигнал от техподдержки (статья вводит в заблуждение) Техписатель + владелец Не позднее 2 рабочих дней
Плановая проверка Технический писатель Ежеквартально

Признак «протухшей» документации: пользователи или интеграторы задают вопросы, ответы на которые должны быть в статье. Если этот паттерн возникает — статья требует ревизии.

On this page
Руководство по написанию технической документации SKIF.PRO Часть 1. Принцип «От кого → Кому»: фундамент качества статьи 1.1. Матрица стейкхолдеров Получатели (читатели) Источники (авторы и владельцы информации) 1.2. Определение пары «Источник → Получатель» Часть 2. Типы статей и их структуры Тип A: Инструкция для конечного клиента Тип B: Концепция (описание функциональности) Тип C: Справочник интерфейса Тип D: Устранение неполадок (Troubleshooting) Часть 3. Требования к тексту 3.1. Заголовки 3.2. Язык для R1 (конечный клиент) 3.3. Язык для R2 (интегратор) 3.4. Атомарность 3.5. Глубина заголовков 3.6. Самодостаточность секций (для AI-агента) 3.7. Скриншоты 3.8. Перекрёстные ссылки Часть 4. Чек-лист перед публикацией Блок 1: Стейкхолдеры (критично) Блок 2: Место в структуре Wiki (критично) Блок 3: Структура и содержание (критично) Блок 4: Язык и оформление (важно) Блок 5: Тестирование (критично для типов A, D) Блок 6: AI-специфические требования (для агента поддержки) Часть 5. Метаданные статьи Часть 6. Жизненный цикл статьи 6.1. Шаблон задачи на документирование Часть 7. Правила актуализации
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9