Русский | English
Чего стоит проекция состояния и почему каждый вид остаётся
Markdown-дерево tausik/ — это 68,6% путей под git в этом репозитории. Страница называет, что это даёт, чего это стоит и что решено по каждому виду. Замерено, потому что история, поставившая вопрос, ошиблась дважды.
Перемерить в любой момент:
python scripts/projection_census.py --db .tausik/tausik.dbЗамер
| Вид | Файлов | Байт | Средний | Доля байт дерева |
|---|---|---|---|---|
tasks | 1744 | 11 933 248 | 6842 | 39,1% |
memory | 765 | 1 465 331 | 1915 | 4,8% |
decisions | 401 | 655 171 | 1633 | 2,1% |
stories | 297 | 102 467 | 345 | 0,3% |
epics | 109 | 36 786 | 337 | 0,1% |
graph-snapshots | 1 | 157 751 | 157 751 | 0,5% |
| проекция | 3317 | 14 350 754 | 47,1% | |
| дерево под git | 4832 | 30 484 187 | 100% |
Ещё два числа из того же дерева:
- Журналы — 47,8% байт файлов задач (5,7 МБ). Остальное — front matter, цель и критерии приёмки, то есть форма строки. Журнал — та часть, которую двигает привычка писать.
- За всю историю проекция — 48,7% касаний файлов, но 14,8% строкового churn. Её переписывают постоянно, и каждый раз она меняется мало.
В чём ошиблась догадка
История про гигиену планировала срезать мягкой архивацией старых done-задач проекцию, «занимающую 69% дерева». Неверны обе половины.
- Архивация проекцию не трогает.
state_exportвыбираетFROM tasksбез фильтраarchived_at. Архивация прячет задачу изtask list; файл остаётся. - Достижимый потолок — 19%, а не 69%. Условию «done и старше 90 дней» отвечают 917 файлов задач — 2,7 МБ, 19,0% путей под git. Даже фильтр, убравший бы их все, оставил бы проекцию на половине дерева.
Почему удаление вообще не обсуждается
.tausik/tausik.db в .gitignore. Markdown-дерево — единственный носитель состояния между машинами: строка, выброшенная из дерева, — это строка, которой свежий клон никогда не увидит. Спрятать задачу из списка и удалить её запись — разные действия, и архивация сделана ради первого. tests/test_projection_census.py::TestTheTreeIsTheOnlyCarrier закрепляет оба факта: если база когда-нибудь начнёт ездить вместе с деревом, это решение надо принимать заново, а не наследовать.
Вердикт по каждому виду
| Вид | Вердикт | Почему |
|---|---|---|
tasks | остаётся | Дерево — единственный носитель; выброс архивных строк потерял бы 917 задач на свежем клоне. Журнал — доказательство, что закрытие было, то есть ровно та запись, которой требует SENAR. |
memory | остаётся | Тот же довод носителя. На экспорте память уже фильтрует archived_at IS NULL: спрятанное спрятано, сохранённое едет. |
decisions | остаётся | 2,1% дерева и то, что свежий агент читает чаще всего. Выигрывать нечего. |
stories | остаётся | 0,3% байт. Удаление стоило бы дороже в ревью, чем экономит на checkout. |
epics | остаётся | 0,1% байт. То же самое. |
graph-snapshots | остаётся | Один gzip-файл на релиз, хранится намеренно как «снимок до». Самый крупный отдельный файл проекции — и всё равно полпроцента дерева. |
Рычаг, который существует
Рост ограничен в точке записи, а не удалением: бюджет журнала советует на каждой записи task log, а журналы — это 47,8% байт задач. Это привычка с тормозом, и это другой механизм, нежели порог на итог.
Храповика на долю проекции намеренно нет. Каждая закрытая задача добавляет файл, поэтому порог на итог пересекала бы обычная работа, — а порог, который пересекает обычная работа, кто-нибудь выключает вместе с замером. Перепись отчитывается и никогда не роняет сборку.
См. также
- Спецификация архива задач — что архивация делает и чего не делает, и единственная команда назад.
- Архитектура — где стоит экспортёр.