5-Day Localization Freeze Gate Challenge Before October Next Fest - 2026

Late August 2026: Weblate still accepts commits after someone declared “strings frozen,” translators push one more polish pass, and October Next Fest depot lock is three weeks out. Day 2 someone merges a fuzzy-heavy JA component. Day 4 Steam Supported languages still lists Korean while Preferences only shows English. Day 5 engineering asks whether localization_freeze_ok is real—or only a Slack emoji.
You already have (or should have) the one-evening localization string freeze receipt with gates L1–L6. That tutorial builds the latch once. This Challenges & Community Hooks post is the five-day public ritual that stops “one more string” from reopening the blast radius—gates F1–F5, file localization_freeze_challenge_receipt_v1.json, latch BUILD_RECEIPT localization_freeze_challenge_ok: true, share tag #LocFreeze2026.
Non-repetition note: Freeze evening owns L1–L6 / localization_freeze_ok. 18 free localization QA tools owns validators. 7-day Ren'Py label/asset freeze owns Ren'Py assets and build labels. 5-day Summer Sale store response owns sale-week hub rituals. This URL owns the string-freeze accountability ladder—five days of community-facing stop rules before October depot lock—not another Addressables Invalid Key week.
Pair freeze evening #1, Weblate merge-conflict help, Ren'Py language selector evening, forward Course 289, forward blog #8 weekly jq locale diff and #11 Friday freeze capstone.
Why this matters now (late August → October 2026)
- Verbal freeze fails under October pressure. Upload queues punish teams that rediscover missing locales after SteamPipe starts.
- One evening receipt is necessary but not social. Solo leads still reopen Weblate write access after L6 for “just one string.” A five-day challenge makes the stop rule visible.
- Fest copy claims languages. Supported languages rows without Preferences proof create refund threads—F4 exists for that.
- PO import reopenings are the failure mode. Silent nightly CI that pulls latest Weblate after freeze undoes L2—F3 checks import locks.
- Capstone precedes Friday row review. Forward #11 Friday localization freeze capstone should consume a finished challenge receipt, not invent F-gates mid-meeting.
Direct answer: Five days (~25–40 minutes each); gates F1–F5; artifacts under release-evidence/localization/loc-freeze-challenge-2026/; file localization_freeze_challenge_receipt_v1.json; do not claim string freeze closed for October until localization_freeze_challenge_ok: true on BUILD_RECEIPT and the underlying evening receipt still shows localization_freeze_ok: true.
Who this challenge is for
| Audience | You will… |
|---|---|
| Beginner | Follow one gate per day with a printable card—no guessing Weblate menus |
| Solo founder | Devlog five checklists with #LocFreeze2026 |
| Producer | Block “strings are frozen” marketing until F5 GREEN |
| Working dev | Wire write-access close, PO import lock, and challenge receipt beside L1–L6 |
Prerequisites: TMS access (Weblate preferred); draft or finished freeze evening receipt; installed or RC build for smoke; Steam Supported languages editable.
Time: ~2.5–3 hours total across five days (first challenge); ~90 minutes when repeating next fest.
Challenge vs cousins (format ladder)
| Artifact | Role |
|---|---|
| Freeze evening L1–L6 | Author the freeze latch once |
| Localization QA tools | Validators / TMS helpers |
| Ren'Py asset freeze challenge | Engine asset/label freeze week |
| Metadata freeze challenge | Store metadata fields |
| This challenge | 5-day string-freeze stop ritual |
| Forward #8 jq weekly | Monday locale hash honesty after challenge |
| Forward #11 Friday capstone | Promotion row review latch |
Order: Run or refresh freeze evening so L1–L2 exist → start Day 1 challenge → finish F5 → schedule weekly jq (#8) → Friday capstone (#11) before October upload window.
Rules of the challenge
- One owner signs each day (
day_N_passin receipt). - Fail stops the ladder—do not advertise CN/JP/KR on Day 5 if Day 2 write-access is still open.
- One freeze-truth artifact per day—manifest lock, write-close proof, import lock, parity smoke, or capstone—documented with path + sha256.
- Exception reopenings require a new freeze evening receipt; do not edit old L2 timestamps in place.
- Post daily progress with
#LocFreeze2026. - Hotfix that adds user-visible strings mid-challenge restarts from Day 2 (write-access + import).
- Producer blocks “localization frozen for Next Fest” claims until F5 receipt filed.
Five-day calendar at a glance
| Day | Gate | Primary ritual | Evidence focus |
|---|---|---|---|
| Day 1 | F1 | Lock locale manifest + announce challenge | locale_manifest_v1.json frozen list |
| Day 2 | F2 | Close TMS writes + pin revision | Write-access closed + commit hash |
| Day 3 | F3 | Lock PO/XLIFF import paths | CI import disabled / post_freeze_po_import_allowed: false |
| Day 4 | F4 | Store ↔ in-game parity smoke | EN + two fest locales installed smoke |
| Day 5 | F5 | Capstone receipt + BUILD_RECEIPT latch | Challenge receipt + both OK flags |
Printable card #LocFreeze2026
#LocFreeze2026 — 5-Day Localization Freeze Gate Challenge
Day 1 F1 [ ] locale_manifest locked + challenge announced
Day 2 F2 [ ] Weblate/TMS writes CLOSED + revision pinned
Day 3 F3 [ ] PO import automation LOCKED (no silent latest pull)
Day 4 F4 [ ] Store languages match Preferences; smoke screenshots filed
Day 5 F5 [ ] challenge receipt filed; localization_freeze_challenge_ok = true
Owner: ____________ Start UTC: ____________
Underlying evening receipt path: ____________
Exception ticket (if any): ____________
Pin the card in release-evidence/localization/loc-freeze-challenge-2026/PRINTABLE.txt.
Day 1 — F1 locale manifest lock + public start
Goal: make the in-scope language list non-negotiable and announce the challenge so “one more string” has a social cost.
Beginner steps (25 minutes)
- Open or create
locale_manifest_v1.jsonfrom the freeze evening Block 1. - Confirm every
store_claim: truelocale has an owner. - Set
challenge_start_utcandhashtag: "LocFreeze2026". - Post a short team note: “String freeze challenge Day 1—locales locked, writes close tomorrow.”
Developer evidence
{
"day": 1,
"gate": "F1",
"locale_manifest": "release-evidence/localization/2026-08-25/locale_manifest_v1.json",
"locale_count_in_scope": 4,
"announcement_path": "release-evidence/localization/loc-freeze-challenge-2026/day1-announce.md",
"day_1_pass": true,
"owner": "release-owner"
}
Pass: Manifest committed or archived; announcement timestamped; count matches store intents.
Fail: French still “maybe” without an owner; stop before Day 2.
Common mistake: Starting Day 2 write-close without knowing which locales are in scope.
Day 2 — F2 close writes and pin revision
Goal: turn L2 into a documented social freeze—writers cannot push after tonight without exception tickets.
Beginner steps (30 minutes)
- In Weblate (or Crowdin), set fest components to read-only / disable translator write access.
- Record the revision / commit hash exactly as in freeze evening L2.
- Screenshot the access settings into
day2-write-closed.png. - If merge conflicts block the pin, run Weblate merge-conflict help before claiming F2 PASS.
Developer evidence
{
"day": 2,
"gate": "F2",
"tms_revision": "a1b2c3d4e5f678901234567890abcdef12345678",
"write_access_closed": true,
"closed_utc": "2026-08-26T18:00:00Z",
"screenshot": "release-evidence/localization/loc-freeze-challenge-2026/day2-write-closed.png",
"day_2_pass": true
}
Pass: write_access_closed: true with hash matching evening receipt.
Fail: “We asked people not to push” without technical close.
Outbound: Weblate docs on access control—use your instance’s equivalent.
Day 3 — F3 lock PO import reopenings
Goal: stop CI from silently undoing the freeze by importing latest every night.
Beginner steps (30 minutes)
- Find every job that syncs Weblate → game repo (GitHub Actions, cron, local scripts).
- Disable or gate them on
post_freeze_po_import_allowed == true(should be false after freeze evening L6). - Add a CI comment: “#LocFreeze2026 Day 3—imports locked until new freeze receipt.”
- Commit the workflow change; archive a workflow YAML snippet as evidence.
Developer evidence
{
"day": 3,
"gate": "F3",
"post_freeze_po_import_allowed": false,
"ci_jobs_locked": [
"weblate-sync.yml",
"nightly-po-pull.yml"
],
"workflow_evidence": "release-evidence/localization/loc-freeze-challenge-2026/day3-ci-lock.diff",
"day_3_pass": true
}
Pass: Import automation cannot run without flipping an explicit flag that also requires a new evening receipt.
Fail: Manual “don’t click import” only.
Pair: Engine import still allowed once from the pinned Day 2 export (Ren'Py / Unity / Godot)—that is a controlled import of frozen bytes, not latest TMS.
Day 4 — F4 store ↔ game parity smoke
Goal: prove players can switch every claimed fest locale on an installed build.
Beginner steps (40 minutes)
- Confirm Steam Supported languages match
locale_manifeststore claims (freeze evening L4). - Boot installed build for en + two fest locales (typically
jaandzh-Hans). - Capture main-menu screenshots into
smoke/. - If Preferences empty after PO, follow Ren'Py selector evening or Unity String Tables help—keep F4 RED until fixed.
Developer evidence
{
"day": 4,
"gate": "F4",
"store_parity_doc": "release-evidence/localization/2026-08-25/store_language_parity.md",
"smoke_locales": ["en", "ja", "zh-Hans"],
"smoke_dir": "release-evidence/localization/loc-freeze-challenge-2026/smoke",
"day_4_pass": true
}
Pass: Store claims ⊆ Preferences list; smoke screenshots + log prove no English-only selector.
Fail: Store claims Korean; build cannot select it.
Official reference: Steamworks supported languages.
Day 5 — F5 capstone challenge receipt
Goal: file the challenge receipt and latch BUILD_RECEIPT so marketing and upload owners share one green flag.
Beginner steps (30 minutes)
- Assemble
localization_freeze_challenge_receipt_v1.jsonfrom Days 1–4. - Confirm evening receipt still has
localization_freeze_ok: trueand matching TMS revision. - Set
localization_freeze_challenge_ok: trueonly if F1–F5 all PASS. - Post final
#LocFreeze2026Day 5 note with receipt path.
Capstone JSON
{
"schema": "localization_freeze_challenge_receipt_v1",
"hashtag": "LocFreeze2026",
"challenge_start_utc": "2026-08-25T17:00:00Z",
"challenge_end_utc": "2026-08-29T19:00:00Z",
"evening_freeze_receipt": "release-evidence/localization/2026-08-25/localization_freeze_receipt_v1.json",
"gates": {
"F1": "PASS",
"F2": "PASS",
"F3": "PASS",
"F4": "PASS",
"F5": "PASS"
},
"days": {},
"localization_freeze_challenge_ok": true,
"next_forward": [
"jq weekly locale row diff blog #8",
"Friday localization freeze capstone blog #11"
]
}
BUILD_RECEIPT crosswalk
{
"localization_freeze_ok": true,
"localization_freeze_challenge_ok": true,
"localization_freeze_challenge_receipt": "release-evidence/localization/loc-freeze-challenge-2026/localization_freeze_challenge_receipt_v1.json"
}
Pass: Both OK flags true; paths resolve; no open exception without owner/expiry.
Fail: Challenge GREEN while evening L2 write-access silently reopened—fail F5 and restart Day 2.
verify_localization_freeze_challenge.sh
#!/usr/bin/env bash
set -euo pipefail
R="${1:-release-evidence/localization/loc-freeze-challenge-2026/localization_freeze_challenge_receipt_v1.json}"
test "$(jq -r .localization_freeze_challenge_ok "$R")" = "true"
for g in F1 F2 F3 F4 F5; do
test "$(jq -r ".gates.$g" "$R")" = "PASS"
done
E=$(jq -r .evening_freeze_receipt "$R")
test "$(jq -r .localization_freeze_ok "$E")" = "true"
test "$(jq -r .write_access_closed "$E")" = "true"
echo "localization_freeze_challenge_ok"
Proof table
| Artifact | Proves | Does not prove |
|---|---|---|
| Day 1 announcement | Social start + scope | Translation quality |
| Day 2 write-close | TMS cannot accept new strings | Engine selector wiring |
| Day 3 CI lock | No silent latest import | One-time frozen import quality |
| Day 4 smoke | Claimed languages boot | Every dialogue line polished |
| Day 5 challenge OK | Ritual complete | Forever freeze if writes reopen |
| Evening L1–L6 | Authoritative freeze latch | Five-day accountability |
Scenarios A–G
A - Translator asks for one typo fix on Day 3
Open exception ticket; reopen writes briefly; produce new evening freeze receipt; restart challenge from Day 2. Do not skip F3.
B - CI still pulled PO overnight
Fail F3. Fix workflow. Re-hash Day 2 export. Treat Day 4 smoke as invalid until re-imported from pinned revision.
C - Store lists more languages than Preferences
Fail F4. Remove store claims or finish selector wiring before Day 5.
D - Only Unity String Tables broken
Keep F4 RED; use Unity string tables help; challenge waits.
E - Team wants to skip to Day 5 because “evening receipt exists”
Fail. Challenge exists to prove days 2–4 behaviors stayed locked after the evening.
F - Ren'Py asset freeze week overlaps
Run Ren'Py freeze challenge for assets/labels separately; keep string F-gates here. Share calendar, do not merge receipts.
G - October upload tomorrow and challenge unfinished
Do not invent F5. Delay language claims or slip upload—false GREEN is worse than one day late.
Common mistakes
- Treating
#LocFreeze2026posts as evidence without JSON. - Closing Slack mentions but leaving Weblate writable.
- Allowing nightly PO sync after Day 2.
- Smoking Editor Play Mode for F4.
- Setting challenge OK without evening
localization_freeze_ok. - Editing Day 1–4 JSON in place after a mid-week reopen.
- Confusing this with metadata freeze.
- Confusing this with Summer Sale hub rituals.
Troubleshooting
“Weblate percent is 100% but Day 4 fails.” Percent ≠ selector. Check Preference entries and clean builds.
“Do we need five calendar days?” Prefer five calendar days for social accountability. Solo studios may compress to five focused blocks in two days if each gate still produces dated artifacts—do not skip F3.
“Crowdin instead of Weblate.” Same F2/F3: pin revision, close writes, lock sync jobs.
“What about age rating and dual-SKU?” Separate gates: IARC packet tools and dual-depot dress rehearsal. Soft-launch trend (forward #6) will want all three green.
Scoring sheet (producer-visible)
Use this when someone asks “are we frozen enough for October?” without reading JSON.
| Gate | Weight | GREEN means | RED means |
|---|---|---|---|
| F1 | 15% | Manifest locked + challenge started | Locale list still “TBD” |
| F2 | 25% | Writes closed + revision pinned | Honor-system freeze only |
| F3 | 25% | Import jobs cannot pull latest | Nightly sync still armed |
| F4 | 20% | Store claims match installed Preferences smoke | English-only selector or overclaim |
| F5 | 15% | Challenge receipt + both BUILD_RECEIPT OK flags | Marketing claim without files |
Rule: any RED gate = overall RED. Partial points do not unlock language marketing. Print alongside the #LocFreeze2026 card.
Sample Day 1 announcement (copy/paste)
#LocFreeze2026 Day 1 — F1 PASS
Locales in scope: en, zh-Hans, ja, ko
Out of scope (not on Steam claims this build): fr, de
Writes close tomorrow (Day 2). PO imports lock Day 3.
Evening freeze receipt: release-evidence/localization/2026-08-25/localization_freeze_receipt_v1.json
Owner: @release-owner
Keep the announcement short. The receipt paths are the product; the hashtag is the stop rule made visible.
Honest limits
This challenge does not:
- Grade translation quality or LQA linguistic review
- Replace console board submissions or physical PEGI paperwork
- Freeze store capsules typography (forward multilingual capsule art #7)
- Prove dual-SKU build parity (dress rehearsal)
It only proves your string surface cannot quietly reopen before October depot lock.
Schedule pairing
| When | Pair |
|---|---|
| Before Day 1 | Freeze evening L1–L6 |
| Day 2 fire | Weblate conflict help |
| Day 4 selector fail | Ren'Py language evening |
| After F5 | Forward #8 jq weekly locale diff |
| Friday before upload | Forward #11 Friday freeze capstone |
| Tools refresh | 18 free localization QA |
Key takeaways
- Late August 2026 needs a public five-day stop ritual, not only a one-evening freeze JSON.
- F1 locks the locale manifest and announces
#LocFreeze2026. - F2 closes TMS writes and pins revision—hope is not a gate.
- F3 locks PO import automation so latest cannot sneak in.
- F4 proves store ↔ Preferences parity on an installed build.
- F5 files
localization_freeze_challenge_receipt_v1.jsonand setslocalization_freeze_challenge_ok. - Challenge OK requires evening
localization_freeze_okstill true. - Exception reopenings restart from Day 2 with a new evening receipt.
- Distinct from Ren'Py asset freeze, metadata freeze, and Summer Sale hub challenges.
- Forward weekly jq (#8) and Friday capstone (#11) consume this receipt.
- Fail stops the ladder—do not advertise languages on Day 5 if Day 2 failed.
- Print the card; read it aloud before each day’s claim.
FAQ
What is the localization freeze gate challenge?
A five-day accountability ladder that keeps string freeze honest before October Next Fest depot lock—manifest lock, write-close, import lock, parity smoke, and capstone receipt—using #LocFreeze2026.
How is this different from the freeze evening tutorial?
The evening tutorial authors L1–L6 once. This challenge proves five consecutive days that writes and imports stayed closed and parity still holds.
Can we skip days if we already froze?
No. Skipping Day 3 is how nightly CI reopens the freeze. Compress duration if needed; do not skip gates.
Does #LocFreeze2026 require a public social post?
A team channel or short public note both work. The point is dated social accountability—not engagement metrics.
What if we use Crowdin or Lokalise?
Keep F1–F5. Map “revision pin” and “write closed” to that product’s controls.
Must F4 cover all claimed locales?
Smoke at least EN + two fest locales for the challenge; A/B locales should match your highest-risk claims. Still require store parity table for all claimed locales.
How does this relate to localization contractor spend?
Money worksheet (forward #9) caps cash; this challenge caps string reopenings. Run both in August.
When is the challenge “done”?
When F5 PASS, both BUILD_RECEIPT OK flags are true, and verifier scripts agree—marketing may then claim freeze.
What if engineering ships a zero-string hotfix mid-challenge?
Code-only hotfixes without user-visible string keys may continue under documented exception—but any new UI copy, tooltip, tutorial line, or store localization string restarts Day 2. File the exception ID in Day notes so F5 cannot claim silence when strings changed.
Who owns the Day 3 CI lock if we have no dedicated build engineer?
The challenge owner. Disabling a nightly Weblate sync is a producer-scale change. Prefer a pull request that gates the job on post_freeze_po_import_allowed rather than deleting the workflow forever—future fest cycles need the import path after a clean new freeze.
Related reads
- Your First Localization String Freeze Receipt Before October PO Import
- 18 Free Localization QA Tools for Indie Teams 2026
- Weblate Merge Conflicts Block October Next Fest String Freeze
- Your First Ren'Py Language Selector After Weblate PO Import
- 7-Day Ren'Py Steam Build Label Asset Freeze Challenge
- 5-Day Summer Sale Store Response Ritual Challenge
- 5-Day Store Metadata Freeze Challenge
- itch + Steam Dual-Depot Dress Rehearsal
- jq Gate Sketch for localization_freeze Weekly Locale Row Diff — Monday J1–J6 after challenge F1–F5
Closing
October depot lock is the wrong week to learn Weblate was still writable. Run the five-day ladder: lock the list, close writes, kill silent imports, smoke claimed languages, file the challenge receipt—and only then let marketing say strings are frozen.
#LocFreeze2026 is not a meme first. It is a stop rule with dates, owners, and JSON. Pair it with the evening latch, then hand the pack to weekly jq and Friday capstone before Next Fest upload peak.