Preflight: Add merge-crowdin-translations skill

Branch crowdin-sync at 7156bce64b. Every reviewer is done and every finding is fixed; two decisions wait on you.

Draft PR Mergeable, clean Bots quiet 2 decisions waiting Board: needs response
PR #8508 Files changed Commits Devin review Greptile

What this PR is about

Problem

Bringing Crowdin's translations into Bloom followed a long hand procedure in the localization README that had gone stale. It left out the cherry-picks to release branches and the null merges back up that we do every time. It also never warned that a cherry-pick deletes a release branch's existing translations of strings master has dropped: 2,231 translations on 6.4 and 6.5 in the 2026-10-28 batch, all removed on purpose as it turned out.

What the PR does

  • Adds the merge-crowdin-translations skill. An agent runs it end to end, except pausing and resuming Crowdin's sync. It squashes l10n_master into one commit on master, cherry-picks it to the release branches the developer picks each time, and null-merges them back up. There are no pull requests: the developer approves each push on one decider form.
  • Adds audit_translations.py: per branch, the translations that land on strings it uses, those of different English wording, and always every translation a pick would delete.
  • Wrong translations are fixed on Crowdin as the bot after the developer agrees, and placeholder-only fixes are approved there. A translation is never changed in the repo without the same change on Crowdin.
  • The README keeps the background on Crowdin. Its procedure becomes a pointer to the skill.

Quality gate

CheckResult
Typecheck / lintNot run: no TypeScript or C# in the diff
TypeScript tests (vitest)Not run: no front-end code in the diff
C# tests (dotnet test)Not run: no C# in the diff
Python (audit_translations.py)No suite in this repo. Compiles; re-run on the real 2026-10-28 batch after every fix: 1,208 translations land on master, matching the run
Repo check: e2e specs at nightly sizeDid not apply: no src/BloomE2E/tests/*.spec.ts in the diff
Merge with masterClean (rebased onto master)

What changed this run

Opened the draft PR, then fixed the 5 problems the light review found and the 5 that Devin and Greptile raised between them (one was raised by both). Commits.

Reviewer outcomes

ReviewerOutcome
Local review (light sub-agent pass)5 findings, all fixed: the null-merge check stopped every two-branch run, values didn't carry between steps, two safety checks only printed a warning, and the audit crashed on invalid XML.
DevinComplete. 3 bugs, all fixed; its re-review of 7156bce64b marks all 3 resolved. 1 informational note. Threads, resolved.
GreptileComplete for 186152d809: 3 findings, all fixed and resolved (threads). It has not reviewed the two fix-up commits, which only answer its own and Devin's findings.
CodeRabbitConfigured, but has not posted on this PR.
CI (pr-automation)Passed.

Worth knowing

  • The skill was tested for real on the 2026-10-28 batch by a fresh agent on an earlier version (57f11e62bc). The gaps it hit are fixed here. The newest parts have not been run: re-checking the branch tip before a pick, the stricter null-merge check, and the extra bot checks.
  • No YouTrack card for this branch, so no test ideas were posted.

Decisions

Does this PR need an automated test?

The PR adds no tests. It is an agent procedure plus a helper script that only that procedure runs. The script was checked by hand against the real 2026-10-28 batch (its counts matched the actual run), and is re-run against that batch after every fix. A unit test would need small fixture XLF files and a git repo set up in the test.

Other:

Next step

Other:

Send your answers back

Paste this into the session.