Claude Skill

verify

Paper-vs-code consistency audit. After research:scientist implements a method from a paper, verify the implementation matches paper claims across five dimensions — formula matching [F], hyperparameter parity [H], eval protocol [E], notation consistency [N], and citation chain [C]

LLM Mart · 0 points · 17 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download Borda-AI-Rig-plugins_cc_research_skills_verify-39e3a48.zip · 10 KB
borda/ai-rig 27 4 forks Apache-2.0 Updated 2d ago
Part of borda/ai-rig — 82 skills

Install

skills CLI npx skills add https://github.com/Borda/AI-Rig/tree/main/plugins/cc_research/skills/verify
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install borda-ai-rig@llmmart
Git git clone https://github.com/Borda/AI-Rig.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole borda/ai-rig collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Files (ai-rig)
  • SKILL.md 27 KB
    ---
    name: verify
    description: Paper-vs-code consistency audit. After research:scientist implements a method from a paper, verify the implementation matches paper claims across five dimensions — formula matching [F], hyperparameter parity [H], eval protocol [E], notation consistency [N], and citation chain [C]. Reads paper (PDF path / arXiv URL / pasted text), maps claims to codebase, emits verification table with match status and severity.
    argument-hint: <paper> [--scope <glob>] [--program <program.md>] [--strict] [--dim <F,H,E,N,C>] [--codemap] [--no-codemap]
    allowed-tools: Read, Write, Bash, Grep, Glob, Agent, WebFetch, TaskCreate, TaskUpdate, AskUserQuestion
    effort: medium
    disable-model-invocation: true
    ---
    
    <constants>
    
    ```yaml
    HARD_CUTOFF: 900  # seconds — advisory; Agent() runs in background and cannot be interrupted mid-flight
    ```
    
    </constants>
    
    <objective>
    
    Paper-vs-code consistency audit. After `research:scientist` implements method from paper, verify implementation matches paper claims. Audits five dimensions — formula matching, hyperparameter parity, eval protocol, notation consistency, citation chain. Emits verification table with match status and severity.
    
    NOT for: running experiments (use `/research:run`); judging experimental methodology (use `/research:judge`); literature search (use `/research:topic`); general code review (use `/develop:review` (requires `develop` plugin)). Verify audits implementation-vs-paper fidelity only — does not evaluate whether paper's claims are valid.
    
    </objective>
    
    <workflow>
    
    ## Agent Resolution
    
    `research:scientist` same plugin as this skill — no fallback needed if research plugin installed. Scientist handles all five audit dimensions in single spawn to preserve cross-dimension context (e.g., notation inconsistency explaining formula mismatch needs holistic paper understanding).
    
    ## Verify Mode (Steps V1–V6)
    
    Triggered by `verify <paper>` where `<paper>` is PDF path, arXiv URL, or multi-line quoted text.
    
    **Task tracking**: create tasks for V1, V2, V3, V4, V5, V6 at start — before any tool calls.
    
    ### Step V1: Parse paper input
    
    **Input resolution** (priority order):
    
    1. Path ending `.pdf` — read via Read tool (use `pages: "1-20"` for large PDFs; iterate with subsequent page ranges if needed — max 20 pages per Read call)
    2. URL matching `arxiv.org` — convert `abs/<id>` to `https://arxiv.org/pdf/<id>` for actual content fetching (e.g., `ARXIV_URL="${ARXIV_URL//arxiv.org\/abs\//arxiv.org\/pdf\/}"`). Use WebFetch (`timeout: 30000`). No separate abstract-page fetch — title/authors/year come from the PDF's first page.
    3. URL matching `*.pdf` or `doi.org` — WebFetch (`timeout: 30000`)
    4. Multi-line quoted text block — treat as literal paper content
    5. No paper argument — stop: `"No paper provided. Usage: /research:verify <paper.pdf|arxiv-url|'pasted text'> [--scope <glob>]"`
    
    **Pay for the paper once**: whatever the source above, write resolved paper content to `$RUN_DIR/paper.md` (Write tool, right after run-dir block below creates `$RUN_DIR`) — V3 spawn prompt passes that path, never re-inlines text, never re-fetches (a 20-page paper re-inlined is 15-25K tok billed twice).
    
    From paper content, extract:
    
    - **Header**: title, authors, year (for report)
    - **Claims table**: each claim = `{id, section, claim_text, type}` where type is one of: `formula`, `hyperparameter`, `eval`, `architecture`, `result`
    - Focus on: equations with concrete terms, specific hyperparameter values, evaluation protocols (metric names, split names, preprocessing steps), architectural specifics, reported numeric results
    
    **Unsupported flag check**: load and follow the protocol below. Supported flags for this skill: `--scope`, `--program`, `--strict`, `--dim`, `--codemap`, `--no-codemap`.
    
    ```bash
    # loads: unsupported-flag-protocol.md
    # loads: compaction-contract.md
    export CSID="${CLAUDE_CODE_SESSION_ID:-$PPID}"
    _RESEARCH_SHARED=$(python "${CLAUDE_PLUGIN_ROOT:-plugins/cc_research}/bin/resolve_shared.py" 2>/dev/null)  # timeout: 5000
    [ -z "$_RESEARCH_SHARED" ] && { echo "! Plugin path resolution failed"; exit 1; }
    echo "$_RESEARCH_SHARED" > "${TMPDIR:-/tmp}/research-shared-${CSID}"  # cold resolve — every later site reads this sentinel instead of re-running python
    cat "$_RESEARCH_SHARED/unsupported-flag-protocol.md"
    cat "$_RESEARCH_SHARED/compaction-contract.md"
    ```
    
    **Codemap auto-detection** — structural context (blast-radius, importers, coverage) for the audited codebase; on by default when codemap installed + index found. `--no-codemap` opts out; `--codemap` is strict (fail if unavailable). Note: `--codemap` is independent of `--strict` (audit strictness).
    
    ```bash
    # timeout: 5000
    export CSID="${CLAUDE_CODE_SESSION_ID:-$PPID}"
    # Prints the resolved mode and writes true/false to research-verify-codemap-enabled-${CSID};
    # exits 1 (already reporting `! BLOCKED`) when --codemap is strict but codemap is unavailable.
    CODEMAP_RAW=$(python "${CLAUDE_PLUGIN_ROOT:-plugins/cc_research}/bin/codemap-flag.py" research-verify "$ARGUMENTS") || exit 1
    ```
    
    > loads: codemap-gates.md
    
    When `CODEMAP_RAW` ≠ `off`:
    
    ```bash
    export CSID="${CLAUDE_CODE_SESSION_ID:-$PPID}"
    IFS= read -r _RESEARCH_SHARED < "${TMPDIR:-/tmp}/research-shared-${CSID}" 2>/dev/null || _RESEARCH_SHARED=""  # warm read (Check 41)
    cat "$_RESEARCH_SHARED/codemap-gates.md"
    ```
    
    Follow Gate A and Gate B.
    
    **Pre-compute run directory** — persist `RUN_DIR` and `OUT` to temp files so V3/V4/V5 (separate Bash shells) can reload them (ADV-H20):
    
    ```bash
    export CSID="${CLAUDE_CODE_SESSION_ID:-$PPID}"
    BRANCH=$(git branch --show-current 2>/dev/null | tr '/' '-' || echo 'main')  # timeout: 3000
    DATE=$(date -u +%Y-%m-%d)  # timeout: 3000
    RUN_DIR=$(python "${CLAUDE_PLUGIN_ROOT:-plugins/cc_research}/bin/make_run_dir.py" "verify" ".experiments" 2>/dev/null)  # timeout: 5000
    mkdir -p .reports/research
    BASE="verify-$BRANCH-$DATE"; OUT=".reports/research/$BASE.md"; COUNT=2; while [ -f "$OUT" ]; do OUT=".reports/research/${BASE}-${COUNT}.md"; COUNT=$((COUNT+1)); done
    # persist for V3/V4/V5 (fresh shell each Bash call) — verify-latest-tag lets each shell rehydrate; epoch suffix distinguishes concurrent runs same branch/day
    _VTAG="${BRANCH}-${DATE}-$(date +%s)"
    echo "$RUN_DIR" > "${TMPDIR:-/tmp}/verify-${_VTAG}-run-dir-${CSID}"
    echo "$OUT"     > "${TMPDIR:-/tmp}/verify-${_VTAG}-out-${CSID}"
    echo "$_VTAG"   > "${TMPDIR:-/tmp}/verify-latest-tag-${CSID}"  # pointer for rehydration blocks
    ```
    
    **State-rehydration block** (paste at the top of every separate Bash invocation in V3, V4, V5):
    
    ```bash
    export CSID="${CLAUDE_CODE_SESSION_ID:-$PPID}"
    IFS= read -r _VTAG < "${TMPDIR:-/tmp}/verify-latest-tag-${CSID}" 2>/dev/null || _VTAG=""
    IFS= read -r RUN_DIR < "${TMPDIR:-/tmp}/verify-${_VTAG}-run-dir-${CSID}" 2>/dev/null || RUN_DIR=""
    IFS= read -r OUT < "${TMPDIR:-/tmp}/verify-${_VTAG}-out-${CSID}" 2>/dev/null || OUT=""
    # T-C1: one call reports all empty values at once. Trailing `[ -z "$X" ] && { …; }`
    # guard leaves block exit status 1 even when value IS present.
    python "${CLAUDE_PLUGIN_ROOT:-plugins/cc_research}/bin/require-vars.py" "$RUN_DIR" "verify: state files missing — V1 must run first" "$OUT" "verify: state files missing — V1 must run first" || exit 1
    ```
    
    ### Step V2: Resolve codebase scope
    
    **Scope resolution** (priority order):
    
    1. `--scope <glob>` flag — use directly
    2. `--program <program.md>` flag — Read file, extract `scope_files` from `## Config` fenced block
    3. Auto-detect — `Glob(pattern="**/*.py")` up to 100 files; prefer files with ML-relevant imports (`torch`, `tensorflow`, `sklearn`, `numpy`, `jax`). If Glob returns 100 files and additional `.py` files exist (i.e., total may exceed 100): print `⚠ Scope truncated at 100 files — large codebase. Fidelity score reflects verified subset only. Use --scope or --program to narrow to relevant modules.`
    
    **Post-resolution validation** (applies to all three resolution methods above, including `--scope` and `--program`): after `scope_files` resolved, count entries:
    
    - `len(scope_files) == 0` → print `! MISSING — Scope resolved to 0 files. Check --scope glob (typos like '**/*.pytroch' return zero matches), --program config block, or auto-detect coverage.` and stop.
    - `len(scope_files) > 100` → print the truncation warning above regardless of resolution method, so user is aware fidelity reflects verified subset only.
    
    Apply `--dim` filter: if `--dim F,H` specified, only audit those dimensions. Default: all five (`F,H,E,N,C`).
    
    **`--dim` validation**: derive `$DIM` from the `--dim` flag (default `F,H,E,N,C` when flag absent), then validate each specified dimension token against the known set before proceeding. **Persist status to temp file** so V3 (separate Bash shell) can short-circuit when V2 failed (ADV-M25 — bash `exit 2` only terminates V2's shell, not the V3 invocation):
    
    ```bash
    export CSID="${CLAUDE_CODE_SESSION_ID:-$PPID}"
    # --strict included only to satisfy parse-skill-flags.py's non-empty --flags requirement
    eval "$(python "${CLAUDE_PLUGIN_ROOT:-plugins/cc_research}/bin/parse-skill-flags.py" --flags strict --value-flags dim "$ARGUMENTS")"  # timeout: 5000
    DIM="${VALUE_DIM:-F,H,E,N,C}"
    V2_STATUS="ok"
    for _DIM_VAL in $(echo "$DIM" | tr ',' ' '); do
      case "$_DIM_VAL" in
        F|H|E|N|C) ;;
        *) echo "verify: unknown dimension: '$_DIM_VAL' — valid: F,H,E,N,C" >&2; V2_STATUS="failed" ;;
      esac
    done
    IFS= read -r _VTAG < "${TMPDIR:-/tmp}/verify-latest-tag-${CSID}" 2>/dev/null || _VTAG=""
    echo "$V2_STATUS" > "${TMPDIR:-/tmp}/verify-${_VTAG}-v2-status-${CSID}"
    [ "$V2_STATUS" = "failed" ] && exit 2
    ```
    
    **V3 entry guard** (run before any V3 work — paste immediately after the state-rehydration block):
    
    ```bash
    export CSID="${CLAUDE_CODE_SESSION_ID:-$PPID}"
    IFS= read -r _VTAG < "${TMPDIR:-/tmp}/verify-latest-tag-${CSID}" 2>/dev/null || _VTAG=""
    # Default ok = fail open — V2 may not have written status yet. Any non-`ok` value closes
    # gate: unrecognised status treated as failure, not pass.
    python "${CLAUDE_PLUGIN_ROOT:-plugins/cc_research}/bin/gate-on-sentinel.py" "${TMPDIR:-/tmp}/verify-${_VTAG}-v2-status-${CSID}" ok ok "verify V3: dimension validation failed in V2 — skipping V3." || exit 1
    ```
    
    ### Step V3: Five-dimension audit via scientist
    
    > **Agent budget** — each spawn costs ~120,851 tok of fixed overhead (~73 tool-calls' worth) plus ~12.0 s/call, so work under ~73 calls is cheaper done inline: spawn nothing. Keep each agent near ~55 tool-calls; past ~60 they stall without returning an envelope, forcing reconstruction from disk. Every spawn prompt must require an envelope even on exhaustion — `partial: true` plus what was finished.
    
    Spawn `research:scientist` via `Agent(subagent_type="research:scientist", prompt="...")`. Single agent handles all five dimensions — cross-dimension context requires holistic paper understanding.
    
    **Codemap structural context** (only if `CODEMAP_ENABLED=true` — re-read from `${TMPDIR:-/tmp}/research-verify-codemap-enabled-${CSID}`):
    
    ```bash
    export CSID="${CLAUDE_CODE_SESSION_ID:-$PPID}"
    IFS= read -r _RESEARCH_SHARED < "${TMPDIR:-/tmp}/research-shared-${CSID}" 2>/dev/null || _RESEARCH_SHARED=""  # warm read (Check 41)
    cat "$_RESEARCH_SHARED/codemap-context.md"
    ```
    
    Execute its block (leave `TARGET_MODULE`/`TARGET_FN` empty for `central` baseline, or set `TARGET_MODULE` to key module from `scope_files`). Prepend output to scientist prompt under `## Structural Context (codemap-py)` heading so architecture (N) and eval (E) dimensions reference real import/coverage structure instead of re-reading every file.
    
    Codemap output non-empty: prepend the reuse gate from `codemap-context.md` above verbatim and this **codemap-first protocol** to the same heading (own copy — self-contained, no cross-plugin reference): (1) **Skill-first** — use Structural Context above for import/caller/coverage questions before any supplementary Grep on same target; does NOT relax mandatory "Read each file listed in Codebase scope files" instruction below — formula (F) and hyperparameter (H) fidelity require actual file contents; codemap cannot substitute for line-level comparison. (2) **Bounded call budget** — up to 5 additional `codemap-py query` calls this audit (raised from plugin default 3: verify pass spans up to 100 scope files across 5 dimensions — wider surface than single-file edit). (3) **Hard stop on `query_complete: true`** (legacy `exhaustive: true` only when `query_complete` is absent) — a result passing the reuse gate is final for its direction, no follow-up Grep/query to re-confirm it. Codemap output empty: omit this paragraph — scientist proceeds with full-file-read protocol below unchanged.
    
    <!-- Agent call runs in the background: spawn, end the turn, resume on the completion notification — never a filler call, a "waiting" line, or a sleep. HARD_CUTOFF (900s) is declared as a reference constant but is NOT enforceable within the skill — Agent() has no timeout parameter. On the notification, apply the single timeout policy declared in `<constants>`: check `$RUN_DIR/audit-raw.md`; if absent or empty, set `fidelity = null`, `status = TIMED_OUT`, mark ⏱ in report; if present, parse normally. Same limitation as research:topic. -->
    
    **Scientist prompt** — before constructing the Agent() call, substitute actual computed value of `$RUN_DIR` (e.g. `.experiments/verify-2026-05-13T10-00-00Z`) into every path in prompt below; unexpanded `$RUN_DIR` reaches agent as literal dollar-sign text: audit lands in directory literally named `$RUN_DIR`, post-call check reports false `TIMED_OUT`:
    
    ```markdown
    Act as ML reproducibility auditor verifying implementation fidelity against published paper.
    
    Paper: <title> (<year>) by <authors>
    Paper content: read $RUN_DIR/paper.md via Read tool (never re-fetch paper from web)
    Claims to verify (from V1 extraction):
    <JSON claims table>
    
    Codebase scope files:
    <list of files from V2>
    
    Read scope files mapped to each claim first (claim `section`/`type` names relevant modules); full scope-file read-through only when list has ≤40 files — turn budget stalls near ~60 tool calls, wide scope read-all burns it before auditing happens.
    
    Active dimensions: <F,H,E,N,C or subset from --dim>
    
    Audit implementation against paper across active dimensions:
    
    [F] Formula matching: every equation in paper with concrete terms — does code implement same math? Check loss functions, forward passes, normalization, gradient computations. Flag sign errors, missing terms, wrong reduction (mean vs sum).
    
    [H] Hyperparameter parity: every hyperparameter paper specifies (LR, batch size, weight decay, momentum, scheduler, warmup steps, dropout, hidden dim) — do code defaults match paper values? Flag divergences.
    
    [E] Eval protocol: does evaluation pipeline match paper? Same metric (e.g., mAP@0.5 vs mAP@[0.5:0.95]), same test split, same preprocessing at inference, same post-processing thresholds.
    
    [N] Notation consistency: variable names in code mapping to paper notation — consistent? Flag confusing mappings (e.g., paper uses `alpha` for learning rate but code uses it for momentum).
    
    [C] Citation chain: does implementation originate from cited paper or a derivative? If code implements variant from different paper, flag.
    
    For each finding, produce:
    - claim_id: from claims table
    - dimension: F|H|E|N|C
    - paper_reference: exact quote or equation from paper
    - code_reference: file:line in codebase
    - match_status: MATCH | MISMATCH | PARTIAL | UNVERIFIABLE
      - PARTIAL: use when claim debatable — code implements valid variant but not exact paper formulation; include both interpretations in `detail`
    - severity: HIGH (would change results) | MEDIUM (affects reproducibility) | LOW (cosmetic)
    - detail: one-sentence explanation
    - fix: concrete one-line fix (e.g., "change `reduction='mean'` to `reduction='sum'`" or "set `bias=False`") — required for all MISMATCH and PARTIAL findings; omit only for MATCH and UNVERIFIABLE
    
    Also compute fidelity score: (MATCH + 0.5*PARTIAL) / total_verified_claims.
    
    Write full audit to $RUN_DIR/audit-raw.md via Write tool.
    Include ## Confidence block.
    Return ONLY: {"status":"done","claims_verified":N,"mismatches":N,"high":N,"medium":N,"low":N,"fidelity":0.N,"file":"$RUN_DIR/audit-raw.md","confidence":0.N}
    ```
    
    `timeout` is not a valid parameter on `Agent()` — do NOT pass it. The `HARD_CUTOFF: 900` constant is advisory only (see `<constants>`); a background `Agent()` call cannot be polled or interrupted mid-flight.
    
    **Single timeout policy** (matches `<constants>`): after `Agent()` returns, read `$RUN_DIR/audit-raw.md`. If absent or empty → set `fidelity = null`, status = `TIMED_OUT`, continue to V4 with ⏱ marker in the report. If present → parse normally regardless of nominal budget. Never defer handling to a "next turn" or rely on context compaction.
    
    ### Step V4: Severity assessment and fidelity rating
    
    Post-process envelope from scientist:
    
    | Fidelity score | Rating |
    | -- | -- |
    | >= 0.9 | HIGH fidelity |
    | 0.7 -- 0.9 | MODERATE fidelity |
    | < 0.7 | LOW fidelity |
    | null (timed out) | TIMED OUT |
    
    **Strict mode**: if `--strict` flag AND any HIGH severity mismatches in dimension F (formula) or E (eval):
    
    ```text
    ! BREAKING — HIGH severity mismatch in critical dimension (F or E). Fix before running experiments.
    ```
    
    **Stage the partial report to `$RUN_DIR/partial-report.md`, never to `$OUT`** — a premature `$OUT` write is clobbered by V5 on option (b) and makes option (a)'s description dishonest. Rehydrate state first (fresh shell — an earlier block's state may not carry over), write the staged file, then persist a compaction contract so the idle `AskUserQuestion` gate below survives a mid-wait `/compact`:
    
    ```bash
    export CSID="${CLAUDE_CODE_SESSION_ID:-$PPID}"
    IFS= read -r _VTAG < "${TMPDIR:-/tmp}/verify-latest-tag-${CSID}" 2>/dev/null || _VTAG=""
    IFS= read -r RUN_DIR < "${TMPDIR:-/tmp}/verify-${_VTAG}-run-dir-${CSID}" 2>/dev/null || RUN_DIR=""
    IFS= read -r OUT     < "${TMPDIR:-/tmp}/verify-${_VTAG}-out-${CSID}" 2>/dev/null || OUT=""
    [ -z "$RUN_DIR" ] && { echo "verify V4: run dir unresolved — V1 state missing; partial report has no destination" >&2; exit 1; }
    echo "$RUN_DIR"
    ```
    
    Trailing `echo "$RUN_DIR"` is load-bearing: Write tool takes literal path, performs no shell expansion — resolved value must reach transcript. Write partial-report markdown (verification table built so far plus a `! STRICT STOP — partial report; failed claims not yet written` banner at top) to `$RUN_DIR/partial-report.md` via Write tool, then (fresh shell — the Write tool call above is a turn boundary, so rehydrate before referencing `$RUN_DIR`/`$OUT` again):
    
    ```bash
    export CSID="${CLAUDE_CODE_SESSION_ID:-$PPID}"
    IFS= read -r _VTAG < "${TMPDIR:-/tmp}/verify-latest-tag-${CSID}" 2>/dev/null || _VTAG=""
    IFS= read -r RUN_DIR < "${TMPDIR:-/tmp}/verify-${_VTAG}-run-dir-${CSID}" 2>/dev/null || RUN_DIR=""
    IFS= read -r OUT     < "${TMPDIR:-/tmp}/verify-${_VTAG}-out-${CSID}" 2>/dev/null || OUT=""
    python "${CLAUDE_PLUGIN_ROOT:-plugins/cc_research}/bin/write_skill_contract.py" "research:verify" "strict-mode-gate (before AskUserQuestion idle wait)" "${RUN_DIR}" "run-dir=${RUN_DIR}, out=${OUT}, partial-report=${RUN_DIR}/partial-report.md" "on (a): cp partial-report.md to \$OUT and stop; on (b): discard it, proceed to V5/V6 full report"  # timeout: 5000
    ```
    
    In the same reply that calls `AskUserQuestion` below, print (reply prose, not inside a bash `echo`): `` Long wait? `/compact` now — partial report staged at `$RUN_DIR/partial-report.md`, resume lossless. ``
    
    Invoke `AskUserQuestion` — do NOT write options as plain text:
    
    - question: "Strict mode hit HIGH severity mismatch — how to proceed?"
    - (a) label: `Stop here` — description: copy staged partial report (passing claims only) to `$OUT`; fix mismatches and re-run `/research:verify`
    - (b) label: `Continue to full report` — description: discard staged partial report, proceed to V5/V6 and include failed claims in the full verification report
    
    **On (a)**: (a) branch runs after an `AskUserQuestion` turn boundary, i.e. fresh Bash call — rehydrate self-containedly rather than assuming any earlier block ran in this shell. `_VTAG` must come from pointer file, never recomputed (V1 stamps it with `$(date +%s)`; a recompute yields different, non-existent filename):
    
    ```bash
    export CSID="${CLAUDE_CODE_SESSION_ID:-$PPID}"
    IFS= read -r _VTAG < "${TMPDIR:-/tmp}/verify-latest-tag-${CSID}" 2>/dev/null || _VTAG=""
    IFS= read -r RUN_DIR < "${TMPDIR:-/tmp}/verify-${_VTAG}-run-dir-${CSID}" 2>/dev/null || RUN_DIR=""
    IFS= read -r OUT     < "${TMPDIR:-/tmp}/verify-${_VTAG}-out-${CSID}" 2>/dev/null || OUT=""
    [ -z "$OUT" ] && { echo "verify V4: report path unresolved — V1 state missing; partial report has no destination" >&2; exit 1; }
    cp "$RUN_DIR/partial-report.md" "$OUT"
    rm -f .temp/state/skill-contract.md
    echo "$OUT"
    ```
    
    Surface file path, exit. Full audit remains at `$RUN_DIR/audit-raw.md`. Do NOT also dump mismatch table to terminal — already inside partial report.
    
    **On (b)**: staged partial report is deleted — superseded by the full report at `$OUT`. Fresh shell, same rehydration as (a):
    
    ```bash
    export CSID="${CLAUDE_CODE_SESSION_ID:-$PPID}"
    IFS= read -r _VTAG < "${TMPDIR:-/tmp}/verify-latest-tag-${CSID}" 2>/dev/null || _VTAG=""
    IFS= read -r RUN_DIR < "${TMPDIR:-/tmp}/verify-${_VTAG}-run-dir-${CSID}" 2>/dev/null || RUN_DIR=""
    rm -f "$RUN_DIR/partial-report.md"
    ```
    
    Proceed directly to V5/V6 — V5 writes full report to `$OUT` (failed claims included).
    
    ### Step V5: Write verification report
    
    `$OUT` pre-computed in V1 — available here. Write to `$OUT` via Write tool (`BRANCH` and `DATE` computed in V1):
    
    ```markdown
    ---
    Title:       Verify — [paper title]
    Date:        [YYYY-MM-DD]
    Scope:       [paper title] ([year]) / [code glob pattern]
    Focus:       paper-to-code fidelity verification
    Agents:      research:scientist (V3)
    Outcome:     HIGH | MODERATE | LOW fidelity
    Claims:      [N] verified / [N] match / [N] mismatch / [N] partial
    Confidence:  [score] — [key gaps]
    Next steps:  fix mismatches → /research:verify | proceed to /research:run <program.md>
    Path:        → .reports/research/verify-<branch>-<date>.md
    ---
    
    ## Verification Report: <paper title>
    
    **Paper**: <title> (<year>) by <authors>
    **Date**: <date>
    **Fidelity**: HIGH | MODERATE | LOW (<score>) [or: TIMED OUT]
    **Claims verified**: <N> (<match> match / <mismatch> mismatch / <partial> partial / <unverifiable> unverifiable)
    **Dimensions**: <active dimensions>
    
    ### Verification Table
    
    | # | Claim | Dim | Paper Reference | Code Reference | Status | Severity | Detail |
    |---|-------|-----|-----------------|----------------|--------|----------|--------|
    | 1 | ... | F | ... | file:line | MATCH | - | ... |
    | 2 | ... | H | ... | file:line | MISMATCH | HIGH | ... |
    
    ### High-Severity Mismatches
    
    (ordered list with specific fix instructions per mismatch — omit section if none)
    
    1. **[claim_id] [dimension]**: <paper says X, code does Y> — fix at `file:line` by <specific change>
    
    ### Dimension Summary
    
    | Dim | Name | Verified | Match | Mismatch | Partial | Unverifiable |
    |-----|------|----------|-------|----------|---------|--------------|
    | F | Formula | ... | ... | ... | ... | ... |
    | H | Hyperparameter | ... | ... | ... | ... | ... |
    | E | Eval protocol | ... | ... | ... | ... | ... |
    | N | Notation | ... | ... | ... | ... | ... |
    | C | Citation chain | ... | ... | ... | ... | ... |
    
    ### Recommended Fixes
    
    (ordered by severity; each fix = file:line, what to change and why)
    
    1. **HIGH** `src/model.py:42` — loss uses `mean` reduction but paper specifies `sum`; change `reduction='mean'` to `reduction='sum'`
    2. **MEDIUM** `config.yaml:7` — learning rate 1e-3 but paper uses 3e-4; update default
    
    Full audit: <RUN_DIR>/audit-raw.md
    
    ## Confidence
    **Score**: 0.N — [high ≥0.9 | moderate 0.85–0.9 | low <0.85 ⚠]
    **Gaps**:
    - [e.g., implementation details not directly verifiable from paper alone]
    
    **Refinements**: N passes.
    ```
    
    ### Step V6: Terminal summary
    
    ```text
    ---
    Verify — <paper title>
    Fidelity:    HIGH | MODERATE | LOW (<score>)  [or: TIMED OUT]
    Claims:      <N> verified / <match> match / <mismatch> mismatch
    Severity:    <N> HIGH / <N> MEDIUM / <N> LOW
    Top issue:   <one-line from highest severity finding>   [or: "no mismatches found"]
    -> saved to .reports/research/verify-<branch>-<date>.md
    -> full audit: <RUN_DIR>/audit-raw.md
    ---
    Next: fix mismatches, then /research:verify <paper> --scope <glob>
    ```
    
    Omit "Next" line if no mismatches found.
    
    Call `AskUserQuestion` tool after V6 output — do NOT write options as plain text. Before invoking, check whether `/develop:fix` is available so it can be mentioned as a plain-text suggestion (verify has no `Skill` tool and `/develop:fix` has `disable-model-invocation: true`, so it can never be offered as a dispatchable option):
    
    ```bash
    ls ~/.claude/plugins/cache/borda-ai-rig/develop/*/skills/fix/SKILL.md >/dev/null 2>&1 && DEVELOP_FIX_AVAILABLE=true || DEVELOP_FIX_AVAILABLE=false  # timeout: 5000
    echo "DEVELOP_FIX_AVAILABLE=$DEVELOP_FIX_AVAILABLE"  # `|| ...=false` fallback makes block exit 0 either way — stdout only surviving channel
    rm -f .temp/state/skill-contract.md  # clear before V6's idle gate — after it may never run (compaction-contract.md §Lifecycle)
    ```
    
    **Only when the block above printed `DEVELOP_FIX_AVAILABLE=true`**, print as plain text before the question: "Tip: `/develop:fix` (requires `develop` plugin) can also implement these fixes — run it manually." Printed `false` → omit the tip entirely; never emit it on the assumption the plugin is present.
    
    - question: "What next?"
    - (a) label: `fix mismatches then re-run verify` — description: fix listed mismatches and re-run `/research:verify <paper>`
    - (b) label: `skip` — description: no further action
    
    </workflow>
    
    <notes>
    
    - **Timeout advisory**: 900s HARD_CUTOFF is advisory only — a background `Agent()` cannot be interrupted mid-flight; on its completion notification check `$RUN_DIR/audit-raw.md`; if absent/empty → TIMED_OUT, mark ⏱.
    - Verify read-only — never modifies code, commits, or writes to `.experiments/state/`
    - `.experiments/verify-<timestamp>/` stores scientist agent's full audit output for reference
    - Verify run dirs don't write `result.jsonl` — exempt from 30-day TTL cleanup (per `.claude/rules/foundry-artifact-lifecycle.md`: no `result.jsonl` = cleanup skipped); remove manually when no longer needed (`rm -rf .experiments/verify-*/`) <!-- policy-sibling: plugins/cc_research/skills/fortify/SKILL.md, plugins/cc_research/skills/judge/SKILL.md, plugins/cc_research/skills/plan/SKILL.md, plugins/cc_research/skills/retro/SKILL.md — TTL-exemption note (no result.jsonl → skip 30-day cleanup) restated in each; keep in sync (plugins/CLAUDE.md §Policy Duplication Marker). -->
    - Re-run verify after fixing mismatches to confirm fixes resolved flagged items
    - For papers with appendices beyond 20 pages, iterate Read with `pages: "21-40"` etc. to capture full hyperparameter tables
    - Fidelity score = ratio, not probability — 0.9 means 90% of verified claims match, not 90% confidence
    - **Dimension [C] (Citation chain) is best-effort** — paper provenance rarely resolvable from code alone; expect most [C] findings to come back `UNVERIFIABLE`. To skip [C] for faster, cleaner output, run with `--dim F,H,E,N`. Keep [C] with specific provenance suspicions (e.g., code may implement variant from different paper than one cited).
    
    </notes>
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related