Skip to content

Coordination M1–M2b1: durable dialogue, Qwen outbox, guarded tools and SSE replay - #1

Open
Wave-is wants to merge 5 commits into
mainfrom
feature/durable-coordination-journal
Open

Wave-is wants to merge 5 commits into
mainfrom
feature/durable-coordination-journal

Conversation

@Wave-is

@Wave-is Wave-is commented Sep 14, 2026

Copy link
Copy Markdown
Owner

Цель

Сохранять исходный диалог и все уточнения пользователя программно, до передачи агенту. Summary модели не является источником истины. Изменения opt-in: установленная Station, main, модели, GPU и удалённые серверы не меняются.

M1 — e178ee7

  • SQLite WAL/FULL journal: точные сообщения/редакции, неизменяемые вложения, ID и ревизии.
  • Пакет передачи с исходными сообщениями, подтверждение конкретной ревизии.
  • Попытки с lease/epoch, единственный писатель, предварительная запись tool intent.
  • Запоздалые результаты сохраняются как evidence; неопределённые действия нельзя автоматически повторять.
  • 53 новых offline-теста и synthetic smoke. CI: https://github.com/Wave-is/laas/actions/runs/34882124561

M2a — fda25d3

  • Managed-input API адаптера Qwen: сообщение и outbox одной транзакцией, FIFO, редакции и вложения.
  • Один capability-gated loopback POST. HTTP 202 — принятие в очередь, не доставка всего контекста и не выполнение.
  • External Tool Guard v1: authenticated handshake/prepare, deny-by-default, актуальная ревизия/попытка, durable permit-intent, защита от повторного request/tuple.
  • Не разрешает nested/background tools и не предоставляет произвольный shell/reconciliation/выдачу полномочий через HTTP.
  • 78 новых тестов. CI: https://github.com/Wave-is/laas/actions/runs/34889021926

M2b1 — ab238e9

  • Явный authenticated loopback GET/SSE receiver; без автозапуска и новых зависимостей.
  • Сохранение raw event, epoch/cursor и проекции результата одним SQLite commit.
  • Точное повторное событие дедуплицируется. Пропуск, изменённый epoch, конфликт replay, потеря записи/сессии, rewind или смена модели блокируют новые разрешения до reconciliation.
  • Новый observer проходит catching_up → live; устаревшее соединение не может управлять новым. Свежесть observer проверяется перед отправкой/Tool Guard.
  • Только совпадающий runtime/session/prompt terminal завершает запись очереди. Событие, пришедшее раньше HTTP 202, связывается после сохранения receipt без повторной отправки prompt.
  • Tool result применяется только к ранее разрешённому foreground вызову. Поздний результат после уточнения или отмены остаётся needs_review; отсутствие результата не заменяется сообщением «готово».
  • 89 новых тестов и отдельный synthetic smoke.

Проверка M2b1

  • M1+M2a+M2b1: 220 passed локально.
  • Три synthetic smoke: PASS.
  • Расширенный локальный прогон: 368 passed, 1 skipped, 1 deselected; два GUI-модуля исключены из-за отсутствующего customtkinter. Полная коллекция была попытана и не считается прошедшей.
  • compileall и git diff --check: PASS.
  • Полная неизменённая матрица Windows/Linux Python 3.11/3.13 и Windows installer запускается CI нового commit; фактический исход фиксируется в комментарии.

Граница готовности

task_control=False, automatic_failover=False, live_runtime_verified=False.

SSE observer реализован и проверен синтетическими SQLite/HTTP тестами, но не подключён автоматически к установленному Qwen. Native Desktop/Telegram/steering ingress, подтверждение доставки полного пакета с бюджетом контекста и остановка реальных tool-процессов ещё не квалифицированы. Existing chats не получают защиту автоматически. HTTP 202/replay_complete/terminal/assistant text не подтверждают доставку требований или успешность тестов. Guard остаётся foreground top-level, не sandbox.

Следующий блок M2b2: реальные input/delivery/process boundaries в disposable Qwen-сессии, затем M3 диспетчеризация.

Документы: docs/COORDINATION.md, docs/QWEN_MANAGED_COORDINATION.md, docs/QWEN_EVENT_OBSERVER.md, docs/HANDOFF.md, docs/WORKLOG.md, docs/VALIDATION.md. Не сливать main и не публиковать/устанавливать новый релиз автоматически.

…tempts

Add opt-in SQLite journal with exact user messages/edits and attachments,
replayable delivery receipts, project revisions, leased attempts and a
single-writer/action-intent gate. Preserve late runtime evidence and fail
closed on ambiguous tool effects. Summaries never replace original input.

