Asia-EU Handoff Release Evidence - Overnight Builds Without Losing Governance Trail (2026)
Your CI turns green at 02:14 UTC+8. Your partner in CET opens Slack at 09:00 and asks which commit the green build actually used. If the answer lives in chat, you do not have governance—you have luck.
May 2026 is when many micro-studios add a second timezone out of necessity: cheaper contract art overseas, a co-founder returning home for summer, or publisher diligence that expects 24-hour response without burning the person who ships builds. This Tutorials & Beginner-First guide teaches one handoff envelope so overnight automation still leaves a trail your mock audit tabletop can score.
Who this is for and what you get
| Audience | You will be able to… |
|---|---|
| Solo dev with one overseas contractor | Pass a build to them with a single folder they cannot misread |
| Two-founder Asia + EU split | Wake up to BUILD_RECEIPT.md instead of twelve DMs |
| Team approaching Q3 cert intake | Prove which artifact belongs to which UTC window |
Time: about ninety minutes to bootstrap; five minutes per nightly handoff once habits exist.
Prerequisites: a release-evidence/ root (start from folder taxonomy if empty), Git tags or CI build numbers, and agreement that Slack is notification only—not storage.
Why this matters now (May 2026)
- Q3 2026 partner intake rewards cross-artifact parity—overnight exports that nobody signed create rollup mismatches partners catch in August.
- Remote hiring normalized—studios that used to be single-timezone now ship builds while half the team sleeps; without envelopes, the waking half re-exports CSVs and breaks dictionary IDs.
- Friday maintenance discipline—Block 5 rituals fail when weekday nights orphan
01-build/folders with no README pointer.
Direct answer: Create release-evidence/00-handoff/inbox/ and outbox/, commit a BUILD_RECEIPT.md template, and require every automated nightly to drop one zip + one receipt before anyone in the other timezone touches partner annexes.
The failure mode (recognize it early)
Typical Tuesday:
- 22:00 UTC+8 — CI uploads
nightly-2026-05-17.zipto cloud storage. - 22:05 — Bot posts “green” in Discord.
- 08:30 CET — Reviewer downloads “latest” zip, runs smoke, files bugs against wrong commit.
- 14:00 UTC+8 — Original builder is confused; partner annex still references Monday’s dictionary.
The fix is not “more communication.” It is immutable handoff artifacts tied to commit SHA, UTC timestamp, and scope statement.
Handoff envelope anatomy
Every overnight build drops exactly this structure:
release-evidence/00-handoff/outbox/2026-05-17T18-14-00Z_rc-nightly-042/
BUILD_RECEIPT.md
manifest.json
artifacts/
player-build-win64.zip
symbols.zip (optional)
smoke-log.txt
governance-touch.json (only if exports changed)
Rules:
- Folder name uses UTC
YYYY-MM-DDTHH-MM-SSZ+ short build label—no local timezone in the path. - Nothing lands in
inbox/until the sender marksstatus: ready_for_review. - Receiver moves the folder to
inbox/processed/after review—never deletes until mock audit cycle ends.
BUILD_RECEIPT.md template (copy verbatim)
# BUILD_RECEIPT
build_id: rc-nightly-042
commit_sha: a1b2c3d4e5f6789012345678901234567890abcd
ci_job_url: https://ci.example.com/job/nightly/1042
utc_finished: 2026-05-17T18:14:00Z
sender_hat: build_owner_asia
receiver_hat: reviewer_eu
scope: gameplay smoke only — no store metadata changes
exports_touched: none
blockers_for_receiver:
- run smoke-log.txt section RESULT
- if FAIL, do not refresh partner annex
signer_sender: @name
signer_receiver: (empty until review)
review_verdict: pending | pass | fail
review_notes:
The receipt is the contract. Partner-facing CSV work waits on review_verdict: pass.
manifest.json minimum fields
{
"build_id": "rc-nightly-042",
"commit_sha": "a1b2c3d4e5f6789012345678901234567890abcd",
"utc_finished": "2026-05-17T18:14:00Z",
"artifacts": [
{"name": "player-build-win64.zip", "sha256": "…"},
{"name": "smoke-log.txt", "sha256": "…"}
],
"governance_exports_changed": false
}
Hash every file you expect reviewers to open. If governance_exports_changed is true, append paths under governance-touch.json listing which annex rows moved—feeds dimension 1 of the mock audit rubric.
Ninety-minute bootstrap (seven steps)
Step 1 — Create folders (10 min)
Under existing release-evidence/:
00-handoff/
README.md
inbox/
outbox/
processed/
README.md is three bullets: what belongs in outbox, when inbox may be consumed, where processed archives go.
Step 2 — Commit templates (15 min)
Add BUILD_RECEIPT.md and manifest.schema.json (optional) to 00-handoff/_templates/. Copy into each new outbox folder in CI.
Step 3 — Wire CI drop (25 min)
After successful nightly:
- Compute UTC timestamp in CI (never agent local time).
- Create outbox folder name.
- Copy artifacts + generate manifest hashes.
- Fill BUILD_RECEIPT with commit + job URL.
- Set
status: ready_for_reviewonly when all hashes verify.
Unity / Godot: artifact paths differ; the envelope rules do not.
Step 4 — Notification, not storage (5 min)
Discord/webhook message contains only:
Handoff ready: rc-nightly-042
Path: release-evidence/00-handoff/outbox/2026-05-17T18-14-00Z_rc-nightly-042/
Receipt: BUILD_RECEIPT.md
No zip attachments in chat.
Step 5 — Receiver morning ritual (10 min)
EU reviewer:
- Open newest
outbox/folder withready_for_review. - Verify manifest hashes locally.
- Run smoke per
scopeline—do not expand scope without sender ack. - Fill
signer_receiver+review_verdict. - Move folder to
processed/.
Step 6 — Governance gate (15 min)
If governance_exports_changed: true, schedule overlap call or async video—do not silently refresh partner annex. Tie to rollup mismatch help patterns when slices disagree.
Step 7 — Log in operating review (10 min)
Add one line to weekly operating review Block 3: handoffs_passed / handoffs_failed for the week.
Overlap hours without meetings every day
| Pattern | When to use |
|---|---|
| 15-min overlap standup | First week of new handoff habit |
| Async receipt only | Stable teams with green rate above 80% |
| Emergency sync | governance_exports_changed: true or review_verdict: fail on RC branch |
Document overlap windows in 00-handoff/README.md using UTC only:
Asia build owner available: 13:00-17:00 UTC
EU reviewer available: 08:00-12:00 UTC
Overlap: 13:00-12:00 UTC → 60 minutes (schedule Tue/Thu)
Connecting to the seven-folder taxonomy
Handoff sits beside not inside build folders:
| Taxonomy folder | Handoff relationship |
|---|---|
01-build/ |
Nightly zips may duplicate into handoff artifacts/; canonical long-term storage stays 01-build/ after pass |
06-governance/ |
Only touched when receipt flags export changes |
manifest.json at repo cert root |
Handoff manifest is per build, not a replacement for release manifest |
After taxonomy bootstrap, adding 00-handoff/ is a ten-minute diff.
Engine-specific notes
Unity 6.6 LTS nightly
- Pin
ProjectVersion.txtin receiptscopewhen testing gameplay-only. - If Input rebinding preflight assets change, set
exports_touched: input_assetsso EU reviewer runs Deck smoke.
Godot 4.5 nightly
- Export preset name belongs in BUILD_RECEIPT
scope. - Web exports: link Godot web evening tutorial smoke steps in
blockers_for_receiver.
Steam playtest branch
If handoff build promotes to playtest branch, add Steam build ID to manifest artifacts array.
Common mistakes
- Local timestamps in folder names — breaks sort order for auditors.
- Skipping manifest hashes — receiver trusts wrong file from sync delay.
- Scope creep on review — EU reviewer runs store capture when receipt said gameplay only.
- Deleting outbox after pass — processed folder must survive until cert window closes.
- Two senders, no hats — receipt must name
sender_hat/receiver_hat. - Chat-only handoff — violates every diligence packet pattern in publisher analysis.
- Refreshing annex before
review_verdict: pass— classic rollup mismatch source.
Pro tips
- Pre-create three outbox folders in CI cache to avoid mkdir races.
- Add
fail_fast: trueso partial zips never markready_for_review. - Mirror
processed/to cold storage monthly—handoff folders are small, guilt is large. - Use the same build labels in RC freeze challenge gates.
- When hiring first contractor, send them only the README + one sample envelope—not the whole repo wiki.
Save and replay continuity
If your game uses save fuzz patterns, note save_schema_version in BUILD_RECEIPT when nightly touches serialization. EU reviewer runs one load old save step before approving.
For deterministic replay hooks, attach replay-seed.txt in artifacts/ when smoke uses golden seeds.
When handoff is overkill
Skip formal envelopes if:
- Entire team shares one timezone and one machine builds releases.
- You ship once per quarter with no nightly CI.
Add handoff the week you add second timezone or partner asks for build provenance.
Week-two maturity checklist
- [ ] Seven consecutive nights with
ready_for_reviewreceipts - [ ] Zero annex refreshes without
governance_exports_changedflag - [ ]
processed/indexed in rootmanifest.json - [ ] Mock audit dimension 1 practiced using handoff folders as evidence source
- [ ] Operating review Block 3 shows handoff pass rate
Sample CI pseudocode (language-agnostic)
Your pipeline language does not matter—the sequence does:
on nightly_success:
utc = now_utc_iso8601()
folder = f"release-evidence/00-handoff/outbox/{utc}_rc-nightly-{build_num}"
mkdir(folder)
copy(artifacts/*, folder/artifacts/)
write_manifest_hashes(folder/manifest.json)
write_build_receipt(folder/BUILD_RECEIPT.md, commit, job_url, scope)
assert all_hashes_match()
write_status(folder, "ready_for_review")
notify_slack(folder_path_only)
Fail closed: if hash step throws, do not notify “green.” A silent partial upload is worse than a red build.
GitHub Actions sketch
- name: Handoff envelope
run: |
UTC=$(date -u +%Y-%m-%dT%H-%M-%SZ)
OUT="release-evidence/00-handoff/outbox/${UTC}_rc-nightly-${GITHUB_RUN_NUMBER}"
mkdir -p "$OUT/artifacts"
cp dist/*.zip "$OUT/artifacts/"
python scripts/write_handoff_manifest.py --out "$OUT"
python scripts/write_build_receipt.py --out "$OUT" --sha "${GITHUB_SHA}"
Commit the Python helpers beside your game—they become reviewable evidence themselves.
governance-touch.json example
When nightly automation refreshes leadership CSV:
{
"exports_changed": true,
"files": [
"06-governance/leadership/weekly_2026-w20.csv",
"06-governance/partner/partner_annex_2026-w20.csv"
],
"dictionary_version": "dict-2026-05-01",
"utc_window_start": "2026-05-13T00:00:00Z",
"utc_window_end": "2026-05-19T23:59:59Z",
"sender_note": "Automated rollup job; EU reviewer must verify epsilon before partner upload"
}
EU reviewer checklist:
- Open both CSV paths.
- Confirm
dictionary_versionmatches promoted build metadata. - Run epsilon compare from mock audit dimension 1 script.
- Only then set
review_verdict: pass.
Timezone translation table (copy to README)
| Local (examples) | UTC equivalent for logging |
|---|---|
| Taipei UTC+8 02:14 | 2026-05-17T18:14:00Z |
| Berlin CEST 10:30 | 2026-05-17T08:30:00Z |
| Los Angeles PDT 18:00 | 2026-05-18T01:00:00Z |
| London BST 09:15 | 2026-05-17T08:15:00Z |
Never write “Tuesday night build” in receipts—write the UTC row.
Troubleshooting ladder (first fifteen minutes)
| Symptom | Likely cause | Fix |
|---|---|---|
| Receiver cannot verify hash | Partial copy / sync tool | Re-download from repo tag, not chat |
| Two outbox folders same minute | Parallel CI jobs | Serialize nightly; add mutex |
Receipt commit_sha mismatch |
Submodule drift | Pin submodules in CI checkout |
| Smoke pass but annex fails audit | Scope omitted store capture | Update receipt scope; rerun tabletop |
Empty review_notes on fail |
Rushed review | Require one repro step line minimum |
Pairing with tooling resources
- Q3 mock-audit templates — drop handoff manifests into dimension 1 evidence.
- Save fuzz reference — when nightly touches saves, attach fuzz summary in
artifacts/. - Prompt registry sprint — if LLM assets change overnight, flag
exports_touched: prompt_registry.
Narrative walkthrough (fictional schedule)
Monday 22:10 UTC+8 — CI finishes rc-nightly-043, creates outbox folder 2026-05-17T14-10-00Z_rc-nightly-043, hashes two zips, sets scope: combat regression smoke. Bot posts path only.
Tuesday 08:45 CET — Reviewer verifies hashes, runs thirty-minute smoke, sees one desync. Sets review_verdict: fail, notes repro seed 0x9AF2. Moves to processed/failed/.
Tuesday 14:00 UTC+8 — Build owner reads receipt (not Discord scrollback), fixes desync, ships rc-nightly-044 with receipt referencing failed folder ID.
Wednesday mock audit — Facilitator asks for proof desync was fixed; team opens processed receipt chain—no argument about which zip was “the green one.”
That narrative is the ROI of envelopes.
Security and access control
- Handoff folders live in private repo or encrypted bucket—treat like signing keys.
- Contractors get read on
00-handoff/outbox/only, not06-governance/unless scoped. - Redact player IDs in crash logs before
artifacts/crashes/. - Rotate webhook URLs if a chat leak exposes folder paths.
Scaling beyond two timezones
Add sender_region enum in manifest (asia, eu, americas) when a third lane appears—sort outbox/ by UTC, filter by region in reviewer dashboard. Do not fork envelope structure per region; one schema scales cleaner for partners.
Contradictions to resolve with leadership
If leadership dashboard shows green while receipt says fail, receipt wins until someone signs a waiver in 06-governance/. Chat agreements do not clear cert blockers—see mock audit dimension 2 carve-out rules.
Beginner path (day zero to day seven)
Day 0 — Read taxonomy (30 min)
Skim release-evidence folder map. You only add 00-handoff/ today.
Day 1 — Folders + templates (90 min)
Follow bootstrap steps 1–2. Commit before dinner.
Day 2 — Fake handoff (45 min)
Manually create one outbox folder from a local build. Practice hash verification with a teammate or future-you.
Day 3 — CI wire (varies)
Hook nightly job. Expect first failure—hash mismatch is normal learning.
Day 4 — Receiver drill (30 min)
Practice pass and fail paths; move both to processed/.
Day 5 — Governance false alarm (20 min)
Simulate governance_exports_changed: true with a dummy CSV edit; confirm reviewer refuses annex refresh without overlap.
Day 6 — Operating review line (10 min)
Add handoff metric to one-sheet review.
Day 7 — Tabletop preview (60 min)
Run dimension 1 only from mock audit using handoff receipts as evidence. You are now cert-aware, not cert-ready—that comes with RC freeze.
smoke-log.txt format (keep it boring)
SMOKE_LOG build_id=rc-nightly-042 utc=2026-05-17T18:14:00Z
[00:00] launch_ok
[00:45] main_menu_ok
[02:10] first_combat_ok
[05:30] save_load_ok
[08:00] quit_clean
RESULT=PASS
Boring logs are grep-friendly for Friday Block 5 maintenance.
Integrating with Deck Verified autumn work
When Deck Verified refresh tests touch nightly scope, add lines:
blockers_for_receiver:
- verify glyph PNG paths per autumn 2026 checklist
- attach Deck smoke-log.txt
Handoff prevents EU reviewer from assuming PC-only smoke covers handheld.
Publisher and cert email snippets
When a publisher asks “what changed overnight?”:
Overnight handoff rc-nightly-044 is documented at:
release-evidence/00-handoff/processed/2026-05-18T01-22-00Z_rc-nightly-044/
BUILD_RECEIPT.md shows review_verdict: pass and governance_exports_changed: false.
Manifest SHA256 list attached in manifest.json.
Short, path-based, auditable—matches diligence packet tone.
What not to put in handoff
- Marketing copy drafts
- Discord exports
- Unredacted player support tickets
- Entire
Library/ornode_modules/trees - Secrets or API keys (use secret manager references in receipt instead)
Metrics that prove the habit stuck
| Metric | Healthy range (indie, 2026) |
|---|---|
| Nightly handoffs with receipts | 5–7 per week |
review_verdict: fail rate |
10–30% early, under 10% mature |
| Annex refresh without flag | 0 |
| Mean hours receipt → review | under 12 during overlap window |
| Mock audit dimension 1 first-try pass | trending up quarter over quarter |
Cold-open drill (five minutes)
Facilitator names a random night last month: “Open the BUILD_RECEIPT for that build and read commit_sha aloud.” If the team searches chat first, the habit is not muscle memory yet—repeat Day 2 fake handoff.
Key takeaways
- Overnight greens are not governance until BUILD_RECEIPT.md + manifest.json exist.
- Use UTC folder names and timestamps everywhere.
outbox/→ review →processed/; never delete during cert windows.- Slack notifies; repo folders store.
governance_exports_changed: trueforces overlap, not silent CSV edits.- Scope line in receipt prevents reviewer creep.
- Bootstrap takes ninety minutes; nightly handoff takes five.
- Pairs with release-evidence taxonomy and mock audit tabletop.
- Unity and Godot differ in artifacts, not envelope rules.
- Track weekly pass rate in operating review.
- Treat handoff as part of cert readiness, not optional DevOps polish.
FAQ
Do we need both Asia and EU staff?
No. One person can wear both hats on a calendar—handoff discipline still prevents you from arguing with yesterday’s self.
What if CI fails after posting green?
Set review_verdict: fail, move folder to processed/failed/, never promote artifacts to 01-build/. File a deficiency ticket like mock audit practice.
Can we use Google Drive instead of repo folders?
Only if hashes in manifest.json are verified after download. Repo-first is strongly preferred for diligence packets.
How does this relate to Lesson 172?
Lesson 172 scores the packet; this tutorial keeps nightly inputs honest before the tabletop.
Should handoff include crash dumps?
Yes when smoke fails—attach under artifacts/crashes/ and reference paths in review_notes.
What about legal/privacy exports?
Route through 06-governance/ with signer fields; never drop PII in handoff artifacts/ without redaction checklist.
Can contractors be sender_hat?
Yes if they control CI. Receipt must still list commit SHA your repo owns.
How long to keep processed folders?
Until the cert window or publisher contract says otherwise—90 days is a sensible default for 2026 indie cycles.
We only hand off once a week—still worth it?
Yes. Weekly releases still benefit from receipts; rename folder prefix weekly- instead of rc-nightly- but keep the same schema.
Does this replace Git tags?
No. Tags identify commits; handoff bundles artifacts + human review state tags cannot express.
What if our CI is manual?
A human can run the same script locally—discipline matters more than automation. Mark ci_job_url: manual-local honestly.
Solo developer wearing both hats
You can still use handoff when future-you is the reviewer:
- Send yourself the folder path in a calendar event at wake time.
- Force
review_verdictbefore touching partner exports. - Prevents “I thought I tested that build” amnesia during crunch weeks before Next Fest prep.
The envelope is a commitment device, not a headcount requirement.
Linking back to mock audit dimension 1
When facilitators score SLA parity, handoff receipts become the time machine:
utc_finishedproves which export window a build saw.governance-touch.jsonlists which CSVs moved.processed/folders show whether EU reviewer approved before annex upload.
Teams that skip handoff often fail dimension 1 not because math is hard—but because nobody can agree which midnight export counts. Fix the argument with folders; then epsilon rules from the tabletop guide become mechanical. Schedule your first envelope before the next partner email asks for proof you do not have.
Conclusion
Distributed studios do not fail because time zones exist—they fail because proof does not survive the night. A BUILD_RECEIPT and manifest chain turn “the build was green” into something a partner reviewer—or your future self—can verify without opening Discord.
Spend one evening on 00-handoff/. When Q3 intake asks which commit matched which annex row, you will answer from a folder path, not from memory. That single habit is cheaper than one cert resubmission loop.