English · Установка · Harness · OpenCode · Провайдеры · Справка Harness
Один локальный сервер соединяет DeepSeek Harness или OpenCode с вашими аккаунтами DeepSeek, Qwen, Kimi и GLM. Клиент работает с проектом и выполняет инструменты, мост передаёт сообщения через OpenAI-совместимый API. Для веб-подключений отдельный API-ключ провайдера не нужен.
Harness работает самостоятельно: устанавливать OpenCode для него не нужно. Статус локальных исправлений и живых проверок указан ниже отдельно от опубликованного кода.
Обновление безопасности от 12 октября 2026: локальный /v1 теперь требует
токен моста. После обновления перенастройте клиент по разделу
Токен доступа к API. Исправления привязки аккаунта,
защиты от повторов, shell-команд и завершения CLI проверены офлайн; это обновление
не проверялось на живых аккаунтах в Harness, OpenCode или браузере.
Это не безлимитный API. Действуют квоты аккаунта и локальные ограничения моста. Автоматизация веб-чата может привести к блокировке: на нашем аккаунте DeepSeek ограничения возникали повторно, точная причина не установлена. Успешный тест не гарантирует доступность следующей задачи. Защита аккаунтов.
Контракт разрешения и восстановления, офлайн: импорт истории и выдача
сохранённого ответа используют общий контракт с точным присутствием полей,
эффективным thinking, протоколом и схемами инструментов. Импорт дополнительно
проверяет хеш отправляемого prompt. Изменение контракта останавливает операцию;
старые разрешения без доказанного контракта не принимаются и автоматически не
перевооружаются. Ключи старой истории и использованные разрешения сохраняются.
Восстановление сохраняет отсутствующие параметры отсутствующими; смена аккаунта,
параметров или настроек не разрешает выдачу сохранённого ответа.
Полный цикл установленного Harness теперь проверяется отдельно с DSML и JSON:
чтение, единственная запись, проверка, приёмка и перезапуски. Это локальный макет
провайдера, не подтверждение надёжности живой генерации. Фиксы применены к
рабочему мосту, мост перезапущен; локальный /healthz отвечает. История,
счётчики, пауза и профиль Harness сохранены побайтно. Цель не продолжалась,
запросов к аккаунтам не было.
Текущий статус, 24 октября: офлайн исправлены сохранение параметров запроса
и переход цели к независимой приёмке (harness-contract-v8). Отсутствующий
thinking больше не превращается в явный false при записи журнала; отдельная
квитанция фиксирует фактические настройки отправки. request_goal_review
останавливает автопродолжение, сохраняя цель незавершённой. Оператор принимает
результат через /bridge-goal-review и одноразовый /bridge-goal-complete.
Полный цикл установленного Harness проверен на локальном подставном провайдере,
включая два раунда, запись/чтение, ожидание приёмки и перезапуски. Это не проверка
качества новых ответов DeepSeek: автономность веб-генератора пока не подтверждена.
Фиксы установлены в рабочий мост и Harness, оба перезапущены. Локальная команда
подтвердила harness-contract-v8; проверка отклонённого пустого запроса подтвердила
точное сохранение параметров в работающем мосту без отправки провайдеру.
Общий офлайн-прогон: 997 тестов, 68 пропусков; ошибок нет. Исходная история,
счётчики и пауза сохранены, цель не продолжалась. Harness добавил только служебные
события завершения загрузки сессий и локальной проверки статуса.
Параметры и приёмка цели.
Последующая живая проверка v8: одна явно разрешённая повторная генерация
от ответа №36 получила №42 с подтверждённым thinking=true. Полный сохранённый
поток (finish_reason=stop) уже содержит повреждённый закрывающий тег параметра:
</||DSML||DSML| parameter>. Пакет целиком отклонён, инструменты не выполнялись,
повторов не было. Фикс параметров сработал, но устойчивость DSML-ответов этим
не обеспечена. Цель остановлена; старая история и пауза сохранены, счётчики
учли одну генерацию и один HTTP-запрос. Платный API не использовался.
Живая проверка 23 октября: новая сессия Harness остановилась на четвёртом шаге из-за повреждённых параметров DSML, уже присутствующих в полном ответе DeepSeek. Успешная предыдущая цель и зелёный CI не означают устойчивой работы произвольных целей. Веб-транспорт передаёт инструкции текстом, без принудительной схемы генерации. Разбор контракта и границ проверки. Офлайн установленный CLI проверен на цепочке из трёх успешных действий и повреждённого четвёртого ответа: весь плохой пакет отклоняется, выполненное сохраняется, повторная подача той же истории не вызывает новую генерацию. Это проверка защиты от повторов, а не исправление текстового генератора.
Проверка 24 октября, контроль цели: локальный harness-contract-v7 не даёт
модели закрыть всю цель по частичному отчёту; нужна отдельная
приёмка полного объёма. 50 офлайн-проверок пройдены.
После установки одна попытка продолжения через веб-мост остановилась на
повреждённом теге create_goal.objective в полном ответе №28. После офлайн-фикса
восстановлен именно сохранённый пакет, без генерации: исходные create_goal и
Bash выполнены успешно. Цель с остатком 241 раунд оставлена неактивной.
159 проверок парсера и контракта, ещё 8 проверок восстановления прошли офлайн.
История и расход сохранены. Полная автономность не подтверждена; изменения пока локальные,
публикация в main в этой проверке не выполнялась.
Точная форма <|DSML| objective" string="true">…</|DSML| parameter>
теперь разбирается только при включённой терпимости DeepSeek и наличии этого
имени в однозначной объектной схеме инструмента. Имя, значение и тип не
восстанавливаются догадками; весь пакет проходит прежнюю проверку схем.
Оборванные значения, неизвестные поля, частично повреждённые атрибуты и
цитируемые примеры не превращаются в вызовы. Обновление парсера само по себе
не выдаёт старый ответ повторно и не возобновляет цель.
Продолжение после №28: два следующих шага успешно прочитали план/backlog и
нашли связанные документы. На третьем шаге полный ответ №34 содержал read с
аргументами-атрибутами (file_path="…" offset="192" limit="45") вместо параметров
DSML. Исходный поток подтверждает тот же текст без усечения. Первоначально оба
декодера отвергли пакет; цель остановилась без выполнения вызова и без повтора.
Старые история и расходы сохранены; добавлен только фактический расход трёх
разрешённых шагов. Этот прогон не подтверждает автономную работу до результата.
Восстановление №34: атрибуты теперь допускаются только как одна полная запись
внутри invoke, с явно объявленным единственным скалярным типом каждого поля.
Строки сохраняются буквально; числа, boolean и null читаются как JSON и обязаны
совпасть с типом схемы. Union, $ref, отсутствующий тип, неизвестные/повторные
поля, смешение с parameter и оборванные записи отклоняются. Проверка всех
ограничений схемы и всего пакета остаётся обязательной; XML-сущности и escape-
последовательности не преобразуются. 167 проверок парсера/контракта и 8 проверок
восстановления прошли офлайн. Сохранённый read №34 успешно выполнен в Harness
один раз, без генерации; цель оставлена неактивной. История, расходы и паузы
сохранены. Обычный профиль восстановлен, рабочий мост перезапущен с фиксом.
Следующее продолжение: один шаг с Bash прошёл, но ответ №38 на втором
зациклился: 1 344 повтора атрибута description, 141 907 символов, отсутствуют
закрытия invoke/calls. Провайдер завершил его как INCOMPLETE (length),
при этом локальная запись потока полная. Пакет не выполнен; цель остановлена,
повторов нет. Восстановление отвергнуто: обрезать хвост и достроить вызов нельзя.
Это сбой генерации, а не ещё один допустимый вариант атрибутов.
Офлайн-защита от зацикливания №38: инструкция теперь требует одну каноническую
форму DSML, каждое поле ровно один раз и немедленное закрытие вызова/пакета.
Исторические совместимые формы остаются только в парсере. Для ответа,
начинающегося с calls, HTTP-клиент прерывает чтение при повторном объявлении
параметра внутри одного invoke или более 16 лишних закрытиях параметра подряд.
Пакет целиком отклоняется; соединение закрывается, приватный префикс сохраняется,
обычная защита от повторов и защитная пауза остаются в силе. Новых запросов для
«починки» нет. Это ограниченная защита структурных повторов, не распознавание
любого зацикливания текста; закрытие соединения не гарантирует остановку работы
на сервере провайдера.
206 тестов прошли офлайн. Точный сохранённый №38 остановлен на 1 186-м символе
при трёх вариантах разбиения потока. Сам ответ не достраивался и не выполнялся.
Фикс затем применён к рабочему мосту перезапуском: новый процесс запущен из
обновлённого дерева, /healthz отвечает ok. В том же окружении прошли 45
целевых офлайн-проверок, точный №38 останавливается на 1 186-м символе.
История, профиль и журнал расходов/пауз не изменились; цель не возобновлялась,
на этапе применения живых генераций не было.
Результат одной разрешённой живой попытки после фикса: ответ №40 от
родителя №36 завершён штатно (stop), но содержит повреждённые DSML-закрытия.
Зацикливания в этом ответе нет; весь пакет отклонён, инструменты не выданы,
цель остаётся остановленной. Повторной попытки и нового чата не было.
Точный поток воспроизведён офлайн; 33 теста прошли. Журнал Harness, профиль и
все таблицы привязки истории сохранены. Бюджет учёл одну генерацию и один
HTTP-запрос; счётчики не сбрасывались, истекшие записи удалены штатным суточным
окном. Успешная автономная работа после фикса пока не подтверждена.
Офлайн-исправления веб-контракта от 24 октября: разрешённое обновление
каталога Harness теперь передаёт провайдеру новую системную инструкцию и полные
схемы один раз, даже в компактном режиме. Текущий tool_choice передаётся во всех
режимах; auto явно отменяет выбор инструмента, заданный для предыдущего ответа.
Проверены 238 тестов и 35 закреплённых архивных случаев через парсер и API-пути.
Сеть при проверке запрещена. Эти исправления устраняют потерю условий запроса,
но не устраняют подтверждённое повреждение параметров в последнем ответе DeepSeek.
Аккаунты и рабочие истории не использовались для прогона.
Доказательства и оставшееся ограничение.
Для владельцев API-ключа отдельно проверен официальный маршрут Harness:
контрольная задача с нативными инструментами завершилась, четыре теста прошли.
24 октября завершена и возобновлённая цель разработки установщика: последнее
продолжение прошло 12 шагов без ошибок и завершилось штатным complete.
DeepSeek обновил веб, приложение и API до V4.1-Flash-1017.
Мост передаёт режим default (deepseek-chat) или expert (deepseek-expert),
а не номер весов: обновление выбранного режима происходит на стороне сервиса.
Это не гарантирует конкретную версию ответа; отдельный новый model ID мост
автоматически не добавляет. Для новой модели DeepSeek рекомендует Harness
0.2.1-rc.1 или новее; совместимость обновлённого Harness с плагинами требует
отдельной проверки.
Повторный офлайн-аудит воспроизвёл недостаточное расстояние между генерациями
и отсутствие проверки срока PoW после вычисления/ожидания. Исправлен
независимый интервал генераций, сохраняемый после перезапуска,
перевхода и сброса бюджета. Учитывается время получения и вычисления PoW,
а срок повторно проверяется перед отправкой. Истечение останавливает запрос
без автоматического нового challenge или генерации. Исправления включены в main. Проверено обновление установленного Harness
с 0.2.0-rc.2 до 0.2.1-rc.2 с сохранением профиля и истории.
Основной офлайн-прогон: 887 тестов, 835 пройдены, 52 пропущены.
Новый сценарий настоящего CLI Harness отдельно проверил точную запись файла
и возврат результатов без повтора с локальным фиктивным провайдером.
Ранее отдельно прошла проверка дочернего процесса, недоступная внутри sandbox.
Ранее проверены 9 сценариев настоящего CLI Harness 0.2.1-rc.2 с фиктивным
провайдером и изоляцией внешней сети: чтение/запись, остановка после отказов,
shell-конвейеры и запрет повторов при HTTP 503. Дополнительно проверены сохранение
одноразовых связей при восстановлении ответа и разрешения возобновлённой CLI-сессии.
Найдены и исправлены ошибочные разделители DSML в промпте и выдача повреждённой
разметки как успешного текста. Живая проверка 23 октября завершена:
та же длительная цель Рентгена штатно достигла complete, CLI вышел с кодом 0.
Harness записал сохранённый отчёт через настоящий write, затем проверил
рабочую папку, вызвал update_goal и выдал итоговый ответ. Все 14 959 байт
отчёта совпали с сохранённым ответом: повторная генерация для восстановления
не потребовалась. Новый узкий набор тестов Рентгена дал 228 passed, 64 skipped;
ранее пройденные проверки не повторялись. Это завершение конкретной задачи,
а не гарантия безошибочной работы веб-модели с любой задачей.
Полная DSML-обёртка arguments
теперь поддерживается как отдельная форма входа для однозначной прямой схемы
объекта. Принимается ровно один типизированный JSON-объект, без смешивания
с отдельными параметрами, без неизвестных полей и только после проверки всей
схемы. Настоящий параметр с именем arguments не разворачивается; составные
схемы, ссылки и отсутствие обязательных полей не включают этот разбор.
Повреждённый JSON, пропуски и неверные значения по-прежнему отклоняют весь пакет.
В DSML-режиме также распознаются точные именованные окончания </DSML| invoke>
и </DSML| calls> только на границах соответствующих внешних элементов.
Такое написание не разрешено для начала элемента, границы параметра или
безымянного закрытия; содержимое аргументов не переписывается.
Сохранённый ответ проходит обе реализации API без изменения значений;
восстановление его связи проверено на копии базы без запроса к аккаунту.
Один из промежуточных отказов — другой случай: лишний неизвестный тег содержит повреждённый
JSON, затем аргументы повторяются в корректном теге. Независимая сборка полного
SSE совпадает с ответом. Нельзя отбросить первый вариант или исполнить только
валидную часть. Два новых офлайн-теста проверяют сохранение потока и отказ
целого пакета обеими реализациями API без исправляющего запроса.
Финальное восстановление сохранило все 469 прежних записей привязки;
новые связи продолжили счётчик с 16 до 19, старые байты трёх сессий Harness
сохранены. После восстановления были три обычные генерации / шесть HTTP-запросов,
без нового чата. Общие счётчики не сброшены, аккаунт и защитные лимиты не менялись.
Локальный потолок раундов проверяемой цели увеличен с 8 до 10 штатным API,
использованные раунды сохранены. Проверочный relay после завершения остановлен.
Веб-транспорт передаёт текст без принудительного response_format и native
tools: полностью автономная работа с произвольными задачами ещё не доказана.
Проверки схем и запрет повторов ради успешного прогона не ослаблены.
Ранее отдельно проверены два штатных раунда цели Harness до завершения
с фиктивным провайдером; это не живая проверка качества модели.
Результаты и границы проверки 23 октября.
Тридцать секунд — локальная настройка, а не
одобренная провайдером безопасная квота. Причина прежних временных блокировок
не установлена: исходные серверные коды тогда не сохранялись. Окончание срока
блокировки не снимает локальную паузу и не доказывает исход pending-запроса.
Что проверено и что осталось неизвестным.
Понадобятся Python 3.9+ (рекомендуется 3.12), Git, аккаунт выбранного сервиса и один клиент: DeepSeek Harness или OpenCode. Ниже — macOS/Linux; Windows и подробная настройка.
git clone https://github.com/DmitrL-dev/opencode-deepseek.git
cd opencode-deepseek
python3 -m venv venv
source venv/bin/activate
python -m pip install -r requirements.txt
python -m playwright install chromium
cp .env.example .envПри обновлении существующей установки сохраняйте свой .env и session/.
Все провайдеры в примере выключены; включайте только нужные.
Для первого запуска ниже используется Qwen Flash:
python -m qwen.authВойдите сами в открытом окне, дождитесь сохранения сессии. В .env измените:
QWEN_ENABLED=1Первоначальный вход требует браузера, дальнейшие запросы Qwen работают без
вкладок. Токен короткоживущий: для продления перед новым запросом можно отдельно
включить QWEN_RENEW_SESSION=1. Продление выполняется внутри durable-попытки
этого запроса и должно вернуть тот же аккаунт. Ссылки бесед привязаны к аккаунту
Qwen, поэтому смена токена не обрывает цели Harness. Когда истечёт cookie входа,
снова потребуется ручной вход. Как устроено продление.
Нужен DeepSeek вместо Qwen? Выполните python -m deepseek.auth, войдите в
аккаунт и задайте DEEPSEEK_ENABLED=1. В команде установки Harness ниже замените
qwen3.8-omni-flash на deepseek-chat или deepseek-expert. Автоматического
продления DeepSeek нет; сохранённая сессия используется независимо от возраста.
При отказе токена (40002/40003) запросы останавливаются без повторов; нужен ручной вход. Новый захват python -m deepseek.auth сохраняет историю Harness только для того же подтверждённого аккаунта; другой аккаунт отклоняется (осознанная замена — --replace-account), а для неподтверждённой прежней сессии нужен --same-account. Не продолжайте запросы при предупреждении об ограничении аккаунта.
Для Kimi используйте отдельную настройку HTTP-сессии, для GLM — подключение вкладки Safari.
python app.pyОставьте этот терминал открытым. Один процесс обслуживает все включённые подключения; второй экземпляр не нужен. В другом терминале:
curl http://127.0.0.1:8000/healthz
curl -H "Authorization: Bearer $(cat "$(python -m server.api_auth path)")" http://127.0.0.1:8000/v1/modelsЭти проверки локальные и не отправляют запросы моделям. Каждый запрос к /v1
требует токен API моста (см. Токен доступа к API). В каталоге должна
появиться выбранная модель. Затем подключите свой клиент ниже.
API /v1 управляет вашими аккаунтами провайдеров, поэтому требует
Authorization: Bearer <токен> и локальный Host. Сервер при первом
обращении создаёт приватный файл session/api-token (0600);
python -m server.api_auth path печатает путь к нему, но не сам токен. Запросы
без токена, со страниц браузера (cross-site или DNS rebinding) и на чужой Host
отклоняются до обращения к провайдеру и к rate-limit.
Миграция с бесключевого API:
- Обновите мост и перезапустите его.
- Harness: повторите
python -m integrations.harness --install <профиль> ...с прежними параметрами. ЗаголовокBearer unusedзаменится токеном в приватном файле профиля. Перезапустите Harness. - OpenCode: укажите
"apiKey": "{file:/абсолютный/путь/session/api-token}"для каждого локального провайдера (пример). Прочие клиенты OpenAI SDK передают токен какapi_key. - Только на время миграции
API_AUTH=legacy-loopbackпропускает запросы без токена от loopback-клиента с loopback Host и без заголовков браузера. Уберите настройку, когда клиенты начнут передавать токен.
HOST вне loopback отклоняется без API_ALLOW_PUBLIC_BIND=1 (только в режиме
токена). Тогда также перечислите обслуживаемые имена в API_ALLOWED_HOSTS и
закройте порт межсетевым экраном. Эта проверка адреса есть только в python app.py:
прямой запуск uvicorn server.api:app --host … её обходит, хотя Host и токен
(кроме переходного legacy-loopback) по-прежнему проверяются для каждого /v1.
- Установите и один раз откройте официальный Harness. При начальной настройке можно выбрать Add API Key → Set up later. Для Local account bridge вход в аккаунт Harness и официальный API-ключ DeepSeek не нужны. Если после перезапуска снова появился экран Welcome, повторите этот выбор: в Harness 0.2.1-rc.2 он действует только до закрытия приложения и не меняет сессию провайдера в мосте.
- В другом терминале перейдите в каталог моста, активируйте
source venv/bin/activateи выполните при работающем сервере:
python -m integrations.harness --install desktop --without-browser --default-model qwen3.8-omni-flash
python -m integrations.harness_shell_safety --profile desktop- В Harness выберите папку проекта, создайте новую сессию и в меню моделей выберите группу Local account bridge → нужную модель. Если группа ещё не появилась, перезапустите Harness. Старые сессии могут сохранять прежнюю модель.
- Начните с небольшой задачи, например: «Прочитай README проекта и кратко объясни его назначение». Следите за вызовами инструментов и итоговым ответом.
Установщик читает локальный каталог, сохраняет резервную копию профиля и
обновляет ~/.dsh/profiles/desktop/cordis.patch.yml. Он отключает автоматические
повторы и генерацию заголовков моделью. Аккаунтам ничего не отправляет.
В меню остаётся один пункт на модель: пара модель и провайдер/модель
объединяется с предпочтением короткого ID. Если видны дубли, повторите установку
с прежними параметрами; профиль перечитывается без изменения истории и бюджетов.
| Что подключаете | Как настроить Harness |
|---|---|
| DeepSeek, Qwen, прямой HTTP Kimi | Команда выше с --without-browser и доступным --default-model |
GLM или kimi-web через вкладку |
Настройте вкладку, повторите команду без --without-browser; выберите glm-web или kimi-web |
| Web UI / CLI | Для уже созданного профиля замените --install desktop на --install web / --install headless |
| Добавили или отключили провайдера | Перезапустите мост и повторите установку каталога с нужными флагами |
--without-browser отбирает подходящие адаптеры; он не отменяет первоначальный
вход и не превращает GLM в HTTP-подключение. Каталог не подтверждает доступность
аккаунта. Полная инструкция Harness.
Если у вас есть оплаченный API-ключ, Harness может работать напрямую через штатный провайдер DeepSeek. Этот маршрут передаёт схемы и вызовы инструментов через Messages API; парсер текстовой разметки DSML нашего веб-моста не участвует.
-
Откройте Settings → Models → DeepSeek, вставьте API-ключ и нажмите Apply. Не сохраняйте ключ в репозитории или переписке.
-
Закройте Harness и выполните из корня репозитория, в окружении с установленными зависимостями проекта:
python3 -m integrations.harness_official --install desktop --dry-run python3 -m integrations.harness_official --install desktop --default-model deepseek-flash
-
Запустите Harness и создайте новый чат. Выберите DeepSeek → DeepSeek-V4.1-Flash, без суффикса
· web. Старые чаты сохраняют выбранную модель; установщик не переносит их историю и не возобновляет упавшие шаги.
Установщик поддерживает уже созданные стандартные профили desktop, web и
headless; --home задаёт каталог вместо DSH_HOME или ~/.dsh.
Без --default-model выбор модели сохраняется. Остальные провайдеры и параметры
профиля сохраняются; изменённый файл и резервная копия записываются с правами
0600. Повторная установка без изменений ничего не пишет. --dry-run не создаёт
файлов. Установщик не обращается к сети, не читает ключи или .env веб-моста,
не меняет историю, паузы и счётчики.
Симлинки в пути, неоднозначные записи, динамические настройки изменяемых плагинов и нестандартные композиции отклоняются. Для профиля с заменёнными плагинами объедините записи из harness_official.patch.yml вручную через Settings → Open configuration file, сохранив свои настройки. Не заменяйте весь профиль примером.
Настройка отключает автоматические повторы, генерацию заголовков и отправку
журналов сессий; ограничивает выход одного запроса 32768 токенами, включая
рассуждение. Лимит 8192 в длинной задаче исчерпался до вызова инструмента,
поэтому увеличен. Достижение лимита останавливает цель без автоматического повтора.
Это не ограничение общего расхода денег: API тарифицируется провайдером,
а /bridge-budget учитывает только веб-мост. Проверка схем strict не включается.
Проверено 23 октября 2026: установленный Harness 0.2.1-rc.2 выполнил через
официальный API одну задачу за четыре шага: два read, edit, один запуск тестов,
затем итоговый ответ; все четыре теста прошли, их файл не изменён. Отдельные
офлайн-сценарии проверили точную передачу аргументов, автоматическое продолжение
цели между ходами, остановку при HTTP 503, оборванном потоке и достижении
лимита ответа. Установщик отдельно проверен на временных профилях: сохранение
настроек, резервные копии, идемпотентность, отказ без записи и защита секретов. После ошибки
цель остаётся неактивной; явное возобновление в новом процессе сохраняет историю
и не повторяет уже выполненную запись файла. Эти сценарии запускают установленный
Harness с временным профилем и локальным тестовым сервером, без аккаунта.
Это подтверждает данные проверки, а не безошибочную работу любой цели.
Проверено 24 октября 2026: после локальных исправлений возобновлена та же
цель разработки установщика. Последний живой ход прошёл 12 шагов и 21 вызов
инструментов без ошибок, закончил документацию и проверку diff, затем перевёл
исходную goal в complete. Ранее пройденные 13 тестов установщика повторно не
запускались; код после них не менялся. До этого продолжения требовались исправления
установщика и политики остановки — это не утверждение о полностью автономном
выполнении задачи с первого запуска. История, пауза и счётчики веб-моста сохранены.
Офлайн отдельно проверены завершение цели после исправления assertion и
сохранение запрета edit без read при включённом восстановлении предусловия.
В тот же день через официальный API завершена длинная задача Рентгена:
73 шага, 89 вызовов инструментов, исходная goal достигла complete.
Исправлен подтверждённый дефект инициализации базы получателя уведомлений,
добавлены проверки пограничных случаев; итоговый набор — 265 passed, 8 skipped.
Три локальные остановки (grep без совпадений, Python import path,
симлинк временного каталога) разобраны и продолжены оператором без участия
пользователя; это не полностью самостоятельный запуск модели. Ошибок API
не было, субагенты не использовались, история и счётчики веб-моста сохранены.
В офлайн-драйвере исправлена гонка наблюдателя конца хода: отложенный callback
больше не завершает следующий ход по его новому состоянию. Все 9 сценариев
установленного Harness с локальным тестовым API прошли, включая отказ без повтора.
После установки плагина локальных лимитов доступны команды, которые выполняются без обращения к модели:
| Команда | Результат |
|---|---|
/bridge-budget |
Расход и остаток шести скользящих бюджетов DeepSeek: генерации, новые чаты и HTTP за час/сутки |
/bridge-budget-reset |
Предпросмотр сброса, без изменения счётчиков |
/bridge-budget-reset CONFIRM |
Подтверждение в той же сессии в течение 60 секунд |
Сброс затрагивает только локальный расход. Он не снимает паузу провайдера, не меняет квоты сайта, интервалы запросов или историю диалога. При активном или неразрешённом запросе, а также изменении расхода после предпросмотра сброс отклоняется. Плагин требует отдельный приватный токен; одного подключения моделей недостаточно.
На macOS выберите deepseek-login в меню команд Harness или введите
/deepseek-login. Откроется Safari; при необходимости войдите в тот же аккаунт.
Перенос принимает алфавит Bearer из RFC 6750,
включая +, / и конечные =; пробелы, переводы строк, Unicode и лишняя длина
по-прежнему отклоняются. Это исправляет локальный отказ переноса части токенов
после успешного входа; проверка аккаунта и сохранённая пауза остаются обязательными.
Сессия перенесётся локально, без инспектора и копирования токена. Результат —
/deepseek-login-status. При saved_paused новые учётные данные сохранены, но
защитная пауза и незавершённый запрос остаются. Сначала проверьте ограничения
аккаунта и исход предыдущей попытки; обновление сессии не разрешает повтор генерации.
Явный отказ 40002/40003 при создании чата или получении challenge до генерации
допускает обновление сессии. Неопределённые сетевые сбои и отказы после отправки
генерации по-прежнему требуют разбора; повтор автоматически не выполняется.
Один раз обновите плагин локального бюджета, установите
DeepSeek session transfer в папку
Save Location приложения Userscripts и разрешите доступ к chat.deepseek.com
и 127.0.0.1. После завершения активной работы перезапустите обновлённый мост
и Harness. Поддерживается macOS и мост на 127.0.0.1. При PORT, отличном от
8000, выполните python -m providers.tab_bridge и установите экспортированную
копию из session/browser-bridge/userscripts, а плагин бюджета переустановите с
python -m integrations.harness_budget --base-url http://127.0.0.1:<PORT> ...
(без явного адреса берётся PORT из окружения или .env, иначе 8000).
Явный --base-url имеет приоритет даже при ошибочном PORT; разрешён только
HTTP-адрес loopback без учётных данных, пути, query или fragment.
Настройка и правила восстановления.
История, счётчики и интервалы сохраняются; цель автоматически не возобновляется. При первом переносе нужно подтвердить тот же аккаунт, далее сверяется сохранённый идентификатор. Это ручное восстановление сессии, а не фоновое автопродление. Офлайн-проверки пройдены; сквозная проверка нового сценария на живом аккаунте пока не выполнена.
DEEPSEEK_STREAM_DIAGNOSTICS=1 включает приватное сохранение сбойного SSE-потока
после перезапуска моста. Файлы лежат в session/failed-streams/ с правами 0600:
до четырёх записей, до 8 МиБ принятых байтов на каждую. Ответ может содержать
приватный код — не публикуйте эти файлы. Успешные ответы не сохраняются.
Офлайн-разбор: python -m deepseek.stream_diagnostics session/failed-streams/<id>.json.
Только полный поток с распознанным завершением и корректным ID ответа может дать
приватный файл .review.json. Это кандидат для проверки, не разрешение на
выполнение инструментов: команда не меняет историю, счётчики или паузу и не
возобновляет цель. Без маркера окончания или при обрыве восстановление отклоняется.
Старый сбой без сохранённых байтов восстановить таким способом нельзя.
Подробности.
Если DeepSeek возвращает context_length_exceeded, исчерпан контекст самого
диалога. Это не локальный бюджет и не истёкшая сессия: сброс счётчиков и перевход
не помогут. Мост сохраняет историю и останавливается; новый чат автоматически
не создаётся. Перенос цели в новый диалог требует отдельного ручного решения.
Необязательное TOOLCALL_LOG=1 включает подробную запись бесед в logs/
(по умолчанию 0, выключено). На один диалог создаётся один файл
MMDDHHmmss-<провайдер>.log: в него добавляются запросы агента, собранные prompt-ы,
сырые ответы провайдера, итоговые JSON/SSE-ответы агенту и ошибки — с разделителями
from agent, to provider, from provider, to agent. Логи могут содержать исходный
код, секреты и результаты инструментов; включайте только для локальной диагностики,
не публикуйте их. Папка игнорируется Git. Проверка реализации — офлайн; обмены с
живыми аккаунтами не проверялись. Для продолжения используется сохранённый ID диалога;
если провайдер не вернул ID, следующая беседа не может быть связана с этим файлом.
Новый режим TOOL_INSTRUCTIONS_BROWSER=medium (по умолчанию остаётся light, он
прежний: только имена инструментов). На продолжениях беседы напоминание дополнительно
содержит форму аргументов каждого инструмента (имена полей, вложенность, ? —
необязательное; без описаний), чтобы модель не придумывала аргументы по памяти;
первый ход, как и в light, получает полный блок. Запросы на продолжениях при этом
длиннее. Ответ вроде
{"question": ..., "options": [...]} вместо {"questions": [...]} отклоняется как
«Tool arguments do not satisfy the advertised schema».
Временный переключатель TOOLCALL_LEGACY (по умолчанию 1): 1 — контракт как
на main для всех провайдеров (server/api.py + server/tool_protocol.py:
один блок, repair только DeepSeek, всегда invalid_tool_response; будет удалён);
0 — единый путь tool-rework в server/api_new.py + server/tool_protocol_new.py
для всех провайдеров, включая DeepSeek (demote, multi-block, pointed repair,
TOOLCALL_INVALID_MODE). Сводка — в
SETUP §5;
развёрнуто:
docs/toolcall-format-repair-legacy.md
(LEGACY=1) и
docs/toolcall-format-repair.md (LEGACY=0).
В обоих режимах полный нативный DSML-ответ DeepSeek проходит прежнюю общую
проверку схем, завершения и tool_choice, без дополнительной генерации.
При TOOLCALL_LEGACY=0 вызовы обрабатываются как в любом агенте. Вызовом является
только верхнеуровневый блок tool_calls в fence, где бы он ни стоял в сообщении.
Проза, текст после блока, несколько блоков, массивы без этого fence (в том числе в
блоке ```json) и цитируемые блоки остаются обычным текстом. Это включает
примеры внутри ~~~, ограждений из четырёх и более обратных кавычек и блоков
с отступом в четыре пробела или табуляцией: инструменты из них не выполняются.
Проверено офлайн; живые аккаунты для этой проверки не использовались. До
validate/repair мост может сбросить «совет под видом вызова»: если у блока нет
call-level name (JSON целый или битый) или имя неизвестно и рядом есть проза —
открывающий fence переименовывается из tool_calls в text, агент получает
обычный успешный content, без repair и без TOOLCALL_INVALID_MODE. Иначе каждый
оставшийся блок должен быть корректным: битый JSON (в т.ч. с известным именем),
неизвестное имя без прозы или аргументы не по схеме останавливают всё сообщение
(repair / TOOLCALL_INVALID_MODE); silent pass в validate больше нет. Если все
блоки корректны, все вызовы выполняются по порядку: агент получает их как
tool_calls, а остальной текст, с вырезанными блоками, как обычное содержимое.
В stream: true текст и вызовы идут отдельными кадрами в исходном порядке
(text1, call1, text2, call2, text3); при stream: false остаётся один
content и один массив tool_calls. tool_choice: none никогда не превращает
текст в ошибку. Проверено офлайн.
С TOOLCALL_FORMAT_REPAIR=1 (по умолчанию выключено) при LEGACY=0 ошибочный
вызов получает одну pointed-коррекцию в той же беседе (одна дополнительная
генерация): для неизвестного инструмента — полный список инструментов с формой
аргументов (имена полей, вложенность, ? — необязательное; без сокращений), для
неверных аргументов — форма аргументов этого инструмента (без значений). Вторая
коррекция не запрашивается. Если исправленный ответ корректен, агент видит только
итоговый вызов, без уведомления. Дальше исход задаёт TOOLCALL_INVALID_MODE
(ниже). При LEGACY=1 repair по-прежнему только для DeepSeek (main-era промпт).
Проверено офлайн.
TOOLCALL_INVALID_MODE (по умолчанию error; только при LEGACY=0): что делать с
невалидным вызовом после проверки или после неудачной одной коррекции — для
любого провайдера, включая DeepSeek. При error агент получает
invalid_tool_response (fail-closed). При text — обычный HTTP-успех с живым
чатом провайдера, но явный неуспех шага для агента:
- в
content— сырой ответ и строкаBridge notice: BRIDGE_TOOL_NOT_EXECUTED: …(имя инструмента максимум; без схем и значений); - сверху ответа — объект
bridge_notice(executed: false,code,kind,tool,as_tool_errorкак заготовка ошибки tool); - в
message.refusal— тот же текст notice (для клиентов, которые читают refusal); - следующее сообщение пользователя уходит в закладку провайдера как
Tool result (имя): <notice>плюс текст follow-up — как будто tool вернул ошибку.
Исполняемые tool_calls при отказе не выдумываются (агент мог бы их запустить).
Даже при text ошибкой остаются: tool_choice required/конкретный инструмент,
ответ без ID беседы и оборванный ответ. Совет browser под видом вызова (нет
call-level name или неизвестное имя с прозой) до этого пути сбрасывается в fence
text. Проверено офлайн.
Вызов, который повторяет с теми же аргументами вызов, результат которого есть в
запросе (модель на результат отвечает тем же вызовом), второй раз не выполняется:
при TOOLCALL_INVALID_MODE=text агент получает такое же сообщение (сырой ответ и
строка о повторе), при error — ошибка. Непустое новое сообщение пользователя
после результата инструмента начинает отдельное действие: например, можно снова
проверить CI, который прежде был pending. Пустое сообщение не снимает проверку.
Повторная доставка уже использованной истории по-прежнему отклоняется до запроса
провайдеру. Проверено офлайн.
Результат инструмента, который возвращает агент (например выбранный вами вариант),
в компактном браузерном режиме уходит как Tool result (имя id="..."): <результат>.
ID сохраняется для привязки; несколько вызовов одного инструмента дополнительно
получают точное сопоставление вызовов. Полные схемы обычно не повторяются, но
текущий tool_choice передаётся после результата даже при режиме none.
auto явно снимает прежний выбор для отдельного ответа; ограничения задачи
и проверки схем сохраняются. При разрешённой смене каталога один раз отправляются
полные схемы. На исход невалидного вызова влияет TOOLCALL_INVALID_MODE (выше).
Проверено офлайн.
Для DeepSeek отключение TOOLCALL_FORMAT_REPAIR запрещает дополнительную генерацию для
исправления формата, но не отключает проверку разметки инструментов. Некорректный
блок вызовов останавливает шаг; он не выдаётся за обычный успешный текст.
После нормального завершения ответа DeepSeek допускается пояснение перед одним
явным завершающим блоком tool_calls. Мост локально нормализует плоские аргументы
по объявленной схеме и известные закрывающие DSML-маркеры; значения не переписывает.
Пустой объект аргументов допустим только если схема его принимает. Каждый вызов
проходит JSON Schema (типы, обязательные поля, вложенные структуры и ограничения);
ошибка в одном вызове отклоняет весь пакет. Дубли ключей, неизвестные инструменты,
неоднозначные оболочки, лишний текст после блока и незавершённые данные отклоняются.
Обычные цитаты в пояснении допускаются перед отдельным блоком tool_calls, если
перед его строкой открытия есть пустая строка. Цитируемые, вложенные и неоднозначные
блоки кода не выполняются; маркеры > никогда не удаляются из кода.
Обычные блоки json и цитаты не становятся вызовами. Явный tool_calls — протокол
действия, поэтому не используйте его для примеров в пояснении. Браузерные провайдеры
подчиняются правилам выше. Удалённые схемы не загружаются; локальные $ref
поддерживаются. При обновлении установите зависимости из requirements.txt
(добавлен jsonschema) и перезапустите мост.
Нормально завершённый ответ DeepSeek также может содержать один целый нативный
блок DSML (calls → invoke → parameter). Мост разбирает его локально для
любых объявленных инструментов и передаёт в ту же полную проверку схем и
tool_choice. Значения с string="true" сохраняются буквально, с string="false"
требуют корректного JSON; типы не угадываются. Неполные теги, дубли параметров,
неизвестные инструменты, лишний текст и ошибка в любом вызове отклоняют весь пакет.
Цитаты и примеры в Markdown не извлекаются в действия. По умолчанию DSML после
пояснения также не извлекается; исключение для явно выбранного формата — ниже.
XML-сущности не раскрываются, внешние ресурсы не загружаются. Для разбора не нужна
повторная генерация. Это исправляет сохранённый сбой Unsupported tool-call markup
с полным DSML-вызовом; само обновление не выдаёт упавший ответ повторно и не
возобновляет цель. Проверено офлайн по сохранённому ответу и синтетическим данным.
Для клиентов, которые не передают thinking, доступна отдельная настройка
DEEPSEEK_TOOL_THINKING=1: DeepThink включается только у DeepSeek-запросов с
инструментами. По умолчанию 0; явный thinking=false имеет приоритет. После
изменения нужен перезапуск; загруженное значение видно в локальном защищённом
/admin/budget (tool_thinking_default). Модель Expert сама по себе DeepThink
не включает. Настройка не меняет ключи истории и не разрешает повторные запросы;
улучшение корректности вызовов ею не гарантируется.
При ручном переносе после разобранного сбоя формата checkpoint(..., format_recovery=True) сохраняет полный исходный запрос в приватный архив,
передаёт инструкции и результаты действий, а последние заметки ассистента —
ссылками на архив. Повреждённая разметка не становится образцом нового ответа.
Это подготовка контекста: она не отправляет запрос, не снимает паузу и не
возобновляет цель автоматически. Проверки конфигурации и архива выполнены офлайн.
Для DeepSeek можно явно выбрать DEEPSEEK_TOOL_PROTOCOL=dsml и перезапустить
мост. Промпт использует эталонный формат V4.1: <|DSML| calls>, с одним
разделителем с каждой стороны DSML и пробелом перед именем тега
(описание DeepSeek).
В прежнем промпте разделители ошибочно удваивались. Цельные сохранённые пакеты
старого формата читаются для совместимости. При явно выбранном dsml два
цельных симметричных написания маркера распознаются на границах тегов даже в одном
пакете. Это не замена текста: аргументы сохраняются буквально, каждый параметр,
вызов и пакет обязаны закрываться. Несимметричные или неполные маркеры запрещены. Это меняет формат, который мост просит у модели: один полный нативный
пакет вместо JSON-блока; строковые команды и содержимое файлов не требуют
экранирования кавычек и переносов строк как в JSON. Полные схемы, tool_choice,
история, счётчики и запрет повторов сохраняются. Другие провайдеры и значение
по умолчанию json не меняются. Исторические вызовы с точными ID передаются как
данные, без примера второго протокола. Имена инструментов и полей должны
помещаться в атрибуты DSML (1–256 символов без кавычек, <, > и управляющих
символов); строки с DSML-маркерами передаются как JSON-строка с string="false"
и экранированными угловыми скобками. Повреждённая смесь JSON и DSML отклоняется
целиком, без потери второго вызова и без превращения ошибки в успешный текст.
Только при выбранном dsml допускается обычное текстовое предисловие перед
одним целым пакетом, начинающимся с отдельной строки без отступа. Цитаты,
Markdown-ограждения, HTML, предисловие с обратными кавычками или заканчивающееся
двоеточием остаются данными; хвост, второй пакет, неполные теги и ошибки схем
не допускаются. Предисловие не исполняется, значения параметров не переписываются.
В явно выбранном dsml при нормальном завершении также распознаются два варианта
оболочки: один пустой повтор calls непосредственно после первого открытия и
закрытие </|DSML|> вместо закрытия invoke. Второй вариант допустим только
после полного закрытия всех параметров; корень должен завершаться именованным
</|DSML| calls>. Это не восстанавливает параметры и не добавляет отсутствующие
теги. Третий корневой заголовок, вложенные пакеты, безымянное закрытие параметра
или корня, неполные значения и ошибка любой схемы отклоняют весь ответ.
По умолчанию (json) эти допуски выключены. Обработка проверена офлайн по
сохранённому потоку и общим синтетическим пакетам, без повторной генерации.
Искажённые маркеры DSML, в том числе асимметричные и с ASCII-разделителями,
распознаются как отказ формата и сохраняются в приватной диагностике, а не
выдаются как успешный текст. Они не исправляются до вызовов. Цитаты, ограждённые
и отступленные примеры остаются данными. Последний неоднозначный пакет не
восстановлен и не выполнен; обновление не повторяет генерацию.
Вариант проверен офлайн, длительная живая цель с ним ещё не подтверждена.
Оставьте TOOLCALL_FORMAT_REPAIR=0 и TOOLCALL_MAX_CONTINUATIONS=0, если повторные
генерации запрещены. Загруженный формат и эти настройки видны локально в
защищённом /admin/budget, в поле tool_contract.
Также при нормальном завершении и закрытом блоке допускается перестановка двух
последних скобок ]} → }], если строковый анализ подтверждает: аргументы уже
полностью закрыты, открыты только объект вызова и внешний массив. Никакие значения
или скобки не добавляются. Исправленный пакет заново проходит JSON Schema;
повреждённые строки, вложенные аргументы и неоднозначные окончания отклоняются.
Для завершённого ответа DeepSeek с закрытым блоком также допустимо восстановить
пропущенные } оболочек между вызовами и перед концом массива (не более 32):
только если каждый arguments уже полностью закрыт,
объект вызова содержит ровно name и arguments, а префикс и весь пакет строго
разбираются после вставки. Аргументы не дополняются и не угадываются. Весь пакет
заново проверяется по схемам; прочие повреждения и ошибки внутри аргументов
отклоняются без частичного выполнения.
Весь ответ проходит единый офлайн-контракт server/tool_protocol.py: разбор
оболочки → проверка каждого вызова по схеме → политика tool_choice и завершения →
выдача целого пакета. Транспорт и приватный регрессионный прогон используют одну
проверку. Неполные аргументы и выдуманные результаты инструментов остаются ошибками.
Это эмуляция вызовов через текст веб-чата, а не нативный tool API; офлайн-тесты
не гарантируют, что модель всегда выдаст корректный следующий ответ.
При включённой приватной диагностике сохраняются до 32 уникальных сбоев в
session/toolcall-failures/ (до 4 МиБ каждый), без автоматического удаления старых;
last-toolcall-error.json продолжает обновляться. Ответы могут содержать исходный
код: каталог приватный и исключён из Git. Для DeepSeek дополнительно сохраняются
точный ID ответа и хеш входящего запроса, без текста запроса и HTTP-заголовков.
Это метаданные для проверки привязки, а не разрешение выполнить вызовы повторно.
Если одновременно включён DEEPSEEK_STREAM_DIAGNOSTICS=1, исходный поток ответа
с ошибкой вызовов сохраняется отдельно в session/failed-tool-streams/ (до четырёх
файлов, до 8 МиБ исходного потока каждый, права 0600). Этот каталог не вытесняет
диагностику сетевых обрывов; дубли не расходуют новые места, старые файлы не
удаляются. Успешные вызовы не пишут поток на диск. Обновление не восстанавливает
ID, потерянные прежней версией, не отправляет запросы истории и не возобновляет
цель. Обезличенные общие проверки:
python -m unittest tests.test_tool_protocol tests.test_api tests.test_diagnostics.
Для локального набора с проверенными ожиданиями и SHA-256:
python -m server.offline_corpus session/protocol-corpus.json.
Этот манифест приватный, создаётся при разборе диагностик и не входит в репозиторий;
ожидания нельзя автоматически принимать за правильные по результату парсера.
Для каждого случая можно закрепить protocol: "json" | "dsml" и
implementation: "legacy" | "new"; без этих полей сохраняется прежний режим
json / legacy, независимо от .env. Используйте неизменяемые копии исходных
диагностик с SHA-256, а не перезаписываемый last-toolcall-error.json.
matched_outcomes отдельно считает принятые пакеты, обычный текст и ожидаемые
отказы. Зелёная проверка отказа доказывает остановку опасного пакета, а не
выполнение задачи. Повреждённые исходники и неизвестный режим дают провал проверки.
Когда каталог заполнен, старые доказательства не удаляются. Поле
stream_capture_status=storage_full в приватной диагностике явно отмечает,
что сырой поток не сохранён. Локальный защищённый /admin/budget показывает
stream_capture_storage с числом файлов, пределом и состоянием, без путей или
содержимого. Включённая диагностика сама по себе не означает наличие места. Вместимость можно
явно задать через DEEPSEEK_STREAM_CAPTURE_FILES (1–32, по умолчанию 4), без
удаления прежних файлов. Каждый поток по-прежнему ограничен 8 МиБ сырого текста.
Намеренная остановка после передачи восстановленного ответа возвращает обычное
сообщение с finish_reason=stop, без ошибки и без нового вызова провайдера.
Она завершает ход восстановления, а не пользовательскую цель. Старые записи
Failed в истории не переписываются. Проверено офлайн для JSON и SSE;
поведение автоматического продолжения целей в живом Harness этим не проверялось.
При следующем явном продолжении локальное уведомление не подменяет ID ответа:
мост проверяет исходную привязку и все результаты инструментов, сохраняя одноразовое
потребление ответа. Дополнительная привязка, позволяющая повторить действия, не создаётся.
Офлайн-аудит также исправил создание сессий Qwen при входе и продлении:
expires_at передаётся по имени и больше не попадает в поле привязки диалога.
Существующие файлы сессий автоматически не изменяются; реальный вход для этой
проверки не выполнялся.
Перед ответом модель получает краткий список обязательных полей из схем и указание
на обязательный успешный read того же file_path перед edit в Harness.
Просмотр через bash (cat, grep, git diff и т. п.) не засчитывается.
Зависимый edit отправляется только после результата read, отдельным ответом;
уже выполненное подходящее чтение без необходимости не повторяется. Проверка
самого Harness остаётся включённой; обход через другую команду записи запрещён.
При установленном требовании остановки на ошибке автоматический повтор не разрешается.
Контракт проверен офлайн и одним реальным продолжением Harness: read README →
успешный результат → отдельный edit → штатный Completed, без ошибок инструментов.
Это не гарантия полного соблюдения плана: в том же ходе модель лишний раз повторила
уже пройденный тестовый прогон вопреки указанию не повторять неизменённые проверки.
Для этого случая добавлен контракт повторного использования проверок: успешный
результат сохраняет силу, пока не изменились проверяемый код, тесты, зависимости,
конфигурация или окружение и не появился конкретный новый вопрос либо явный запрос
на свежий прогон. Правка только текста README, новый ход или «финальная проверка»
сами по себе не разрешают повтор. Повтор нельзя прятать в команде с git diff
или git status; при обоснованном повторе причина указывается в описании команды.
Старые результаты явно обозначаются как прежние; пропуски не считаются прохождением.
Контракт проверен офлайн и в одном реальном ходе: модель использовала прежние
результаты, не запускала тесты и перешла к чтению существующих CI-результатов.
Это инструкция модели, не семантическая блокировка повторных тестов.
Для остановки на ошибках shell установите локальный плагин Harness:
python -m integrations.harness_shell_safety --profile desktopПерезапустите Harness после установки. Команда /bridge-shell-status проверяет активный исполнитель локально, без генерации. Обязательного runtime-gate нет: если установленная копия плагина в <DSH_HOME>/plugins/opencode-local-bridge/ удалена или повреждена, Harness только запишет ошибку в журнал и продолжит работу без защиты. Проверяйте /bridge-shell-status после каждого запуска Harness, прежде чем возобновлять цель. Плагин добавляет set -e -o pipefail
к Bash-командам: успешный tail больше не скрывает ошибку предыдущей части
конвейера. По ненулевому результату foreground-команды, тайм-ауту или ошибке
инструмента текущий ход останавливается штатным Stop, без запроса к модели для
повтора или диагностики. История, завершённые действия и счётчики сохраняются.
if, !, && и || сохраняют обычную семантику Bash: явно обработанный
ненулевой статус не обязательно означает сбой всей команды.
Если пользователь разрешил самостоятельное исправление локальных тестов,
запускайте bridge_unittest /путь/к/venv/bin/python -v tests.test_module отдельной
командой. Это явный режим для unittest: завершённые assertion failures возвращаются
как status: tests_failed с исходным отчётом и кодом дочернего процесса. Код оболочки
0 означает доставку результата, не прохождение тестов. Модель может исправить
код и повторить затронутые проверки после изменения; уже прошедшие проверки без
новой причины не повторяются. Ошибки загрузки, исключения в тестах, обрыв и отсутствие
подтверждения завершения остаются ошибками и останавливают цель. Обычный
python -m unittest, прочие shell-команды и политика API-повторов не меняются.
Полностью пропущенный набор помечается tests_skipped, а не успешным прогоном.
Помощник не делает тесты офлайн: для проверки без сети нужен отдельный sandbox.
Проверено офлайн на assertions, ошибках загрузки, исключениях и преждевременном выходе.
Для самостоятельного исправления подтверждённого отказа до записи включите:
python -m integrations.harness_shell_safety --profile desktop --allow-read-repairПосле перезапуска /bridge-shell-status должен показать FS_NOT_OBSERVED read repair enabled.
Только нативный FsError / FS_NOT_OBSERVED от edit/write возвращается модели
для исправления порядка действий. Проверка Harness остаётся: без настоящего read
запись повторно отклоняется. Ошибка сохраняется в истории, аргументы не дополняются,
инструменты за модель не выполняются. Другие ошибки и неизвестный исход останавливают
цель. Режим по умолчанию выключен; --stop-on-read-error возвращает остановку,
обычная переустановка сохраняет выбор. Проверки выполнены офлайн в установленном
Harness с локальным сервером и отдельным тестовым профилем.
Обычный gh pr checks (включая --required/--repo) читает статусы одним запросом и возвращает JSON: подтверждённые красные и ожидающие проверки не останавливают цель. При валидной схеме и пустом stderr код 0 означает успешное получение JSON, даже если проверки ещё pending или уже fail: их статусы сохраняются в ответе. Ненулевые коды 1/8 нормализуются только при согласованном статусе проверок. Ошибки сети/авторизации, повреждённый ответ и сбои остальных частей конвейера останавливают ход. Режимы --watch, --web и пользовательское форматирование сохраняют исходную семантику gh. Требуется python3 в PATH; /bridge-shell-status должен показывать harness-contract-v5. Случай pending с кодом 0, остановивший чтение проверок PR №80, исправлен и проверен офлайн по сохранённому JSON и на shell-конвейере; повторного запроса CI для проверки фикса не было. Это не означает, что сами CI-проверки прошли.
При проверке наличия исправления в ветке, поиске необязательных маркеров или раздела отсутствие совпадений является результатом исследования, даже если заранее неизвестно, найдётся ли совпадение. Контракт модели требует выбирать bridge_grep_optional для такого поиска; обычный grep остаётся для обязательных утверждений. Для нескольких маркеров используйте -E 'marker_a|marker_b'. Ошибка источника (git show и др.) по-прежнему останавливает конвейер. Это правило выбора в подсказке, а не гарантия поведения модели; shell-защита не переопределяет обычный grep.
Для поиска, где отсутствие совпадений допустимо, используйте функцию
bridge_grep_optional вместо grep: она меняет на успех только код 1 самого
поиска. Код 2 (ошибка шаблона/чтения) и отказ предыдущей команды сохраняются.
Тихий режим (-q/--quiet/--silent) отклоняется с кодом 2: при совпадении
grep вернул бы 0, даже если другой вход не прочитался. Используйте вывод -c
или -n. Ранний выход (-m, -l) после большого источника даёт ему код 141
(SIGPIPE) — это сообщаемый сбой, его не нормализуют. Функция требует Bash
(оба исполнителя Harness запускают bash -c); другой шелл останавливается с кодом 2.
Обычный grep не переопределяется — обязательные проверки наличия совпадения
продолжают падать. Не добавляйте || true ко всему конвейеру. Для ограничения
вывода используйте sed -n '1,40p', который дочитывает поток, вместо head.
Офлайн проверены пустой поиск, совпадение, неверный шаблон, недоступный файл,
ошибки источника с кодами 1/17 и продолжение/остановка в настоящем Harness.
Плагин не анализирует текст вывода и не обещает перехватывать ошибки запущенных в фоне процессов.
Для gh задаётся XDG_CACHE_HOME в отдельном временном каталоге с правами 0700;
авторизация и права песочницы не меняются. Старый кэш не удаляется. Новый кэш
остаётся до очистки временных файлов ОС. Проверено офлайн в установленном Harness:
ошибка конвейера прекращает оставшуюся команду и следующий вызов в пакете,
второго запроса к модели нет; запись в кэш проходит.
В последующей реальной проверке gh run view --log-failed успешно прочитал CI-лог.
Следующий конвейер gh api | grep | head вернул код 1; Harness автоматически
показал Stopped и не отправил третью генерацию. Исходный поток до фильтра не
сохранён, поэтому причина этого кода по результату инструмента не установлена.
grep без совпадений также возвращает 1: ожидаемый случай нужно явно обработать
в самой команде, а не отключать защиту глобально. История и прежний учёт расхода
сохранились; добавились только две генерации и два HTTP-запроса.
После фикса необязательного поиска следующий реальный ход завершился без
новых ошибок: пять вызовов инструментов прочитали сохранённый CI-лог и локальные
исходники, без повторного скачивания и тестовых прогонов. Старый шаблон grep
на сохранённом логе нашёл совпадение; это не доказывает причину прежнего статуса
конвейера gh api. Сам CI-отчёт содержит новый относительно baseline отказ теста,
но не его assertion traceback; исправление поиска не означает исправления CI.
При разборе отдельного PowerShell-сбоя в тестовом проекте артефакт pytest
подтвердил TimeoutExpired процесса через 10 секунд, а не ошибку assertion.
После установки PowerShell 7.6.6 его тестовая фикстура разделяет ограниченный
запуск (30 с) и выполнение проекции (10 с), без повторов и изменения baseline.
Узкие проверки пройдены локально, включая воспроизведение задержки старта;
это не подтверждение исправленного CI или нативной Windows-приёмки.
В следующем ходе обнаружена отдельная граница протокола: модель вернула
блок calls как текст. Harness показал Completed, но инструмент не исполнился.
Теперь законченный верхнеуровневый calls разбирается как вариант tool_calls
только для нормально завершённого ответа DeepSeek и с полной проверкой схемы.
Аргументы не угадываются; повреждённый JSON, несколько блоков, цитируемый или
вложенный код не исполняются. Неверный блок больше не считается успешным текстовым
ответом. Офлайн проверены границы парсера и реальное исполнение в Harness с
подставным провайдером. Однократное восстановление уже доставленного текста
сохраняет ID ответа, историю и расход: новую генерацию не отправляет, счётчик
ответов диалога не увеличивает, после инструмента возвращает локальную остановку.
Реальное восстановление этого случая проверено: один сохранённый bash
выполнен успешно, затем Harness получил локальную остановку. Новых генераций
DeepSeek не было; файл бюджетов не изменился, прежние привязки истории сохранены,
новая привязка использует тот же ID ответа и прежний счётчик диалога.
Модель также получает указание
не объединять запись с зависящей от неё проверкой. Это подсказка, не гарантия:
если модель пропустит file_path или другое обязательное поле, пакет будет отклонён.
Мост не выводит путь из содержимого или соседней команды и не запускает повтор
автоматически.
Промпт отделяет прошлую переписку от следующего ответа ассистента и запрещает
модели сочинять результаты инструментов. Только Harness возвращает настоящий
результат выполнения. Текст вроде Tool (...): после блока вызовов не обрезается:
весь пакет отклоняется без выполнения. Эта подсказка снижает риск, но не гарантирует
соблюдение формата моделью.
Проверено офлайн на сохранённых ответах, без новой генерации. Фикс не возобновляет остановленную цель, не переигрывает старый ответ и не сбрасывает историю или счётчики.
| Сообщение / симптом | Что проверить |
|---|---|
Local request budget exhausted |
Локальные бюджеты, предел ответов одного диалога или размер промпта. Новый чат и перезапуск не обнуляют скользящий расход |
MISSING_CREDENTIAL для deepseek-official |
Выбран официальный API, которому нужен ключ. Для моста выберите модель из Local account bridge |
login_required |
Сохранённая сессия истекла; выполните вход для нужного провайдера |
History is unknown / History already consumed |
В первом случае локальная привязка не найдена, во втором она найдена, но уже использована. Перевход и сброс бюджетов этого не исправляют. После обновления Harness используйте проверенную локальную совместимость схем ниже; использованные ссылки она не открывает |
quota_exceeded, user is muted, защитный отказ |
Остановитесь и проверьте обычный сайт; не повторяйте запросы автоматически |
| Нет группы или модели | Проверьте .env, работающий мост и /v1/models, затем повторите установку каталога |
В headless нет интерактивного канала подтверждений: запрос повышения
sandbox_permissions может остановиться до запуска команды. Разрешения
сохраняются в самой сессии Harness; смена DSH_PERMISSION_MODE при запуске не
переключает уже сохранённый режим. Используйте штатную настройку разрешений
выбранной сессии, не подменяйте результат инструмента и не ослабляйте ограничения
файлов или сети. Это локальное состояние Harness, не отказ сессии DeepSeek.
Для длительной цели используйте штатное «Продолжить цель» в Harness.
Обычное сообщение «продолжай» не активирует сохранённую цель. В проверенной
версии 0.2.1-rc.2 однократный --profile headless может завершить процесс
с кодом 0 после первого хода, даже когда следующий раунд уже начинается.
Код 0 такого запуска не доказывает завершение цели: проверяйте её состояние
и результаты. Офлайн-драйвер проверки дождался штатного состояния complete;
он не установлен как автоматический обход в пользовательские профили.
После обновления Harness с 0.2.0-rc.2 до 0.2.1-rc.2 каталог вырос с 27 до 32 инструментов; изменились и начальные системные инструкции. Оба поля входят в ключ истории. Для проверенной пары версий доступна явная локальная регистрация:
python -m server.conversation_schemas --model deepseek-expert --catalogs /private/path/catalogs.jsonПриватный JSON должен содержать old и current — точные массивы инструментов
OpenAI (type: function, function: {name, description, parameters}) из сохранённых
заголовков запросов. Если изменилась первая системная инструкция, дополнительно
нужны обе точные строки old_system и current_system. Не восстанавливайте их
по памяти и не публикуйте файл: описания и инструкции могут содержать локальные пути.
Команда читает только локальную сессию DeepSeek и привязывает переход к её аккаунту
и выбранной модели; вход и запросы к провайдеру не выполняются.
Мост проверяет полную прежнюю историю и результаты инструментов, затем занимает
исходную одноразовую ссылку. Дополнительный билет на повтор не создаётся.
В этот запрос включаются полные текущие схемы, а при изменении первой системной
инструкции — её новая точная строка. Компактный режим и none не могут скрыть
обновление контракта от провайдера. Следующий ответ привязывается к новому контракту;
при обычном продолжении прежние сообщения заново не отправляются.
Новые ответы проверяются по текущим схемам; неизвестные изменения, неоднозначные
родители, использованные ссылки и ранее начатые переносы остаются закрытыми.
Смена схем не обнуляет лимит диалога, бюджеты или журнал переноса и не возобновляет
цель автоматически. Проверено офлайн, включая сохранённую большую историю:
привязка к старой записи восстановлена, но её занятое состояние сохранено.
Успешное продолжение через аккаунт после этого изменения не проверялось.
По умолчанию DeepSeek: 12/60 генераций, 3/6 новых чатов, 40/200 HTTP-запросов
за час/сутки, общий лимит 20 принятых ответов в одном диалоге
(CONVERSATION_MAX_REPLIES). Интервал — 30 секунд. Бюджеты DEEPSEEK_MAX_* и
CONVERSATION_MAX_REPLIES задаются в окружении процесса; увеличение локального
потолка не увеличивает квоту сайта. PROVIDER_ACCESS_PAUSE=0 отключает именно
durable pause и pending-блокировки провайдера (включая сохранённые ранее), но не
лимиты, квоты провайдера и защиту истории диалога; риск повтора после неопределённой
ошибки остаётся. Настройка и разбор ошибок.
Сервер и аккаунт настраиваются теми же шагами выше. Поместите
пример opencode.json в папку проекта. Если конфиг
уже есть, объедините настройки, сохранив свои provider, model и small_model.
Задавайте small_model явно: заголовки тоже могут расходовать сообщения.
Не направляйте title/small_model на браузерную модель — иначе откроется
второй чат во вкладке (Harness отключает session-title-llm в профиле).
cd /path/to/your-project
opencode --agent plan --model local-qwen/qwen3.8-omni-flashДля DeepSeek используйте local-deepseek/deepseek-chat или
local-deepseek/deepseek-expert. Адрес API — http://127.0.0.1:8000/v1,
apiKey — токен API моста, например "{file:/абсолютный/путь/session/api-token}"
(Токен доступа к API). Это не ключ аккаунта провайдера.
Агенты и плагин инструментов.
Сводка реализации и исторических проверок на 11 октября 2026. Проверка конкретного аккаунта не гарантирует доступность сейчас или безотказность длинной автономной цели. Подробные результаты сохранены в документации провайдеров.
| Провайдер / ID модели | Браузер во время запросов | Статус |
|---|---|---|
DeepSeek · deepseek-chat, deepseek-expert |
Не нужен; первоначальный вход ручной | Безбраузерный HTTP; небольшие задачи Harness проходили; были повторные ограничения аккаунта. Автопродления нет |
Qwen · HTTP via QWEN_MODELS / qwen-web |
HTTP: не нужен после входа; qwen-web: связанная вкладка |
HTTP Flash/Max и браузерный адаптер проверены; у Max наблюдался дневной лимит. qwen3.7-plus в каталоге без отдельной живой проверки. Сессия |
Kimi · kimi-instant |
Не нужен после сохранения сессии | Экспериментальный HTTP: ответ, обновление токенов и Harness read проверены |
Kimi · kimi-k3, kimi-k2.8 |
Не нужен после сохранения сессии | HTTP реализован, сквозная проверка не завершена: K3 отказал по нагрузке бесплатного доступа, K2.8 после отказа не запускали. Подробности |
Kimi · kimi-web |
Нужна связанная вкладка | Браузерный адаптер проверен; длинная вставка (~4KB+, system+tools) на сайте уходит в TXT-вложение — подтверждено. См. browser/README.md и .env.example |
GLM · glm-web |
Нужна связанная вкладка | Браузерный адаптер проверен; безбраузерный доступ к этой модели не завершён. Ограничения |
Mistral · mistral-web |
Нужна связанная вкладка | Браузерный адаптер проверен — см. browser/README.md |
Grok · grok-web |
Нужна связанная вкладка | Браузерный адаптер проверен — см. browser/README.md |
ChatGPT · chatgpt-web |
Нужна связанная вкладка | Браузерный адаптер проверен — см. browser/README.md |
Claude · claude-web |
Нужна связанная вкладка | Браузерный адаптер проверен (ProseMirror + /api/*) — см. browser/README.md |
Gemini · gemini-web / Antigravity CLI |
gemini-web: связанная вкладка; CLI: agy |
Браузерный адаптер проверен. CLI в нашей проверке отклонялся по региону |
Все подключения выключены после чистой установки. Веб-версии, квоты и доступность могут меняться. Китайские модели тоже имеют ограничения; точный размер дневной квоты Qwen Max и время её сброса не установлены.
Инструменты выполняет Harness или OpenCode на вашем компьютере. Промпты и
прочитанные инструментами данные уходят выбранному провайдеру. Мост проверяет
ответы и tool_calls, сохраняет диалог и отправляет новые результаты инструментов
в существующий чат. Формат ключей истории сохранён совместимым с прежним main:
обновление не требует очистки базы, перевхода или сброса счётчиков. system,
обёртки <system-reminder> и комментарии assistant проверяются точно; для
изменённых инструкций или схем Harness нужна
явная локальная регистрация совместимости.
Неизвестная или уже израсходованная история останавливается, а не создаёт новый чат.
Паузы при отказах сохраняются после перезапуска. Настройка клиента, обычный вход
и сброс локального бюджета сами по себе их не снимают. Перенос через Safari
также сохраняет всю паузу, незавершённый запрос и счётчики. Свежий токен не
подтверждает снятия ограничений аккаунта. Статус пауз:
python -m providers.access status. Правила возобновления.
API по умолчанию слушает 127.0.0.1 (только локально) и требует токен API
моста. Для HOST вне loopback нужны API_ALLOW_PUBLIC_BIND=1,
API_ALLOWED_HOSTS и межсетевой экран; без них API не открывайте. Сессии в session/ и .env исключены из Git.
Не публикуйте их, персональные Userscripts или токен управления бюджетом.
Поддерживается текст и эмуляция вызовов инструментов; изображения, аудио и видео
не загружаются, даже если модель называется Omni.
Известные ограничения: observer браузерного моста работает в странице провайдера,
поэтому скрипты, уже выполняющиеся в этом origin, могут подделать его события
ответа; мост привязывает задание к вкладке, а не к аутентифицированному
источнику ответа. Потоки DeepSeek/Qwen останавливаются после 300 секунд всего
или 15 секунд без байтов; такая остановка ставит паузу провайдера и не
повторяется. Первый запрос (ещё без ответа ассистента) не имеет ссылки истории,
поэтому его повторная отправка может открыть второй чат; продолжения одноразовые.
Чтобы при запуске удалять уже использованные ссылки кэша, задайте
CONVERSATION_CLEAR_USED_ON_STARTUP=1 в окружении процесса моста; по умолчанию
0 ничего не удаляет. Это позволяет создать новый чат с повторённым первым
сообщением, но при неодинаковых upstream-чатах с одинаковой историей продолжение
может привязаться к неверному чату и завершиться ошибкой. Ссылки used=0 не удаляются.
Исторические кадры OpenCode 1.18.34: чтение небольшого контрольного файла. Это не интерфейс Harness и не проверка текущей доступности аккаунтов.
| Qwen Flash | Qwen Max |
|---|---|
![]() |
![]() |
Кадры GLM/Kimi и методика записи.
Повторный начальный запрос с точно такой же историей имеет тот же ключ кэша.
У ассистентского сообщения с tool_calls ключ привязан к самим вызовам (ID, имя,
аргументы) и предыдущей истории, а не к тексту вокруг вызовов: клиент может собрать
стрим-текст иначе (без \n\n или вовсе без текста). Это не ослабляет привязку —
ID вызовов уникальны.
Пока связь сохранена, мост не открывает для этой истории новый чат: он может
переиспользовать ещё не использованную связь или отклонить повтор уже использованной.
По умолчанию использованные/закрытые связи сохраняются, чтобы не привязать повтор
к другому чату.
При CONVERSATION_CLEAR_USED_ON_STARTUP=1 при старте удаляются только
использованные связи (used=1), поэтому такой повтор может создать новый upstream-чат,
а последующее продолжение может ошибочно привязаться к другому чату.
Полная ручная очистка: python -m server.conversation_admin -clear удаляет все
записи links, связанные с ними пути логов (trace_links) и записи миграций
(rollovers) из session/deepseek-conversations.sqlite3. Файлы логов и чаты у
провайдера не удаляются. Команда разрушительная.
- Harness: подключение, сессии, бюджеты, офлайн-проверка
- Полная установка, OpenCode, API и автозапуск
- Kimi HTTP · GLM · Safari Userscripts
- Безопасность аккаунтов · Примеры API
- Терминальный чат DeepSeek
CI проверяет Python 3.9/3.12, PoW WASM, shell/JavaScript и изолированные браузерные
сценарии. Локально: python -m unittest discover -s tests -t . -v. Прогон герметичен:
.env и экспортированные флаги провайдеров игнорируются, поэтому результат совпадает
с CI. Вне тестов тот же режим включает BRIDGE_SKIP_DOTENV=1.
Сценарии настоящего Harness CLI с подменённым провайдером.
DOM-fallback отключён: старый видимый ответ не может завершить новый запрос. Claude требует terminal marker сетевого потока; обрезанный по лимиту, частичный или повреждённый ответ не выдаётся как завершённый. При неопределённом исходе отправки остаются pending и защитная пауза, в том числе после перезапуска. Автоповтора нет. Исправления проверены офлайн; живые аккаунты не использовались. Для применения браузерных изменений заново экспортируйте и обновите userscripts (controller 0.3.35).
Mistral принимает только привязанный к запросу поток с конечным trailer.
Режим Harness --without-browser исключает браузерные модели и их алиасы.
Браузерный контроллер ждёт завершения вставки текста, сохраняет изменения
пользователя и продолжает только явно привязанный диалог. Эти сценарии проверены
в 28 изолированных браузерных фикстурах без аккаунтов.
GET /v1/models показывает короткие имена и алиасы провайдер/модель: например,
qwen3.8-max и qwen/qwen3.8-max, deepseek-chat и deepseek/deepseek-chat.
Оба варианта принимаются API; установщик Harness показывает один пункт на пару,
предпочитая короткий ID. Если каталог содержит только алиас, он сохраняется.
Префикс должен соответствовать
провайдеру; он не включает отключённую модель. Алиасы DeepSeek используют одну
привязку истории и один учёт продолжения: смена написания не создаёт новый чат
и не сбрасывает защиту от повторов. Проверено офлайн; это не проверка доступа
к моделям аккаунта.
Перед запросом к любому провайдеру мост проверяет историю tool calls: каждому
вызову нужен ровно один результат с тем же ID; потерянные, повторные и чужие
результаты отклоняются локально. Результаты параллельного пакета могут приходить
в другом порядке. Проверка действует и при явном conversation_id; она не
дописывает аргументы и не повторяет выполненные действия.
Локальная shell-защита Harness снимает разрешение на автопродолжение цели
до отмены хода при ошибке инструмента. Фаза и ревизия цели сохраняются;
возобновление требует отдельного действия пользователя. Установка защиты:
python -m integrations.harness_shell_safety --profile desktop, затем перезапуск
Harness. /bridge-shell-status проверяет shell-настройки без отправки запроса;
актуальная версия показывает harness-contract-v5 и goal disarm before native stop.
Переустановка моделей сохраняет эту защиту.
Проверено офлайн на фикстурах контракта Harness 0.2.0-rc.2: SSE, точные ID вызовов, продолжение существующего диалога и отказ от повторного шага без изменения счётчиков. Это не живая проверка аккаунта и не гарантия завершения произвольной цели.
Выбор DeepSeek Expert · web меняет маршрут, но не создаёт веб-диалог для
старой API-истории. History is unknown после такой смены требует явного переноса,
а не сброса бюджета или повторного запуска цели.
Локальная команда python -m server.history_import --request REQUEST.json --archive-root PRIVATE_ARCHIVE_DIR --source-provider deepseek-official разрешает
один точный запрос на 10 минут. Перед этим сохраните и проверьте фактический
запрос остановленного клиента; возобновление цели может изменить его, и разрешение
для старого запроса тогда не подойдёт. Каталог архива должен быть приватным,
исключённым из Git и доступным инструменту read текущей рабочей папки Harness.
Команда работает офлайн: сохраняет полный запрос и индекс всех наблюдавшихся
результатов. Только при последующей отправке того же запроса мост создаёт новый
веб-диалог и связывает ответ с исходной историей Harness. Старые связи, общие
счётчики и паузы сохраняются. Разрешение привязано к аккаунту, модели, истории,
схемам и параметрам; расходуется до отправки и не восстанавливается при ошибке
или перезапуске. Автоисправление формата и продолжение обрезанного ответа выключены.
Точное повторение импортированного вызова отклоняет весь новый пакет. Исключение —
get_goal: после возобновления он читает текущее состояние цели. Изменения цели
и остальные вызовы сохраняют защиту от повторов; отклонённый ответ сохраняется
приватно при включённой диагностике.
Проверено офлайн, включая полную сохранённую историю: 181 сообщение, все 91
результат, пакет 72,6 КБ. В одной живой пробе 24 октября создан один веб-диалог
и получен один ответ; инструменты не исполнялись из-за ложного запрета get_goal.
Причина исправлена офлайн: 145 тестов и проверка сохранённого ответа прошли.
Затем ответ №2 восстановлен после точного совпадения промпта и ответа с историей
провайдера. Harness один раз успешно выполнил bash и get_goal; следующий
модельный шаг остановлен локально. Для поиска привязки понадобились два чтения,
новых генераций и обращений к платному API не было. История и общие счётчики
сохранены, новая связь продолжения проверена офлайн. Проверен один восстановленный
шаг; это не подтверждение надёжности длительной автономной работы.
Последующие живые пробы выявили хвостовые дубли закрывающих тегов параметров DSML
в ответах №4 и №6. Полные исходные потоки сохранены; каждый сбой остановил Harness
до исполнения инструментов. История и накопленный расход сохранены.
Для этого случая добавлен структурный разбор: хвостовая серия повторов
закрывающего тега последнего, уже полностью прочитанного параметра допустима перед
именованным закрытием invoke. В этой позиции разрешены оба уже поддерживаемых
маркера |DSML| и ||DSML||, в том числе вперемешку. Другие написания не
добавляются. Значения не исправляются; схемы и весь пакет
проверяются до выдачи вызовов. Повторы в других местах, отсутствующие теги и
неполные ответы отклоняются. Разбор серии не ограничен одним дублем: число повторов
не меняет значения аргументов. Проверено офлайн: 135 тестов и оба точных сохранённых
ответа. Ответ №4 восстановлен без генерации: Harness успешно выполнил bash и read
по одному разу. Затем №6 восстановлен без генерации: один bash успешно выполнен
однократно; все 478 прежних связей и счётчики сохранены. Восстановление прошло
8 офлайн-проверок, новая связь продолжила счётчик принятых ответов с трёх.
Единственный следующий запрос получил №8 со смешанными повторными закрытиями
</||DSML|| parameter> и </|DSML| parameter>. Прежнее требование идентичности
отклонило весь пакет до исполнения. Этот конфликт устранён: допуск использует
те же два маркера, что и обычная граница параметра. Проверено офлайн: 137 тестов,
точный полный поток №8, неизменность аргументов read и get_goal, проверка схем
и запрет повторов. №8 восстановлен без генерации: read и get_goal успешно
выполнены однократно, 479 старых связей сохранены. Следующие два веб-ответа
разобраны успешно: bash выполнен, а пакет edit остановлен локальной защитой
Harness «файл не прочитан» после перезапуска приложения. Записей в файлы не было;
второй edit отменён до запуска, повторных генераций нет. Цель неактивна.
Длительная автономная работа пока не подтверждена.
После обновления локального shell-плагина (harness-contract-v6) Harness добавляет
служебный контекст с новым идентификатором среды при перезапуске. Он автоматически
напоминает модели перечитать нужный файл через настоящий read перед edit или
заменой существующего файла. Успешный результат чтения должен прийти в отдельном
шаге; прежняя история и bash/cat его не заменяют. Это уведомление, а не поддельная
отметка чтения: если модель его проигнорирует, нативная защита всё равно отклонит
правку. Проверки версии файла, схем и запрет повторного исполнения сохранены.
Контекст добавляется штатным новым событием, без переписывания старых сообщений,
системного промпта или сброса счётчиков. Офлайн на Harness 0.2.1-rc.3 проверены
перезапуск → read → edit, отказ без свежего чтения и отказ при изменении файла
после чтения. Установить: python -m integrations.harness_shell_safety --profile desktop,
затем перезапустить Harness; /bridge-shell-status покажет runtime read reminder active.
Живая проверка через веб-мост: три последовательных шага — два успешных read,
затем отдельные успешные правки REPORT.ru.md и PROGRESS.md. Ошибок не было,
предыдущие команды и тесты не повторялись. После трёх шагов контрольный ограничитель
штатно остановил цель; это не проверка завершения всего проекта. Платный API
не использовался. Офлайн-набор интеграции, привязки истории и защиты: 48 тестов.
Следующее продолжение без контрольного ограничения дошло до штатного итогового
ответа: четыре веб-шага, bash, get_goal, update_goal, без ошибок и повторов.
Harness записал turn/end: completed и завершение цели; сохранены 485 прежних
связей истории и все 62 прежних события расхода. Результат подтверждён только для
ограниченной задачи OWNER-NOTIFY-01: финальный ответ прямо исключает полный
релиз и все планы продукта. Статус цели complete сам по себе не доказывает
выполнение её более широкой формулировки или стабильность долгой автономной работы.
Подробности и границы: Harness.
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.
DEEPSEEK_CONTEXT_ROLLOVER=1 включает перенос в новый диалог DeepSeek внутри
той же цели Harness. Требуется перезапуск моста. Только подтверждённый отказ
context_length_exceeded с пустым очищенным ответом разрешает один перенос.
Полная история сохраняется приватно в session/context-checkpoints/; модель
получает исходные инструкции, реестр выполненных вызовов и выдержки результатов.
Недостающие сведения доступны через read архива. Это не семантическое резюме.
История Harness, расход и счётчик подтверждённых ответов сохраняются.
При новой ошибке — остановка без повторов; старые паузы сами не снимаются.
По умолчанию выключено. Проверено офлайн, без запросов к аккаунтам.
Условия и ограничения.
MIT · неофициальный проект. Основан на Tsuev/opencode-deepseek и sums001/Deepseek-API. Используйте аккаунты в рамках условий сервисов. Лицензия.
Браузерные адаптеры (userscripts, протокол вкладки, провайдеры ChatGPT / Claude / Gemini / Qwen / Kimi / GLM / Mistral / Grok и связанные проверки) переработаны в форке SimolSem/opencode-deepseek и оттуда приходят сюда pull request'ами.
Старые ветки для апстрима не означают недостающие функции: изменения
feat/browser-providers сверены с main; функциональных потерь не найдено.
Таблица соответствия и отличия документации.
Офлайн-тест установщика бюджета проверяет реальный импорт каталога моделей
в изолированной копии и показывает исходную ошибку дочернего процесса.
При DEEPSEEK_CONTEXT_ROLLOVER=1 перенос работает также при локальном
CONVERSATION_MAX_REPLIES (в рабочей конфигурации — 200 ответов). До следующего
запроса мост сохраняет полную историю в приватный checkpoint и передаёт в новый
диалог инструкции, список выполненных действий и последние заметки. Старый диалог
больше не вызывается. Счётчик ответов начинается с 1 только у нового диалога;
общие бюджеты, старая история и привязка цели Harness сохраняются. Выполненные
действия перечислены как результаты, а не команды для повторного исполнения.
Неполный/слишком большой контекст, недоступный архив или новый отказ останавливают
перенос без автоматической повторной генерации. При выключенной настройке
сохраняется ручная остановка. Изменение проверено офлайн, без новых запросов
к аккаунтам; перенос выполняется при следующем запросе Harness, не сам по таймеру.
Большие истории больше не упираются в отдельный потолок 32 КиБ инструкций.
Размер пакета рассчитывается вместе со схемами инструментов в прежнем лимите
131072 байта. Все инструкции сохраняют роль, порядок и точный текст; только
полностью одинаковые инструкции хранятся в словаре один раз с индексами порядка.
Если выдержки результатов не помещаются, пакет содержит индекс каждого
выполненного вызова/результата и последних отчётов. Полная история и аргументы
остаются в приватном, форматированном JSON-архиве (0600), без обрезания.
В этом режиме нужен доступный инструмент read: агент должен прочитать архивный
контекст перед выбором дальнейших действий, а не повторять команды ради результата.
Если архив недоступен либо точные инструкции с индексом всё равно не помещаются,
перенос останавливается. Это не обещание вместить бесконечную историю в контекст
модели. Проверено офлайн на сохранённой истории: 488 сообщений, 67 инструкций,
218 результатов; полный API-путь с заглушкой выполнил один запрос в новый диалог.
Реальный запрос аккаунту для этой проверки не отправлялся.
Мост различает отказ токена (40002/40003), временный запрет отправки
(account_muted), бан (account_banned), ограничение IP (ip_restricted),
проверку шлюза (gateway_challenge) и отказ PoW (pow_rejected). Код 5
интерпретируется как muted в контексте completion; числовые пространства
других операций не смешиваются. Ни одна из этих ошибок не запускает повтор.
При отказе минимальная приватная диагностика сохраняется автоматически в
session/refusal-diagnostics/: время, фаза, HTTP-статус, исходные числовые
коды API/biz, категория шлюза и локальный ID попытки, когда доступен.
Токены, cookies, заголовки, тексты ответов и промпты туда не записываются.
Каталог приватный, файлы 0600; максимум 64 файла, старые записи не удаляются.
Если каталог заполнен или запись невозможна, появляется предупреждение,
но защитная остановка остаётся. Каталог не публикуйте.
Классификация и сохранение паузы проверены офлайн на синтетических ответах. Это не проверка доступности аккаунта и не гарантия отсутствия блокировок.

