7-Day Construct 3 Event-Sheet Order Freeze Challenge Before Steam NW.js Ship - 2026
You finished the RNG seed ledger evening pipeline. Test C passed once. Then a teammate added a UI shake group above RunRNG, exported NW.js for Steam, and playtesters reported different boss drops on desktop than in the itch tab you approved yesterday.
That is not bad luck. It is unfrozen event-sheet order meeting a new runtime surface.
Q3–Q4 2026 Construct teams wrapping browser roguelites in NW.js discover replay bugs after desktop export—when fest branches are already promoted. This Challenges & Community Hooks sprint installs a seven-weekday freeze: one gate per day, one pass log per gate, no NW.js manifest preflight until Sunday’s read-aloud shows seven consecutive passes on the same project_version lineage.
Non-repetition note: Yesterday’s post was a beginner tutorial (one evening, seed ledger). This is a seven-day challenge with daily gates and NW.js manifest coupling—not a second checklist on Steam FAQ lines or metadata parity.
Why this matters now (May 2026)
- NW.js ≠ browser preview — Resume paths, focus events, and file-based saves differ; sheet order bugs surface on relaunch, not in five-minute editor tests.
- H2 2026 roguelite density — Players compare your demo to Godot floor coordinators and Phaser streaming discipline—Construct must show the same evidence culture.
- Fest branch promotion — BUILD_RECEIPT culture without sheet freeze produces receipts that lie about replayability.
- Team parallel work — Event sheets invite “quick fixes” that reorder groups; freeze week stops silent drift.
- October 2026 traffic — Fix determinism in May–August, not during refund threads tied to “lost run” language on itch demos.
Direct answer: Run one gate per weekday; log gateN_pass under release-evidence/rng/freeze-week/; do not export NW.js for Steam until Gate 7 passes and sheet_freeze_receipt_v1.json shows freeze_pass: true.
Who this is for
- 1–3 person teams shipping Construct HTML5 → NW.js → Steam in 2026
- Devs who completed (or will complete Day 1–2 alongside) the seed ledger tutorial
- Producers tired of “cannot reproduce” playtest rows missing
seed_id - Anyone promoting a fest demo branch without a written group order law
Time: ~50–70 minutes per weekday (~7 hours total). Weekends: evidence review and read-aloud only—no new feature work.
Before you start — readiness checklist
- [ ]
release-evidence/rng/exists withrng_seed_ledger.jsonor empty template ready - [ ] Frozen
project_versionstring for challenge week (e.g.0.5.0-freeze-week) - [ ] Main gameplay event sheet named in team docs (not “Sheet1”)
- [ ] NW.js export template tested once (even if failing—know the button)
- [ ] Second tester available Wednesday+ (solo dev can be “future you” with written steps)
- [ ] No new gameplay features during freeze week—balance tweaks only if logged in gate notes
- [ ] Playtest form includes
seed_idper 18 playtest tools
Rules of the challenge
- One owner signs each weekday log (solo dev signs writer + re-runner on Gate 5).
- Fail stops the day—fix before
gateN_pass; no “we will verify tomorrow.” - Artifacts live in
release-evidence/rng/freeze-week/YYYY-MM-DD_gateN.log—not Discord pins. - Sheet order changes after Day 3 require
project_versionbump and restart from Day 1. - Pair with 7-day cold-hash challenge only after freeze week if upload month collides—replay truth before hash theater.
- Add one line to Friday Block 5 until NW.js ship:
sheet_freeze_pass Y/N.
How this differs from the seed ledger tutorial
The evening pipeline builds rng_seed_ledger.json and passes Tests A–C once. This challenge freezes sheet order for seven weekdays so teammates cannot silently reorder groups while you prepare NW.js. Think muscle memory, not a single heroic night.
Challenge calendar at a glance
| Day | Gate | Primary artifact | Pass signal |
|---|---|---|---|
| Mon | 1 | sheet_inventory_v1.json |
Every sheet + group listed |
| Tue | 2 | tick_group_order frozen in ledger |
RunRNG top; screenshot |
| Wed | 3 | active_on_start_audit.csv |
Zero surprise auto groups |
| Thu | 4 | random_surfaces complete |
Zero UNAUDITED gameplay rows |
| Fri | 5 | Browser Tests A–C | replay_pass: true in receipt |
| Sat | — | Evidence review | No new gates |
| Sun | — | Read-aloud | Seven logs present |
| Mon+1 | 6 | NW.js Test C | Desktop resume matches browser |
| Tue+1 | 7 | sheet_freeze_receipt_v1.json |
Manifest export allowed |
Teams shipping within one calendar week may run Gate 6 Monday afternoon and Gate 7 Tuesday morning after Gate 5 passes—do not skip Gate 6 on editor preview alone.
Beginner path (read this first)
If event sheets feel overwhelming, treat each day as one checkbox:
- Monday — List every sheet name in a JSON file.
- Tuesday — Move
RunRNGto the top; take a screenshot. - Wednesday — Turn off “Active on start” on experimental groups.
- Thursday — Find every
random(in the project; write it in the ledger. - Friday — Refresh browser mid-run; loot should match.
- Next Monday — Repeat refresh in exported
.exe. - Next Tuesday — Write a receipt JSON that says you are allowed to export.
Success check: A friend can read your ledger and reproduce Gate 5 without asking you which sheet is “the real one.”
Developer path (evidence stack)
- Join
sheet_freeze_receipt_v1.jsonto BUILD_RECEIPTbuild_id. - Store gate logs under release evidence taxonomy
rng/freeze-week/. - Block fest branch promotion when
freeze_passis false—same severity as openblockerrefunds in refund dashboards. - Cross-link playtest CSV
seed_idto ledgerrun_idevery Friday. - File NW.js failures in 5-day crash log challenge folders by weekday.
Day 1 (Monday) — Sheet and group inventory freeze
Goal: sheet_inventory_v1.json lists every event sheet, layout, and group with stable IDs.
Create release-evidence/rng/freeze-week/sheet_inventory_v1.json:
{
"schema": "sheet_inventory_v1",
"project_version": "0.5.0-freeze-week",
"sheets": [
{
"name": "Game",
"layout": "Dungeon",
"groups": ["RunRNG", "WorldSim", "Combat", "UI"],
"owner": "gameplay"
},
{
"name": "Menu",
"layout": "Title",
"groups": ["MenuRNG", "MenuUI"],
"owner": "menu"
}
]
}
| Step | Action |
|---|---|
| 1 | Export project; open each event sheet in Construct |
| 2 | Copy group names top-to-bottom per sheet |
| 3 | Note which layout each sheet belongs to |
| 4 | Second person regenerates list from editor—must match |
Pass criteria: Two independent inventories identical; no unnamed “Group” left as default.
Log line: gate1_inventory_frozen project_version=0.5.0-freeze-week sheet_count=N group_count=M
Common fail: Forgot includes sheet or includes from addon—list those under includes[] with version numbers.
Day 1 troubleshooting
| Symptom | Fix |
|---|---|
| Group lists differ | Check collapsed groups hidden in editor |
| Two “Game” sheets | Rename in inventory; fix editor names Day 2 |
| Addon injects events | Document addon sheet separately |
Day 2 (Tuesday) — Pin RunRNG and document tick order
Goal: tick_group_order in rng_seed_ledger.json matches screenshot; RunRNG is first on gameplay sheet.
| Step | Action |
|---|---|
| 1 | Move RunRNG above all gameplay groups |
| 2 | Set RunSeed once on layout start inside RunRNG only |
| 3 | Update ledger tick_group_order array |
| 4 | Screenshot debugger + sheet with date in filename |
Pass criteria: Screenshot shows RunRNG at top; ledger row audited: true for layout start seed.
Log line: gate2_runrng_pinned screenshot=screenshots/gate2-YYYY-MM-DD.png
Pair with tutorial: Re-read Block 2 — Pin the RunRNG group if Tuesday fails twice.
Common fail: Duplicate On start of layout on Menu sheet resets seed when returning from pause—add RunInitialized boolean guard documented in ledger notes.
Day 3 (Wednesday) — Active-on-start audit
Goal: active_on_start_audit.csv documents every group’s “Active on start” flag.
sheet,group,active_on_start,risk,action
Game,RunRNG,true,low,expected
Game,Combat,true,medium,verify no random() on tick
Game,FX_Legacy,false,high,disabled until audited
| Step | Action |
|---|---|
| 1 | Walk every group in inventory |
| 2 | Record Active on start Y/N |
| 3 | Disable experimental groups not needed at layout start |
| 4 | Re-run 30-second smoke—game still boots |
Pass criteria: No high risk row remains active_on_start=true unless documented with salt strategy.
Log line: gate3_active_audit rows=N high_risk_open=0
Common fail: UI particles group active on start consuming RNG before combat—move to triggered subgroup.
Day 4 (Thursday) — random() surface completion
Goal: random_surfaces[] in ledger has zero gameplay rows with audited: false.
Worked example — fixing a late-week regression
Suppose Wednesday’s audit finds UI_Shake still calls random(100) every tick. Combat rolls shift; Gate 5 Test C fails with “loot wrong after refresh” even though RunSeed looks stable.
Fix sequence (same day, before log pass):
- Disable Active on start for
UI_Shakeor move shake to triggered one-shot. - Replace tick
random(100)withrandom(900000 + uid)documented as cosmetic stream. - Re-run Gate 4 count—search
random(must equal ledger row count. - Re-run Gate 5 Test C—do not defer to weekend.
Document the regression in YYYY-MM-DD_gate4.log:
regression_found UI_Shake tick random
fix_applied cosmetic salt 900000+uid
retest_gate5 pending same day
This pattern matches the Case Study pitch still on the blog backlog (pinned groups + seed manifest vs “lost run” fest reports)—your gate log is the honest version without invented revenue metrics.
Gate log template (copy for every weekday)
Create release-evidence/rng/freeze-week/YYYY-MM-DD_gateN.log:
gate_number=4
project_version=0.5.0-freeze-week
owner=GamineAI Team
started_utc=2026-05-22T14:00:00Z
finished_utc=2026-05-22T15:10:00Z
result=pass
surfaces_total=23
unaudited=0
notes=MenuSeed separated; FX_Legacy disabled
Consistent log shape lets you paste excerpts into partner upload ZIP README maps later without rewriting prose.
| Step | Action |
|---|---|
| 1 | Project-wide search random( in Construct |
| 2 | Add missing rows to ledger |
| 3 | Apply salt pattern from tutorial salt table |
| 4 | Mark menu/cosmetic streams separately (MenuSeed) |
Pass criteria: Lead dev signs CSV export of surfaces; count matches search results.
Log line: gate4_random_audit surfaces=N unaudited=0
Tooling tomorrow: Backlog pitch #4 listicle will name debugger plugins—tonight use built-in finder only.
Common fail: JavaScript function block calls Math.random()—either ban for gameplay or ledger as separate stream with explicit seeding.
Day 5 (Friday) — Browser replay Tests A–C
Goal: rng_replay_receipt_v1.json with replay_pass: true on itch or local preview build tagged project_version.
| Test | Pass |
|---|---|
| A — Fresh run | Loot + spawns noted |
| B — Save/load | run_seed + run_nonce restored |
| C — F5 refresh | Same loot sequence after resume |
Store updated receipt in release-evidence/rng/rng_replay_receipt_v1.json.
Log line: gate5_browser_replay replay_pass=true build_tag=0.5.0-freeze-week
Common fail: Autosave key not versioned—bump roguelite_autosave_v1 → v2 when adding run_nonce.
Promotion gate: Do not tag #fest-demo branch on Friday if Gate 5 fails—fix Saturday review, re-run Monday if needed.
Weekend — Evidence review (Saturday–Sunday)
Saturday: Zip freeze-week/ logs; verify seven files exist or explain missing with version bump plan.
Sunday read-aloud (15 minutes):
- Read
tick_group_orderaloud—team agrees order is law until ship. - Confirm
unaudited=0from Gate 4 log. - Confirm
replay_pass=truefrom Gate 5. - Schedule Gate 6 NW.js test owner and machine name.
No coding Saturday unless fixing a documented fail from Friday—scope creep voids freeze week.
Day 6 (Monday week 2) — NW.js replay Test C
Goal: Desktop NW.js export passes Test C equivalent—close mid-run, relaunch, resume, same loot.
| Step | Action |
|---|---|
| 1 | Export NW.js with project_version string visible in title or log |
| 2 | Run Test C on clean machine if possible |
| 3 | Compare ledger run_id row to desktop log |
| 4 | Note platform delta in gate log notes |
Pass criteria: Matching loot table or documented acceptable delta (e.g. menu-only particle variance) with wont-fix tag—not silent drift.
Log line: gate6_nwjs_replay replay_pass=true exe_hash=optional
Honest limit: NW.js may differ on frame timing; loot and spawn tables must match, not necessarily particle frame phase.
Cross-link: Construct 3 guide for export settings; no-code path for teams new to desktop wrap.
Day 7 (Tuesday week 2) — Sheet freeze receipt and manifest preflight
Goal: sheet_freeze_receipt_v1.json authorizes NW.js Steam manifest work.
{
"receipt_type": "sheet_freeze_receipt_v1",
"project_version": "0.5.0-freeze-week",
"gates": {
"gate1_inventory": "pass",
"gate2_runrng": "pass",
"gate3_active_audit": "pass",
"gate4_random_audit": "pass",
"gate5_browser_replay": "pass",
"gate6_nwjs_replay": "pass"
},
"freeze_pass": true,
"tick_group_order": ["RunRNG", "WorldSim", "Combat", "UI"],
"unaudited_random_surfaces": 0,
"reviewer": "GamineAI Team",
"observed_date_utc": "2026-05-29"
}
| Step | Action |
|---|---|
| 1 | Aggregate seven gate logs |
| 2 | Write receipt JSON |
| 3 | Attach receipt path to BUILD_RECEIPT upload notes |
| 4 | Run Wednesday demo smoke ritual next week before branch promotion |
Pass criteria: freeze_pass: true; all gate keys pass; project_version matches NW.js binary under test.
Log line: gate7_freeze_receipt freeze_pass=true
After Gate 7: You may proceed to Steam depot / manifest preflight blogs—not before.
Proof table (developer)
| Claim | Evidence | Pass |
|---|---|---|
| Sheet order law | sheet_inventory_v1.json |
Gate 1 |
| RunRNG pinned | Screenshot + ledger | Gate 2 |
| No surprise auto groups | active_on_start_audit.csv |
Gate 3 |
| RNG audited | unaudited=0 |
Gate 4 |
| Browser replay | replay_pass: true |
Gate 5 |
| Desktop replay | Gate 6 log | NW.js Test C |
| Ship authorized | freeze_pass: true |
Gate 7 |
Common mistakes across the week
- Skipping Gate 6 because “browser passed”—desktop resume bugs are the trend hook.
- Renaming groups mid-week without version bump—voids freeze.
- Adding Tuesday feature “just one enemy”—reorders tick consumption.
- Testing only in editor—F5 in preview ≠ itch iframe.
- Merging Menu and Run seeds—menu particles shift combat rolls.
- No second human on Gate 1—inventory typos propagate six days.
- Exporting Steam build before Gate 7—partners receive nondeterministic demos.
- Ignoring async callback random()—Gate 4 false pass.
- Freeze week during major addon upgrade—reschedule week.
- Treating challenge as metadata—this is gameplay truth, not store copy.
Community hook (optional, no fake personas)
Post a build note or devlog section:
Freeze week complete —
project_version 0.5.0-freeze-week, sheet order locked, NW.js replay verified. Playtesters: includeseed_idfrom pause menu.
Do not invent Discord servers or @mentions to studios that do not exist. Share the receipt filename and gate calendar—readers copy the discipline, not your follower count.
Cross-engine floor (without rehashing WASM-only posts)
| Engine | Freeze analogue | Construct this week |
|---|---|---|
| Godot | Threaded loader epoch | Group order + save keys |
| Phaser | Chunk pool contract | random() audit |
| Construct | This challenge | NW.js Gate 6 |
Future backlog #7 compares Godot loaders to tick groups—read after you pass Gate 7.
Pairing with other seven-day sprints
| Sprint | Order |
|---|---|
| Wishlist truth audit | After gameplay truth |
| Store metadata parity | After freeze + replay |
| Cold-hash challenge | After NW.js binary frozen |
Gameplay freeze before store copy—otherwise you document lies efficiently.
Salt and save reminders (from tutorial)
Carry forward from the seed ledger:
- Loot salt
1000 + index - Room pick
2000 + floor_index - Autosave includes
run_seed,run_nonce,floor_index - Backlog #2 save-format semver when daily modifiers ship mid-fest
Freeze week does not replace semver—it prevents reorder bugs while you design semver.
Key takeaways
- NW.js Steam exports in Q3–Q4 2026 expose replay bugs browser tests hide.
- Seven weekday gates freeze inventory, RunRNG, active flags, random audit, browser replay, NW.js replay, receipt.
- Fail stops the day—no yellow passes.
- Sheet order changes after Day 3 require version bump + restart.
- Builds on RNG seed ledger tutorial—different format, not duplicate URL.
sheet_freeze_receipt_v1.jsongates manifest preflight.- Beginners get one checkbox per day; developers get proof tables and BUILD_RECEIPT joins.
- Challenges category rotates after Tutorial Construct post.
- 10 backlog pitches remain after this pass.
- Pair with playtest
seed_idand Friday Block 5 maintenance. - Gameplay truth before metadata sprints.
FAQ
Can I run freeze week without the evening tutorial?
Yes, but Days 2–5 are harder—complete tutorial first when possible.
What if Gate 5 passes but Gate 6 fails?
Do not ship NW.js; fix save resume or group order; bump project_version and restart from Day 2 minimum.
How long per day really?
50–70 minutes if inventory exists; Day 1 may take 90 minutes on messy projects.
Does this fix Steam store refunds alone?
No—pair with refund dashboards for store-copy vs gameplay tags.
Multiplayer?
Out of scope—server authoritative RNG needs a different challenge.
Advanced Random plugin?
Ledger it on Gate 4; do not mix silently with System random().
Can two teammates own different days?
Yes—one owner still signs each log; handoff notes in notes field.
What about Construct 4 rumors?
Receipt uses engine: construct-3—bump schema when you migrate.
Is seven days negotiable to three?
Compress Gates 1–2 into day 1 and 5–6 into day 5 only if you accept higher miss risk—full week recommended before first Steam demo.
Where next in backlog?
Save-format migration trend playbook—after freeze receipt passes.
Conclusion
Browser-green is not Steam-green. Seven weekdays turn event-sheet order from tribal knowledge into sheet_inventory_v1.json, gate logs, and a freeze receipt your future self trusts when promoting a fest branch.
Start Monday with inventory. Pin RunRNG Tuesday. Zero unaudited random Thursday. NW.js Test C next Monday. Export manifest Tuesday only when freeze_pass is true.
Next reads: RNG seed ledger tutorial, Construct 3 guide, and BUILD_RECEIPT evening pipeline.
Ninety-minute emergency compress (not recommended)
| Block | Gate |
|---|---|
| 0–20 | Gate 1 mini-inventory (gameplay sheet only) |
| 20–35 | Gate 2 screenshot |
| 35–50 | Gate 4 top ten random() only |
| 50–70 | Gate 5 Test C once |
| 70–90 | Handwritten receipt—schedule full week before Steam |
Compress pass does not replace Gate 6–7 before commercial NW.js ship.
SEO and discovery note
This challenge targets construct 3 event sheet order and construct 3 nw.js steam replay queries—complements the seed ledger tutorial without cannibalizing construct 3 rng seed beginner intent.
Stretch goals after Gate 7
- Add pause-menu copy seed_id button wired to ledger
run_id. - Wire
freeze_passinto a pre-export Construct event—block NW.js export when false. - Schedule backlog #4 tooling listicle to replace manual
random(search with debugger addons. - Read Godot WASM memory playbook if long runs OOM after determinism is fixed—freeze week solves order, not heap size.
Found this useful? Bookmark this page and run the challenge the week before your first NW.js upload—not the night partners expect a repro.
Manifest preflight pointer (post-challenge)
After sheet_freeze_receipt_v1.json passes, your team may still need Steam depot and branch discipline from October depot trend playbook and demo branch naming checklist. Those are distribution gates; this challenge is simulation truth gates. Run truth first or metadata work documents a lying binary.
Playtester handout (copy to PDF)
One page for fest playtesters:
- What changed this week: event sheet order locked; RNG audited.
- What we need:
seed_idfrom pause menu on every bug report. - What we do not need: balance opinions without
seed_id. - How to break us: refresh browser mid-run; report if loot changes.
Attach handout link to how to run a playtest and act on feedback if your team runs structured sessions.
Weekly scoreboard (team visibility)
| Day | Gate | Owner initial | Pass Y/N |
|---|---|---|---|
| Mon | 1 | ||
| Tue | 2 | ||
| Wed | 3 | ||
| Thu | 4 | ||
| Fri | 5 | ||
| Mon+1 | 6 | ||
| Tue+1 | 7 |
Pin the table in release-evidence/rng/freeze-week/README.md—visibility beats private guilt.