v0.258.0: the last four Hungarian things an English household met
gates / gates (push) Successful in 24s

R-589 the update badge, R-590 the data-folder backup sentence, R-573 the two channel
banners, R-572 two dead helpers. All four were built in Go, which is why neither the
template parity fixtures nor TestI18nEnglishPages could see them; slice 5's LIVE proof
is what found them.

R-590 is the one that matters most: it is a promise about the customer's files. It
said, in Hungarian and under an already-English folder label, that a drop-zone is
temporary and unbacked. The test now asserts the CONSEQUENCE in both languages — and
that the two languages do not produce the same string, which would mean the English
fell back.

R-572 is not what its row said. The row claimed a template renders "vasárnap" on an
English page; measured, NO template and no Go file called pruneLabel or
nextPruneLabel. They were dead func-map entries returning Hungarian, so they are
deleted rather than translated — translating dead code would add machinery with no
reader and a test pinning a fiction. Deletion is fail-loud and that was proven: a
template naming the removed function panics loadTemplates at startup.

Five red-proofs. One of them says something about the gate rather than the code: the
Go-parity gate does not measure localeFuncs keys against the base capture, so the
citation to TestLocaleFuncsHungarianBundleMatchesFuncMap is what carries them — the
test was extended to make that citation true.

MinAgent: 0.131.0 (unchanged). Hungarian byte-identical.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-09-20 18:10:53 +02:00
parent ecefdf2dc5
commit 7c4a33b6d1
12 changed files with 425 additions and 74 deletions
+14 -6
View File
@@ -102,9 +102,15 @@ func (am *AlertManager) SetHubPushStatus(fn func() HubPushStatusData) {
}
// SetAgentChannelAlert sets (down=true) or clears (down=false) the controller→agent channel-down
// dashboard banner. Called by the channel-health checker each probe (idempotent). msg is the short
// Hungarian display line.
func (am *AlertManager) SetAgentChannelAlert(down bool, msg string) {
// dashboard banner. Called by the channel-health checker each probe (idempotent).
//
// R-573 (v0.258.0): it takes the checker's CLASSIFIED REASON as a bundle key, not just the composed
// sentence, so the banner follows the household's language like every other alert. `msg` stays as
// the FAIL-OPEN fallback: `Alert.render` uses it verbatim when MessageKey is empty, so a reason
// nobody mapped still shows the checker's Hungarian sentence rather than a blank banner or a raw
// key. These two are the most operationally important banners there are — the 2026-07-25 outage
// (R-77) was 17.5 hours long and this banner was the only signal.
func (am *AlertManager) SetAgentChannelAlert(down bool, msgKey, msg string) {
am.mu.Lock()
defer am.mu.Unlock()
if !down {
@@ -114,7 +120,8 @@ func (am *AlertManager) SetAgentChannelAlert(down bool, msg string) {
am.agentChannelAlert = &Alert{
ID: "agent-channel-down",
Level: "error",
Message: msg, // composed by the channel-health checker -- R-573
Message: msg, // fail-open fallback when msgKey is empty -- R-573
MessageKey: msgKey,
Link: "/settings",
LinkTextKey: "alert.link.settings",
}
@@ -126,7 +133,7 @@ func (am *AlertManager) SetAgentChannelAlert(down bool, msg string) {
// generic "agent unreachable" banner was the ONLY signal, and it looked like a dead agent. The two
// can also be true at once — a drifted endpoint usually CAUSES the channel to be down — so folding
// them together would hide the actionable one behind the symptom.
func (am *AlertManager) SetEndpointDriftAlert(drift bool, msg string) {
func (am *AlertManager) SetEndpointDriftAlert(drift bool, msgKey, msg string) {
am.mu.Lock()
defer am.mu.Unlock()
if !drift {
@@ -136,7 +143,8 @@ func (am *AlertManager) SetEndpointDriftAlert(drift bool, msg string) {
am.endpointDriftAlert = &Alert{
ID: "local-api-endpoint-drift",
Level: "error",
Message: msg, // composed by the endpoint-drift checker -- R-573
Message: msg, // fail-open fallback when msgKey is empty -- R-573
MessageKey: msgKey,
Link: "/settings",
LinkTextKey: "alert.link.settings",
}