Adds Phase 0 (baseline metrics, .gitignore tweaks), Phase 1 (research findings, list-of-changes), and Phase 2 (refactoring roadmap, epic AZ-350, 27 task specs AZ-351..AZ-380, dependency table updates) for the 03-code-quality-refactoring run. Phase 3 (Safety Net) re-verified: 40/40 unit + 5/5 smoke integration pass; documented in test_specs/existing_coverage.md. Coverage % gating deferred to ticket C19 (AZ-372) which adds Coverlet + reportgenerator. Auto-chains to Phase 4 (Execution) via /implement starting at batch 1 (Phase 1 critical fixes). Co-authored-by: Cursor <cursoragent@cursor.com>
6.7 KiB
Phase 0 — Baseline Metrics (03-code-quality-refactoring)
Date: 2026-05-10 Mode: Automatic (user-discovered scope) Goal (user request): Assess current code, identify bad practices, produce steps to eliminate them.
Scope
- Full codebase, all 8 production/test projects.
- No specific feature change: this is a quality-focused refactor cycle, after the recent coupling refactor (
02-coupling-refactoring) closed all five Architecture-compliance findings. - Behavior preservation required: smoke + unit suite must remain green.
Refactoring Goals (Phase 0a)
These are the exit criteria that Phase 6 (Verification) will check against. They are deliberately framed in terms of categories of bad practice rather than fixed file-level changes — the precise list is produced by Phase 1.
- Code-smell inventory: every C# source file in the production projects (
Api,Common,DataAccess,Services.*) is reviewed for: error handling gaps, scope discipline (long methods / SRP violations), magic numbers, hidden side effects, async-correctness (async void, missingConfigureAwait/CancellationToken), thread-safety in hosted services, and duplication across the threeServices.*siblings. - Inventory delivered as
list-of-changes.mdwith severity (Low / Medium / High), risk, and dependencies — same template used for01-testability-refactoringand02-coupling-refactoring, so the change list is directly consumable by the implement skill. - Roadmap (Phase 2) ranks the entries by ROI (impact ÷ risk×effort) and groups them into batches that fit the 2–5-point complexity policy from the user's tracker rules.
- No regression in unit (37) or integration smoke (5 scenarios) suites at Phase 6 verification.
- Open question for Phase 0 BLOCKING gate: does the user want the run to execute (Phases 3–7) or stop after roadmap (Quick Assessment, Phases 0–2 only)?
Constraints
- No public HTTP route changes.
/api/satellite/tiles/latlon,/api/satellite/tiles/{z}/{x}/{y},/api/satellite/request,/api/satellite/routeshapes are stable. - No database schema changes (would require migration sequencing and is out of scope).
- No DI-graph re-ordering that would change observable startup behavior of the hosted services (
RegionProcessingService,RouteProcessingService). - Architecture Vision (
_docs/02_document/architecture.mdH2) is authoritative. Any proposed change that conflicts with it must be flagged, not silently accepted.
Current Code Topology
| Project | LOC (.cs, excl. bin/obj) | Files | Notes |
|---|---|---|---|
| SatelliteProvider.Api | 380 | 1 (Program.cs) |
Minimal-API endpoints + DI wiring |
| SatelliteProvider.Common | 474 | 25 | DTOs, interfaces, configs, GeoUtils |
| SatelliteProvider.DataAccess | 614 | 11 | Repositories, Entities, Migrations |
| SatelliteProvider.Services.TileDownloader | 620 | 3 | TileService, GoogleMapsDownloaderV2, DI ext. |
| SatelliteProvider.Services.RegionProcessing | 564 | 4 | RegionService, hosted service, queue, DI ext. |
| SatelliteProvider.Services.RouteManagement | 1055 | 3 | RouteService, RouteProcessingService, DI ext. ← largest unit |
| SatelliteProvider.Tests | 1221 | 6 | xUnit unit tests |
| SatelliteProvider.IntegrationTests | 1434 | 10 | Console runner, integration scenarios |
Total production C# LOC: 3 707 across 47 files (Api + Common + DataAccess + 3 × Services). Total test C# LOC: 2 655 across 16 files.
Test Coverage Baseline (carried forward + verified)
- Unit suite (
SatelliteProvider.Tests): 37[Fact]/[Theory]annotations (FINAL_report of 02-coupling claimed 40 — small discrepancy; will reconcile in Phase 6 againstdotnet test --list-tests). - Integration smoke (
scripts/run-tests.sh --smoke): 5 scenarios, last green run 2026-05-10, wall-clock 111.86 s (_docs/03_implementation/test_run_step7.md). - Coverage % not measured (no Coverlet wired up; would add as a Phase 0 sub-task only if the user wants it gating verification).
Architecture Compliance Baseline (carried forward)
_docs/02_document/architecture_compliance_baseline.md — all 5 findings Resolved by epic AZ-309. F1, F2 (High) and F3, F4 (Medium) and F5 (Low). No new architecture findings have been opened since.
Complexity / Static-Analysis Tools
Not present in this repository:
- No Coverlet / dotCover / fine-grained coverage runner.
- No
dotnet format --verify-no-changesgate. - No SonarLint / Roslyn-analyzer ruleset beyond defaults.
- No cyclomatic-complexity tool wired up.
These gaps are themselves candidate findings for Phase 1 (tooling category).
Functionality Inventory
| Endpoint / Hosted Service | Owner Project | Status | Smoke Coverage |
|---|---|---|---|
GET /api/satellite/tiles/{z}/{x}/{y} |
Api → Services.TileDownloader | live | ✓ (TileTests.RunGetTileByLatLonTest) |
GET /api/satellite/tiles/latlon |
Api → Services.TileDownloader | live | ✓ |
GET /api/satellite/tiles/mgrs |
Api | stub (returns 501) | not exercised |
POST /api/satellite/request |
Api → Services.RegionProcessing | live | ✓ (RegionTests.RunRegionProcessingTest_200m_Zoom18) |
GET /api/satellite/region/{id} |
Api → Services.RegionProcessing | live | ✓ |
POST /api/satellite/route |
Api → Services.RouteManagement | live | ✓ (BasicRouteTests.RunSimpleRouteTest, ExtendedRouteTests.RunRouteWithTilesZipTest) |
GET /api/satellite/route/{id} |
Api → Services.RouteManagement | live | ✓ |
POST /api/satellite/upload |
Api | stub (returns 501) | not exercised |
RegionProcessingService (BackgroundService) |
Services.RegionProcessing | live | exercised via region scenarios |
RouteProcessingService (BackgroundService) |
Services.RouteManagement | live | exercised via route scenarios |
Self-Verification (Phase 0)
- RUN_DIR created with auto-incremented prefix
03-. - Goals captured (5 numbered goals above).
- Constraints captured (no HTTP-shape change, no schema change, no DI reorder, Architecture Vision honored).
- Current topology measured by LOC and file count.
- Test coverage baseline noted; coverage % flagged as not measured.
- Architecture compliance baseline noted (carried from 02-coupling FINAL_report).
- Functionality inventory complete (10 endpoints + 2 hosted services).
- Tool gaps explicitly listed so Phase 1 can decide whether to fold them in.
Open Question for User (BLOCKING gate)
See the Phase 0 summary presented in chat — two decisions:
- Confirm goals and constraints above.
- Choose: full refactor run (Phases 0–7) vs. Quick Assessment (Phases 0–2 only — produces
list-of-changes.md+refactoring_roadmap.mdand stops).