R-585: the last customer-facing producers follow the household's language

backup_integrity_ok / backup_integrity_failed now take facts and push bundle
keys (Hungarian bytes unchanged - go-parity, pinned verbatim by
TestR585_IntegrityHungarianIsUnchanged). The interrupted-operation alert
(backup_failed, customer-enabled by default) used to send the operator's
ENGLISH sentence to every household; NotifyInterruptedOperation composes it
per language, the English byte-identical to the operator's log line. The
now-callerless NotifyBackupFailed is removed. local_api_endpoint_drift is
operator-only (no customer toggle) and already English by design - not
changed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-10-06 01:20:03 +02:00
parent 84d6ef706d
commit ff1758a21c
10 changed files with 289 additions and 45 deletions
@@ -62,6 +62,23 @@ func (r AppStopReason) humanReason() string {
}
}
// MessageKey is the bundle key that names this reason in the household's language (R-585), or "" for a
// reason this build has no sentence for — the caller then shows the raw reason, as humanReason does.
// Pinned against humanReason by TestR585_InterruptedOperationFollowsTheHousehold (internal/notify): the
// English bundle text must equal what the operator's log line says.
func (r AppStopReason) MessageKey() string {
switch r {
case ReasonVolumeDump:
return "appstop.reason.volume_dump"
case ReasonOffboxReconstitute:
return "appstop.reason.offbox_reconstitute"
case ReasonAppExport:
return "appstop.reason.app_export"
default:
return ""
}
}
// AppStopMarker is the persisted "these apps were stopped by an operation that has not reported
// finishing — they are owed a restart" note.
type AppStopMarker struct {