mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-08 19:56:53 +00:00
A batch that named its languages still deployed a server that knew none of them. The role renders load_only from the inventory, the tracked i18n.yml leaves it empty, and an empty load_only makes the image skip prefetch_models.py. Nothing was baked behind the package cache, so the server reached for the whole argos set at runtime over a path no cache serves. The readiness wait then sat for its full hour and gave up with "does not offer", which reads like a server that refuses the language rather than one still downloading it. The lane now renders its own host vars with load_only pinned to the pivot plus the batch, beside the tracked file so the container sees it, and deploy and server carry the codes that decide it. The span guard could not see a hyphen. Its dotted-name alternative matched [A-Za-z]\w*(\.[A-Za-z]\w+)+, and \w excludes -, so a host like argos-net.com was never a protected span: a translation was free to mangle it and the comparison still balanced. Widening the head to [\w-]* brings those names under the same guard the undotted ones already had. A refusal named its criterion and nothing else. "protected-span" says an entry was turned down without saying which span moved, which is the one fact that separates a bad translation from a criterion that is too strict, so the marker now carries lost= and gained= and the per-catalog summary counts the criteria it saw instead of reporting every rejection as a damaged span. Verified in the container against babel 2.18.0: 171 unit tests pass, and the catalog lint holds across all 218 catalogs under the widened regex, which is the gate that would have caught a span the old pattern let through. The rendered vars file pins de, el, en, et, hi and lv, and those catalogs carry their translations. make i18n-tune still calls server with one argument and is fixed separately. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>