---
name: run-metrics
description: "Run metrics reports for APIView Copilot. Use for: run metrics, metrics report, generate metrics, monthly metrics, metrics for March, metrics for January, adoption metrics, comment quality, quality trends, save metrics, metrics charts."
argument-hint: "Month name (e.g. 'March') or date range (e.g. '2025-03-01 to 2025-03-31')"
---

# Run Metrics

## When to Use
- Generating monthly or custom-range metrics reports
- Reviewing adoption rates and comment quality across languages
- Producing charts for metrics visualization
- Reviewing companion quality trends across recent months
- Saving finalized metrics to the database (only when user explicitly requests)

## Defaults

Unless the user says otherwise, always apply these defaults:
- **Environment**: `production`
- **Charts**: Always include `--charts`
- **Languages**: All languages (do not pass `--exclude`)
- **Save**: Do **NOT** pass `--save` unless the user explicitly asks to save (e.g. "save it", "persist", "write to DB")
- **Format**: JSON output (UTF-8 encoded)
- **Quality trends follow-up**: If the user asks for metrics but does **not** explicitly ask for quality trends, ask a short follow-up after sharing the metrics results: "Do you want the quality trends chart for the same period too?"
- **Quality trends auto-run**: If the user explicitly asks for quality trends, comment trends, or asks broadly for charts/trends/quality, also run the companion `quality-trends` report for the same period.

## Date Resolution

The user will typically specify a calendar month by name (e.g. "March", "January 2025"). Resolve to the full month date range:

| User says | start_date | end_date |
|-----------|-----------|----------|
| "March" (current year) | `YYYY-03-01` | `YYYY-03-31` |
| "January 2025" | `2025-01-01` | `2025-01-31` |
| "March 1 to March 15" | `YYYY-03-01` | `YYYY-03-15` |
| "2025-06-01 to 2025-06-30" | `2025-06-01` | `2025-06-30` |

When only a month name is given without a year, use the current year. Be careful with month lengths (28/29/30/31 days).

## Running Metrics

### Step 1: Run the Command

Show the resolved command and run it immediately in a **single foreground terminal invocation** with a **180-second timeout** (`timeout: 180000`). Before running, clean up stale output so you never accidentally present old results.

**Important**: Do NOT use `2>&1` — that merges stderr log messages (e.g. "Saved: output\charts\adoption.png") into the JSON output file, producing invalid JSON. Pipe stdout through `Out-File -Encoding UTF8` so the output file is always valid UTF-8 JSON.

**Full terminal command** (cleanup + run):
```powershell
New-Item -ItemType Directory -Path output -Force | Out-Null; if (Test-Path output/metrics_output.json) { Remove-Item output/metrics_output.json }; if (Test-Path output/charts) { Remove-Item output/charts/* -Force }; python cli.py report metrics -s <start_date> -e <end_date> --charts | Out-File -Encoding UTF8 output/metrics_output.json
```

After the command completes, **read the output file** with `read_file` to get the JSON results — do NOT use a separate terminal command. Then use `view_image` (not a terminal command) to display the chart PNGs. This means the entire workflow requires only **one** terminal invocation.

### Examples

```powershell
# March 2025, production, all languages, with charts (typical request)
python cli.py report metrics -s 2025-03-01 -e 2025-03-31 --charts

# Staging environment
python cli.py report metrics -s 2025-03-01 -e 2025-03-31 --charts --environment staging

# Exclude specific languages
python cli.py report metrics -s 2025-03-01 -e 2025-03-31 --charts --exclude Java Golang

# Custom date range
python cli.py report metrics -s 2025-03-10 -e 2025-03-20 --charts

# Save to database (ONLY when user explicitly requests)
python cli.py report metrics -s 2025-03-01 -e 2025-03-31 --charts --save
```

## Companion Quality Trends

The quality-trends report is the companion chart view for metrics work.

