`ttm.py` is in the folder, and `output/ttm.json` is written from `--period 2025-06`. The script exited 0 and the identity check passed. I left `bva.py` untouched.

For `--period 2025-06` the window is July 2024 to June 2025, with 12 monthly revenue rows. The output reads:

> TTM July 2024 to June 2025 revenue $11.3M vs budget $11.5M, variance ($157K); operating income $485K vs $598K, variance ($113K); reconciles.

The monthly revenue variances sum to the same ($157K) as the window figure, and the line variances sum to the operating-income variance.

**What changed from `bva.py`:**
- **Input:** `--input` now takes one or more files and defaults to `data/pnl_fy2024.csv` and `data/pnl_fy2025.csv` next to the script. The files are read together, so a repeated period and line, or a line whose category changes, is caught across the two files as well as within one.
- **Window:** it is the twelve months ending at `--period`. If any of the twelve is missing, the script exits 2. For example, `--period 2024-06` fails because 2023-07 isn't in the data.
- **Labels and file fields:** the window label reads "TTM July 2024 to June 2025", and `input.file` lists both file names. The sha256 is over both files' bytes, in order.
- **Peaks:** the running variance now starts at the window's first month instead of January.

**Unchanged:** the JSON structure, the `display` formats, exit codes 0, 2 and 3, and the identity checks.

I kept the `ytd` keys and `months_ytd` in the JSON so the shape matches `bva.py`'s. In `ttm.py` they hold the twelve-month window, which `ttm.py`'s docstring notes. If you'd rather rename them to `ttm` and `months_ttm`, that is a small change, but it would break compatibility with anything that reads `bva.py`'s shape.