From e3636db07e7e242cd150e5a44c338658d84b13df Mon Sep 17 00:00:00 2001 From: Somansh Reddy Date: Mon, 27 Jul 2026 12:48:22 -0700 Subject: [PATCH] docs(send-to-guide): enhance turns are free; render is the paid step (#2827) * docs(send-to-guide): enhance turns are free; render is the paid step The shipped pricing model is import + enhance turns free, only the final render charged (a monthly free-render credit, then per-minute). The guide labeled enhance as 'the paid step', which misstates the model to the authoring agent. Move the paid label to Render. * docs(send-to-guide): state the tiered render billing contract + pin it in the guide test Address review: the pricing line must teach Claude the real tiered contract, not a single universal free render. Per heygen-server usage_limits.py: FREE accounts get 3 renders/month (then blocked, not billed); paid plans are charged 20 credits per rendered minute at completion. Enhance turns are free. Also pin the invariant in sendToGuideContract.test.ts: assert Enhance=free / Render=paid + the tiered figures, and a negative assertion blocking the retired 'Enhance ... paid step' wording from returning. --- docs/guides/claude-design-send-to-hyperframes.md | 4 ++-- .../claude-design/sendToGuideContract.test.ts | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/guides/claude-design-send-to-hyperframes.md b/docs/guides/claude-design-send-to-hyperframes.md index 51d1133e9..c5a2e7a40 100644 --- a/docs/guides/claude-design-send-to-hyperframes.md +++ b/docs/guides/claude-design-send-to-hyperframes.md @@ -30,8 +30,8 @@ The single most important consequence: **there is no file tree on the other side 1. **You (Claude Design)** — author a valid HyperFrames composition as a single self-contained HTML. 2. **Send to HyperFrames** — one click. The importer fetches your HTML, validates it, and creates a hosted HeyGen project. **Import is free.** -3. **Enhance in HyperFrames** — a motion-design agent adds what your export can't: sound effects, background music, and (later) HeyGen media. This is the paid step. -4. **Render** — the cloud pipeline produces the MP4. +3. **Enhance in HyperFrames** — a motion-design agent adds what your export can't: sound effects, background music, and (later) HeyGen media. **Enhance turns are free.** +4. **Render** — the cloud pipeline produces the MP4. **Render is the paid step:** free accounts get 3 renders per month; paid plans are charged 20 credits per rendered minute. Your job is step 1: a composition that imports cleanly and is a strong on-brand starting point. diff --git a/packages/cli/src/commands/claude-design/sendToGuideContract.test.ts b/packages/cli/src/commands/claude-design/sendToGuideContract.test.ts index 494e58d32..04d2e1584 100644 --- a/packages/cli/src/commands/claude-design/sendToGuideContract.test.ts +++ b/packages/cli/src/commands/claude-design/sendToGuideContract.test.ts @@ -28,4 +28,20 @@ describe("Send-to guide fidelity contract", () => { expect(GUIDE).not.toContain("lossy by nature"); expect(GUIDE).not.toContain("content match the brief exactly"); }); + + // Pricing is LLM-facing contract too: the guide once labeled Enhance "the paid step", which + // teaches Claude the wrong billing boundary. The shipped model (heygen-server + // magic_edit/logic/usage_limits.py) is: import + enhance turns free; only Render is billed — + // FREE accounts get 3 renders/month, paid plans 20 credits/rendered-minute. Pin the concept, + // not an exact sentence, and block the retired Enhance-as-paid wording from returning. + it("identifies Enhance as free and Render as the paid/billed step, with the tiered contract", () => { + expect(GUIDE).toContain("Enhance turns are free"); + expect(GUIDE).toContain("Render is the paid step"); + expect(GUIDE).toContain("3 renders per month"); + expect(GUIDE).toContain("20 credits per rendered minute"); + }); + + it("does not restore the retired 'Enhance ... paid step' wording", () => { + expect(GUIDE).not.toContain("HeyGen media. This is the paid step"); + }); });