Files
atm-backtesting/.claude/commands/backtest.md

3.4 KiB

description, argument-hint
description argument-hint
Run vision extraction on a single TradeStation screenshot, then append to jurnal CSV + regenerate MD. <screenshot_path_or_basename> [--calibration]

/backtest — single screenshot vision extraction

Lansează subagentul m2d-extractor pe un screenshot, primește JSON-ul, append la data/jurnal.csv, regenerează data/jurnal.md.

Arguments

  • $1 (obligatoriu) — path la screenshot. Acceptă:
    • basename (2026-05-13-dia-1645.png) — caută în screenshots/inbox/, fallback screenshots/processed/
    • path relativ sau absolut explicit
  • --calibration (flag) — source=vision_calibration în loc de source=vision. Folosit împreună cu /m2d-log --calibration pe același screenshot pentru P4 mismatch report.

Workflow

  1. Rezolvă path-ul screenshot-ului. Dacă $1 e doar basename, încearcă screenshots/inbox/<basename> apoi screenshots/processed/<basename>. Dacă nu există nicăieri, raportezi eroare și te oprești.

  2. Invocă subagentul m2d-extractor (definit în .claude/agents/m2d-extractor.md) prin Task tool cu subagent_type: "m2d-extractor". Prompt-ul către agent:

    screenshot_path: <absolute_path>
    screenshot_file: <basename>
    

    Agentul scrie data/extractions/<basename_no_ext>.json + .log și returnează status-line scurt.

  3. Verifică output-ul:

    • Dacă fișierul data/extractions/<basename_no_ext>.json nu există după ce agentul revine → eroare; raportezi și muți screenshot-ul la screenshots/needs_review/.
    • Citește JSON-ul. Dacă confidence == "low" SAU ambiguities non-empty cu image_unreadable → muți screenshot-ul la screenshots/needs_review/, raportezi, nu apelezi append.
  4. Append la CSV:

    python -c "from pathlib import Path; from scripts.append_row import append_extraction; import json; r = append_extraction(Path('data/extractions/<basename_no_ext>.json'), source='<source>'); print(json.dumps(r, default=str))"
    

    <source> = vision_calibration dacă --calibration, altfel vision.

    Parsezi răspunsul. Dacă status == "rejected":

    • reason conține "duplicate" → screenshot deja procesat cu acest source; raportezi și NU îl muți.
    • reason conține "validation error" → JSON-ul agentului a fost respins; muți screenshot la screenshots/needs_review/ și raportezi.
    • Alte erori → raportezi și lași screenshot-ul unde e.
  5. Mută screenshot-ul la screenshots/processed/<basename> dacă append-ul a reușit și fișierul originar a fost în inbox/. Dacă era deja în processed/, nu-l muta.

  6. Regenerează MD:

    python scripts/regenerate_md.py
    
  7. Raport final (în română):

    /backtest <basename> → trade #<id> adăugat (source=<source>, set=<set>, pl_marius=<pl>, confidence=<conf>).
    Regenerat data/jurnal.md (<total> rânduri).
    

    Dacă screenshot-ul a fost mutat la needs_review:

    /backtest <basename> → NEEDS REVIEW: <motiv>. Mutat la screenshots/needs_review/<basename>.
    

Reguli

  • O singură invocare per screenshot. Nu reapelezi agentul dacă output-ul e dubios — îl muți la needs_review și raportezi.
  • NU edita CSV direct.
  • NU regenera MD dacă append-ul a fost respins.
  • Path discipline: subagentul scrie doar la data/extractions/; tu (slash command) muți screenshot-uri și apelezi scripts/.