# Structural Snapshot — 2026-05-13 (Phase B Cycle 3 close) **Cycle**: Phase B, cycle 3 (`state.cycle = 3`) **Source-of-truth files**: `_docs/02_document/module-layout.md`, `_docs/02_document/architecture_compliance_baseline.md`, `scripts/check-arch-imports.mjs`, `scripts/run-tests.sh`, `src/api/endpoints.test.ts`. **Previous snapshot**: `_docs/06_metrics/structure_2026-05-12.md` (Phase B cycle 1 close). ## Component Inventory | Metric | Cycle 1 close | Cycle 3 close | Δ | |--------|--------------|--------------|---| | Component count | 12 | 12 | 0 | | Components with Public API barrels | 11 | 11 | 0 | | Barrel coverage (eligible components) | 11 / 11 = 100 % | 11 / 11 = 100 % | 0 | | Documented feature→feature edges (grandfathered) | 1 (`07_dataset → 06_annotations`) | 1 (unchanged) | 0 | | Documented STC-ARCH-01 carve-out exemptions | 1 (`classColors` direct path) | **0** | **−1** ✓ | | Cycles in component import graph | 0 | 0 | 0 | The single STC-ARCH-01 exemption that survived cycles 1–2 is gone. AZ-511 carved out `classColors` to its own `src/class-colors/` component with a public barrel, and `scripts/check-arch-imports.mjs` `ARCH_IMPORTS_EXEMPT_RE` now equals `null`. The 5-coupled-places carry-over surface logged in cycle 1's retro is fully retired. ## Architecture Gates (cycle 3 close) | Gate | Added in | Enforces | Status (cycle 3 close) | |------|----------|----------|------------------------| | `STC-ARCH-01` | Cycle 1 / AZ-485 | No cross-component deep imports; barrels are the Public API | PASS (now with **zero exemptions**) | | `STC-ARCH-02` | Cycle 1 / AZ-486 | No hardcoded `/api//...` literals in production source | PASS | | `STC-SEC1C` | Cycle 2 / AZ-499 | Banned literal: OpenWeatherMap key | PASS | | `STC-SEC1D` | Cycle 2 / AZ-501 | Banned literal: Google Geocode key | PASS | Total commit-time static gates: **33** (cycle 2 close = 33; cycle 3 close = 33 — no new gates this cycle). STC-ARCH-01 was *strengthened* (exemption removed), not added new. ## Architecture Baseline Delta vs `architecture_compliance_baseline.md` | Finding | Category | Cycle 1 close | Cycle 2 close | Cycle 3 close | |---------|----------|---------------|---------------|---------------| | F1 — mission-planner vs flights duplication | Architecture | Open | Open | Open | | F2 — cross-feature edge `07_dataset → 06_annotations` | Architecture | Open (grandfathered) | Open | Open | | F3 — classColors physical/logical owner split | Architecture | Open | Open | **RESOLVED (AZ-511)** | | F4 — No Public API barrels | Architecture | RESOLVED (AZ-485) | RESOLVED | RESOLVED | | F5 — Pre-existing cycle inside `mission-planner` | Architecture | Open | Open | Open | | F6 — No `src/shared/` | Architecture | Open | Open | Open | | F7 — Hardcoded `/api//` literals | Architecture | RESOLVED (AZ-486) | RESOLVED | RESOLVED | | F8 — Layering-table inconsistency | Architecture | Open | Open | Open | | F9 — Inert second Vite entry tree | Architecture | Open | Open | Open | Plus the per-cycle verification-log finding **B3** (Auth bootstrap missing `credentials:'include'`) was tracked in `_docs/02_document/04_verification_log.md` and **closed by AZ-510 in cycle 3**. - **Resolved this cycle**: 1 baseline finding (F3) + 1 verification-log finding (B3) - **Newly introduced this cycle**: 0 - **Architecture findings open at cycle 3 close**: 6 of 9 baseline (F1, F2, F5, F6, F8, F9) - **Net architecture delta cycle 3**: −1 baseline (improvement) ## Contract Coverage - `_docs/02_document/contracts/` does NOT exist; project uses **code-derived contracts pattern** via `src/api/endpoints.test.ts`. - Wire-contract assertions count: cycle 1 = 36, cycle 2 = 36, cycle 3 = **37** (+1; AZ-510 added `endpoints.admin.usersMe()`). ## Test Suite Snapshot | Profile | Cycle 1 close | Cycle 2 close | Cycle 3 close | Δ vs cycle 2 | |---------|---------------|---------------|---------------|--------------| | Fast (count) | 209 PASS / 13 SKIP / 0 FAIL | 229 PASS / 13 SKIP / 0 FAIL | **231 PASS / 13 SKIP / 0 FAIL** | +2 PASS, 0 SKIP | | Static (gates) | 31 / 31 PASS | 33 / 33 PASS | 33 / 33 PASS | 0 | | Build | green (no circular warnings) | green | green | 0 | | Bundle (gzipped initial JS) | not measured | 290 465 B | **290 575 B** | +110 B (+0.04 %) | Bundle delta is well within budget (≤ 2 097 152 B threshold; ~14 % utilization). ## Cycle 3 Source-of-Truth Mutations | File / area | Mutation | Driver | |-------------|----------|--------| | `src/auth/AuthContext.tsx` | POST refresh + chained `/users/me` + module-scoped `bootstrapInflight` + test-only reset hook | AZ-510 (B3 / Vision P3) | | `src/auth/index.ts` | Re-exports `__resetBootstrapInflightForTests` | AZ-510 (STC-ARCH-01 compliance) | | `src/api/endpoints.ts` | Added `usersMe: () => '/api/admin/users/me'` builder | AZ-510 (STC-ARCH-02 compliance) | | `src/class-colors/` | New component directory: `classColors.ts` (`git mv` from `src/features/annotations/`) + `index.ts` (new barrel) | AZ-511 (F3) | | `src/components/DetectionClasses.tsx`, `src/features/annotations/{CanvasEditor,AnnotationsSidebar,AnnotationsPage}.tsx` | Import path swap to barrel | AZ-511 (F3) | | `src/features/annotations/index.ts` | Removed F3 carry-over comment block | AZ-511 (cleanup) | | `scripts/check-arch-imports.mjs` | `ARCH_IMPORTS_EXEMPT_RE = null`; `class-colors` added to `COMPONENT_DIRS` | AZ-511 (gate strengthening) | | `tests/architecture_imports.test.ts` | AC-4 inverted to assert deep imports FAIL | AZ-511 (regression guard) | ## Sources - `_docs/03_implementation/batch_13_cycle3_report.md` (AZ-510) - `_docs/03_implementation/batch_14_cycle3_report.md` (AZ-511) - `_docs/03_implementation/batch_15_cycle3_report.md` (AZ-512 deferred) - `_docs/03_implementation/implementation_report_auth_classcolors_cycle3.md` - `_docs/03_implementation/implementation_completeness_cycle3_report.md` - `_docs/03_implementation/deploy_cycle3_report.md` - `_docs/05_security/security_report_cycle3_delta.md` - `_docs/02_document/module-layout.md` - `_docs/02_document/architecture_compliance_baseline.md`