APIСтандартизация
тема 1
Открыть слайдами →

95Один файл — разные решения компаний

Репозиторий API содержит не только код. Шаблоны pull request, формы issue, владельцы кода, политика безопасности и журнал изменений есть у всех крупных проектов, но каждая компания устраивает их по-своему.

ФайлЗачем нуженКак устроен у других
.github/PULL_REQUEST_TEMPLATE.mdчек-лист изменения контрактаKubernetes ↗ · OpenAPI Initiative ↗ · GitHub Docs ↗ · Azure ↗
.github/ISSUE_TEMPLATE/*.ymlформы с обязательными полямиAzure ↗ · Kubernetes ↗ · Stripe ↗
.github/CODEOWNERSкто утверждает измененияOpenAPI Initiative ↗ · Azure ↗ · Kubernetes OWNERS ↗
SECURITY.mdкак сообщить об уязвимостиAzure ↗ · VS Code ↗ · Kubernetes ↗
CHANGELOG.mdистория изменений для потребителейStripe ↗ · Kubernetes ↗
.github/dependabot.ymlобновление зависимостейOpenAPI Initiative ↗ · GitHub Docs ↗ · FastAPI ↗

На следующих слайдах у каждого файла есть цитата из документации GitHub или стандарта в оригинале, перевод и настоящие файлы компаний. Полный список с доказательствами лежит в учебном проекте: docs/STANDARDS.md.

Правила компании обязательны только внутри этой компании. Для учебного проекта выбрано подходящее, и каждый выбор записан вместе с источником.

96Шаблон pull request: что проверить до слияния

Шаблон подставляется в описание каждого нового pull request. Автору он напоминает, что проверить, а ревьюеру показывает, где искать ответ.

To store your file in a hidden directory, name the pull request template .github/pull_request_template.md.

Перевод: чтобы хранить файл в скрытой папке, назовите шаблон pull request .github/pull_request_template.md.

GitHub Docs · Creating a pull request template ↗
ПроектЧто требует шаблон
Kubernetes ↗тип PR командой /kind api-change или /kind deprecation, блок release note
OpenAPI Initiative ↗отметить, нужны ли изменения JSON Schema спецификации
GitHub Docs ↗ссылку на issue и проверку содержания экспертом
Azure ↗выбрать один из трёх шаблонов: data plane, control plane, SDK
Box ↗самопроверку и запуск yarn lint

Регистр в имени файла не важен: Kubernetes и GitHub Docs называют его PULL_REQUEST_TEMPLATE.md.

github.com · kubernetes/kubernetesСКРИНШОТ · 16.09.2026
Шаблон PR Kubernetes: список видов изменения, среди них /kind api-change и /kind deprecation. Клик — увеличить.
Учебный PR №6, заполненный по шаблону
github.com · MaximBytecamp/api-standard-template/pull/6СКРИНШОТ · 16.09.2026
Pull request №6: отмечен breaking change, заполнена таблица изменений контракта. Клик — увеличить.

Открыть PR №6 ↗

Как это сделано в учебном проекте
.github/PULL_REQUEST_TEMPLATE.md (фрагмент)
## Тип изменения

- [ ] совместимое изменение контракта (MINOR)
- [ ] исправление без изменения контракта (PATCH)
- [ ] **breaking change** (MAJOR)
- [ ] только документация

## Проверки

- [ ] контракт выгружен: python scripts/export_openapi.py
- [ ] изменение записано в CHANGELOG.md
- [ ] устаревающие элементы помечены deprecated: true

97Формы issue: обязательные поля вместо свободного текста

Issue form — YAML-файл, из которого GitHub строит форму с полями. Пока обязательное поле пустое, обращение не отправить.

You can create custom issue forms by adding a YAML form definition file to the /.github/ISSUE_TEMPLATE folder in your repository.

Перевод: собственные формы issue создаются YAML-файлами с описанием формы в папке /.github/ISSUE_TEMPLATE репозитория.

GitHub Docs · Syntax for issue forms ↗
ПроектФорматЧто спрашивает
Azure ↗YAML-формаобязательные «API Spec link» и «API Spec version»
Kubernetes ↗YAML-формачто произошло, что ожидали, как воспроизвести
Stripe Node SDK ↗YAML-формаописание, шаги, ожидаемое поведение
VS Code ↗Markdownсвободный текст по подсказкам

Из Azure в учебный проект взяты обязательные поля «версия API» и «операция», из Kubernetes — «что произошло / что ожидали».

github.com · Azure/azure-rest-api-specsСКРИНШОТ · 16.09.2026
Форма ошибки Azure: поле API Spec version с обязательным заполнением. Клик — увеличить.
Учебный issue №7 в том виде, в каком его создаёт форма
github.com · MaximBytecamp/api-standard-template/issues/7СКРИНШОТ · 16.09.2026
Issue №7: каждое поле формы стало заголовком раздела, выбранные значения — текстом под ним. Клик — увеличить.

Открыть issue №7 ↗

Как это сделано в учебном проекте
.github/ISSUE_TEMPLATE/bug_report.yml (фрагмент)
- type: input
  id: version
  attributes:
    label: Версия API
    placeholder: "1.1.0"
  validations:
    required: true

- type: input
  id: request_id
  attributes:
    label: X-Request-Id

98Кто утверждает изменения контракта

CODEOWNERS связывает файлы и папки с людьми или командами. GitHub сам запрашивает у них review, а защита ветки может сделать этот review обязательным.

Code owners are automatically requested for review when someone opens a pull request that modifies code that they own.

Перевод: владельцы кода автоматически получают запрос на review, когда кто-то открывает pull request, меняющий принадлежащий им код.

GitHub Docs · About code owners ↗
.github/CODEOWNERS (фрагмент)
*                        @MaximBytecamp
/openapi/                @MaximBytecamp
/.spectral.yaml          @MaximBytecamp
/docs/API_STYLE_GUIDE.md @MaximBytecamp

В команде вместо имени указывают группу, например @org/api-reviewers. У Azure ↗ свои владельцы у спецификации каждого сервиса. Kubernetes использует другую систему: файлы OWNERS в папках читает бот Prow.

github.com · OAI/OpenAPI-SpecificationСКРИНШОТ · 16.09.2026
CODEOWNERS спецификации OpenAPI: папку /versions/ утверждает технический комитет @oai/tsc. Клик — увеличить.
Доказательство: файл OWNERS в Kubernetes
github.com · kubernetes/kubernetesСКРИНШОТ · 16.09.2026
Файл OWNERS в корне Kubernetes: списки reviewers и approvers. Клик — увеличить.

99Как сообщить об уязвимости

Уязвимость не обсуждают в публичном issue: пока её не исправили, описание помогает атакующему. SECURITY.md говорит, куда писать вместо этого.

In the new SECURITY.md file, add information about supported versions of your project and how to report a vulnerability.

Перевод: в новом файле SECURITY.md укажите поддерживаемые версии проекта и способ сообщить об уязвимости.

GitHub Docs · Adding a security policy ↗
ПроектВариант
Azure ↗полный стандартный текст Microsoft: не писать в issue, отправить отчёт в MSRC, перечень нужных сведений
VS Code ↗короткая версия того же блока Microsoft со ссылкой на общую политику
Kubernetes ↗файл SECURITY_CONTACTS: ответственные и ссылка на процесс
Учебный проектdocs/SECURITY.md: поддерживаемые версии, приватный отчёт через GitHub, что указать в отчёте
github.com · Azure/azure-rest-api-specsСКРИНШОТ · 16.09.2026
SECURITY.md Azure: «Please do not report security vulnerabilities through public GitHub issues». Клик — увеличить.

100Журнал изменений в разных масштабах

Keep a Changelog задаёт принципы, а форма журнала зависит от размера проекта.

Changelogs are for humans, not machines. There should be an entry for every single version. The same types of changes should be grouped.

Перевод: журнал изменений пишется для людей, а не для программ. Для каждой версии должна быть запись. Изменения одного типа группируются.

Keep a Changelog 1.1.0 · Guiding Principles ↗
ПроектКак устроен журнал
Stripe Node SDK ↗один файл, генерируется из фрагментов .change.md, у пунктов ссылки на PR
Kubernetes ↗папка CHANGELOG/, отдельный файл на каждую минорную версию
Учебный проектодин файл, разделы Added и Deprecated, ссылки сравнения версий
github.com · stripe/stripe-nodeСКРИНШОТ · 16.09.2026
CHANGELOG Stripe: запись о версии, которая меняет закреплённую версию API. Клик — увеличить.
Доказательство: папка CHANGELOG в Kubernetes
github.com · kubernetes/kubernetesСКРИНШОТ · 16.09.2026
Папка CHANGELOG Kubernetes: файлы по минорным версиям. Клик — увеличить.

101Breaking change ловит CI, а не review

Переименованное поле легко пропустить в длинном diff. oasdiff сравнивает два файла OpenAPI и перечисляет изменения, которые сломают клиентов.

GitHub Actions that check your OpenAPI specs for breaking changes on every pull request.

Перевод: GitHub Actions, которые проверяют спецификации OpenAPI на breaking changes в каждом pull request.

oasdiff/oasdiff-action · README ↗
.github/workflows/ci.yml (фрагмент)
breaking-changes:
  if: github.event_name == 'pull_request'
  steps:
    - uses: actions/checkout@v5
    - run: git fetch --depth=1 origin ${{ github.base_ref }}
    - uses: oasdiff/oasdiff-action/breaking@v0.1.17
      with:
        base: "origin/${{ github.base_ref }}:openapi/openapi.yaml"
        revision: "HEAD:openapi/openapi.yaml"
        fail-on: ERR
Тот же результат при локальном запуске oasdiff
локальный запуск oasdiff: в ревизии поле title переименовано в subject
$ oasdiff breaking base.yaml revision.yaml --fail-on ERR
4 changes: 4 error, 0 warning, 0 info
error	[response-required-property-removed] at /specs/revision.yaml
	in API GET /api/v1/tickets
		removed the required property `items/items/title` from the response with the `200` status

error	[response-required-property-removed] at /specs/revision.yaml
	in API POST /api/v1/tickets
		removed the required property `title` from the response with the `201` status

# ещё две такие же ошибки: GET и PATCH /api/v1/tickets/{ticket_id}
github.com · pull request №6СКРИНШОТ · 16.09.2026
Прогон на учебном PR №6 (updated_at → modified_at): contract прошёл, breaking-changes упал, 5 аннотаций oasdiff — по одной на каждую операцию с полем в ответе. Клик — увеличить.

Тесты в этом PR проходят: переименование согласовано во всём коде. Остановил слияние только oasdiff, а защита ветки main требует обе проверки. Открыть прогон ↗.

102Адрес в поле type должен открываться

Problem Details различает виды ошибок по адресу в поле type. Стандарт требует, чтобы по этому адресу была документация.

If the type URI is a locator (e.g., those with an "http" or "https" scheme), dereferencing it SHOULD provide human-readable documentation for the problem type (e.g., using HTML).

Перевод: если URI в поле type является адресом (например, со схемой http или https), то по нему SHOULD открываться понятная человеку документация о виде проблемы, например HTML-страница.

RFC 9457 · раздел 3.1.1 ↗

В версии 1.0.0 учебного проекта type указывал на example.edu, где страницы нет. В 1.1.0 скрипт scripts/build_docs.py собирает страницу для каждого кода ошибки, а workflow docs.yml публикует их на GitHub Pages вместе с ReDoc.

Документация опубликована: maximbytecamp.github.io/api-standard-template ↗, страница http-412 ↗.

maximbytecamp.github.io · problems/http-412СКРИНШОТ · 16.09.2026
Опубликованная страница вида проблемы 412: что означает ошибка и что делать клиенту. Клик — увеличить.

103Правило без источника легко оспорить

В учебном проекте для каждого правила записано, откуда оно взято, насколько оно обязательно и как то же самое решили другие компании.

docs/STANDARDS.md (фрагмент)
## 9. Ограничение частоты запросов: 429 и Retry-After

**В проекте:** app/limits.py

**Источник:** RFC 6585, раздел 4, Standards Track.

> The response representations SHOULD include details
> explaining the condition, and MAY include a Retry-After
> header indicating how long to wait before making a new request.

Перевод: ответ SHOULD объяснять причину и MAY содержать
заголовок Retry-After ...

**Как это делают другие:** Zalando (правило 153), GitHub ...
Статус источникаЧто означает
RFC, Standards Trackстандарт IETF
RFC, Informationalопубликованный документ IETF, но не стандарт
Internet-Draftчерновик: может измениться или истечь
СпецификацияOpenAPI, Fetch Standard, SemVer
Правила компанииобязательны только внутри этой компании

Статус указывается рядом с цитатой: RFC 8594 про Sunset — Informational, а черновик про Idempotency-Key истёк.

Кадр крупным планом