Captures the full output of autodev existing-code Phase A through Step 4 (Code Testability Revision) for the Azaion UI workspace: - Step 1 Document: _docs/02_document/ (FINAL_report, architecture, glossary, components/, modules/, diagrams/, system-flows, module-layout) plus _docs/00_problem/ + _docs/01_solution/ + _docs/legacy/ + _docs/how_to_test + README. - Step 2 Architecture Baseline: architecture_compliance_baseline.md. - Step 3 Test Spec: _docs/02_document/tests/ (environment, test-data, blackbox/performance/resilience/security/ resource-limit tests, traceability-matrix), enum_spec_snapshot, expected_results/results_report.md (98 rows), plus the run-tests.sh + run-performance-tests.sh runners. - Step 4 Code Testability Revision: 01-testability-refactoring/ run dir (list-of-changes C01-C07, deferred_to_refactor, analysis/research_findings + refactoring_roadmap) and the 7 child task specs AZ-448..AZ-454 under _docs/02_tasks/todo/ plus _dependencies_table.md. - _docs/_autodev_state.md pins the cursor at Step 4 / refactor Phase 4 entry so /autodev resumes cleanly. Epic AZ-447 (UI testability gates) tracks the 7 child tasks that will land in subsequent commits. Co-authored-by: Cursor <cursoragent@cursor.com>
8.5 KiB
Legacy Coverage Gaps — React UI vs WPF Era
Output of the autodev Step 2 BLOCKING-gate cross-check (2026-05-10). Compares the current React port (this repo) against the legacy WPF source preserved at
/Users/obezdienie001/dev/azaion/suite/annotations-research/(commit22529c2, the last commit before the WPF→.NET-API "big refactoring"). The source-of-truth narrative is_docs/legacy/wpf-era.md; this document lists the delta — features that exist in the WPF source but are not yet present (or are broken) in the React port.Each gap is owned by one component. Per-component gap tables live in the respective
_docs/02_document/components/<NN>_<name>/description.md§6b sections. This document is the single-page rollup for review.What this document is NOT: it does not re-litigate features that
_docs/legacy/wpf-era.md §11declares "intentionally NOT being ported" (DI host, LibVLCSharp, ZeroMQ, the Azaion.LoaderUI handoff, the binary-split key-fragment dance, the Cython sidecars). Those gaps are by design.
Coverage matrix
| WPF concept (where it lived) | Status in React port | Owner component |
|---|---|---|
| Module switcher (Suite + IAzaionModule + SVG icon) | Covered by Header.tsx top nav |
03_shared-ui |
| Dark navy/blue + orange-accent color scheme | Covered by index.css az-* tokens |
03_shared-ui (theme) |
| Login → encrypted-creds handoff | Intentionally not ported (browser uses JWT) | 04_login |
| Detection-class strip + PhotoMode + 1–9 shortcut | Covered | 03_shared-ui/DetectionClasses + 11_class-colors |
yoloId = classId + photoModeOffset |
Covered in 11_class-colors |
11_class-colors |
| Annotator: bbox draw / 8-handle resize | Covered | 06_annotations/CanvasEditor |
| Annotator: Ctrl-multi-select / Ctrl-wheel zoom / Ctrl-drag pan | Partially missing (multi-select unverified, pan/zoom flagged) | 06_annotations/CanvasEditor |
| Annotator: time-windowed overlay (50 ms before / 150 ms after) | Wrong (symmetric ±200 ms, finding #6) | 06_annotations/CanvasEditor |
| Annotator: video play/pause + frame-by-frame stepping | Partially covered (controls exist; per-frame counts unverified vs FPS) | 06_annotations/VideoPlayer |
Annotator: keyboard shortcuts [Space] / [Left] / [Right] / [Enter] / [Del] / [X] / [M] / [R] / [K] |
Missing | 06_annotations (multiple modules) |
| Annotator: volume slider | Missing | 06_annotations/VideoPlayer |
| Annotator: status bar — clock + help text + status text | Missing | 06_annotations (or shell-level toast) |
| Annotator: AI-Detect button + modal progress | Partial — sync-image works; video AI-Detect is fire-and-forget, no SSE subscription, no progress UI (findings #21–23, #30) | 06_annotations/AnnotationsSidebar |
| Annotator: Sound Detections feature ("show objects from audio analysis") | Intentionally not ported (Step 4.5 decision 2026-05-10) | — |
| Annotator: Drone Maintenance feature ("Аналіз стану БПЛА") | Intentionally not ported (Step 4.5 decision 2026-05-10) | — |
| Annotator: camera-config side panel (altitude / focal / sensor → GSD) | Missing (finding #17) | 06_annotations/AnnotationsPage |
| Annotator: GPS panel toggle below canvas | Moved to 05_flights GPS-Denied sub-page (per user direction) |
05_flights |
| Annotator: affiliation icons + combat-readiness indicator on bbox label | Missing (findings #14–15; AFFILIATION_COLORS exists but is dead code) |
06_annotations/CanvasEditor |
Annotator: annotation-row gradient (alpha ∝ confidence; empty bg #40DDDDDD) |
Wrong — alpha caps at 16 % (finding #9, hex/decimal mistake) | 06_annotations/AnnotationsSidebar |
| Annotator: media-list filter / search | Covered (debounced) | 06_annotations/MediaList |
Annotator: media-list blob: previews |
Bug (#25 — local previews ignore filter) | 06_annotations/MediaList |
| Annotator: virtualised media list | Missing (finding #26) | 06_annotations/MediaList |
| Annotator: "open folder" file menu | Intentionally not ported (web upload via dropzone) | 06_annotations |
| Annotator: help window with 6 quality rules | Covered (HelpModal) but rules are hardcoded in source — Step 4 i18n |
03_shared-ui/HelpModal |
| Dataset: thumbnail grid + filter | Covered but not virtualised (finding #3) | 07_dataset |
| Dataset: 3-tab layout (Annotations / Editor / Class Distribution) | Implemented (Step 4 correction — DatasetPage.tsx:151 has all three tabs; loadDistribution() calls /api/annotations/dataset/class-distribution. Verify bar tint matches classColors.) |
07_dataset |
| Dataset: "Show only annotations with objects" checkbox | Implemented (Step 4 correction — DatasetPage.tsx:110-114, state objectsOnly) |
07_dataset |
Dataset: Validate button (bulk validate to Validated status) |
Implemented (Step 4 correction — DatasetPage.tsx:142-146 button when selectedIds.size > 0); [V] keyboard shortcut still missing. |
07_dataset |
| Dataset: Refresh thumbnails button + progress | Missing (finding #2) | 07_dataset |
Dataset: SelectedAnnotationName + StatusText status-bar slots |
Missing | 07_dataset |
Dataset: seed annotation 8 px border highlight (IsSeed=true) |
Missing | 07_dataset |
| Dataset: keyboard shortcuts (1–9, Enter, Del, X, V, arrows, PgUp/PgDn, Esc) | Missing (finding #1) | 07_dataset |
| Dataset: inline editor saves | Broken (finding #4) | 07_dataset + 06_annotations/CanvasEditor |
| Cross-cutting: resizable panel widths persisted per user | Not persisted (finding #11) | 00_foundation/useResizablePanel + Settings backend |
| Cross-cutting: Ukrainian + English localisation | Covered (react-i18next w/ en.json + ua.json) — surface area to verify against legacy translations.json (only 6 keys, but XAML hardcoded UA strings everywhere). |
00_foundation/i18n |
| Cross-cutting: confirmation dialogs (delete-media / delete-selected / delete-all / deactivate-user) | Component covered (ConfirmDialog); some destructive actions still bypass it (08_admin handleDeleteClass finding) |
03_shared-ui/ConfirmDialog + 08_admin |
Decisions taken at Step 4.5 (Architecture Vision, 2026-05-10)
The Step 4.5 user review resolved the product-level decisions that were pending here. Summary:
Sound Detections feature— Dropped (intentionally not ported).Drone Maintenance feature— Dropped (intentionally not ported).Class Distribution chart— already ported (Step 4 correction).- Status bar with clock + help-text-blink pattern — still open, deferred to a Phase B cycle (low priority — replace with toast unless a downstream cycle picks it up explicitly).
- Seed annotation concept (
IsSeed=truehighlight) — still open, deferred to a Phase B cycle (need to verify whether the modern API still exposesisSeed). - Camera config persistence — still open, deferred to the Phase B cycle that ports the camera-config side panel from
mission-planner/. - Resizable panel width persistence — Persist as part of
UserSettings(Step 4 fix; principle P11 inarchitecture.mdArchitecture Vision).
Additional Step 4.5 resolutions not from this rollup but recorded for traceability:
- Spec is source of truth for numeric enums with inline comments per value (principle P9).
- OpenWeatherMap API key moves to
.env(principle P10; Step 4 fix candidate). - Admin can edit detection classes — re-introduce
PATCH /api/admin/classes/{id}and the in-place edit form (principle P12). - Mission-planner convergence — flag at Step 2 (Architecture Baseline), spec at Step 3 (Test Spec), port across Phase B cycles, delete tree in final cycle (recorded in
architecture.mdArchitecture Vision).
Where to find the per-component detail
_docs/02_document/components/06_annotations/description.md§6b — Annotations gap table (~17 entries)_docs/02_document/components/07_dataset/description.md§6b — Dataset gap table (~12 entries)- Other components (
00_foundation,01_api-transport,02_auth,03_shared-ui,04_login,05_flights,08_admin,09_settings,10_app-shell,11_class-colors) have no WPF-source delta — either no WPF analog (most), or already covered (Header / module switcher / DetectionClasses / 11_class-colors) per_docs/legacy/wpf-era.md §10.