docs(commercial): the claim page was never needed, signing waits for revenue, and support is a filter

Four things derived this session superseded what the plan said twenty-four hours earlier,
and the docs are corrected where each one died:

**Licensing needs no server.** Polar's customer-portal endpoints authenticate on the key
itself plus the public organization_id; the org access token is only needed to create
products. Channel binding rides in `conditions: {channel_id}`, re-checked on every
validate — so the "claim page" (a hosted OAuth flow that wrote the UC id onto the key)
and the key database it implied are deleted. Device management, key rotation and
subscription auto-revocation are Polar's; four states, one lease, no callback endpoint.

**Signing is deferred until two subscribers.** It never removes the day-one SmartScreen
warning (EV's instant-bypass died in 2024), so buying it before revenue buys only the
publisher line. Renamed to Azure Artifact Signing, $9.99/mo Basic, and it requires a
paid Azure subscription. Year-one fixed cost drops from ~$135 to ~$15.

**The Store account is free.** Microsoft waived the $19 individual fee and removed the
$99 company fee in May 2026, which makes the Store the only zero-cost route to a
Microsoft-signed install — the free answer to SmartScreen, noted beside the paid one.

**Support is a filter, not a promise.** Email, best effort, no SLA, refunds on request
without argument; no training service, no helpdesk. A repeated question becomes a
training video on @llamacasty, which is content and monetization instead of a ticket.
GitHub issues on the releases repo are the deliberate friction.

Also settled: binaries live in a second Gitea repo (`llamacasty-releases`) push-mirrored
to a public GitHub repo — issues and assets public, code private, one publish direction
(a git mirror carries refs, not GitHub Release assets); `@llamacasty` is
standard-verified with intermediate features, so live streaming, >15 min uploads and
custom thumbnails work today and no SIM or ID is needed; and OAuth comes out of Testing
mode by publishing the app (100-user lifetime cap, no 7-day token death).

TASKS.md now opens with the four-day surge slice — artifact shape, output gate,
entitlement seam, real-machine day — because those are what the first public release
waits on. HANDOFF.md rewritten. MyMistakes.md gains the Polar recipe and the
"verify means three different things" entry. MARCOM.md gains the support→content loop
and the surface roles.
This commit is contained in:
2026-10-31 10:08:05 -07:00
parent 0b41b7db67
commit 57ef9e7a5e
9 changed files with 322 additions and 111 deletions
+16
View File
@@ -256,6 +256,22 @@ These are the hard facts behind every decision. Full list in `TASKS.md`.
## Auth & session (YouTube OAuth)
- **Publishing status, not phone verification, is what kills sessions.** An OAuth project in
**Testing** with user type *External* expires every authorization **and its refresh token after
7 days** — so every user re-signs in weekly. **Publish app** (→ *In production*) removes that
expiry. It does **not** require Google's verification review, but an unverified production app
shows the "unverified app" warning and carries a **100-new-user cap for the lifetime of the
project, which cannot be reset** — so publish when strangers are expected, not while testing.
Verification review only removes the warning and the cap. Source:
<https://support.google.com/cloud/answer/15549945>, and `commercial.md` → Entitlement is unrelated.
- **A channel must be verified before it can stream.** YouTube's feature tiers:
*standard* (nothing) → *intermediate* (**phone verification**: >15 min uploads, **live streaming
on a computer**, custom thumbnails) → *advanced* (channel history **or** ID/video verification:
higher daily limits, clickable description links, chapters, pin comments, monetization
application). Live streaming is **intermediate**, not advanced — a user without it gets a
live-streaming-disabled error from the API. Map that error in the go-live path to one sentence:
*"Verify your channel at youtube.com/verify, then try again — it takes a minute."* A raw Google
error here reads as "the app is broken". Source: <https://support.google.com/youtube/answer/9890437>.
- `Helpers/OAuthCredentials.cs` holds the real ClientId/ClientSecret. Auth is complete and the
session **persists via Windows DPAPI** (`Helpers/TokenStore.cs` → `%APPDATA%\ytLlive\ytLlive.auth`,
CurrentUser scope), reloaded best-effort at startup with a proactive refresh of a near-expiry