feat(nmsr): cut avatar refresh lag to ~1min + document HTTP routes

NMSR has no per-request avatar refresh (the `?skin=` override is ignored by this
build), so the only lever for a changed skin to appear is the resolve cache.
Drop resolve_cache_duration 15m -> 60s so account-page skin changes propagate
within ~1 min; texture cache stays 48h (Drasl skin URLs are content-hashed, so a
new skin is always a new URL — never stale). Cost is one extra internal Drasl
profile lookup per avatar per minute, trivial for 4-10 players.

Update the now-stale "~15 min" copy (skinLead + skinPreviewNote, en/es/eu) and
code comments to "~1 min".

Add plan/19-routes.md: a reference for the nmsr / landing / auth HTTP routes
(public via caddy + browser->Drasl + internal service-to-service), indexed in
plan/00-overview.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-10 20:58:57 +02:00
parent 97347693b6
commit 5d5602fbd7
5 changed files with 103 additions and 9 deletions

View File

@@ -174,7 +174,7 @@ export interface UI {
skinUpload: string;
skinUploading: string;
skinOk: string;
skinPreviewNote: string; // "NMSR takes ~15 min to update" hint
skinPreviewNote: string; // "NMSR takes ~1 min to update" hint
resetSkin: string;
resetConfirm: string; // window.confirm text
resetOk: string;
@@ -356,7 +356,7 @@ export const ui: Record<Lang, UI> = {
registerLink: "Register here",
playerLabel: "Logged in as",
skinTitle: "Your skin",
skinLead: "Upload a Minecraft skin PNG. The 3D preview below updates instantly; the in-game avatar takes ~15 minutes.",
skinLead: "Upload a Minecraft skin PNG. The 3D preview below updates instantly; the in-game avatar takes ~1 minute.",
skinChoose: "Choose PNG…",
modelLabel: "Model",
modelClassic: "Classic",
@@ -364,7 +364,7 @@ export const ui: Record<Lang, UI> = {
skinUpload: "Upload skin",
skinUploading: "Uploading…",
skinOk: "Skin updated!",
skinPreviewNote: "Avatar preview updates in ~15 min.",
skinPreviewNote: "Avatar updates in ~1 min.",
resetSkin: "Reset to default",
resetConfirm: "Reset your skin to the default? This cannot be undone.",
resetOk: "Skin reset to default.",
@@ -544,7 +544,7 @@ export const ui: Record<Lang, UI> = {
registerLink: "Regístrate aquí",
playerLabel: "Sesión iniciada como",
skinTitle: "Tu skin",
skinLead: "Sube un PNG de skin de Minecraft. La vista previa 3D se actualiza al instante; el avatar en el juego tarda ~15 minutos.",
skinLead: "Sube un PNG de skin de Minecraft. La vista previa 3D se actualiza al instante; el avatar en el juego tarda ~1 minuto.",
skinChoose: "Elegir PNG…",
modelLabel: "Modelo",
modelClassic: "Clásico",
@@ -552,7 +552,7 @@ export const ui: Record<Lang, UI> = {
skinUpload: "Subir skin",
skinUploading: "Subiendo…",
skinOk: "¡Skin actualizada!",
skinPreviewNote: "La vista previa del avatar se actualiza en ~15 min.",
skinPreviewNote: "El avatar se actualiza en ~1 min.",
resetSkin: "Restablecer skin",
resetConfirm: "¿Restablecer tu skin a la predeterminada? Esta acción no se puede deshacer.",
resetOk: "Skin restablecida.",
@@ -732,7 +732,7 @@ export const ui: Record<Lang, UI> = {
registerLink: "Erregistratu hemen",
playerLabel: "Saioa hasita:",
skinTitle: "Zure azala",
skinLead: "Igo Minecraft azal PNG bat. 3D aurrebista berehala eguneratzen da; jokoko avatarra ~15 minutuan.",
skinLead: "Igo Minecraft azal PNG bat. 3D aurrebista berehala eguneratzen da; jokoko avatarra ~1 minutuan.",
skinChoose: "Aukeratu PNGa…",
modelLabel: "Eredua",
modelClassic: "Klasikoa",
@@ -740,7 +740,7 @@ export const ui: Record<Lang, UI> = {
skinUpload: "Igo azala",
skinUploading: "Igotzen…",
skinOk: "Azala eguneratuta!",
skinPreviewNote: "Avatararen aurrebista ~15 min barru eguneratzen da.",
skinPreviewNote: "Avatarra ~1 min barru eguneratzen da.",
resetSkin: "Berrezarri azala",
resetConfirm: "Zure azala lehenetsi nahi duzu? Ezin da desegin.",
resetOk: "Azala berrezarrita.",