Files
LlamaCasty/docs/ai/decisions.md
T
gramps 7827d239e2 docs(commercial): one source of truth for the money — prices, entitlement, channels
The commercial plan was spread over five documents written in five different weeks,
and they contradicted each other: product.md sold the Store, decisions.md called the
Store dead then re-opened, Distribution.md (736 lines) still described Polar as a
download host, MARCOM.md quoted "no subscription" next to a paid tier, and README.md
promised "free forever". An outsider could not tell what ships.

docs/ai/commercial.md is now the only place money is decided: free = whole app at a
921,600 px / 30 fps output profile covering the recording as well as the stream; Pro =
$10/mo or $400 lifetime through Polar, key bound to the buyer's YouTube channel ID via
a claim page, 2 activations, 7–14 day lease with offline grace, fail closed, never
downgrade a running stream; one portable zip + winget primary, Steam and the Store
parked; Azure Trusted Signing (~$9.99/mo), no EV; Founding 200 promo; ~$135/yr costs;
anti-piracy posture and what is permanently rejected.

Everything else now points at it instead of restating it:
- product.md — money sections replaced with pointers; packaging rewritten to
  winget-first, Store parked; signing updated to Trusted Signing.
- decisions.md — graveyard with cause of death for free-forever, the Store ordering,
  the updater, and the 2026-10-30 reversal of the quality-ceiling rejection.
- Distribution.md — rewritten to release mechanics only (artifact, GitHub Releases,
  winget manifest, signing, checklist, takedown): 736 → 120 lines.
- TASKS.md — TASK 54 rewritten, TASK 48's route settled, TASK 10 superseded, five new
  rows (entitlement seam, output-profile gate, licence UI, system messages, packaging).
- README.md — "free forever" replaced with the real split.
- capture.md — obs-backgroundremoval is GPL-3.0 and so licence-INCOMPATIBLE since the
  proprietary EULA; the old "compatible" line was falsified by that change.
- TASKS/task-10, task-48, task-51, task-54 — superseded-banner at the top of each, so
  none of them reads as current policy.
- HANDOFF.md — rewritten: plan settled, next code unit is the entitlement seam.

MARCOM.md and MONETIZATION.md (gitignored) were corrected in place: policy pointer at
the top of each, the flash removed from every live claim, the Polar fee break-even
corrected to ~$900/mo, and the projections flagged as written against a dead model.
2026-10-31 08:32:25 -07:00

134 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Decisions log — retired paths, kept so they are not re-litigated
One dated line per decision that **no longer governs**, plus the reason it died. Read only when
you are about to re-open one of them. **Live commercial rules (prices, entitlement, channels,
signing, promo) are in [`commercial.md`](commercial.md)**; the other live rules live in the
subsystem files. This is the graveyard with cause of death.
## Monetization
### 2026-10-30 — freemium replaces free-forever (creator ruling)
Free tier caps output at **720p30**; **$10/month** or **$400 lifetime** unlocks the higher tiers.
Reverses the 2026-10-08 free-forever ruling below, which was a *current decision*, not an absolute.
The live detail — pixel budget, stream + recording, channel binding, lease, notice cadence — is in
[`commercial.md`](commercial.md); do not re-derive it here.
**The website publishes the model, never the numbers** (free forever, every feature unlocked, a paid
edition at launch) — the terms may still change. The real plan is recorded internally in the site's
`build-this.md`; keep both in step when it moves.
### Superseded: free forever (2026-10-08, TASK 54)
- **2026-09-21** one-time perpetual licence `$29` founder → `$49` list — superseded 6 days later.
- **2026-09-27** `$10/mo` subscription or `$400` lifetime, **no annual**. Store revenue share was
verified at **15%** (ADA v8.10 §6(b)(i) → `$8.50` / `$340` net), including subscriptions.
- **No annual tier** because Microsoft does not pro-rate: *"monthly subscriptions and initial
(pre-renewal) purchases aren't eligible for a prorated refund"* — a first-year subscriber who
cancels loses the remaining months and the developer cannot refund it.
- **Clean numbers, no `.99`** (creator: *"Let's stop with the x.99 stuff"*). The convention exists
only to make a price look cheaper, which is incoherent for a brand sold on honesty.
- **Escalation model** (2026-09-01): the credit was deliberately obnoxious self-promo; the cadence
*is* the nagware — no modals, no feature locks, no stream-time cutoffs.
- **Pre-GA posture — preview-only flash** (reversed 2026-09-26): the credit used to render in the
preview and never on the broadcast, to keep test VODs clean. The creator ruled the free tier must
be honest advertising; it now composites into output and recordings when enabled.
- **Rejected**: always-on watermark (obscurable — replaced by the flash), hard stream-time cutoffs
(a stream dying mid-broadcast reads as broken), soft-limit nagging, freemium feature tiers,
donation-only, and any resolution/quality ceiling. Auto step-down (TASK 33) is a *protect the
stream* feature, never a monetization penalty. ⚠️ **The quality-ceiling and feature-tier halves
were reversed on 2026-10-30** (freemium, output-quality delta); the watermark, cutoff and
nagging rejections still stand.
- **Polar** — $50 already paid, 5% + $0.50 Starter, merchant of record. **Live again as of
2026-10-31** (`commercial.md`). The org ID `c05fb364-…`, the `LCYT-` key prefix and the
customer-portal validate endpoint are recorded in `CREDENTIALS.md`; no product, licence keys or
discount codes exist yet. The old `PolarLicenseService`/`Helpers/PolarLicense.cs` are still gone
— the 14-day-grace design has to be rebuilt (as a lease, not a permanent cache).
- **Store IAP** was never implemented — `Windows.Services.Store` appears nowhere in the repo.
- ⚠️ **Two obligations any future subscription would create** (ADA §6(h)): fulfil the whole period
as marketed (breach → Microsoft may refund in full at its discretion), and **raising the price
disables auto-renew** — the launch price is effectively locked for the product's life.
## Distribution — Store PARKED as the third channel (2026-10-31)
**2026-10-31:** **winget over a portable zip is the primary channel** — one self-contained
`LlamaCasty.exe` + bundled `ffmpeg\`, zipped, hosted on GitHub Releases, manifest in
`microsoft/winget-pkgs` with a pinned SHA-256. Steam is second and parked at $100 (lifetime Pro as
DLC only — Steam has no subscriptions). The **Microsoft Store is third and parked** until the
creator opens the **$19 Individual** developer account: it is the only storefront that bills a
subscription natively and installs without a SmartScreen warning, and it bans self-updaters.
Channels, costs, artifact and signing: [`commercial.md`](commercial.md).
**Why the ordering inverted:** winget has no discovery, but neither does the Store for utilities,
and winget costs nothing, needs no account, no certification and no MSIX pipeline — while the
audience installs Windows tools from a command line. The site and the YouTube channel are the
funnel in both cases.
## Superseded: Store was "the route again" — 2026-10-30 (ordering only)
**2026-10-30:** a **Microsoft Individual developer account** (not Company) removed the legal-entity
blocker — the publisher line shows the verified individual name, and Partner Center does not
convert Individual → Company later. That finding stands; what it no longer implies is *primary*.
The site copy ("Coming soon to the Microsoft Store") stays true until the download page lands, then
the Store line becomes the secondary note.
## Superseded: Store route withdrawn 2026-10-22
- **2026-09-27 Store MSIX + Store IAP decided; 2026-10-22 withdrawn.** A brand name on the
Store's *publisher* line requires a **Company** account → a registered legal entity (LLC ~$85
New Mexico with a ~2-week SOS backlog, ~$143 Wyoming). Partner Center does **not** convert an
Individual account to a Company account later, and an Individual account publishes under the
verified legal name. The creator will not fund an entity for a nameplate.
- **2026-10-22 Velopack deleted** — it downloaded and executed, which Store policy 10.2.2 forbids
(and which the 2026-10-31 plan keeps forbidden). The app has **no self-updater by policy**:
`winget upgrade` plus an in-app "newer version exists" banner is the update path, and
`StorePackagingTests` asserts that no self-updater returns.
- **The MSIX package still builds** (159 MB `artifacts/LlamaCasty.msix`, submitted nowhere) — it
is the parked Store channel's artifact.
- **Signing**: Microsoft removed the EV instant-bypass for SmartScreen in March 2024, so EV buys
what OV buys. The 2026-10-22 ruling was *ship unsigned*; **2026-10-31 supersedes it with Azure
Trusted Signing (~$9.99/month)**, which is Microsoft-issued and accrues reputation.
- **Steam when $100 exists**: Steam Direct $100/product (recoupable after $1,000 AGR), categories
*Audio/Video Production* / *Player Tools* (OBS precedent), developer/publisher name self-chosen
(no entity needed), 5+ 1920×1080 screenshots + capsule art, a build Valve runs, a 2-week live
page, 30% cut, and no subscription support.
## Product surface — retired
- **2026-09-24 StreamElements replaced by native alerts** (TASK 43). No third-party widget feed:
the chat poll *is* the event feed.
- **2026-09-01 the screens/layers settings audit** was retired into the gold pass (TASK 36 item 3)
rather than run as session debt.
- **2026-10-04 launch position**: restoring the saved position was rejected for a derived
top-left placement. The live rule is in `ui-surface.md`; the old clamp's tolerance range is why
it must not come back.
- **D3D11 swap compositor** — superseded by the software compositor (TASK 3 item 16).
- **Windows 8 / 32-bit support** — 64-bit Windows 10/11 only (creator ruling 2026-10-09).
- **"There is no v1.x"** (2026-09-01): everything queues to v1 or to *out of product,
permanently* — no feature parks "for a later version".
## Out of product — permanently
Do not build these; each was explicitly ruled out.
- **Anti-piracy theatre (2026-10-31)**: a native helper DLL for "IP protection", obfuscation,
hardware locking, remote code that downloads and executes, and gating asset downloads as an auth
check. None make a licence enforceable; see `commercial.md` → "Anti-piracy posture".
- **Commercial structures (2026-10-31)**: Patreon or any subscription platform of our own, paid
early access, a paid beta, a gated Discord, and a Pro trial (the free tier is the trial).
- D3D11 swap compositor (superseded by the software compositor).
- OBS-style source expansion — game capture, browser-source zoo, media playlist, VLC, colour-key,
MIDI. The minimal source set is deliberate; creators who need more have graduated to OBS.
- Multi-layout / profiles / presets — that is what OBS is for.
- Cross-process stream resume (impossible via the API; creator ruling 2026-09-01).
- Stream Deck / Loupedeck integration — the device sends keystrokes, and global hotkeys already
*are* the integration.
- Per-source audio sync offset — global offset shipped (TASK 22); per-source is the OBS mixer
rabbit hole and breaks the one-knob audio rule.
- Chroma key / NVIDIA-only background removal (the bundled ONNX path is the one shipped).
- Virtual camera output — a different product and a device-driver swamp; our output is one
YouTube stream.
- Replay buffer, stream clipping, multi-destination restreaming, an in-app bug reporter, and an
advanced broadcast-form tab (latency/DVR/embed/projection/CC/region are fixed at sane defaults;
every exposed field is a support ticket).