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
+32
View File
@@ -155,3 +155,35 @@ ROWID` строка целиком, вместе со сжатым `payload`, ж
массивов); при равных наборах выигрывает версия из более поздней доставки
журнала, а не свёрнутая последней. Подробности и обоснование — в
`architecture.md`, раздел «Тренировки и прочие секции».
## Представление данных
- **Точки часового объекта лежат сжатым BLOB** (`gzip`) в колонке `payload`.
Чтение объекта распаковывает его **целиком**: частичного доступа к точке нет,
и любая правка — read-modify-write всей пачки. Отсюда цена широкой доставки:
63 МиБ на одной координате держат транзакцию 5.15 с, а тело 40 МиБ давало
768 МиБ пика кучи, пока канонизация шла внутри транзакции.
- Таблицы часовых объектов — `WITHOUT ROWID`: строка целиком, вместе со сжатым
`payload`, живёт в дереве первичного ключа. Поэтому агрегатные запросы идут
по покрывающему индексу `bucket_catalog`, а не по таблице.
- Тела доставок в базе не лежат вовсе — они в сыром архиве
(`<archive_dir>/raw/ГГГГ/ММ/ДД/<ulid>.json.gz`); в `delivery` только учёт.
## Настройки с числовым значением
Без них замер не превращается в находку: пик памяти — аномалия только рядом со
строкой «запись лежит сжатой и распаковывается целиком».
| Настройка | Значение | Где задана |
| --- | --- | --- |
| `journal_mode` | `WAL` | `internal/store/store.go`, строка соединения |
| `busy_timeout` | `5000` мс | там же; на устаревший снимок транзакции **не** действует |
| `foreign_keys` | `on` | там же |
| `journal_size_limit` | 64 МиБ | `internal/store/store.go`, `journalSizeLimit` |
| чекпойнт WAL по таймеру | 1 мин | `cmd/healthlog/checkpoint.go`, `checkpointInterval` |
| предел тела запроса | 64 МиБ (`ingest.max_body_mb`) | конфиг; **ретроактивен** — тем же пределом читаются тела из архива при пересборке |
| таймаут чтения запроса | 5 мин (`server.read_timeout`) | конфиг; щедро: экспорт истории по мобильной сети |
| таймаут отправки ответа | 30 с (`server.write_timeout`) | конфиг; маршрут приёма держит собственный бюджет |
| бюджет остановки | 30 с | `cmd/healthlog/serve.go`, `shutdownTimeout` |
| ретеншен сырого архива | до следующего проверенного экспорта (~2 ГБ за квартал) | правило, а не число; не реализован — задача `raw-archive-retention` |
| предела на одну сущность | **нет** | задача `entity-size-limits` |