- If the user explicitly asks for quality trends, comment trends, or a broader trends/chart view, run it automatically for the same time window.
- If the user only asked for metrics, ask whether they want the quality trends chart too after presenting the metrics result.

### Translating the date window

The quality-trends command uses `--months` plus an optional `--end-date`, not a start date.
Convert the requested metrics window into an **inclusive calendar-month count**:

| Window | Use for `--months` |
|--------|--------------------|
| 2026-03-01 to 2026-03-31 | `1` |
| 2026-03-01 to 2026-03-15 | `1` |
| 2026-01-15 to 2026-03-02 | `3` |

Use the same resolved end date from the metrics request for `--end-date`.

### Quality trends command

```powershell
if (Test-Path output/charts/comment_bucket_trends.png) { Remove-Item output/charts/comment_bucket_trends.png -Force }; python cli.py report quality-trends --months <month_count> --end-date <end_date>
```

Optional additions:
- --environment staging
- --languages Python CSharp C# Java TypeScript JavaScript Go
- --exclude-human
- --neutral

After it completes, summarize the terminal output and use `view_image` to show the saved chart at `output/charts/comment_bucket_trends.png`.

## Follow-up: "Save it"

If the user asks to save after a metrics run (e.g. "okay save it", "persist that", "write to DB"), re-run the **same command** with `--save` appended. Keep all other flags identical to the previous run.

## Available Flags

| Flag | Type | Default | Description |
|------|------|---------|-------------|
| `--start-date` / `-s` | string | required | Start date (`YYYY-MM-DD`) |
| `--end-date` / `-e` | string | required | End date (`YYYY-MM-DD`) |
| `--environment` | string | `production` | `production` or `staging` |
| `--exclude` | list | none | Space-separated language names to exclude |
| `--charts` | flag | off | Generate PNG charts to `output/charts/` |
| `--save` | flag | off | Persist metrics to Cosmos DB (**never use unless user explicitly requests**) |

## Chart Outputs

When `--charts` is enabled, 4 PNGs are saved to `output/charts/`:
1. **adoption.png** — Copilot vs non-Copilot reviews by language
2. **comment_quality.png** — Comment quality breakdown (upvoted, implicit good/bad, downvoted, deleted)
3. **human_copilot_split.png** — Human vs AI comment split
4. **human_comments_comparison.png** — Human comments with vs without Copilot

## Gotchas

- **Redirect stdout to a file**: Always pipe through `| Out-File -Encoding UTF8 output/metrics_output.json` and read the file afterward. Do NOT use `>` which produces UTF-16 in PowerShell 5.1.
- **Clean up before running**: Delete the previous `output/metrics_output.json` and `output/charts/*` before running. This prevents presenting stale results if the command fails silently.
- **Do NOT use `2>&1`**: This merges stderr log lines (e.g. "Saved: ...") into the JSON output file, producing invalid JSON. Only redirect stdout.
- **Use foreground with timeout**: Run with `isBackground=false` and `timeout: 180000` (3 min). Do NOT use `isBackground=true` and poll — that causes repeated user approval prompts.
- **Use `New-Item -ItemType Directory` not `mkdir`**: `mkdir` is aliased differently across shells. Use `New-Item -ItemType Directory -Path output -Force | Out-Null` for reliable directory creation.
- **Read results with `read_file` and `view_image`**: After the command finishes, use `read_file` for the JSON and `view_image` for charts. Do NOT launch additional terminal commands to read the file.
- **Use `python cli.py` not `.\avc`**: The `avc.bat` script may resolve to system Python. Use `python cli.py report metrics ...` to ensure the correct environment.
- **Quality trends is separate**: It uses `report quality-trends` with `--months` and optional `--end-date`, not `--start-date`.
- **Month end dates**: February has 28/29 days, April/June/Sept/Nov have 30 days. Get it right.
- **Built-in exclusions**: `c`, `c++`, `typespec`, `swagger`, `xml` are always excluded automatically — no need to add them.
