Команда Pipeline

/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. Уровень 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. Уровень 2: Runtime-owned peer review — выбирает sonnet, haiku, opus или none из CLI, project config, user config либо ограниченного runtime fallback. Findings сохраняют source layer, provider, mode и источник выбора. Передача task ID обязательна для аудита стоимости и результатов.
  3. Уровень 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.

Peer Resolution (Zero-Flag UX)

dev-tools/resolve-peer-provider.sh использует пятишаговую fail-closed цепочку:

  1. Явное значение --peer-provider.
  2. Project datarim/config.yaml.
  3. User ~/.config/datarim/config.yaml.
  4. Cross-Claude-family Peer Reviewer на Claude runtime.
  5. 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, dispatch
  • severity — enum: high, medium, low
  • category — enum: correctness, completeness, consistency, safety
  • evidence{type, source, excerpt}, где type{file_quote, test_output, absent} (absent auto-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