fix(memory+spec): drop host segment from memory path + spec-status argv off-by-one #11
Loading…
Reference in a new issue
No description provided.
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?
Контекст
Два блокирующих бага обнаружены при pipeline PR #10 (Forgejo-first adaptation, merged):
Баг 1 — Memory host mismatch (блокирует PR #10 MEMORY phase): после миграции remote с
github.comнаgit.slaid098.dev(черезgit config url.insteadOf)pipeline-statusоракул строит memory path из реального remote URL →repos/git.slaid098.dev/slaid098/opencode-config*.md. Но memory-syncer физически пишет вrepos/github.com/slaid098/opencode-config-003.md(старый путь). Результат: MEMORY phase всегда ❌ "memory files не найдены" → pipeline не может COMPLETE. Блокирующий баг для всех будущих PR.Баг 2 — spec-status.py:154 off-by-one (блокирует /spec pipeline):
spec-status.py:153-156dispatchgh issue viewиспользуетargs[2]для номера issue, ноargs[2]содержит"view"(строка), не номер. Проверкаargs[2].lstrip("-").isdigit()всегдаFalse→ ветка никогда не выполняется. spec-status оракул в Forgejo-режиме не может читать issues по номеру. Pre-existing баг (найден reviewer'ом в PR #10, вне scope PR #10).Задача
Фикс 1 — Memory path (убрать host сегмент):
repos/{host}/{org}/{repo}.md→repos/{org}/{repo}.md(без host). Orgslaid098уникален, нет привязки к хостингу (Forgejo сегодня, GitLab завтра — те же файлы).git -C ~/.local/share/opencode/opencode-memory mv repos/github.com/slaid098/ repos/slaid098/— 22 файла переезжают (clean rename, git history сохранён)pipeline-status.py:_resolve_memory_base— убрать{host}из пути:repos/{org}/вместоrepos/{host}/{org}/.parse_remote_urlвозвращает(host, org, repo)— использовать толькоorgиrepo,hostигнорировать.memory-syncer.md:45— примерgithub.com/slaid098/...→slaid098/..., инструкция парсинга remote без hostmemory/SKILL.md— проверить, обновить если упоминает{host}/{org}/{repo}formattests/test_pipeline_status.py— обновить_resolve_memory_baseтесты (без host),test_check_memory_done_rotated_file(путь без host), добавитьtest_memory_path_no_host_segmentФикс 2 — spec-status.py:154 off-by-one:
spec-status.py:154—args[2]→args[3](номер issue, не"view")spec-status.py:153—len(args) > 2→len(args) > 3(гарантировать наличиеargs[3])test_spec_status_issue_view(вtests/test_spec_status.pyесли есть, иначе добавить) — проверить что dispatchgh issue view Nдоходит до Forgejo APIКонтракты
~/.local/share/opencode/opencode-memory/repos/{org}/{repo}(-\d+)?.md(без host сегмента)parse_remote_url(pipeline-status.py:385-402) — возвращает(host, org, repo), но_resolve_memory_baseиспользует только(org, repo)git mvв memory repo:git -C ~/.local/share/opencode/opencode-memory mv repos/github.com/slaid098/ repos/slaid098/get_memory_files(pipeline-status.py:414-421) — glob{repo}(-\d+)?.md(без изменений)["gh", "issue", "view", str(num), "--repo", repo]→args[1]="issue",args[2]="view",args[3]=str(num),args[4]="--repo",args[5]=repo. Проверкаargs[3].lstrip("-").isdigit()= True.refactor: drop host segment from memory path(илиfix(memory): drop host segment)Инварианты
git mv= rename, git history сохранён)repos/{host}/{org}/(не fallback, полная миграция — ты мигрируешь полностью на новый path)pipeline-statusоракул находит memory files по новому пути после миграцииspec-statusdispatchgh issue view Nдоходит до Forgejo API после фиксаget_memory_filesglob{repo}(-\d+)?.mdподдерживает ротацию (не кейс #238)Граничные случаи
parse_remote_urlвозвращает первый/настроенный,orgодинаковый → работаетslaid098) подrepos/github.com/— не трогаем, мигрируем толькоslaid098repos/github.com/slaid098/— пустой,rmdirесли чисто (но оставитьrepos/github.com/если есть другие orgs)spec-statusесли--repoотсутствует в argv —args[3]всё равно номер issue,len(args) > 3проверяетparse_remote_urlесли host не определён (local repo без remote) — fallback наorg/repoили ошибкаВлияние на связанные компоненты
pipeline-status.py:_resolve_memory_base(~L405) — основная правка (убрать host)pipeline-status.py:get_memory_files(L414-421) — без изменений (glob)pipeline-status.py:check_memory(L702-723) — без измененийspec-status.py:153-156— off-by-one фикc (2 строки)memory-syncer.md:45— пример пути, инструкция парсинга remotememory/SKILL.md— проверить path format упоминанияtests/test_pipeline_status.py— обновить тесты path (убрать host из expected paths),test_check_memory_done_rotated_file,test_get_memory_files_excludes_non_rotation_suffixtests/test_spec_status.py— добавить/обновить тестtest_spec_status_issue_view_dispatch/specpipeline — spec-phase заработает после mergeВне scope
Критерии приемки
git -C ~/.local/share/opencode/opencode-memory log --oneline -1показывает commit про drop host segmentls ~/.local/share/opencode/opencode-memory/repos/slaid098/— 22 файла (или ~22, включая ротации)ls ~/.local/share/opencode/opencode-memory/repos/github.com/slaid098/— не существует или пустоrg "_resolve_memory_base" .opencode/scripts/pipeline-status.py— path без{host}(только{org})pipeline-status({pr_number: 10})→ MEMORY phase DONE (находит memory files по новому пути)rg "args\[2\]" .opencode/scripts/spec-status.py— 0 совпадений в dispatch коде (заменено наargs[3])spec-statusдля существующего issue → корректный ответ (dispatch доходит до Forgejo API)uv run pytest tests/test_pipeline_status.py tests/test_spec_status.py -x→ all passedpipeline-status→ Status: COMPLETE (all 6 phases DONE)