Мост подключается к установленному Harness как Custom model API через штатный
адаптер openai-completions. Входы, очередь запросов и сохранённые паузы остаются
в мосте. Учётные данные сайтов не копируются в Harness.
Для Local account bridge вход в аккаунт Harness и официальный API-ключ DeepSeek не нужны. На Welcome выберите Add API Key → Set up later с пустым полем ключа. В 0.2.1-rc.2 это штатный пропуск для текущего запуска: при следующем открытии Welcome может появиться снова. Это не признак истечения сессии моста. Переход проверен в обновлённом приложении офлайн; прежняя история открылась.
В harness-contract-v8 журнал from_agent сохраняет только явно переданные
поля: отсутствие thinking не превращается в явный false; допустимый null
в необязательных параметрах также сохраняется.
request_contract фиксирует присутствие полей, хеш запроса и эффективные
настройки; dispatch_contract дополнительно фиксирует реально переданный режим
и хеш подготовленного текста непосредственно перед отправкой. Приватная
диагностика сбоя сохраняет эту квитанцию отправки, а не пересчитывает её после
изменения конфигурации. Содержимое запроса остаётся приватным.
Офлайн-восстановление параметров проверяет квитанцию, схему, протокол и текущие
эффективные настройки. Старый журнал без сведений о присутствии полей не
дополняется догадками. Совпадение квитанции не разрешает повторную генерацию,
не снимает паузу и не меняет привязку истории или бюджет. Для повторного
сохранения проверенного запроса используется request_payload, не сериализация
с подставленными значениями по умолчанию.
Когда работа готова, модель вызывает request_goal_review с точными ID,
ревизией цели и доказательствами по критериям, затем выдаёт итоговый отчёт.
Инструмент отключает следующие автоматические раунды; текущий ход ещё может
запросить у модели финальный текст. Цель остаётся незавершённой. Инструмент
не подтверждает качество результата и не выдаёт разрешение на завершение.
Оператор проверяет полный объём через /bridge-goal-review, затем при согласии
использует выданный одноразовый /bridge-goal-complete. Разрешение действует
пять минут и теряет силу после новой работы или перезапуска. Модель по-прежнему
не может принять собственную работу через update_goal(action="complete").
24 октября полный цикл проверен в установленном Harness 0.2.1-rc.3 с локальным
подставным провайдером и запретом внешней сети: два раунда, чтение, единственная
запись, проверка файла, запрос приёмки, итоговый текст и два перезапуска.
Приёмка и её сохранение не вызвали новых запросов к провайдеру; запись не
повторилась. Отдельно проверены отказ провайдера, повреждённый JSON и защита
read → edit после перезапуска. Это проверяет обмен и состояние Harness,
но не надёжность новых ответов веб-модели.
Исправления установлены в рабочий мост и Harness; оба перезапущены. Локальная команда статуса подтвердила v8, а отклонённый пустой запрос проверил сохранение параметров в работающем мосту до доступа к провайдеру. Профиль, исходная история, счётчики и пауза сохранены; в журналы Harness добавились только служебные события загрузки сессий и команды статуса. Цель не продолжалась. Новый инструмент меняет каталог схем: для старой истории сохраняется проверка совместимости каталога, без автоматического сброса или перепривязки.
- Установите официальный Harness и откройте его один раз. На стартовом экране можно выбрать Add API Key → Set up later.
- Настройте выбранные провайдеры по инструкции моста и запустите
python app.py. Не запускайте второй экземпляр, если мост уже работает. - В каталоге моста, с активированным virtualenv, выполните:
python -m pip install -r requirements.txt
python -m integrations.harness --install desktop --default-model qwen3.8-omni-flashКоманда читает только GET http://127.0.0.1:8000/v1/models, сохраняет точную
резервную копию старого файла и обновляет
~/.dsh/profiles/desktop/cordis.patch.yml. В меню появляется Local account
bridge. Каталог берётся из реально включённых подключений; отсутствие модели
по умолчанию вызывает ошибку до изменения конфигурации. Изменения подхватываются
Harness автоматически; при необходимости перезапустите приложение.
Пары короткого ID и алиаса провайдер/модель отображаются одним пунктом с
коротким ID; модель, объявленная только алиасом, сохраняет его. Дубли в старом
профиле убираются повторной установкой с прежними параметрами. API по-прежнему
принимает оба написания. История, паузы и бюджеты при обновлении меню не меняются.
Выберите папку проекта, создайте новую сессию и выберите модель этой группы.
Старые сессии могут сохранять прежнюю модель. --default-model можно опустить,
чтобы оставить текущий выбор. Для Web UI используйте --install web, для
инициализированного CLI-профиля — --install headless. --home / DSH_HOME
задают другой каталог Harness, --base-url — другой порт loopback API.
Все адаптеры моста используют один протокол: DeepSeek, обе модели Qwen,
GLM, Kimi, Grok, Mistral и настроенные через GEMINI_MODELS модели Gemini.
Наличие адаптера не означает, что аккаунт доступен или модель проверена:
см. состояние провайдеров.
Чтобы в группе моста остались только адаптеры без браузера во время запросов:
python -m integrations.harness --install desktop --without-browser --default-model qwen3.8-omni-flashФильтр оставляет включённые Qwen, DeepSeek, Gemini и явно включённые
экспериментальные kimi-instant, kimi-k3 и kimi-k2.8
(проверки и ограничения доступа). Адаптеры
GLM, kimi-web, Grok и Mistral не попадают в эту группу: им нужна вкладка.
Флаг не переносит веб-сессии в новый транспорт, не включает провайдеры и не
меняет сохранённые паузы. Это выбор каталога при установке; при следующем
обновлении профиля снова укажите --without-browser. Другие провайдеры Harness
и существующие сессии сохраняются. Если прежняя модель по умолчанию исключена,
задайте новую через --default-model; установщик откажется от записи до её выбора.
Qwen прошёл живую проверку в Harness с закрытым браузером. Первоначальный вход
и повторный вход после истечения cookie всё ещё требуют браузера. DeepSeek Chat
10 октября 2026 прошёл задачу с read и ответом в Harness 0.2.0-rc.2 за 12 секунд
при закрытом браузере. Перед этим вручную проверен обычный сайт; исправлен разбор
двух форматов ответа создания чата. Затем Expert прошёл ограниченную задачу в
штатном Harness: read, write и итоговый ответ — три генерации за 24,5 секунды
при закрытом браузере. Записанный текст с переносами строк, кавычками и обратными
слешами совпал побайтно. Автопродолжений и повторов не было. Проверена эта небольшая
задача с файлом; безотказная работа длительных целей не гарантируется.
Gemini работает через официальный CLI; в нашем тесте он
отклонил запрос по региону. Эти подключения нельзя считать доступными только
потому, что им не нужна вкладка.
У Mistral продолжение упёрлось в квоту, а у Grok не завершился захват ответа;
оба не подходят для проверенного рабочего набора. У Kimi есть ограничения
частоты и общий пул кредитов.
Размер лимита именно этого аккаунта не установлен. 10 октября 2026 Qwen3.8-Max
вернул уведомление о дневном лимите как обычный ответ, из-за чего Harness
несколько раз продолжил цель. Мост теперь распознаёт этот известный текст как
quota_exceeded, не выдаёт его за успех и сохраняет паузу всего Qwen.
Возобновление только вручную после проверки доступа; лимит Flash и точное время
сброса неизвестны. Отсутствие отказа у GLM не доказывает безлимитность. Официальный API Z.ai — отдельный способ
доступа с ключом: тарифы различают
бесплатные GLM-4.7-Flash / GLM-4.5-Flash и платный GLM-5.3-Flash.
Установщик не заменяет веб-модель другой моделью или платным API.
python -m deepseek.auth открывает страницу один раз и ждёт ручного входа до
пяти минут. Если сайт показывает кнопку входа, нажмите её самостоятельно.
Отсутствие токена больше не вызывает принудительный переход на /sign_in,
который мог прервать проверку на открытой странице. Это исправление навигации,
а не подтверждённое решение повторяющейся hCaptcha; при повторном отказе остановитесь.
python -m deepseek.auth --keep-open --channel chromium оставляет окно
ручного входа открытым до закрытия окна или Ctrl+C. Это позволяет проверить
ограничения на обычном сайте. Изменения сессии сохраняются в приватный файл;
сам захват токена не подтверждает доступ и не снимает паузу. --channel chrome
выбирает установленный Chrome; в этом режиме автоматической смены браузера нет.
Запросы Harness используют только сохранённую сессию. Возраст кеша сам по себе не требует перевхода. При отказе токена
(40002/40003) мост сохраняет защитную паузу и останавливается без повторов.
Для продолжения нужны ручной вход и явное снятие паузы; автоматического продления нет. Сервер пишет только этап сбоя, HTTP-статус и фиксированную категорию ошибки,
без токена, содержимого ответа или промпта.
Войдите командой python -m qwen.auth. Токен сайта короткоживущий
(наблюдался срок около 15 минут). Для длительной работы отдельно задайте
QWEN_RENEW_SESSION=1 в .env и перезапустите мост. По умолчанию режим выключен.
Только перед новым пользовательским запросом и до создания чата мост может один раз обратиться к штатному endpoint продления Qwen с сохранённой cookie входа. Проверяются прежний аккаунт, новый срок действия и неизменность локальной сессии. Продление входит в ту же защищённую попытку: отмена, отказ, неопределённый результат или ошибка сохранения останавливают запрос. Отклонённое сообщение не повторяется, пауза не снимается, браузер не запускается. Фоновых таймеров нет. Когда cookie входа тоже истечёт, понадобится ручной вход. При сохранённой паузе сначала проверьте обычный сайт и выполните процедуру из ACCOUNT_SAFETY.md.
Без этого режима сервер читает только готовую сессию; login_required требует
ручного входа. Необязательная команда python -m qwen.auth --keep-open сохраняет
изменения сессии из открытого окна, но не гарантирует продление при простое.
Используйте её как ручной режим, отдельно от продления сервером. Выбор модели
в меню сам по себе не проверяет вход.
10 октября 2026 проверены живые запросы в Harness 0.2.0-rc.2 после защитных
исправлений: Max вернул контрольный ответ, Flash выполнил read маленького
контрольного файла и вернул его содержимое. Позднее Flash проверен с действительно
истёкшей сохранённой сессией и закрытым браузером: одно защищённое HTTP-продление
увеличило срок действия, затем Flash прочитал probe.txt и вернул точное
содержимое за два шага и 15 секунд. Пауза Qwen не установилась. Запрос продления
использовал штатный заголовок frontend Timezone из реального времени и UTC-смещения
хоста. Затем Max вернул QWEN_MAX_READY за пять секунд на продлённой сессии.
Результаты подтверждают работу только проверенных аккаунта и сессии;
будущее продление и доступ не гарантируются. Открытое окно само по себе не
гарантирует продление при простое.
-
retryPolicy: {mode: normal, maxRetries: 0}запрещает повторы Harness. Штатный SDK Harness также работает без внутренних повторов. -
session-title-llmотключён в этом профиле: заголовок чата не отправляет отдельное сообщение модели. Другие подключённые вами плагины могут вызывать модели самостоятельно; установщик их не перенастраивает. -
Существующие обычные настройки и другие провайдеры сохраняются. Для сложных пользовательских bundle/root/home-слоёв установщик отказывается от записи. Он не вычисляет
!!js. Экспорт для ручного объединения:python -m integrations.harness --output session/harness.patch.yml
Это самостоятельный patch: его
llm-pi-ai.configзаменяет полную конфигурацию этой строки при наложении. Объедините существующиеprovidersперед применением к нестандартному профилю. Не храните экспорт в Git вместе с личными настройками. -
В запросах используется Chat Completions, текстовый ввод и эмуляция вызовов инструментов. Изображения, Responses API и управление режимами thinking/search через меню Harness не поддерживаются этой интеграцией.
-
32768context /4096output — консервативные бюджеты клиента, а не обещание сайта. Мост не передаётmax_tokensи sampling-параметры веб-провайдерам. -
Authorization: Bearer <токен API моста>изsession/api-token— контроль доступа к /v1, не токен аккаунта провайдера. После обновления со старого профиляBearer unusedповторите установщик. Не публикуйте порт моста в сети.
Установка не включает выключенные провайдеры, не снимает паузы и не проверяет аккаунты отправкой сообщений. Даже истечение указанного сайтом срока блокировки не подтверждает восстановление доступа. Пауза снимается отдельно, вручную, после проверки обычного сайта: защита аккаунтов. Квоты действуют у всех провайдеров, включая китайские модели; каждый шаг агента и ответ после инструмента может расходовать отдельное сообщение.
По умолчанию TOOLCALL_FORMAT_REPAIR=0 и TOOLCALL_MAX_CONTINUATIONS=0;
невалидный вызов всегда завершается явной ошибкой. Мост сохраняет беседу между шагами и отправляет только новые результаты; неизвестная история останавливается без создания нового чата. Сохраняются лимиты нагрузки и настраиваемый предел принятых ответов на беседу (по умолчанию 20). Исторические проверки ниже не означают готовности к неограниченным задачам.
Для автономных целей DeepSeek доступен опциональный TOOLCALL_FORMAT_REPAIR=1
в окружении процесса моста. Перезапустите мост после изменения настройки.
Если штатно завершённый ответ содержит сломанный JSON, пояснение вокруг вызова
или неподдерживаемый DSML, мост один раз просит модель заново оформить ответ в
той же беседе. Исходные вызовы не исполняются, аргументы не угадываются. Второй
невалидный ответ завершает запрос; лимиты, отказы, отмена и обрыв по длине не
запускают исправление. Дополнительная генерация расходует квоту и соблюдает
обычную паузу между запросами. По умолчанию настройка выключена.
Создавайте цель в workspace нужного репозитория: право Workspace Write относится к его папке. Успешный ответ модели сам по себе не доказывает, что инструменты выполнились или цель завершена.
10 октября 2026 проверены живые цели DeepSeek Expert в Harness 0.2.0-rc.2
с этим режимом. Задача добавления регрессионного теста прошла за 4 минуты
5 секунд и 23 шага: модель сама исправила упавшую проверку и закрыла цель.
Промежуточная задача обнаружила ещё два дефекта обработки ответов: отсутствующую
внешнюю ] и ошибочное распознавание упоминания протокола в итоговом тексте.
Они воспроизведены локально и исправлены. Последняя новая контрольная цель на
исправленном мосте завершилась за 64 секунды и 7 шагов: 67 тестов, проверка diff,
закрытая цель и итоговый текст. После старта этих двух успешных прогонов ручных
подсказок не было; субагенты и браузер в работе моста не использовались.
Это квалификация ограниченных задач, а не гарантия безошибочности любой цели.
Текущий набор проверен с установленным Harness 0.2.0-rc.2: 14 сценариев настоящего CLI и тесты установщика. При HTTP 503 штатная политика сделала шесть попыток, конфигурация моста — одну. Аккаунты в этих проверках не использовались.
python -m unittest tests.test_harness -v
HARNESS_COMMAND='["/absolute/path/to/dsh"]' RUN_HARNESS_FIXTURES=1 \
python -m unittest tests.test_harness_runtime -vВторая команда использует настоящий CLI Harness, временные HOME/DSH_HOME и workspace, настоящий локальный FastAPI и подменённый транспорт провайдера. Проверяются SSE, чтение контрольного файла инструментом и возврат результата, остановка после отказа и отсутствие повторов при HTTP 503. Это проверка интеграции, а не живая квалификация аккаунтов.
Основание: официальная конфигурация моделей Harness.
Ограничения подключения GLM без браузера.
Local request budget exhausted (local_budget_exceeded) может означать:
скользящий бюджет DeepSeek, предел принятых ответов в сохранённой беседе (по умолчанию 20)
или промпт больше 128 КиБ UTF-8. При часовом/суточном бюджете место освобождается
по мере старения событий; это не сброс в начале календарного часа или суток.
Перезапуск и resume не обнуляют расход. providers.access status показывает
паузы, а не остаток бюджета: пустой результат не исключает исчерпание лимита.
Для более длинных задач можно явно настроить окружение единственного моста:
DEEPSEEK_MAX_GENERATIONS_PER_HOUR=60
DEEPSEEK_MAX_GENERATIONS_PER_DAY=300
DEEPSEEK_MAX_CHATS_PER_HOUR=6
DEEPSEEK_MAX_CHATS_PER_DAY=24
DEEPSEEK_MAX_HTTP_PER_HOUR=200
DEEPSEEK_MAX_HTTP_PER_DAY=1000
CONVERSATION_MAX_REPLIES=200Это пример расширенного локального бюджета, не квота DeepSeek. По умолчанию остаются 12/60 генераций, 3/6 новых чатов и 40/200 HTTP-запросов. Каждое значение должно быть целым от 1 до 2000, суточное — не меньше часового. Некорректная настройка останавливает запуск. HTTP-бюджет включает создание чата, challenge и генерацию; перед новой генерацией проверяется место для всей последовательности. Изменение лимитов сохраняет расход, паузы и интервал между запросами.
После изменения .env перезапустите мост. Если эти переменные заданы в
EnvironmentVariables LaunchAgent, обновите их там и перезагрузите LaunchAgent:
один kickstart не перечитывает изменённый plist. Автозапуск
поднимает процесс при входе в macOS, но не продлевает сессию DeepSeek.
Если Harness показывает JSON инструментов как обычный текст, необязательный
TOOLCALL_FORMAT_REPAIR=1 позволяет одну коррекцию после нормального завершения.
Обычный fenced JSON со списком известных инструментов служит лишь сигналом
для коррекции: исходный блок не исполняется. Некорректный повторный ответ
останавливается. Коррекция расходует дополнительную генерацию и не снимает
ограничения сайта или беседы. Автоматические повторы Harness должны оставаться выключены.
11 октября: живой Chat прошёл ответ и продолжение с памятью; исправление
служебного SSE finish покрыто регрессией. Коррекция JSON проверена реальным
Harness CLI на локальном подменённом провайдере в трёх вариантах формата.
Повторная живая большая задача Expert после этих исправлений не квалифицирована.
Предел беседы отдельно задаёт CONVERSATION_MAX_REPLIES (по умолчанию 20, допустимо 1–1000). Он считает принятые ответы, а не все upstream-генерации: коррекция формата дополнительно расходует скользящий бюджет. После повышения и перезапуска точная сохранённая история может продолжиться в той же беседе. Счётчик и защита от повторного исполнения сохраняются; неизвестная или изменённая история по-прежнему отклоняется.
Пустой или состоящий из пробелов ответ в режиме инструментов больше не выдаётся как успех. При TOOLCALL_FORMAT_REPAIR=1 нормально завершённый ответ допускает одну коррекцию в той же беседе; второй пустой ответ — явная ошибка. При обрыве по длине, отказе или tool_choice=none коррекция не запускается.
/bridge-budget показывает шесть локальных счётчиков и действующие лимиты.
/bridge-budget-reset показывает расход перед сбросом. Для подтверждения выполните
/bridge-budget-reset CONFIRM в той же сессии в течение 60 секунд. Если расход
успел измениться, потребуется повторный просмотр. Команды не обращаются к модели.
Сбрасывается только локальный расход DeepSeek. Квоты сайта, защитные паузы, задержки и история бесед сохраняются. Активный или неопределённый запрос запрещает сброс.
В каталоге моста с активированным virtualenv выполните команды ниже. Они создают приватный токен (0600), сохраняя существующий, и устанавливают плагин в уже настроенный профиль Harness. Запросов к аккаунтам нет.
python - <<'PYTOKEN'
import os
from pathlib import Path
import secrets
path = Path("session/budget-admin.token").resolve()
path.parent.mkdir(mode=0o700, parents=True, exist_ok=True)
if not path.exists():
fd = os.open(path, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
with os.fdopen(fd, "w") as out:
out.write(secrets.token_hex(32) + "\n")
path.chmod(0o600)
print(path) # path only; never print the token
PYTOKEN
python -m integrations.harness_budget --profile desktop --token-file "$PWD/session/budget-admin.token"Добавьте в .env строку BRIDGE_BUDGET_TOKEN_FILE=/абсолютный/путь/session/budget-admin.token,
используя путь, который напечатала команда. Если мост запускается через LaunchAgent,
задайте переменную в его окружении и перезагрузите службу. Перезапустите мост;
Harness перечитает профиль, при необходимости перезапустите приложение.
Токен служит только для локального управления счётчиками и не связан с аккаунтом
провайдера. Не публикуйте его. Для другого каталога Harness передайте установщику
--home /путь/к/.dsh явно; установщик бюджетов не читает DSH_HOME.
Лимит подтверждённых ответов одного диалога показан отдельно. Он не является
часовой или суточной квотой и не сбрасывается через /bridge-budget-reset.
Текущий расход конкретного диалога команда не показывает; при достижении
потолка он указан в ошибке. Автоматического создания нового чата нет.
При явном ответе 40002/40003 на challenge до отправки генерации мост сохраняет
возможность продолжить ту же историю после ручного восстановления сессии.
Пауза провайдера и весь учёт запросов остаются на месте; автоматического повтора
нет. Таймауты, неоднозначные ошибки и отказ после отправленной генерации не
освобождают историю. Перенос привязки истории на новый токен требует отдельного
подтверждения того же аккаунта; обычный захват сессии этого не делает.
Один раз установите DeepSeek session transfer
в папку Save Location приложения Userscripts и разрешите расширению доступ
к chat.deepseek.com и 127.0.0.1. Этот скрипт независим от контроллера
браузерных чатов; BROWSER_BRIDGE_ENABLED включать не нужно. Команды доступны
в плагине локального бюджета после его обновления и перезапуска Harness.
Поддерживается локальный мост http://127.0.0.1:8000 на macOS.
Выберите deepseek-login в меню команд Harness (или введите /deepseek-login).
Откроется Safari. Если токен уже отклонён, выйдите и снова войдите в тот же
аккаунт. При первом переносе подтвердите, что аккаунт совпадает; далее мост
сверяет сохранённый идентификатор. Инспектор и копирование токена не нужны.
Открытая таким способом вкладка переносит сессию автоматически после входа.
На перенос даётся 10 минут. /deepseek-login-status показывает результат.
Никакой запрос к модели не отправляется, цель автоматически не возобновляется.
История, счётчики и интервалы сохраняются. Снимается только пауза авторизации
без неопределённой генерации: явный 40002/40003 на challenge. Ограничения
аккаунта, квоты, незавершённые запросы и неоднозначные сбои требуют отдельного
разбора. Если во время входа изменилось состояние моста, запустите команду заново.
Скрипт передаёт токен, идентификатор аккаунта, User-Agent и доступные странице cookies только на локальный адрес. HttpOnly cookies недоступны Userscripts; успешное сохранение само по себе не проверяет приём токена сервером DeepSeek. Обычная вкладка без одноразового запроса Harness ничего не переносит.
Включите DEEPSEEK_STREAM_DIAGNOSTICS=1 в окружении моста и перезапустите его.
Авторизованный локальный GET /admin/budget показывает stream_diagnostics.enabled.
Отдельный флаг TOOLCALL_DIAGNOSTICS продолжает управлять записью ошибок tool_calls.
При сбое SSE сохраняются принятые декодированные HTTP-байты, признак EOF,
признак усечения, внутренний код ошибки и привязка к диалогу/родительскому ответу.
Заголовки HTTP, cookie, токен и исходный промпт отдельно не записываются, но сам
ответ провайдера может содержать чувствительные данные. Права файлов — 0600,
нового каталога — 0700. Лимит — четыре записи по 8 МиБ байтов потока (около
11 МиБ JSON с base64). При заполнении каталога запись прекращается; старые
доказательства автоматически не удаляются. При превышении лимита байтов
сохраняется префикс с truncated=true, непригодный для восстановления.
python -m deepseek.stream_diagnostics session/failed-streams/<id>.jsonКоманда не обращается к сети. Она проверяет целостность записи, EOF, отсутствие
усечения, заново разбирает поток и требует нормального завершения, непустого
ответа и нового ID сообщения. При успехе рядом создаётся приватный .review.json;
существующий результат не перезаписывается. Повреждённый JSON, неизвестный маркер,
незавершённый ответ, устаревший ID и данные после [DONE] отклоняются.
Это восстановление текста для разбора, не автоматическая доставка в Harness. Хеш подтверждает целостность байтов, но не происхождение и не отсутствие прежней доставки. До восстановления истории нужны отдельная проверка владения запросом, схем инструментов и отсутствия выполнения. Пауза, история, счётчики и цель остаются без изменений. Полностью отсутствующие байты старого сбоя восстановить офлайн невозможно; подтверждение ответа по истории провайдера потребует отдельно разрешённого запроса. Новая генерация не используется.
Офлайн-проверки: python -m unittest tests.test_stream_capture tests.test_deepseek_protocol tests.test_stream.
Живой аккаунт для проверки этой функции не использовался.
Событие SSE hint с type=error и finish_reason=context_length_exceeded
означает предел контекста текущего диалога у провайдера. Мост сохраняет паузу
conversation_context_exceeded; перевход, сброс локальных бюджетов или увеличение
лимита ответов не устраняют её причину.
Для будущих отказов можно включить DEEPSEEK_CONTEXT_ROLLOVER=1 в .env и
перезапустить мост. Цель и чат Harness остаются прежними; меняется только диалог
DeepSeek. После точного отказа с clear_response=true, до текста и terminal marker,
мост сохраняет полный запрос в приватный файл, фиксирует одноразовый перенос и
делает один запрос в новом диалоге. Старый использованный шаг не освобождается.
Счётчики расхода, задержки и число подтверждённых ответов сохраняются: это не
способ обхода локальных бюджетов. Ошибка нового запроса останавливает работу.
Автоисправление формата и продолжение обрезанного ответа при переносе отключены.
Пакет содержит точные пользовательские/системные инструкции, идентификаторы всех выполненных вызовов и сокращённые результаты. Успех из наличия результата не выводится. Модель должна читать архив при нехватке сведений и не повторять уже выполненные действия. Гарантировать поведение модели одним промптом невозможно. Большие инструкции/реестры, незавершённые calls, частичный поток и ошибки записи оставляют остановку. Лимиты: 32 КиБ инструкций, 64 КиБ пакета, 16 МиБ архива; не более 64 архивов и 64 МиБ суммарно. Архивы автоматически не удаляются.
Механизм использует подтверждение текущего запроса в памяти. Ранее сохранённая
пауза и перезапуск посреди переноса не дают разрешения на повторную генерацию:
для них нужен отдельный разбор локальной диагностики. Офлайн-проверки:
python -m unittest tests.test_context_rollover tests.test_deepseek_protocol.
Живые аккаунты не использовались.
При переключении deepseek-official → local-browser-bridge история Harness
остаётся на месте, но у веб-моста нет её provider conversation ID. Продолжать
неизвестную историю автоматически небезопасно: это может повторить выполненные
действия или неизвестный исход запроса. Совместимость схем тоже не создаёт такой ID.
Для явного переноса служит локальная административная команда:
python -m server.history_import \
--request /absolute/private/pending-request.json \
--archive-root /absolute/workspace/ignored-private-archive \
--source-provider deepseek-officialЭто точный OpenAI-совместимый запрос, а не экспорт отдельных текстов чата.
Оператор должен проверить его происхождение, отсутствие неизвестного исхода
генерации и все завершённые tool calls. Команда не запускает цель, не обращается
к аккаунту и не изменяет историю. Сохранённая локальная сессия должна существовать.
Разрешение действует 10 минут, одноразово и не может быть переиздано для того же
запроса. Все семантические поля связываются точно; отличается только допустимый
способ доставки stream. Новый запрос, другой аккаунт или изменённый архив
не подходят. Архивы приватны и автоматически не удаляются.
Для проверки одного шага удерживайте фактический запрос до регистрации разрешения и ограничивайте клиента одним шагом. Штатное возобновление может обновить состояние цели и сформировать другой запрос; нельзя угадывать эти изменения или ослаблять сопоставление. После отправки разрешение остаётся использованным даже при локальном отказе, ошибке сети или неверном формате. Сначала разберите исход, не повторяйте отправку. Использованная обычная связь истории вообще не допускает импорт.
Полный запрос хранится в контрольном архиве; в промпте — точные инструкции и все
результаты либо индексы для read. Старые результаты — сведения о выполненном,
не новые команды. Новые вызовы проходят прежнюю проверку схем, дополнительно
запрещается точное повторение вызова с уже наблюдавшимся результатом. Исключён
только get_goal: состояние цели изменяется при возобновлении и требует свежего
чтения. update_goal и остальные вызовы сохраняют защиту от повторов. Это не
семантический анализ произвольно переписанных shell-команд. При ошибке не
возвращается даже корректная часть пакета; генерация и исправление не повторяются.
Успешный ответ создаёт только одну связь к исходной истории Harness, без доступного
для повтора bootstrap-алиаса. Старые связи и счётчики не сбрасываются.
Офлайн: python -m unittest tests.test_history_import tests.test_context_rollover tests.test_format_checkpoint. Проверены точность архива, конкурентное потребление,
повтор после перезапуска, смена аккаунта/схем/параметров, паузы, повреждённые архивы,
схемы ответов и отказ без повторной генерации. Расширенная проверка контрактов
и истории прошла: 145 тестов при запрещённой сети.
Живая проба 24 октября 2026: полный запрос из 183 сообщений и 91 результата
перенесён в приватный архив. Выполнены три HTTP-запроса веб-провайдеру: создание
одного диалога, challenge и одна генерация. Ответ содержал новое чтение архива
через bash и get_goal; ошибочный запрет повторного get_goal остановил весь
пакет до исполнения. Исключение для чтения состояния исправлено и проверено
офлайн на сохранённом ответе, повторной генерации не было. Исходная история и
старые связи сохранены; счётчики учли эту единственную попытку. Цель неактивна.
Новая проверка также сохраняет диагностический пакет при запрете повторного вызова, если приватная диагностика включена. В первой пробе этот путь ещё не сохранил ID нового ответа; автоматически привязывать его по догадке нельзя.
Последующее контролируемое восстановление 24 октября: один запрос списка диалогов
и один запрос истории нашли ответ №2. Промпт и текст ответа точно совпали с
локальной записью, статус ответа — FINISHED, незавершённого фрагмента нет.
После девяти офлайн-проверок одноразовой выдачи Harness получил только этот
сохранённый ответ и успешно выполнил bash (чтение архива) и get_goal.
Следующий модельный шаг остановлен ограничителем; новых генераций не было.
Проверка использовала внутренний ID сессии с префиксом session-; загрузка
временного плагина подтверждена после перезапуска Harness. Наличие настройки
только в файле не подтверждает, что работающий процесс её уже применил.
Все 476 старых связей сохранились, добавлена одна проверенная связь с ответом №2. Настоящие результаты обоих инструментов сохранены в той же истории; продолжение с ними проверено на копии базы. HTTP-бюджет учёл два чтения, счётчики генераций и новых диалогов не изменились. Временная выдача выключена, обычный профиль веб-моста восстановлен, цель оставлена неактивной. Это проверка одного восстановленного шага.
Следующая проба продолжения 24 октября была ограничена тремя модельными шагами,
но остановилась уже на первом новом ответе №4. Провайдер штатно завершил поток
(FINISHED, finish_reason=stop): три открывающих тега параметров сопровождались
пятью закрывающими, по одному лишнему перед концом каждого invoke. Повторное
офлайн-чтение исходного SSE даёт текст ответа байт в байт; дубли есть в потоке
провайдера, а не добавлены парсером или образцом в промпте. Точная причина такого
вывода внутри модели неизвестна. Нормализация ответа и ослабление схем не применялись.
Вызовы bash и read из этого пакета не выдавались Harness и не исполнялись.
Сохранены исходный поток, схемы и точная привязка ответа №4 с запретом доставки.
Счётчики учли один HTTP-запрос challenge и одну генерацию, новый диалог не создавался.
Связь ответа №2 помечена использованной, остальные старые связи сохранены; повтор
того же запроса автоматически не разрешается. Цель оставлена неактивной. Платный
API, дополнительные чтения истории и субагенты не использовались. Эта проба выявила
новый сбой формата и не подтверждает успешную автономную работу после переноса.
Исправление этого случая: при включённых допусках DSML декодер распознаёт хвостовую
серию повторов закрывающего тега уже полностью разобранного последнего
параметра. После серии и пробелов должно сразу идти именованное закрытие invoke.
Позиция разбора меняется только после проверки всей границы. Текст внутри значений,
пропущенные теги, новые параметры и вызовы не отбрасываются и не дописываются.
В этой позиции оба поддерживаемых маркера |DSML| и ||DSML|| равнозначны,
включая смешанные серии. Другие написания и теги в других позициях остаются ошибкой. Сохраняются
проверки завершения потока, выбора инструмента, схемы каждого вызова и целого пакета.
Длина серии ограничена общим лимитом размера конверта, разбор линейный.
При проверке в Harness ответ №4 восстановлен без генерации: bash и read
успешно выполнены по одному разу. Все 477 старых связей и расход сохранились;
добавлена связь №4 со счётчиком двух принятых ответов. Затем разрешён один обычный
шаг в прежнем диалоге. Ответ №6 содержал два повторных закрытия подряд и был
остановлен до исполнения: первая версия допуска разрешала только один дубль.
Правило обобщено до терминальной серии. Финальные 135 офлайн-тестов, точные потоки
№4 и №6 и проверка привязки №6 на копии базы прошли. Финальный фикс загружен в мост.
После отдельного разрешения №6 восстановлен локально без генерации: один bash
проверил сохранённый коммит и diff и завершился успешно. Восемь проверок
восстановления прошли в песочнице без сети; точный новый запрос Harness также
проверен на копии базы. Все 478 старых связей сохранены; добавлена связь №6 со
счётчиком трёх принятых ответов. Само восстановление не изменило расход.
Один следующий запрос в том же веб-диалоге получил ответ №8: закрытие параметра
</||DSML|| parameter> сопровождалось повтором </|DSML| parameter>.
Оба написания известны декодеру, но прежнее правило повторов требовало их побайтового
совпадения. Декодер остановился на повторном закрытии; ни read, ни get_goal
из пакета тогда не выданы Harness. Это было подтверждённое ограничение разбора,
а не обрыв сети или отказ токена: EOF и штатный stop присутствуют, повторное
офлайн-чтение SSE даёт исходный текст без изменений. Четыре проверки сохранённого
сбоя прошли; точный запрос восстановлен из журнала и совпал с сохранённым digest.
Новая генерация для исправления не отправлялась. Ограничение устранено офлайн:
серия разрешает оба уже известных именованных закрытия параметра, а не произвольные
теги. Не меняются границы значений, схема, выбор инструмента, проверка завершённости,
атомарный отказ всего пакета и запрет повторов. 137 тестов прошли; точный №8 проходит
оба валидатора с неизменными file_path и пустыми аргументами get_goal.
№8 восстановлен без генерации; оба инструмента успешно выполнены один раз.
Восемь тестов восстановления и сверка фактического запроса Harness на копии базы
прошли. Все 479 старых связей сохранены; связь №8 продолжила счётчик с четырёх
принятых ответов. Расход при восстановлении не изменился.
Затем через рабочий веб-мост получены №10 и №12. Оба пакета прошли разбор и схемы:
№10 успешно выполнил bash, №12 содержал два edit. Перед продолжением Harness
был перезапущен; первый edit отчёта отклонён штатной проверкой «file has not been
read», хотя успешный read присутствует в прежнем ходе. Второй edit отменён
до dispatch. Наличие чтения в истории нельзя считать разрешением на изменение
файла в текущем runtime. Защита не отключалась, повторная генерация не запускалась.
Обычный профиль восстановлен, цель неактивна; принятые связи №10/№12 и реальные
отказы инструментов сохранены для дальнейшего продолжения. Сбой DSML исправлен,
но эта проверка отдельно выявила проблему учёта чтений при восстановлении через
перезапуск Harness. Причина подтверждена в установленной сборке: плагин
fs-observation-policy хранит наблюдения в WeakMap, привязанном к объекту
сессии и экземпляру плагина; новый apply() создаёт пустой реестр. Из журнала
эти отметки не восстанавливаются. Офлайн-проба неизменённого модуля подтвердила:
после read изменение разрешено, новый экземпляр отклоняет его с
FS_NOT_OBSERVED, новое реальное чтение снова удовлетворяет проверке.
Перезапуск между восстановленным read и следующим edit недопустимо считать
прозрачным для этой защиты; саму защиту отключать или подделывать наблюдения нельзя.
Длительная автономная работа живой проверкой пока не подтверждена.
Исправление harness-contract-v6 добавляет через штатный systemPrompt.context
обязательное уведомление с идентификатором текущего запуска плагина. Harness
записывает его как новое user/message с источником runtime-context, не меняя
старую историю или системный промпт. При перезапуске идентификатор меняется,
поэтому модель получает явное требование выполнить настоящий read нужного
файла и дождаться результата перед отдельным edit/write. Внутри одного
запуска идентификатор стабилен: перечитывать файл на каждом шаге не требуется.
Уведомление не создаёт fs/observed, не исполняет инструменты и не разрешает
повтор действий. Если модель не выполнит чтение, прежняя защита откажет.
Проверка версии после чтения также сохранена. При требовании «стоп при ошибке»
устанавливайте плагин с --stop-on-read-error; режим --allow-read-repair
предназначен для отдельно разрешённого продолжения после такого отказа.
Офлайн на установленном Harness 0.2.1-rc.3, с отдельными HOME/DSH_HOME и
запретом внешней сети, проверены три сценария с настоящими файловыми инструментами:
успешный read → перезапуск той же сессии → новый read → edit;
отказ при попытке использовать только старое чтение; отказ при внешнем изменении
файла после свежего чтения. В двух отказах следующий запрос не выполняется.
Старый журнал остаётся неизменным префиксом, смена runtime-контекста не ломает
привязку беседы. Это проверка механизма и защиты с фиктивным провайдером,
не гарантия соблюдения уведомления живой моделью.
Живая проверка того же сеанса через веб-мост завершила три шага без ошибки:
модель прочитала REPORT.ru.md и PROGRESS.md, затем отдельно успешно изменила
каждый файл. Нативное событие runtime-context записано перед первым чтением;
все четыре результата инструментов успешны. Новых запусков shell, тестов,
субагентов или платного API не было. Контрольный лимит трёх шагов затем штатно
отклонил следующий шаг (turn/end: blocked), цель стала неактивной.
Это подтверждает исправленный сценарий восстановления, а не завершение всех
планов Рентгена или неограниченную автономную работу.
Следующее продолжение того же сеанса выполнено без временного лимита шагов.
За четыре веб-генерации модель проверила дерево и отчёт через bash, прочитала
цель через get_goal, завершила её через update_goal и выдала итоговый ответ.
Все три инструмента успешны; нативный ход завершён с reason.kind: completed,
а цель — с phase: complete. Перегенераций, повторных тестов, платного API,
субагентов, push/merge/deploy не было. 485 старых связей сохранены, последняя
неиспользованная связь потреблена один раз, добавлены четыре связи с шагами
10–13. Все 62 старых события расхода остались, добавились четыре HTTP-запроса
challenge и четыре генерации. Профиль и состояния других провайдеров не менялись.
Проверка содержания результата отделена от статуса: финальный ответ закрывает
OWNER-NOTIFY-01 и явно не заявляет полную реализацию всех планов продукта,
хотя текст цели сформулирован шире. Поэтому этот прогон подтверждает завершение
веб-обмена до финального ответа, но не полное выполнение широкой цели и не
надёжность произвольной длительной автономной задачи.
Разбор расхождения: update_goal(action="complete") получил корректные ID и
revision 18 и перевёл цель в revision 19 / complete. Нативный инструмент проверяет
схему, источник разрешения и ревизию, а сервис — допустимость перехода состояния.
Оценка фактического выполнения текста цели оставлена модели. Правило «завершать
только достигнутую цель» уже присутствует в инструкциях Harness и веб-моста;
его наличие не предотвратило сужение объёма до старого отчёта. Это отдельная
проблема контроля завершения, не сбой DSML или транспорта. После её выявления
новые генерации не запускались; статус и журнал не переписывались.
На Harness 0.2.1-rc.2 пройдены 9 сценариев настоящего CLI с фиктивным
провайдером, отдельными HOME/DSH_HOME и запретом внешней сети, кроме loopback.
Проверены текст, чтение/запись, отказ и сохранение паузы, отсутствие повторов
при HTTP 503, ошибки конвейера, отмена остатка пакета и необязательный grep,
который не скрывает отказ производителя данных.
macOS не допускает вложенный sandbox-exec. Только в shell-фикстурах внутренний режим не ограничивает процессы; внешняя песочница продолжает ограничивать файлы и сеть. Рабочий профиль сохраняет прежние настройки защиты. Это не проверка живых аккаунтов провайдеров.
Shell-плагин harness-contract-v7 запрещает модели самостоятельно выполнять
update_goal(action="complete"). Успешный инструмент, закрытый пункт плана или
частичный отчёт не доказывают выполнения всей цели. Отказ происходит до
изменения нативной цели; обычная защита останавливает ход без повторного запроса.
Оставшуюся разрешённую работу модель должна продолжать, не повторяя выполненное.
Окончательная приёмка теперь отдельная: остановите ход, выполните
/bridge-goal-review, сверьте полный текст цели и все критерии с доказательствами,
затем используйте показанную /bridge-goal-complete <token>. Разрешение одноразовое,
действует пять минут только в этой сессии и теряется при новой работе, смене цели
или перезапуске. Просмотр снимает автоматическое продолжение; команда завершения
не вызывает провайдера и не сбрасывает историю или счётчики.
Это консервативная граница приёмки, не автоматическая проверка смысла отчёта:
модель пока не может полностью автономно сертифицировать готовность всего проекта.
Офлайн пройдены 50 проверок, включая установленный Harness 0.2.1-rc.3 с
подставным провайдером: попытка закрыть общую цель после одного компонента
отклонена, цель не завершена, следующего запроса нет. Установка прежняя:
python -m integrations.harness_shell_safety --profile desktop, затем перезапуск
Harness; /bridge-shell-status сообщает whole-goal completion review required.
Живое продолжение после установки v7: один запрос challenge и одна генерация.
Ответ №28 получен полностью (finish_reason=stop, EOF, без truncation), но
открывающий тег objective у create_goal повреждён: отсутствует
parameter name=". До исправления оба декодера офлайн отвергали точный сохранённый ответ.
Терминальный повтор закрывающего параметра Bash уже поддерживается; он не
является причиной этого отказа. Ни один вызов из пакета не выпущен.
Нативная попытка №20 остановилась с PI_AI_ERROR; повторов и новых запросов
после неё нет. Старый журнал сохранён побайтным префиксом, все 489 старых связей
кэша остались; использована только текущая связь, её reservation сохранена.
Все 70 событий расхода сохранены, добавлены два события разрешённой попытки.
Старые 15 раундов цели и её исторический complete не переписаны. Запрошенная
новая запись той же цели с остатком 241 раунд не создана из-за отказа пакета.
Это подтверждает безопасную остановку, а не успешное продолжение проекта.
Следующая проверка добавила точное структурное написание
<|DSML| objective" string="true">…</|DSML| parameter>: после пропуска
буквального префикса остаются полное имя поля, закрывающая кавычка, флаг типа и
значение. Разбор разрешён только на границе аргумента, при включённой терпимости
DeepSeek и совпадении имени с явно объявленным полем единственной прямой объектной
схемы. Частичные обрывки префикса, неоднозначные схемы, неизвестные имена и
оборванные значения отклоняются. Значения не переписываются; общая проверка всего
пакета, tool_choice, типов, обязательных полей и повторов сохранена.
Офлайн прошли 159 проверок DSML и общего контракта и 8 проверок привязки сохранённого
ответа. Точный поток №28 оба декодера разобрали одинаково. Привязка доказана по
исходному локальному запросу, полному потоку и ID ответа, без чтения истории у
провайдера. Одноразовый локальный обработчик выдал только сохранённые create_goal
и Bash. В установленном Harness 0.2.1-rc.3 оба инструмента завершились успешно;
следующий шаг остановлен до запроса модели. Новая цель содержит исходный objective
и остаток 241 раунд; автоматическое продолжение выключено.
Старый журнал сохранён побайтным префиксом. Все 489 прежних связей кэша неизменны; добавлена одна неиспользованная связь с №28 и 14 принятыми ответами. Журнал расходов и пауз побайтно совпадает с копией до восстановления. Новых генераций и запросов к аккаунту нет. Временный обработчик убран, обычный профиль восстановлен. Это восстановление конкретного ответа, а не доказательство полной автономности.
В той же сессии Harness разрешённое продолжение выполнило два шага: два read
полного плана/backlog и один Bash поиска документов. Восстановленные create_goal
и Bash из №28 не повторялись. На третьем шаге получен ответ №34 к родителю №32:
вместо отдельных parameter модель выдала один тег
<|DSML| file_path="…" offset="192" limit="45"> внутри invoke name="read".
У этого тега нет имени элемента parameter, флагов string и закрывающих
параметров. Числовые поля представлены текстовыми атрибутами; преобразование
такой формы не входит в проверенный контракт текущего парсера.
SHA потока, полный EOF, отсутствие truncation, нормальный finish_reason=stop
и ID №34 проверены офлайн. Повторный разбор SSE побайтно воспроизвёл текст из
диагностики; оба декодера дали тот же отказ. Это иной формат ответа модели,
а не повтор ошибки objective или обрыв транспорта. Весь пакет отклонён,
ни один его инструмент не исполнялся. Цель неактивна; повторной генерации нет.
Все 490 прежних связей сохранены: связь №28 штатно использована, добавлены связи №30 и №32. Прежние 72 события расхода сохранены, добавлены три HTTP-события и три генерации разрешённого продолжения. Старый журнал остаётся побайтным префиксом. Новых чатов, сброса счётчиков, платного API и субагентов в этом прогоне не было.
После остановки добавлена отдельная грамматика одной записи атрибутов внутри
именованного invoke; сразу после неё должен идти именованный закрывающий тег.
Она не объединяется с обычными parameter или второй записью атрибутов.
Каждое поле должно быть явно объявлено в однозначной прямой объектной схеме и
иметь единственный скалярный type. Строка сохраняется буквально; остальные
значения должны быть готовыми JSON-скалярами ровно объявленного типа. Тип не
выводится из значения, default или enum; union, applicators и references
эту грамматику не разрешают. Неизвестные/повторные поля, незавершённые или
неоднозначно экранированные атрибуты отклоняются. XML-сущности не декодируются.
Общая проверка схемы, tool_choice, нормального окончания и всего пакета сохранена.
167 офлайн-проверок парсера/контракта и 8 проверок восстановления прошли.
Точный поток №34 и digest подготовленного исходного запроса совпали с диагностикой;
оба декодера дали одинаковый read: исходный путь, offset: 192, limit: 45.
Временный локальный обработчик без внешней сети однократно передал этот вызов
Harness; настоящий read завершился успешно. Следующий шаг заблокирован до
генерации, цель осталась неактивной. Временный обработчик убран, обычный профиль
восстановлен, рабочий мост перезапущен с новым парсером.
Все 492 старые связи сохранены неизменными; добавлена только новая неиспользованная связь с №34 и 17 принятыми ответами. Журнал истории сохранён побайтным префиксом, расходы и паузы побайтно равны копии до восстановления. Генераций, запросов к аккаунту, платного API и субагентов не было. Это успешное восстановление конкретного вызова, не подтверждение полной автономности.
В той же цели успешно выполнен один Bash: чтение исходных критериев
IDE-STATE-01 и списка модулей. Сохранённый read №34 не повторялся. Следующий
ответ №38 к родителю №36 содержит начало нового Bash и затем 1 344 повтора
атрибута description, лишние и повреждённые теги. Всего 141 907 символов /
157 662 байта UTF-8; закрывающих invoke и calls нет.
Приватный поток имеет корректный SHA, EOF и truncated=false. Его повторный
офлайн-разбор точно совпадает с диагностикой; серверный терминальный статус
INCOMPLETE даёт finish_reason=length. Оба декодера отвергают пакет;
восстановитель также отказывает из-за отсутствия нормального завершения.
Это не обрыв локальной записи. Нельзя извлечь удобный префикс, отбросить повторы
и достроить окончание: полный вызов не подтверждён. Причина самого зацикливания
внутри модели по этому потоку не установлена.
Ни один вызов из №38 не исполнен, цель неактивна, повторной генерации нет. Сохранены все прежние связи и префикс журнала; связь №34 штатно использована, добавлена только связь №36. Два разрешённых шага добавили два HTTP-события и две генерации. Шесть прежних событий естественно вышли из скользящего 24-часового окна бюджета; ручного сброса не было, исходный журнал расходов сохранён в локальной копии до прогона. Платный API и субагенты не использовались.
Сохранённый фактический prompt к провайдеру содержит 44 261 символ, один
канонический пример <|DSML| calls>, ни одного двойного маркера и ни одного
вхождения повторявшейся в ответе фразы. Повторная сборка RESPONSE из исходных
SSE-байтов совпадает с диагностикой. Следовательно, наблюдавшийся цикл уже есть
в выводе провайдера; склейка истории, повторный snapshot или локальная запись
не добавили эти повторы. Внутренний механизм сбоя модели из этих данных не следует.
Обнаружены устранимые проблемы нашего контракта: при требовании одного
parameter на аргумент инструкция одновременно предлагала альтернативный
arguments-контейнер; поток ограничивался общими 8 МиБ/300 секундами, но не
структурными повторами. Альтернатива убрана из инструкции (не из совместимого
парсера). Добавлены явные правила: имя аргумента один раз на вызов, после
последнего значения закрыть параметр, invoke, затем calls и остановиться;
не пытаться исправлять уже выданную разметку внутри того же ответа. Это снижение
неоднозначности, а не доказательство того, что именно альтернатива вызвала цикл.
Новый наблюдатель в HTTP-клиенте проверяет только ответ с явным корневым calls
в начале. Он не декодирует инструменты и не меняет значения: повторное объявление
канонического параметра внутри одного invoke или более 16 лишних закрытий
параметра подряд вызывает stream_repeated_tool_framing. Состояние полей
сбрасывается между вызовами. Повторяющиеся обычные строки внутри значения,
цитируемые/ограждённые примеры и повторные snapshots не считаются циклом.
Память незавершённого фрагмента ограничена 560 символами; существующие ограничения
всего потока сохраняются. Ответы с преамбулой и произвольные текстовые циклы
этим узким наблюдателем не покрываются.
Отказ закрывает HTTP-контекст и проходит обычный путь abort: приватный префикс сохраняется с причиной, завершённый Reply не возвращается, повтор запрещён, защитная пауза сохраняется. Локальная остановка чтения не доказывает отмену вычислений на сервере; отдельный запрос отмены не отправляется. Неполный захват не допускается к восстановлению. Ни начальный Bash, ни иной префикс №38 не извлекаются для выполнения.
206 проверок прошли офлайн, включая реальный HTTP-клиент на MockTransport:
закрытие потока до следующего чанка, приватную диагностику без утечки текста,
отказ восстановления и сохранение паузы после пересоздания клиента. Точный поток
№38 проверен с чанками 1/17/4096 байт: во всех случаях отказ на 1 186-м символе
ответа, прочитано около 20 КиБ из 692 203 байт потока. Обычный офлайн-разбор
исходного свидетельства по-прежнему воспроизводит все 141 907 символов и
finish_reason=length; оно не переписывалось.
При разработке фикса рабочий мост не перезапускался, цель не возобновлялась, новых генераций не было. История, таблицы привязки и журнал расходов/пауз не изменены.
Затем фикс применён отдельным разрешённым перезапуском launchd-службы. Перед ним
проверены отсутствие незавершённого запроса, CONVERSATION_CLEAR_USED_ON_STARTUP=0
и включённая защита пауз. Новый процесс запущен тем же интерпретатором из
обновлённого рабочего дерева; /healthz вернул ok. Офлайн в том же окружении
проверены пути модулей, привязка наблюдателя в реализации HTTP-клиента и точный
сохранённый поток №38: отказ на 1 186-м символе. Ещё 45 целевых тестов прошли.
Это проверка установленного кода и запуска процесса, не тест живого провайдера.
После перезапуска журнал сессии, профиль Harness и журнал расходов/пауз побайтно равны копиям до применения; все таблицы истории логически идентичны. Цель не возобновлялась, генераций и субагентов не было. Фикс пока локальный, успешного живого продолжения после него не заявляется.
24 октября выполнена ровно одна явно разрешённая генерация от подтверждённого
родителя №36. Старую использованную привязку не открывали заново; ответ №38 не
достраивали и не выдавали инструментам. Рабочий мост вернул HTTP 400 для нового
ответа №40: Invalid or incomplete DSML tool envelope; no calls were returned.
Сохранённый поток полон, его SHA-256 совпадает, finish_reason=stop; 835 символов
ответа точно воспроизводятся из 7 393 байт потока. Вместо закрытия invoke
приходят теги <||DSML|| invoke>, а заключительные теги имеют вид
<||DSML|| /invoke> и <||DSML|| /calls>. Есть также сокращённые
заголовки параметров. Это повреждение структуры завершённого ответа, не
транспортный обрыв и не повторение длинного цикла №38. Защита от структурных
повторов здесь не срабатывает; проверка целого пакета отклоняет ответ.
Почему модель выбрала такую разметку, эти данные не устанавливают.
Офлайн воспроизведён отказ по точным байтам и проверена сохранность состояния; 33 теста парсера, контракта и защиты повторов прошли с запретом сети. Ни один вызов нового пакета не передан Harness. Журнал сессии и профиль побайтно прежние, все таблицы истории логически идентичны, включая 494 привязки. В бюджете добавлены одна генерация и один HTTP-запрос; 18 старых записей вышли из суточного окна, сброса не было. Состояние защитной паузы не изменено. Цель остаётся неактивной; после нового отказа дальнейших генераций и запросов к аккаунту не выполняли.