# Structural Snapshot — 2026-05-11 (post-cycle 1, AZ-484)

This snapshot is the baseline for future retro deltas. Source of truth: `_docs/02_document/module-layout.md` + on-disk `*.csproj` graph.

## Components

| Layer | Component | csproj | Public symbols |
|-------|-----------|--------|----------------|
| 1 (Foundation) | Common | `SatelliteProvider.Common` | DTOs, Enums (`RegionStatus`, `RoutePointType`, `TileSource` + `TileSourceConverter`), Configs (4), Interfaces, Exceptions, Utils, Imaging |
| 1 (Foundation) | DataAccess | `SatelliteProvider.DataAccess` | 4 Models, 3 Repositories + 3 interfaces, `DatabaseMigrator`, `DapperEnumTypeHandlers` |
| 3 (Application) | TileDownloader | `SatelliteProvider.Services.TileDownloader` | `GoogleMapsDownloaderV2`, `TileService`, DI ext. |
| 3 (Application) | RegionProcessing | `SatelliteProvider.Services.RegionProcessing` | `RegionService`, `RegionProcessingService`, `RegionRequestQueue`, DI ext. |
| 3 (Application) | RouteManagement | `SatelliteProvider.Services.RouteManagement` | `RouteService`, `RouteProcessingService`, `RouteSummaryWriter`, DI ext. |
| 4 (API / Entry) | WebApi | `SatelliteProvider.Api` | `Program`, `GlobalExceptionHandler`, `CorsConfigurationValidator`, DTOs, Swagger |

**Component count**: 6 (unchanged from cycle 0 baseline)

## Cross-Component Import Edges (compile-time `ProjectReference`)

| From | To |
|------|-----|
| DataAccess | Common |
| TileDownloader | Common |
| TileDownloader | DataAccess |
| RegionProcessing | Common |
| RegionProcessing | DataAccess |
| RouteManagement | Common |
| RouteManagement | DataAccess |
| WebApi | Common, DataAccess, TileDownloader, RegionProcessing, RouteManagement |

**Edge count**: 12 ProjectReference edges (unchanged from cycle 0 baseline). No cross-sibling Layer-3 ProjectReferences (siblings communicate through `Common.Interfaces`).

## Source-import sites by component

| Importer | Imports from | Site count | Cycle 1 delta |
|----------|--------------|------------|---------------|
| DataAccess | `Common.Enums` | 6 (was 5) | +1 — `Models/TileEntity` references `TileSourceConverter.GoogleMapsWireValue` const for the AZ-484 default value |
| DataAccess | `Common.Configs` | 1 (`MapConfig.DefaultTileSizePixels` in `TileRepository`) | unchanged |
| DataAccess | `Common.Utils` | 1 (`GeoUtils.*` in `TileRepository`) | unchanged |
| TileDownloader | `Common.Enums` | 1 (was 0) | +1 — `TileService` references `TileSource` + `TileSourceConverter` (AZ-484) |

## Graph properties

- **Cycles in component import graph**: 0 (clean DAG — unchanged)
- **Average ProjectReferences per component**: 12 / 6 = 2.0
- **Max in-degree**: Common (5 in-edges from DataAccess + 4 Layer-3 components + WebApi)
- **Max out-degree**: WebApi (5 out-edges)

## Architecture violations

- **Newly introduced this cycle**: 0 (per code-review batch_25_cycle1_review Phase 7)
- **Resolved this cycle**: 0
- **Net delta**: 0 (good)
- **Outstanding High/Critical from baseline**: see `_docs/02_document/architecture_compliance_baseline.md`

## Contracts

| Contract | Path | Status | Public API symbols covered |
|----------|------|--------|----------------------------|
| tile-storage v1.0.0 | `_docs/02_document/contracts/data-access/tile-storage.md` | **frozen** (this cycle) | `tiles` table schema, `ITileRepository.{InsertAsync, UpdateAsync, GetByTileCoordinatesAsync, GetTilesByRegionAsync}` selection rule, `TileSource` value space |

**Contract count**: 1 (was 0 — first frozen contract this cycle).
**Public-API symbols covered**: storage layer formally specified. The other Common/Interfaces (ITileService, IRegionService, IRouteService, IRegionRequestQueue) and HTTP endpoints remain unspecified.
**Contract coverage %**: ~14% (1 frozen contract / ~7 candidate contract surfaces). Improvement target for future cycles.

## Shared / Cross-Cutting (Common subfolders)

| Folder | Used by ≥2 components? | Health |
|--------|------------------------|--------|
| Common/DTO | yes (all components) | healthy |
| Common/Enums | yes (DataAccess, TileDownloader, RegionProcessing, RouteManagement, Tests) | healthy — `TileSource` + `TileSourceConverter` raise utilization vs. cycle 0 |
| Common/Configs | yes (all components) | healthy |
| Common/Interfaces | yes (all Layer-3 components implement; WebApi consumes via DI) | healthy |
| Common/Utils | yes (TileDownloader, RegionProcessing, RouteManagement, DataAccess) | healthy |
| Common/Exceptions | yes (TileDownloader throws `RateLimitException`) | healthy |
| Common/Imaging | no — TileGridStitcher used only by RouteManagement (and tests) | **watch** — borderline; if no second consumer emerges by cycle 3, consider relocating to RouteManagement |

## Auto-lesson triggers checked

- [x] Net Architecture delta this cycle (0) — no `architecture` lesson triggered
- [x] No structural metric regressed by >20% — no `architecture` / `dependencies` lesson triggered
- [x] Contract coverage % did not decrease (it increased — went from 0 to 1 frozen contract) — no `architecture` lesson triggered
