| name | add-opponent |
| description | Приём процессуальных документов от оппонента (ответчика, истца, третьего лица, суда от имени другой стороны). Используй этот скилл, когда юрист говорит «пришёл отзыв от ответчика», «ответчик представил документы», «получили от оппонента», «от истца поступило», «суд прислал документы от другой стороны», «разбери документы ответчика/истца». НЕ используй для документов клиента (это `intake` или `add-evidence`).
|
add-opponent — Приём документов оппонента
Скилл работает по контракту plan → review → (revise) → apply → verify → (анализ Opus). Файловую часть оркестрирует main-Sonnet. Механическая классификация новых файлов и черновые подсказки по именам/типам делегируются Haiku-subagent по контракту 3.3A из shared/subagent-dispatch.md. После apply аналитика по доводам оппонента по-прежнему может идти отдельным Opus-проходом.
Предусловия
- Дело инициализировано:
.vassal/case.yaml существует, в нём определены стороны.
- Папка
Входящие документы/ существует и в ней хотя бы один файл.
- Зависимости установлены (
setup.sh).
- Доступен
Task с model: "haiku" для файловой маршрутизации по контракту 3.3.
Переменные сессии
plan_timestamp = ГГГГ-ММ-ДД-ЧЧмм
batch_name = opponent-ГГГГ-ММ-ДД
plan_path = .vassal/plans/add-opponent-<plan_timestamp>.md
work_dir = .vassal/work/add-opponent-<plan_timestamp>/
next_id_hint = next_id из .vassal/index.yaml
opponent_hint = краткий список сторон-оппонентов из case.yaml
Создай пустые .vassal/plans/ и .vassal/work/, если их нет.
Фаза 1 — Plan (main-Sonnet + Haiku-subagent)
- Прочитай
.vassal/case.yaml, .vassal/index.yaml и список файлов в Входящие документы/.
- Подготовь
{{work_dir}}, выполнив скрипт:
python3 "$PLUGIN_ROOT/scripts/prepare_intake_workdir.py" "$INCOMING_DIR" --work-dir "$WORK_DIR"
Распарси JSON: поля files[] (каждый элемент: source_path, extracted_text_preview, needs_image_to_pdf, archive_src), archives_unpacked, unsupported. Если unsupported[] не пуст — сообщи Сюзерену о неподдерживаемых или проблемных архивах. Передай список files[] в Haiku-subagent для планирования.
- Вызови Haiku-subagent по контракту 3.3A:
- передай
case_root, work_dir, opponent_hint, список files[] из JSON скрипта (поля source_path и extracted_text_preview);
- запроси YAML
file/new_name/doc_type;
Task: subagent_type: "general-purpose", model: "haiku", description 3-5 слов.
- Main-Sonnet по результату Haiku сам:
- определяет сторону-оппонента;
- выбирает головной документ и приложения;
- строит имя процессуальной папки;
- назначает
doc-ID и bundle-поля;
- помечает дубликаты как
already_processed, если они уже есть в индексах opponent-*.
- Запиши полный markdown-план в
{{plan_path}}. В нём должны быть явно видны OPPONENT_PARTY, тип головного документа, список приложений, новые и пропущенные файлы.
- Если Haiku вернул невалидный YAML — один retry, затем блокер.
Фаза 2 — Review Сюзереном
- Прочитай
{{plan_path}} целиком.
- Покажи Сюзерену весь план как есть. Коротко акцентируй: кто распознан как оппонент, какой тип головного документа, куда попадёт поставка, сколько приложений.
- Спроси: «Подтверждаешь? Или правки?»
- Подтверждение → Фаза 3. Правки → Фаза 2b. Отмена → остановка.
Фаза 2b — Revise
- Возьми буквальный текст правок Сюзерена как
revise_feedback.
- Пересобери план в тех же
{{plan_path}} и {{work_dir}}.
- Вернись к Фазе 2.
Фаза 3 — Apply (main-Sonnet)
- После подтверждения прочитай утверждённый
{{plan_path}} и исполни его.
- Main-Sonnet сам:
- копирует исходники в
.vassal/raw/{{batch_name}}/;
- конвертирует изображения в PDF;
- создаёт md-зеркала;
- раскладывает комплект в процессуальную папку оппонента;
- обновляет
.vassal/index.yaml и .vassal/history.md;
- очищает
Входящие документы/, активный {{plan_path}} и {{work_dir}}.
Фаза 4 — Verify (main-Sonnet)
- Прочитай
.vassal/index.yaml и найди новые записи с origin.batch: opponent-*.
- Проверь, что у новых записей:
source: opponent;
- корректны
bundle_id, role_in_bundle, parent_id для головы и приложений;
- для каждого документа вызови
python3 "$PLUGIN_ROOT/scripts/classify_ocr_quality.py" --extraction-method <extraction_method> --confidence <confidence> --total-chars <total_chars> --pages <pages> и подставь ocr_quality/ocr_quality_reason из JSON-ответа скрипта. Если total_chars или pages неизвестны или отсутствуют, передавай значение "" или "null" — скрипт обработает их как None и не упадёт.
- Пока повторный OCR не запускался, фиксируй
ocr_reattempted: false. Если качество low или empty, обязательно сохрани причину и сообщи об этом Сюзерену.
- Убедись, что:
- процессуальная папка реально создана;
- для каждой новой записи создано md-зеркало;
- активные
{{plan_path}} и {{work_dir}} удалены.
- Финальное резюме Сюзерену:
Поставка от <оппонент>: <тип документа>, N приложений, low/empty OCR: X.
Примечание: legacy-директория .vassal/codex-logs/ может остаться от дел v0.5.x, но v0.6.0 её не создаёт и не использует; текущий прогон фиксируется через .vassal/history.md.
Фаза 5 — Экспресс-анализ (Opus, отдельно от файловой части)
- Если головной документ оппонента — процессуальный, предложи Сюзерену экспресс-анализ аргументов оппонента.
- Если Сюзерен согласен — выполни отдельный Opus-проход и сохрани результат в
.vassal/analysis/opponent-<plan_timestamp>.md.
Идемпотентность
План сам проверяет origin.name + origin.archive_src в предыдущих opponent-* batches. Уже обработанные файлы не индексируются повторно.
Блокер при недоступном Haiku-subagent
Если Task(model=haiku) недоступен или не удаётся получить валидный YAML даже после повторного вызова:
- Сообщи Сюзерену:
Haiku-subagent недоступен, add-opponent остановлен. Нужен рабочий Task(model=haiku) по контракту 3.3.
- Покажи конкретную ошибку.
- Не переходи к ручной классификации в main-Sonnet.