Skip to content

[finding] the translation worklist is driven by provenance alone, so fidelity-flagged files can be invisible to every pass that will ever run #135

Description

@os-warren

Measured while re-pricing #75 for dispatch (repo:objectos seat, seat post objectstack-ai/objectstack#9831). Filed unassigned, observation class — recording it, not grading it.

The two lists do not intersect by design

check-translations.mjs --worklist selects on provenance: a page is on the list if its translation is stale, missing, or produced under an older GUIDE_REV. check-translation-output.mjs --report selects on fidelity: whether the translation actually says what the English says.

Nothing connects them. A file can be perfectly stamped — current source_sha, freshness gate green — and still carry a fence, url, or length finding. When that happens the file is not on the worklist, and docs/TRANSLATION.md says, in the section that defines a pass:

Do not translate pages that are not on the worklist.

So a correctly-run pass is required to skip exactly the files that are known to be wrong.

Measured on origin/main (5fd04d8)

fidelity-flagged files : 107   (133 findings)
worklist "out" files   : 440
  on the worklist      :  88   ← the ordinary pass re-derives these
  NOT on the worklist  :  19   ← structurally unreachable

The 19 the pass cannot see:

content/docs/build/data/formulas.zh-Hans.mdx
content/docs/build/interface/apps.zh-Hans.mdx
content/docs/build/interface/dashboards.zh-Hans.mdx
content/docs/build/interface/forms.zh-Hans.mdx
content/docs/configure/mcp.zh-Hans.mdx
content/docs/configure/permissions/field-level-security.zh-Hans.mdx
content/docs/configure/permissions/positions.{de,es,fr,ja,ko,zh-Hans}.mdx
content/docs/configure/users.zh-Hans.mdx
content/docs/reference/objectql.zh-Hans.mdx
content/docs/resources/support.{de,es,fr,ja,ko}.mdx

Both of #75's headline examples are in that residue: support.* is the ticket template reporting ObjectOS version: 10.2.0 against an English 14.7.0, and positions.de.mdx is the 0.30x truncation missing the whole closing migration table. They have been through the gates and come out green on provenance every time.

Why it is worth a card

The debt is self-healing for 88 files and permanently stuck for 19, and nothing in the system distinguishes the two. Today the residue is only visible to someone who runs both scripts and diffs the outputs by hand, which is how it was found. As English pages churn, files move out of the residue by accident (their English source changes, so they go stale and land on the worklist) — meaning the set is real but its membership drifts silently, and a file can sit in it for months.

This also re-prices the GUIDE_REV question #75 raises. Bumping it marks all 256 translations for retranslation and would clear the residue as a side effect — but as a way of reaching 19 files that is a very large hammer, and it is only necessary because there is no smaller mechanism.

Options, not a recommendation

  1. Make --worklist include pages with fidelity findings. Smallest change, and it puts the two checks on one loop. Needs care that a false-positive fidelity rule cannot pin a file to the worklist forever, re-derived and re-flagged on every pass.
  2. A separate --worklist --fidelity mode, so a pass can opt into the residue without changing what a normal pass does.
  3. Leave the selection alone and bump GUIDE_REV when the residue justifies it, accepting a full-corpus retranslation as the only route.

Landing point for 1 and 2 is .github/scripts/check-translations.mjs; option 3 is not code.

Reproduce:

node .github/scripts/check-translation-output.mjs --report 2>&1 | grep -oE 'content/docs/[^ ]+\.mdx' | sort -u > /tmp/fidelity.txt
node .github/scripts/check-translations.mjs --worklist | grep -oE '"out": "[^"]+"' | sed 's/"out": "//;s/"//' | sort -u > /tmp/worklist.txt
comm -23 /tmp/fidelity.txt /tmp/worklist.txt

(The report writes to stderr — dropping it with 2>/dev/null yields an empty set that looks like a clean corpus.)

Not dispatched by the repo:objectos seat: no translation pass can run at all until the dedicated account in #68 exists, so the residue has no consumer today either way.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions