каталог задач уехал из docs/ в корень репозитория

Версия 8 отпустила задачи из канона — перестала требовать каталог и перестала в
него смотреть, — но место он занимал всё то же, docs/tasks/. Полдела: каталог,
принадлежащий одному плагину, лежал внутри дерева, которым владеет другой.
Проекту, поставившему учёт работ без канона документов, приходилось заводить
docs/ ради одной вложенной папки.

Дом задач теперь tasks/ в корне. tasks.py ищет его там первым, docs/tasks и
doc/tasks остались в списке поиска для непереехавших проектов, init заводит
только в корне, --target у adopt тоже. Настройки лежат рядом, tasks/.tasks.json —
после версии 8 они уже были в своём файле, теперь и файл вне чужого дерева.

docs.py продолжает терпеть docs/tasks/ в списке нечитаемого: непереехавший проект
не должен получать выдуманную ошибку «файл вне канона» вдобавок к записи журнала,
которая и так велит ему переехать. Адреса упразднённых слотов (plan.md, backlog/)
теперь ведут в tasks/ и называют плагин.

Тридцать три живых упоминания пути разведены по смыслу, а не заменой строки: в
раскладке канона tasks/ вышел из-под docs/ и стоит на своём уровне; у
doc-consistency каталог перестал быть исключением внутри docs/** и стал чужой
территорией, названной в обеих формах; у review-scope и review-pipeline
процессный список поехал вместе с путём. В журнале версий тринадцать упоминаний
оставлены как есть — они описывают прошлое состояние.

Канон повышен до версии 11. В записи названа тихая часть переезда: файл
tasks/items/x.md стал на уровень ближе к корню, и ../../passport.md в теле записи
теперь ../docs/passport.md. Битую относительную ссылку внутри записи tasks.py
check не ловит вовсе — её видит только docs.py и только у документов канона, так
что этот шаг делается руками и тем же коммитом, что git mv.

Фикстура переехала, поиск вверх по дереву находит новый путь, гейт зелёный.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-09 14:33:33 +03:00
co-authored by Claude Opus 5
parent fdadfb65ac
commit f40e0cd7bb
13 changed files with 91 additions and 53 deletions
+6 -6
View File
@@ -75,8 +75,8 @@ docs/
adr.md | adr/ почему решено так; статусы, правило замены
review.md | review/ настройка конвейера под проект + журнал дефектов
<своя тема>.md | <своя тема>/ всё, что проект счёл нужным проверять
tasks/ каталог задач — плагин av-dev-tasks, не канон:
место зарезервировано, наличия канон не требует
tasks/ каталог задач — плагин av-dev-tasks, не канон;
лежит в корне, вне docs/, и канон его не требует
openspec/
config.yaml только нужды генерации артефактов + ссылки
specs/<capability>/spec.md что система делает — нормативно
@@ -456,7 +456,7 @@ kebab-case.** Причина не эстетическая: имя файла с
| почему решено так | `adr/`, источник — архивный `design.md` |
| граница домена, «чем не является» | `passport.md` |
| инвариант и его severity | `CLAUDE.md` |
| что приложение умеет и чего не умеет; порядок работ | `docs/tasks/ROADMAP.md` |
| что приложение умеет и чего не умеет; порядок работ | `tasks/ROADMAP.md` |
| измеренное число | `research/` |
| настройка с числовым значением | `database.md` |
| периметр и модель угроз | `security.md` |
@@ -491,9 +491,9 @@ kebab-case.** Причина не эстетическая: имя файла с
| `docs/review-brief.md` | документы канона и есть бриф; остаток — в `review.md` |
| `docs/specs/` | `openspec/specs/` (поведение) и `architecture.md` (обзор) |
| `docs/drafts/` | идея → запись `research`; отказ → ADR; порядок → `ROADMAP.md`; размышление → `opsx:explore` |
| `docs/plan.md` | `docs/tasks/ROADMAP.md` |
| `docs/plan.md` | `tasks/ROADMAP.md` |
| `BRIEF.md` | `passport.md` |
| `docs/backlog/` | `docs/tasks/` |
| `docs/backlog/` | `tasks/` в корне репозитория |
| `docs/review-journal.md`, `docs/review/journal.md` | `docs/review.md` |
## Что проверяет машина, а что человек
@@ -539,7 +539,7 @@ kebab-case.** Причина не эстетическая: имя файла с
```json
{
"canon": 10,
"canon": 11,
"migrations": "internal/store/migrations"
}
```
@@ -13,6 +13,37 @@ upgrade` идёт по записям снизу вверх от версии п
---
## Версия 11 — 2026-08-09
Каталог задач уехал из `docs/` в корень репозитория. Версия 8 отпустила его из
канона — перестала требовать, перестала проверять, — но место он занимал всё то
же, `docs/tasks/`. Полдела: каталог, принадлежащий одному плагину, лежал внутри
дерева, которым владеет другой. Проекту, поставившему учёт работ без канона
документов, приходилось заводить `docs/` ради одной вложенной папки.
**Что изменилось.** Дом задач — `tasks/` в корне репозитория. `tasks.py` ищет его
там первым; `docs/tasks/` и `doc/tasks/` остаются в списке поиска для
непереехавших проектов, а `init` заводит только в корне. Настройки — там же,
`tasks/.tasks.json`.
**Что осталось терпимым.** `docs.py` по-прежнему не считает `docs/tasks/` файлом
вне канона: непереехавший проект не должен получать выдуманную ошибку вдобавок к
этой записи, которая и так велит ему переехать.
**Что сделать проекту.**
1. `git mv docs/tasks tasks` — одним коммитом вместе с шагом 2, чтобы ссылки не
жили битыми между коммитами.
2. **Починить относительные ссылки внутри записей.** Файл `tasks/items/x.md`
стал на уровень ближе к корню: `../../passport.md` в теле записи теперь
`../docs/passport.md`. Тот же сдвиг у ссылок из индексов. Это самая тихая
часть переезда: битая относительная ссылка не мешает `tasks.py check`, её
ловит только `docs.py check` и только у документов канона.
3. Проверить ссылки **на** задачи снаружи: `CLAUDE.md`, `README.md`, гейт,
`docs/review.md`. Путь `docs/tasks/...` в них теперь ведёт в никуда.
4. Поправить путь в гейте: `tasks.py check --dir tasks`.
5. `docs/.pm.json`: `"canon": 11`.
## Версия 10 — 2026-08-09
Проверка формы `config.yaml` ушла к тому, кто файл заводит. Версия 9 перенесла в
@@ -431,7 +431,7 @@ severity стоит здесь, а не выводится каждым прох
```json
{
"canon": 10
"canon": 11
}
```
+13 -10
View File
@@ -25,7 +25,7 @@ from dataclasses import dataclass, field
from pathlib import Path
from typing import NoReturn
CANON_VERSION = 10
CANON_VERSION = 11
OK, DRIFT, USAGE, ENV, INTERNAL = 0, 1, 2, 3, 4
@@ -76,12 +76,15 @@ DOC_EXTRA = {
"adr": {"template.md": "шаблон записи ADR"},
}
# Служебное в docs/ и каталог задач. Формы у них скрипт не проверяет, и по разным
# причинам: `.pm.json` не markdown, а `tasks/` **принадлежит другому плагину** —
# `av-dev-tasks`, со своим скриптом, своим конфигом и своей версией формата.
# Канон резервирует за ним место в `docs/`, но наличия не требует и внутрь не
# смотрит: проект, поставивший только этот плагин, задач не ведёт вовсе, и
# отказом это быть не может.
# Служебное в docs/ и каталог задач, оставшийся там от прежней раскладки. Формы
# у них скрипт не проверяет, и по разным причинам: `.pm.json` не markdown, а
# задачи **принадлежат другому плагину** — `av-dev-tasks`, со своим скриптом,
# своим конфигом и своей версией формата.
#
# Дом задач с версии 11 — `tasks/` в корне репозитория, то есть вне `docs/`
# вовсе. `docs/tasks/` здесь терпится потому, что непереехавший проект не должен
# получать «файл вне канона» вдобавок к записи журнала, которая и так велит ему
# переехать. Внутрь скрипт не смотрит ни в том, ни в другом случае.
NOT_DOCS = {".pm.json", "tasks"}
# Слоты, которых в каноне нет, — с адресом, куда уезжает содержимое. Имена,
@@ -90,11 +93,11 @@ NOT_DOCS = {".pm.json", "tasks"}
RETIRED = {
"review-brief.md": "документы канона и есть бриф; остаток — в review",
"review-journal.md": "→ документ review",
"plan.md": "docs/tasks/ROADMAP.md",
"plan.md": "→ tasks/ROADMAP.md (плагин av-dev-tasks)",
"local-research.md": "→ документ research",
"specs": "поведение → openspec/specs/, обзор → тема architecture",
"drafts": "идея → запись research, отказ → ADR, порядок → ROADMAP.md",
"backlog": "docs/tasks/",
"backlog": "tasks/ в корне репозитория (плагин av-dev-tasks)",
}
# --- Слаги в именах файлов --------------------------------------------------
@@ -211,7 +214,7 @@ def strip_code(text: str) -> str:
"""Выкинуть блоки кода и вставки в обратных кавычках.
Путь в примере или в шаблоне — не ссылка, и краснеть на нём значит краснеть
на каждом образце документа. Инлайн-код тоже: `[docs/backlog](docs/tasks/…)`
на каждом образце документа. Инлайн-код тоже: `[docs/backlog](tasks/…)`
в тексте про подписи ссылок — иллюстрация, а не ссылка."""
out, inside = [], False
for line in text.splitlines():
+1 -1
View File
@@ -26,7 +26,7 @@ description: "Завести новый проект — сессия вопро
| `passport.md` | `architecture.md` |
| `CLAUDE.md` | `database.md` |
| `security.md` | `conventions/` |
| `docs/tasks/ROADMAP.md` — первые цели | `research/`, `adr/` |
| `tasks/ROADMAP.md` — первые цели | `research/`, `adr/` |
| `docs/.pm.json` | `review.md` — журнал пуст, настройка появится с первым ревью |
Честная строка информативна, а не «TBD»: «архитектуры пока нет: кода нет,