Add 53 offline tests and a synthetic failover smoke. Document the M2 live
runtime ingress/tool integration boundary; no production or GUI changes.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

Wave-is commented Sep 14, 2026

Copy link
Copy Markdown
Owner Author

Проверка коммита e178ee7 завершена

GitHub Actions / run 34882124561: все 5 jobs SUCCESS.

  • Полная матрица Python: Ubuntu и Windows, Python 3.11 и 3.13 — PASS.
  • В логе Ubuntu 3.11: 238 passed, 1 skipped (полный checkout PR merge ref).
  • Windows packaging + tools/test_installer.ps1 + загрузка CI-артефакта — PASS.
  • Отдельный локальный повтор нового модуля: 53 passed, coordination_smoke.py — PASS. Хеши протестированных store.py и теста совпадают с blobs коммита.

Это подтверждает библиотечные регрессии/сборку, не подключение нового журнала к живым Qwen/Hermes сообщениям и tools. M2 остаётся следующим обязательным шагом до включения автоматического failover. Установленный пользовательский EXE, main и настройки рабочих машин не изменены; PR не слита.

Контрольная точка и следующий шаг сохранены в HANDOFF/COORDINATION; локальный handoff_snapshot выполнен, честно фиксирует отсутствие полного локального Git checkout. Приватные runtime-данные не публиковались.

Add opt-in adapter facade, atomic human-input outbox and capability-gated
loopback prompt admission. Preserve edits and attachments before dispatch;
block ambiguous replay and keep HTTP 202 separate from model delivery.

Implement authenticated External Tool Guard v1 with persistent request
fencing and current revision/attempt admission. Add 78 synthetic SQLite/HTTP
tests and smoke. Keep task_control and automatic failover disabled until
native ingress, delivery evidence and live result/process observers land.

No production model, installed frontend, GPU, startup or remote service changes.
@Wave-is Wave-is changed the title Coordination M1: durable conversation journal and stale-attempt fencing Coordination M1–M2a: durable dialogue, Qwen outbox and tool-admission guard Sep 14, 2026

Wave-is commented Sep 14, 2026

Copy link
Copy Markdown
Owner Author

M2a проверен — fda25d3

Полный PR CI завершился успешно: https://github.com/Wave-is/laas/actions/runs/34889021926

  • Windows / Python 3.11 — PASS.
  • Windows / Python 3.13 — PASS.
  • Ubuntu / Python 3.11 — PASS.
  • Ubuntu / Python 3.13 — PASS; в журнале 316 passed, 1 skipped.
  • Windows build + tools/test_installer.ps1 + upload artifact — PASS.

Локально повторно проверено: 131 passed (53 M1 + 78 M2a), оба synthetic smoke PASS, git diff --check PASS. Все 11 опубликованных файлов совпали по Git blob SHA с проверенной локальной копией. Локальный handoff/checkpoint сохранён; реконструированная локальная Git-история не публиковалась.

Это проверка кода, SQLite и loopback HTTP-контракта с синтетическими peers — не живого Qwen Desktop, не GPU и не установленных пользовательских агентов. task_control=False, automatic_failover=False остаются намеренно. CI-артефакт не опубликован как новый релиз и не установлен на рабочий ПК.

Следующий конкретный этап M2b: настоящий перехват входа/правок/очереди, сохранение SSE cursor+epoch, доказательство доставки полного пакета и наблюдение/безопасное завершение реальных tool-процессов. Не признавать HTTP 202 доставкой модели; не разрешать передачу полномочий до этой приёмки.

…sion fencing

Add opt-in authenticated loopback SSE receiver, durable epoch/cursor and atomic
raw-event/turn/tool-result projection. Resume only read-only event GETs; gaps,
changed epochs, stale observers and missing tool outcomes block new permits.
Join terminal-before-202 races without replaying uncertain prompt mutations.

Add 89 synthetic SQLite/HTTP tests and an explicit event smoke. Keep native UI
capture, full-packet delivery, owned-process drain and automatic failover gated.
No installed Station, model, GPU, provider, startup or remote-service changes.
@Wave-is Wave-is changed the title Coordination M1–M2a: durable dialogue, Qwen outbox and tool-admission guard Coordination M1–M2b1: durable dialogue, Qwen outbox, guarded tools and SSE replay Sep 14, 2026

Wave-is commented Sep 14, 2026

Copy link
Copy Markdown
Owner Author

M2b1 / ab238e9 — фактическая проверка

Реализовано сохранение событий Qwen SSE с epoch/cursor, повторным чтением без дублирования, атомарным применением результатов и блокировкой новых инструментов при потере непрерывности наблюдения.

