MoveLibrary

feature

Breakdex::Arsenal::MoveLibrary

CRUD for breakdancing moves with video attachment

The atomic unit of the app. A move is one breakdancing technique with a name, category, optional video, and a learning state tracked by FSRS. Everything else — combos, reviews, flow graph — depends on moves existing first.

Relationships

Depends On 3

moves_daovideo_servicenative_video_import_plugin

Reads From 3

moves_tablefsrs_cards_tablecombos_table

Writes To 1

moves_table

Renders With 3

move_list_screenmove_detail_screenvideo_player_widget

Edited By 3

add_move_flowvideo_editor_screensettings_categories

Configured By 3

view_mode_providersearch_query_providerarsenal_segment_provider

Breaks If 3

moves_table_schema_changesvideo_path_resolver_breaksdrift_migration_fails

Validated By 2

moves_dao_testmaestro_navigation_flow

Data Access

\u2605 Owns 1

moves_table

\u2190 Reads 3

moves_tablefsrs_cards_tablecombos_table

\u2192 Writes 1

moves_table

Routes

/moves/moves/move/:id

Answers

States

StateBehavior
archived
afterGrace: hard_delete
gracePeriod: 30 days
hiddenFrom: [ "move_list", "review_queue", "flow_graph" ]
visibleIn: [ "recently_deleted_screen" ]
error
renders: error_text
shows: sliver_fill_remaining
loading
renders: circular_progress_indicator
shows: sliver_fill_remaining
no Moves
allows: [ "add_move_flow", "import_from_photos" ]
message: Tap + to add your first move
shows: empty_illustration
no Video
allows: [ "name", "category", "review", "combo_membership" ]
blocks: [ "video_playback", "video_export", "move_analysis" ]
fallsBackTo: category_color_card
shows: placeholder_thumbnail
search No Results
message: No moves match your search
shows: empty_state_variant

Invariants

Move names are unique (case-insensitive) across moves AND combos

Enforced by: sqlite_trigger

Video paths stored as relative, resolved to absolute at read time

Enforced by: video_path_resolver

Every move gets an FSRS card on first review, not on creation

Enforced by: fsrs_cards_dao_ensure_card

Preferences

Prefer move_repository over moves_dao_direct

Repository wraps sync logging — DAO skips it

Prefer watch_all_stream over get_all_future

Streams auto-rebuild UI on database changes

Failure Modes

  • Empty state if database connection fails on startup

Safe Change Notes

  • UI layout changes in move_list_screen are isolated — no other screen imports it