Skip to content

Русский | English

Чего стоит проекция состояния и почему каждый вид остаётся ​

Markdown-дерево tausik/ — это 68,6% путей под git в этом репозитории. Страница называет, что это даёт, чего это стоит и что решено по каждому виду. Замерено, потому что история, поставившая вопрос, ошиблась дважды.

Перемерить в любой момент:

bash
python scripts/projection_census.py --db .tausik/tausik.db

Замер ​

ВидФайловБайтСреднийДоля байт дерева
tasks174411 933 248684239,1%
memory7651 465 33119154,8%
decisions401655 17116332,1%
stories297102 4673450,3%
epics10936 7863370,1%
graph-snapshots1157 751157 7510,5%
проекция331714 350 75447,1%
дерево под git483230 484 187100%

Ещё два числа из того же дерева:

  • Журналы — 47,8% байт файлов задач (5,7 МБ). Остальное — front matter, цель и критерии приёмки, то есть форма строки. Журнал — та часть, которую двигает привычка писать.
  • За всю историю проекция — 48,7% касаний файлов, но 14,8% строкового churn. Её переписывают постоянно, и каждый раз она меняется мало.

В чём ошиблась догадка ​

История про гигиену планировала срезать мягкой архивацией старых done-задач проекцию, «занимающую 69% дерева». Неверны обе половины.

  1. Архивация проекцию не трогает. state_export выбирает FROM tasks без фильтра archived_at. Архивация прячет задачу из task list; файл остаётся.
  2. Достижимый потолок — 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% байт задач. Это привычка с тормозом, и это другой механизм, нежели порог на итог.

Храповика на долю проекции намеренно нет. Каждая закрытая задача добавляет файл, поэтому порог на итог пересекала бы обычная работа, — а порог, который пересекает обычная работа, кто-нибудь выключает вместе с замером. Перепись отчитывается и никогда не роняет сборку.

См. также ​