канон 13: файл версии зовётся по владельцу, у задач появилась своя версия формата
Имя `.pm.json` пережило плагин `av-dev-pm` на два месяца и указывало в пустоту. Правило, которое из этого вынуто: имя служебного файла — имя плагина, который его завёл, и по нему же владельца узнают. - `docs/.pm.json` → `docs/.docs.json`, запись 13 журнала. Прежнее имя docs.py не читает намеренно: по этому числу upgrade решает, какие записи применять, и два дома разъехались бы молча ровно там, где это дороже всего. Вместо совместимости — узнавание: check видит старый файл и печатает готовую git mv - у каталога задач появилась своя версия формата — ключ `tasks` в `.tasks.json`, свой журнал версий и своё повышение. До сих пор её не было вовсе, хотя docs.py в комментарии уверенно на неё ссылался: описание опережало механику ровно так, как сказано в решении 195 - число своё, а не копия канонического: плагин ставится в одиночку, и у проекта без docs/ версии канона нет — сверять было бы не с чем - конфиг задач стал обязательным (init и adopt apply пишут его всегда), check сверяет число, `check --fix` его не приписывает: приписанное объявляло бы каталог приведённым к формату, шагов которого никто не делал - переезды 11 и 12 в новый журнал задним числом не переписаны — версия 1 велит догнать формат по журналу канона, называя признаки отставания поимённо (каталог в docs/tasks/, живой SPRINT.md) - запись 60 в DECISIONS со следствиями 200–203; отдельно разведено с решением F, где `.docs.json` отвергался как указатель путей: отвергнут был указатель, а не имя
This commit is contained in:
@@ -57,6 +57,7 @@ OWNERS = {
|
||||
# Адрес, верный на момент записи, здесь останется навсегда, и это не дрейф.
|
||||
JOURNALS = {
|
||||
"av-dev-docs/skills/canon/references/changelog.md": "журнал версий канона",
|
||||
"av-dev-tasks/skills/tasks/references/changelog.md": "журнал версий формата задач",
|
||||
"DECISIONS.md": "журнал решений",
|
||||
"HISTORY.md": "журнал работ",
|
||||
"NOTES.md": "рабочие заметки",
|
||||
@@ -102,7 +103,7 @@ def stem(name: str) -> str:
|
||||
"""Имя документа без формы: файл, каталог и `.*` — один и тот же адрес.
|
||||
|
||||
Форму дома канон оставляет проекту: `docs/security.md` и `docs/security/`
|
||||
называют одно. Скрытые имена (`.pm.json`) остаются как есть — точка в них
|
||||
называют одно. Скрытые имена (`.docs.json`) остаются как есть — точка в них
|
||||
не расширение.
|
||||
"""
|
||||
name = name.rstrip(".")
|
||||
@@ -119,7 +120,7 @@ def vocabularies(root: Path) -> tuple[dict[str, set[str]], dict[str, str]]:
|
||||
docs_names = {stem(n) for n in docs.DOCS}
|
||||
docs_names |= {stem(n) for n in docs.CONDITIONAL_DOCS}
|
||||
docs_names |= {stem(n) for n in docs.NOT_DOCS}
|
||||
# `docs/.pm.json` объявлен обязательным файлом вне раскладки.
|
||||
# `docs/.docs.json` объявлен обязательным файлом вне раскладки.
|
||||
docs_names |= {stem(Path(p).name) for p in docs.REQUIRED if p.startswith("docs/")}
|
||||
|
||||
tasks_names = {stem(tasks.DEFAULTS[k]) for k in tasks.PATH_KEYS}
|
||||
@@ -201,7 +202,7 @@ def main() -> int:
|
||||
if own_themes:
|
||||
print(f"Имён вне перечня {len(own_themes)}, и они **не судятся** —"
|
||||
f" список тем открытый: {', '.join(sorted(own_themes))}.")
|
||||
print(f"Не проверялось: журналы ({len(JOURNALS)} файла — они описывают"
|
||||
print(f"Не проверялось: журналы ({len(JOURNALS)} шт. — они описывают"
|
||||
f" прошлые состояния), адреса `openspec/*` (раскладка чужого"
|
||||
f" инструмента, у нас владельца нет), упоминания в комментариях"
|
||||
f" скриптов — сверяется только markdown.")
|
||||
|
||||
Reference in New Issue
Block a user