Drop the local copy after a successful push and re-pull on demand #16
Notifications
Due Date
No due date set.
Blocks
#20 Evict closed issues from the local store
claude-skills/marketplace
Reference: claude-skills/marketplace#16
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
После успешного push удалять локальный файл issue. Источник правды — Gitea;
локальная копия становится кэшем на время работы, а не вторым хранилищем.
Актуальное состояние получается повторным
pull.py, а не сверкой.Spec
skills/issue/references/format.md,AGENTS.mdDepends on
depends:не доезжает дотрекера, удаление файла стирает граф безвозвратно
Motivation
Сейчас после push одна и та же issue лежит в двух местах, и ничто не следит за
расхождением:
synced:говорит лишь, насколько стара копия, drift неотслеживается вообще (
AGENTS.md, раздел «Local issue store»;/tea:sync,раздел «Drift»). Расхождение приходится держать в голове — правил ли я тело
локально, дошло ли оно наверх, чей текст свежее. Удаление после push убирает
вопрос целиком: локально лежит только то, что ещё никуда не уехало, всё
остальное берётся заново.
Это осознанная смена решения, записанного в
AGENTS.md: «tmp/issues/— thestore, not a cache of Gitea», «Pushing is additive: the file is never
deleted», «
origin: localis a durable state». Правило меняется на: локальныйstore хранит
origin: localissue как единственный экземпляр, а всё сorigin: gitea— как удаляемый кэш.Acceptance criteria
push.pyпосле успешного создания удаляетtmp/issues/<id>.mdи<id>.comments.md, и печатает номер и URL, по которым issue теперь живётorigin: localissue, которую не пушили, не удаляется никогдаpush.py --updateсинхронизирован с тем же правилом (удаляет послеуспешного PATCH), либо явно исключён в
## Constraintsупала, код не 2xx, тело не совпало — файл на месте
pull.pyвосстанавливает issue с тем же слагом, что был до удаления,в том числе после переименования в Gitea (сейчас слаг заново выводится из
заголовка:
pull.py:70→issue.slugify(payload["title"]))depends:переживает круг «push → удалить → pull» без потерьtmp/issues/.remote.jsonне превращается в мусор после удаления файлов —он объявлен индексом над файлами (
_gitea.py:309)AGENTS.mdиskills/issue/references/format.mdпереписаны под новоеправило; формулировки «the store, not a cache» и «
origin: localis adurable state» приведены в соответствие
слагу,
depends:и телуConstraints
Два предварительных условия — без них удаление это потеря данных, а не упрощение:
depends:не доезжает до Gitea. Push не создаёт нативных связей, аpull.pyвосстанавливает граф только из#N, найденных в прозе## Depends on, и только черезid_for_number— карту, построенную надлокальными файлами (
map.py:107-126). Файлы удалены → карта пуста → рёбрамолча пропадают. Отсюда
depends:на этой issue.issue, но при pull несуществующего локально issue он выводится заново из
заголовка (
pull.py:70,issue.py:103-121). Переименовали в вебе — послеудаления и повторного pull это другой файл, и все ссылки на старый слаг в
depends:соседних issue мертвы. Слаг должен храниться на стороне трекера(маркер в теле, метка, отдельное поле) либо восстанавливаться по номеру.
Вне объёма: слежение за drift и любая сверка «локальное против удалённого» —
эта issue их отменяет, а не улучшает.
feat/issue-cache-scriptsto mainРеализовано в
mainкоммитамиe629d14и2ac3015— закрываю.Проверено по каждому критерию против
origin/main=2ac3015, отдельнымпроходом, без единой правки кода:
<id>.mdи<id>.comments.md, печатает номер и URLskills/sync/scripts/push.py:185-199(drop_local),:378,:407-409origin: localне удаляетсяpush.py:407достижим только после подтверждённой записи;tests/test_drop_after_push.py:348-380--updateподчиняется тому же правилуpush.py:13-16,:333-338; тесты:316-346push.py:159-182(confirmed_number), гейт:346-350; тесты:382-527pull.py:73-98(id_for),map.py:142-184,:322; тесты:661-698depends:переживает push → удаление → pullpush.py:387-400,:110-156;pull.py:171-172,:221; тесты:641-653,:689-698.remote.jsonне мусор после удаления_gitea.py:347-355,rebuild_map:373-399мержит, а не пересобирает; тесты:758-806AGENTS.mdиformat.mdпереписаныAGENTS.md:114-158,skills/issue/references/format.md:81-99tests/test_drop_after_push.py:619-639Прогон на
origin/main:Ran 232 tests in 3.288s — OK.Побочная находка вынесена отдельной issue #21:
depends:возвращался только под--deps, то есть обычныйpull.py <n>отдавал единицу работы без графа. Теперьэто поведение по умолчанию — PR #36.