Ren'Py Steam Build Label Not Found After Freeze Persistent Schema Bump - How to Fix
Problem: Your Steam visual novel demo launches, then hard-crashes or returns to the main menu with Label 'chapter_3_hub' not found (or similar). Launcher “Run Project” in the editor still works. You bumped persistent_schema_v1.json mid–freeze week after a writer patch, but never regenerated label_inventory_v1.json or rebuilt the RPA archive on the depot you promoted.
Who is affected now: Teams running the 7-day Ren'Py build label and asset freeze in May–October 2026. The failure shows on packaged and Steam-installed builds—not when jumping labels inside the editor—because the shipped .rpa (or loose script bundle) does not contain labels that exist only in your dev tree.
Fastest safe fix: Regenerate label_inventory_v1.json from the same commit you ship → bump save_format_version with a save_incompatible migration label → run renpy.sh compile (or launcher Build Distributions) from a clean build/ folder → set gate6_steam_install: true in renpy_freeze_receipt_v1.json only after installed Steam smoke reaches the new label in under 30 seconds → re-promote fest_demo with a new build_label.
Direct answer
The traceback means the running build’s script archive does not define the label your jump or menu action targets. A persistent schema bump without a matching label inventory regen and full rebuild leaves Steam serving an old RPA while script.rpy on disk already references chapter_3_hub. Ren'Py does not hot-patch labels into a promoted depot—you must recompile, re-archive, and re-upload.
Why this issue spikes in May 2026
- The Ren'Py freeze challenge introduced
persistent_schema_v1.json—writers treat schema edits as “save fix only.” - Mid-freeze dialogue patches add
jump chapter_3_hubwithout updating Monday’s inventory. build.classification: demoexcludes script files that still exist in dev but never entered the demo package list.- Branch promotion copies an RPA built before the schema bump—same class of drift as save-slot label mismatch.
Pair with 12 Free Defold GDevelop Ren'Py save-path audit resources for persistent-path discipline on the same promotion day.
Symptoms and search phrases
- Traceback:
Label '…' not foundon first play after Steam update; editor play OK. - Main menu loads; Start Demo crashes within 30 seconds.
- Save/load jumps to a label missing from
label_inventory_v1.json. persistent.save_format_versionmismatch causesRestart()loop before gameplay.build_labelon title does not match BUILD_RECEIPT row after hotfix.- Autosave fires before
demo_entry_label—loads invalid state.
Root causes (check in order)
label_inventory_v1.jsonstale — new labels not listed after writer merge.- Demo classification excludes script —
chapter_3.rpynot indemoclassification. - RPA archive not rebuilt — Steam depot still serves pre-bump
scripts.rpa. build.classificationstillallorreleasewhile fest needsdemo.- Persistent defaults incompatible — old saves jump to removed labels.
config.developertrue masks missing labels in editor only.- Playtest depot promoted instead of fest RPA—see playtest isolation.
Fastest safe fix path
Step 1 — Regenerate label inventory (Gate 1 replay)
From project root, list every label reachable in the demo route:
# Example — adjust path to your Ren'Py SDK
./renpy.sh . lint
Update label_inventory_v1.json:
{
"schema": "label_inventory_v1",
"project_version": "0.6.0-freeze-week",
"demo_entry_label": "start_demo",
"labels": [
{ "name": "start_demo", "reachable_in_demo": true, "file": "script.rpy" },
{ "name": "chapter_3_hub", "reachable_in_demo": true, "file": "chapter03.rpy" }
],
"excluded": [
{ "name": "debug_cheats", "reachable_in_demo": false }
]
}
Pass: Every jump, call, and menu action in demo routes appears in labels[].
Fail: Orphan jump in chapter03.rpy but label only in dev-only file not in demo classification.
Step 2 — Align persistent schema and migration label (Gate 4)
Bump save_format_version in persistent_schema_v1.json and ship a visible migration:
{
"schema": "persistent_schema_v1",
"save_format_version": 3,
"migration": {
"on_version_mismatch": "jump save_incompatible",
"message_label": "save_incompatible"
}
}
In script.rpy:
label save_incompatible:
"This demo was updated. Earlier saves cannot be loaded."
$ persistent.save_format_version = 3
jump start_demo
Pass: Old saves show message—not traceback.
Fail: Silent reset at wrong label → inventory still missing start_demo.
Writer rule: schema bump and inventory regen land in the same commit.
Step 3 — Clean compile and rebuild distributions
- Delete stale output:
build/,dist/, and old*.rpaunder the game directory (backup first). - Confirm
options.rpy/build.rpyclassifyrules include demo script files. - Run compile:
./renpy.sh . compile
- Build desktop package with frozen
build.classification: demo(see build classification freeze). - Verify new
build_labelon title screen matches receipt.
Pass: renpy.sh . compile exits 0; no “could not find label” in log.
Fail: Compile warns about unknown jump—fix before SteamPipe.
Step 4 — Steam install smoke (Gate 6)
On a machine that only has the Steam-installed build:
- Launch from library (not developer folder copy).
- Start demo → reach
chapter_3_hubwithin 30 seconds. - Save slot 1 → quit → relaunch → load.
- Confirm no traceback on cold boot.
Update renpy_freeze_receipt_v1.json:
{
"schema": "renpy_freeze_receipt_v1",
"build_label": "vn-nextfest-2026-05-24-rc2",
"save_format_version": 3,
"gates": {
"gate1_label_inventory": true,
"gate4_persistent_schema": true,
"gate5_round_trip": true,
"gate6_steam_install": true
},
"freeze_pass": true,
"promotion_allowed": true
}
Do not set promotion_allowed: true until Gate 6 passes on the same build_label you upload.
Step 5 — Promote fest branch with new depot only
- Upload rebuilt package to
fest_demo(not playtest) per October Steamworks distribution spine. - Run Wednesday metadata diff—chapter count in store copy must match inventory.
- Attach receipt beside BUILD_RECEIPT.
Verification checklist
- [ ]
label_inventory_v1.jsonlists every demo-route label including post-patch hubs. - [ ]
save_format_versionbumped withsave_incompatiblepath tested. - [ ]
renpy.sh . compileclean on CI or release machine. - [ ] New RPA timestamps after schema bump commit.
- [ ] Installed Steam build reaches
chapter_3_hubin < 30 s. - [ ]
gate6_steam_install: truein freeze receipt. - [ ] Store FAQ chapter scope matches inventory.
Prevention
- Same-commit rule:
persistent_schema_v1.jsonchange → regen inventory → compile in one PR. - Freeze week moratorium on new labels unless producer restarts Gate 1.
- CI grep: fail build if
jumptargets not in inventory JSON (simple script). - Pair narrative patches with local voice-notes workflow—draft labels before they enter
script.rpy. - Separate playtest vs fest
build_labelrows in isolation playbook.
Troubleshooting
| Symptom | Fix |
|---|---|
| Editor OK, Steam fails | Rebuild RPA; editor uses loose scripts |
| Label exists, still missing | Check demo classification excludes file |
| Crash only on load | Migration label missing; old save jumps removed label |
| Wrong chapter after load | persistent chapter_id out of sync—bump schema + wipe |
| Playtest OK, fest fails | Wrong depot promoted; verify build_label in-game |
| Compile OK, instant menu return | config.developer / wrong demo_entry_label |
FAQ
Do I need to rename the label in dialogue only?
If the label name changed, update every jump and menu action, then regen inventory. Renaming without rebuild leaves Steam on old archives.
Is this the same as save-slot UI mismatch?
Related promotion failure—save-slot case study covers UI slot numbers vs disk paths; this help covers missing script labels in the RPA.
Can I patch only persistent without rebuilding?
No for missing-label tracebacks. Persistent fixes alone do not add chapter_3_hub to the shipped archive.
What about Steam Cloud saves?
If Cloud is enabled, document wipe policy when save_format_version bumps—local-only demos should say so in FAQ parity.
Related links
- 7-Day Ren'Py Steam Build Label and Asset Freeze Challenge (2026)
- 12 Free Defold GDevelop Ren'Py Save-Path Audit Resources
- Mismatched Save Slot Labels After Branch Promotion
- Wednesday Demo Build Smoke Ritual
- Local Voice Notes to Quest Drafts (narrative QA)
- Ren'Py — Building distributions
- Ren'Py — Persistent data
Regenerate the inventory the same day you bump save_format_version—then Steam players see the labels your writers already wrote.