# 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