I3095 — A count inside a translated sentence is a slot, so a changed number never drops the translation
Key the translation memory on a segment's template, with every standalone number replaced by an <nK/> slot the build fills from the page, and re-key the existing Czech memory by matching each number by value, so a sentence like '153 nodes, 549 edges' or '4 of 26' is translated once and keeps its translation whatever the counts.
DONE wave 0 · p1 · implementation profile · runs alone
Part of public-proof — A visitor sees the product prove itself, and can check every claim it makes.
Objective
Key the translation memory on a segment's template, with every standalone number replaced by an <nK/> slot the build fills from the page, and re-key the existing Czech memory by matching each number by value, so a sentence like '153 nodes, 549 edges' or '4 of 26' is translated once and keeps its translation whatever the counts.
Why
On 2026-10-20 an audit of the live /cs/roadmap/ (finding F11) found 58 of 100 milestone titles and 310 of 799 issue titles in English, and count chips mixed 'N of M' with 'N z M'. One cause was keying: the memory was keyed by the whole segment, numbers included, so every changed count was a segment it had never seen.
Current state
keyOf hashes the segment with its numbers; a changed count is a missing segment.
Desired state
keyOf hashes the template; a translation is admitted only with each <nK/> of its source exactly once; identifiers joined to letters, hyphens, dots or a hash (I3091, v0.30.2, 2026-10-20, 82ac259, #1434) stay literal.
Scope
- scripts/lib/site-i18n.mjs
- scripts/site-translate
- site/i18n/cs/memory
- test/cases/3590_the_site_is_derived_in_every_language.sh
- .ai/repo/project/issues/I3095.yaml
Out of scope
- Plural forms by count (one form per template; a language whose noun changes form for one, two and five is a follow-up)
Dependencies
None. This issue is a root of the graph.
Acceptance criteria
- A page whose sentence carries different counts than the memory's example is translated from the template, with its own numbers
- A translation missing or repeating an <nK/> slot is refused
- Identifiers and versions are never slots
- The existing memory is re-keyed without re-translation: 6942 entries re-keyed, 1183 merged into a shared template, 52 kept under their old key because their numbers do not match one to one
Validation
- env -u MAJORDOMUS_SHARE bash test/run.sh 3590_the_site_is_derived_in_every_language
Evidence required
- count_slot_translates
Evidence
| covers | type | command | result | at commit |
|---|---|---|---|---|
| count_slot_translates | ci | bash test/run.sh 3590_the_site_is_derived_in_every_language | passed in train 3a validate 39712017896 (76c57859663, landed on master 2026-10-22) | 76c5785 |
Timeline
- started
- 2026-10-22T04:37:10Z
- verified
- 2026-10-22T04:39:46Z
- completed
- 2026-10-22T04:42:35Z
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I3095.yaml. Read it back with majordomus plan show I3095.