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. 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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions