Your First SteamPipe Depot Upload Log and BUILD_RECEIPT Before October Next Fest Upload - One Evening 2026

Monday 9:12 a.m., October upload week: #ship celebrates "depot uploaded." Steamworks Builds tab shows build 18472931. Your BUILD_RECEIPT.json still lists build_id: 2026-09-28-rc03 from Friday's dress rehearsal. The only upload artifact in the repo is a screenshot of Success! App '1234560' build '18472931' uploaded. pasted into Discord. Friday localization capstone latched october_upload_window_allowed: true—but nobody filed steampipe_upload_log.jsonl or steampipe_depot_upload_receipt_v1.json. Tuesday's 12 setlive checks fail check 1 because the receipt and Steamworks disagree on which bytes you actually promoted.
October 2026 micro-studios treat SteamPipe upload like a chat milestone. Upload week needs a machine-readable depot log tied to BUILD_RECEIPT—not another screenshot thread. This Tutorials & Beginner-First guide spends one evening creating steampipe_upload_log.jsonl, steampipe_depot_upload_receipt_v1.json, and gates U1–U6 so steampipe_upload_ok: true on BUILD_RECEIPT means the same thing to producers, CI, and October upload cluster cousins.
Non-repetition note: BUILD_RECEIPT beginner owns generic upload_log.csv. 12 setlive checks owns promotion preflight + depot_owner_receipt_v1.json. SteamPipe wall-clock trend owns queue telemetry narrative. Dual-depot dress owns itch+Steam channel matrix D1–D6. This URL owns first SteamPipe depot upload log evening + U1–U6 + steampipe_upload_ok.
Pair BUILD_RECEIPT beginner if receipts are new, Godot VDF LF evening when Linux CI uploads, and forward blog #2 store publish checklist when upload log habit exists.
Why this matters now (October 2026 upload week)
october_upload_window_allowedis not upload proof — Localization capstone opens the calendar; this receipt proves depot bytes landed.- Steam build IDs ≠ your
build_id— Crosswalk must live in jsonl or Thursday row review fails. - Contractors rotate laptops — Without log rows,
DepotOwnedByOtherAccountretries look like "Steam is slow." - Queue wall-clock lies without log context — Wall-clock trend needs
upload_started_utcrows to explain retries. - One evening beats upload-week archaeology — Template tonight; five minutes per upload after.
Direct answer: Create release-evidence/steam/steampipe_upload_log.jsonl, run U1–U6, file steampipe_depot_upload_receipt_v1.json, set BUILD_RECEIPT steampipe_upload_ok: true only when log + dry-run + capstone pointer align.
Who this one-evening ritual is for
| Audience | Outcome |
|---|---|
| Solo dev, first Steam upload | Append-first log habit before fest week |
| Producer | Answer "which Steam build ID is rc04?" without opening Steamworks |
| Release engineer | Wire verify_steampipe_depot_upload.sh in CI before setlive |
| Contractor | Prove partner + depot on log row before touching app_build_*.vdf |
Time: ~90 minutes first pass (templates + one real upload or dry-run); ~8 minutes per subsequent depot upload.
Prerequisites: Steamworks app with at least one depot, steamcmd installed, existing BUILD_RECEIPT habit, optional october_upload_window_allowed from localization capstone.
Official references: Steamworks Builds, SteamPipe upload, steamcmd wiki.
Format ladder — October upload cluster #1
| Row | Format | Owns |
|---|---|---|
| #1 (this) | One-evening depot upload log + U1–U6 | steampipe_upload_ok |
| #2 forward | Store publish checklist listicle | P1–P6 publish tools |
| #4 forward | Wrong default branch case study | Recovery B1–B6 |
| #7 forward | Weekly depot jq diff | J1–J6 jsonl |
| #12 forward | Friday upload capstone | C1–C10 fest_live_allowed |
| 12 setlive checks | Promotion preflight | setlive_allowed |
| Dual-depot dress | itch+Steam matrix | dual_sku_rehearsal_ok |
Evening overview (four blocks)
| Block | Minutes | Output |
|---|---|---|
| 1 — Folder + log template | 15 | steampipe_upload_log.jsonl schema |
| 2 — Dry-run upload | 25 | build_app log archived |
| 3 — Receipt JSON | 25 | steampipe_depot_upload_receipt_v1.json |
| 4 — Verify + BUILD_RECEIPT | 25 | U1–U6 GREEN, steampipe_upload_ok |
Stop when jq -e '.steampipe_upload_ok == true' passes on the receipt path you committed.
Block 1 — Folder layout and log schema
release-evidence/
steam/
steampipe_upload_log.jsonl
steampipe_depot_upload_receipt_v1.json
dry-run/
2026-10-06_build_app.log
screenshots/
steamworks_builds_tab_2026-10-06.png
05-operations/
BUILD_RECEIPT.json
Append-only jsonl — never edit prior lines; add correction rows with "event": "correction".
Log line schema (steampipe_upload_log_v1)
Each line is one JSON object:
{
"schema": "steampipe_upload_log_v1",
"event": "depot_upload",
"upload_started_utc": "2026-10-06T14:22:00Z",
"upload_finished_utc": "2026-10-06T14:41:33Z",
"app_id": "1234560",
"depot_id": "1234561",
"steam_build_id": "18472931",
"build_id": "2026-10-06-rc01",
"build_label": "2026.10.06-rc01",
"branch_intent": "october_fest_demo",
"partner_account": "studio_partner",
"vdf_path": "steam/app_build_1234560.vdf",
"dry_run_log": "release-evidence/steam/dry-run/2026-10-06_build_app.log",
"git_commit": "a1b2c3d4e5f6789012345678901234567890abcd",
"operator": "release_owner",
"notes": ""
}
Beginner field guide:
steam_build_id— number Steamworks assigns after successful upload (from log or Builds tab).build_id— your receipt naming convention; must match BUILD_RECEIPT header.branch_intent— documented fest branch name beforesetlive(not "default" unless excepted).partner_account— studio partner slug, not personal Steam username.dry_run_log— path to archivedbuild_appoutput; required for U4.
Copy steampipe_upload_log.template.jsonl with one commented example line into release-evidence/steam/README.md so contractors know append rules.
Block 2 — Dry-run before first real upload
Run build_app dry-run before spending queue time on a bad VDF:
steamcmd +login YOUR_PARTNER +run_app_build_http /path/to/app_build_1234560.vdf +quit 2>&1 | tee release-evidence/steam/dry-run/2026-10-06_build_app.log
Pass criteria for U4:
- Log contains
Successfully finished App Buildor equivalent success line. - Log contains no
DepotOwnedByOtherAccount. - Log AppID matches Steamworks.
- Log depot IDs match 12 setlive check 6.
If dry-run fails, fix partner login or VDF before real upload—do not append a success row to jsonl.
Linux CI note: Pair Godot VDF LF proof when CRLF breaks parse on runner.
Block 3 — steampipe_depot_upload_receipt_v1.json
Receipt summarizes latest upload and gate results:
{
"schema": "steampipe_depot_upload_receipt_v1",
"receipt_version": "1.0",
"steampipe_upload_ok": false,
"app_id": "1234560",
"primary_depot_id": "1234561",
"build_id": "2026-10-06-rc01",
"build_label": "2026.10.06-rc01",
"steam_build_id": "18472931",
"branch_intent": "october_fest_demo",
"upload_log_path": "release-evidence/steam/steampipe_upload_log.jsonl",
"dry_run_log_path": "release-evidence/steam/dry-run/2026-10-06_build_app.log",
"capstone_pointer": "release-evidence/localization/capstone/latest.json",
"october_upload_window_allowed": true,
"setlive_completed": false,
"gates": {
"U1": false,
"U2": false,
"U3": false,
"U4": false,
"U5": false,
"U6": false
},
"notes": ""
}
Set steampipe_upload_ok: true only when U1–U6 all true. Keep setlive_completed false until 12 setlive checks pass—upload receipt ≠ promotion receipt.
Gates U1–U6
| Gate | Name | Pass criteria |
|---|---|---|
| U1 | Upload window | october_upload_window_allowed: true on capstone or documented waiver in notes |
| U2 | BUILD_RECEIPT parity | Root build_id / build_label match receipt + latest jsonl line |
| U3 | Log exists | steampipe_upload_log.jsonl has ≥1 depot_upload line for this build_id |
| U4 | Dry-run clean | Linked dry-run log has no DepotOwnedByOtherAccount |
| U5 | Depot parity | depot_id in jsonl matches VDF + Steamworks Depots tab |
| U6 | Receipt committed | steampipe_depot_upload_receipt_v1.json in repo; latch set honestly |
U1 waiver example: "notes": "Upload window YELLOW—EXCEPTION-UPLOAD-001 approved for hotfix rc02" with ticket ID in BUILD_RECEIPT.
U2 fail pattern: Dress rehearsal D3 passed on rc03 but Steam upload ran rc04 without updating root receipt.
verify_steampipe_depot_upload.sh
#!/usr/bin/env bash
set -euo pipefail
R="${1:-release-evidence/steam/steampipe_depot_upload_receipt_v1.json}"
LOG="$(jq -r '.upload_log_path' "$R")"
DRY="$(jq -r '.dry_run_log_path' "$R")"
jq -e '.schema == "steampipe_depot_upload_receipt_v1"' "$R" >/dev/null
jq -e '.steampipe_upload_ok == true' "$R" >/dev/null
test -f "$LOG"
test -f "$DRY"
grep -q 'DepotOwnedByOtherAccount' "$DRY" && exit 1 || true
BID="$(jq -r '.build_id' "$R")"
jq -e --arg b "$BID" 'select(.build_id == $b) | .event == "depot_upload"' "$LOG" >/dev/null
CAP="$(jq -r '.capstone_pointer // empty' "$R")"
if [[ -n "$CAP" && -f "$CAP" ]]; then
jq -e '.october_upload_window_allowed == true' "$CAP" >/dev/null
fi
echo "steampipe depot upload verify: OK"
Wire in CI: run after upload step, before setlive job.
PowerShell facilitator (Windows)
$Receipt = "release-evidence/steam/steampipe_depot_upload_receipt_v1.json"
jq -e '.steampipe_upload_ok == true' $Receipt
if ($LASTEXITCODE -ne 0) { throw "steampipe upload latch failed" }
$Log = jq -r '.upload_log_path' $Receipt
Get-Content $Log -Tail 1 | jq .
BUILD_RECEIPT columns to add
Extend root BUILD_RECEIPT:
{
"steampipe_upload_ok": true,
"steampipe_depot_upload_receipt_path": "release-evidence/steam/steampipe_depot_upload_receipt_v1.json",
"steam_build_id": "18472931",
"steampipe_upload_log_path": "release-evidence/steam/steampipe_upload_log.jsonl"
}
Thursday row review and forward #10 Wednesday depot smoke consume these columns—file them before upload week rituals assume they exist.
Beginner Quick Start — tonight only
- Create
release-evidence/steam/folders. - Copy log template; append one dry-run row (mark
"event": "dry_run"if no real upload yet). - Archive dry-run log from Block 2.
- Fill receipt JSON; set gates honestly (U6 false until committed).
- Run verify script; fix RED gates.
- Update BUILD_RECEIPT; commit receipt + log + dry-run artifact.
- Screenshot Steamworks Builds tab into
screenshots/for human audit—not a substitute for jsonl.
Success check: Teammate opens jsonl last line and names steam_build_id + build_label without Steamworks login.
Working dev — append ritual after every upload
# After successful steamcmd upload
STEAM_BUILD_ID="18472931"
BUILD_ID="2026-10-06-rc01"
jq -nc \
--arg sb "$STEAM_BUILD_ID" \
--arg bid "$BUILD_ID" \
'{
schema: "steampipe_upload_log_v1",
event: "depot_upload",
upload_started_utc: (now | strftime("%Y-%m-%dT%H:%M:%SZ")),
steam_build_id: $sb,
build_id: $bid
}' >> release-evidence/steam/steampipe_upload_log.jsonl
Refresh receipt steam_build_id, re-run U1–U6, bump steampipe_upload_ok only on GREEN.
Integration with October upload cluster
| Cousin | Relationship |
|---|---|
| Localization capstone #11 | U1 reads october_upload_window_allowed |
| Dual-depot dress #2 | U2 expects same build_id as D3 |
| 12 setlive checks | Check 1 consumes steampipe_upload_ok + log |
| Wall-clock trend | jsonl timestamps explain retry spikes |
| Forward #7 jq weekly | Depot hash diff extends this log |
| Forward #12 upload capstone | Indexes steampipe_upload_ok in C8 cousin sweep |
Proof table (sample GREEN row)
| Field | Value | Source |
|---|---|---|
steam_build_id |
18472931 | steamcmd stdout |
build_id |
2026-10-06-rc01 | BUILD_RECEIPT |
depot_id |
1234561 | VDF + Steamworks |
october_upload_window_allowed |
true | capstone/latest.json |
| U4 | PASS | dry-run log clean |
steampipe_upload_ok |
true | receipt after U6 |
Scenarios A–G
A — First upload ever (dry-run only tonight)
File dry-run row + receipt with steampipe_upload_ok: false; U3 waives if notes says "dry-run only—no depot_upload yet." Still pass U4 on dry-run log.
B — Capstone GREEN but upload before Monday
U1 fails unless waiver—do not set steampipe_upload_ok true early.
C — Steam build ID assigned but wrong depot
U5 fails—append correction row; do not delete original line.
D — Contractor used personal Steam
U4 fails with DepotOwnedByOtherAccount—re-login studio partner; new dry-run before retry.
E — Same build_id re-uploaded (hotfix)
Append new jsonl line with new steam_build_id; update receipt; keep history.
F — Unity Addressables moved during upload week
U2 may fail while depot bytes differ—update BUILD_RECEIPT build_id before latch.
G — itch and Steam same evening
Run dual-depot dress D1–D6 first; Steam log row must match matrix build_id.
Common mistakes
- Screenshot-only audit trail with no jsonl.
- Setting
steampipe_upload_okwhen onlysetliveran—upload ≠ promotion. - Using
defaultbranch inbranch_intentduring fest week without SETLIVE exception (forward #9). - Editing jsonl lines instead of appending corrections.
- Skipping dry-run to "save time" then burning queue on VDF typo.
- Confusing generic upload_log.csv with Steam-specific jsonl—keep both; cross-link paths on BUILD_RECEIPT.
Troubleshooting
"Steam build ID not in log yet." Upload may still be processing—wait for Builds tab; append row when ID appears.
"verify script cannot find capstone." Set capstone_pointer empty and document U1 waiver—or run Friday capstone first.
"jq parse error on jsonl." One JSON object per line—no trailing commas, no array wrapper.
"Linux runner upload differs from laptop." Compare config.vdf partner; see 12 check 4.
RED / YELLOW / GREEN routing
| Color | Condition | Action |
|---|---|---|
| RED | U4 fail or U2 mismatch | Block setlive; fix before promotion |
| YELLOW | U1 waiver or dry-run-only | Upload allowed with documented exception |
| GREEN | U1–U6 pass | Proceed to 12 setlive checks |
Printable facilitator card
Store in release-evidence/steam/STEAMPIPE_UPLOAD_EVENING_CARD.md:
# SteamPipe depot upload — one evening (U1–U6)
Date: __________ build_id: __________ operator: __________
[ ] Folders: steam/ + dry-run/ + screenshots/
[ ] steampipe_upload_log.jsonl template committed
[ ] build_app dry-run log archived — no DepotOwnedByOtherAccount
[ ] Real upload OR dry-run-only noted in receipt notes
[ ] jsonl line appended (steam_build_id + build_id + depot_id)
[ ] steampipe_depot_upload_receipt_v1.json — gates U1–U6 honest
[ ] verify_steampipe_depot_upload.sh exit 0 (or documented waiver)
[ ] BUILD_RECEIPT steampipe_upload_ok + paths updated
[ ] Capstone october_upload_window_allowed checked (U1)
[ ] setlive NOT run yet — forward to 12-check list
Sign: __________ UTC: __________
Pin beside 12 setlive preflight checklist in release-evidence/steam/.
Engine export notes (working dev)
| Engine | Pre-upload check | Log notes field |
|---|---|---|
| Unity | Player build matches Addressables group pinned on receipt | addressables_profile |
| Godot | Export preset name + .pck hash in BUILD_RECEIPT artifacts |
export_preset |
| GameMaker | IDE version + runtime VM in receipt | gm_runtime |
| Ren'Py | build.directory matches depot content root |
renpy_build_dir |
Engine-specific export is not U5—depot bytes must still match VDF content root. Pair GameMaker setlive dry-run when using GM Steam export.
jq log analysis (copy-paste)
Last upload row:
jq -s '.[-1]' release-evidence/steam/steampipe_upload_log.jsonl
Count uploads per build_id:
jq -s 'group_by(.build_id) | map({build_id: .[0].build_id, count: length})' \
release-evidence/steam/steampipe_upload_log.jsonl
Find rows missing dry_run_log:
jq -s '[.[] | select(.event=="depot_upload" and (.dry_run_log|length)==0)]' \
release-evidence/steam/steampipe_upload_log.jsonl
Use before weekly depot jq #7—this proves append discipline; #7 proves week-over-week build_id / manifest hash parity.
Upload week calendar (October cluster)
| Day | Block | Receipt field |
|---|---|---|
| Fri (pre-week) | Localization capstone GREEN | october_upload_window_allowed |
| Mon AM | This evening tutorial — first depot log | steampipe_upload_ok |
| Mon PM | 12 setlive dry-run if promoting | setlive_allowed cousin |
| Tue | Forward #3 dress rehearsal challenge night 1 | october_upload_dress_rehearsal_ok |
| Wed | Forward #10 depot smoke row review | october_depot_smoke_* |
| Thu | Forward #2 store publish checklist | publish receipt |
| Fri | Forward #12 upload capstone | fest_live_allowed |
Skipping Monday log then running setlive Thursday reproduces the Discord-screenshot failure mode this tutorial prevents.
Partner diligence zip
When publishers request upload proof:
steampipe_depot_upload_receipt_v1.jsonsteampipe_upload_log.jsonl(full history or redacted contractor names)- Latest dry-run log referenced by receipt
- Steamworks Builds tab screenshot (human audit)
- BUILD_RECEIPT excerpt showing
steampipe_upload_ok+git.commit - Link to capstone if U1 sourced there
Zip name: {studio}_steampipe_upload_{build_id}_2026.zip — not steam_stuff.zip.
Scenarios H — multi-depot apps
H — Demo + full game depots same evening. Two jsonl lines sharing build_id but different depot_id; one receipt per primary fest depot or array depot_ids[] in receipt v1.1—v1.0 uses single primary_depot_id.
Key takeaways
october_upload_window_allowedopens the calendar—not depot proof.steampipe_upload_log.jsonlappend-only crosswalks yourbuild_idto Steamsteam_build_id.- Gates U1–U6 on
steampipe_depot_upload_receipt_v1.json. - Latch
steampipe_upload_okon BUILD_RECEIPT only when verify script passes. - Dry-run
build_appbefore real upload—U4 is non-negotiable. - Upload receipt
setlive_completed: falseuntil 12 setlive checks pass. - Pair BUILD_RECEIPT beginner for root schema.
- Pair localization capstone for U1 window latch.
- Forward #2–#12 October upload cluster builds on this log.
- Guide #55 / Help #60 forward for one-step tool chapters.
- Distinct from wall-clock queue narrative and generic CSV upload log.
- One evening setup; ~8 minutes per upload afterward.
FAQ
Same as BUILD_RECEIPT beginner upload_log.csv?
No. CSV is portal-agnostic history. This jsonl is SteamPipe-specific with depot IDs and dry-run paths.
Same as 12 setlive checks?
No. Setlive list is promotion preflight. This is depot upload logging before setlive.
Same as GameMaker setlive dry-run evening?
Cousin lane—GameMaker owns IDE export; this owns log schema any engine shares.
Must I upload tonight?
Dry-run + templates count as Block 1–4 progress; set steampipe_upload_ok: false until real upload.
Does this replace dual-depot dress rehearsal?
No. Run D1–D6 when itch+Steam both ship.
How does jq weekly #7 extend this?
Weekly depot jq #7 diffs depot manifest hashes against october_upload_weekly_log.jsonl—orthogonal proof to evening append discipline.
Can I run upload from CI only?
Yes—set operator: ci_runner and archive runner config.vdf hash in notes. Human must still review dry-run artifact before U6.
What if upload queues for hours?
Append row with upload_finished_utc empty and "event": "upload_pending"; update when Steam assigns build ID—pair wall-clock trend.
Does steampipe_upload_ok authorize store publish?
No—forward #2 publish checklist and #10 Wednesday smoke own store-facing gates.
CI sketch (GitHub Actions tail)
- name: Verify SteamPipe depot upload receipt
run: |
bash scripts/verify_steampipe_depot_upload.sh release-evidence/steam/steampipe_depot_upload_receipt_v1.json
- name: Block setlive without upload latch
run: jq -e '.steampipe_upload_ok == true' release-evidence/05-operations/BUILD_RECEIPT.json
Place verify after steamcmd upload job, before setlive job—never invert order. Document waiver ticket IDs in BUILD_RECEIPT notes when U1 is YELLOW so Thursday row review does not reopen upload week from scratch.
Related reads
- Your First BUILD_RECEIPT JSON and Upload Log - One Evening
- 12 Pre-Flight Checks Before steamcmd setlive - October Fest 2026
- jq Gate Sketch for october_upload Weekly Depot Row Diff — cluster #7 J1–J6 after
steampipe_upload_ok - Friday Localization Freeze Capstone Before October Upload
- Your First itch.io + Steam Dual-Depot Dress Rehearsal
- October SteamPipe Queue Wall-Clock Telemetry Trend
- Your First Godot Export VDF LF Line Ending Proof
- Wednesday Demo Build Smoke Ritual Before Fest Branch Promotion
Closing
October upload week punishes teams who treat SteamPipe like a success toast. Spend one evening on steampipe_upload_log.jsonl, dry-run discipline, and U1–U6—then every depot upload adds a row future you can grep instead of re-litigate in Discord. When partners ask which build landed Monday, open jsonl—not #ship scrollback.
Next reads: 14 free Steam store publish checklist tools — cluster #2 P1–P6 after steampipe_upload_ok, #3 upload dress rehearsal challenge, GameMaker setlive dry-run evening for engine-specific cousin.