mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-15 15:02:04 +00:00
The nightly briefing warm completed every night and read "all-failed", because one run event held every account's annotations and the last account won. Each candidate now runs in its own wide event and the run reports every outcome through `reportJobRun`, so ok, dead sign-in, withheld and failed accounts show side by side. A dead Codex refresh token threw a bare error with no status, so the chain read it as a network failure: the health ledger recorded hard_failed, no "reconnect" hint appeared, and every night tried the same token. The refresh now throws `CodexRefreshError` with a 401 for a dead grant (invalid_grant / invalid_refresh_token on a 400 included), as do a missing or undecryptable stored credential. The ledger records auth_failed, the chain marks the primary credential expired, and the nightly pass reports the account as auth_failed without queuing a retry. A briefing the outbound screen withheld (a causal claim) failed outright, and the 45-minute provider retry then asked the same question eight times a night. The generator now makes one bounded repair that names the broken rule and keeps the repaired payload only if it passes the same parse, grounding and screen; a withheld outcome queues no retry. A provider that keeps failing is paused: from five consecutive hard failures the skip window starts at 30 minutes and doubles per further failure, capped at a day. A paused provider is walked last and tried again when the window lifts; one success resumes it. The operator card shows how many accounts it is paused for and until when. After a 5xx from a non-canonical OpenAI-compatible endpoint the client asks the free model listing, and a configured model the endpoint no longer offers is named in the error, on the hop line and on the card. Also: - The tiered context's live day band read `measured_at AT TIME ZONE tz`, which treats the stored UTC as local time; a far-from-UTC reader's evening readings landed on the next day. It converts from UTC first now. - Google Health intraday heart rate re-reads two hours per sync instead of a day; daily summaries and sleep keep the day (#1023). - The first filtered daily read that answers 400 and triggers the snake_case retry is recorded as a note, not an error (#1023). - The single derived-score read goes through the derived cache with stale-while-revalidate, like the batch beside it.
66 lines
2.6 KiB
JSON
66 lines
2.6 KiB
JSON
{
|
||
"en": {
|
||
"admin": {
|
||
"providerHealth": {
|
||
"statusPaused": "Paused",
|
||
"pausedHint": "Paused after repeated failures for {count} users until {at}. It is tried again automatically then.",
|
||
"modelNotServed": "The endpoint no longer offers the model {model}. Choose a model it lists in the AI settings."
|
||
}
|
||
}
|
||
},
|
||
"de": {
|
||
"admin": {
|
||
"providerHealth": {
|
||
"statusPaused": "Pausiert",
|
||
"pausedHint": "Nach wiederholten Fehlern für {count} Nutzer pausiert bis {at}. Danach wird er automatisch wieder versucht.",
|
||
"modelNotServed": "Der Endpunkt bietet das Modell {model} nicht mehr an. Wähle in den KI-Einstellungen ein Modell, das er anbietet."
|
||
}
|
||
}
|
||
},
|
||
"es": {
|
||
"admin": {
|
||
"providerHealth": {
|
||
"statusPaused": "En pausa",
|
||
"pausedHint": "En pausa tras fallos repetidos para {count} usuarios hasta {at}. Después se vuelve a intentar automáticamente.",
|
||
"modelNotServed": "El endpoint ya no ofrece el modelo {model}. Elige en los ajustes de IA un modelo que ofrezca."
|
||
}
|
||
}
|
||
},
|
||
"fr": {
|
||
"admin": {
|
||
"providerHealth": {
|
||
"statusPaused": "En pause",
|
||
"pausedHint": "En pause après des échecs répétés pour {count} utilisateurs jusqu’au {at}. Il sera ensuite réessayé automatiquement.",
|
||
"modelNotServed": "Le point d’accès ne propose plus le modèle {model}. Choisissez dans les réglages IA un modèle qu’il propose."
|
||
}
|
||
}
|
||
},
|
||
"it": {
|
||
"admin": {
|
||
"providerHealth": {
|
||
"statusPaused": "In pausa",
|
||
"pausedHint": "In pausa dopo errori ripetuti per {count} utenti fino al {at}. Poi viene ritentato automaticamente.",
|
||
"modelNotServed": "L’endpoint non offre più il modello {model}. Scegli nelle impostazioni IA un modello che offre."
|
||
}
|
||
}
|
||
},
|
||
"ko": {
|
||
"admin": {
|
||
"providerHealth": {
|
||
"statusPaused": "일시 중지됨",
|
||
"pausedHint": "반복된 오류로 사용자 {count}명에 대해 {at}까지 일시 중지되었습니다. 그 후 자동으로 다시 시도합니다.",
|
||
"modelNotServed": "엔드포인트가 더 이상 {model} 모델을 제공하지 않습니다. AI 설정에서 제공되는 모델을 선택하세요."
|
||
}
|
||
}
|
||
},
|
||
"pl": {
|
||
"admin": {
|
||
"providerHealth": {
|
||
"statusPaused": "Wstrzymany",
|
||
"pausedHint": "Wstrzymany po powtarzających się błędach dla {count} użytkowników do {at}. Potem zostanie automatycznie ponowiony.",
|
||
"modelNotServed": "Punkt końcowy nie oferuje już modelu {model}. Wybierz w ustawieniach AI model, który oferuje."
|
||
}
|
||
}
|
||
}
|
||
}
|