Files
ui/_docs/02_document/04_verification_log.md
T
Oleksandr Bezdieniezhnykh c368f60853 [AZ-511] classColors carve-out to src/class-colors/ (closes F3)
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>
2026-05-13 03:08:36 +03:00

11 KiB
Raw Blame History

Verification Log — Step 4 (autodev /document workflow)

Output of Step 4: every entity, endpoint, and flow drafted in Steps 13 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 (0011) 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 addedcreateSSE('/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:24 confirmed as api.get(...) without credentials:'include'; api/client.ts does not auto-attach credentials on GET.
  • Finding B3 (Flight pagination ceiling 1000) — FlightContext.tsx:24 confirmed.
  • Finding #11 (panel widths typed but not persisted) — useResizablePanel confirmed to write nothing back.
  • Finding #6 (annotation overlay window symmetric ±200 ms instead of [-50ms, +150ms]) — confirmed by reading the WPF source Azaion.Annotator/Annotator.xaml.cs.
  • Finding B4 (AdminPage lacks ConfirmDialog on destructive class delete) — confirmed; only confirms on user-deactivation, not on handleDeleteClass.
  • 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).

  1. 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?
  2. 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.
  3. Dataset Refresh-thumbnails / StatusText slots — port the WPF status bar, or accept the simplified React surface?
  4. Seed annotation visual (IsSeed=true 8 px IndianRed border) — port or drop?
  5. Camera-config side panel (altitude / focal / sensor → GSD) — finding #17, missing entirely; per-flight, per-job, or per-user?
  6. Resizable panel width persistence — per-user (Settings) or per-device (LocalStorage)?
  7. Sound Detections + Drone Maintenance features — port from WPF or drop?
  8. 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:

  1. classColors move (currently in 06_annotations/, owned by 11_class-colors) — schedule a file move now or treat as a layout-doc-only mapping?RESOLVED 2026-05-13 by AZ-511: file moved to src/class-colors/ with own barrel; STC-ARCH-01 has no exemptions.
  2. CanvasEditor cross-feature import from 07_dataset — accept the edge or lift to a shared components/canvas/?
  3. Barrel index.ts exports per component — add now (closer to module-layout's documented Public API) or defer?
  4. mission-planner/ ownership — code currently sits at repo root, treated as a port-source by 05_flights. Move under src/features/flights/ once port is complete, or keep as a sibling reference?
  5. 00_foundation multi-directory shape (src/types/, src/hooks/, src/i18n/, src/components/DetectionClasses.tsx) — consolidate under src/foundation/ or accept the split layout?
  6. 10_app-shell files (src/App.tsx, src/main.tsx, src/index.css) — leave at repo root or move under src/app/?
  7. Test layout — src/**/*.test.tsx has zero files today; greenfield decision required.
  8. 11_class-colors — currently src/features/annotations/classColors.ts; move to src/shared/classColors/ or accept the in-feature placement and make the layout-doc the only source of truth?RESOLVED 2026-05-13 by AZ-511: physical home is now src/class-colors/ (own component dir, not under shared/).

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.