/dr-verify
Трёхуровневая самоверификация: deterministic floor, runtime-owned peer review и native read-only dispatch
Обзор
/dr-verify запускает три findings-only слоя по принципу cheapest-first. Layer 1 — deterministic shell floor. Layer 2 — изолированное peer review внутри выбранного agent runtime. Layer 3 — native read-only dispatch. Внешние Coworker-провайдеры намеренно недопустимы для adversarial verification: AC verification, hidden-gap discovery и semantic judgment остаются в выбранном runtime.
Использование
/dr-verify {TASK-ID} # zero-flag — провайдер авто-резолвится
/dr-verify {TASK-ID} --stage do
/dr-verify {TASK-ID} --floor-only # только Layer 1, быстрый pre-merge gating
/dr-verify {TASK-ID} --peer-provider sonnet # явный runtime-owned peer
Три уровня
- Уровень 1: Детерминированный floor — запускает
dev-tools/dr-verify-floor.sh, чистый shell-конвейер: AC coverage grep, file-touched audit, test-presence parse, shellcheck по dev-tools/scripts. Нулевая стоимость LLM, выполняется за секунды. Эмиттит JSONL findings сsource_layer: "floor"на stdout. - Уровень 2: Runtime-owned peer review — выбирает
sonnet,haiku,opusилиnoneиз CLI, project config, user config либо ограниченного runtime fallback. Findings сохраняют source layer, provider, mode и источник выбора. Передача task ID обязательна для аудита стоимости и результатов. - Уровень 3: Native runtime dispatch — verification-агенты на локальном runtime:
- Claude (канонический): 3 параллельных read-only субагента (reviewer + tester + security). Findings объединяются через union + dedupe по кортежу
(artifact_ref, ac_criteria, category); при коллизии побеждает higher severity. - Codex
[экспериментальный]fallback: single-prompt loop с canonical adversarial framing. Демотирован из канонического — на Codex предпочтительнее использовать Layer 2.
- Claude (канонический): 3 параллельных read-only субагента (reviewer + tester + security). Findings объединяются через union + dedupe по кортежу
Peer Resolution (Zero-Flag UX)
dev-tools/resolve-peer-provider.sh использует пятишаговую fail-closed цепочку:
- Явное значение
--peer-provider. - Project
datarim/config.yaml. - User
~/.config/datarim/config.yaml. - Cross-Claude-family Peer Reviewer на Claude runtime.
- Same-model isolated fallback на Codex с явным warning.
Whitelist: sonnet | haiku | opus | none. Неизвестные и внешние значения завершаются non-zero и не меняют владельца semantic review.
Таксономия peer_review_mode
cross_claude_family— изолированный Claude-family checkpoint проверяет вывод другого checkpoint.same_model_isolated— изолированное same-model review только как последний runtime fallback.
Codex пока использует experimental same-model isolated path и записывает это ограничение в audit log.
Схема Findings
Каждый finding соответствует канонической схеме (canonical в skills/self-verification/SKILL.md § Findings Schema):
source_layer— enum:floor,peer_review,dispatchseverity— enum:high,medium,lowcategory— enum:correctness,completeness,consistency,safetyevidence—{type, source, excerpt}, гдеtype∈{file_quote, test_output, absent}(absentauto-discards)ac_criteria— массив AC labels, на которые маппится finding (может быть пустым)peer_review_provider— опционально, только Layer 2 (имя провайдера)peer_review_mode— опционально, только Layer 2 (cross_claude_familyилиsame_model_isolated)peer_review_provider_source_layer— опционально, только Layer 2 (cli_flag,per_project_config,per_user_config,fallback_subagentилиfallback_isolated)check_name— опционально, только Layer 1 (напримерac_coverage_grep,shellcheck)
JSONL Emission Discipline (Layer 2 prompts)
Findings эмитятся ТОЛЬКО когда check FAIL'ится или вскрывает NEW DRIFT. PASS-as-finding записи (например {"check_name":"F001 cleared, no finding"}) отвергаются — подтверждения принадлежат final-line summary {cleared_iter1: [...], total_new_findings: N}, не массиву. Сохраняет audit log signal-dense.
Вердикты
- PASS — только low-severity (или ноль) non-discarded findings
- CONDITIONAL — ≥1 medium и ноль high
- BLOCKED — ≥1 high (merge/archive блокируется до устранения)
Флаг --floor-only
Флаг --floor-only short-circuit на Layer 1 — идеален для быстрого pre-merge gating в CI. Завершается за секунды с нулевой стоимостью LLM, блокирует только на структурных / shellcheck-error проблемах. Уровни 2 и 3 пропускаются.
Тегирование результатов верификации
На этапе /dr-archive оператор заполняет блок verification_outcome во frontmatter архива (canonical схема в templates/archive-template.md): caught_by_verify, missed_by_verify, false_positive, n_a, dogfood_window (operator-supplied window-id, используется как grouping key, не как диапазон дат). Aggregator dev-tools/measure-prospective-rate.sh --since <YYYY-MM-DD> обходит все archive-*.md и вычисляет caught_per_5_tasks с decision_hint для следующего pipeline gate.
Пример сессии (zero-flag UX, без external API key)
> /dr-verify {TASK-ID} --stage all --max-iter 2
Layer 1 — floor: dr-verify-floor.sh --task {TASK-ID} --stage all
→ 2 findings (medium, safety, check_name=shellcheck)
→ exit 0 (нет high-severity, продолжаем)
Layer 2 — peer_review (runtime-owned resolution)
Step #1 --peer-provider flag → не задан
Step #2 ./datarim/config.yaml → не задан
Step #3 ~/.config/datarim/... → не задан
Step #4 cross-Claude-family → MATCH (subagent peer-reviewer @ sonnet)
Диспатчим agents/peer-reviewer.md, model=sonnet, isolated context
→ 1 finding (medium, correctness, peer_review_mode=cross_claude_family)
Layer 3 — dispatch runtime=claude
3 параллельных агента: reviewer / tester / security
→ reviewer: 1 finding (completeness)
→ tester: 0 findings
→ security: 0 findings
Aggregate: 4 unique findings после dedupe
Вердикт: CONDITIONAL (0 high, 4 medium)
source_layer_breakdown: {floor: 2, peer_review: 1, dispatch: 1}
peer_review_mode_breakdown: {cross_claude_family: 1}
Audit: datarim/qa/verify-{TASK-ID}-all-1.md (chmod a-w)
Связанные команды
- /dr-qa — multi-layer проверка качества (другая поверхность; комплементарна)
- /dr-archive — здесь оператор заполняет блок
verification_outcome