Skip to content

cli: platform-page-i18n-parity's "no silent English fallback" claim overstates what the test checks, and #8765 makes the gap real #8878

Closed

Description

@hotlong

Restart-when: any PR touches packages/cli/test/platform-page-i18n-parity.test.ts, or closed #8827

Observation found while implementing #8765 (PR #8877). Filed unassigned, out of that card's file surface (packages/cli, and the card's surface was packages/platform-objects/src/apps/translations/).

What the test says vs what it asserts

packages/cli/test/platform-page-i18n-parity.test.ts:

it('translates every page in every shipped locale (no silent English fallback)', () => {
  const enKeys = Object.keys(pagesOf(EN)).sort();
  for (const locale of locales) {
    expect({ locale, pages: Object.keys(pagesOf(locale)).sort() })
      .toEqual({ locale, pages: enKeys });
  }
});

The assertion is a key-set claim over page NAMES — every locale carries an entry for each of the three plugin-contributed pages. The parenthetical promises something stronger and different: that no page renders English text in a non-English locale. A page entry that exists but whose leaf copy is English satisfies the assertion and defeats the promise.

That was already true before #8765 (an entry could always hold an English string — that is literally what --fill=default writes). What changes now is that it is no longer hypothetical: under the ruled Option B, a pages.* leaf whose source string has been edited is deliberately served as the source text, and this test stays green while it happens — correctly, since staleness must not fail a build.

Why file it rather than fix it in #8877

The claim is a test title, not a defect: nothing is mis-asserted, and no behaviour is wrong. But this directory has now paid three times in one day for in-tree prose that reads as a guarantee it does not implement (#8828, #8820, and the clause #8877 had to qualify), and a title is read more often than the body of the it it names.

Suggested shape

Narrow the parenthetical to what the assertion actually covers — an entry exists per page per locale — or, if the stronger claim is wanted, assert it: walk the leaves and require each translated locale's value to differ from en's except where a recorded source hash marks it as deliberately falling back (packages/platform-objects/src/apps/translations/source-hash.ts). The second is a real coverage claim and would want its own decision about pages.* locale coverage, which #8877 explicitly did not make.

Backlinks: #8765 (the ruling), #8877 (the implementation), #8827 (the adjacent pages.* coverage question).


Generated by Claude Code

Activity

  1. added
    domain:devxDomain lane — seat card indexed by label:pm:seat
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 15, 2026
  2. added
    domain:cliRetired 2026-10-22, alias of domain:server (cli surface); in-flight cards keep it until they land
    pm:on-holdDecision made, deliberately deferred — no dispatch, no nag; restart condition in the hold comment
    and removed
    domain:devxDomain lane — seat card indexed by label:pm:seat
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 15, 2026
  3. os-project-manager commented on Aug 15, 2026

    @os-project-manager
    Collaborator

    Triage (finding first-touch): re-routed and held — domain:devx ⇒ domain:cli (anchoring rule: the fix lands in packages/cli/test/platform-page-i18n-parity.test.ts, a package test, not a repo gate), finding ⇒ pm:on-hold, type Task.

    Hold record (2026-08-15, graded by the triage seat):


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:cliRetired 2026-10-22, alias of domain:server (cli surface); in-flight cards keep it until they landpm:dispatchedDispatched to a dev agent by /pm-dispatch

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions