Files
satellite-provider/_docs/06_metrics/structure_2026-05-11.md
T
Oleksandr Bezdieniezhnykh 18609656f9
ci/woodpecker/push/01-test Pipeline was successful
ci/woodpecker/push/02-build-push Pipeline was successful
[AZ-484] Cycle 1 Step 17 Retrospective: report + structural snapshot
Closes the AZ-484 cycle:
- retro_2026-05-11.md: 5 patterns identified (code-review-PASS does
  not imply runtime PASS; spec-authorship under-specifies wire
  format / test sites; NFR test-spec entries decoupled from runner
  scripts; pre-existing module doc staleness; pre-existing security
  Mediums now visible). Top-3 actions ranked by impact, with target
  rule/skill files and owners.
- structure_2026-05-11.md: baseline structural snapshot for future
  retro deltas (6 components, 12 ProjectReference edges, 0 cycles
  in import graph, 0 net architecture violations, 1 frozen
  contract, ~14% contract coverage).
- LESSONS.md: header rewritten to describe the two-layer format
  (deep lessons + 15-entry ring buffer); appended 3 new ring-buffer
  entries (testing/process/estimation) sourced from this retro.
- _autodev_state.md: cycle 2 starting at Step 9 New Task.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-11 10:08:47 +03:00

83 lines
5.0 KiB
Markdown

# 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