4.8 KiB
4.8 KiB
UTO Manager — Development Status
Last updated: 2026-08-09
Current Branch
main (feature/phase-2-canvas-engine merged)
Overall Progress
| Phase | Title | Status |
|---|---|---|
| 1 | Domain Foundation | ✅ Complete |
| 2 | Canvas Engine & Persistence | ✅ Complete |
| 3 | Template Library & Import/Export | 🔲 Not started |
| 4 | Reporting & Analytics | 🔲 Not started |
| 5 | Multi-user / Sync | 🔲 Not started |
Phase 1 — Domain Foundation ✅
Completed items:
Echelonentity with doctrinal hierarchy validation (isValidParent,isValidChild)DoctrinalBranchentity with display namesAuthorizedRankentity with pay grade, category flags,meetsMinimum,gradeLevelDutyMosvalue object with MOS dictionary validation andunvalidatedconstructorUnitNodeentity withcopyWith,isRoot,isValidParentNodePositionSlotentity withisVacant,isFilled,isKeyLeaderPersonnelRecordentity withReadinessState,copyWith,isUnassignedUnitRepositoryabstract interfacePersonnelRepositoryabstract interfacedomain_entities.dartbarrel export- Full unit test coverage for all domain entities and value objects
Test count (Phase 1): 60 tests
Phase 2 — Canvas Engine & Persistence ✅
Completed items:
Domain Services
UnitTreeService—buildTree,getSubtree,getAncestors,validateReparent,validateAssignment,calculateFillRate,getVacantKeyLeaderSlots,getMosMismatchesAssignmentService—assign,unassign,aggregateReadinesswithReadinessColor
Infrastructure — Database
- Drift schema:
Units,PositionSlots,Personnel,Templatestables AppDatabasewithforTesting(NativeDatabase.memory())constructorUnitDao— full CRUD + watch streamsPersonnelDao— full CRUD +assignToSlot/unassignFromSlot+ watch streamsPositionSlotDao— full CRUD +assignPersonnel/clearAssignment+ watch streamsTemplateDao— full CRUD +upsertTemplate- build_runner code generation (
.g.dartfiles)
Infrastructure — Repositories
DriftUnitRepository— implementsUnitRepositorywith domain↔Drift mappingDriftPersonnelRepository— implementsPersonnelRepositorywith domain↔Drift mappingDriftPositionSlotRepository— concrete slot repository
Application — BLoC
UnitTreeCubit/UnitTreeState(sealed) — tree loading, selection, reparent, subtree deletePersonnelCubit/PersonnelState(sealed) — roster loading, filter, assign/unassignTemplateCubit/TemplateState(sealed) — template save/load/delete
Presentation
HomeScreen— three-pane adaptive layout (personnel | canvas | inspector)UtoCanvasWidget—InteractiveViewerpan/zoom org chart with drag-and-drop reparentUnitNodeCard— echelon-colored card with fill rate progress barPositionSlotCard—DragTargetslot card with MOS badge and readiness colorPersonnelListTile—Draggablesoldier tile for assignment- Status bar with live unit/slot fill counts
App Wiring
main.dart—MultiBlocProviderwiring all cubits with production database
Test count (Phase 2): 77 new tests (137 total)
Test Summary
| File | Tests | Status |
|---|---|---|
authorized_rank_test.dart |
16 | ✅ |
echelon_test.dart |
17 | ✅ |
personnel_record_test.dart |
13 | ✅ |
unit_node_test.dart |
15 | ✅ |
duty_mos_test.dart |
32 | ✅ |
assignment_service_test.dart |
16 | ✅ |
unit_tree_service_test.dart |
27 | ✅ |
widget_test.dart |
1 | ✅ |
| Total | 137 | ✅ All pass |
Known Limitations / Next Steps (Phase 3)
- Template serialization is JSON-only; no import from external formats yet
- No PDF/Excel export of readiness reports
- No multi-user or sync capability
- Canvas layout is vertical tree only; horizontal layout not yet implemented
- No undo/redo for assignment operations
- No search/filter on the canvas itself
Architecture Notes
lib/
├── domain/
│ ├── entities/ # Pure Dart domain models (no Flutter deps)
│ ├── value_objects/ # DutyMos
│ ├── repositories/ # Abstract interfaces
│ └── services/ # UnitTreeService, AssignmentService
├── infrastructure/
│ ├── database/ # Drift schema, DAOs, generated code
│ └── repositories/ # Drift-backed implementations
├── application/
│ └── blocs/ # flutter_bloc Cubits
└── presentation/
├── screens/ # HomeScreen
└── widgets/ # Canvas, cards, tiles