verify_plan
v0.9.1 (расширенная v0.9.2 с автообнаружением) — Проходит по критическим точкам плана и проверяет каждую на соответствие свидетельствам. Работает в паре с `qa_plan` — должен вызываться с `plan_id`, возвращённым предыдущим вызовом `qa_plan`. Возвращает структурированный чеклист со статусом выполнения по каждой КТ и общим статусом (passed / incomplete / failed).
Правило сопоставления: КТ считается выполненной, когда её `verification_hint` встречается (без учёта регистра, как подстрока) в строковом представлении любого элемента свидетельства. Элементы свидетельств могут быть строками, словарями или вложенными структурами — проверяющий их уплощает.
v0.9.2 — Режим auto_discover: установите `auto_discover: true`, и проверяющий читает pytest-json-report проекта по пути `<QA_PROJECT_ROOT>/report.json` (или `MK_QA_REPORT_PATH`, или аргумент `report_path`) и добавляет список его `tests` в поток свидетельств. По возможности — отсутствующий или повреждённый отчёт молча пропускается, это НЕ жёсткая ошибка. Поле `evidence_sources` в ответе сообщает, что было использовано.
Семантика статусов:
- `'passed'`: все КТ выполнены
- `'incomplete'`: некоторые выполнены, некоторые нет
- `'failed'`: ни одна КТ не выполнена (или свидетельства пусты)
Даже если хост утверждает «всё хорошо», `verify_plan` возвращает `'incomplete'`, когда любая КТ не выполнена. Это заложено в дизайн — факты важнее заявлений о возможностях.
v0.9.3 — Когда включено сохранение (см. `qa_plan`), промах кэша в памяти прозрачно переключается на диск. Поле `plan_source` в ответе сообщает, откуда взят план: `'memory'` (попадание в кэш) или `'disk'` (загружен из `<plans_dir>/<plan_id>.json` после перезапуска или вытеснения).
Возвращает: {plan_id, task, kind, status, checklist[{id, description, verification_hint, satisfied, matched_evidence}], unmet[], summary{total, satisfied, unsatisfied}, evidence_sources{explicit_count, autodiscovered, autodiscovered_count, report_path}, plan_source ('memory' или 'disk'), verified_at}.
Формы ошибок: no_plan_id / plan_not_found / no_evidence (только когда опущены и явные свидетельства, и auto_discover) / bad_evidence.