# V2 Combat Frame-Budget Gate

`V2/ue/Tools/check-frame-budget.py` enforces the P0 combat frame budget for
Unreal profiling exports. The PR gate runs it after V2 automation tests on the
Win64 reference runner and fails when any combat frame is greater than
`16.6 ms`.

Run the tool from the repository root:

```bash
python3 V2/ue/Tools/check-frame-budget.py --self-test
python3 V2/ue/Tools/check-frame-budget.py V2/ue/Saved/Profiling/FrameBudget --required
```

The checker accepts `.json` and `.csv` files. A row or object is considered a
combat frame when it is under a combat-labeled JSON collection or carries a
combat marker such as `phase: Combat`, `category: Combat`, `combatFrame: true`,
or a `scope` / `stat` / `name` containing `V2Combat`. It reads millisecond
values from columns or fields such as `frameTimeMs`, `durationMs`, `totalMs`,
`gameThreadMs`, and `combatFrameMs`.

The CI workflow also executes `--self-test`, which verifies that the included
good fixture passes and the included over-budget fixture fails.
