Evict closed issues from the local store #20

Closed
opened 2026-08-10 11:41:01 +00:00 by claude · 0 comments
Collaborator

Summary

Закрытые issue остаются в сторе навсегда. Фильтр на pull не пускает новые, но
уже лежащие файлы не убирает никто, и вернуть их обратно на диск проще, чем
кажется.

Spec

none

Depends on

  • drop-the-local-copy-after-a-successful-push-and — там решается, стор это
    хранилище или кэш; от ответа зависит, чем эта задача вообще является

Motivation

skip-closed-issues-when-pulling-a-repository-in (claude-skills/tea#10,
закрыта) поставила фильтр на запись и явно вынесла чистку за рамки:
«существующие файлы стора не чистятся» — задача была про запись, не про
миграцию. Миграцию с тех пор никто не сделал, и своей issue у неё не было.

Дырки, через которые закрытые попадают и остаются:

  • Ключевой режим не фильтруется, и так и останется. pull.py:142
    drop_closed = filtered and args.state != "closed", а filtered истинно
    только для --milestone, --label, -q (pull.py:114). Потянул по номеру,
    по #N, по owner/repo#N или по URL — закрытая issue легла на диск. Это
    решение #10, и оно подтверждено: номер есть номер, спросил конкретную
    issue — получил её в любом состоянии. Значит чистка не одноразовая: после неё
    закрытая может вернуться, и это нормальная работа, а не откат.
  • Уже лежащий файл обновляется всегда. pull.py:178 — условие содержит
    and not stored. Закрытая issue, которая уже в сторе, перечитывается и
    остаётся. Тоже осознанно: локальная копия должна узнать, что её закрыли.
  • INDEX.md не фильтрует. issue_index.py:29-44 обходит всё, что вернул
    issue.load_all(root), без предиката по состоянию — закрытая получает
    строку наравне с открытой.

Наблюдалось: после закрытия #11#15 понадобился pull.py 11 12 13 14 15,
чтобы поле state: перестало врать. Пять закрытых файлов вернулись в стор —
ровно по первым двум пунктам сразу. До этого шесть закрытых удалялись руками
rm, потому что команды нет.

Итог: единственный способ убрать закрытую issue — rm мимо всех скриптов, с
последующей ручной пересборкой INDEX.md и карты .remote.json. Это ровно то,
чего слой скриптов должен избавлять.

Acceptance criteria

  • закрытые issue убираются из стора одной командой, без rm
  • origin: local не удаляется никогда, в каком бы состоянии ни был
  • --dry-run печатает, что будет удалено, и ничего не трогает
  • после чистки INDEX.md и .remote.json соответствуют содержимому
    каталога — руками досводить ничего не нужно
  • в AGENTS.md записано правило: pull по номеру тянет issue в любом
    состоянии — номер есть номер.
    Чистка его не отменяет: закрытая issue,
    вытянутая по номеру после чистки, снова ложится на диск, и это не
    регрессия. Сейчас поведение не задокументировано нигде
  • решено и записано, где живёт команда: в домене (skills/issue, offline,
    работа с файлами) или в sync. Состояние берётся из state: в файле,
    сеть не нужна — значит по правилу слоёв это домен, и обоснование
    обратного должно быть явным
  • есть тест: стор из открытых и закрытых, прогон, остались только открытые
    и origin: local

Constraints

  • Не входит в объём: фильтр на pull. Он работает, и его границы (--state closed, ключевой режим) заданы #10 намеренно.
  • Не входит в объём: удаление issue в трекере. Речь только о локальных файлах.
  • Не входит в объём: скрытие закрытых в INDEX.md вместо удаления файлов —
    #10 отказалась от этого явно, и полумера оставит файлы на диске.
<!-- tea:id evict-closed-issues-from-the-local-store --> ## Summary Закрытые issue остаются в сторе навсегда. Фильтр на pull не пускает новые, но уже лежащие файлы не убирает никто, и вернуть их обратно на диск проще, чем кажется. ## Spec none ## Depends on - drop-the-local-copy-after-a-successful-push-and — там решается, стор это хранилище или кэш; от ответа зависит, чем эта задача вообще является ## Motivation `skip-closed-issues-when-pulling-a-repository-in` (`claude-skills/tea#10`, закрыта) поставила фильтр на запись и **явно** вынесла чистку за рамки: «существующие файлы стора не чистятся» — задача была про запись, не про миграцию. Миграцию с тех пор никто не сделал, и своей issue у неё не было. Дырки, через которые закрытые попадают и остаются: - **Ключевой режим не фильтруется, и так и останется.** `pull.py:142` — `drop_closed = filtered and args.state != "closed"`, а `filtered` истинно только для `--milestone`, `--label`, `-q` (`pull.py:114`). Потянул по номеру, по `#N`, по `owner/repo#N` или по URL — закрытая issue легла на диск. Это решение #10, и оно подтверждено: **номер есть номер**, спросил конкретную issue — получил её в любом состоянии. Значит чистка не одноразовая: после неё закрытая может вернуться, и это нормальная работа, а не откат. - **Уже лежащий файл обновляется всегда.** `pull.py:178` — условие содержит `and not stored`. Закрытая issue, которая уже в сторе, перечитывается и остаётся. Тоже осознанно: локальная копия должна узнать, что её закрыли. - **INDEX.md не фильтрует.** `issue_index.py:29-44` обходит всё, что вернул `issue.load_all(root)`, без предиката по состоянию — закрытая получает строку наравне с открытой. Наблюдалось: после закрытия `#11`–`#15` понадобился `pull.py 11 12 13 14 15`, чтобы поле `state:` перестало врать. Пять закрытых файлов вернулись в стор — ровно по первым двум пунктам сразу. До этого шесть закрытых удалялись руками `rm`, потому что команды нет. Итог: единственный способ убрать закрытую issue — `rm` мимо всех скриптов, с последующей ручной пересборкой `INDEX.md` и карты `.remote.json`. Это ровно то, чего слой скриптов должен избавлять. ## Acceptance criteria - [ ] закрытые issue убираются из стора одной командой, без `rm` - [ ] `origin: local` не удаляется никогда, в каком бы состоянии ни был - [ ] `--dry-run` печатает, что будет удалено, и ничего не трогает - [ ] после чистки `INDEX.md` и `.remote.json` соответствуют содержимому каталога — руками досводить ничего не нужно - [ ] в `AGENTS.md` записано правило: **pull по номеру тянет issue в любом состоянии — номер есть номер.** Чистка его не отменяет: закрытая issue, вытянутая по номеру после чистки, снова ложится на диск, и это не регрессия. Сейчас поведение не задокументировано нигде - [ ] решено и записано, где живёт команда: в домене (`skills/issue`, offline, работа с файлами) или в sync. Состояние берётся из `state:` в файле, сеть не нужна — значит по правилу слоёв это домен, и обоснование обратного должно быть явным - [ ] есть тест: стор из открытых и закрытых, прогон, остались только открытые и `origin: local` ## Constraints - Не входит в объём: фильтр на pull. Он работает, и его границы (`--state closed`, ключевой режим) заданы #10 намеренно. - Не входит в объём: удаление issue в трекере. Речь только о локальных файлах. - Не входит в объём: скрытие закрытых в `INDEX.md` вместо удаления файлов — #10 отказалась от этого явно, и полумера оставит файлы на диске.
claude added the comp/sync
type
task
comp/issue
labels 2026-08-10 11:41:01 +00:00
Sign in to join this conversation.