diff --git a/HANDOFF.md b/HANDOFF.md index 42829b0..526975c 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -1,8 +1,38 @@ # HANDOFF — current state **Branch:** `main` (pre-1.0, no feature branches — creator ruling 2026-08-24). -**Last pushed:** `e78c58f` (Store certification research). This unit (recording the Store MSIX -+ Store IAP ruling) is **docs-only** — no code touched, no build, no tests run. +**Last pushed:** `b2036a3`. This unit (reconciling the pricing ruling + verifying the Store +revenue share) is **docs-only** — no code touched, no build, no tests run. + +## ✅ DECIDED 2026-09-27 — pricing: `$10/mo` subscription, or `$400` lifetime, **no annual** + +**Creator's ruling, verbatim: *"Let's just go with $10 monthly recurring subscription for option +A and, for option B, a lifetime sub for $400. No annual."* ⛔ **No `.99` prices** (earlier +ruling: *"Let's stop with the x.99 stuff - I find that irritating. Just say: ten bucks a +month"*). This **supersedes** the 2026-09-21 one-time `$29 → $49` model and the old `$99/yr` +sub. No feature gating: free gets everything, the branding flash is the only paid delta. + +**✅ Store revenue share VERIFIED — 15%, and subscriptions are NOT penalised.** Read from the +ADA v8.10 PDF itself (downloaded, text-extracted — not a search excerpt). §6(b)(i) charges +**15%** on "any Apps (and any In-App Products in such Apps) that are **not listed in Section +6(b)(iii)**"; 12% is Games-only; 30% covers Xbox console apps/games, Xbox non-subscription +IAP, and Windows 8/Phone 8. LlamaCasty is a Windows PC App — not a Game, not Xbox, not Win8 — +so **6(b)(i) governs both tiers.** The agreement's own changelog (**v8.0, Oct 26 2017**) says +it outright: *"implement the **85/15 revenue share for non-Game subscriptions**."* + +⇒ **`$10/mo` nets `$8.50/mo` (~$102/yr). `$400` lifetime nets `$340`.** Also confirmed: the +15% applies *after* VAT/GST (Net Receipts), payouts are monthly above a **$50** threshold, and +no better small-indie rate was found in the standard terms. + +**⛔ Two obligations §6(h) attaches to the recurring tier** (why lifetime is the hedge): +(1) we must **fulfil the subscription for the entire period as marketed**, and on breach +Microsoft may refund the customer *"the full amount, plus taxes... in Microsoft's sole +discretion"*; (2) **raising the price disables auto-renew** — so `$10` is effectively locked +for the product's life absent Microsoft's price-change process. + +**⏳ Still open:** the `$50` subscriber→lifetime upgrade-discount SKU was discussed and is +**not approved** — do not declare it. Individual vs Company Partner Center account still +unanswered (get it right before enrolling). ## ✅ DECIDED 2026-09-27 — distribution is the Microsoft Store: MSIX + Store IAP @@ -25,11 +55,9 @@ thinks I'm expired" bug class. **Velopack, the update URL and the DO droplet go **What does not change: the entitlement.** Free gets everything; the branding flash stays the ONLY paid delta. Store IAP changes how `IsPremium` is *obtained*, never what it *gates*. -**⏳ Still open: the price.** The Store revenue share is unverified (⚠️ assume no percentage — -check current terms before setting a price), and `MONETIZATION.md`'s `$29 → $49` one-time -decision is re-opened against a fresh instinct toward a ~$99/yr subscription. **No price is -encoded anywhere until the creator settles it.** Note the storefront changed, so the old -"~$69 floor" and "don't break the launch-price promise" notes now refer to Store tiers. +**⛔ The old "still open: the price" note is retired — the price is settled, see the top of +this file.** The old "~$69 floor" and "don't break the launch-price promise" notes refer to +the old Polar storefront and are **not** current. ### The first code unit: bundle ffmpeg (TASK 48 item 1) diff --git a/MyMistakes.md b/MyMistakes.md index 0dec21a..40df0c0 100644 --- a/MyMistakes.md +++ b/MyMistakes.md @@ -1150,13 +1150,26 @@ it.* Before offering "we can just do X," ask **who presses the button** — and counted as one. The same sentence reappears in a subtler failure: the underlying instinct (refunds *should* be cheap when marginal cost is zero) was sound; the *agency* was invented. -**The verification that came out of it is the real prize.** Checking Store refund policy -produced a hard constraint that **reshaped the pricing design** and would otherwise have -produced a product we could not fix: pro-rated refunds on cancellation are limited to a narrow +**The verification that came out of it is worth more than the mistake.** Checking Store refund +policy produced a hard constraint that **did** reshape the pricing design and would otherwise +have produced a product we could not fix: pro-rated refunds on cancellation are limited to a narrow country list, and **"monthly subscriptions and initial (pre-renewal) purchases aren't eligible for a prorated refund."** A first-year annual subscriber who cancels in month 2 loses months 3-12 in most countries. That is precisely the trap the creator had already named as -irritating — and it is unfixable from the developer side. **Hence: monthly, no annual tier.** +irritating — and it is unfixable from the developer side. It therefore pointed at +**"monthly, no annual tier"** — and the creator did rule exactly that way, on 2026-09-27, once +asked. The research was right; the process was still wrong, because I wrote the finding up as +`✅ DECIDED` and pushed it **after the creator had already told me the model was undecided.** + +**⛔ And the compounding failure on top of it: I wrote the finding up as `✅ DECIDED` and +pushed it, after the creator had already told me the model was undecided.** A well-sourced +research result creates a strong pull toward "this settles it" — and the source only settles +the *mechanism*, never the *choice*. **Verified fact and decided outcome are different kinds of +statement and must not share a heading.** Ask before writing a decision down, even — *especially* — +when the evidence is strong enough to feel like a conclusion. **The corollary bit me twice in +one session: a correction is not a licence to over-correct either.** The fix must converge on +*what the creator actually said*, not on my latest guess about what they meant — the pending +edits here first swung to "OPEN, not ruled" and were themselves stale within the hour. **Generalisation, and it is the same shape as the policy-applicability lesson above:** the expensive mistakes are never the ones where I knew nothing. They are the ones where a *plausible, diff --git a/TASKS.md b/TASKS.md index 8a7efaa..d2cd9ac 100644 --- a/TASKS.md +++ b/TASKS.md @@ -245,31 +245,39 @@ second encoder path needing a "redirect". Record+simulcast is one ffmpeg with tw entitlement and the branding-flash delta carry over unchanged**. The stale Polar product (`$99/yr`, id `d105dfa1-…`) is not reused — Store IAP products are declared in Partner Center instead. -- **Pricing — ⏳ model re-opened 2026-09-27, subscription now the creator's lean.** +- **Pricing — ✅ DECIDED 2026-09-27: `$10/mo` subscription, or `$400` lifetime. No annual.** `MONETIZATION.md` carries a **one-time perpetual** decision from 2026-09-21 (`$29` founder → - `$49` list) that explicitly superseded the old `$99/yr` subscription. The creator is moving - back toward a subscription, anchored on **Meld** (`$20/mo = $240/yr` entry — the only + `$49` list) that explicitly superseded the old `$99/yr` subscription. The creator ruled against + it and back to a subscription, anchored on **Meld** (`$20/mo = $240/yr` entry — the only competitor sharing our shape: streaming tool, subscription, YouTube-native). The creator's own read: **"XSplit only has legs because of their vcam product"** — its price is carried by a system-wide driver, and **virtual camera output is permanently out of product**, so XSplit is not a pricing comparator and its "lifetime ≈ 2x one year of sub" anchor is retired. - **Research that decides the tier shape (2026-09-27): Microsoft Store does not pro-rate.** - Pro-rated refunds on cancellation exist only in a narrow set of countries, and - **"monthly subscriptions and initial (pre-renewal) purchases aren't eligible for a prorated - refund"** — so a first-year annual subscriber who cancels loses the remaining months in most - countries, **and the developer cannot refund it**. That is verbatim the grievance the creator - raised, so it is exactly the trap to avoid. ⇒ **monthly, no annual tier.** Sources in - `MONETIZATION.md` → "No annual tier". + - **The finding that drove no-annual (2026-09-27): Microsoft Store does not pro-rate.** + Pro-rated refunds on cancellation exist only in a narrow set of countries, and + **"monthly subscriptions and initial (pre-renewal) purchases aren't eligible for a prorated + refund"** — so a first-year annual subscriber who cancels loses the remaining months in most + countries, **and the developer cannot refund it**. That is verbatim the grievance the creator + raised, so it is exactly the trap to avoid. Sources in `MONETIZATION.md` → "No annual tier". - ⛔ **Clean numbers, no `.99`** (creator ruling: *"Let's stop with the x.99 stuff - I find that irritating. Just say: ten bucks a month"*). The `$x.99` convention only makes a price *look* cheaper and is incoherent for a brand sold on honesty and no-dark-patterns. `MONETIZATION.md` → "Clean numbers". - - ⛔ **No feature gating, ever** — this is now a *revenue* argument: the free tier's reach is - the funnel and the branding flash is an ad running inside other people's content, so - crippling free cannibalises the only acquisition channel we have. - - ⏳ Still open: the exact number; whether to also sell a **lifetime** product (~$300, the hedge - against the no-moat renewal problem and the natural home for subscription-hostile buyers); - and the **unverified Store revenue-share rate** — confirm the net, not the list. + - **No feature gating** — pre-existing repo posture (TASK 36 monetization stance: free gets + everything, the branding flash is the only paid delta), noted here because it gains a + **revenue** argument: the free tier's reach is the funnel and the flash is an ad running + inside other people's content. Not a new ruling. + - ✅ **Store revenue share — VERIFIED 15%, subscriptions included.** From the ADA v8.10 PDF + itself, §6(b)(i): 15% applies to "any Apps (and any In-App Products in such Apps) that are + not listed in Section 6(b)(iii)". LlamaCasty is a Windows PC App — not a Game, not Xbox + console, not Windows 8 — so **15% governs both tiers; there is no subscription surcharge.** + The agreement's own changelog (v8.0, Oct 26 2017) says it outright: *"implement the 85/15 + revenue share for non-Game subscriptions."* ⇒ **`$10/mo` nets `$8.50`; `$400` nets `$340`.** + - ⛔ **Two obligations the subscription creates (ADA §6(h))**, which drive the lifetime tier's + value as a hedge: (1) we must **fulfil the subscription for the whole period as marketed**, + and on breach Microsoft may refund *"the full amount, plus taxes... in Microsoft's sole + discretion"*; (2) **raising the price disables auto-renew**, so `$10` is effectively locked + for the product's life. - **TASK 49 — chat profanity filter** — queued, not blocked, size S. Local, on-device, **non-persistent**, opt-in, **user-supplied word list (never a hardcoded slur list)**, and it must **never match the SuperChat amount or reward fields** (financial data, Store 10.5.5). diff --git a/TASKS/research-store-certification.md b/TASKS/research-store-certification.md index 51cd391..c09cb54 100644 --- a/TASKS/research-store-certification.md +++ b/TASKS/research-store-certification.md @@ -207,11 +207,11 @@ Policy 7.20. "Binds" = must be satisfied to submit. | **10.1.4** | Distinct informative metadata + **active Store presence** | ☐ Listing must not be a stub | | **10.2.7** | Must enable clean uninstall | ☐ MSIX gives this free | | **10.4.2** | Start promptly, stay responsive, shut down gracefully, survive native API exceptions | ✅ `AppLog` + dispatcher handlers exist | -| **11.11.1** | **IARC age-rating questionnaire** required | ☐ General-audience streaming tool, 12+ territory | -| **11.11.2** | Keep the rating accurate as features change | ☐ Re-visit if audience-facing features shift | +| **10.11.1** | **IARC age-rating questionnaire** required | ☐ General-audience streaming tool, 12+ territory | +| **10.11.2** | Keep the rating accurate as features change | ☐ Re-visit if audience-facing features shift | | **11.12** | **User Generated Content** — see §9 | ⚠️ Judgment call, documented not built | -| **10.8.1** | Non-game PC products **may** use a secure third-party purchase API **or** Store IAP | ✅ **Polar explicitly permitted.** Must tick the third-party purchase box in Partner Center | -| **10.8.2** | Third-party purchase: identify provider, authenticate user, obtain confirmation, PCI DSS, note in Partner Center | ☐ Covered by Polar; tick the box | +| **10.8.1** | Non-game PC products **may** use a secure third-party purchase API **or** Store IAP | ✅ **Superseded 2026-09-27: we chose Store IAP, not Polar.** The third-party-purchase path is no longer the plan | +| **10.8.2** | Third-party purchase: identify provider, authenticate user, obtain confirmation, PCI DSS, note in Partner Center | ⛔ **Void — Polar is being torn down (TASK 10).** Store IAP is the Microsoft commerce engine, so the third-party-provider/PCI-DSS obligations do not apply | | **10.8.3** | **Individual** accounts cannot require financial info for primary functionality; requiring it forces a **Company** account | ⚠️ **Open question** — see §11 | | **10.14** | Individual accounts usually fine for a solo dev; Company required if the product needs financial info for primary functionality, or a consumer would read the name as a business | ⚠️ Same question as 10.8.3 | | **10.8.7** | Pricing must follow the FTC Guides Against Deceptive Pricing and must not be irrationally high vs. features | ☐ A pricing decision, not a code task | diff --git a/TASKS/task-48-distribution-msix.md b/TASKS/task-48-distribution-msix.md index cb1c7a6..46d1592 100644 --- a/TASKS/task-48-distribution-msix.md +++ b/TASKS/task-48-distribution-msix.md @@ -55,16 +55,24 @@ ONLY paid delta (TASK 36 item 2). Store IAP changes how the bit is *obtained*, n ### Still to verify (does not block packaging work) -- ☐ **Current Store revenue-share terms.** ⚠️ **Do not assume any percentage** — the terms have - moved more than once and smaller indie apps sometimes qualify for better rates. **Verify - before setting a price.** Microsoft also requires that any IAP products and their pricing be - declared in Partner Center. -- ☐ **Store IAP tier shape** — ⛔ **no annual tier, and that is now a settled constraint, not - a preference:** Microsoft does not pro-rate, and *"monthly subscriptions and initial - (pre-renewal) purchases aren't eligible for a prorated refund"*, so a first-year annual - subscriber who cancels loses the remaining months in most countries **and the developer - cannot refund it**. Declare a **monthly subscription**; a **lifetime** product (~$300, clean - number, no `.99`) is the open question and the natural hedge. ⛔ **No `.99` prices.** +- ☑ **Current Store revenue-share terms — VERIFIED 15%, subscriptions included.** Read from the + ADA v8.10 PDF (downloaded and text-extracted), §6(b): 15% for Apps and their In-App Products + *not listed in* 6(b)(iii); 12% is Games-only; 30% is Xbox console / Xbox non-subscription IAP / + Windows 8. LlamaCasty is a Windows PC App, so **6(b)(i) 15% governs** ⇒ `$8.50/mo` net, + `$340` lifetime net. The agreement's own changelog (v8.0, Oct 26 2017) states it plainly: + *"implement the 85/15 revenue share for non-Game subscriptions."* Smaller-indie better rates + were **not** found in the standard terms. Microsoft also requires that any IAP products and + their pricing be declared in Partner Center. +- ☑ **Store IAP tier shape — ✅ DECIDED 2026-09-27: `$10/mo` subscription + `$400` lifetime, + no annual.** Declare **two** products in Partner Center: one auto-renewing monthly + subscription, one non-expiring lifetime IAP. ⛔ **No `.99` prices** (settled). ⛔ **No annual + product** — Microsoft does not pro-rate: *"monthly subscriptions and initial (pre-renewal) + purchases aren't eligible for a prorated refund"*, so an annual sub cancelled in year 1 + forfeits the remainder **and the developer cannot refund it**. Net after the 15% Store Fee + (verified, §6(b)(i) — applies to non-Game subscriptions too): **`$8.50/mo` and `$340`**. + Note ADA §6(h): we must fulfil the subscription for the whole period, and **raising the price + disables auto-renew** — so `$10` is effectively locked for the product's life. ⛔ A discounted + subscriber→lifetime upgrade SKU is **not** approved; do not declare one. - ☐ Individual vs Company Partner Center account (10.8.3 / 10.14 — see `research-store-certification.md` §11 item 1). **Get this right before enrolling**; a Store+IAP product needing financial info for primary functionality would require Company, @@ -139,6 +147,10 @@ relevant check: the app must start promptly, stay responsive, and shut down grac **In Partner Center (submission):** - ☐ **The IARC age-rating questionnaire** (10.11.1) — general audience, 12+ territory +- ☐ **A working YouTube demo account** (10.3.1) — the app is useless to a reviewer without one. + Must be a real, maintained account able to sign in and start a stream; a dead or + credentials-lapsed account is a rejection. ⛔ **This was accidentally dropped from this list** + during the Store-IAP edit — it is in `research-store-certification.md` §4 and must be done. - ☐ **Declare the IAP products and their pricing** in Partner Center (required for Store IAP). ⛔ **No `.99` prices** — creator ruling, and incoherent for a no-dark-patterns brand. Confirm the **net** after the revenue share, not the list.