docs: документы подняты на канон 7

- review.md переведён на словарь меток: вопросы адресованы темам, триггеры
  профиля стали триггерами метки в три списка, quick/standard/wide → small/
  medium/large, профиль deep упразднён
- openspec/config.yaml переписан по канонической форме: адреса passport и
  CLAUDE.md вместо пересказа правил ревью и конвенций
- разобраны находки doc-consistency и doc-code-drift: исключение инварианта
  сверено со спеками, единая точка времени и таблица classifyErr дополнены,
  MaxTorrentSize получил дом в database.md
This commit is contained in:
av
2026-08-07 13:01:23 +03:00
parent b450ab1fd5
commit b879c049ea
11 changed files with 174 additions and 143 deletions
+23 -17
View File
@@ -40,8 +40,12 @@ Go 1.26, один статический бинарь (`CGO_ENABLED=0`). Module
последней копии там выключен сознательно
([state-reconciliation](openspec/specs/state-reconciliation/spec.md));
(2) уборка воркером **собственного** торрента, добавленного этим же `add`
секундами ранее, когда задачу отменили в окне после `add`
([download-tracking](openspec/specs/download-tracking/spec.md)). Всё
секундами ранее, когда закрытие **любым** путём (`Cancel` или `Dismiss`)
увело задачу из `catched` в окне после `add` — уборка привязана к состоянию,
а не к команде; признак «своё» даёт подтверждённое отсутствие инфохэша
непосредственно перед `add`
([download-tracking](openspec/specs/download-tracking/spec.md),
[state-reconciliation](openspec/specs/state-reconciliation/spec.md)). Всё
остальное под `paths.downloads` — по-прежнему `critical`.
- **Последняя копия не снимается** — `Undo` отклоняется целиком, если у цели не
осталось других жёстких ссылок (`nlink <= 1`) или исходного файла уже нет.
@@ -108,7 +112,8 @@ Go 1.26, один статический бинарь (`CGO_ENABLED=0`). Module
- `govulncheck` даёт `WARN`, а не `FAIL`: находка тут — состояние
зависимостей, а не диффа. Разбирает агент ревью по трассам вызовов.
- `-race` без gcc уходит в `SKIP` с явным «гонки НЕ проверены» — тогда их
проверяет проход `ops` рассуждением, и это идёт в границы покрытия.
проверяет рассуждением тема `operations` ([docs/review.md](docs/review.md)
→ «Вопросы по темам»), и это идёт в границы покрытия.
- Ничего не гоняется против **живого** qBittorrent, LLM и метабаз:
интеграционные тесты за env-гейтами, запускает человек вручную.
- Качество распознавания гейтом не проверяется вовсе и проверяться не будет:
@@ -140,7 +145,8 @@ Go 1.26, один статический бинарь (`CGO_ENABLED=0`). Module
- **Необратимое** (спрашивается у человека всегда): всё, что пишет в
`paths.downloads` или удаляет оттуда; удаление раздачи из qBittorrent вместе
с файлами (`Delete`) — кроме уборки собственного, только что добавленного
торрента при отмене (см. исключения инварианта выше); снятие последней копии
торрента, когда закрытие любым путём увело задачу из `catched` (см.
исключения инварианта выше); снятие последней копии
данных; правка уже применённой миграции; `git push --force`; удаление или
перезапись файла в библиотеке Jellyfin, которого мы не создавали.
- **Общий станок** — покрасневший `task gate` на `master` врывается в
@@ -155,30 +161,30 @@ Go 1.26, один статический бинарь (`CGO_ENABLED=0`). Module
(CLI `openspec`, v1.x). Сначала спецификация — потом код.
- `openspec/specs/<capability>/spec.md`**нормативный дом поведения**: что
система делает сейчас. Capability — это поведение или домен (`ingest`,
`recognition`, `file-layout`, `review`, `notifications`), а не пакет кода.
система делает сейчас. Capability — это поведение или домен системы, а не
пакет кода.
- `openspec/changes/<id>/` — предлагаемое изменение: `proposal.md`, `design.md`
(для нетривиальных), дельта-спеки (`ADDED`/`MODIFIED`/`REMOVED Requirements`),
`tasks.md`. После реализации change архивируется в
`openspec/changes/archive/`, дельты вливаются в `openspec/specs/`.
- `openspec/config.yaml` — только нужды генерации артефактов: язык, правила
именования capability, придирки валидатора.
именования capability, придирки валидатора — плюс адреса документов канона.
Пересказа этих документов там нет: второй дом факта расходится молча.
Поток работы — через слэш-команды `opsx:*`: `opsx:explore` (продумать),
`opsx:propose` (завести change), `opsx:apply` (реализовать tasks),
`opsx:sync`/`opsx:archive` (влить и архивировать).
Правила спек:
Правила спек — язык, именование capability и придирки валидатора — живут в
[openspec/config.yaml](openspec/config.yaml) (`context` и `rules`), оттуда их
читает порождение артефактов; здесь не дублируются. Перед коммитом change —
`openspec validate --strict`.
- Каждое `### Requirement` ОБЯЗАНО содержать литерал `SHALL` или `MUST`
иначе `openspec validate` падает.
- Структурные заголовки и ключевые слова — английские (`### Requirement:`,
`#### Scenario:`, `GIVEN/WHEN/THEN`, RFC 2119), остальной текст — русский.
- `openspec validate --strict` перед коммитом change.
Ревью — два чекпоинта: профиль `design` на предложении (после design/specs, ДО
кода) и ревью изменения после apply, до archive. Настройка конвейера под проект
и журнал дефектов — [docs/review.md](docs/review.md).
Ревью — два чекпоинта: ревью дизайна на предложении (после design/specs, ДО
кода) и ревью изменения после apply, до archive. Состав обоих выбирается по
метке задачи (`small` / `medium` / `large`), которую разметка ставит один раз
после propose. Настройка конвейера под проект и журнал дефектов —
[docs/review.md](docs/review.md).
## Документация