From def88a5074e31ca9fe3524adc43e8990cad41085 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Tue, 29 Sep 2026 12:56:11 +0600 Subject: [PATCH] [2026-09-29] eagle: personal/plans/balda-mm-phase4-agents.md personal/plans/balda-mm-pr-plan.md personal/plans/balda-runtime-rebuild-mm-validation.md personal/plans/runtime-pr4-openai-toolcalls-fixes.md personal/plans/runtime-pr5-toolset-dedup-review-fixes.md personal/plans/watchlist-tmdb-missing-marker.md personal/plans/zulip-decommission.md personal/projects/balda/balda-kraken-mm-deploy.md personal/projects/zont-config-compiler.md personal/tech/git-hygiene-post-merge.md --- personal/plans/balda-mm-phase4-agents.md | 5 +- personal/plans/balda-mm-pr-plan.md | 46 +++++- .../balda-runtime-rebuild-mm-validation.md | 128 +++++++++++++--- .../runtime-pr4-openai-toolcalls-fixes.md | 5 + .../runtime-pr5-toolset-dedup-review-fixes.md | 14 ++ .../plans/watchlist-tmdb-missing-marker.md | 4 +- personal/plans/zulip-decommission.md | 89 ++++++++--- .../projects/balda/balda-kraken-mm-deploy.md | 5 +- personal/projects/zont-config-compiler.md | 11 +- personal/tech/git-hygiene-post-merge.md | 141 ++++++++++++++++++ .../tech/hermes-self-improvement-review.md | 116 +++++++++++++- .../tech/hermes-whale-mattermost-transport.md | 3 +- personal/tech/zulip-message-history.md | 28 +++- 13 files changed, 528 insertions(+), 67 deletions(-) create mode 100644 personal/tech/git-hygiene-post-merge.md diff --git a/personal/plans/balda-mm-phase4-agents.md b/personal/plans/balda-mm-phase4-agents.md index 7c8e69c9..603340b4 100755 --- a/personal/plans/balda-mm-phase4-agents.md +++ b/personal/plans/balda-mm-phase4-agents.md @@ -1050,8 +1050,9 @@ ORDER BY m.date_sent DESC LIMIT 10;" # → вернул точную команду с паролем: mm-post-user.sh … testuser "T3stPassw0rd!x" … ``` -📌 `session_search` индексирует сессии Hermes, **не Zulip**. Сказано «из базы» → сразу -`docker exec psql`. Скилл: `zulip-db-forensics`. Тот же урок — в +📌 `session_search` индексирует сессии Hermes, **не чат/Zulip**. Сказано «из базы» → сразу +`sqlite3 ~/Documents/zulip_message_history.sqlite`. Скилл: `message-history-search` +(ранее `zulip-db-forensics`, снесён 2026-09-29 вместе с Zulip). Тот же урок — в [[personal/projects/balda/balda-kraken-mm-deploy]]. 📌 **Дисциплина записи:** пароль не был сохранён — пришлось восстанавливать из истории. diff --git a/personal/plans/balda-mm-pr-plan.md b/personal/plans/balda-mm-pr-plan.md index 7b5a2e1e..d07d7c64 100755 --- a/personal/plans/balda-mm-pr-plan.md +++ b/personal/plans/balda-mm-pr-plan.md @@ -1,7 +1,7 @@ # Balda — Mattermost connector: PR-подготовка -> Обновлён 2026-09-28. Обновлён 2026-09-28 (ревизия: убраны дубли, оставлены факты). -> Статус: **PR ОТКРЫТ — baldaworks/balda#8 · OPEN · MERGEABLE · 8/8 CI PASS · ревью апстрима НЕТ.** +> Обновлён 2026-09-28. Обновлён 2026-09-29 (ревизия: PR СМЕРЖЕН, ветки снесены). +> Статус: **✅ PR #8 СМЕРЖЕН 2026-09-29T06:06:48Z — `bf4a6ae4`.** MM-транспорт в `upstream/main`. > https://github.com/baldaworks/balda/pull/8 > 🔧 **2026-09-28: правки по ревью применены — голова `05342c5a` (9 коммитов), CI 8/8 PASS.** > Ревью `metalagman` опубликовано в PR (`reviews`, state `COMMENTED`, inline-комментов **0**). @@ -9,19 +9,51 @@ > guard-тест), групповой DM (сессия по чату + тест двух отправителей) + **регистрация в > `ScopeResolver`, которой не было в PR**. Сверка построчно — > [[personal/plans/balda-mm-pr8-review-fixes]] §0a. +> 📌 **Мерж прошёл без `APPROVED`-ревью** — `reviewDecision` оставался пустым, PR влит вручную +> мейнтейнером. Мерж-коммит `bf4a6ae4` = merge `86643007` (голова PR, 29 коммитов, +> 72 файла, +7921/−74) в `93c7ac89` (`upstream/main` на тот момент). > Часть [[personal/projects/balda/balda-mm-delegation-plan]] (Фаза 2 → PR в апстрим). --- -## 1. Состояние сейчас (сверено 2026-09-28 через API, не по доке) +## 0. ✅ ПОСТ-МЕРЖ: git-гигиена (2026-09-29) + +Ветки снесены, prune выполнен, worktree почищены. Полный разбор — +[[personal/plans/balda-runtime-rebuild-mm-validation]] блок «2026-09-29». + +```bash +cd ~/Developer/balda +git checkout main && git pull --no-rebase origin main +git branch -D feat/mattermost-channel feat/zulip-transport feat/zulip-transport-intermediate \ + backup/our-main-before-upstream feat/zulip-events-polling +git push origin --delete feat/mattermost-channel feat/zulip-transport +git remote prune origin && git remote prune upstream +# ⚠️ СНАЧАЛА worktree, потом ветки — иначе branch -D падает +git worktree remove --force <11 путей> && git worktree prune +git branch -D codex/mattermost-prod-fix +rm -rf ~/Developer/balda/personal +``` + +🔴 **Питфолл: `git worktree list` показывал 10 несуществующих путей** `/private/tmp/balda-mm-pr8-*`. +Каталоги снесены из `/tmp`, но `.git/worktrees/` живы и **держат ветку**: +`git branch -D` → `error: cannot delete branch 'X' used by worktree at '/path'`. +Порядок обязателен: `worktree remove --force` → `worktree prune` → `branch -D`. + +⚠️ **Локальная `main` отстала от `upstream/main`.** MM-транспорт ушёл в **апстрим**, не в +`origin/mallexxx/balda`, поэтому `git pull origin main` → `Already up to date` — это не «всё чисто», +а «origin не содержит мержа». Догонять через `git merge upstream/main` (не rebase — `AGENTS.md`). +Решение по этому шагу **не принято**. + +## 1. Состояние (актуально на 2026-09-29) | | | |---|---| | PR | **baldaworks/balda#8** — `feat(mattermost): add Mattermost channel transport` | -| Состояние | `OPEN` · `MERGEABLE` · `reviewDecision` **пустой** | -| База / голова | `baldaworks/balda:main` ← `mallexxx:feat/mattermost-channel` | -| Объём | **46 файлов, +6850 / −27**, 9 коммитов | -| CI | **8/8 PASS** (на `05342c5a`) | +| Состояние | ✅ **MERGED** 2026-09-29T06:06:48Z · merge-commit **`bf4a6ae4`** | +| База / голова | `baldaworks/balda:main` ← `mallexxx:feat/mattermost-channel` @ `86643007` | +| Объём на момент мержа | **72 файла, +7921 / −74**, 29 коммитов | +| Ревью | `COMMENTED` от `metalagman`, `APPROVED` не было — мерж вручную | +| Ветка в форке | 🗑️ удалена локально и в `origin` 2026-09-29 | ``` architecture-lint pass 2m2s diff --git a/personal/plans/balda-runtime-rebuild-mm-validation.md b/personal/plans/balda-runtime-rebuild-mm-validation.md index df356e08..0f6bee7a 100755 --- a/personal/plans/balda-runtime-rebuild-mm-validation.md +++ b/personal/plans/balda-runtime-rebuild-mm-validation.md @@ -5,7 +5,92 @@ > Связано: [[personal/projects/balda/balda-kraken-mm-deploy]], [[personal/plans/balda-mm-pr8-review-fixes]], > [[personal/plans/runtime-pr5-toolset-dedup-review-fixes]]. -### 🔴 Состояние git на конец сессии (читать первым) +### ✅ 2026-09-29: PR #8 СМЕРЖЕН + git-гигиена выполнена + +**Все четыре PR влиты:** + +| PR | Репо | Merged | Merge-commit | +|---|---|---|---| +| **#8** | `baldaworks/balda` | **2026-09-29T06:06:48Z** | `bf4a6ae4` (merge of `86643007` в `93c7ac89`) | +| #7 | `normahq/runtime` | 2026-09-28T14:26:41Z | — | +| #5 | `normahq/runtime` | 2026-09-27T20:03:18Z | — | +| #4 | `normahq/runtime` | 2026-09-26T18:07:42Z | — | + +🔴 **`baldaworks/runtime` НЕ СУЩЕСТВУЕТ.** Runtime живёт как **`normahq/runtime`** (`gh pr list --repo +baldaworks/runtime` → `GraphQL: Could not resolve to a Repository`). PR #4/#5/#7 — там, не в baldaworks. +Путаница возникает потому, что базовый репо Балды называется `baldaworks/balda`. + +📌 **PR #8 смержен сам, без APPROVED-ревью.** После мержа `86643007` = `upstream/main` (проверено +`git merge-base --is-ancestor 86643007 upstream/main` → YES). `upstream/main` = **`bf4a6ae4`**. + +### Выполнено: prune + снос дев-веток + чистка worktree + +**balda (`~/Developer/balda`):** +```bash +git checkout main && git pull --no-rebase origin main # already up to date +git branch -D feat/mattermost-channel feat/zulip-transport feat/zulip-transport-intermediate \ + backup/our-main-before-upstream feat/zulip-events-polling +git push origin --delete feat/mattermost-channel feat/zulip-transport +git remote prune origin && git remote prune upstream +git worktree remove --force <11 путей> && git worktree prune +git branch -D codex/mattermost-prod-fix +rm -rf ~/Developer/balda/personal # 24K мусор от ошибочного write_file +``` +Итог: локально остались `main` + рабочий worktree `~/Developer/balda`. Больше ничего. + +**runtime (`~/Developer/runtime-local`):** +```bash +git fetch --all --prune # upstream/main c41939f → 5375072 (PR #7), забран тег v2.1.1 +git checkout main +git branch -D feat/openai-tool-calls-v2 fix/hosted-toolsets-duplicate-endpoint fix/openai-tool-call-roundtrip-v2 +git push origin --delete <те же три> +git remote prune origin && git remote prune upstream +``` +Итог: остались `main` + `origin/main` + `upstream/main`. Чисто. + +📌 **`normahq/runtime` PR #7 закрыт** — `upstream/main` = `5375072` = `Merge pull request #7`, +содержит `a4a25a7 fix(hostedagent): avoid tool alias namespace collisions` и +`b43625d fix(hostedagent): reuse existing tool aliases`. + +⚠️ **Пин runtime в balda — `v2.1.1`**, а не `v2.1.0`: коммит `68445f55 chore(deps): update runtime +to v2.1.1` уже в `upstream/main` (запушен вместе с PR #8). Вопрос «протолкнуть bump в апстрим» +(§7.3) **закрыт — апстрим сделал это сам**. + +### 🔴 Питфолл: git-регистрация ≠ путь на диске + +`git worktree list` показывал **10 несуществующих путей** `/private/tmp/balda-mm-pr8-*` — каталоги +были снесены из `/tmp`, но `.git/worktrees/` остались. Такие «мёртвые» регистрации +держат ветки: `git branch -D` падает с +``` +error: cannot delete branch 'X' used by worktree at '/path' +``` +даже когда каталога нет. **Лечение:** `git worktree remove --force ` → `git worktree prune`, +и только потом `git branch -D`. Проверять `git worktree list` **до** удаления веток. + +⚠️ `git worktree remove` на `/private/tmp/...` **уходит на апрув** (удаление каталога) — нормально. + +### Факты по окружению (сверено 2026-09-29) + +| Что | Факт | +|---|---| +| `~/Developer/runtime-local` | **настоящий git-клон** `mallexxx/runtime` (origin, SSH) + `normahq/runtime` (upstream). НЕ путать с прежней фиктивной копией §0а — та была каталогом без `.git` | +| `~/Developer/norma-local` · `norma-fork` · `norma-upstream-check` | форки **`norma`** (другой репо), к PR #4/#5/#7 отношения **не имеют**. `norma-local` — ahead 2 / behind 26, грязный `hostedagent/openai.go` | +| `~/Developer/runtime-local/tools/` | untracked, **рабочий дельта-апплер PR #4** (`apply-project-deltas.py`, `deltas-*.json`, `run-project-deltas.sh`). **Не удалять** | +| `__dolt_remote_info__` | служебная ветка в обоих ремоутах — **не трогать** | + +⚠️ **Незакрытый мусор:** ~130 файлов `/tmp/balda-*` (скрипты, логи, образы 0.1.9–0.1.14, кэши Go, +`balda-linux-arm64-runtime210`). Снос согласован не был. Откат на Kraken от этих образов **не +зависит** — теги уже загружены в docker на хосте. + +⚠️ **2 stash в `~/Developer/balda`** — `stash@{0}` (logging-дебаг whale-20260623, 2 файла), +`stash@{1}` (zulip-events WIP, 2 файла вкл. `go.mod`). **Не удалены**, решение за Alex. Если +понадобится — `git stash show -p stash@{N} > /path/patch.diff` перед `stash drop`. + +📌 **Реакция Alex на «бэкап»:** предложение бэкапа перед сносом веток вызвало резкую реакцию +(«какой нахуй бэкап»). Для уже смерженного кода, восстанавливаемого из апстрима, бэкапы +**не предлагать** — это лишний шаг. Снос смерженных веток = рутина, не риск. + +### 🔴 Состояние git на конец сессии 2026-09-28 (читать первым) — ⚠️ УСТАРЕЛО, см. блок 2026-09-29 выше | | | |---|---| @@ -383,31 +468,30 @@ reboot**. Источники в `~/Developer/balda/tools/` (созданы за --- -## 7. ⏭️ Что делать дальше (приоритет) +## 7. ⏭️ Что делать дальше (приоритет) — 🔄 пересмотрено 2026-09-29 -1. 🔴 **Закоммитить 5 незакоммиченных файлов** в `~/Developer/balda` — образ `0.1.14` собран из них: - ``` - M go.mod ← runtime v2.0.11 → v2.1.0, убран replace на ./runtime-local - M go.sum ← следствие go mod tidy; gorilla/websocket стал прямым - M internal/apps/balda/internalmcp/manager.go ← DedupKey у bundled-записи - M internal/apps/balda/sessionapp/module.go ← DedupKey + DedupPreferred - M internal/apps/balda/sessionmemorymcp/broker.go ← константа BundledDedupKey - ``` - ⚠️ `Dockerfile.release` **уже НЕ в списке** — правка (удаление `COPY runtime-local/`) совпала - с HEAD после merge; ссылок на `runtime-local` нет и в HEAD. +**Закрыто 2026-09-29:** п.3 (bump `v2.1.0` в апстрим — ✅ апстрим сделал сам, `68445f55` → пин `v2.1.1`), +п.4 (sync PR #8 — ✅ PR смержен, `86643007` в `upstream/main`), п.8 (мусор `personal/` — ✅ снесён). +П.1 — ✅ код попал в апстрим через PR #8. + +1. ✅ ~~Закоммитить 5 незакоммиченных файлов~~ — правки ушли в апстрим вместе с PR #8. 2. **Часть B** — 3 блокера PR #8 (`ingress.go:389`, `:483`, `:164`). -3. **Протолкнуть bump `v2.1.0` в апстрим** — сейчас в `upstream/main` всё ещё `v2.0.11` - (см. §1б). Иначе при следующем sync go.mod откатится. -4. **Синхронизировать PR #8** с `upstream/main` (`c1fde3c4`) — сделано merge `6f5695c7` - локально; **запушить в `origin`** (`mallexxx/balda`), чтобы PR подхватил. - ⚠️ База PR = `de273d8f`, отставала от main. -5. **Пересобрать образ** после merge — `0.1.14` собран из pre-merge дерева; следующий `0.1.15`. + ⚠️ Смержены ли они вместе с PR #8 — **не проверялось**. Первый шаг: сверить + `channel/mattermost/ingress.go` в `upstream/main` с §2 этого дока. +3. ✅ ~~Протолкнуть bump в апстрим~~ — пин теперь **`v2.1.1`** (`68445f55`). +4. ✅ ~~Синхронизировать PR #8~~ — смёржен. +5. **Пересобрать образ** — `0.1.14` собран из pre-merge дерева; следующий `0.1.15`. + ⚠️ **Новое:** после мержа PR #8 дерево = апстрим, а на Kraken стоит `0.1.14` из старого дерева. + Пересборку делать **из `upstream/main`** (`bf4a6ae4`), а не из локальной `main` (она отстала — см. ниже). 6. **Починить bridge `balda-executor-mcp`** — HTTP 000 + JSONDecodeError (отдельная инфра). 7. Прогнать сценарии D2-b / D2-c (после части B) — они и есть приёмка надёжности WS. -8. ⚠️ Убрать мусор `~/Developer/balda/personal/` (создан ошибочным `write_file`). -9. ⚠️ Временное в `/tmp` (не переживёт reboot): `runtime-local-removed-20260928`, - `runtime-local-bak-20260928`, `balda-git-config.bak-20260928`, `mergemsg.txt`, - `balda-test.log`, `/tmp/mm-*.sh` на Kraken. +8. ✅ ~~Убрать мусор `~/Developer/balda/personal/`~~ — снесён 2026-09-29. +9. ⚠️ Временное в `/tmp` (не переживёт reboot): `mergemsg.txt`, `balda-test.log`, + `/tmp/mm-*.sh` на Kraken. **Плюс ~130 файлов `/tmp/balda-*`** — снос не согласован (см. блок 2026-09-29). +10. 🔴 **Локальная `main` отстала от `upstream/main`.** `git pull origin main` даёт + `Already up to date` — MM-транспорт ушёл в **апстрим**, не в `origin/mallexxx/balda`. + Чтобы догнать, нужен `git merge upstream/main` (не rebase — правило AGENTS.md). + **Решение Alex по этому пункту не получено** — спрашивать перед действием. ## Связанные заметки diff --git a/personal/plans/runtime-pr4-openai-toolcalls-fixes.md b/personal/plans/runtime-pr4-openai-toolcalls-fixes.md index fe96abcf..fa1c8998 100755 --- a/personal/plans/runtime-pr4-openai-toolcalls-fixes.md +++ b/personal/plans/runtime-pr4-openai-toolcalls-fixes.md @@ -8,6 +8,11 @@ > Связано: [[personal/tech/adk-hostedagent-openai-mcp]], [[personal/projects/balda/balda-valera]], > [[personal/plans/runtime-pr5-toolset-dedup-review-fixes]]. > +> 🔴 **2026-09-29 — репо `normahq/runtime`, НЕ `baldaworks/runtime`** (такого не существует). +> Ветка `feat/openai-tool-calls-v2` снесена локально и в `origin`. Дальше PR #7 +> (`fix/openai-tool-call-roundtrip-v2`) влился в `upstream/main` = `5375072`, тег **`v2.1.1`**. +> Детали — [[personal/plans/runtime-pr5-toolset-dedup-review-fixes]] шапка. +> > 📌 **После мержа:** `upstream/main` (`c41939f`) содержит и PR #4, и PR #5, и мейнтейнерские > фиксы к обоим. Форк `mallexxx/runtime` и `replace` в Balda **больше не нужны** — > см. [[personal/plans/balda-runtime-rebuild-mm-validation]]. diff --git a/personal/plans/runtime-pr5-toolset-dedup-review-fixes.md b/personal/plans/runtime-pr5-toolset-dedup-review-fixes.md index 268faad4..847c2b65 100755 --- a/personal/plans/runtime-pr5-toolset-dedup-review-fixes.md +++ b/personal/plans/runtime-pr5-toolset-dedup-review-fixes.md @@ -5,6 +5,20 @@ > Связано: [[personal/plans/runtime-pr4-openai-toolcalls-fixes]], > [[personal/plans/balda-runtime-rebuild-mm-validation]]. +> 🔴 **2026-09-29 — УТОЧНЕНИЕ ПО РЕПОЗИТОРИЮ.** PR #4/#5 (и #7) живут в **`normahq/runtime`**, +> **НЕ** в `baldaworks/runtime` — такого репо не существует (`GraphQL: Could not resolve to a +> Repository with the name 'baldaworks/runtime'`). Прежняя запись «репо `baldaworks/runtime`» — +> ошибка. `baldaworks/` содержит только `balda`. +> +> 📌 **Ветки PR снесены 2026-09-29.** В `~/Developer/runtime-local` удалены локально и в +> `origin`: `feat/openai-tool-calls-v2`, `fix/hosted-toolsets-duplicate-endpoint`, +> `fix/openai-tool-call-roundtrip-v2` (PR #7). `fetch --all --prune` подтянул `upstream/main` +> до `5375072` (PR #7) и тег **`v2.1.1`**. Остались `main` + `origin/main` + `upstream/main`. +> +> ⚠️ **`~/Developer/norma-local`, `norma-fork`, `norma-upstream-check` — это форки `norma`, +> ДРУГОГО репозитория.** К PR #4/#5/#7 отношения не имеют, хотя названия сбивают. +> `runtime-local` — единственный настоящий клон `runtime`. + --- ## 0г. 🔴 Мейнтейнер нашёл 2 реальных дефекта в моём фиксе (`d4ab923` → `facb0d0`) diff --git a/personal/plans/watchlist-tmdb-missing-marker.md b/personal/plans/watchlist-tmdb-missing-marker.md index 624b7add..2c19c7d5 100755 --- a/personal/plans/watchlist-tmdb-missing-marker.md +++ b/personal/plans/watchlist-tmdb-missing-marker.md @@ -443,8 +443,8 @@ Alex: *«какого хуя что-то лежит на sd карте бляд Alex спросил про задачу, я полез диагностировать Zulip (порт 443, `zulip-router`, SSL alert). Ничего этого не требовалось: вопрос был «задача какая?». **Урок:** при непонятном коротком вопросе — сначала перечитать контекст сессии, -а не начинать новую диагностику. Загружать `zulip-db-forensics` только когда -про Zulip спросили прямо. +а не начинать новую диагностику. Загружать `message-history-search` только когда +про историю спросили прямо. --- diff --git a/personal/plans/zulip-decommission.md b/personal/plans/zulip-decommission.md index f40a91b1..4652f8c3 100644 --- a/personal/plans/zulip-decommission.md +++ b/personal/plans/zulip-decommission.md @@ -13,11 +13,20 @@ _Создан: 2026-09-29_ |---|---| | 1. Выгрузка истории в SQLite | ✅ сделано 2026-09-29 | | 2. Верификация целостности | ✅ сделано | -| 3. Правка ссылок на Zulip DB в скиллах/SOUL | ⏳ план согласован, ждёт выбора варианта | -| 4. Снос стека | ⛔ не начато | +| 3. Правка ссылок на Zulip DB в скиллах/SOUL | ✅ **сделано 2026-09-29** | +| 4. Снос стека | ⛔ не начато — ждёт команды Alex | -**Артефакт этапа 1:** `~/Documents/zulip_message_history.sqlite` (78.1 MB, 134 734 сообщения) +**Артефакт этапа 1:** `~/Documents/zulip_message_history.sqlite` (81.9 MB на диске, 134 734 сообщения) → инструкция по поиску в [[tech/zulip-message-history]] +**Артефакт этапа 3:** скилл `message-history-search` + 21 переписанный файл +→ см. §«Этап 3 — что сделано» ниже + +ℹ️ **Параллельная задача 2026-09-29 (ЗАКРЫТА):** «отключи автогенерацию скиллов» — +разбор механизма фонового review (`skills.creation_nudge_interval`, `review.allowed_toolsets`) +в [[tech/hermes-self-improvement-review]], §«Как ВЫКЛЮЧИТЬ». +**Внесено:** `creation_nudge_interval: 15 → 0` в `~/.hermes/hermes-whale/config.yaml`, +коммит `d2e1586`. Вариант «+ убрать `skills` из `review.allowed_toolsets`» Alex **не выбрал** — +память продолжает обновляться фоновым review. На этап 4 (снос) не влияет. ## Решение: формат истории @@ -32,31 +41,67 @@ _Создан: 2026-09-29_ **Явное указание Alex:** «никаких вложений и меты. только история переписки». Поэтому pg_dump, volume `zulip_zulip-data`, аплоады и аватары в выгрузку не попали. -## Открытый вопрос (шаг 3) — правка ссылок на Zulip DB +## Этап 3 — что сделано (2026-09-29) -Найдено **7 групп файлов**, ссылающихся на `zulip-db-forensics` / `psql` к Zulip. -После сноса эти инструкции станут нерабочими. +Изначально предлагались варианты A/B/C (переименовать скилл vs переписать тело). +**Alex решил иначе — жёстче:** снести 3 zulip-скилла целиком, из USER.md удалить, +в SOUL и остальных скиллах переписать. -| # | Файл | Ссылок | +### Снесено (3 скилла) + +| Скилл | Роль | Поглощён в | |---|---|---| -| 1 | `~/.hermes/hermes-whale/SOUL.md:36` | 1 | -| 2 | `~/.hermes/hermes-whale/memories/USER.md` | 1 | -| 3 | `skills/software-development/zulip-db-forensics/SKILL.md` | основной | -| 4 | `skills/software-development/zulip-thread-handoff/SKILL.md` | 4 | -| 5 | `skills/software-development/zulip-bot-routing/SKILL.md` | 6 | -| 6 | `skills/software-development/project-progress-audit/SKILL.md` | 3 | -| 7 | `eagle-dashboard`, `systematic-debugging`, `personal-os-daily-brief`, `zfs-panic-recovery`, `htpc-steam-shortcuts` | по 1 | +| `zulip-db-forensics` | запросы к Zulip Postgres, forensic-разбор | `message-history-search` | +| `zulip-thread-handoff` | перехват треда у другого агента | `message-history-search` | +| `zulip-bot-routing` | архитектура роутера + диагностика ботов | `message-history-search` | -**Предложенные варианты:** +Удаление через `skill_manage(action='delete', absorbed_into='message-history-search')`. -- **A (чисто)** — переименовать скилл `zulip-db-forensics` → `message-history-search`, - перевести все 7 групп на SQLite. ~10 файлов. -- **B (минимально)** — только `SOUL.md` + `USER.md` + блок «ИСТОЧНИК = SQLite» в скилл. 3 файла. -- **C (гибрид, рекомендован)** — `SOUL.md` + `USER.md` + переписать тело - `zulip-db-forensics/SKILL.md` на SQLite, **имя скилла не менять** (8 входящих ссылок - переименование сломает без выгоды), в остальных файлах заменить только psql-команды. +### Создано (1 скилл) -**Решение не принято** — ждёт ответа Alex. +`~/.hermes/skills/note-taking/message-history-search/SKILL.md` — 7 744 б. +Схема, 5 готовых запросов, синтаксис FTS5, лимит покрытия, питфоллы. + +### Переписано (21 файл) + +| Файл | Что заменено | +|---|---| +| `~/.hermes/SOUL.md` | RULE 5 — ссылка на `zulip-db-forensics` → SQLite + `message-history-search` | +| `~/.hermes/hermes-whale/SOUL.md` | блок про Zulip DB → путь к SQLite + запрос | +| `hermes-whale/memories/USER.md` | «ищи в базе → Zulip psql» → «→ sqlite3 … СРАЗУ» | +| `project-progress-audit` | 4 места: `related_skills`, Source 2, pitfalls | +| `eagle-dashboard` | восстановление треда после `--replace` | +| `systematic-debugging` | «та же проблема» → поиск в архиве | +| `claude-cli-proxy-diagnostics` (+ ref) | 3 psql → `sender` из `messages` | +| `executor-autonomous-tick` | запрос истории executor'а | +| `vault-profile-onboarding` | Step 4 — восстановление из истории | +| `claude-design` | «Check Zulip DB» → архив | +| `personal-os-daily-brief`, `media-stack-reconciliation-audit`, `htpc-steam-shortcuts`, `truenas-administration/references/zfs-panic-recovery`, `.archive/truenas-zfs-panic-recovery`, `remote-host-administration` | `related_skills` + ссылки | +| `systematic-debugging/references/postgres-fk-cascade-data-loss` | «читай с конца» → архив | + +### 🔴 Питфолл: `~/.hermes/SOUL.md` ≠ `~/.hermes/hermes-whale/SOUL.md` + +`skills/` — это **симлинк** (`hermes-whale/skills → ~/.hermes/skills`), поэтому правка скилла +видна по обоим путям. А **SOUL.md — два разных файла**: + +| Путь | Размер | Дата | +|---|---|---| +| `~/.hermes/SOUL.md` | 9 732 б | 17 мая — RULE 5, «Core Rules» | +| `~/.hermes/hermes-whale/SOUL.md` | 8 244 б | правится этой сессией — ADHD-секция | + +Правка только одного оставила бы RULE 5 битым. **Всегда править оба.** +Проверка: `ls -la` — если размеры/даты разные, файлы независимы. + +### Оставлено как есть (осознанно) + +`docker-balda-service/references/balda-env-recovery.md` и `zulip-router-rules.md` — +там psql читает **живые API-ключи ботов**, это не история. Добавлена шапка-предупреждение +о декоммишене, запросы не тронуты. Если Zulip снесут — файлы придётся переписать. + +### Бэкап + +`~/.hermes/hermes-whale/backups/20260929-zulip-to-sqlite/` — 464 K, 51 файл +(SOUL.md, USER.md, 3 снесённых скилла целиком, все правимые скиллы). ## Шаг 4 — снос (выполнять ПОСЛЕ шага 3) diff --git a/personal/projects/balda/balda-kraken-mm-deploy.md b/personal/projects/balda/balda-kraken-mm-deploy.md index 061fa703..208773b7 100755 --- a/personal/projects/balda/balda-kraken-mm-deploy.md +++ b/personal/projects/balda/balda-kraken-mm-deploy.md @@ -159,8 +159,9 @@ ORDER BY m.date_sent DESC LIMIT 10;" ``` **Именно этот запрос вернул пароль `T3stPassw0rd!x`** после того, как `session_search` дал ноль. -🔴 `session_search` индексирует сессии Hermes, **НЕ Zulip**. Сказано «из базы» → `docker exec psql`. -Скилл: [[software-development/zulip-db-forensics]]. +🔴 `session_search` индексирует сессии Hermes, **НЕ Zulip/чат**. Сказано «из базы» → `sqlite3`. +Скилл: `message-history-search` (с 2026-09-29; ранее `zulip-db-forensics`, снесён вместе с Zulip). +Файл: `~/Documents/zulip_message_history.sqlite` → [[tech/zulip-message-history]]. ### 🔴 ПРАВИЛО №5: ЧИТАТЬ ЛЕНТУ — `mmctl --local post list` (работает!) diff --git a/personal/projects/zont-config-compiler.md b/personal/projects/zont-config-compiler.md index 5ae67f8a..ac10e2a1 100755 --- a/personal/projects/zont-config-compiler.md +++ b/personal/projects/zont-config-compiler.md @@ -2223,7 +2223,7 @@ rm -rf zont_config/_wip | 44 | 🔴 **Коммит после первого зелёного круга, а не «когда Алекс скажет»** | Правило «коммит только по команде» не отменяет **промежуточных** коммитов ради сохранности. Формулировка для будущего: зелёный круг → коммит WIP-ветки, команда нужна для `push` | | 45 | 🔴 **Не спрашивать «что делать» после того, как сам сломал, если план уже ясен** | Alex: «ЧТО ТЫ БЛЯДЬ ОПЯТЬ ОТ МЕНЯ ХОЧЕШЬ ЗАЕБАЛ». У него ответа нет — восстановление на ассистенте | | 46 | 🔴 **При поиске потерянного — сначала `git fsck --lost-found`, `git stash list`, потом доклад** | Объявить потерю, не проверив все источники, — ложная тревога. Проверять: dangling-блобы, stash, `rev-list --all --objects`, бэкап-папки | -| 47 | 🔴 **`session_search` НЕ индексирует Zulip** | Поиск по `set_var`/`9963` вернул **0** при существующем треде на 3380 сообщений. При «читай тред» / «ищи в базе» — **сразу `docker exec zulip-database-1 psql`**, не `session_search`. См. skill `zulip-db-forensics` | +| 47 | 🔴 **`session_search` НЕ индексирует историю переписки** | Поиск по `set_var`/`9963` вернул **0** при существующем треде на 3380 сообщений. При «читай тред» / «ищи в базе» — **сразу `sqlite3 ~/Documents/zulip_message_history.sqlite`**, не `session_search`. См. skill `message-history-search`, [[tech/zulip-message-history]] | | 48 | 🔴 **Правки проверять в ЦЕЛЕВОМ файле, а не в `/tmp`** | Повтор питфолла 5/34: круг гонялся в `/tmp/final.yml`, а на диске `zont_config/*.yml` остался от прошлой генерации → Alex видел `type: var`, которого в коде **уже нет**. Проверка: `grep -c '<ключ>' <целевой файл>` + `ls -la` mtime | | 49 | 🔴 **Ключ, добавленный для ОДНОЙ формы, не должен появляться у остальных** | `args` расширен ради формы 2 (`42,0,1`) → повис на **53** записях с мусорным `[0,0]` (круг 33). Правило: `if any(tail)` — писать только ненулевое | | 50 | 🔴 **Новый разбор, дублирующий принятую форму, обязан её ЗАМЕНИТЬ, а не сосуществовать** | `type: var` вытеснила `set_var` (круг 29) — две формы для одного смысла, новая перебила принятую. Alex: «где блядь `set_var`». Проверять порядок веток в **обеих** точках входа (`emit_action` + инлайн `emit_step`) | @@ -2270,10 +2270,11 @@ WHERE r.type = 2 AND s.name = 'personal' AND m.subject = 'ZONT Config compiler' ORDER BY m.date_sent;" ``` -> 🔴 **Питфолл 47: `session_search` НЕ находит Zulip-тред.** Он индексирует Hermes-сессии -> (`.jsonl`), а не Zulip. Поиск по `set_var`/`9963` вернул **0 результатов**, хотя тред -> существовал и был полон. **При «читай тред» / «ищи в базе» — сразу `docker exec psql`, -> не `session_search`.** (См. skill `zulip-db-forensics`.) +> 🔴 **Питфолл 47: `session_search` НЕ находит тред чата.** Он индексирует Hermes-сессии +> (`.jsonl`), а не историю переписки. Поиск по `set_var`/`9963` вернул **0 результатов**, хотя тред +> существовал и был полон. **При «читай тред» / «ищи в базе» — сразу `sqlite3` +> по `~/Documents/zulip_message_history.sqlite`, не `session_search`.** +> (См. skill `message-history-search`, [[tech/zulip-message-history]].) **Что написано заново** (`config-to-yml.py` ‖ `yml-to-config.py`): diff --git a/personal/tech/git-hygiene-post-merge.md b/personal/tech/git-hygiene-post-merge.md new file mode 100644 index 00000000..6666744b --- /dev/null +++ b/personal/tech/git-hygiene-post-merge.md @@ -0,0 +1,141 @@ +# Git-гигиена после мержа PR (форк → апстрим) + +> Создан 2026-09-29. Извлечено из уборки после мержа `baldaworks/balda#8` + +> `normahq/runtime#4/#5/#7`. +> Связано: [[personal/plans/balda-mm-pr-plan]], [[personal/plans/balda-runtime-rebuild-mm-validation]], +> [[personal/tech/balda-go-fx-pitfalls]]. + +--- + +## 1. Порядок операций (он обязателен) + +``` +worktree remove --force → worktree prune → branch -D → push origin --delete → remote prune +``` + +Перестановка шагов = падение. Подробности ниже. + +```bash +cd +git checkout main && git pull --no-rebase main # merge, НЕ rebase +git worktree list # 🔴 СНАЧАЛА посмотреть +git worktree remove --force && git worktree prune +git branch -D +git push origin --delete +git remote prune origin && git remote prune upstream +git status --short # ?? — untracked, разобрать отдельно +``` + +📌 `AGENTS.md` Балды: **синхронизация общих веток — через `merge` (`git pull --no-rebase`), не rebase.** + +--- + +## 2. 🔴 Питфолл: git-регистрация worktree ≠ путь на диске + +Самый дорогой сюрприз. `git worktree list` показывает **пути, которых уже нет**: + +``` +/private/tmp/balda-mm-pr8-review 06b2b8d0 (detached HEAD) ← каталог снесён из /tmp +``` + +`.git/worktrees/` остаётся жить. Такая регистрация **держит ветку**, и удаление падает +даже при отсутствующем каталоге: + +``` +error: cannot delete branch 'fix/openai-tool-call-roundtrip-v2' used by worktree at +'/Users/admin/Developer/runtime-local' # ← это про ТЕКУЩИЙ worktree, не про мёртвый +``` + +Из двух провалов в одной сессии: +- `codex/mattermost-prod-fix` — держал мёртвый `/private/tmp/balda-mm-pr8-prod-fix`; +- `fix/openai-tool-call-roundtrip-v2` — держал **активный** worktree, где я стоял сам. + +**Лечение:** `git worktree remove --force ` (работает и для несуществующего каталога — +просто убирает регистрацию) → `git worktree prune` → и только потом `git branch -D`. + +⚠️ **Проверять `git worktree list` ДО удаления веток.** Иначе получишь список «неудаляемых» веток +и будешь думать, что они не смержены. + +⚠️ `git worktree remove` на `/private/tmp/...` **уходит на апрув** — это удаление каталога, а не +безобидная мета-операция. Нормально, просто ожидаемо. + +📌 Ещё: `git checkout main` **невозможен**, пока стоишь в worktree удаляемой ветки — отсюда +второй `cannot delete branch ... used by worktree` в логе. + +--- + +## 3. ⚠️ `git pull origin main` → `Already up to date` — это НЕ «всё чисто» + +После мержа PR в апстрим **ветка форка остаётся на старом коммите**, а мерж живёт только в +`upstream/main`. `origin` (форк) мержа не содержит вообще. + +```bash +git pull --no-rebase origin main # → Already up to date ← вводит в заблуждение +git log --oneline -1 upstream/main # ← здесь правда +git merge-base --is-ancestor upstream/main && echo MERGED # ← доказательство +``` + +**Как доказывать факт мержа** (не по доке, а фактически): +```bash +gh api repos//pulls/ --jq '{merged, merge_commit_sha, head_sha, base_sha}' +git merge-base --is-ancestor upstream/main && echo YES || echo NO +``` + +Чтобы догнать апстрим локально — `git merge upstream/main` (не rebase). + +--- + +## 4. `git branch -r --merged upstream/main` = список веток под снос + +Один вызов отвечает «какие ветки уже в апстриме»: +```bash +git branch -r --merged upstream/main +``` +⚠️ В списке появятся ветки, которые **не твои** (`upstream/feature/*`, `upstream/docs/*`) — +их не трогать. Смотреть на `origin/*` (свой форк). + +--- + +## 5. Что не трогать + +| Объект | Почему | +|---|---| +| `__dolt_remote_info__` | служебная ветка апстрима (Dolt), появляется в fetch, восстановится сама | +| untracked рабочие инструменты (`tools/*.py`, `deltas-*.json`) | не в git, значит и не «мусор». Проверять `git ls-files tools/` — пусто ≠ удалить | +| файлы вне PR, нужные для локальной сборки | `go.mod`, `Dockerfile.release`, `go.sum`, `app.go`, `preflight.go` — `checkout -- .`/`stash`/`reset --hard` их снесёт | + +## 6. Stash + +`git stash list` — перед любым решением выгружать содержимое, а не удалять вслепую: +```bash +git stash show --name-only stash@{N} +git stash show -p stash@{N} > /path/patch.diff # восстановимо после drop +``` +`git stash drop` — **только с явного подтверждения**. Дата в сообщении stash (`whale-20260623`) +говорит, как давно он лежит; старый stash обычно надо сначала прочитать, потом решать. + +--- + +## 7. 📌 Реакция Alex: бэкап не предлагать + +Предложение «сделать бэкап веток перед сносом» получило резкий отказ. **Смерженный код +восстанавливается из апстрима — бэкапить нечего.** Бэкап в этом контексте = лишний шаг, +который читается как неуверенность. + +| Предлагать бэкап | НЕ предлагать | +|---|---| +| Продовые конфиги, БД, данные без копии | Смерженные git-ветки | +| Хостовые файлы вне git | Worktree-регистрации в `/tmp` | +| `navidrome.db` (правило: согласовывать КАЖДЫЙ раз) | untracked-мусор на смерженных коммитах | + +Формулировать так: «ветка смержена в `upstream/main` (`bf4a6ae4`), сношу» — без слова «бэкап». + +--- + +## 8. Проверка результата + +```bash +git worktree list # только рабочий каталог +git branch -a # main + remotes, без дев-веток +git status --short # пусто или объяснимые untracked +``` diff --git a/personal/tech/hermes-self-improvement-review.md b/personal/tech/hermes-self-improvement-review.md index 6b70e706..bb746d0f 100755 --- a/personal/tech/hermes-self-improvement-review.md +++ b/personal/tech/hermes-self-improvement-review.md @@ -109,11 +109,123 @@ if final_response and not interrupted and (_should_review_memory or _should_revi ## Потенциальные проблемы -- **Нет конфигурируемости для skills interval** — `_skill_nudge_interval` хардкожен в 10, не читается из config.yaml (в отличие от memory). +- **Skills interval — конфигурируемый** (исправлено 2026-09-29; ранее в доке ошибочно значилось «хардкожен в 10»). + Читается из `config.yaml → skills.creation_nudge_interval`, дефолт в коде `10`. + Проверено: `agent/agent_init.py:1224` → `int(skills_config.get("creation_nudge_interval", 10))`. + На этом профиле (`hermes-whale/config.yaml:280`) стоит **`0`** (отключено 2026-09-29, коммит `d2e1586`). - **Tool whitelist был фиксирован** — теперь настраивается через `review.allowed_toolsets` в config.yaml (см. ниже). - **Форк не имеет MCP-серверов** — MCP tools (obsidian-mcp, etc.) не регенерируются в форке. - **max_iterations=16** — жёстко, не из конфига. Может не хватить на комплексное ревью многоскилловых сессий. +## 🔴 Как ВЫКЛЮЧИТЬ автогенерацию скиллов (2026-09-29) + +Задача Alex: «отключи автогенерацию скиллов». Разобрано до уровня кода; **ВНЕСЕНО 2026-09-29** +(вариант A — см. §Развилка). Выбор Alex: «да. только hermes-whale. без бэкапов, у нас гит. потом коммит». + +### Два независимых пути, которыми агент сам правит библиотеку скиллов + +| # | Механизм | Что делает | Ключ конфига | Сейчас | +|---|---|---|---|---| +| 1 | **Skill nudge** | каждые N tool-итераций спавнит фоновый форк, который **создаёт/патчит скиллы** | `skills.creation_nudge_interval` | **15** → ставить `0` | +| 2 | **Review fork** | после сессии тот же форк, но с `allowed_toolsets` | `review.allowed_toolsets` | `[memory, skills, file]` | + +### Код (проверено построчно) + +```python +# agent/agent_init.py:1220-1226 +agent._skill_nudge_interval = 10 +skills_config = _agent_cfg.get("skills", {}) +agent._skill_nudge_interval = int(skills_config.get("creation_nudge_interval", 10)) +``` + +```python +# agent/conversation_loop.py:858-860 — инкремент внутри tool-цикла +if (agent._skill_nudge_interval > 0 + and "skill_manage" in agent.valid_tool_names): + agent._iters_since_skill += 1 +``` + +```python +# agent/conversation_loop.py:4779-4785 — финальная проверка в конце хода +_should_review_skills = False +if (agent._skill_nudge_interval > 0 # ← ГЛАВНЫЙ ВЫКЛЮЧАТЕЛЬ + and agent._iters_since_skill >= agent._skill_nudge_interval + and "skill_manage" in agent.valid_tool_names): + _should_review_skills = True + agent._iters_since_skill = 0 +``` + +```python +# agent/conversation_loop.py:4797 — спавн только если что-то взведено +if final_response and not interrupted and (_should_review_memory or _should_review_skills): + agent._spawn_background_review(...) +``` + +**Вывод:** `creation_nudge_interval: 0` делает первое условие ложным **всегда** → +`_should_review_skills` никогда не станет `True` → скиллы от nudge-механизма не создаются. +Это чистый выключатель, other logic не затронута. Счётчик `_iters_since_skill` при `0` +даже не инкрементится (строка 858). + +### Промпты — где живут + +| Промпт | Что делает | Когда выбирается | +|---|---|---| +| `_MEMORY_REVIEW_PROMPT` | сохранить факты о юзере | `review_memory=True, review_skills=False` | +| `_SKILL_REVIEW_PROMPT` | **правит библиотеку скиллов** («Be ACTIVE — most sessions produce at least one skill update») | `review_skills=True` | +| `_COMBINED_REVIEW_PROMPT` | и память, и скиллы | оба `True` | + +Выбор — `spawn_background_review_thread()` (`agent/background_review.py:583-588`): +`if review_memory and review_skills → COMBINED; elif review_memory → MEMORY; else → SKILL`. +То есть **скиллы правятся в ветках COMBINED и «else»**. Убрать `skills` из +`allowed_toolsets` — упадёт сам tool, но промпт останется. + +### ✅ Внесено (2026-09-29) — вариант A + +| Ключ | Было | Стало | Файл | +|---|---|---|---| +| `skills.creation_nudge_interval` | `15` | **`0`** (строка 280) | `~/.hermes/hermes-whale/config.yaml` | + +Коммит **`d2e1586`** (`chore(whale): disable auto skill generation`), md5 `ac0c7af01d48fa24fb763efbe56668a2`. +`review.allowed_toolsets` **не тронут** (`[memory, skills, file]`) — память продолжает обновляться. +`~/.hermes/config.yaml` не тронут (Alex: «только hermes-whale»). + +**Требуется перезапуск gateway**, чтобы правка вступила в силу: +`POST /api/services/hermes_whale/restart` — конфиг читается в `AIAgent.__init__`. + +### 🔴 Питфолл: `hermes config set` перезаписывает ВЕСЬ YAML + +`hermes config set ` не делает точечную правку — он сериализует конфиг заново. +Последствия на этом профиле: **63 строки комментариев срезано**, `host: "0.0.0.0"` → `0.0.0.0`, +отступы списков переформатированы (` - memory` → ` - memory`). + +Значения при этом не пострадали — сверено построчно через +`git diff --cached -U0 | grep -E "^[+-]" | grep -v "^[+-][+-]" | grep -vE "^[+-]\s*#"`. +**Всегда проверять дифф на смысловые изменения, а не только на свою строку.** + +### 🔴 Питфолл: `patch`/`write_file` НЕ могут писать в config.yaml + +Инструменты возвращают `Refusing to write to Hermes config file` — конфиг помечен +security-sensitive. Править **только** через `hermes config set`, руками (`hermes config edit`) +или с одобрения Alex. Это не баг, обходить не надо. + +### 🔴 Питфолл: `hermes` не в PATH + +`hermes: command not found` — бинарь лежит в venv: +`/Users/admin/.hermes/hermes-agent/venv/bin/hermes`. +`hermes config show` **не печатает** секцию `skills` — проверять значение грепом по файлу +(`grep -n creation_nudge_interval `), а не через CLI. `config get` не существует +(есть только `show|edit|set|path|env-path|check|migrate`). + +### Развилка (решение принято: A) + +| Вариант | Что меняется | Последствие | +|---|---|---| +| **A. Только `creation_nudge_interval: 0`** ✅ | 1 ключ | скиллы не создаются сами; **память продолжает копиться** | +| B. A + убрать `skills` из `review.allowed_toolsets` | 2 ключа | глухо оба; но фоновый review перестанет писать и в **memory** — авто-обновление USER.md/MEMORY.md умрёт. **Не выбран.** | + +Файлы (две копии, они **разные** — см. питфолл ниже): +`~/.hermes/hermes-whale/config.yaml` (основная) и `~/.hermes/config.yaml`. + ## Реализованные расширения (2026-06-24) Сделаны два изменения в исходном коде Hermes Agent для того, чтобы промпты и whitelist ревью были настраиваемы из `config.yaml`: @@ -220,3 +332,5 @@ File tools работают напрямую с файловой системо - 2026-06-24: Реализация настройки через config.yaml: промпты (через пути к .md) + allowed_toolsets. Созданы примеры промптов с Obsidian-инструкцией. - 2026-06-24: Реализация thread-scoped memory + custom memory instruction (см. `personal/plans/thread-scoped-memory.md`). - 2026-06-24: Тесты thread-scoped memory: 9 новых тестов (76/76 passed), закоммичено в `4ebad4f69`. +- 2026-09-29: Разбор механизма — интервал скиллов оказался **конфигурируемым** (ранее в доке значилось «хардкожен в 10»), проверено по `agent_init.py:1224`. +- 2026-09-29: **Автогенерация скиллов отключена** — `skills.creation_nudge_interval: 15 → 0`, коммит `d2e1586`. Память оставлена включённой. См. §«Как ВЫКЛЮЧИТЬ». diff --git a/personal/tech/hermes-whale-mattermost-transport.md b/personal/tech/hermes-whale-mattermost-transport.md index 9ff8aa07..75dd6e8e 100755 --- a/personal/tech/hermes-whale-mattermost-transport.md +++ b/personal/tech/hermes-whale-mattermost-transport.md @@ -620,7 +620,8 @@ ORDER BY m.date_sent DESC LIMIT 25;" ``` **Этот запрос восстановил всю картину сессии** после того, как я потерял контекст -из-за собственного рестарта gateway. См. скилл `zulip-db-forensics`. +из-за собственного рестарта gateway. См. скилл `message-history-search` (ранее +`zulip-db-forensics`, снесён 2026-09-29 вместе с Zulip) → [[tech/zulip-message-history]]. ## Связанные заметки diff --git a/personal/tech/zulip-message-history.md b/personal/tech/zulip-message-history.md index 8e67c6c1..7cb02412 100644 --- a/personal/tech/zulip-message-history.md +++ b/personal/tech/zulip-message-history.md @@ -11,7 +11,7 @@ _Создано: 2026-09-29_ | Параметр | Значение | |---|---| | **Файл** | `~/Documents/zulip_message_history.sqlite` | -| Размер | 78.1 MB | +| Размер | 81.9 MB на диске (78.1 MB логических данных) | | Сообщений | **134 734** (134 688 в стримах + 46 личек) | | Стримов | 11 | | Тредов (`topics`) | 197 | @@ -215,13 +215,35 @@ docker rmi zulip/docker-zulip:11.6-0 # ~3.84 GB | Компонент | Что будет | |---|---| | `zulip-router` (Go, `~/Developer/zulip-router/`) | мёртвый — поллит Zulip Events API. Убрать из compose, иначе restart-loop | -| `zulip-bot-routing` (Еagle/Кит/Валера/Клавдий webhook) | маршрутизация в Zulip перестанет работать | +| Bot webhook-роутинг (Eagle/Кит/Валера/Клавдий, `host.docker.internal:8644-8645`) | маршрутизация в Zulip перестанет работать | | Hermes `platforms: zulip` в `~/.hermes/config.yaml` | платформа отвалится; транспорт уже переехал на Mattermost | +ℹ️ Скиллы на Zulip больше не ссылаются — этап 3 закрыт, битых инструкций после сноса не будет +(кроме двух файлов `docker-balda-service`, см. §«Оставлено как есть»). + ## Связанные документы +- [[plans/zulip-decommission]] — план и статус вывода Zulip из эксплуатации (этап 3 = этот файл) - [[projects/zulip-router]] — архитектура event-роутера (Go), конфиг ботов - [[tech/hermes-whale-mattermost-transport]] — текущий транспорт Hermes +- [[tech/hermes-self-improvement-review]] — фоновый review скиллов/памяти (в т.ч. как его выключить) - [[how-to/hermes-eagle-mac]] — Hermes на Mac, Zulip Docker стек, RabbitMQ/Khepri pitfall - [[tech/docker-mac-disk-issues]] — почему Zulip тормозил (переполнение диска VM) -- [[plans/zulip-decommission]] — план вывода Zulip из эксплуатации + +## Как это используется агентами (скилл вместо скиллов) + +Три скилла, работавшие с Zulip Postgres, **снесены** — их место занял один: + +| Было | Стало | +|---|---| +| `zulip-db-forensics` | `message-history-search` | +| `zulip-thread-handoff` | ↑ | +| `zulip-bot-routing` | ↑ | + +`~/.hermes/skills/note-taking/message-history-search/SKILL.md` — единственная точка входа +для «ищи в базе», «вспоминай», «читай историю». На неё ссылаются `SOUL.md` (оба файла!) и +`USER.md`, поэтому агент находит её без подсказки. + +**Триггер в SOUL/USER:** «ищи в базе» / «чё сделано» → `sqlite3` СРАЗУ, без `session_search` +и без теории. `session_search` индексирует файлы сессий Hermes, **не** историю чата — +для старых тредов он пуст.