{ "directed": false, "multigraph": false, "graph": { "hyperedges": [ { "id": "claude_cross_cutting_conventions", "label": "Cross-cutting conventions (errors, config, logging, db sessions, migrations, health)", "nodes": [ "claude_error_handling_convention", "claude_config_convention", "claude_logging_convention", "claude_db_sessions_convention", "claude_migrations_convention", "claude_health_convention" ], "relation": "form", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md" }, { "id": "claude_domain_invariants", "label": "Non-negotiable domain invariants (for future sync + ML)", "nodes": [ "claude_invariant_likes_event_log", "claude_invariant_track_id_stable", "claude_invariant_dedup", "claude_invariant_graceful_degradation", "claude_invariant_no_manual_overwrite", "claude_invariant_no_heavy_work_in_request", "claude_invariant_subsonic_compatibility" ], "relation": "form", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md" }, { "id": "claude_hexagonal_layers", "label": "Hexagonal architecture layers (domain/application/infrastructure/api/core/workers)", "nodes": [ "claude_domain_layer", "claude_application_layer", "claude_infrastructure_layer", "claude_api_layer", "claude_core_layer", "claude_workers_layer" ], "relation": "implement", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md" } ] }, "nodes": [ { "label": "env.py", "file_type": "code", "source_file": "alembic/env.py", "source_location": "L1", "_origin": "ast", "id": "alembic_env", "community": 77, "norm_label": "env.py" }, { "label": "_run_migrations()", "file_type": "code", "source_file": "alembic/env.py", "source_location": "L29", "_origin": "ast", "id": "alembic_env_run_migrations", "community": 77, "norm_label": "_run_migrations()" }, { "label": "Connection", "file_type": "code", "source_file": "", "source_location": "", "_origin": "ast", "id": "connection", "community": 77, "norm_label": "connection" }, { "label": "run_migrations_offline()", "file_type": "code", "source_file": "alembic/env.py", "source_location": "L41", "_origin": "ast", "id": "alembic_env_run_migrations_offline", "community": 77, "norm_label": "run_migrations_offline()" }, { "label": "run_migrations_online()", "file_type": "code", "source_file": "alembic/env.py", "source_location": "L53", "_origin": "ast", "id": "alembic_env_run_migrations_online", "community": 77, "norm_label": "run_migrations_online()" }, { "label": "Alembic environment \u2014 async, settings-driven, model-aware. The DB URL comes fro", "file_type": "rationale", "source_file": "alembic/env.py", "source_location": "L1", "_origin": "ast", "id": "alembic_env_rationale_1", "community": 77, "norm_label": "alembic environment \u2014 async, settings-driven, model-aware. the db url comes fro" }, { "label": "20260602_0001-0001_auth_users.py", "file_type": "code", "source_file": "alembic/versions/20260602_0001-0001_auth_users.py", "source_location": "L1", "_origin": "ast", "id": "alembic_versions_20260602_0001_0001_auth_users", "community": 82, "norm_label": "20260602_0001-0001_auth_users.py" }, { "label": "upgrade()", "file_type": "code", "source_file": "alembic/versions/20260602_0001-0001_auth_users.py", "source_location": "L26", "_origin": "ast", "id": "alembic_versions_20260602_0001_0001_auth_users_upgrade", "community": 82, "norm_label": "upgrade()" }, { "label": "downgrade()", "file_type": "code", "source_file": "alembic/versions/20260602_0001-0001_auth_users.py", "source_location": "L72", "_origin": "ast", "id": "alembic_versions_20260602_0001_0001_auth_users_downgrade", "community": 82, "norm_label": "downgrade()" }, { "label": "20260607_1137-e670d6c41d0c_music_schema.py", "file_type": "code", "source_file": "alembic/versions/20260607_1137-e670d6c41d0c_music_schema.py", "source_location": "L1", "_origin": "ast", "id": "alembic_versions_20260607_1137_e670d6c41d0c_music_schema", "community": 83, "norm_label": "20260607_1137-e670d6c41d0c_music_schema.py" }, { "label": "upgrade()", "file_type": "code", "source_file": "alembic/versions/20260607_1137-e670d6c41d0c_music_schema.py", "source_location": "L22", "_origin": "ast", "id": "alembic_versions_20260607_1137_e670d6c41d0c_music_schema_upgrade", "community": 83, "norm_label": "upgrade()" }, { "label": "downgrade()", "file_type": "code", "source_file": "alembic/versions/20260607_1137-e670d6c41d0c_music_schema.py", "source_location": "L299", "_origin": "ast", "id": "alembic_versions_20260607_1137_e670d6c41d0c_music_schema_downgrade", "community": 83, "norm_label": "downgrade()" }, { "label": "20260608_1132-rename_track_file_path_to_storage_uri.py", "file_type": "code", "source_file": "alembic/versions/20260608_1132-rename_track_file_path_to_storage_uri.py", "source_location": "L1", "_origin": "ast", "id": "alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri", "community": 84, "norm_label": "20260608_1132-rename_track_file_path_to_storage_uri.py" }, { "label": "upgrade()", "file_type": "code", "source_file": "alembic/versions/20260608_1132-rename_track_file_path_to_storage_uri.py", "source_location": "L20", "_origin": "ast", "id": "alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri_upgrade", "community": 84, "norm_label": "upgrade()" }, { "label": "downgrade()", "file_type": "code", "source_file": "alembic/versions/20260608_1132-rename_track_file_path_to_storage_uri.py", "source_location": "L24", "_origin": "ast", "id": "alembic_versions_20260608_1132_rename_track_file_path_to_storage_uri_downgrade", "community": 84, "norm_label": "downgrade()" }, { "label": "20260608_1200-subsonic_app_password.py", "file_type": "code", "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L1", "_origin": "ast", "id": "alembic_versions_20260608_1200_subsonic_app_password", "community": 85, "norm_label": "20260608_1200-subsonic_app_password.py" }, { "label": "upgrade()", "file_type": "code", "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L24", "_origin": "ast", "id": "alembic_versions_20260608_1200_subsonic_app_password_upgrade", "community": 85, "norm_label": "upgrade()" }, { "label": "downgrade()", "file_type": "code", "source_file": "alembic/versions/20260608_1200-subsonic_app_password.py", "source_location": "L31", "_origin": "ast", "id": "alembic_versions_20260608_1200_subsonic_app_password_downgrade", "community": 85, "norm_label": "downgrade()" }, { "label": "20260613_1300-track_enrichment_outcome.py", "file_type": "code", "source_file": "alembic/versions/20260613_1300-track_enrichment_outcome.py", "source_location": "L1", "_origin": "ast", "id": "alembic_versions_20260613_1300_track_enrichment_outcome", "community": 86, "norm_label": "20260613_1300-track_enrichment_outcome.py" }, { "label": "upgrade()", "file_type": "code", "source_file": "alembic/versions/20260613_1300-track_enrichment_outcome.py", "source_location": "L26", "_origin": "ast", "id": "alembic_versions_20260613_1300_track_enrichment_outcome_upgrade", "community": 86, "norm_label": "upgrade()" }, { "label": "downgrade()", "file_type": "code", "source_file": "alembic/versions/20260613_1300-track_enrichment_outcome.py", "source_location": "L37", "_origin": "ast", "id": "alembic_versions_20260613_1300_track_enrichment_outcome_downgrade", "community": 86, "norm_label": "downgrade()" }, { "label": "20260614_1000-download_job_track_id.py", "file_type": "code", "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L1", "_origin": "ast", "id": "alembic_versions_20260614_1000_download_job_track_id", "community": 87, "norm_label": "20260614_1000-download_job_track_id.py" }, { "label": "upgrade()", "file_type": "code", "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L26", "_origin": "ast", "id": "alembic_versions_20260614_1000_download_job_track_id_upgrade", "community": 87, "norm_label": "upgrade()" }, { "label": "downgrade()", "file_type": "code", "source_file": "alembic/versions/20260614_1000-download_job_track_id.py", "source_location": "L41", "_origin": "ast", "id": "alembic_versions_20260614_1000_download_job_track_id_downgrade", "community": 87, "norm_label": "downgrade()" }, { "label": "20260614_1125-dc126696f5a6_remote_placeholders_track_availability_.py", "file_type": "code", "source_file": "alembic/versions/20260614_1125-dc126696f5a6_remote_placeholders_track_availability_.py", "source_location": "L1", "_origin": "ast", "id": "alembic_versions_20260614_1125_dc126696f5a6_remote_placeholders_track_availability", "community": 88, "norm_label": "20260614_1125-dc126696f5a6_remote_placeholders_track_availability_.py" }, { "label": "upgrade()", "file_type": "code", "source_file": "alembic/versions/20260614_1125-dc126696f5a6_remote_placeholders_track_availability_.py", "source_location": "L22", "_origin": "ast", "id": "alembic_versions_20260614_1125_dc126696f5a6_remote_placeholders_track_availability_upgrade", "community": 88, "norm_label": "upgrade()" }, { "label": "downgrade()", "file_type": "code", "source_file": "alembic/versions/20260614_1125-dc126696f5a6_remote_placeholders_track_availability_.py", "source_location": "L47", "_origin": "ast", "id": "alembic_versions_20260614_1125_dc126696f5a6_remote_placeholders_track_availability_downgrade", "community": 88, "norm_label": "downgrade()" }, { "label": "__init__.py", "file_type": "code", "source_file": "app/__init__.py", "source_location": "L1", "_origin": "ast", "id": "app_init", "community": 98, "norm_label": "__init__.py" }, { "label": "mcma-backend \u2014 self-hosted, offline-first music service. Hexagonal (ports & ada", "file_type": "rationale", "source_file": "app/__init__.py", "source_location": "L1", "_origin": "ast", "id": "app_init_rationale_1", "community": 98, "norm_label": "mcma-backend \u2014 self-hosted, offline-first music service. hexagonal (ports & ada" }, { "label": "__init__.py", "file_type": "code", "source_file": "app/api/__init__.py", "source_location": "L1", "_origin": "ast", "id": "app_api_init", "community": 89, "norm_label": "__init__.py" }, { "label": "Driving adapter \u2014 FastAPI routers, schemas, dependency wiring.", "file_type": "rationale", "source_file": "app/api/__init__.py", "source_location": "L1", "_origin": "ast", "id": "app_api_init_rationale_1", "community": 89, "norm_label": "driving adapter \u2014 fastapi routers, schemas, dependency wiring." }, { "label": "covers.py", "file_type": "code", "source_file": "app/api/covers.py", "source_location": "L1", "_origin": "ast", "id": "app_api_covers", "community": 56, "norm_label": "covers.py" }, { "label": "_content_type_for()", "file_type": "code", "source_file": "app/api/covers.py", "source_location": "L29", "_origin": "ast", "id": "app_api_covers_content_type_for", "community": 56, "norm_label": "_content_type_for()" }, { "label": "stream_cover()", "file_type": "code", "source_file": "app/api/covers.py", "source_location": "L34", "_origin": "ast", "id": "app_api_covers_stream_cover", "community": 56, "norm_label": "stream_cover()" }, { "label": "StreamingResponse", "file_type": "code", "source_file": "", "source_location": "", "_origin": "ast", "id": "app_api_covers_py_streamingresponse", "community": 56, "norm_label": "streamingresponse" }, { "label": "resolve_album_for_track()", "file_type": "code", "source_file": "app/api/covers.py", "source_location": "L48", "_origin": "ast", "id": "app_api_covers_resolve_album_for_track", "community": 56, "norm_label": "resolve_album_for_track()" }, { "label": "UUID", "file_type": "code", "source_file": "", "source_location": "", "_origin": "ast", "id": "app_api_covers_py_uuid", "community": 56, "norm_label": "uuid" }, { "label": "Shared cover-art serving helper (presentation). Streams a stored cover image fr", "file_type": "rationale", "source_file": "app/api/covers.py", "source_location": "L1", "_origin": "ast", "id": "app_api_covers_rationale_1", "community": 56, "norm_label": "shared cover-art serving helper (presentation). streams a stored cover image fr" }, { "label": "Stream a stored cover by its storage key. Raises ``NotFoundError`` if the ob", "file_type": "rationale", "source_file": "app/api/covers.py", "source_location": "L35", "_origin": "ast", "id": "app_api_covers_rationale_35", "community": 56, "norm_label": "stream a stored cover by its storage key. raises ``notfounderror`` if the ob" }, { "label": "The album that owns a track (cover lives on the album), or ``None``.", "file_type": "rationale", "source_file": "app/api/covers.py", "source_location": "L53", "_origin": "ast", "id": "app_api_covers_rationale_53", "community": 56, "norm_label": "the album that owns a track (cover lives on the album), or ``none``." }, { "label": "deps.py", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L1", "_origin": "ast", "id": "app_api_deps", "community": 11, "norm_label": "deps.py" }, { "label": "get_session()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L50", "_origin": "ast", "id": "app_api_deps_get_session", "community": 11, "norm_label": "get_session()" }, { "label": "AsyncSession", "file_type": "code", "source_file": "", "source_location": "", "_origin": "ast", "id": "app_api_deps_py_asyncsession", "community": 11, "norm_label": "asyncsession" }, { "label": "get_password_hasher()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L68", "_origin": "ast", "id": "app_api_deps_get_password_hasher", "community": 11, "norm_label": "get_password_hasher()" }, { "label": "get_token_service()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L73", "_origin": "ast", "id": "app_api_deps_get_token_service", "community": 11, "norm_label": "get_token_service()" }, { "label": "get_subsonic_cipher()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L78", "_origin": "ast", "id": "app_api_deps_get_subsonic_cipher", "community": 11, "norm_label": "get_subsonic_cipher()" }, { "label": "get_source_registry()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L83", "_origin": "ast", "id": "app_api_deps_get_source_registry", "community": 77, "norm_label": "get_source_registry()" }, { "label": "get_auth_service()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L91", "_origin": "ast", "id": "app_api_deps_get_auth_service", "community": 11, "norm_label": "get_auth_service()" }, { "label": "SessionDep", "file_type": "code", "source_file": "", "source_location": "", "_origin": "ast", "id": "sessiondep", "community": 11, "norm_label": "sessiondep" }, { "label": "get_user_service()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L100", "_origin": "ast", "id": "app_api_deps_get_user_service", "community": 11, "norm_label": "get_user_service()" }, { "label": "get_subsonic_auth_service()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L108", "_origin": "ast", "id": "app_api_deps_get_subsonic_auth_service", "community": 11, "norm_label": "get_subsonic_auth_service()" }, { "label": "get_upload_service()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L124", "_origin": "ast", "id": "app_api_deps_get_upload_service", "community": 11, "norm_label": "get_upload_service()" }, { "label": "FileStorageDep", "file_type": "code", "source_file": "", "source_location": "", "_origin": "ast", "id": "app_api_deps_py_filestoragedep", "community": 11, "norm_label": "filestoragedep" }, { "label": "get_streaming_service()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L135", "_origin": "ast", "id": "app_api_deps_get_streaming_service", "community": 11, "norm_label": "get_streaming_service()" }, { "label": "get_metadata_service()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L142", "_origin": "ast", "id": "app_api_deps_get_metadata_service", "community": 11, "norm_label": "get_metadata_service()" }, { "label": "get_download_service()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L165", "_origin": "ast", "id": "app_api_deps_get_download_service", "community": 11, "norm_label": "get_download_service()" }, { "label": "get_remote_library_service()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L176", "_origin": "ast", "id": "app_api_deps_get_remote_library_service", "community": 11, "norm_label": "get_remote_library_service()" }, { "label": "get_track_repository()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L193", "_origin": "ast", "id": "app_api_deps_get_track_repository", "community": 11, "norm_label": "get_track_repository()" }, { "label": "get_artist_repository()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L197", "_origin": "ast", "id": "app_api_deps_get_artist_repository", "community": 11, "norm_label": "get_artist_repository()" }, { "label": "get_album_repository()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L201", "_origin": "ast", "id": "app_api_deps_get_album_repository", "community": 11, "norm_label": "get_album_repository()" }, { "label": "get_playlist_repository()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L205", "_origin": "ast", "id": "app_api_deps_get_playlist_repository", "community": 11, "norm_label": "get_playlist_repository()" }, { "label": "get_like_repository()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L209", "_origin": "ast", "id": "app_api_deps_get_like_repository", "community": 11, "norm_label": "get_like_repository()" }, { "label": "get_history_repository()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L213", "_origin": "ast", "id": "app_api_deps_get_history_repository", "community": 11, "norm_label": "get_history_repository()" }, { "label": "get_current_user()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L232", "_origin": "ast", "id": "app_api_deps_get_current_user", "community": 27, "norm_label": "get_current_user()" }, { "label": "BearerDep", "file_type": "code", "source_file": "", "source_location": "", "_origin": "ast", "id": "bearerdep", "community": 27, "norm_label": "bearerdep" }, { "label": "AuthServiceDep", "file_type": "code", "source_file": "", "source_location": "", "_origin": "ast", "id": "app_api_deps_py_authservicedep", "community": 27, "norm_label": "authservicedep" }, { "label": "get_current_superuser()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L241", "_origin": "ast", "id": "app_api_deps_get_current_superuser", "community": 27, "norm_label": "get_current_superuser()" }, { "label": "CurrentUser", "file_type": "code", "source_file": "", "source_location": "", "_origin": "ast", "id": "app_api_deps_py_currentuser", "community": 27, "norm_label": "currentuser" }, { "label": "get_streaming_user()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L250", "_origin": "ast", "id": "app_api_deps_get_streaming_user", "community": 27, "norm_label": "get_streaming_user()" }, { "label": "get_subsonic_user()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L275", "_origin": "ast", "id": "app_api_deps_get_subsonic_user", "community": 11, "norm_label": "get_subsonic_user()" }, { "label": "SubsonicAuthServiceDep", "file_type": "code", "source_file": "", "source_location": "", "_origin": "ast", "id": "app_api_deps_py_subsonicauthservicedep", "community": 11, "norm_label": "subsonicauthservicedep" }, { "label": "Query", "file_type": "code", "source_file": "", "source_location": "", "_origin": "ast", "id": "app_api_deps_py_query", "community": 11, "norm_label": "query" }, { "label": "get_subsonic_format()", "file_type": "code", "source_file": "app/api/deps.py", "source_location": "L288", "_origin": "ast", "id": "app_api_deps_get_subsonic_format", "community": 11, "norm_label": "get_subsonic_format()" }, { "label": "Shared FastAPI dependencies \u2014 the composition root for request-scoped wiring. C", "file_type": "rationale", "source_file": "app/api/deps.py", "source_location": "L1", "_origin": "ast", "id": "app_api_deps_rationale_1", "community": 11, "norm_label": "shared fastapi dependencies \u2014 the composition root for request-scoped wiring. c" }, { "label": "Request-scoped DB session. Commits on success, rolls back on exception.", "file_type": "rationale", "source_file": "app/api/deps.py", "source_location": "L51", "_origin": "ast", "id": "app_api_deps_rationale_51", "community": 11, "norm_label": "request-scoped db session. commits on success, rolls back on exception." }, { "label": "Wires the \u00a76.2 fingerprint/AcoustID adapters for read-only, inline use (the", "file_type": "rationale", "source_file": "app/api/deps.py", "source_location": "L143", "_origin": "ast", "id": "app_api_deps_rationale_143", "community": 11, "norm_label": "wires the \u00a76.2 fingerprint/acoustid adapters for read-only, inline use (the" }, { "label": "Authenticate a stream request. The browser ``