Skip to content

Enforce the translation output checklist as an automated check, not a prose list #67

Description

@os-zhuang

Blocked-by: #66

Problem

docs/TRANSLATION.md (landing in #65) ends with a pre-PR checklist a translation pass is expected to satisfy: code fences byte-identical to the English source, the page's URL set a subset of the English page's, frontmatter keys matching, MDX component names unchanged, no <script / javascript: / on*=, length within ±40%.

A prose checklist is the weakest form of every one of those rules. The translation pass is an agent with an editor, and the failure mode is not malice but helpfulness — fixing a link it believes is broken, repairing a code sample, restructuring a table while translating. Those produce a PR that reads like a translation and is not one.

The <script / javascript: / on*= items are a different weight class: the English MDX is authored by anyone who can open a PR, it is fed to a model, and the output is committed to a public site. A prompt instruction not to follow embedded instructions is necessary and is not a control. The control is refusing to commit output that fails validation.

Required outcome

A check that runs on translation PRs and fails them when any checklist item is violated, so the list in docs/TRANSLATION.md becomes a description of an enforced rule rather than an aspiration.

Constraints, inherited from the two checks landing in #65 and non-negotiable for the same reasons:

  • Dependency-free, network-free, credential-free. It must run on a fork PR and add no secret to this public repository. Parse frontmatter as text; do not add a YAML dependency.
  • Locales come from apps/docs/lib/i18n.ts, which AGENTS.md names as the authority — do not hardcode the list.
  • Each rule must be demonstrated able to go red. A validator observed only green is indistinguishable from one that cannot fail; include fixtures that trip each rule.

Scope note

Serial with #66 — same file surface (.github/scripts/, .github/workflows/translations.yml, docs/TRANSLATION.md). Do not start before #65 merges.

Not dispatched: objectos currently has no lane or seat in the pm-dispatch protocol, which is open as objectstack-ai/objectstack#9551. This card is filed unassigned and stays in the backlog until that is settled.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions