docs: документация переведена на канон av-dev-pm

- беклог и план переехали в docs/tasks (38 задач, 11 целей), слаги
  переименованы с транслита на английские, 85 ссылок поправлены
- conventions.md разобран в docs/conventions/, local-research.md — в
  docs/research/, review-journal.md — в docs/review.md с разделом настройки
  конвейера; заведены security.md, adr/ и .pm.json
- шаг docs.py check добавлен в task gate; поведение в architecture.md помечено
  девятью маркерами долга, database.md получил настройки с числовым значением
This commit is contained in:
av
2026-08-03 17:14:53 +03:00
parent de7b15d48c
commit d79189be18
94 changed files with 1234 additions and 566 deletions
@@ -187,7 +187,7 @@ JSON-массив имён (`["stateOfMind"]`), пустой список — `[
установившееся состояние половины потока (48 доставок из 99). Постоянный `WARN`
каждые пять минут обесценивает уровень ровно так же, как обесценило бы
сравнение с заголовком `Default`. Момент появления **новой** секции — отдельная
задача (`proverka-novyh-sekcij`), и она будет опираться на сохранённый список.
задача (`unseen-sections-check`), и она будет опираться на сохранённый список.
Имена идут структурным атрибутом (`[]string`), а не склейкой в строку: JSON-
кодировщик `slog` экранирует управляющие символы, поэтому имя из чужого тела не
@@ -54,5 +54,5 @@
- `internal/fold` — исход свёртки, статус и атрибут лога.
- `docs/database.md`, `docs/architecture.md`, `docs/local-research.md`
схема, статусы и находка о наборах секций в живом потоке.
- Ретеншен сырого архива (задача `retenshen-syrogo-arhiva`) получает признак,
- Ретеншен сырого архива (задача `raw-archive-retention`) получает признак,
на который ему можно опираться.
@@ -62,5 +62,5 @@
- [x] 6.2 `README.md`: строка про условный запрос в примерах чтения
- [x] 6.3 `docs/backlog`: задача снята, остаток (предел ответа, измеренная цена
первого запроса, готовая машинерия условного запроса) перенесён в
`read-api-tochki.md`; наблюдаемость — в `stats-nablyudaemost.md`, цена
ветки исчерпанного бюджета — в `ostanovka-i-migraciya-sledy.md`
`read-api-points.md`; наблюдаемость — в `stats-endpoint.md`, цена
ветки исчерпанного бюджета — в `shutdown-and-migration-traces.md`
@@ -135,7 +135,7 @@
- [x] 11.3 `docs/review-journal.md`: запись о чекпоинте кода без трёх проходов.
- [x] 11.4 Остатки заведены задачами беклога: NULL-метка; пределы размера
сущности и секции с потоковым расчётом; принцип отбора data-миграций;
строка про очередь `pending` — в `stats-nablyudaemost.md`.
строка про очередь `pending` — в `stats-endpoint.md`.
## 12. Приёмка
@@ -90,9 +90,9 @@
корпусе
- [x] 7.4 Блокер «тай-брейк при равной полноте точек» в беклог, с вариантами,
ценой и рекомендацией
- [x] 7.5 Пометка в `docs/backlog/read-api-tochki.md`: порог неполного ведра,
- [x] 7.5 Пометка в `docs/tasks/items/read-api-points.md`: порог неполного ведра,
его полярность и предел размера ответа решаются там
- [x] 7.6 Пометка в `docs/backlog/upravlenie-sekretami.md`: контуров теперь два
- [x] 7.6 Пометка в `docs/tasks/items/token-and-secret-management.md`: контуров теперь два
- [x] 7.7 Убрать задачу из беклога, обновить индекс
## 8. Дозакрыто по ревью кода
@@ -279,7 +279,7 @@ received_at > ? OR (received_at = ? AND id > ?) → SCAN … COVERING INDEX d
отвечать `200`.
Числа — текущая длина `pending`, возраст самой старой неразобранной доставки —
это `/stats`, и они уезжают строкой в задачу `stats-nablyudaemost`. Здесь их
это `/stats`, и они уезжают строкой в задачу `stats-endpoint`. Здесь их
нет намеренно: отдельного механизма счётчиков в проекте пока не существует.
### 6. Частичный индекс по неразобранным доставкам
@@ -388,7 +388,7 @@ write_timeout)`. Тогда `/healthz` и будущий Read API сохраня
- **Задолженность после рестарта разбирается не мгновенно** → 116 тел живого
архива это порядка минуты работы воркера; всё это время витрина неполна.
Названо `INFO`-строкой при старте. `/healthz` этого не отражает — он статичен;
отражать будет `/stats`, задача `stats-nablyudaemost`.
отражать будет `/stats`, задача `stats-endpoint`.
- **Второй процесс на той же базе даёт двух воркеров** → «одна горутина» —
свойство процесса, а не файла базы. Порчи витрины ждать не приходится
(`_txlock=immediate` и повтор транзакции сериализуют слияние), но наследование
@@ -401,7 +401,7 @@ write_timeout)`. Тогда `/healthz` и будущий Read API сохраня
только то, что параллельность стала штатной. `busy_timeout`,
`_txlock=immediate` и повтор транзакции уже есть, а исчерпание повторов теперь
не стирает доставку с полки (решение 4б). Наблюдение за этим — задача
`cena-sliyaniya-na-shirokoj-dostavke`.
`merge-cost-wide-delivery`.
- **Тик даёт проход раз в минуту при пустой очереди** → это один запрос по
покрывающему частичному индексу, в котором ноль строк. Цена измеримо нулевая,
а без него состояние «работа есть, прогресса нет» невидимо.
@@ -40,7 +40,7 @@
быстрого прохода, и одна строка `INFO` о размере задолженности при старте.
Метка считается на выборке прохода, а сам проход будит не только сигнал, но и
тик — иначе «работа есть, прогресса нет» неотличимо от пустого потока.
Счётчики в `/stats` — задача `stats-nablyudaemost`, здесь только метки в логе.
Счётчики в `/stats` — задача `stats-endpoint`, здесь только метки в логе.
- Убирается второй, оставшийся источник молчаливого обрыва: общий `write_timeout`
(30 с) меньше `read_timeout` (5 мин), а он покрывает и чтение тела — то есть
медленная загрузка 64 МиБ обрывается независимо от свёртки. Длинный бюджет
@@ -141,7 +141,7 @@
не память; порядок журнала и остановка; классификация «отказ доставки»
против «отказ обстоятельств»; бюджет ответа маршрута приёма; отвергнутые
варианты с причинами.
- [x] 9.2 Строка в задачу беклога `stats-nablyudaemost`: длина `pending`,
- [x] 9.2 Строка в задачу беклога `stats-endpoint`: длина `pending`,
возраст самой старой неразобранной доставки и то, что `/healthz` их не
отражает.
@@ -177,4 +177,4 @@
разбора, добавлен класс «отложено».
- [x] 10.11 Остаточный предел порядка при конкурентных приёмах назван в спеке и
в `docs/architecture.md`, вынут блокером
(`docs/backlog/poryadok-zhurnala-na-priyome.md`).
(`docs/tasks/items/journal-order-on-ingest.md`).
@@ -50,12 +50,12 @@ stateOfMind 26 и 26 копий, по 1 содержимому каждая
**Non-Goals:**
- **Отдача наружу.** Read API в проекте нет вовсе; форма конверта, выбор слоя и
предел размера ответа проектируются задачей `read-api-tochki`. Два эндпоинта,
предел размера ответа проектируются задачей `read-api-points`. Два эндпоинта,
введённые раньше конверта, задали бы контракт мимоходом.
- **Секции, которых поток не приносил** (`ecg`, `symptoms`, `cycleTracking`,
`medications`, `heartRateNotifications`). Модель под них закладывается —
таблица `record` ключуется родом секции, — но разбор не пишется вслепую: их
формы никто не видел, а задача `proverka-novyh-sekcij` существует ровно про
формы никто не видел, а задача `unseen-sections-check` существует ровно про
момент, когда они появятся.
- **Разворачивание маршрута** в таблицу точек — отдельная идея беклога, у неё нет
клиента.
@@ -158,7 +158,7 @@ stateOfMind 26 и 26 копий, по 1 содержимому каждая
что воркер сворачивает в порядке `(received_at, id)` только среди **видимых**
ему доставок, а абсолютного порядка при конкурентных приёмах не обещает
(`docs/architecture.md`, «Предел порядка назван вслух»; открытый блокер
`poryadok-zhurnala-na-priyome.md`). Доставка с более ранней меткой, свёрнутая
`journal-order-on-ingest.md`). Доставка с более ранней меткой, свёрнутая
позже, вернула бы витрину к недосчитанной версии — и `reindex` разошёлся бы с
живым приёмом **молча**, в содержимом тренировки. Поэтому сущность несёт
провенанс — `delivery_id` и `received_at` своей доставки, — а тай-брейк
@@ -315,7 +315,7 @@ verify:archive`. Оставить его отпечатком одних час
экспорта Apple, состояние разума нет (находка 46). До этой задачи защита
работала побочным эффектом непокрытости. Ретеншена в проекте нет, поэтому здесь
ничего не ломается сегодня; но предусловие, которое задача
`retenshen-syrogo-arhiva` считала снятым, снова открыто, и это записывается в
`raw-archive-retention` считала снятым, снова открыто, и это записывается в
её файл тем же изменением.
### 9а. Отказ разбора остаётся «всё или ничего» — теперь и для сущностей
@@ -39,7 +39,7 @@
записано в спеке хранения.
- **Не входит:** отдача тренировок и записей наружу. Read API в проекте пока нет
вовсе; его форма (конверт ответа, выбор слоя, предел размера) проектируется
задачей `read-api-tochki`, и вводить два эндпоинта раньше конверта значило бы
задачей `read-api-points`, и вводить два эндпоинта раньше конверта значило бы
задать контракт мимоходом.
## Capabilities
@@ -105,11 +105,11 @@
переприсылке (числа замера) и пересчёт находки 50 на 118 доставок
- [x] 7.4 Беклог: задача про идентичность тренировок при импорте родного
экспорта (в `export.xml` `id` нет — `dogsheep` считает hash_id);
`retenshen-syrogo-arhiva` — предусловие про `stateOfMind` снова открыто;
отметить в `read-api-tochki`, что отдача тренировок и записей входит в
неё; уточнить `proverka-novyh-sekcij` — модель заложена, остались пять
`raw-archive-retention` — предусловие про `stateOfMind` снова открыто;
отметить в `read-api-points`, что отдача тренировок и записей входит в
неё; уточнить `unseen-sections-check` — модель заложена, остались пять
секций
- [x] 7.5 Удалить `docs/backlog/trenirovki-i-zapisi.md` и строку индекса
- [x] 7.5 Удалить `docs/tasks/items/trenirovki-i-zapisi.md` и строку индекса
## 8. Приёмочные критерии (рубрика ревью)