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
- 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.
- A separate
--worklist --fidelity mode, so a pass can opt into the residue without changing what a normal pass does.
- 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.
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 --worklistselects on provenance: a page is on the list if its translation is stale, missing, or produced under an olderGUIDE_REV.check-translation-output.mjs --reportselects 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 afence,url, orlengthfinding. When that happens the file is not on the worklist, anddocs/TRANSLATION.mdsays, in the section that defines a pass:So a correctly-run pass is required to skip exactly the files that are known to be wrong.
Measured on
origin/main(5fd04d8)The 19 the pass cannot see:
Both of #75's headline examples are in that residue:
support.*is the ticket template reportingObjectOS version: 10.2.0against an English14.7.0, andpositions.de.mdxis 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_REVquestion #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
--worklistinclude 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.--worklist --fidelitymode, so a pass can opt into the residue without changing what a normal pass does.GUIDE_REVwhen 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:
(The report writes to stderr — dropping it with
2>/dev/nullyields 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.