# Performance Report — Cycle 12

**Date**: 2026-06-26
**Cycle**: 12 (AZ-1124 PT-10 gRPC stream perf)
**Runner**: `scripts/run-performance-tests.sh` (default: `PERF_REPEAT_COUNT=20`, `PERF_UAV_BATCH_SIZE=10`, `PERF_PT10_SLOW_MS=50`)
**Stack**: `docker compose -f docker-compose.yml -f docker-compose.perf.yml up -d --build`
**API_URL**: `https://localhost:18980`
**Verdict**: **PASS** (11/11 thresholds; exit 0)

## PT-10 (new — AZ-1124)

| Metric | p50 | p95 | Threshold | Verdict |
|--------|-----|-----|-----------|---------|
| first_batch_ms | 43 ms | 48 ms | ≤ 30000 ms | Pass |
| total_stream_ms | 43 ms | 48 ms | ≤ 120000 ms | Pass |
| slow-consumer | — | — | completes without DeliveryError | Pass |

Warm compose volume — iterations 2–20 served cached tiles; iteration 1 cold path 150 ms first batch.

## REST scenarios (PT-01..PT-08)

All passed on warm volume. Notable: PT-07 cold p95=106 ms, warm p95=65 ms (warm faster).

## Step 15 fix applied during gate

First run failed PT-10: `CreateFromPemFile(api.crt)` rejected cert-only PEM on host-side gRPC channel. Fixed in `GrpcTestHelpers.CreateChannel` — load CA via `X509Certificate2.CreateFromPem(File.ReadAllText(...))`. Re-run green.
