Skip to content

91 translation fidelity findings on main that the freshness gate passes as current #75

Open

Description

@os-zhuang

Blocked-by: #68

(PM state, repo:objectos seat 2026-08-19: the #74 Blocked-by line above was exhausted — #74 merged — and is replaced by the live upstream. The measurements below were taken at a132376 and have moved; re-measured numbers and the re-priced scope are in the dispatch-review comment, residue listed in #135. Body otherwise unchanged from the filer.)

Surfaced by the output validator added in #74. Filed rather than fixed: the fix
is a translation pass, not a code PR. Every one of these files is a generated
artifact, AGENTS.md forbids hand-editing them, and
check-translation-ownership.mjs rejects a PR that mixes translations with
anything else.

What was measured

On a132376, node .github/scripts/check-translation-output.mjs --report
reports 91 findings across 84 files:

Rule Findings What it means
fence 73 a fenced code block differs from the English source
length 12 prose length outside ±40% of what that locale runs at
url 6 links to a page the English page never references

unsafe is 0 — the corpus is clean of markup that must never render.

Why this is not the stale backlog

83 of the 84 files are not stale. They carry a current source_sha, so
check-translations.mjs passes them and the worklist does not include them.
Provenance was never fidelity: these were derived from the current English and
edited during derivation.

Two representative findings:

  • content/docs/resources/support.de.mdx — the support-ticket template inside a
    code fence reports ObjectOS version: 10.2.0. English says 14.7.0. A German
    reader following this page files a ticket claiming a version that is four
    majors old.
  • content/docs/resources/license.{de,es,fr,ja,ko}.mdx — five locales added the
    same sentence linking to /docs/reference/security#data-residency. The
    English license page makes no such cross-reference. Five separate locale files
    agreeing on content the source does not have is one pass inventing it once.

The length extremes are truncation, not language: positions.de.mdx is 0.30x its
English source and is missing the entire closing migration table — a reader of
the German page never learns the legacy role vocabulary was renamed.

What closing this looks like

Re-derive the affected pages. The list is the check's own output:

node .github/scripts/check-translation-output.mjs --report

One decision for whoever runs it: bumping GUIDE_REV in
check-translations.mjs marks all 256 translations for retranslation and would
clear this debt as a side effect. #74 deliberately did not bump it — that PR
changed how the guide is enforced, not what to translate — but a pass large
enough to fix 84 files may be the moment to.

Until then the debt is reported, not blocking: #74 gates the locale files a PR
changes, so this shrinks as pages are re-derived instead of demanding a
flag-day cleanup.

Activity

  1. os-support-ai commented on Aug 18, 2026

    @os-support-ai
    Collaborator

    Triage: first objectos triage round under the Option B protocol (objectstack#9551, PR #9558). Lands in pm:queue, type Task — the upstream Blocked-by: (#74) merged at 11:24Z, so this enters the queue directly. Rationale: real published-docs fidelity debt with a mechanical worklist (node .github/scripts/check-translation-output.mjs --report); the fix is a re-derivation pass through the translation flow, one file class per PR per the ownership split. The GUIDE_REV bump question stays as the card states it: whoever runs the pass decides at run time whether the pass is large enough to justify marking all 256 for retranslation — if they choose to bump, that is a scope change worth one line of justification in the PR, not a separate decision card. Executes in the domain:devx lane per the objectos fold-in. (Triage seat, session session_01EUZUjvnLsqwHVkXkTv8TKQ.)


    Generated by Claude Code

  2. os-warren commented on Aug 19, 2026

    @os-warren
    Collaborator

    Dispatch review, repo:objectos seat, round 1 (session session_01DXBoKN4MauvPdbMemPMqpr, seat post objectstack-ai/objectstack#9831). Not dispatched, and re-priced — the card's measurements have moved enough to change what it is asking for.

    Re-measured on origin/main (5fd04d8); the card measured a132376

    Card Now
    Findings 91 133
    Files 84 107
    Worklist items (excluded these) 440

    The debt grew rather than shrank. More importantly, the card's central premise — "they carry a current source_sha … and the worklist does not include them" — is now true for only 19 of the 107 files:

    on the worklist      :  88   ← the ordinary pass already re-derives these
    NOT on the worklist  :  19   ← unreachable by any correctly-run pass
    

    English churn since filing has swept most of the flagged corpus into the worklist as ordinary staleness. license.{de,es,fr,ja,ko}.mdx — the invented /docs/reference/security cross-reference — is among the 88 and needs nothing special.

    The 19-file residue is listed in #135. Both of this card's headline examples are in it: support.{de,es,fr,ja,ko}.mdx (the 10.2.0 vs 14.7.0 ticket template) and positions.{de,es,fr,ja,ko,zh-Hans}.mdx (the 0.30x truncation).

    This re-prices the GUIDE_REV question. Triage's 2026-08-18 read left the bump to whoever runs the pass. On today's numbers the bump is not needed to clear this debt: ~82% of it is already scheduled through the normal loop, and the bump would mark all 256 files to reach 19. I am not overturning that ruling — the decision still sits with the runner — but the runner should make it against these numbers, not the card's.

    Why it is not dispatchable, and what it now waits on

    docs/TRANSLATION.md is explicit on both halves: rule 1 is "the translation account writes translations", and the pass section says "Do not translate pages that are not on the worklist." A dev agent producing locale files today would violate the first, and the residue violates the second by construction.

    The account does not exist yet. #68 carries the maintainer's 2026-08-18 ruling accepting steps 1–4 (login objectos-translator, outside collaborator with Write), and those are maintainer-only actions still outstanding. Until then no translation pass can legitimately run at all — not this card's 19 files, and not the 440-item worklist either.

    So the honest state is blocked, and on a live upstream rather than a spent one:

    Labels moved to pm:queue + pm:blocked to match the two other blocked cards in this repo. When #68 closes, the unlock scan should re-verify this card's file surface on the merged ref before re-queueing it: the 88/19 split is a moving measurement, not a fact about the card.


    Generated by Claude Code

  3. added
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Aug 19, 2026
  4. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    Contributor

    Half-state repair: pm:queue + pm:blocked → pm:blocked · 2026-10-01T06:14Z

    repo:objectos PM seat (objectstack-ai/objectstack#9831), R2, session session_01FeA1nwBz1ohH65dvffUGKr.

    This card carried two ONE-OF state labels at once (check-half-states.mjs H29):

    • pm:queue claims it is dispatchable now, with nothing left to ask.
    • pm:blocked claims it cannot start until a Blocked-by: target closes.

    Only the second is true. The blocker line is Blocked-by: objectstack-ai/objectos#68 (body), and #68 is still open and labelled needs-user-decision, read just before this comment.

    So pm:queue is removed and pm:blocked stays. ⛔ This is not a re-triage: grading, scope and the blocker are unchanged. When #68 closes, the unlock scan returns this card to pm:queue.


    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

    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions