# ADR-065: Block manual License section in validateReadme ## Статус Accepted (2026-07-30) ## Контекст `validateReadme` (тулза `create-readme`) проверяла структуру README для парсинга витриной slaid098.dev, но не контролировала дублирование License-секции. GitHub автоматически рендерит license в sidebar репозитория (из LICENSE-файла и/или настроек repo). Ручной `## License` в README — дубликат, который расходится с источником правды и засоряет валидацию стандарта. Часть README этого репо содержала ручной `## License` + `MIT — see [LICENSE](LICENSE).`, который нужно убрать одновременно с приведением tagline к новому стандарту (PR #151). ## Решение Добавить в `validateReadme` ERROR-чек после H1 prefix check: ```ts if (/^##\s+(License|LICENSE|Лицензия)\s*$/m.test(content)) issues.push("Manual License section found — remove it (GitHub renders license from LICENSE file)") ``` Ключевые свойства regex `^##\s+(License|LICENSE|Лицензия)\s*$` с `m`-флагом: - Матчит только заголовки секций в начале строки (`## License`, `## LICENSE`, `## Лицензия`). - НЕ матчит упоминания "license" внутри текста, features-таблиц или custom-sections — `^`/`$` с `m`-флагом ограничивают совпадение целой строкой. - Регистро-варианты `License`/`LICENSE` покрыты явно; кириллический `Лицензия` — отдельно. Source of truth для license — файл `LICENSE` + GitHub repo settings, не README. ## Альтернативы - **Не валидировать license** (status quo) — оставляет дубликаты, расходится с принципом "README = только showcase-контент, метаданные — в GitHub". - **Удалять `## License` автоматически в create-режиме** — слишком магически; валидатор + явная правка надёжнее и прозрачнее для аудита. - **Через `includes("## License")`** вместо regex — словило бы `## License` в любом контексте и `### Subsection under License`, плюс false-positive на упоминания. Regex с `^...$` + `m`-флагом точнее. ## Известные последствия (backward compatibility) Новый license-check помечает `invalid` существующие README других репо slaid098, где есть ручной `## License`/`## Лицензия`. Это intentional — такие README регенерируются/чищутся отдельным шагом после merge (зафиксировано в handoff, секция Pending).