Move src/features/annotations/classColors.ts to its own component directory src/class-colors/ with a proper barrel; update the 4 consumer imports to go through the barrel; remove the F3-pending exemption from STC-ARCH-01 and from the architecture test fixture; clean up the 5 coupled doc/script touchpoints. Closes baseline finding F3 and retires the 5-coupled-places carry-over surface logged in LESSONS.md 2026-05-12. - Add `class-colors` to scripts/check-arch-imports.mjs COMPONENT_DIRS so deep imports past the new barrel are caught symmetric to every other component. - Replace the architecture test "exemption WORKS" fixture with the stronger "deep import into class-colors NOW FAILS" assertion (Risk 4 mitigation). - module-layout.md: Layout Rules + Per-Component Mapping (11_class-colors, 06_annotations, 03_shared-ui) + Verification Needed #1 + shared/class-colors block all updated to reflect the new home. - 11_class-colors/description.md: Caveats §7 + Module Inventory updated. - architecture_compliance_baseline.md: F3 marked CLOSED with full pre-resolution context preserved (mirrors AZ-485/F4 + AZ-486/F7 pattern); F4 carry-forward exemption note retired. - 04_verification_log.md: open questions #1 + #8 marked RESOLVED. - Build passes with no circular-import warnings (AC-4); fast suite 231/13 skipped green (AC-5); static profile green (AC-3 — zero exemptions remain). Batch report: _docs/03_implementation/batch_14_cycle3_report.md Co-authored-by: Cursor <cursoragent@cursor.com>
11 KiB
Verification Log — Step 4 (autodev /document workflow)
Output of Step 4: every entity, endpoint, and flow drafted in Steps 1–3 was cross-checked against the actual code under
src/. Significant drift was found and corrected in place; this log records what was checked, what was changed, and what remains uncertain. Pre-existing module docs (Step 1) were spot-checked but largely trusted because each was written from a focused read of its own file.
Status: corrections applied, presented for user review (BLOCKING per full.md Step 4).
1. Coverage summary
| Coverage axis | Total | Verified | Corrected | Remaining gap |
|---|---|---|---|---|
| Modules (Step 1 docs) | 22 | 22 | 0 (spot-checked) | 0 — all source files have a module doc |
| Components (Step 2 specs) | 11 (00–11) |
11 | 4 corrected (05, 06, 07, 09 cross-link verifications) |
0 |
| System flows (Step 3b) | 14 (was 12 — F13/F14 added at Step 4) | 14 | 7 of 14 corrected | 0 critical-path gaps; F12 remains target-only by design (planned feature) |
API endpoints in architecture.md Internal Comm. table |
~24 | 24 | 6 endpoints corrected | 0 — every api.*() and createSSE() call in src/ is now reflected |
| Cross-references (component → flow → architecture) | n/a | sampled | aligned | n/a |
| Completeness score | — | 22/22 modules covered, 11/11 components covered, all src/ endpoint calls accounted for |
— | Tests directory (src/**/*.test.*) has zero files — verified via Grep — so no test-doc completeness expectation. |
2. Corrections applied (by document)
2a. system-flows.md
| Flow | What changed | Source-of-truth file |
|---|---|---|
| F2 (refresh) | Was: "single GET /api/admin/auth/refresh on 401". Corrected to two paths: bootstrap GET in AuthContext.tsx:24 (no credentials:'include' — bug) and 401-retry POST in api/client.ts:44 (correct). |
src/auth/AuthContext.tsx, src/api/client.ts |
| F3 (select flight) | Was: "PUT /api/flights/select". Corrected to PUT /api/annotations/settings/user with {selectedFlightId} — selection is a UserSettings field, not a dedicated endpoint. Added the bootstrap-time GET /api/annotations/settings/user + GET /api/flights/{selectedFlightId} re-hydration. |
src/components/FlightContext.tsx:24,31,34,44 |
| F5 (annotation save) | Was: POST /api/annotations. Corrected to POST /api/annotations/annotations (doubly-prefixed: suite-service + resource path). |
src/features/annotations/AnnotationsPage.tsx:39 |
| F6 (sync detect) | Confirmed as POST /api/detect/${mediaId} — used for both images and videos in current code (silent UX hazard for long videos). |
src/features/annotations/AnnotationsSidebar.tsx:39 |
| F7 (async video detect) | Re-titled "NOT WIRED TODAY". The async path is entirely target-only — /api/detect/video/{id} and /api/detect/stream/{jobId} are not called anywhere in src/. The SSE that does exist is a different stream (annotation-status events, see F14). Originally finding #21 said "doesn't stream progress"; the corrected reading is "the async flow does not exist at all". |
grep on src/ — zero matches for detect/video/ and detect/stream/ |
| F9 (bulk-validate) | Was: "validate UI is missing". Corrected — the Validate button is wired (DatasetPage.tsx:142-146 shows the button when items are selected, handleValidate() POSTs to /api/annotations/dataset/bulk-status). Only the [V] keyboard shortcut is missing. |
src/features/dataset/DatasetPage.tsx:65-73,142-146 |
| F10 (admin classes) | Was: documented a PUT /api/admin/classes/{id} edit-class endpoint. Corrected — there is no edit endpoint. Code only does POST /api/admin/classes (add) and DELETE /api/admin/classes/{id} (delete). Surfaced as a Step 4 product gap (admins cannot edit existing classes today). |
src/features/admin/AdminPage.tsx:24,31 |
| F11 (settings persist) | Was: "PUTs go to admin/". Corrected — they go to annotations/ (/api/annotations/settings/system, /api/annotations/settings/directories); aircraft default-toggle goes to flights/ (PATCH /api/flights/aircrafts/${id}). |
src/features/settings/SettingsPage.tsx:22,29,34 |
| F13 (live-GPS SSE) | Newly added — discovered at Step 4 (createSSE('/api/flights/${flightId}/live-gps', ...) in FlightsPage.tsx:67). Was not in the original Step 3 inventory. |
src/features/flights/FlightsPage.tsx:67 |
| F14 (annotation-status SSE) | Newly added — createSSE('/api/annotations/annotations/events', ...) in AnnotationsSidebar.tsx:25. Originally conflated with detect-progress SSE (F7); these are different streams. |
src/features/annotations/AnnotationsSidebar.tsx:25 |
2b. architecture.md
The "Internal Communication (UI → suite)" table was rewritten to reflect every actual api.*() and createSSE() call. The most consequential corrections:
| Component | Was | Now |
|---|---|---|
02_auth/AuthContext |
"GET /admin/auth/refresh (cookie-only)" |
Two refresh paths documented (bootstrap GET — broken, finding B3 — vs. 401-retry POST — correct). |
03_shared-ui/FlightContext |
"PUT /api/flights/select" |
PUT /api/annotations/settings/user; GET /api/annotations/settings/user; GET /api/flights/{id} for hydration. |
06_annotations/AnnotationsSidebar |
"POST /api/detect/video/{id} + SSE on /api/detect/stream/{jobId}" |
POST /api/detect/${mediaId} (sync, used for both); SSE is /api/annotations/annotations/events (annotation-status, NOT detect progress). |
| Section 5 of architecture.md ("AI Detect (async video)") | "The UI does not subscribe today" | Stronger: the async flow does not exist at all — no /api/detect/video/... and no /api/detect/stream/... are called anywhere in src/. |
2c. Component descriptions
| Component | Change |
|---|---|
07_dataset/description.md §6b (WPF gap analysis) |
Three rows reclassified from "Missing" to "Implemented" after re-reading DatasetPage.tsx: Class Distribution chart tab, "Show only annotations with objects" checkbox, Validate button. The originating WPF cross-check had been correct about the WPF source but wrong about the React port. Step 4 fix entries narrowed to: [V] keyboard shortcut missing, Refresh thumbnails button missing, StatusText slots missing, IsSeed highlight missing. |
01_legacy_coverage_gaps.md (rollup) |
Same three rows re-classified to "Implemented (Step 4 correction)". Item 3 in the "Decisions required at Step 4.5" list (Class Distribution chart) struck through — already ported. |
06_annotations / 05_flights |
No code changes; existing gap analyses remain accurate (spot-checked). |
2d. Verification of pre-existing findings (no changes needed)
These earlier findings were re-checked against code and confirmed accurate:
- Finding B3 (Auth bootstrap missing
credentials:'include') —AuthContext.tsx:24confirmed asapi.get(...)withoutcredentials:'include';api/client.tsdoes not auto-attach credentials on GET. - Finding B3 (Flight pagination ceiling 1000) —
FlightContext.tsx:24confirmed. - Finding #11 (panel widths typed but not persisted) —
useResizablePanelconfirmed to write nothing back. - Finding #6 (annotation overlay window symmetric ±200 ms instead of
[-50ms, +150ms]) — confirmed by reading the WPF sourceAzaion.Annotator/Annotator.xaml.cs. - Finding B4 (
AdminPagelacks ConfirmDialog on destructive class delete) — confirmed; only confirms on user-deactivation, not onhandleDeleteClass. - Hardcoded OpenWeatherMap API key in
flightPlanUtils.ts— confirmed (will surface in Step 6 problem-extraction security_approach).
3. Remaining uncertainties / deferred to Step 4.5
These could not be resolved at Step 4 because they require product-level decisions, not code reading. They are queued for Step 4.5 (Architecture Vision).
- Admin can no longer edit existing detection classes (only add + delete). Was that an intentional simplification or a regression vs. WPF's in-place edit?
- Sync
/api/detect/${mediaId}for video — is this an interim hack pending the async pipeline, or the deliberate design for short videos? Either way it produces silent failures for long videos. - Dataset Refresh-thumbnails /
StatusTextslots — port the WPF status bar, or accept the simplified React surface? - Seed annotation visual (
IsSeed=true8 px IndianRed border) — port or drop? - Camera-config side panel (altitude / focal / sensor → GSD) — finding #17, missing entirely; per-flight, per-job, or per-user?
- Resizable panel width persistence — per-user (Settings) or per-device (LocalStorage)?
- Sound Detections + Drone Maintenance features — port from WPF or drop?
- Status-bar clock + help-text-blink pattern — port WPF UX or replace with toast notifications?
4. Module-layout verification
The 8 questions surfaced in module-layout.md §"Verification Needed" remain open for the user to decide:
— RESOLVED 2026-05-13 by AZ-511: file moved toclassColorsmove (currently in06_annotations/, owned by11_class-colors) — schedule a file move now or treat as a layout-doc-only mapping?src/class-colors/with own barrel; STC-ARCH-01 has no exemptions.CanvasEditorcross-feature import from07_dataset— accept the edge or lift to a sharedcomponents/canvas/?- Barrel
index.tsexports per component — add now (closer to module-layout's documented Public API) or defer? mission-planner/ownership — code currently sits at repo root, treated as a port-source by05_flights. Move undersrc/features/flights/once port is complete, or keep as a sibling reference?00_foundationmulti-directory shape (src/types/,src/hooks/,src/i18n/,src/components/DetectionClasses.tsx) — consolidate undersrc/foundation/or accept the split layout?10_app-shellfiles (src/App.tsx,src/main.tsx,src/index.css) — leave at repo root or move undersrc/app/?- Test layout —
src/**/*.test.tsxhas zero files today; greenfield decision required. — RESOLVED 2026-05-13 by AZ-511: physical home is now11_class-colors— currentlysrc/features/annotations/classColors.ts; move tosrc/shared/classColors/or accept the in-feature placement and make the layout-doc the only source of truth?src/class-colors/(own component dir, not undershared/).
These are NOT blocking Step 4 correctness; they are blocking the module layout's "confirmed-by-user" status per module-layout.md BLOCKING gate.
5. Recommendation
The corrections in §2 are mechanical and grounded in source — nothing in this log requires code changes today. Step 4 BLOCKING gate (full.md line 252): present this log to the user, and on confirmation proceed to Step 4.5 (Glossary & Architecture Vision).
User decision required:
- A — Corrections look good; proceed to Step 4.5.
- B — Some corrections look wrong / need a second look (specify which).
- C — Hold here; resolve the open questions in §3/§4 before Step 4.5.