Get started
Шлях 3: робочий E2E-стенд SQLite
Живий E2E-стенд Path 3 для SQLite доводить, що Gateway використовує SQLite як канонічне сховище сеансів і транскриптів, тоді як застарілі файли JSONL залишаються вхідними даними для міграції або архівними матеріалами. Це стенд для перевірки супровідниками, а не звичайний засіб діагностики для користувачів.
Після того як Gateway обробив трафік після міграції, паритет із застарілими JSONL більше не є достовірним сигналом стану середовища виконання. У справному мігрованому Gateway кількість рядків транскриптів у SQLite може відрізнятися від кількості записів у застарілих JSONL, оскільки нові ходи мають просувати лише стан SQLite. Тому живий стенд повинен на кожному кроці вимірювати поведінку Gateway, зміни рядків SQLite, незмінність застарілих файлів і стан журналів.
Формат команди
Передбачена жива команда:
node scripts/path3-live-sqlite-e2e.mjs \ --url http://127.0.0.1:18789 \ --agent main \ --session-key agent:main:path3-live-e2e:<timestamp> \ --jsonКоманда підключається до вже запущеного Gateway. Вона не запускає, не зупиняє,
не імпортує та не виконує міграцію повторно, якщо згодом явно не буде додано
режим міграції. Варіант для CI або ізольованого локального середовища може
використовувати test/helpers/openclaw-test-instance.ts, але шлях живої перевірки має перевіряти
фактичний операторський Gateway і його справжню окрему для кожного агента базу
даних SQLite.
Ізольована перевірка зібраного CLI
Засіб перевірки зібраного CLI наповнює ізольоване застаріле сховище сеансів,
запускає повторно зібраний Gateway і доводить, що під час запуску активні
застарілі сеанси імпортуються до SQLite до початку читання середовищем
виконання. Він не повинен запускати openclaw doctor --fix до першого запуску
Gateway, оскільки це перевіряло б шлях ручної міграції замість шляху оновлення,
який користувачі отримують під час першого запуску після перемикання.
Після імпорту під час запуску ізольована перевірка може виконати
openclaw doctor --session-sqlite inspect і
openclaw doctor --session-sqlite validate як діагностичне підтвердження. Ці
команди doctor не є рушієм міграції для перевірки оновлення під час запуску.
Окремі сценарії імпорту doctor мають наповнювати застарілі файли транскриптів
разом із допоміжними файлами траєкторій і перевіряти, що doctor архівує ці
артефакти, тоді як SQLite залишається канонічним сховищем.
Попередня перевірка
Попередня перевірка збирає базовий стан і завершується помилкою до надсилання перевірочного ходу, якщо Gateway непридатний до використання:
GET /healthі поглиблена перевірка стану Gateway мають повідомляти про запущений і доступний Gateway.- Версії CLI та Gateway мають відповідати гілці, що перевіряється.
- Стенд записує позицію журналу для активного файлового журналу Gateway.
- Стенд записує кількість рядків у таблицях SQLite для кожного агента:
sessions,session_entries,transcript_events,transcript_event_identitiesіsession_routes. - Стенд записує
mtime,sizeі відомості про наявність застарілогоsessions.json, згаданих файлів JSONL і потенційних шляхів JSONL перевірочного сеансу. lsof -p <gateway-pid>має показувати дескриптори SQLite DB/WAL/SHM і відсутність активних дескрипторів.jsonlабоsessions.json.
openclaw doctor --session-sqlite validate у живому режимі має лише інформаційне значення.
Після трафіку, обробленого після перемикання, він може повідомляти про очікувану
розбіжність із застарілими файлами. Стенд має використовувати вивід doctor для
класифікації та інвентаризації міграції, а не як критерій проходження чи
непроходження перевірки середовища виконання.
Сценарій, керований агентом
Живий сценарій використовує окремий ключ перевірочного сеансу й за можливості керує Gateway через публічні шляхи RPC. Одного ходу агента має бути достатньо для перевірки звичайного збереження, але повна перевірка має охоплювати стики 3.1b, які раніше вимагали окремих живих перевірок:
- Звичайний хід чату: створити або повторно використати перевірочний сеанс,
надіслати справжній запит агенту, дочекатися остаточного результату асистента
й перевірити
chat.historyабо еквівалентну проєкцію Gateway. - Ідентичність транскрипту: перевірити, що той самий маркер наявний в історії Gateway і в рядках транскрипту SQLite, зокрема в рядках зі стабільними ідентичностями подій, якщо вони є.
- Засоби доступу до метаданих сеансу: прочитати перевірочний сеанс і вибрані наявні живі сеанси через засоби доступу Gateway/сеансу та порівняти їх із рядками SQLite.
- Проєкція зміни сеансу: застосувати оборотну зміну метаданих моделі/сеансу до перевірочного сеансу, а потім перевірити, що спроєктований рядок і відповідь Gateway узгоджуються.
- Життєвий цикл контрольної точки Compaction: перелічити, розгалузити й відновити контрольну точку лише для перевірочного сеансу або синтетичного сеансу-фікстури, створеного стендом.
- Відновлення після перезапуску: виконати безпечний шлях маркера відновлення для контрольованого перевірочного сеансу або ізольованого тестового екземпляра; у живому режимі цей крок можна виконувати лише тоді, коли цільовий набір сеансів указаний явно, а зміни є оборотними.
- Життєвий цикл очищення: видалити або скинути перевірочний сеанс, а потім перевірити рядки життєвого циклу SQLite і стан архівованого транскрипту.
Специфічні для транспорту стики, які не можна безпечно перевірити на живому операторському Gateway, як-от вхідний трафік WhatsApp або голосових викликів, мають використовувати перевірки середовища виконання на рівні власника за тим самим контрактом SQLite, а не імітацію зовнішнього транспорту.
Твердження для кожного кроку
На кожному кроці створюються знімки стану до та після, а також записується структурований результат перевірки:
- Кількість рядків SQLite збільшується лише там, де очікується.
- Рядки траєкторії середовища виконання збільшуються для перевірочних сеансів із маркерами, які записують події середовища виконання.
- Рядок перевірочного сеансу має очікувані
session_id, стан, часові позначки, метадані та рядки маршрутів. - Проєкція історії/сеансу Gateway відповідає завершальній частині транскрипту SQLite.
- Файл JSONL перевірочного сеансу не створюється й не змінюється.
- Допоміжний файл
.trajectory.jsonl,.trajectory-path.jsonабо похідний від маркераtrajectory/<session>.jsonlдля перевірочного сеансу не створюється. - Наявні застарілі файли JSONL і
sessions.jsonзалишаються незмінними, якщо крок явно не є операцією автономної міграції або архівування. - Процес Gateway не відкриває дескриптори
.jsonlабоsessions.json. - Журнали від попередньої позиції не містять
ERROR,FATAL,SQLITE_,no such column, повідомлень про недоступність сховища сеансів, помилку відновлення після перезапуску або попередження про узгодження транскриптів, якщо сценарій явно не вносить їх до списку дозволених.
Сканування журналів є частиною контракту проходження чи непроходження перевірки. Gateway, який відповідає на перевірки стану, але видає помилки схеми SQLite або повторювані помилки узгодження транскриптів, не вважається справним для Path 3.
Артефакт підтвердження
Стенд має записувати підтвердження в .artifacts/path3-live-e2e/<timestamp>/
і не додавати його до git:
summary.json: аргументи команди, версія Gateway, результат, невдале твердження та шляхи до артефактів.sqlite-before.jsonіsqlite-after.json: кількість рядків і вибрані перевірочні рядки.legacy-files.json: наявність застарілих файлів,mtime, розмір і відомості про те, чи змінено кожен файл.gateway-log-scan.json: діапазон позицій, відповідні рядки журналу й рішення щодо списку дозволених.events.jsonl: упорядковані спостереження для кожного кроку, придатні для коментарів із підтвердженням у PR.
Підтвердження в PR має підсумовувати ці артефакти, а не вставляти повні транскрипти або вміст приватних повідомлень.
Правила безпеки
- Живий режим ніколи не повинен повторно імпортувати застарілі JSONL під час роботи Gateway.
- Живий режим не повинен змінювати сеанси, що не є перевірочними, крім явно вибраних оборотних перевірок відновлення.
- Будь-який руйнівний або масштабний крок міграції потребує свіжої резервної копії відповідної бази даних SQLite і каталогу застарілих сеансів.
- Резервні копії мають обмежуватися відповідною базою даних агента/каталогом сеансу й повторно використовуватися протягом одного запуску перевірки, щоб уникнути необмеженого збільшення використання диска.
- Після кроку очищення не повинно залишатися перевірочного сеансу,
перевірочного JSONL або зміненого застарілого файлу, якщо викликаць не передає
--keep-artifacts.
Успішний результат
Успішний живий запуск означає, що Gateway прийняв справжній керований агентом потік сеансу, увесь спостережуваний канонічний стан містився в SQLite, застарілі файли середовища виконання залишалися незмінними, а стан журналів був чистим протягом вимірюваного проміжку. Це не означає, що паритет із застарілими JSONL залишається точним після живого трафіку; щойно SQLite стає канонічним сховищем, розбіжність у живому середовищі є очікуваною.