Сводка отложенных находок обвязки (бывш. #5, #13, #21, #28, #31) #70

Open
opened 2026-10-24 21:15:13 +03:00 by aep · 7 comments
Owner

Консолидация follow-ups #5, #13, #21, #28, #31 (закрыты 24.10.2026, причина —
сведение сюда). Все маркеры и источники сохранены; статус на момент сведения —
deferred, если не помечено иначе. Это же — работа по B16 ретро 24.10 (для #31).

Из #5 — роли и память (PR #4, merge 2c599a1)

Часть 2 (awp-ca), планировать вместе с #2:

  • T4.3 / M-4 — «Читать на старте» в dev.md: дубль brief:/tea issues ls, строки
    не подходят для cwd workspace, OQ у analyst не команда.
  • M-6 — правило codegraph «на период замера» и /harness-retro лежат в общем
    слое dev.md.
  • T10.2 — notes/agent-memory.md упомянут, шаблона в role-repo нет.

Обвязка:

  • T1.1 — причина «симлинк → read-only» подтверждена одним контролем; 6.5 в
    части 2 как предосторожность.
  • T2.1 — нет явного теста cc-qa для role-hint.
  • T3.1 — tests/test-roles.sh проверяет cd голой подстрокой.
  • T4.1 — в таблице адресов нет пометки про убранное «кроме архивации OpenSpec»
    у adopt-project.sh.
  • T4.2 — в строке «Новое» нет require-plan/.bounded и «если хук мешает —
    сказать владельцу».
  • T5.2 — шаг 2 skill /role зависит от пути auto-memory в системном промпте.
  • T6.2 — link-roles --map не проверяет роль admin|analyst|qa.
  • T6.3 — link-roles молча заменяет чужой/битый симлинк.
  • T6.4 — ячейки каталога ../x и абсолютные пути не отклоняются.
  • T7.1 — $NAME в замене sed ломается на / и &.
  • T7.2 — new-project.sh --role без значения — unbound $2.
  • T8.2 — tests/test-doctor.sh: проверка workspace слишком слабая.
  • T8.3 — не покрыта ветка WARN «нет проектного файла роли» в doctor.
  • T9.1 — фильтр ours_ss в install.sh удаляет всю запись SessionStart, если в
    ней есть наш хук.
  • Без маркера: спека, раздел 9 «Проверяется первой» про симлинк устарело
    после spike; HARNESS.md: кавычки в «dev, admin, analyst или qa».

Из #13 — хуки 0.4.0 (PR #12, merge d245e50)

Хуки (hooks/harness_target.py):

  • M-1 — git-мутация при пустом cwd во входе хука даёт блок; вход без cwd —
    не «сбой разбора → пропуск».
  • M-6 — лексер не разбирает function f { … }, $'…', (( a << 2 )).
  • M-7 — в сообщении push? нет корня репозитория; «запись в .» для npm
    install / tar -x без названия операции.
  • M-10 — worktree внутри репозитория, созданный в той же команде, блокирует
    записи в нём.
  • M-11 — npm --prefix / pnpm -C / yarn --cwd: значение опции принимается за
    подкоманду; perl -Mstrict ложно ловится как perl -i.
  • M-3 (пробел) — rm -rf link/ и mv в ссылку на каталог оцениваются по месту
    ссылки, а не по самой ссылке.
  • O-4 — require-plan не видит записей в каталоги кода через Bash (sed -i,
    cat >), только Edit/Write/MultiEdit.

Корпус и тесты:

  • M-2 — tests/test-hook-corpus.sh ��роходит вхолостую, если hook_corpus.py
    упал.
  • M-9 — hook_corpus.py собирает песочницу с глобальным git-конфигом машины.
  • M-12 — корпус: c002 испорчен редакцией секретов, поле why не проверяется,
    block-случаи одной формы — добавить живые block-случаи.

Процесс и ретро:

  • O-2 — код плана написан прототипом до самого плана; тема для ретро.
  • O-3 — require-plan: правило «план один → пропуск» пропускало все правки в
    коде без плана для ветки.

Инструменты (не наш код):

  • O-5 — изоляция worktree Claude Code отказывает read-only командам со словом
    git в «сложном» тексте; рецепт обхода → B15 (ретро 24.10).

Из #21 — codegraph (PR #20, merge dce95e7)

  • O-9 — adopt/new-project пропускают codegraph init, если .codegraph/ уже
    есть; проверять .codegraph/codegraph.db, а не каталог.
  • O-10 — doctor проверяет только бинарник codegraph; не подключённый MCP не
    виден, без него explore недоступен и ретро насчитает ноль вызовов.
  • O-11 — codegraph индексирует в cc-harness только Python; bash в индекс не
    попадает; учесть в замере и в правиле dev.md.

Из #28 — worktree (PR #27, merge 957ce1e)

  • O-17 — codegraph_explore с projectPath вложенного worktree без индекса
    молча отвечает по индексу основного checkout; если подтвердится — doctor
    в worktree без .codegraph/codegraph.db даёт WARN.

Из #31 — /harness-retro (PR #30, merge 1697c77; = B16)

Сборка корпуса и экспортёр:

  • M-1 — hook_cases_build.py: запись без id → TypeError, разметка без
    expected/skip → KeyError; expected не проверяется на allow|block; вывод
    потоковый оставляет корпус усечённым.
  • M-7 — экспортёр и retro_metrics считают блокировку по-разному; один
    предикат и один отбор файлов.
  • M-10 — hook_corpus.py: вердикт error у записи с known даёт KNOWN; error
    всегда должен быть ошибкой прогона.

retro_metrics.py:

  • M-3 — валидная JSON-запись неожиданной формы роняет весь срез;
    isinstance/try-except со счётом bad_lines.
  • M-4 — шаблон grep трактуется как путь; "codegraph init" in cmd засчитывает
    --help и grep по строке.
  • M-5 — --since локальная дата, метки UTC: сессия в 01:30 МСК дня D — D-1.
  • M-6 — отказ владельца в разрешении: +1 к прерываниям и второй кандидат в
    поправки на одно событие.
  • M-12 — роль, выбранная слеш-командой /role dev, не считается — только
    tool_use Skill.
  • M-13 — решения без обсуждения не записаны в design.md; сессии без промптов
    и ходов не считаются сессиями (sources.bytes их включает).

retro_leftovers.py:

  • M-2 — git status --porcelain переписывает .git/index; нужен
    --no-optional-locks, в тест — mtime индекса.
  • M-11 — ветка, слитая fast-forward и совпадающая с origin/main, не
    выводится, пока main не уйдёт вперёд.

Skill и тесты:

  • M-8 — SKILL.md: «биты�� строк больше 1 %» — нет общего числа строк; после
    known не сказано пересобрать корпус.
  • M-9 — test-doctor.sh не проверяет вывод KNOWN-FIXED и хвост «, известных
    ошибок K».

Приоритеты (предложение, уточнить при взятии в работу)

P1: O-4 (#13, require-plan и Bash-записи), M-1/M-10 (#13, парсер),
O-17 (#28) + O-9 (#21) — codegraph в worktree.
P2: M-1/M-7/M-10 (#31, сборка корпуса — B16), O-5 (#13 → B15), M-3 (#31).
P3: остальное.

Консолидация follow-ups #5, #13, #21, #28, #31 (закрыты 24.10.2026, причина — сведение сюда). Все маркеры и источники сохранены; статус на момент сведения — deferred, если не помечено иначе. Это же — работа по B16 ретро 24.10 (для #31). ## Из #5 — роли и память (PR #4, merge 2c599a1) Часть 2 (awp-ca), планировать вместе с #2: - T4.3 / M-4 — «Читать на старте» в dev.md: дубль brief:/tea issues ls, строки не подходят для cwd workspace, OQ у analyst не команда. - M-6 — правило codegraph «на период замера» и /harness-retro лежат в общем слое dev.md. - T10.2 — notes/agent-memory.md упомянут, шаблона в role-repo нет. Обвязка: - T1.1 — причина «симлинк → read-only» подтверждена одним контролем; 6.5 в части 2 как предосторожность. - T2.1 — нет явного теста cc-qa для role-hint. - T3.1 — tests/test-roles.sh проверяет cd голой подстрокой. - T4.1 — в таблице адресов нет пометки про убранное «кроме архивации OpenSpec» у adopt-project.sh. - T4.2 — в строке «Новое» нет require-plan/.bounded и «если хук мешает — сказать владельцу». - T5.2 — шаг 2 skill /role зависит от пути auto-memory в системном промпте. - T6.2 — link-roles --map не проверяет роль admin|analyst|qa. - T6.3 — link-roles молча заменяет чужой/битый симлинк. - T6.4 — ячейки каталога ../x и абсолютные пути не отклоняются. - T7.1 — $NAME в замене sed ломается на / и &. - T7.2 — new-project.sh --role без значения — unbound $2. - T8.2 — tests/test-doctor.sh: проверка workspace слишком слабая. - T8.3 — не покрыта ветка WARN «нет проектного файла роли» в doctor. - T9.1 — фильтр ours_ss в install.sh удаляет всю запись SessionStart, если в ней есть наш хук. - Без маркера: спека, раздел 9 «Проверяется первой» про симлинк устарело после spike; HARNESS.md: кавычки в «dev, admin, analyst или qa». ## Из #13 — хуки 0.4.0 (PR #12, merge d245e50) Хуки (hooks/harness_target.py): - M-1 — git-мутация при пустом cwd во входе хука даёт блок; вход без cwd — не «сбой разбора → пропуск». - M-6 — лексер не разбирает function f { … }, $'…', (( a << 2 )). - M-7 — в сообщении push? нет корня репозитория; «запись в .» для npm install / tar -x без названия операции. - M-10 — worktree внутри репозитория, созданный в той же команде, блокирует записи в нём. - M-11 — npm --prefix / pnpm -C / yarn --cwd: значение опции принимается за подкоманду; perl -Mstrict ложно ловится как perl -i. - M-3 (пробел) — rm -rf link/ и mv в ссылку на каталог оцениваются по месту ссылки, а не по самой ссылке. - O-4 — require-plan не видит записей в каталоги кода через Bash (sed -i, cat >), только Edit/Write/MultiEdit. Корпус и тесты: - M-2 — tests/test-hook-corpus.sh ��роходит вхолостую, если hook_corpus.py упал. - M-9 — hook_corpus.py собирает песочницу с глобальным git-конфигом машины. - M-12 — корпус: c002 испорчен редакцией секретов, поле why не проверяется, block-случаи одной формы — добавить живые block-случаи. Процесс и ретро: - O-2 — код плана написан прототипом до самого плана; тема для ретро. - O-3 — require-plan: правило «план один → пропуск» пропускало все правки в коде без плана для ветки. Инструменты (не наш код): - O-5 — изоляция worktree Claude Code отказывает read-only командам со словом git в «сложном» тексте; рецепт обхода → B15 (ретро 24.10). ## Из #21 — codegraph (PR #20, merge dce95e7) - O-9 — adopt/new-project пропускают codegraph init, если .codegraph/ уже есть; проверять .codegraph/codegraph.db, а не каталог. - O-10 — doctor проверяет только бинарник codegraph; не подключённый MCP не виден, без него explore недоступен и ретро насчитает ноль вызовов. - O-11 — codegraph индексирует в cc-harness только Python; bash в индекс не попадает; учесть в замере и в правиле dev.md. ## Из #28 — worktree (PR #27, merge 957ce1e) - O-17 — codegraph_explore с projectPath вложенного worktree без индекса молча отвечает по индексу основного checkout; если подтвердится — doctor в worktree без .codegraph/codegraph.db даёт WARN. ## Из #31 — /harness-retro (PR #30, merge 1697c77; = B16) Сборка корпуса и экспортёр: - M-1 — hook_cases_build.py: запись без id → TypeError, разметка без expected/skip → KeyError; expected не проверяется на allow|block; вывод потоковый оставляет корпус усечённым. - M-7 — экспортёр и retro_metrics считают блокировку по-разному; один предикат и один отбор файлов. - M-10 — hook_corpus.py: вердикт error у записи с known даёт KNOWN; error всегда должен быть ошибкой прогона. retro_metrics.py: - M-3 — валидная JSON-запись неожиданной формы роняет весь срез; isinstance/try-except со счётом bad_lines. - M-4 — шаблон grep трактуется как путь; "codegraph init" in cmd засчитывает --help и grep по строке. - M-5 — --since локальная дата, метки UTC: сессия в 01:30 МСК дня D — D-1. - M-6 — отказ владельца в разрешении: +1 к прерываниям и второй кандидат в поправки на одно событие. - M-12 — роль, выбранная слеш-командой /role dev, не считается — только tool_use Skill. - M-13 — решения без обсуждения не записаны в design.md; сессии без промптов и ходов не считаются сессиями (sources.bytes их включает). retro_leftovers.py: - M-2 — git status --porcelain переписывает .git/index; нужен --no-optional-locks, в тест — mtime индекса. - M-11 — ветка, слитая fast-forward и совпадающая с origin/main, не выводится, пока main не уйдёт вперёд. Skill и тесты: - M-8 — SKILL.md: «биты�� строк больше 1 %» — нет общего числа строк; после known не сказано пересобрать корпус. - M-9 — test-doctor.sh не проверяет вывод KNOWN-FIXED и хвост «, известных ошибок K». ## Приоритеты (предложение, уточнить при взятии в работу) P1: O-4 (#13, require-plan и Bash-записи), M-1/M-10 (#13, парсер), O-17 (#28) + O-9 (#21) — codegraph в worktree. P2: M-1/M-7/M-10 (#31, сборка корпуса — B16), O-5 (#13 → B15), M-3 (#31). P3: остальное.
Author
Owner

Дополнение от #63 (PR #71, фикс O-4, 24.10.2026): deferred — регрессионный кейс «git worktree add -b … && cd … && openspec archive» не добавлен в корпус хуков (hook-cases.jsonl/hook_cases_build.py): потребует правки счётчика синтетического сегмента test-hook-corpus (131/131). Разбор закреплён тестами test-hook-guard-main. Статус: deferred, кандидат в ближайший батч сборки корпуса.

Дополнение от #63 (PR #71, фикс O-4, 24.10.2026): deferred — регрессионный кейс «git worktree add -b … && cd … && openspec archive» не добавлен в корпус хуков (hook-cases.jsonl/hook_cases_build.py): потребует правки счётчика синтетического сегмента test-hook-corpus (131/131). Разбор закреплён тестами test-hook-guard-main. Статус: deferred, кандидат в ближайший батч сборки корпуса.
Author
Owner

Дополнение от ревью #63 (PR #71, T1.5): существующая дыра вне диффа — формы без -b/-B (git worktree add x --detach && cd x && git commit и git worktree add x main && cd x && git commit из worktree на feat-ветке) дают 0 (коммит в detached/main). Внесена не этим PR; кандидат в follow-up по парсеру. Статус: deferred.

Дополнение от ревью #63 (PR #71, T1.5): существующая дыра вне диффа — формы без -b/-B (`git worktree add x --detach && cd x && git commit` и `git worktree add x main && cd x && git commit` из worktree на feat-ветке) дают 0 (коммит в detached/main). Внесена не этим PR; кандидат в follow-up по парсеру. Статус: deferred.
Author
Owner

Инструменты (не наш код): tea comments list N в tea 0.16.0 обрезает тело комментария (~50 символов) во всех форматах, включая json; полный текст — через tea pulls N --comments -f index,title,body,comments -o json (comments[].body). Ловушка для будущих сессий, обходить не нужно. Статус: observation, workaround зафиксирован.

Инструменты (не наш код): `tea comments list N` в tea 0.16.0 обрезает тело комментария (~50 символов) во всех форматах, включая json; полный текст — через `tea pulls N --comments -f index,title,body,comments -o json` (comments[].body). Ловушка для будущих сессий, обходить не нужно. Статус: observation, workaround зафиксирован.
Author
Owner

Дополнение от перепроверки #63 (PR #71, T2.1): простой over-приоритет (R-1) даёт контривированный ложный БЛОК (безопасное направление): git worktree add x -b feat/x && git switch main && git -C x commit → 2, хотя коммит на feat/x. Принятый компромисс R-1; точный матч (путь switch под парой) — опциональный follow-up. Статус: rejected (компромисс) + deferred (уточнение по желанию).

Дополнение от перепроверки #63 (PR #71, T2.1): простой over-приоритет (R-1) даёт контривированный ложный БЛОК (безопасное направление): `git worktree add x -b feat/x && git switch main && git -C x commit` → 2, хотя коммит на feat/x. Принятый компромисс R-1; точный матч (путь switch под парой) — опциональный follow-up. Статус: rejected (компромисс) + deferred (уточнение по желанию).
Author
Owner

От dsh-port-v2 (#69, PR #72): T3.4 — гейт verify N>0 реализован в install.sh sync_skills, но не закреплён тестом (нет шва для подмены verify-скрипта). Статус: deferred; пинить при появлении шва/рефакторе.

От dsh-port-v2 (#69, PR #72): T3.4 — гейт verify N>0 реализован в install.sh sync_skills, но не закреплён тестом (нет шва для подмены verify-скрипта). Статус: deferred; пинить при появлении шва/рефакторе.
Author
Owner

От enforce-upstream-loop (#59, PR #74): M-1 — гейт B сканирует только prompt/script, план-ссылка внутри workflow.args не видна (канал вне скоупа, fail-open эвристика документирована); M-2 — str_replace_editor command:view на план/approval/sdd путь даёт ложный deny (инструмента нет в DSH 0.2.1-rc.3, гипотетический); T3.4 — deny-текст «plan must carry Spec:» для content-less правок вводит в заблуждение (поведение верное, в known-limits); T4.4 — бюджет sdd-скилла 12155/12288 B, следующая правка текста должна освободить место. Все — deferred.

От enforce-upstream-loop (#59, PR #74): M-1 — гейт B сканирует только prompt/script, план-ссылка внутри workflow.args не видна (канал вне скоупа, fail-open эвристика документирована); M-2 — str_replace_editor command:view на план/approval/sdd путь даёт ложный deny (инструмента нет в DSH 0.2.1-rc.3, гипотетический); T3.4 — deny-текст «plan must carry **Spec:**» для content-less правок вводит в заблуждение (поведение верное, в known-limits); T4.4 — бюджет sdd-скилла 12155/12288 B, следующая правка текста должна освободить место. Все — deferred.
Author
Owner

От #77 (PR #78): T1.3 — dsh-tools.md не упоминает request_approval (закрывается в #43 Task 4); T1.5 — формулировка «ошибка диалога → not confirmed» в спеке approval-gates неточна (фактически — текст ошибки), поправить при следующем касании спеки. Оба deferred.

От #77 (PR #78): T1.3 — dsh-tools.md не упоминает request_approval (закрывается в #43 Task 4); T1.5 — формулировка «ошибка диалога → not confirmed» в спеке approval-gates неточна (фактически — текст ошибки), поправить при следующем касании спеки. Оба deferred.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: aep/claude-harness#70
No description provided.