# Deploy Report — Cycle 9 (AZ-1074 + AZ-1075)

**Date**: 2026-06-25
**Cycle**: 9
**Scope**: gRPC RouteTileDelivery streaming service (AZ-1074) + integration test coverage (AZ-1075).

## What is shipping

### Code changes (uncommitted on `dev` at report time)

| Area | Change |
|------|--------|
| `SatelliteProvider.GrpcContracts/` | New shared project — `tile_provision.proto`, GrpcServices=Both |
| `SatelliteProvider.Api/Grpc/RouteTileDeliveryGrpcService.cs` | `[Authorize]` streaming RPC; generic internal error to client |
| `SatelliteProvider.Api/Program.cs` | `AddGrpc` (16 MiB recv / 64 MiB send); `MapGrpcService` after auth |
| `RouteTileDeliveryOrchestrator` | Collection caps (500/50/5000); lat/lon validation |
| Integration tests | `RouteTileDeliveryGrpcTests`, `GrpcTestHelpers`; standalone `docker-compose.tests.yml` |
| Docs / security | Cycle-9 module docs, traceability, security reports + hardening |

### Database migrations

**None.**

### Configuration changes

| Setting | Change |
|---------|--------|
| New env vars | **None** — gRPC uses existing JWT auth |
| `docker-compose.tests.yml` | Self-contained test stack (no host port publish) |
| Container image | Same base `mcr.microsoft.com/dotnet/aspnet:10.0`; Dockerfile copies GrpcContracts |

### Contract changes (consumer-visible)

| Contract | Change | Consumer action |
|----------|--------|-----------------|
| gRPC `RouteTileDelivery.DeliverRouteTiles` | **New** — server-streaming tile delivery | Clients import `SatelliteProvider.GrpcContracts`; Bearer/metadata auth required |
| REST endpoints | Unchanged wire shape | No action |

## Verification gates passed in this cycle

| Gate | Result | Evidence |
|------|--------|----------|
| Step 11 — Functional tests | **PASS** | 448 unit + integration exit 0 (`scripts/run-tests.sh --full`) |
| Step 12 — Test-Spec Sync | **PASS** | BT-32 gRPC scenarios; traceability matrix updated |
| Step 13 — Update Docs | **PASS** | `api_program.md`, `tests_integration.md`, `module-layout.md`, ripple log |
| Step 14 — Security Audit | **PASS** (delta) | `security_report_cycle9.md`; F-AZ1074-1/2 resolved in follow-up |
| Step 15 — Performance Test | **PASS** | `perf_2026-06-25_cycle9.md` — 8/8 REST scenarios, exit 0 |

## Outstanding carry-overs (unchanged)

- F-AZ795-1, F-AZ795-2 — REST error message sanitization
- D-AZ795-1 — FluentValidation 12.0.0 → 12.1.1
- D2-cy4 — test SDK transitive advisory

## Operator runbook

1. **Commit and push** cycle-9 changes to `origin/dev`; confirm Woodpecker `01-test` green.
2. **No migration** — deploy new image only.
3. **Smoke-test** after deploy:
   - REST: existing endpoints (401 without JWT, 200 with JWT)
   - gRPC: `DeliverRouteTiles` with valid JWT — expect manifest + tile chunks or InvalidArgument on bad input
4. **Ingress**: ensure HTTP/2 (gRPC) is forwarded if clients connect through ingress; dev stack uses TLS on 18980.

## Recommended follow-up PBIs

| Estimate | Title |
|----------|-------|
| 3 SP | PT-10 gRPC stream latency / backpressure perf scenario |
| 2 SP | REST error sanitizer pass (F-AZ795-1/2) |
| 1 SP | FluentValidation 12.0.0 → 12.1.1 (D-AZ795-1) |
| 1 SP | Document postgres port conflict workaround for parallel dev stacks |

**Verdict**: Cleared for Step 16.5 (Release) pending operator commit/push and environment selection.
