diff --git a/personal/projects/balda/execution-broker.md b/personal/projects/balda/execution-broker.md index 8dc15d98..28fd23a9 100644 --- a/personal/projects/balda/execution-broker.md +++ b/personal/projects/balda/execution-broker.md @@ -4,7 +4,7 @@ ## Состояние приёмки -`main` и `origin/main` Broker остаются на `437cbf8`. Локальный кандидат `0.1.0-rc.26` зафиксирован в `codex/production-readiness` на `b64a1ba83c82475b08276ea3fb6a54c99d4a1509`. Смежные исправления Balda — отдельная ветка `codex/production-readiness` на `223b85ad213f77edebd452147d0058588813fe6c`, checkout `/private/tmp/execution-broker-balda-production`. Кандидат не развёрнут и не опубликован; новых PR нет. Указанная Balda `223b85ad` — отклонённый прототип; актуальный HEAD `07546cae` находится в отдельной ветке `codex/ingress-outbox-v2`, см. пересмотр после ревью ниже. +`main` и `origin/main` Broker остаются на `437cbf8`. Локальный кандидат `0.1.0-rc.26` зафиксирован в `codex/production-readiness` на `b64a1ba83c82475b08276ea3fb6a54c99d4a1509`. Смежные исправления Balda — отдельная ветка `codex/production-readiness` на `223b85ad213f77edebd452147d0058588813fe6c`, checkout `/private/tmp/execution-broker-balda-production`. Кандидат не развёрнут и не опубликован; новых PR нет. Указанная Balda `223b85ad` — отклонённый прототип; актуальный HEAD `085a0d43` находится в отдельной ветке `codex/ingress-outbox-v2`, см. пересмотр после ревью ниже. Действующий Broker — `execution-broker:production-a3594c3`, gateway — `execution-broker-gateway:quality-437cbf8`, Prism — `execution-prism-adapter:session-fix-20261004`. Сверка обнаружила drift: `broker.json` и `worker.json` выбирают разные immutable images для `linux-smoke` и `linux-opencode-deepseek`; три coding-профиля worker.json по-прежнему содержат Docker socket/group. В исходниках rc.26 этот доступ запрещён, а несовпадение image pin отклоняется до выделения worker с освобождением недоставленного credential. До применения кандидата старый работающий контур этих защит не получает. macOS bootstrap-пакеты и dynamic build contexts также требуют согласованного обновления Runner/Callee/config/workflow pins. Проверки из предыдущей приёмки ниже относятся к прежним развёрнутым версиям. @@ -24,17 +24,19 @@ ### Пересмотр патчей Balda после ревью — 2026-10-14 -Старая `codex/production-readiness` / `223b85ad` — отклонённый прототип. Текущая `codex/ingress-outbox-v2` в `/private/tmp/execution-broker-balda-upstream` имеет HEAD `07546caedcaa639c972cb97dd4d0e082a27f1023`. Upstream `9dcd366023105e217467510ef39582c2133ac5b9` влит merge-коммитом `09224f7e` без конфликтов и переписывания истории. Ветка на шесть коммитов впереди и не отстаёт, дерево чистое, go.mod/go.sum не менялись. Push, PR и deploy не выполнялись. +Старая `codex/production-readiness` / `223b85ad` — отклонённый прототип. Текущая `codex/ingress-outbox-v2` в `/private/tmp/execution-broker-balda-upstream` имеет HEAD `085a0d435f727a1f4628a3259998c6498d42fcf2`. Свежий upstream `9dcd366023105e217467510ef39582c2133ac5b9` включён merge-коммитом `09224f7e`; ветка 0 behind / 7 ahead, дерево чистое, go.mod/go.sum не менялись. Изменения остаются локальными; push, PR и deploy не выполнялись. -Предыдущие исправления сохранены: `8615d512` — accepted после локального сохранения независимо от NATS, семидневный GC terminal receipts/tombstones, opt-in NATS budgets и правильные outbox ownership/wiring; `1fd3e101` — replay текстового ответа и README; `49ce205d` — canonical marketplace paths и macOS tests. +Повторное ревью выявило, что прежний replay-only фикс `4713490a` не закрывал webhook P1: pinned tgbotkit возвращает HTTP 200 до handler, поэтому второго callback или исходного text update может не быть. Этот вывод исправляет предыдущую оценку готовности. Коммит `085a0d43` сохраняет ответ и два recovery-маркера одной SQL-операцией. Отдельный `jobs/questionoutbox` запускается через Fx и автономно восстанавливает continuation после ошибки admission или рестарта без нового inbound. После durable receipt admission помечается отдельно, затем через общий outbox сохраняется очистка controls. Ошибка cleanup не переотправляет continuation; положительный Selected следует receipt. Поздняя привязка нового delivery ref возобновляет только cleanup, старый ref не может завершить новую очистку. Повтор идентичного delivery и уже завершённой очистки не создаёт её заново. -Последний P1 Telegram inline исправлен в `4713490a825f5f8b8245b22bdc7b13f5c811a9bf`. Повтор сохранённого выбора тем же пользователем восстанавливает continuation из answered-записи, в том числе после рестарта и при новом callback query ID. Другой выбор или пользователь не заменяют ответ. Telegram text/inline continuations получают общий outbox через локальный named port; прямой публикации в NATS нет. Положительный Selected отправляется только после non-nil local admission receipt. Ошибки admission/ack допускают повтор с тем же question-based ID/dedupe key. Handler-тесты с реальной SQLite проверяют dispatch error, uncertain write, сбой до dispatch, NATS outage, Telegram ack error и отсутствующий порт. Fx-тест подтверждает единый dispatcher у chat, commands и Telegram questions. +Новый regression использует настоящий pinned webhook/runtime, один HTTP update, production control publisher и Telegram adapter/messenger. Десять случаев — callback/text × ошибка AppKV, остановка до admission, ошибка до записи admission-маркера, commit маркера с ошибочным результатом, ошибка admission cleanup — проходят close/reopen SQLite и автономное восстановление без bot/второго callback. Проверяются ровно один continuation, сохранённый ответ и отсутствие раннего удаления controls/положительного ack. Отдельные контракты SQLite/PostgreSQL проверяют restart, delivery binding и независимые маркеры; миграционные тесты сохраняют прежние данные. -Финальный `go test -race ./...` прошёл в штатном macOS TMPDIR. Прошли обе storage integration race suites (PostgreSQL на свежем одноразовом контейнере, затем удалён), lint (0 issues), architecture, govulncheck (0 reachable vulnerabilities), обе migration validations, JetStream, ingress suites и build. Test cache использовался штатно. Нативные Windows/Linux CI и GitHub checks этим локальным прогоном не объявляются выполненными. Первоначальная ошибка тестовой callback fixture исправлена; её лог сохранён вместе с финальными результатами. +Выполнено самостоятельное ревью всего diff относительно upstream: 58 файлов, включая предыдущие outbox/NATS/architecture/CI/path fixes, новые файлы и документацию. В ходе него отдельный тест воспроизвёл повтор завершённой очистки; ошибка исправлена до финальных проверок. Хэши всех 58 файлов совпали с итоговым коммитом. Это self-review основного агента, не независимый PR review. -Отдельно обнаружены устаревшие CI selectors: projection-replay указывал execution вместо текущего jobs, ingress regex не выбирал webhook tests. Коммит `07546cae` исправляет эти команды: настоящий projection replay прошёл 15 раз, ingress job теперь проверяет все тесты четырёх пакетов. Названия required jobs сохранены. +На окончательном коде прошли `go test -race ./...` в штатном macOS TMPDIR, полные SQLite/PostgreSQL integration race suites, lint (0 issues), architecture, govulncheck (0 reachable vulnerabilities), обе Goose validations, настоящий projection replay 15 раз, JetStream, все ingress job packages, explicit native macOS MCP/stdio/provider/upgrade scenarios и build. PostgreSQL 17-alpine был одноразовым и удалён после тестов. Test cache использовался штатно. Это локальные проверки macOS ARM64; GitHub coverage upload и native Windows/Linux jobs не объявляются выполненными. Первые неудачные fixture/lint прогоны и red/green cleanup regression сохранены вместе с итоговыми логами. -Отчёт, история проверок и логи: `/Users/admin/Developer/execution-broker/state/production-readiness-20261014/review-followup.json`. Beads `balda-7w4` закрыта после финальных проверок в явно локальной временной базе; это не shared task и не результат независимого PR review. CLI: `/private/tmp/execution-broker-native-tools/bd`, в PATH не установлен; проектная база без issue_prefix не переинициализировалась. +README, configuration, operations и architecture docs обновлены. SQL migrations — SQLite 63 / PostgreSQL 28; перед обновлением нужен согласованный backup. Исторические answered-записи автоматически не переигрываются, потому что их прежний admission неизвестен. Гарантия начинается с сохранённого SQL-ответа; HTTP 200 означает только приём transport. Сохраняются документированные границы: один publisher на state DB, outbox expiry до 24 часов, terminal dedupe/GC семь дней. Предыдущие исправления accepted после локального сохранения, retention и opt-in NATS budgets сохранены; `07546cae` по-прежнему исправляет CI selectors. + +Отчёт, история пересмотренных оценок, хэши self-review и логи: `/Users/admin/Developer/execution-broker/state/production-readiness-20261014/review-followup.json`. Beads `balda-7w4` закрыта после всех финальных проверок в явно локальной временной базе; это не shared upstream task. CLI: `/private/tmp/execution-broker-native-tools/bd`, в PATH не установлен; проектная база без issue_prefix не переинициализировалась. ### История приёмки действующих версий diff --git a/personal/projects/balda/setup.md b/personal/projects/balda/setup.md index d9dedad2..f62ea7f2 100755 --- a/personal/projects/balda/setup.md +++ b/personal/projects/balda/setup.md @@ -2,7 +2,11 @@ Execution Broker, Telegram-одобрения и текущая приёмка: [[personal/projects/balda/execution-broker|Execution Broker — текущий локальный контур]]. -Broker-кандидат 2026-10-14: `0.1.0-rc.26` / `b64a1ba`, локальные проверки сохранены отдельно. Старая Balda `223b85ad` / `codex/production-readiness` отклонена после ревью четырёх дефектов; её зелёные тесты не подтверждали готовность upstream PR. Исправленная ветка `codex/ingress-outbox-v2` / `07546cae` синхронизирована merge’ем с upstream `9dcd3660` в `/private/tmp/execution-broker-balda-upstream`. Дополнительный коммит `1fd3e101` восстанавливает continuation из answered-записи при повторе исходного inbound и обновляет README; `49ce205d` исправляет macOS marketplace paths. `4713490a` восстанавливает Telegram inline continuation через общий outbox; `07546cae` исправляет устаревшие CI test selectors. Полный локальный race-gate прошёл в штатном TMPDIR, обе storage integration suites и остальные проверки прошли; подробности первого неудачного прогона и финального результата — в карточке выше. Изменения не развёрнуты, контейнер `balda-mm-mac` остаётся на прежнем образе. Выбор ветки или коммит не меняет действующий сервис. +Broker-кандидат 2026-10-14: `0.1.0-rc.26` / `b64a1ba`, локальные проверки сохранены отдельно. Старая Balda `223b85ad` / `codex/production-readiness` отклонена. Текущая `codex/ingress-outbox-v2` / `085a0d43` синхронизирована merge’ем с upstream `9dcd3660` в `/private/tmp/execution-broker-balda-upstream` (0 behind / 7 ahead, дерево чистое). + +Прежний replay-only фикс Telegram был недостаточен: webhook HTTP 200 предшествует handler. Теперь ответ и recovery-маркеры сохраняются атомарно в SQL, а worker восстанавливает continuation после рестарта без второго update; controls durably допускаются после continuation. Реальный single-update webhook regression с production control publisher прошёл десять failure/restart случаев для callback и текста. Самостоятельно проверен весь diff ветки (58 файлов); прошли финальный полный race-gate, обе storage integration suites, lint/architecture/security/migrations, projection/JetStream/ingress, native macOS MCP scenarios и build. SQLite migration 63 / PostgreSQL migration 28 требуют backup; исторические answered-записи не переигрываются. Полные границы и логи — в карточке выше. + +Изменения остаются локальными и не развёрнуты; контейнер `balda-mm-mac` остаётся на прежнем образе. Выбор ветки или коммит не меняет действующий сервис. _Проверено: 2026-10-09._