{ "artifact_name": "shared.i18n.lobby.mvp_keyspace_parity_report", "artifact_version": "v1", "naming_version_rule": "Keep a stable artifact_name and append only explicit schema-major suffixes to the filename/version (v1, v2, ...). Update artifact_version only when the report shape changes; refresh content in-place for catalog/keyspace changes.", "source_of_truth": { "catalog": "shared/i18n/lobby.json", "catalog_sha256": "d9f7227bddd007f2c56f33dfd0015bcffb3b60c52dc756126a02b7e4de638adb", "source_paths": [ "lobby/views.py", "frontend/src/spa/vertical-slice.ts", "frontend/angular/src/app/lobby-i18n.ts", "frontend/angular/src/app/features/host/host-shell.component.ts", "frontend/angular/src/app/features/player/player-shell.component.ts" ] }, "scope": { "issue": 277, "related_epic": 175, "mvp_locales": [ "en", "da" ], "definition": "MVP-critical keys are the Django error codes emitted by lobby/views.py plus the Angular fallback/UI keys consumed by the host/player MVP shells." }, "parity": { "status": "pass", "django_backend_error_codes_used_by_mvp": [], "angular_frontend_error_fallback_keys_used_by_mvp": [ "join_failed", "session_code_required", "session_fetch_failed", "start_round_failed" ], "angular_ui_keys_used_by_mvp": [ "common.back_to_join", "common.points_short", "common.prompt", "common.refresh", "common.retry", "common.round", "common.round_question_id", "common.session_code", "common.status", "common.unknown_error", "host.audio_locale_hint", "host.calculate_scores", "host.category", "host.final_leaderboard", "host.finish_game", "host.finish_game_failed", "host.load_scoreboard", "host.mix_answers", "host.next_round_failed", "host.retry_finish", "host.retry_next_round", "host.retry_scoreboard", "host.scoreboard_failed", "host.session_code_required", "host.session_refresh_failed", "host.show_question", "host.start_next_round", "host.start_round", "host.title", "host.winner", "player.audio_policy_notice", "player.final_leaderboard", "player.guess_submit_failed", "player.join", "player.join_failed", "player.lie_label", "player.lie_submit_failed", "player.loading_join", "player.loading_refresh", "player.loading_submit_guess", "player.loading_submit_lie", "player.nickname", "player.offline_text", "player.reconnecting_text", "player.retry_guess_submit", "player.retry_lie_submit", "player.retry_now", "player.session_refresh_failed", "player.submit_guess", "player.submit_lie", "player.title" ], "angular_ui_catalog_paths": [ "common.back_to_join", "common.points_short", "common.prompt", "common.refresh", "common.retry", "common.round", "common.round_question_id", "common.session_code", "common.status", "common.unknown_error", "host.audio_locale_hint", "host.calculate_scores", "host.category", "host.final_leaderboard", "host.finish_game", "host.finish_game_failed", "host.load_scoreboard", "host.mix_answers", "host.next_round_failed", "host.retry_finish", "host.retry_next_round", "host.retry_scoreboard", "host.scoreboard_failed", "host.session_code_required", "host.session_refresh_failed", "host.show_question", "host.start_next_round", "host.start_round", "host.title", "host.winner", "player.audio_policy_notice", "player.final_leaderboard", "player.guess_submit_failed", "player.join", "player.join_failed", "player.lie_label", "player.lie_submit_failed", "player.loading_join", "player.loading_refresh", "player.loading_submit_guess", "player.loading_submit_lie", "player.nickname", "player.offline_text", "player.reconnecting_text", "player.retry_guess_submit", "player.retry_lie_submit", "player.retry_now", "player.session_refresh_failed", "player.submit_guess", "player.submit_lie", "player.title" ], "backend_codes_mapped_to_frontend_error_keys": {}, "unique_frontend_error_keys_reached_from_django": [], "blocking_issues": { "missing_backend_codes": [], "missing_backend_translations": [], "missing_contract_mappings": [], "missing_frontend_error_keys": [], "missing_frontend_runtime_fallbacks": [], "missing_angular_catalog_paths": [] }, "follow_ups": [ { "priority": "need-to-have", "item": "Either add missing backend/error_codes + backend/errors entries for dead contract aliases or remove them from contract.backend_to_frontend_error_keys.", "evidence": "host_only_action" } ] } }