7-Day Unity Addressables Invalid Key Audit Challenge Before Fest Content Update - 2026
Your Tuesday PR moved UI prefabs into a fest-cut Addressables group. Editor Play Mode still looks fine. The installed demo shows UI_START_BUTTON on the title screen—and the console spam says InvalidKeyException. Localization was exported from Weblate yesterday. Nobody audited keys before the strip.
October 2026 teams run localization + Addressables strip in the same week as Steam fest promotion. String Tables empty in player build is the fix article when tables never shipped. Invalid Key at runtime is the triage checklist when one load fails. This Challenges & Community Hooks sprint is the seven-day audit you run before the content-update PR merges—so invalid keys never reach fest_public.
Non-repetition note: Recent Blog-Create passes shipped Deck log export listicle and crash symbolicate tutorial—this is the first Addressables invalid-key challenge URL, not a metadata checklist or Ren'Py freeze.
Why this matters now (October 2026)
-
Strip PRs remove groups to hit depot size—keys in code often reference assets that left the catalog.
-
Weblate export ≠ Addressables catalog — PO clean while
LocalizedStringstill points at renamed entries. -
Editor lies — Play Mode reads project assets; player builds read built catalogs only.
-
Store-demo mismatch — localized capsules with English-or-key gameplay trigger refund language.
-
BUILD_RECEIPT culture — Wednesday smoke needs
addressables_key_audit_okbesidestring_tablerows. -
AI-assisted refactors — Copilot and batch find-replace rename prefab paths without updating Addressables addresses; grep catches drift only if you run K1 after every tooling merge.
-
Parallel depots — Playtest branch still includes tables while
fest_publicstrips them; facilitators test the wrong SKU unlessbuild_labelis on screen and receipts diff groups per depot.
Direct answer: Seven weekday gates (K1–K7); artifacts under release-evidence/unity/addressables-audit-week/; file addressables_key_audit_receipt_v1.json; hashtag #AddressablesKeyAudit2026 for community accountability; no fest content-update promotion until K7 passes.
Who this is for
| Audience | You will… |
|---|---|
| Beginner | Learn what an Addressables key is and how to grep code safely |
| Unity lead | Freeze catalogs before strip PRs |
| Localization producer | Prove String Tables survived group moves |
| Solo dev | Stop shipping InvalidKeyException logs to fest players |
Engines: Unity 6.x LTS with Addressables + optional Localization package.
Time: ~35–50 minutes per weekday (~5 hours total). Weekends: review logs only.
Challenge vs help articles (format ladder)
| Artifact | Role |
|---|---|
| This challenge | Preventive seven-day audit before content update |
| Invalid Key help | Reactive fix when one key fails at runtime |
| String Tables empty help | Reactive fix when tables stripped from build |
| Localization resource refresh | Tool list—not gate calendar |
Run the challenge the week before merge; open help when a single gate fails in production.
Before you start — readiness checklist
- [ ]
release-evidence/unity/addressables-audit-week/exists - [ ] Addressables package installed; Build → New Build → Default Build Script succeeds once
- [ ] One Development Build or fest player build from current
main - [ ]
build_labelon title screen matches BUILD_RECEIPT - [ ] List of Addressables groups tagged
fest_strip_candidatevsmust_ship - [ ] No gameplay feature work during audit week—keys and catalogs only
- [ ] Playtest form captures
build_label+ first screenshot of main menu text
Rules of the challenge
- One owner signs each weekday log (
gateK_pass). - Fail stops the day—do not start K4 if K3 catalog hash drifted unexplained.
- Renamed address after K2 → restart from K1.
- Installed build proof required on K6—Editor-only passes do not count.
- Pair promotion with Thursday row review.
- Friday Block 5:
addressables_key_audit_pass Y/N.
Challenge calendar at a glance
| Day | Gate | Primary artifact | Pass signal |
|---|---|---|---|
| Mon | K1 | address_inventory_v1.json |
Every runtime key string listed |
| Tue | K2 | catalog_build_fingerprint.txt |
Catalog hash recorded pre-strip |
| Wed | K3 | group_move_plan.md |
Strip groups documented |
| Thu | K4 | build_report_key_hits.csv |
Post-move Build Report enumerates tables |
| Fri | K5 | runtime_load_smoke.log |
Zero InvalidKey in 10-min golden path |
| Sat | — | Review | Compare K2 vs K4 hashes |
| Sun | — | Read-aloud | Seven logs present |
| Mon+1 | K6 | Installed player screenshots | No raw UI_* keys on menu |
| Tue+1 | K7 | addressables_key_audit_receipt_v1.json |
promotion_allowed: true |
Beginner path (read this first)
- Monday — Export a list of every string your C# passes to
Addressables.Load*(spreadsheet OK). - Tuesday — Build Addressables content; save catalog hash to a text file.
- Wednesday — Write which groups move to remote/strip in the fest PR.
- Thursday — Build player; open Build Report; search
StringTable, your UI addresses. - Friday — Play golden path 10 minutes; save Player.log excerpt.
- Weekend — Rest; verify folders.
- Next Monday — Install Steam/playtest build; photograph main menu per locale.
- Next Tuesday — File receipt JSON; set BUILD_RECEIPT boolean.
Do not rename addresses to “fix” keys without updating code—K1 restarts.
Developer path (fest content-update stack)
- Automate K1 with
grep -R "Addressables.Load" Assets/→ CSV. - CI step: fail PR if
addressables_key_audit_receipt_v1.jsonmissing onfest-contentlabel. - Crosswalk keys against
Localization_Localgroup from string table help. - Join
invalid_key_countto refund dashboardstore-copytags. - Forward FMOD strip help when audio keys fail same PR.
Gate K1 — Runtime key inventory (Monday)
Goal: No mystery strings in load calls.
Steps
- Search project:
grep -RIn "Addressables\.Load" Assets/ --include="*.cs" > release-evidence/unity/addressables-audit-week/k1_load_calls.txt
grep -RIn "AssetReference" Assets/ --include="*.cs" >> release-evidence/unity/addressables-audit-week/k1_load_calls.txt
- For each hit, extract literal key or document
AssetReferenceGUID target. - Build
address_inventory_v1.json:
{
"schema": "address_inventory_v1",
"build_label": "fest-demo-2026-10-rc4",
"keys": [
{ "key": "UI/MainMenu", "source": "MenuController.cs:42", "type": "address" },
{ "key": "LocaleIcons", "source": "LocalizationBootstrap.cs:18", "type": "label" }
],
"orphan_literals": []
}
Pass K1: orphan_literals empty OR each orphan has ticket id.
Fail signals: Hard-coded path strings; duplicate keys pointing at different assets; keys containing stale OldFest prefix.
Gate K2 — Catalog fingerprint (Tuesday)
Goal: Know the catalog you are about to mutate.
Steps
- Addressables → Build → New Build → Default Build Script.
- Record
Library/com.unity.addressables/.../catalog.jsonhash:
Get-FileHash ".\Library\com.unity.addressables\aa\Windows\catalog.json" -Algorithm SHA256 |
Format-List
- Save to
catalog_build_fingerprint.txtwith UTC timestamp andbuild_label.
Pass K2: Hash file exists; matches CI artifact if you use cloud builds.
Gate K3 — Group move plan (Wednesday)
Goal: Document strip before engineers move assets.
group_move_plan.md template
# Fest content strip — Addressables group plan
## Must ship (never strip)
- Localization_Local — String Tables + Shared Table Data
- Boot — Bootstrap prefabs
## Strip / remote candidates
- FestOptional — marketing textures (remote OK)
## Keys at risk
| Key | From group | To group | Owner |
|-----|------------|----------|-------|
| UI/HUD | Default | FestOptional | REJECT — move blocked |
Pass K3: Producer sign-off; no String Table in strip column.
Pair: Weblate freeze help for TMS—this gate is engine groups.
Gate K4 — Build Report enumeration (Thursday)
Goal: Prove assets exist in player data after simulated strip.
Steps
- Apply group moves on a branch (not
mainyet). - Build Player with Build Report enabled.
- Export search hits to
build_report_key_hits.csv:
| Asset type | Filename | In player data | Group |
|---|---|---|---|
| StringTable | UI_Strings_ja.asset | Yes | Localization_Local |
| SharedTableData | UI_SharedData.asset | Yes | Localization_Local |
Pass K4: Every key from K1 inventory has a matching row In player data = Yes.
Fail: Zero StringTable rows → stop; read string table help before continuing challenge.
Gate K5 — Runtime load smoke (Friday)
Goal: Ten-minute golden path with clean logs.
Steps
- Install Thursday’s player build.
- Delete prior
Player.log. - Play: boot → main menu → first gameplay scene → open settings → return.
- Grep log:
Select-String -Path "$env:USERPROFILE\AppData\LocalLow\*\*\Player.log" -Pattern "InvalidKey|Invalid key"
Pass K5: Zero matches during golden path.
If matches: Open Invalid Key help; fix; restart K4.
Gate K6 — Installed build locale proof (Monday week 2)
Goal: Visual proof for each shipped locale.
Steps
- Install candidate from Steam/playtest depot.
- Screenshot main menu for
en, plus each fest locale (e.g.ja,zh-Hans). - File
locale_screenshots_manifest.jsonwith paths andbuild_label.
Pass K6: No raw UI_* visible; fonts readable (pixel font pass separate).
Gate K7 — Receipt and BUILD_RECEIPT (Tuesday week 2)
addressables_key_audit_receipt_v1.json
{
"schema": "addressables_key_audit_receipt_v1",
"build_label": "fest-demo-2026-10-rc4",
"catalog_fingerprint_sha256": "abc123…",
"gates": {
"K1_inventory_complete": true,
"K2_catalog_fingerprint": true,
"K3_group_move_signed": true,
"K4_build_report_hits": true,
"K5_runtime_smoke_clean": true,
"K6_locale_screenshots": true,
"K7_receipt_archived": true
},
"invalid_key_count_golden_path": 0,
"localization_tables_in_player_build": true,
"promotion_allowed": true,
"human_signoff": { "role": "engineer", "utc": "2026-06-03T18:00:00Z" }
}
BUILD_RECEIPT columns
"addressables_key_audit_ok": true,
"addressables_key_audit_receipt_path": "release-evidence/unity/addressables-audit-week/addressables_key_audit_receipt_v1.json",
"string_table_receipt_path": "release-evidence/unity/string_table_receipt_v1.json"
Diff on Thursday row review.
Community hook — #AddressablesKeyAudit2026
Post weekday progress (optional):
Day 3 #AddressablesKeyAudit2026 — group move plan signed; zero String Tables in strip column.
build_label: fest-demo-2026-10-rc4
Rules: Post evidence filenames, not entire catalogs; no secrets.
PowerShell: inventory diff (K1 vs catalog)
$inventory = Get-Content "address_inventory_v1.json" | ConvertFrom-Json
# Compare against exported catalog keys from Addressables Analyze tool
# Flag keys in inventory missing from catalog
Unity Analyze → Check for Duplicate Addresses runs Monday after inventory export.
Bash: CI promotion gate (sketch)
#!/usr/bin/env bash
set -euo pipefail
RECEIPT="${1:?addressables_key_audit_receipt_v1.json}"
jq -e '
.schema == "addressables_key_audit_receipt_v1"
and .promotion_allowed == true
and .invalid_key_count_golden_path == 0
and .localization_tables_in_player_build == true
' "$RECEIPT"
echo "addressables_key_audit: OK"
Gate K1 deep dive — key types beginners confuse
| You pass… | Addressables treats it as… | Common bug |
|---|---|---|
"Assets/Prefabs/UI/Menu.prefab" |
Wrong — path not a key | InvalidKey every load |
| Address from Groups window | Correct address | Safe |
Label "locale_ui" |
Label lookup | Must exist on assets |
| GUID string manually typed | Fragile across moves | Breaks after strip |
AssetReference field |
Resolved reference | Breaks if asset moved groups |
Exercise: Open Addressables → Groups, select your menu prefab, copy Address column exactly into address_inventory_v1.json—compare to C# literal character-for-character.
Gate K4 deep dive — Build Report search terms
Run these searches in Build Report after player build:
| Search term | Expect |
|---|---|
StringTable |
≥1 per shipped locale |
SharedTableData |
≥1 |
LocalizationSettings |
Present if using package |
| Your K1 UI addresses | Listed with size > 0 |
*.bundle remote only |
Document if golden path needs network |
Export CSV columns: name, type, size, addressables_group, included_in_player_build.
Gate K5 deep dive — golden path script
Read aloud while logging:
- Cold start (delete
Player.log). - Press any required “click to start” for audio.
- Navigate main menu → new game / continue.
- Reach first interactive gameplay (not credits).
- Open pause/settings if exists.
- Return to menu; quit application.
Duration: 8–12 minutes. Longer sessions hide lazy-loaded keys that fail hour two—add optional K5b row in receipt for “first dungeon load” if your demo needs it.
Localization crosswalk (K3 + K4)
| Weblate export | Unity surface | Gate |
|---|---|---|
| PO merged | String Table entries updated | K4 tables listed |
New msgid |
New table entry key | K1 inventory |
Renamed msgid |
Changes Addressables address? | Restart K1 |
| Font atlas | Asset Table not String Table | Separate art pass |
18 localization tools support TMS; this challenge proves engine inclusion.
Promotion week integration
| Ritual | Addressables tie-in |
|---|---|
| Wednesday smoke | S5 menu legible—no raw keys |
| Thursday row review | Diff addressables_key_audit_ok |
| Friday Block 5 | Archive audit-week folder |
| Refund dashboard | Tag store-copy when CN store + EN keys |
Incident response when K5 fails mid-fest
| Hour | Action |
|---|---|
| 0–1 | Capture Player.log + build_label |
| 1–3 | Map InvalidKey to K1 inventory row |
| 3–6 | Hotfix address or move asset back to must_ship group |
| 6–8 | Rebuild catalog; new K2 fingerprint |
| 8–10 | K5 smoke on hotfix build |
| 10+ | Patch notes + receipt version bump |
Do not rename keys in panic without K1 update—players on old catalogs double-break.
Facilitator / QA CSV columns
Add to playtest spreadsheet:
| Column | Example |
|---|---|
build_label |
fest-demo-2026-10-rc4 |
locale |
ja |
raw_ui_key_seen |
false |
invalid_key_log |
false |
screenshot_path |
evidence/...png |
Evidence folder layout
release-evidence/unity/addressables-audit-week/
README.md
address_inventory_v1.json
catalog_build_fingerprint.txt
group_move_plan.md
build_report_key_hits.csv
runtime_load_smoke.log
locale_screenshots_manifest.json
2026-05-27_gateK1.log
…
addressables_key_audit_receipt_v1.json
Common mistakes
- Passing Editor Play Mode only — K6 fails later.
- Fixing keys in code without catalog rebuild — K2 fingerprint stale.
- Stripping
Shared Table Data— empty tables; not always InvalidKey—both fail fest. - Using asset file paths as keys — Addressables wants addresses, not
Assets/...strings. - Skipping K3 sign-off — engineers move groups Friday night.
- Confusing with Invalid Key help — help is triage; challenge is calendar.
- Promoting on Weblate green alone — TMS does not rebuild catalogs.
Worked example (composite pattern)
| Day | Event | Outcome |
|---|---|---|
| K1 | Found UI/OldMenu literal |
Renamed before strip |
| K3 | Producer blocked HUD move to remote | Tables safe |
| K4 | Build Report missing ja table |
PR rejected |
| K5 | One InvalidKey on settings | Fixed; K4 re-run |
| K6 | Screenshots clean for ja |
Promotion unblocked |
| K7 | Receipt true | Content update merges |
No invented studio metrics—typical October fest strip week pattern.
Key takeaways
- Invalid keys spike when fest strip and localization land same week.
- Seven gates beat one panic grep before upload.
addressables_key_audit_receipt_v1.jsonwires audits to BUILD_RECEIPT.- Build Report is the truth machine—not the Editor.
- Help articles fix failures; this challenge prevents them.
#AddressablesKeyAudit2026optional accountability.- Pair string table help when K4 shows zero tables.
- Pair Deck logs when crashes differ per platform.
- Wednesday smoke runs on same
build_labelas K7. - Forward blog #4 when Proton silent-audio differs from key errors.
- Cloud CI fingerprints must match local K2—or promotion lies about catalog state.
- Audit week bans feature scope; typos in tables OK, new routes are not.
Unity 6.6 / Localization package notes (2026)
Smart Strings and Addressables-driven collections increase strip risk:
- Collections often land in Default group—easy to mark remote by mistake.
LocalizedStringreferences use table entry IDs—renaming entries without rebuild mimics InvalidKey.- Pseudo-localization in Editor masks missing tables until K6 screenshots.
Developer habit: Create Localization_Local group on project day one; never add it to fest strip spreadsheets. Mirror Unity 6 Localization_Local preflight before first strip PR.
Addressables Analyze checklist (Monday afternoon)
Run in Editor after K1 inventory:
| Analyze rule | Action if fail |
|---|---|
| Duplicate addresses | Resolve before K2 build |
| Contiguous bundles | Note for size PR |
| Unreferenced assets | Do not delete during fest week without K3 review |
| Bundle layout | Save screenshot to evidence |
Size strip PR review rubric (for producers)
Reject PRs that:
- Move any asset referenced in K1 without updating inventory
- Place String Tables outside
must_shipgroups - Change addresses without
catalog_fingerprintupdate in PR description - Skip
addressables_key_audit_receipt_v1.jsonattachment on BUILD_RECEIPT
Approve PRs that:
- Include K4 CSV diff in review comment
- List
invalid_key_count_golden_path: 0from receipt - Link playtest screenshots for non-English locales
Comparison to other engine freezes
| Challenge | Engine | Failure mode |
|---|---|---|
| Ren'Py freeze | Ren'Py | Label/save drift |
| Construct freeze | Construct | Event sheet order |
| This URL | Unity | Addressables keys/catalog |
| GDevelop freeze | GDevelop | Save path |
Same release-evidence culture—different artifact names.
Partner diligence sentence
“Fest builds include
addressables_key_audit_receipt_v1.jsonwith seven-gate proof, Build Report enumeration for String Tables, and zero InvalidKey events on golden-path Player.log for build_label….”
Attach audit-week zip beside top-20 receipts hub index row.
Standing engineering standup (30 seconds)
- Catalog fingerprint changed?
- K5 clean on installed build?
- Any
UI_*screenshot from facilitators? - Receipt
promotion_allowedstill true? - Hotfix waiting on Weblate or on Addressables?
If (5) is Addressables, do not merge TMS-only PR until K4 re-runs.
FAQ
We do not use Localization package—still run this?
Yes. K4/K5 still apply to UI prefabs, audio, and gameplay Addressables. Set localization_tables_in_player_build: n/a in receipt with reason.
Remote Addressables for fest—allowed?
Yes if K1 keys resolve to remote catalog entries and K5 smoke runs online. Document remote_catalog_ok in receipt.
How does this relate to Lesson 219?
Lesson 219 — Addressables fest string table receipt is the course milestone; this challenge is the blog-scale calendar.
Can we run challenge in three days?
Compress K1+K2 Monday, K3+K4 Tuesday, K5–K7 Wednesday–Friday only if team already has inventory discipline—otherwise keep seven days.
What if InvalidKey only on Deck?
Run Deck log bundle plus Windows K5—Proton paths differ.
Should we delete unused Addressables during audit week?
No. Deletion is a scope change. Audit week only documents and proves inclusion. Defer cleanup to post-fest.
Does cloud build change K2?
Yes—record fingerprint from CI artifact, not only local Library/. Mismatch between local and cloud is a common K2 false pass.
Sample weekday log (2026-05-27_gateK1.log)
# Gate K1 — 2026-05-27 (Monday)
Owner: [email protected]
build_label: fest-demo-2026-10-rc4
inventory_path: address_inventory_v1.json
keys_enumerated: 47
orphan_literals: 0
analyze_duplicates: resolved (MenuPanel address unified)
gateK_pass: true
next: K2 catalog fingerprint Tuesday 10:00 UTC
Repeat template for K2–K7—auditors grep gateK_pass: true across seven files.
Timebox tip: If K4 Build Report export exceeds 90 minutes, you likely need fewer Addressables groups or a cleaner K3 plan—fest demos should not require enterprise-scale catalogs to pass.
Closing discipline
Half-finished audits hurt worse than skipping: a receipt with promotion_allowed: true while facilitators still post UI_* screenshots destroys trust faster than delaying the content-update PR one day. If K6 fails, set promotion_allowed: false, post the screenshot in the engineering channel, and restart from K3—not from a panic key rename at midnight.
Related reading
- Invalid Key at runtime (help)
- String Tables empty after strip (help)
- Localization tooling resource
- BUILD_RECEIPT beginner
- Wednesday demo smoke
- Thursday row review
- Refund signal dashboard
- Store-demo mismatch recovery playbook
- Lesson 219 — string table fest receipt
- Outbound: Unity Addressables documentation
Next in cluster: Proton Vulkan silent-demo case study (published); blog backlog #5 refund correlation playbook.