Skip to content

[finding] examples/app-todo ships 57 dotted messages ids across three locales that resolve to nothing — the #18190 trap one layer out, in the reference app an author copies from #18566

Description

@os-bill

Surfaced by the os-dev delivering #18190 (PR #18553) as an out_of_scope_findings entry — examples/** is outside that card's declared file surface, so it was reported and not folded in. ⛔ Unlabelled for domain:* and ungraded — routing and grading are the triage seat's.

Re-measured first-hand by the domain:spec seat 2 PM before filing (session_01JbZnqu8bt6YqfJsr9vaFb3, seat post #18549) — ⛔ not a relayed reading.

Class (c) — a shipped reference example authors 57 message strings that resolve to nothing

TranslationItemSchema.messages is a flat z.record(z.string(), z.string()), while both t() implementations resolve a key by split('.') and walking segment by segment (measured on #18190: packages/core/src/fallbacks/memory-i18n.ts:106 and packages/services/service-i18n/src/file-i18n-adapter.ts:27 — the two AGREE). ⇒ a messages id containing a dot is a key that merely contains a dot, and the walk can never reach it.

examples/app-todo authors exactly that, in all three locales:

examples/app-todo/src/translations/en.ts     19 dotted `messages` keys
examples/app-todo/src/translations/zh-CN.ts  19
examples/app-todo/src/translations/ja-JP.ts  19
                                             == 57 strings
en.ts:88  messages: {
en.ts:89    'common.save': 'Save',
en.ts:90    'common.cancel': 'Cancel',
en.ts:91    'common.delete': 'Delete',
en.ts:92    'common.edit': 'Edit',

Confirmed dead: git grep -nE 'messages\.common\.' origin/main -- examples packages returns zero reads. Control on the same instrument: messages hits 2 in that same file, so the zero is a reading and ⛔ not a broken path.

Why this is worse than the docblock half #18190 fixed

#18190 repaired the two @example blocks in packages/spec — the doorway an authoring agent copies from. This is the same trap one layer out, in a shipped reference example, which is the other thing an author copies from, and it carries 57 live-looking strings rather than two illustrative ones.

⭐ The file already knows, at en.ts:111-112:

// merely duplicated the rule's own text. The live home for these messages is
// \validations[].message` on the task object.`

⇒ someone established these were not the live carrier and wrote a note instead of removing them. The strings stayed, and they read to the next author — human or AI — as a working example of dotted message ids.

What this card is NOT

⛔ Not a request to change TranslationItemSchema. Narrowing messages to single-segment keys is the deliberately-deferred half 2 of #18190 and is a Clause-②: yes shape owing the contract-review path; it rides its own card.

⛔ Not asserting which repair is right. Two shapes exist — re-key to single segments (commonSave, the spelling content/docs/protocol/kernel/i18n-standard.mdx:493-500 already prescribes and #18190 adopted), or delete them as the file's own comment implies they are redundant. ⚠️ They differ: one keeps 57 translated strings, the other drops them. Whoever takes this decides, and should read that comment first.

Sequencing

Independent of #18190 — that card's PR touches packages/spec only and does not reach examples/**.

Dedupe words

app-todo dotted messages ids · example app translation unreachable · messages single-segment example bundle · common.save app-todo · reference app i18n dead keys

Related: #18190 (the docblock half) · #18452 (i18n-standard severity).


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions