diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 8e0b902..0cb9105 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1212,17 +1212,39 @@ Acceptance 1-6 all met by test evidence (not by inspection). Per-task detail in --- -## ⚪ [session-inbox-monitor-stophook-blockfix-proof] — Content-таска. Runtime-пруф уже ПРИМЕНЁННОГО Stop-хук block-фикса. Фикс (2026-06-17): в ~/.claude/hooks/stop-dispatcher.ps1 inbox-путь теперь отдаёт `decision: block` с телом письма + инструкцией «обработай и ответь отправителю» (раньше был пассивный additionalContext без block → агент молча останавливался, письмо терялось в .read). Нужен живой пруф: прислать реальное письмо в .claude-inbox/, убедиться что агент ПРИНУДИТЕЛЬНО обрабатывает содержание (не игнорит). Проверить отсутствие зацикливания (письмо уже в .read → следующий Stop видит пустой инбокс → block не ставится). +## 🟢 [session-inbox-monitor-stophook-blockfix-proof] — Content-таска. Runtime-пруф уже ПРИМЕНЁННОГО Stop-хук block-фикса. Фикс (2026-06-17): в ~/.claude/hooks/stop-dispatcher.ps1 inbox-путь теперь отдаёт `decision: block` с телом письма + инструкцией «обработай и ответь отправителю» (раньше был пассивный additionalContext без block → агент молча останавливался, письмо терялось в .read). Нужен живой пруф: прислать реальное письмо в .claude-inbox/, убедиться что агент ПРИНУДИТЕЛЬНО обрабатывает содержание (не игнорит). Проверить отсутствие зацикливания (письмо уже в .read → следующий Stop видит пустой инбокс → block не ставится). -**Status:** ready -**Where I stopped:** (not started) -**Next action:** Прислать тестовое письмо в .claude-inbox/, наблюдать что Stop-хук форсит обработку (block), и что цикла нет. +**Status:** done +**Where I stopped:** PASS 2026-06-17. Положил self-test письмо в claude-skills/.claude-inbox/, завершил ход → Stop-хук **принудительно** ре-инвокнул меня с телом письма как block-reason (без user-Enter). **No-loop подтверждён:** после вручения инбокс пуст (0 *.md, письмо в .read/) → следующий Stop не блокирует. **Bonus:** живой Monitor (этой сессии) тоже эмитнул событие на появление файла — lifecycle end-to-end. Block-механизм РАБОТАЕТ. **Finding (orthogonal):** тело письма с кириллицей пришло как mojibake — на диске файл чистый UTF-8, порча в harness-spawn stdout-пути Stop-хука; репро через Start-Process НЕ воспроизвёл (наследует UTF-8 от родителя) → харнесс-специфично. Заведена follow-up `session-inbox-monitor-stophook-utf8-fix`. +**Next action:** (none — kept until merged; mojibake вынесен в отдельную таску) **Branch:** n/a **Notify:** OpeItcLoc03/workshop --- +## ⚪ [session-inbox-monitor-stophook-utf8-fix] — Stop-хук портит UTF-8/кириллицу при принудительном вручении письма (inject через `decision:block`). Найдено при `-stophook-blockfix-proof` 2026-06-17 (независимо подтверждено workshop по байтам). + +**Симптом:** кириллическое тело письма приходит в block-reason как mojibake; английский текст инструкции чист. +**Диагноз (verified):** (1) файл на диске — валидный UTF-8 (Get-Content -Encoding UTF8 читает чисто). (2) `~/.claude/hooks/stop-dispatcher.ps1` **читает** тело как `-Encoding UTF8` (стр. 44) — read-сторона ОК. (3) НО stop-dispatcher **не выставляет** `[Console]::OutputEncoding` → `ConvertTo-Json` в stdout при harness-spawn (redirected pipe, WinPS 5.1) кодируется в дефолтном OEM-codepage (cp866 на RU-Windows) → mojibake на выводе. (4) Репро через `Start-Process -RedirectStandardOutput` НЕ воспроизводит (наследует UTF-8 от родителя) → баг харнесс-spawn-специфичен; верифицируется только in-situ (реальный Stop-хук + кириллическое письмо). (5) Писательская сторона: `Set-Content/Out-File -Encoding utf8` под 5.1 сажает BOM (`EF BB BF`) + смешанные EOL — некcanon; Write-тул пишет чистый no-BOM UTF-8 LF. + +**Fix (две стороны + тест):** +1. **Output (главное):** в начало `stop-dispatcher.ps1` — `[Console]::OutputEncoding = [System.Text.Encoding]::UTF8` (и `$OutputEncoding` для надёжности). Низкий риск, идемпотентно. +2. **Writer-гайд:** любой PS-писатель inbox-файла — `[IO.File]::WriteAllText($p, $text, [Text.UTF8Encoding]::new($false))` (no-BOM, LF). Канон — Write-тул. Зафиксировать в SKILL.md session-inbox-monitor (раздел про доставку) + возможно inter-session-peer-discipline. +3. **Regression:** прислать кириллическое письмо через реальный inject, убедиться что block-reason чист (RED→GREEN через настоящий путь). + +NB: `stop-dispatcher.ps1` — machine-local (вне git, владелец — workshop-сетап). Правка требует ОК user (shared hook, влияет на Stop во всех проектах машины). ASCII-clean в `inbox-monitor.ps1` — это обход того же encoding-класса, не корень; корень здесь — read/write/output codepage. + +**Weight:** needs-claude +**Status:** ready +**Where I stopped:** Диагноз полный (verified + workshop-confirmed). Не применял фикс — это shared machine-local hook, нужен ОК user; верификация только in-situ. +**Next action:** По ОК user: добавить OutputEncoding=UTF8 в stop-dispatcher.ps1 (бэкап), прислать кириллическое тест-письмо, end turn → проверить что forced-delivery чист. Затем writer-гайд в SKILL.md. Findings → review. +**Branch:** n/a +**Notify:** OpeItcLoc03/workshop + + +--- + ## 🔵 [session-inbox-monitor-review] — Skill-review checkpoint для session-inbox-monitor (промоушен 2026-06-17). **Источник дизайна:** .workshop/.archive/2026-06-17-session-inbox-monitor.md + .workshop/.wiki/concepts/session-inbox-monitor.md.