dependency_graph: design_version: 1 workflow_version: v001 generated_at: '2025-12-18T15:16:50.203723' generator: validate_design.py stats: total_entities: 78 total_layers: 4 max_parallelism: 38 critical_path_length: 4 layers: - layer: 1 name: Data Layer description: Database models - no external dependencies items: - id: component_album_card type: component name: AlbumCard depends_on: [] task_id: task_create_component_album_card agent: frontend complexity: medium - id: component_album_header type: component name: AlbumHeader depends_on: [] task_id: task_create_component_album_header agent: frontend complexity: medium - id: component_artist_card type: component name: ArtistCard depends_on: [] task_id: task_create_component_artist_card agent: frontend complexity: medium - id: component_avatar_upload type: component name: AvatarUpload depends_on: [] task_id: task_create_component_avatar_upload agent: frontend complexity: medium - id: component_genre_badge type: component name: GenreBadge depends_on: [] task_id: task_create_component_genre_badge agent: frontend complexity: medium - id: component_genre_header type: component name: GenreHeader depends_on: [] task_id: task_create_component_genre_header agent: frontend complexity: medium - id: component_player_controls type: component name: PlayerControls depends_on: [] task_id: task_create_component_player_controls agent: frontend complexity: medium - id: component_playlist_card type: component name: PlaylistCard depends_on: [] task_id: task_create_component_playlist_card agent: frontend complexity: medium - id: component_playlist_header type: component name: PlaylistHeader depends_on: [] task_id: task_create_component_playlist_header agent: frontend complexity: medium - id: component_section_header type: component name: SectionHeader depends_on: [] task_id: task_create_component_section_header agent: frontend complexity: medium - id: component_social_links type: component name: SocialLinks depends_on: [] task_id: task_create_component_social_links agent: frontend complexity: medium - id: component_song_card type: component name: SongCard depends_on: [] task_id: task_create_component_song_card agent: frontend complexity: medium - id: component_waveform_display type: component name: WaveformDisplay depends_on: [] task_id: task_create_component_waveform_display agent: frontend complexity: medium - id: model_album type: model name: Album depends_on: [] task_id: task_create_model_album agent: backend complexity: medium - id: model_artist type: model name: Artist depends_on: [] task_id: task_create_model_artist agent: backend complexity: medium - id: model_genre type: model name: Genre depends_on: [] task_id: task_create_model_genre agent: backend complexity: medium - id: model_label type: model name: Label depends_on: [] task_id: task_create_model_label agent: backend complexity: medium - id: model_playlist type: model name: Playlist depends_on: [] task_id: task_create_model_playlist agent: backend complexity: medium - id: model_playlist_song type: model name: PlaylistSong depends_on: [] task_id: task_create_model_playlist_song agent: backend complexity: medium - id: model_song type: model name: Song depends_on: [] task_id: task_create_model_song agent: backend complexity: medium - id: model_song_genre type: model name: SongGenre depends_on: [] task_id: task_create_model_song_genre agent: backend complexity: medium - id: model_user type: model name: User depends_on: [] task_id: task_create_model_user agent: backend complexity: medium requires_layers: [] parallel_count: 22 - layer: 2 name: API Layer description: REST endpoints - depend on models items: - id: api_add_song_to_playlist type: api name: api_add_song_to_playlist depends_on: - model_playlist - model_playlist_song task_id: task_create_api_add_song_to_playlist agent: backend complexity: medium - id: api_create_album type: api name: api_create_album depends_on: - model_artist - model_album task_id: task_create_api_create_album agent: backend complexity: medium - id: api_create_artist_profile type: api name: api_create_artist_profile depends_on: - model_artist - model_user task_id: task_create_api_create_artist_profile agent: backend complexity: medium - id: api_create_label_profile type: api name: api_create_label_profile depends_on: - model_label task_id: task_create_api_create_label_profile agent: backend complexity: medium - id: api_create_playlist type: api name: api_create_playlist depends_on: - model_playlist task_id: task_create_api_create_playlist agent: backend complexity: medium - id: api_delete_album type: api name: api_delete_album depends_on: - model_album task_id: task_create_api_delete_album agent: backend complexity: medium - id: api_delete_playlist type: api name: api_delete_playlist depends_on: - model_playlist task_id: task_create_api_delete_playlist agent: backend complexity: medium - id: api_delete_song type: api name: api_delete_song depends_on: - model_song task_id: task_create_api_delete_song agent: backend complexity: medium - id: api_forgot_password type: api name: api_forgot_password depends_on: - model_user task_id: task_create_api_forgot_password agent: backend complexity: medium - id: api_get_album type: api name: api_get_album depends_on: - model_artist - model_album - model_song task_id: task_create_api_get_album agent: backend complexity: medium - id: api_get_artist type: api name: api_get_artist depends_on: - model_artist task_id: task_create_api_get_artist agent: backend complexity: medium - id: api_get_artist_albums type: api name: api_get_artist_albums depends_on: - model_artist - model_album task_id: task_create_api_get_artist_albums agent: backend complexity: medium - id: api_get_artist_songs type: api name: api_get_artist_songs depends_on: - model_artist - model_song task_id: task_create_api_get_artist_songs agent: backend complexity: medium - id: api_get_current_user type: api name: api_get_current_user depends_on: - model_user task_id: task_create_api_get_current_user agent: backend complexity: medium - id: api_get_genres type: api name: api_get_genres depends_on: - model_genre task_id: task_create_api_get_genres agent: backend complexity: medium - id: api_get_label_artists type: api name: api_get_label_artists depends_on: - model_artist - model_label task_id: task_create_api_get_label_artists agent: backend complexity: medium - id: api_get_new_releases type: api name: api_get_new_releases depends_on: - model_song task_id: task_create_api_get_new_releases agent: backend complexity: medium - id: api_get_playlist type: api name: api_get_playlist depends_on: - model_playlist - model_playlist_song task_id: task_create_api_get_playlist agent: backend complexity: medium - id: api_get_song type: api name: api_get_song depends_on: - model_artist - model_album - model_song task_id: task_create_api_get_song agent: backend complexity: medium - id: api_get_songs_by_genre type: api name: api_get_songs_by_genre depends_on: - model_song - model_genre task_id: task_create_api_get_songs_by_genre agent: backend complexity: medium - id: api_get_trending_songs type: api name: api_get_trending_songs depends_on: - model_artist - model_song task_id: task_create_api_get_trending_songs agent: backend complexity: medium - id: api_get_user_playlists type: api name: api_get_user_playlists depends_on: - model_playlist task_id: task_create_api_get_user_playlists agent: backend complexity: medium - id: api_increment_play_count type: api name: api_increment_play_count depends_on: - model_song task_id: task_create_api_increment_play_count agent: backend complexity: medium - id: api_login type: api name: api_login depends_on: - model_user task_id: task_create_api_login agent: backend complexity: medium - id: api_register type: api name: api_register depends_on: - model_user task_id: task_create_api_register agent: backend complexity: medium - id: api_remove_song_from_playlist type: api name: api_remove_song_from_playlist depends_on: - model_playlist - model_playlist_song task_id: task_create_api_remove_song_from_playlist agent: backend complexity: medium - id: api_reorder_playlist_songs type: api name: api_reorder_playlist_songs depends_on: - model_playlist - model_playlist_song task_id: task_create_api_reorder_playlist_songs agent: backend complexity: medium - id: api_reset_password type: api name: api_reset_password depends_on: - model_user task_id: task_create_api_reset_password agent: backend complexity: medium - id: api_search type: api name: api_search depends_on: - model_artist - model_album - model_song task_id: task_create_api_search agent: backend complexity: medium - id: api_update_album type: api name: api_update_album depends_on: - model_album task_id: task_create_api_update_album agent: backend complexity: medium - id: api_update_artist type: api name: api_update_artist depends_on: - model_artist task_id: task_create_api_update_artist agent: backend complexity: medium - id: api_update_current_user type: api name: api_update_current_user depends_on: - model_user task_id: task_create_api_update_current_user agent: backend complexity: medium - id: api_update_playlist type: api name: api_update_playlist depends_on: - model_playlist task_id: task_create_api_update_playlist agent: backend complexity: medium - id: api_update_song type: api name: api_update_song depends_on: - model_song task_id: task_create_api_update_song agent: backend complexity: medium - id: api_upload_song type: api name: api_upload_song depends_on: - model_artist - model_song task_id: task_create_api_upload_song agent: backend complexity: medium - id: component_artist_header type: component name: ArtistHeader depends_on: - component_social_links task_id: task_create_component_artist_header agent: frontend complexity: medium - id: component_search_results type: component name: SearchResults depends_on: - component_artist_card - component_album_card - component_song_card task_id: task_create_component_search_results agent: frontend complexity: medium - id: component_track_list type: component name: TrackList depends_on: - component_song_card task_id: task_create_component_track_list agent: frontend complexity: medium requires_layers: - 1 parallel_count: 38 - layer: 3 name: UI Layer description: Pages and components - depend on APIs items: - id: component_audio_player type: component name: AudioPlayer depends_on: - component_waveform_display - api_increment_play_count - component_player_controls task_id: task_create_component_audio_player agent: frontend complexity: medium - id: component_auth_form type: component name: AuthForm depends_on: - api_forgot_password - api_register - api_login task_id: task_create_component_auth_form agent: frontend complexity: medium - id: component_create_playlist_modal type: component name: CreatePlaylistModal depends_on: - api_create_playlist task_id: task_create_component_create_playlist_modal agent: frontend complexity: medium - id: component_profile_form type: component name: ProfileForm depends_on: - api_update_current_user - component_avatar_upload task_id: task_create_component_profile_form agent: frontend complexity: medium - id: component_search_bar type: component name: SearchBar depends_on: - api_search task_id: task_create_component_search_bar agent: frontend complexity: medium - id: component_upload_form type: component name: UploadForm depends_on: - component_waveform_display - api_upload_song task_id: task_create_component_upload_form agent: frontend complexity: medium - id: page_album_detail type: page name: page_album_detail depends_on: - component_track_list - component_song_card - api_get_album - component_album_header task_id: task_create_page_album_detail agent: frontend complexity: medium - id: page_artist_profile type: page name: page_artist_profile depends_on: - api_get_artist_albums - component_artist_header - component_album_card - api_get_artist_songs - api_get_artist - component_song_card - component_social_links task_id: task_create_page_artist_profile agent: frontend complexity: medium - id: page_genre_browse type: page name: page_genre_browse depends_on: - component_genre_header - api_get_songs_by_genre - component_song_card task_id: task_create_page_genre_browse agent: frontend complexity: medium - id: page_home type: page name: page_home depends_on: - component_genre_badge - component_section_header - api_get_new_releases - component_song_card - api_get_trending_songs - api_get_genres task_id: task_create_page_home agent: frontend complexity: medium - id: page_playlist_detail type: page name: page_playlist_detail depends_on: - component_playlist_header - component_track_list - api_get_playlist - component_song_card task_id: task_create_page_playlist_detail agent: frontend complexity: medium requires_layers: - 1 - 2 parallel_count: 11 - layer: 4 name: Layer 4 description: Entities with 3 levels of dependencies items: - id: page_forgot_password type: page name: page_forgot_password depends_on: - component_auth_form - api_forgot_password task_id: task_create_page_forgot_password agent: frontend complexity: medium - id: page_login type: page name: page_login depends_on: - component_auth_form - api_login task_id: task_create_page_login agent: frontend complexity: medium - id: page_playlists type: page name: page_playlists depends_on: - component_playlist_card - api_get_user_playlists - component_create_playlist_modal task_id: task_create_page_playlists agent: frontend complexity: medium - id: page_profile type: page name: page_profile depends_on: - api_update_current_user - component_profile_form - api_get_current_user - component_avatar_upload task_id: task_create_page_profile agent: frontend complexity: medium - id: page_register type: page name: page_register depends_on: - component_auth_form - api_register task_id: task_create_page_register agent: frontend complexity: medium - id: page_search type: page name: page_search depends_on: - component_search_results - component_album_card - component_artist_card - component_search_bar - api_search - component_song_card task_id: task_create_page_search agent: frontend complexity: medium - id: page_upload type: page name: page_upload depends_on: - api_get_artist_albums - component_upload_form - api_upload_song - component_waveform_display - api_get_genres task_id: task_create_page_upload agent: frontend complexity: medium requires_layers: - 1 - 2 - 3 parallel_count: 7 dependency_map: model_user: type: model layer: 1 depends_on: [] depended_by: - api_register - api_login - api_reset_password - api_update_current_user - api_create_artist_profile - api_forgot_password - api_get_current_user model_artist: type: model layer: 1 depends_on: [] depended_by: - api_update_artist - api_get_label_artists - api_create_album - api_get_artist_albums - api_get_song - api_get_album - api_create_artist_profile - api_get_artist_songs - api_get_artist - api_upload_song - api_search - api_get_trending_songs model_label: type: model layer: 1 depends_on: [] depended_by: - api_create_label_profile - api_get_label_artists model_genre: type: model layer: 1 depends_on: [] depended_by: - api_get_songs_by_genre - api_get_genres model_album: type: model layer: 1 depends_on: [] depended_by: - api_update_album - api_delete_album - api_create_album - api_get_artist_albums - api_get_song - api_get_album - api_search model_song: type: model layer: 1 depends_on: [] depended_by: - api_get_song - api_get_songs_by_genre - api_increment_play_count - api_get_album - api_get_artist_songs - api_get_new_releases - api_upload_song - api_search - api_delete_song - api_get_trending_songs - api_update_song model_song_genre: type: model layer: 1 depends_on: [] depended_by: [] model_playlist: type: model layer: 1 depends_on: [] depended_by: - api_create_playlist - api_reorder_playlist_songs - api_update_playlist - api_add_song_to_playlist - api_get_user_playlists - api_get_playlist - api_remove_song_from_playlist - api_delete_playlist model_playlist_song: type: model layer: 1 depends_on: [] depended_by: - api_add_song_to_playlist - api_reorder_playlist_songs - api_get_playlist - api_remove_song_from_playlist api_register: type: api layer: 2 depends_on: - model_user depended_by: - page_register - component_auth_form api_login: type: api layer: 2 depends_on: - model_user depended_by: - component_auth_form - page_login api_forgot_password: type: api layer: 2 depends_on: - model_user depended_by: - component_auth_form - page_forgot_password api_reset_password: type: api layer: 2 depends_on: - model_user depended_by: [] api_get_current_user: type: api layer: 2 depends_on: - model_user depended_by: - page_profile api_update_current_user: type: api layer: 2 depends_on: - model_user depended_by: - component_profile_form - page_profile api_create_artist_profile: type: api layer: 2 depends_on: - model_artist - model_user depended_by: [] api_get_artist: type: api layer: 2 depends_on: - model_artist depended_by: - page_artist_profile api_update_artist: type: api layer: 2 depends_on: - model_artist depended_by: [] api_get_artist_songs: type: api layer: 2 depends_on: - model_artist - model_song depended_by: - page_artist_profile api_get_artist_albums: type: api layer: 2 depends_on: - model_artist - model_album depended_by: - page_artist_profile - page_upload api_upload_song: type: api layer: 2 depends_on: - model_artist - model_song depended_by: - page_upload - component_upload_form api_get_song: type: api layer: 2 depends_on: - model_artist - model_album - model_song depended_by: [] api_update_song: type: api layer: 2 depends_on: - model_song depended_by: [] api_delete_song: type: api layer: 2 depends_on: - model_song depended_by: [] api_increment_play_count: type: api layer: 2 depends_on: - model_song depended_by: - component_audio_player api_create_album: type: api layer: 2 depends_on: - model_artist - model_album depended_by: [] api_get_album: type: api layer: 2 depends_on: - model_artist - model_album - model_song depended_by: - page_album_detail api_update_album: type: api layer: 2 depends_on: - model_album depended_by: [] api_delete_album: type: api layer: 2 depends_on: - model_album depended_by: [] api_create_playlist: type: api layer: 2 depends_on: - model_playlist depended_by: - component_create_playlist_modal api_get_user_playlists: type: api layer: 2 depends_on: - model_playlist depended_by: - page_playlists api_get_playlist: type: api layer: 2 depends_on: - model_playlist - model_playlist_song depended_by: - page_playlist_detail api_update_playlist: type: api layer: 2 depends_on: - model_playlist depended_by: [] api_delete_playlist: type: api layer: 2 depends_on: - model_playlist depended_by: [] api_add_song_to_playlist: type: api layer: 2 depends_on: - model_playlist - model_playlist_song depended_by: [] api_remove_song_from_playlist: type: api layer: 2 depends_on: - model_playlist - model_playlist_song depended_by: [] api_reorder_playlist_songs: type: api layer: 2 depends_on: - model_playlist - model_playlist_song depended_by: [] api_get_trending_songs: type: api layer: 2 depends_on: - model_artist - model_song depended_by: - page_home api_get_new_releases: type: api layer: 2 depends_on: - model_song depended_by: - page_home api_get_genres: type: api layer: 2 depends_on: - model_genre depended_by: - page_upload - page_home api_get_songs_by_genre: type: api layer: 2 depends_on: - model_song - model_genre depended_by: - page_genre_browse api_search: type: api layer: 2 depends_on: - model_artist - model_album - model_song depended_by: - page_search - component_search_bar api_create_label_profile: type: api layer: 2 depends_on: - model_label depended_by: [] api_get_label_artists: type: api layer: 2 depends_on: - model_artist - model_label depended_by: [] page_login: type: page layer: 4 depends_on: - component_auth_form - api_login depended_by: [] page_register: type: page layer: 4 depends_on: - component_auth_form - api_register depended_by: [] page_forgot_password: type: page layer: 4 depends_on: - component_auth_form - api_forgot_password depended_by: [] page_home: type: page layer: 3 depends_on: - component_genre_badge - component_section_header - api_get_new_releases - component_song_card - api_get_trending_songs - api_get_genres depended_by: [] page_artist_profile: type: page layer: 3 depends_on: - api_get_artist_albums - component_artist_header - component_album_card - api_get_artist_songs - api_get_artist - component_song_card - component_social_links depended_by: [] page_album_detail: type: page layer: 3 depends_on: - component_track_list - component_song_card - api_get_album - component_album_header depended_by: [] page_upload: type: page layer: 4 depends_on: - api_get_artist_albums - component_upload_form - api_upload_song - component_waveform_display - api_get_genres depended_by: [] page_playlists: type: page layer: 4 depends_on: - component_playlist_card - api_get_user_playlists - component_create_playlist_modal depended_by: [] page_playlist_detail: type: page layer: 3 depends_on: - component_playlist_header - component_track_list - api_get_playlist - component_song_card depended_by: [] page_profile: type: page layer: 4 depends_on: - api_update_current_user - component_profile_form - api_get_current_user - component_avatar_upload depended_by: [] page_search: type: page layer: 4 depends_on: - component_search_results - component_album_card - component_artist_card - component_search_bar - api_search - component_song_card depended_by: [] page_genre_browse: type: page layer: 3 depends_on: - component_genre_header - api_get_songs_by_genre - component_song_card depended_by: [] component_audio_player: type: component layer: 3 depends_on: - component_waveform_display - api_increment_play_count - component_player_controls depended_by: [] component_player_controls: type: component layer: 1 depends_on: [] depended_by: - component_audio_player component_song_card: type: component layer: 1 depends_on: [] depended_by: - component_track_list - page_search - component_search_results - page_genre_browse - page_artist_profile - page_home - page_playlist_detail - page_album_detail component_album_card: type: component layer: 1 depends_on: [] depended_by: - page_artist_profile - page_search - component_search_results component_artist_card: type: component layer: 1 depends_on: [] depended_by: - page_search - component_search_results component_playlist_card: type: component layer: 1 depends_on: [] depended_by: - page_playlists component_upload_form: type: component layer: 3 depends_on: - component_waveform_display - api_upload_song depended_by: - page_upload component_waveform_display: type: component layer: 1 depends_on: [] depended_by: - page_upload - component_audio_player - component_upload_form component_genre_badge: type: component layer: 1 depends_on: [] depended_by: - page_home component_track_list: type: component layer: 2 depends_on: - component_song_card depended_by: - page_album_detail - page_playlist_detail component_artist_header: type: component layer: 2 depends_on: - component_social_links depended_by: - page_artist_profile component_album_header: type: component layer: 1 depends_on: [] depended_by: - page_album_detail component_playlist_header: type: component layer: 1 depends_on: [] depended_by: - page_playlist_detail component_social_links: type: component layer: 1 depends_on: [] depended_by: - page_artist_profile - component_artist_header component_auth_form: type: component layer: 3 depends_on: - api_forgot_password - api_register - api_login depended_by: - page_register - page_login - page_forgot_password component_search_bar: type: component layer: 3 depends_on: - api_search depended_by: - page_search component_search_results: type: component layer: 2 depends_on: - component_artist_card - component_album_card - component_song_card depended_by: - page_search component_create_playlist_modal: type: component layer: 3 depends_on: - api_create_playlist depended_by: - page_playlists component_profile_form: type: component layer: 3 depends_on: - api_update_current_user - component_avatar_upload depended_by: - page_profile component_avatar_upload: type: component layer: 1 depends_on: [] depended_by: - component_profile_form - page_profile component_section_header: type: component layer: 1 depends_on: [] depended_by: - page_home component_genre_header: type: component layer: 1 depends_on: [] depended_by: - page_genre_browse task_map: []