Локально: 89 новых тестов; совокупный набор координации — 220 passed; три synthetic smoke — PASS; git diff --check — PASS. Повторно проверено соответствие всех 14 локальных файлов опубликованным Git blob SHA.

CI: https://github.com/Wave-is/laas/actions/runs/34897467428

  • Ubuntu / Python 3.11: SUCCESS.
  • Ubuntu / Python 3.13: SUCCESS; в фактическом логе полного прогона 405 passed, 1 skipped.
  • Windows / Python 3.11 и 3.13: на момент этой записи ещё in_progress на pytest. Они идут заметно дольше предыдущего прогона; причина пока не установлена, законченных логов GitHub ещё не отдаёт. Не считать Windows-проверку прошедшей.
  • Windows build/installer job ещё ожидает завершения матрицы.

При следующем продолжении первым делом проверить результат этих Windows jobs, при необходимости разобрать зависание/ошибку, затем переходить к M2b2.

Граница: task_control=False, automatic_failover=False, live_runtime_verified=False. Нет подключения к установленным пользовательским чатам, подтверждения полного model-delivery и управления реальными OS tool-процессами. main, релиз, EXE и production-конфигурации не менялись.

…g cancellation

Share one deadline across preflight and SSE, explicitly close partial responses,
and keep persistence failures fail-closed. Add 34 real-loopback regressions;
254 coordination tests pass locally. Windows CI remains unqualified after
previous timeout and subsequent jobs failing before runner assignment.
No live ingress, task control or automatic failover enabled.

Wave-is commented Sep 15, 2026

Copy link
Copy Markdown
Owner Author

Продолжение: HTTP lifetime hardening — b5346a4

Добавлены два коммита: d3ebf9c (ограничение времени CI и диагностика) и b5346a4 (исправление транспорта Qwen). Main, установленное приложение, модели/GPU и пользовательские серверы не менялись.

Исправлено и воспроизведено

  • Общий deadline наблюдения теперь включает /capabilities, заголовки и SSE body. Stop обрабатывается и во время preflight; регулярные trickle-байты не продлевают общий бюджет.
  • Явно закрывается не только HTTPConnection, но и частично прочитанный HTTPResponse, включая Connection: close. Watcher делает shutdown только собственного socket; закрытие buffered reader остаётся в потоке запроса.
  • Одновременная отмена больше не скрывает ошибки SQLite, private storage I/O или протокола: состояние остаётся fail-closed.
  • Backoff не выходит за общий deadline. Неопределённый POST не повторяется; отмена сетевого наблюдения НЕ означает, что удалённый tool/process остановлен.

Локальная проверка

  • 34 новых теста, весь coordination: 254 passed (6.50s).
  • Новый набор дополнительно повторён 5 раз, 34/34 каждый раз.
  • Все три synthetic smoke: PASS.
  • Расширенный non-GUI прогон: 402 passed, 1 skipped, 1 deselected. Исключены test_gpu_confirmation.py, test_startup.py и один UI callback test из-за отсутствующего customtkinter. Полный GUI/Windows PASS не заявляется, зависимость не подменялась.
  • Выбранный regression subset проверен против точных прежних файлов ab238e9: ошибки воспроизводятся до правки и исчезают после. Git blob SHA всех изменённых транспортных файлов и нового набора тестов совпадают с локально испытанными файлами.

CI — требуется отдельная проверка

Прошлый ab238e9 run https://github.com/Wave-is/laas/actions/runs/34897467428 прошёл Linux, но оба Windows job зависли до шестичасового лимита. Старые тихие логи не определяют конкретный зависший тест. Связь найденных ошибок с тем зависанием пока не доказана.

Новые CI jobs теперь имеют -vv, faulthandler dump через 45s, timeout тестового шага 8min и job 15min, сохранение JUnit. Однако runs d3ebf9c (34927010021/34927013300), а теперь и b5346a4 https://github.com/Wave-is/laas/actions/runs/34929001012 завершились до назначения runner: steps=[], runner_id=0; installer skipped. Это не результат pytest. Точная причина из доступного API не получена, billing/security не менялись, повторные перезапуски не запускались.

Граница готовности / далее

task_control=False, automatic_failover=False, live_runtime_verified=False.
Документы HANDOFF, VALIDATION, WORKLOG обновлены; добавлен docs/HTTP_TRANSPORT_LIFETIME.md.
Следующий шаг: один bounded Windows/Linux CI, затем M2b2 — настоящий native input capture до отправки, доказательство доставки полного пакета и остановка принадлежащих задаче процессов/очереди. Текущие Desktop/Telegram-чаты ещё не перехватываются автоматически.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant