You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
✅ Разблокирован (2026-07-14): эпик #362 закрыт (PR #387) — предусловие снято, работы этого эпика можно начинать.
Цель
Устранить накопившийся дрейф Markdown-документации: привести все *.md в
соответствие с кодом на main, дозаполнить незавершённый переход на v1.8.0,
починить фактические ошибки, актуализировать архитектурные каноны и поставить
CI-барьер против повторения.
Источник
Разовый аудит всех 34 tracked-файлов *.md (~8 900 строк), срез origin/main после PR #380 (тег v1.8.0 от 2026-07-14 + 10 смерженных PR).
Метод: перекрёстная сверка с кодом по file:line, сверка статусов issue/PR с
GitHub API, механическая проверка ссылок/якорей/сирот, подсчёт тестов в
изолированном Python 3.12-окружении.
Сводка находок
Вес
Кол-во
🔴 Критично
3
🟠 Средне
24
⚪ Мелко
18
🟣 Сопутствующее в коде
6
Вердикт: документация в целом жива (все ссылки/якоря валидны, CHANGELOG
дисциплинирован, docs/api.md в полном паритете с кодом), но есть: (1) одна
незакрытая релизная дыра v1.8.0, (2) пласт свежего дрейфа от волны эпика #342,
(3) сильно отставший docs/architecture.md, (4) точечные фактические ошибки,
(5) два «мёртвых» документа.
Ключевые находки по группам
1. Незакрытый релиз v1.8.0
Релизный PR #361 обновил только CHANGELOG/CHECKPOINT/CLAUDE/history и не тронул:
🔴 docs/versions.md:28–38 — таблица «Эволюция версий» кончается колонкой v1.7.0, колонки v1.8.0 нет; при этом history.md:393 объявляет
versions.md «каноническим живым источником» метрик — канон отстал от архива,
CI это не проверяет.
2. Дрейф после эпика #342 (история/правила/lint/insights)
🟠 Меню теперь 0–5 («5. Подучить», cli/interactive.py:245), но «режимы
0-4» осталось в CLAUDE.md:84, architecture.md:16, project-structure.md:16,
скриншот меню grader-workflow.md:37–48 без пункта 5. Бонус (код): промпт core/locales/ru.json:60,65 всё ещё «[0-4]».
🟠 web-current.md противоречит сам себе: «четыре раздела» (:41, :325,
ASCII-схема :318) vs «шесть» (:113).
🟠 configuration.md:76 «Полный список параметров» без трёх ключей insights_* (config.py:66–68), за которыми rules-insights.md:106 шлёт
именно сюда.
🟠 README отстал на ~3 релиза: секция «Безопасность» (:103–110) без
opt-in --sandbox; фич-лист (:26–44) без --stats/--history/--insights/ --lint/глоссария.
🟠 grader-workflow.md:265 + код options.py:103 — неверное имя пакета stepik-grader[watch] (правильно stepik-python-grader).
🟠 «Док опережает код»: поле lint в result-contract.md:120 ни один
продюсер не создаёт; заявленная запись lint в историю не реализована
(LintRecord нигде не конструируется) — категория «lint» в «Подучить»
недостижима.
Guard-скрипты покрывают форму, не содержание: check_version_consistency.py
(pyproject/CHECKPOINT-маркер/CHANGELOG-заголовок/CLAUDE-строка) и check_docs_guardrails.py (README ≤220, ссылки+якоря, «каждый docs/*.md в
README», ≤3 версий в CHANGELOG). Слепые зоны:versions.md не проверяется
вообще; проза CHECKPOINT, статусы issue, метрики и счётчики — невидимы.
Дочерние issue (порядок = рекомендуемый порядок реализации)
Примечание: после PR #387 (#362) в web-current.md/app.js/index.html снова
изменилось поведение web («Настройки» с выбором языка ?lang=, режимы 3/4,
«Разбор») — учесть в #383/#385 при синхронизации доков.
Acceptance criteria (эпика)
docs/versions.md содержит колонку последнего релиза; ни один док не
называет прошлый релиз актуальным
Число пунктов меню (0–5) и набор web-разделов согласованы во всех доках и
локалях кода
Все ключи GraderConfig документированы в configuration.md
docs/architecture.md и project-structure.md содержат все модули и рёбра
DAG, подтверждённые импортами; ложных клеймов нет
Фактические ошибки из § 4 исправлены (либо код приведён к доку по lint)
CI ловит отсутствие колонки последнего релиза в versions.md
Цель
Устранить накопившийся дрейф Markdown-документации: привести все
*.mdвсоответствие с кодом на
main, дозаполнить незавершённый переход на v1.8.0,починить фактические ошибки, актуализировать архитектурные каноны и поставить
CI-барьер против повторения.
Источник
Разовый аудит всех 34 tracked-файлов
*.md(~8 900 строк), срезorigin/mainпосле PR #380 (тег v1.8.0 от 2026-07-14 + 10 смерженных PR).Метод: перекрёстная сверка с кодом по
file:line, сверка статусов issue/PR сGitHub API, механическая проверка ссылок/якорей/сирот, подсчёт тестов в
изолированном Python 3.12-окружении.
Сводка находок
Вердикт: документация в целом жива (все ссылки/якоря валидны, CHANGELOG
дисциплинирован,
docs/api.mdв полном паритете с кодом), но есть: (1) однанезакрытая релизная дыра v1.8.0, (2) пласт свежего дрейфа от волны эпика #342,
(3) сильно отставший
docs/architecture.md, (4) точечные фактические ошибки,(5) два «мёртвых» документа.
Ключевые находки по группам
1. Незакрытый релиз v1.8.0
Релизный PR #361 обновил только CHANGELOG/CHECKPOINT/CLAUDE/history и не тронул:
docs/versions.md:28–38— таблица «Эволюция версий» кончается колонкойv1.7.0, колонки v1.8.0 нет; при этом
history.md:393объявляетversions.md «каноническим живым источником» метрик — канон отстал от архива,
CI это не проверяет.
CHECKPOINT.md:79— «CHANGELOG § [1.7.0]» при snapshot v1.8.0;:88–96числит закрытый [Epic][PR-7] SQLite persistence: история запусков и учебные данные #130 «открытым фронтом».2. Дрейф после эпика #342 (история/правила/lint/insights)
cli/interactive.py:245), но «режимы0-4» осталось в
CLAUDE.md:84,architecture.md:16,project-structure.md:16,скриншот меню
grader-workflow.md:37–48без пункта 5. Бонус (код): промптcore/locales/ru.json:60,65всё ещё «[0-4]».web-current.mdпротиворечит сам себе: «четыре раздела» (:41, :325,ASCII-схема :318) vs «шесть» (:113).
configuration.md:76«Полный список параметров» без трёх ключейinsights_*(config.py:66–68), за которымиrules-insights.md:106шлётименно сюда.
opt-in
--sandbox; фич-лист (:26–44) без--stats/--history/--insights/--lint/глоссария.3. Отставший
docs/architecture.mdcore/diag_log.py(feat(logging): эпик #146 — opt-in диагностическое логирование сети/OAuth с редакцией секретов #341),
core/tracer.py(feat(core): трассировщик пошагового исполнения — sys.settrace → JSON-трейс #318),web/playground.py(feat(web): песочница MVP — редактор + stdin + вывод, запуск без тест-кейсов #317),web/rules_adapter.py,web/insights_adapter.py(feat(web): API разделов «Правила»/«Подучить» — /api/rules, /api/insights (часть #348) #379). Плюс ~15недостающих рёбер DAG и 2 фактические ошибки (несуществующий
web/locales/на :32/:111; ложный leaf-клейм
rules/на :51; фантомное реброgrader_core → sandboxна :112).4. Фактические ошибки (док ≠ код)
logging.md:34— «--verboseвключает диагностику» — не включает(только
--diagnostic,cli/__init__.py:415); собьёт пользователя.server-mode.md:148— «статуса отмены нет», хотяcancelledесть (feat(web): отдельный статус "cancelled" в /api/v1/runs — решить до заморозки контракта #296).grader-workflow.md:265+ кодoptions.py:103— неверное имя пакетаstepik-grader[watch](правильноstepik-python-grader).lintвresult-contract.md:120ни одинпродюсер не создаёт; заявленная запись lint в историю не реализована
(
LintRecordнигде не конструируется) — категория «lint» в «Подучить»недостижима.
5. Статусы, противоречия, мёртвые доки
docs/README.md:30подаёт закрытые issue как «будущие задачи»;CLAUDE.mdпротиворечит сам себе про feat(version): различать dev и release в выводе --version #163 (:181 vs :273)..github/несут отменённую политику «CHANGELOG при завершениифичи» вместо «в каждом PR» (docs(changelog): политика краткости записей + ротация старых версий в архив #373).
docs/claude-handoff.mdмёртв как task-list (все постановки закрыты);docs/audit-2026-07.md— все P0/§9 реализованы, но внутри не помечено.Что в порядке (не трогаем)
Ссылки/якоря (все 453 валидны), ротация CHANGELOG,
docs/api.md(полныйпаритет с кодом),
result-contract.md(кромеlint),SECURITY.md,trace-format.md, форматы тест-кейсов, leaf-инварианты CLAUDE.md, счётчикиглоссария (581/832/28).
Почему CI это пропускает
Guard-скрипты покрывают форму, не содержание:
check_version_consistency.py(pyproject/CHECKPOINT-маркер/CHANGELOG-заголовок/CLAUDE-строка) и
check_docs_guardrails.py(README ≤220, ссылки+якоря, «каждый docs/*.md вREADME», ≤3 версий в CHANGELOG). Слепые зоны:
versions.mdне проверяетсявообще; проза CHECKPOINT, статусы issue, метрики и счётчики — невидимы.
Дочерние issue (порядок = рекомендуемый порядок реализации)
insights_*, витрины, README,--history/--diagnostic)--verbose, server-modecancelled, имя пакета, api.md, trace-format, ADR, шаблоны) + wiringlintarchitecture.md+project-structure.mdversions.md, релизный чеклист, архивацияclaude-handoff, банерaudit-2026-07)Acceptance criteria (эпика)
docs/versions.mdсодержит колонку последнего релиза; ни один док неназывает прошлый релиз актуальным
локалях кода
GraderConfigдокументированы вconfiguration.mddocs/architecture.mdиproject-structure.mdсодержат все модули и рёбраDAG, подтверждённые импортами; ложных клеймов нет
lint)versions.mdclaude-handoff.mdзаархивирован/помечен; входящие ссылки поправлены