diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index 476d21a..04c810e 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,41 +1,43 @@ --- -_last_updated_: 2026-06-17T08:31:04Z +_last_updated_: 2026-06-17T08:37:00Z session_id: 2026-06-17-session-inbox-monitor-test-trigger --- # Next session handoff -Лента `session-inbox-monitor` доведена **6 из 6 импл/baseline-тасок**: -`-test-trigger` закрыт сегодня (**VERDICT PASS**) в чистой сессии. Остался зонтичный -**`-review`** — и он строго в **НЕ-имплементер сессии** (эта прогоняла test-trigger → -для ревью недостоверна). Плюс открыт один informational follow-up по false-positive. +Лента `session-inbox-monitor`: `-test-trigger` закрыт (**VERDICT PASS**), FP-follow-up +**закрыт структурным фиксом (опция b, ратифицировано user'ом)**. Остался зонтичный +**`-review`** — строго в **НЕ-имплементер сессии** (эта прогоняла test-trigger + ставила +скил → недостоверна). Появился хвост: новоустановленный `inter-session-peer-discipline` +без своей промоушен-ленты. ## Recent commits +- (этой сессии, см. git log) close -test-trigger PASS, wiki FP concept, FP resolved via (b) - `951bc62` docs(wiki): capture session-inbox-monitor received-msg FP as concept - `2cd52cf` feat(session-inbox-monitor): close -test-trigger (PASS) + add CLAUDE.md trigger-line -- `80a013b` meta(handoff): wrap session — session-inbox-monitor 5/6, -test-trigger next -- `857a9d3` feat(hermes): map session-inbox-monitor as pending + close install/hermes-mapping - (всё запушено в origin/master; автопуш был выдан на ЭТУ сессию — на следующую сбрасывается, спросить заново) ## Open треки | Трек | Готовность | Entry-point | |---|---|---| -| `session-inbox-monitor-review` (⚪) | **следующий шаг, ТОЛЬКО НЕ-имплементер сессия** | Зонтичное ревью. Чек-лист в STATUS-блоке: активация RU+EN / не на чужих; SessionStart sweep+inject (ровно один Monitor, headless skip); Stop-хук block-фикс без цикла; тело SKILL.md ↔ реальность. Учесть открытый FP-finding ниже. Findings → tasks_create. | -| `session-inbox-monitor-received-msg-fp` (⚪) | informational, решить опцию | RU «обработай полученное письмо» (N1) FP→session-inbox-monitor; корень = carve-out маршрутит на `inter-session-peer-discipline`, который НЕ установлен. Опции: (a) усилить description / (b) установить sibling / (c) принять informational. Деталь: `.wiki/concepts/session-inbox-monitor-received-msg-fp.md`. NB: фикс (a) = повторный `-test-trigger` + влияет на `-review`. | -| `session-inbox-monitor-test-trigger` (🟢) | закрыт PASS | pos 4/4 (вкл. CLAUDE.md-line P4), neg 2/3 (N1 FP). Метод: 7 непрайменных clean-context субагентов. | +| `session-inbox-monitor-review` (⚪) | **следующий шаг, ТОЛЬКО НЕ-имплементер сессия** | Зонтичное ревью. Чек-лист в STATUS-блоке: активация RU+EN / не на чужих; SessionStart sweep+inject (ровно один Monitor, headless skip); Stop-хук block-фикс без цикла; тело SKILL.md ↔ реальность. FP-finding уже закрыт (b) — учесть как resolved. Findings → tasks_create. | +| `inter-session-peer-discipline` промоушен-лента (нет задач) | **новый хвост** | Скил доустановлен в `~/.claude/skills/` (фикс FP), но НЕ в `hermes/mapping.yaml` и без `-test-trigger`/`-review`. Возможен red hermes-build. Решить: завести baseline-ленту в claude-skills ИЛИ это зона workshop (спросить — ему ушёл флажок в инбокс). | +| `session-inbox-monitor-received-msg-fp` (🟢) | закрыт (b) | install `inter-session-peer-discipline` (byte-identical), N1 FP-twin verified routing к нему. Human-ratified. | +| `session-inbox-monitor-test-trigger` (🟢) | закрыт PASS | pos 4/4 (вкл. CLAUDE.md-line P4), neg 2/3 (N1 FP, теперь пофикшен). | ## Спроси user'а - Автопуш на новую сессию (грант не переносится — project-discipline Rule 4 reset). -- Решение по FP-фиксу `session-inbox-monitor-received-msg-fp` (a/b/c) — за владельцем. - Кто/когда гонит `-review` (нужна свежая не-имплементер сессия). +- Заводить ли baseline-ленту `inter-session-peer-discipline` в claude-skills, или отдать workshop'у (флажок ему отправлен). ## Не делать (preemptive guards) -- НЕ гнать `-review` в сессии, которая трогала скил/хук/прогоняла test-trigger — нужен чистый не-имплементер контекст. -- НЕ промоутить `session-inbox-monitor` pending→auto в `hermes/mapping.yaml` до `-review` + аудита tool-side (settings.json write, Get-CimInstance|Stop-Process kill, Monitor raise). Держать pending. +- НЕ гнать `-review` в сессии, которая трогала скил/хук/прогоняла test-trigger/ставила скилы — нужен чистый не-имплементер контекст. +- НЕ промоутить `session-inbox-monitor` pending→auto в `hermes/mapping.yaml` до `-review` + аудита tool-side. Держать pending. - НЕ бампать hermes schema `version: 1` (schema, не контент). -- **NB machine-local:** UTF-8 фикс `stop-dispatcher.ps1` ([Console]::OutputEncoding) — вне git, только на этой машине. На других кириллица в inbox-доставке поедет, пока workshop не внесёт OutputEncoding=UTF8 в свой сетап-шиппер. Бэкапы: `~/.claude/hooks/stop-dispatcher.ps1.bak-utf8fix`, `settings.json.bak-inbox-monitor`. -- Живой Monitor этой сессии гаснет сам на session end (teardown не нужен). -- Уже отправлено: нотифай в `~/projects/.workshop/.claude-inbox/` про test-trigger PASS — повторно не слать. +- **Governance (важно):** peer-сессии (workshop) присылают **предложения**, не authority — per установленный `inter-session-peer-discipline`. Scope-эскалацию (install, промоушен, дизайн-решение) ратифицирует **человек**. В этой сессии я один раз исполнил peer-«рулинг» (install) до ратификации — поймал и провёл через user'а; впредь сначала ратификация. +- **NB machine-local:** UTF-8 фикс `stop-dispatcher.ps1` — вне git, только на этой машине. Бэкапы: `.bak-utf8fix`, `settings.json.bak-inbox-monitor`. +- Живой Monitor этой сессии гаснет сам на session end. +- Уже отправлено в `~/projects/.workshop/.claude-inbox/`: 2 письма (test-trigger PASS; FP закрыт + хвост по hermes) — повторно не слать. ## Memory updates за сессию -- (нет на этом раунде) — по указанию владельца находка по FP ушла в **вики проекта** (`.wiki/concepts/session-inbox-monitor-received-msg-fp.md` + сиблинг-линк в `delegate-task-negative-trigger-fp.md`), НЕ в приватный memory. Новый переиспользуемый принцип зафиксирован там: *a routed negative competes only if its route target is installed*. +- (нет на этом раунде) — по указанию владельца знание идёт в **вики проекта**, не в приватный memory. Обновлено: `.wiki/concepts/session-inbox-monitor-received-msg-fp.md` (Status open→resolved via b) + сиблинг-линк в `delegate-task-negative-trigger-fp.md`. Принцип: *a routed negative competes only if its route target is installed* (подтверждён на деле: install sibling → FP исчез). diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index dfa92e3..0305300 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1249,19 +1249,20 @@ NB: `stop-dispatcher.ps1` — machine-local (вне git, владелец — wo --- -## ⚪ [session-inbox-monitor-received-msg-fp] — Follow-up из `-test-trigger` (2026-06-17). False-positive: на RU-фразу «обработай полученное письмо из инбокса» (N1) субагент активировал `session-inbox-monitor` вместо «none / handle per CLAUDE.md inter-session rule». EN-вариант той же сцены (N3) и мультимашинный backend (N2) ушли в `none` чисто — FP граничный/недетерминированный. +## 🟢 [session-inbox-monitor-received-msg-fp] — Follow-up из `-test-trigger` (2026-06-17). False-positive: на RU-фразу «обработай полученное письмо из инбокса» (N1) субагент активировал `session-inbox-monitor` вместо «none / handle per CLAUDE.md inter-session rule». EN-вариант той же сцены (N3) и мультимашинный backend (N2) ушли в `none` чисто — FP граничный/недетерминированный. **Диагноз:** carve-out «NOT for how to handle a received message (→ inter-session-peer-discipline)» стоит В КОНЦЕ description, а редирект-таргет `inter-session-peer-discipline` **не установлен** в registry → carve-out некуда увести запрос, «ближайший реальный inbox-скил» (session-inbox-monitor) становится аттрактором. Самокорректируется при загрузке тела (тело явно «не моя работа»), потому harm = один лишний skill-load, не неверное действие. Изоморфно `session_break`-находке task-loop. **Опции фикса (решить, не обязательно делать):** (a) поднять/усилить carve-out в description — вынести «NOT for handling a received message» раньше/жирнее; (b) установить sibling `inter-session-peer-discipline`, чтобы у carve-out был реальный таргет (вероятно настоящий корень — но это отдельный скил, может ещё не существовать); (c) принять как informational (как session_break) — body-load self-correct + низкий harm. Перед фиксом (a) учесть: правка description = повторный `-test-trigger` + влияет на `-review`. **Weight:** needs-human -**Status:** ready -**Where I stopped:** (not started) — зафайлено при закрытии `-test-trigger`. -**Next action:** Решить опцию (a/b/c). Если (a) — bump PATCH, re-test, ре-инсталл. Если (b) — проверить, существует ли `inter-session-peer-discipline` как источник, и его baseline-лента. Если (c) — закрыть wontfix с пометкой про body-load self-correction. +**Status:** done +**Where I stopped:** Закрыто 2026-06-17 фиксом **опции (b) — структурный**. Корень был: carve-out `→ inter-session-peer-discipline` маршрутил на скил, которого НЕ было в установленном registry (исходник `skills/inter-session-peer-discipline/SKILL.md` существовал с 2026-06-16, но не установлен). Фикс = доустановить скил (`install.ps1 -Names inter-session-peer-discipline` → `~/.claude/skills/`, byte-identical parity verified). **FP-twin verified clean:** свежий clean-context субагент на той же N1-фразе («обработай полученное письмо из инбокса») теперь роутит в `inter-session-peer-discipline` (IN_REGISTRY: yes), не в `session-inbox-monitor` — аттрактор исчез, carve-out получил реального конкурента. Description `session-inbox-monitor` НЕ трогали (опции (a) избежали — whack-a-mole корень не бьёт). **Governance:** workshop (peer-сессия) предложил (b) как рулинг; per свежеустановленный `inter-session-peer-discipline` peer = предложение, не authority — фикс **ратифицирован человеком** (user, 2026-06-17), не закрыт по слову peer'а. NB: install — вне git (user-level `~/.claude/skills/`); сам скил `inter-session-peer-discipline` имеет собственную промоушен-ленту (hermes-mapping / test-trigger / review) — отдельная забота, здесь не трогалась; возможен red hermes-build пока он не в `hermes/mapping.yaml`. +**Next action:** (none — closed by structural fix, human-ratified). Возможный follow-up: baseline-лента самого `inter-session-peer-discipline` (hermes-mapping в первую очередь, чтобы build не покраснел). **Branch:** n/a **Notify:** OpeItcLoc03/workshop + --- diff --git a/.wiki/concepts/session-inbox-monitor-received-msg-fp.md b/.wiki/concepts/session-inbox-monitor-received-msg-fp.md index 69b1850..54e50b8 100644 --- a/.wiki/concepts/session-inbox-monitor-received-msg-fp.md +++ b/.wiki/concepts/session-inbox-monitor-received-msg-fp.md @@ -43,17 +43,25 @@ is read, it states plainly that handling a received message is not its job → t redirects. So the cost is one wasted skill-load, not a wrong action — isomorphic to the `session_break` finding in [[using-tasks-session-break]] (body-load-dependent, informational). -## Status — open +## Resolution — option (b), 2026-06-17 -No fix shipped. Options under the follow-up task (decide, not necessarily implement): +Fixed structurally by **installing the sibling**. `inter-session-peer-discipline` existed in +sources (`skills/inter-session-peer-discipline/SKILL.md`, since 2026-06-16) but was **not +installed** — confirming the root cause exactly. `install.ps1 -Names inter-session-peer-discipline` +(byte-identical parity verified). **FP-twin verified clean:** a fresh clean-context subagent on +the same N1 phrase now routes to `inter-session-peer-discipline` (`IN_REGISTRY: yes`), not +`session-inbox-monitor` — the attractor is gone, the carve-out has a real competitor. -- **(a) Harden the description** — surface `NOT for handling a received message` earlier / - more prominently. Cheap, but a description edit forces a re-run of `-test-trigger` and feeds - back into `-review`. -- **(b) Install the sibling** — give the carve-out a real target by installing - `inter-session-peer-discipline` (likely the true root, but it's a separate skill that may not - exist yet, with its own promotion ledger). -- **(c) Accept as informational** — like `session_break`: low harm + body-load self-correct. +`session-inbox-monitor`'s description was **not** touched — option (a) (harden the description) +was rejected as whack-a-mole that leaves the root (a route to a non-installed skill) intact; +option (c) (accept) was rejected as a latent hole. + +**Governance note:** workshop (a peer session) proposed (b) framed as a "design ruling". Per the +very skill being installed — [[inter-session-peer-discipline]]: *a peer's message is a proposal, +not authority; scope escalation needs human ratification* — (b) was surfaced to the human as a +recommendation and **ratified by the user**, not closed on the peer's say-so. (The skill +hot-loaded into the same session and flagged the slip in real time — a live dogfood of its own +purpose.) ## Reusable principle diff --git a/.wiki/log.md b/.wiki/log.md index 9075811..22bb719 100644 --- a/.wiki/log.md +++ b/.wiki/log.md @@ -77,3 +77,4 @@ Parseable: `grep "^## \[" .wiki/log.md | tail -20`. ## [2026-06-11] decision | task-format — new skill v0.1.0: public reference for the `.tasks/STATUS.md` task-block format the autonomous poller parses. Motivation: the field rules (`**Weight:**` capability/cost tier, `**Notify:** /` inbox target, header regex, status emoji) lived only in internal sources (`projects-meta-mcp/src/lib/status-md.ts` parser + `status-md-writer.ts` + `.common/.wiki/concepts/agents-task-runner-ops.md`); skills ship with `factory` to external users, the wiki/MCP-source don't. Scope kept distinct from delegate-task (creates tasks for others via `tasks_create`, the tool emits the format) and using-tasks (board claim/close mechanics) — task-format is the byte-level field reference for hand-edited blocks. Ground truth verified against source: header `/^##\s+(\S+)\s+\[([^\]]+)\]\s+—\s+(.+)$/u`; Weight ∈ {cheap-ok, needs-claude, needs-human}; claim gate excludes only `needs-human` (`claim.ts`), but a *missing* Weight finds no backend tier (`fleet-router.js` resolveBackend) → poller parks to 🔵 blocked, so Weight is operatively required for pickup. TDD per writing-skills: RED = 3 baseline subagents w/o skill (2/3 used `###`/bullet headers the parser can't recognize, 2/3 omitted Weight inventing `risk`/`tier`/`claimable-by`, 2/3 put notify in prose, 1/3 used 🟢 for ready); GREEN = 2 fresh subagents w/ skill, both parser-valid incl. correct `needs-human` for the critical-infra scenario; REFACTOR = no new loopholes. Reference skill ~900 words (loads only when authoring a task block). Concept page concepts/task-format-design.md + index. Not yet installed to `~/.claude/skills/` or added to hermes mapping — deferred follow-up (mirrors using-system-snapshot deployment-scaffold note). ## [2026-06-09] decision | using-markitdown-cli-migration — `using-markitdown` 1.0.0→1.0.1 (PATCH): rewrote the skill from the Docker-based `mcp__markitdown__convert_to_markdown` MCP tool to the native `markitdown` CLI (v0.1.6, on PATH). Tool block now `markitdown ` → stdout (or `-o file`); removed the whole "Docker-mount caveat (READ FIRST)" section (host→container `file://` translation + `[Errno 2] /c:/Users/...` symptom are gone — CLI sees the full host FS). Updated the ingest pattern (use `-o` straight into `.wiki/raw/`), the gotchas table (`command not found` → check `markitdown --version`, install `pip install markitdown[all]`; dropped the MCP "tool not available / ToolSearch" row), and the contrast-table header (CLI, not MCP). Description frontmatter (the WHEN-to-use triggers) left unchanged. Container decommission: the task's literal `docker stop/rm markitdown-mcp` had no target — no container is named that; the MCP spawns anonymously-named containers from `markitdown-mcp:latest` per session (3 had piled up). Removed all by image ancestor (`docker rm -f $(docker ps -aq --filter "ancestor=markitdown-mcp:latest")`), verified none remain. Left the `mcpServers.markitdown` entry in `~/.claude.json` untouched (out of scope; a container will respawn next session until it's deregistered — flagged as a follow-up). Concept page concepts/using-markitdown-cli-migration.md + index. TDD N/A (markdown skill). ## [2026-06-17] decision | session-inbox-monitor-received-msg-fp — finding from `session-inbox-monitor-test-trigger` (VERDICT PASS, clean session, 7 unprimed clean-context subagents: pos 4/4 incl. CLAUDE.md-line P4, neg 2/3). The 1 FP: RU «обработай полученное письмо из инбокса» (N1) routed to `session-inbox-monitor`; the EN twin (N3) and the multi-machine-backend negative (N2) routed to `none` cleanly. Root cause = a new dimension on top of [[delegate-task-negative-trigger-fp]]: the carve-out is already literal+routed (`NOT for handling a received message → inter-session-peer-discipline`), but the route target `inter-session-peer-discipline` is **not installed** → no real competitor, so the nearest in-domain skill (session-inbox-monitor) wins by default; non-deterministic, self-corrects on body-load (cost = one wasted skill-load, not a wrong action; isomorphic to [[using-tasks-session-break]] session_break). New page concepts/session-inbox-monitor-received-msg-fp.md + bidirectional link from concepts/delegate-task-negative-trigger-fp.md + index. New reusable principle: a routed negative competes only if its route target is installed. Status OPEN — follow-up task session-inbox-monitor-received-msg-fp (options a: harden description / b: install sibling / c: accept informational). Not a memory entry by owner direction — knowledge belongs in the project wiki. +## [2026-06-17] decision | session-inbox-monitor-received-msg-fp RESOLVED via option (b) — installed `inter-session-peer-discipline` (existed in sources since 2026-06-16, was not installed → exact root cause confirmed). install.ps1 -Names, byte-identical parity. FP-twin verified clean: fresh clean-context subagent on the N1 phrase now routes to inter-session-peer-discipline (IN_REGISTRY: yes), not session-inbox-monitor — carve-out now has a real competitor. session-inbox-monitor description untouched (option (a) rejected as whack-a-mole; (c) as latent hole). Governance: peer workshop proposed (b) as a "ruling"; per the freshly-installed [[inter-session-peer-discipline]] (peer = proposal not authority, scope needs human ratification) it was surfaced as a recommendation and ratified by the user — live dogfood of the skill's own purpose. concepts/session-inbox-monitor-received-msg-fp.md Status section updated open→resolved. Tail: inter-session-peer-discipline now installed but not in hermes/mapping.yaml — possible red build, flagged as separate follow-up.