docs(steam): record the real onboarding state — a wait on Valve, not a task

The docs described Steamworks onboarding as pending work. It is pending VALVE: the partner account
exists, identity verification is under review, and the tax interview is in their queue with a quoted
turnaround of up to 30 business days. No app IDs are assigned, no store page exists, and Release
entitlement therefore still fails closed — by design.

Distribution.md §2 becomes a status table plus the critical path computed from Valve's own published
windows (30 business days verification → fee/app IDs → up to 12 business days store review → page
public ≥2 weeks before release → up to 12 business days build review). Earliest realistic launch:
early-to-mid February 2027, leaving ~7 weeks before the 2027-04-01 launch price ends.

Nothing in this blocks the code; commercial.md, TASKS 54 and HANDOFF now say so instead of implying
Steam is an outstanding coding task.
This commit is contained in:
2026-11-05 15:08:53 -08:00
parent dd51f7842a
commit 9611cee199
4 changed files with 36 additions and 14 deletions
+26 -13
View File
@@ -62,19 +62,32 @@ on the partner dashboard — the dashboard's Downloads page only re-offers the S
| Partner support | `help.steampowered.com/en/wizard/HelpWithPublishing` |
| Steamworks.NET (managed wrapper) | `nuget.org/packages/Steamworks.NET` |
1. **Steamworks account** → onboarding (NDA, identity, company details, tax interview, payout bank,
then the **$100 Steam Direct fee** per app). The store page cannot be configured before the fee.
2. **App IDs.** One paid app and its associated free Demo. The Demo has its own App ID; it checks
ownership of the paid app with `BIsSubscribedApp(paidAppId)`.
3. **Builds.** Keep one codebase. Steam gives the Demo a separate release checklist/build setup;
shared depots can avoid duplicating common files once the paid app is released.
4. **Steamworks SDK.** `./scripts/steam-sdk.sh ~/Downloads/steamworks_sdk_165.zip` extracts
`steam_api64.dll` from `sdk/redistributable_bin/win64/` into `steam/` (gitignored) and stages
`steam_appid.txt` = 480 — Valve's Spacewar app, so `SteamAPI.Init()` works locally before
LlamaCasty has an App ID. Add `--contentbuilder` on the machine that uploads a depot. The csproj
copies the DLL **beside the exe** (`Link`) with `ExcludeFromSingleFile`, and copies
`steam_appid.txt` in Debug only — never into a depot. The managed side is the `Steamworks.NET`
package (`SteamApps.BIsSubscribedApp`).
### Status (updated 2026-11-05 — this is a WAIT on Valve, not a task of ours)
| Step | State |
|---|---|
| Partner account created | ✅ done by the creator |
| Identity verification | ⏳ **pending** — Valve reviewing |
| Tax interview | ⏳ submitted; Valve quotes **up to 30 business days** to review |
| $100 Steam Direct fee (per app) | not yet — a store page cannot be configured before it |
| App IDs (paid app + free Demo) | **not yet assigned** |
| Store page | not created |
| Build review | not started |
**Critical path from 2026-11-05**, using Valve's own published windows:
1. identity + tax review — up to **30 business days** (~6 calendar weeks) → mid-December
2. fee paid, app IDs assigned, store page built and submitted
3. store page review — **up to 12 business days** (Valve's current backlog; docs still say 3–5)
4. page public **≥2 weeks before release** (Valve's rule)
5. build review — **up to 12 business days**
**Earliest realistic launch: early-to-mid February 2027.** The launch price ends 2027-04-01, so there
is roughly seven weeks of buffer — *provided* verification clears in the window Valve quotes. If it
slips, the promo date is the thing to move (see `docs/ai/commercial.md`), not the code.
Nothing below can start until step 1 clears; none of it blocks the app work.
5. **Store page** configured and made public **two weeks before release** — Valve's rule, and it is
the window where wishlists accumulate.
+4
View File
@@ -25,6 +25,10 @@
- Open loop: `32·4` is proven by construction only — kill ffmpeg mid-recording and play the file.
- Do not push absent a checkpoint request.
- **Steam is a wait, not a task:** partner account exists, identity verification pending, tax review in
Valve's queue (up to 30 business days). No app IDs, no store page, Release entitlement still fails
closed. Earliest realistic launch early-to-mid February 2027 — see `Distribution.md` §2.
## Landmines
- **The preview pane draws frame-source layers from a whitelist of DataTriggers.** A layer type with no
+1 -1
View File
@@ -57,7 +57,7 @@ blocker; the smallest slice is 32·4 (fragmented MP4 on the record block).
| 39·2 | ☐ | YPP slice 2: Analytics scopes, watch-hours/Shorts velocity + ETA | [`task-39`](TASKS/task-39-ypp-journey-tracker.md) |
| 49 | ❌ | Chat profanity filter — **retired 2026-11-05**: YouTube owns moderation (blocked words + hold for review run before the API). Replaced by not rendering YouTube's moderation markers (tombstones / no-display events) | [`task-49`](TASKS/task-49-chat-profanity-filter.md) |
| 50 | ☐ | One-button publish of the local recording (resumable upload) | [`task-50`](TASKS/task-50-publish-recording.md) |
| 54 | 🔶 | Freemium: EULA + privacy shipped; free Steam Demo and paid app use one codebase; paid app ID and Steam Demo setup still pending | [`task-54`](TASKS/task-54-marcom-free-merch.md) |
| 54 | 🔶 | Freemium: EULA + privacy shipped; one codebase for free Demo + paid app. **Blocked on Valve**: identity verification pending, tax review up to 30 business days; app IDs, store page and build review all follow | [`task-54`](TASKS/task-54-marcom-free-merch.md) |
| — | 🔶 | **Steam ownership** — `BIsSubscribedApp(paidAppId)` + Debug fake + app-wide `IsAppOwned`; paid app ID awaits Steamworks | [`commercial`](docs/ai/commercial.md) |
| — | ❌ | **Polar subscription path** — retired 2026-11-01 with the one-price model. Design kept in `decisions.md`, not built | [`decisions`](docs/ai/decisions.md) |
| — | ✅ | **OutputProfile gate** — resolver + `EncoderOptions` wiring (`Models/OutputProfile.cs`, one ffmpeg/two outputs, dev override); higher tiers follow `IsAppOwned` | [`commercial`](docs/ai/commercial.md) |
+5
View File
@@ -75,6 +75,11 @@ the purchase funnel. Both use the same code. The demo checks whether the current
the paid app, then exposes the higher output tiers. The app-wide `IsAppOwned` value is the binary
ownership result used by later feature checks.
- **Steamworks status (2026-11-05):** partner account created; **identity verification pending** and the
tax interview is in Valve's queue (they quote up to **30 business days**). No app IDs are assigned and
no store page exists yet, so the Release build still fails closed on entitlement — by design. Earliest
realistic launch is early-to-mid February 2027; the 2027-04-01 launch-price deadline therefore has
~7 weeks of buffer. Detail: [`Distribution.md`](../../Distribution.md) §2.
- **Steam owns the purchase.** The demo calls `BIsSubscribedApp(paidAppId)` after `SteamAPI.Init`,
behind `IEntitlement` (`Services/Entitlement/`). It is a local check against Steam's own state —
no server, key, lease, or LlamaCasty account.