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
+42
View File
@@ -357,6 +357,48 @@ func (s *Server) localeFuncs(lang string) template.FuncMap {
}
return &out
},
// updateBadge / lifecycleBadge (R-589, v0.258.0) — the two *MetaBadge builders. Their
// Hungarian forms in templateFuncMap are UNTOUCHED, which is the parity guarantee; these
// rebuild the same badge from the bundle, reusing compareInstalledToTemplate and
// EffectiveLifecycle so the DECISION cannot drift between the two languages — only the
// words do. TestLocaleFuncsHungarianBundleMatchesFuncMap pins that hu.json says what the
// Hungarian funcs say.
//
// Found live on 2026-09-20: on an English app page the only Felhom-authored Hungarian left
// was this badge, „Naprakész", with a Hungarian tooltip under it.
"updateBadge": func(st stacks.Stack) *MetaBadge {
switch compareInstalledToTemplate(st) {
case updateCurrent:
return &MetaBadge{
Label: b.Msg(lang, "badge.update.current"),
Class: "tag-ok",
Title: b.Msg(lang, "badge.update.current.title"),
}
case updateBehind:
label := b.Msg(lang, "badge.update.behind")
if days, ok := st.Meta.CatalogSinceAge(time.Now().UTC()); ok {
if days == 0 {
label += b.Msg(lang, "badge.update.behind.today")
} else {
label += b.Plural(lang, "badge.update.behind.days", days)
}
}
return &MetaBadge{Label: label, Class: "tag-warn", Title: b.Msg(lang, "badge.update.behind.title")}
default:
// UNKNOWN renders nothing, in every language — see updatebadge.go.
return nil
}
},
"lifecycleBadge": func(m stacks.Metadata) *MetaBadge {
if m.EffectiveLifecycle() != stacks.LifecycleAbandoned {
return nil
}
return &MetaBadge{
Label: b.Msg(lang, "badge.lifecycle.abandoned"),
Class: "tag-warn",
Title: b.Msg(lang, "badge.lifecycle.abandoned.title"),
}
},
"statusText": func(status string) string {
switch status {
case "pending", "restoring", "done", "failed", "skipped":