# LQA Desk > A bilingual linguistic-quality desk. Paste a batch of translated segments beside their source, > with the glossary and the target locale, and get the review that lets you sign the batch off: an > MQM-style QA review, a termbase, a revision of the failing segments, and a locale sign-off. A free > in-browser check reads the batch first and the model then has to answer for every one of its > findings. - URL: https://lqa-desk.skillsafe.ai/ - API tutorial: https://lqa-desk.skillsafe.ai/api.html - Token management: https://lqa-desk.skillsafe.ai/tokens.html - Platform: SkillSafe (https://skillsafe.ai/) - Model: `gpt-terra` (resolves to `gpt-5.6-terra`), publisher markup 1000 bps - Derived from three agent skills: `@jimliu/baoyu-translate` (primary), `@kostja94/translation`, `@shino369/translation-expertise`. A derived work, not affiliated with those skills' authors. ## What it is for Localization quality assurance on a delivered batch, in the browser. The work object is one bilingual paste: source segments beside their translations, in any of six shapes — tab or pipe separated columns, two keyed string tables aligned on their keys, `|||`-delimited pairs, language-prefixed line pairs, blank-line blocks, or plain alternating lines. Everything else — the glossary, the locale, the register, the length budget, the brand list — describes how that batch should be judged. It is not a translation tool. It does not translate a document from scratch, it does not edit files, and it never reaches a repository or a CAT server. It reviews what you paste and gives it back. ## The four lanes All four run over the same paste and return the same envelope. `task` selects one. | `task` | Produces | | --- | --- | | `qa-review` | Per-segment severities, quoted spans in both languages, a fix per error, and an MQM-style score with its arithmetic shown. Verdict: `release-ready` / `fix-then-release` / `rework` / `reject`. | | `termbase` | One approved target per governed source term, every rendering the batch actually used with counts, and the variants to retire. Verdict: `consistent` / `drifting` / `conflicted` / `no-termbase`. | | `revise` | Only the failing segments rewritten, each holding the source's placeholder set, markup, numbers, glossary term and length budget, shown old beside new. Verdict: `all-fixed` / `most-fixed` / `partly-fixed` / `cannot-fix`. | | `locale-brief` | The conventions this language pair is judged on, whether the batch follows each one, and a release note. Verdict: `compliant` / `minor-deviations` / `non-compliant` / `unclear`. | The lanes chain: `termbase` feeds `qa-review`, `qa-review` feeds `revise`, `revise` feeds `locale-brief`. The handoff carries the previous lane's output as `upstream` context; the paste never changes, which is what makes these one app rather than four. ## The free in-browser check Runs on every keystroke, needs no account, costs nothing, and never leaves the browser. It is deterministic — it judges mechanics, not meaning — and its findings are handed to the model as facts it must reconcile. - **Alignment** into segments across the six input shapes, with the shape it chose reported back. - **Placeholders** across ICU (`{name}`, `{0}`), printf (`%s`, `%.2f`), positional printf (`%1$s`), handlebars (`{{name}}`), template literals (`${name}`), Ruby (`%{name}`), bracket (`[[name]]`) and escape (`\n`) forms, compared as multisets. - **Numbers** compared as canonical values, not strings. - **Markup** balance and tag parity. - **Glossary** adherence, banned variants, do-not-translate names. - **Consistency** across the batch: one source term rendered several ways; identical sources with different targets; different sources sharing one target. - **Length**: declared per-segment limits, and the expansion band for the pair. - **Locale**: sentence-final punctuation in the target's own alphabet, half-width punctuation after an ideograph, French no-break spaces, typographic quotes, edge whitespace, double spaces, and untranslated Latin runs left inside a non-Latin target. ## Design decisions that matter if you are quoting this app An inverted finding — reporting a problem that is not there — is treated as worse than a missed one, because a reviewer who is told a correct segment is broken stops trusting the report. Each of the following exists because the naive reading produces a wrong finding: - **`1.5` and `1,5` are the same number.** Numeric tokens are canonicalised to values using each side's own separators, and a genuinely ambiguous token (`1,000` — one thousand, or one?) keeps every reading it could have; a match against any reading counts. - **A numeral spelled as a word is still that number.** An English source saying "one business day" against a Japanese target saying "1営業日" is a correct translation, not an added figure. - **`%2$s %1$s` is a legal reordering.** Placeholders may move; only a real absence is an error. - **A glossary right-hand side of `n/a`, `none`, `-` or `tbd` means there is no agreed term.** It is recorded for reference and never reported as a miss. - **Glossary matching is asymmetric on purpose.** Source-side terms are matched on word boundaries so `log` does not fire inside `login`; target-side terms of four characters or more match as substrings, because German, Dutch and the Nordic languages compound and `Protokoll` is genuinely used inside `Aktivitätsprotokoll`. CJK, Thai and Devanagari match as substrings on both sides, having no word boundaries to anchor on. - **An approved term absent literally drops to minor when an inflected, separable or compounded form is present.** The check is literal and says so rather than insisting. - **Severity is computed from the mitigating facts.** A target identical to its source is informational when the source is a URL, a lone placeholder, a two-character label or a do-not-translate term, and an error when it is real prose. - **One defect reports once.** A missing closing tag reports as unbalanced markup, and the derived "markup missing" is demoted and told which finding explains it; a banned variant demotes the glossary miss it causes. - **Half-width punctuation in a CJK target is flagged only when it directly follows an ideograph**, so `1,000` and `Wi-Fi, Bluetooth` are left alone. - **The payload sample is a golden-ratio draw, never every k-th row.** A fixed stride resonates with the periodic structure a string-table export always has — grouped by screen, by feature, by translator — so a stride of four over a file whose every fourth row is one translator's work would hand the model that one translator alone. Flagged segments are sent first regardless. - **The finding count sent to the model is the length of the array sent**, never the number found. Anything over the payload budget is reported separately as omitted, so the model is never asked to reconcile something it cannot see. ## Cost and account Running a lane is metered against the signed-in user's SkillSafe credits; the free check is not. `ss.estimate()` is called before every run and its `hold_credits` is shown as a reservation, not a price — the charge is usually far lower. The run button is disabled rather than allowed to 402, and every run carries an `Idempotency-Key` that includes the lane, so a retry cannot double-bill. Both bundled examples replay a saved run in every lane, for free and without an account. ## Privacy The paste, the glossary and the notes are read in the browser. They leave it only when you run a lane, and then only as the run input. Review history is stored in the app's declared `reviews` collection against your own account, mirrored in this browser for instant paint; the local mirror is scoped to your platform subject id and removed on sign-out.