Teach agents to generate and edit paywalls#38
Draft
joshdholtz wants to merge 21 commits into
Draft
Conversation
Native integrations must register the app's custom URL scheme and wire presentPaywall(from:)/previewPaywall so dashboard paywall previews open on device, per docs/tools/paywalls/testing-paywalls. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace the stale MCP-era flags (--context/--async/task) with the real session-file flow, call out the persistence limitation (publish ships the default template, not the AI design), and teach agents to run design turns concurrently with app-code integration. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Paywall drafts now receive the AI design on every turn (khepri v2 PATCH), edit works on any paywall, and the custom URL scheme is readable from the App read model instead of a dashboard handoff. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The plan warnings for review notes, the review screenshot, and
subscription group localizations are App Review submission requirements
agents were silently skipping — and one agent concluded the plan path
could not set them after a nesting error ('Additional properties are
not allowed'). Documents the exact store_state nesting, the CSV
columns, the screenshot upload->reference flow, and the rule: resolve
these warnings or surface them to the user, never move past them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- warnings live at plan AND plan_items levels; check both before reporting clear (agent gave a false all-clear off the top level) - verify configured Apple access via rc apps show --json, not rc apps apple check (which dead-ends at interactive 2FA) - review screenshot is a post-apply step; its plan warning is expected - CSV product-level fields must be identical across a product's rows - note where prices are readable (plan diff / Test Store only) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The skill told agents to run three rc schema calls before starting; sessions were burning turns re-deriving the CLI surface. Invocations in the skill are authoritative; discovery, when needed, is one call (rc commands --schemas). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Live fresh-laptop session showed two burns this skill caused: it instructed an upfront RevenueCat MCP inventory (so agents reached for MCP before the CLI that launched them) and per-command rc schema research. Now: the CLI is the primary tool, MCP is a lazy fallback only where a step names it, and discovery is one rc commands --schemas call consulted thereafter. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…board Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Live session produced a paywall that read as the stock template with swapped text. The skills now require a design brief before the first generate call: extract the app's actual brand from its code (exact hex, font, voice, real feature names), ask the user for the customization level, pass an app screenshot via --image when possible, and judge the result against the brief — iterating with named deltas instead of accepting template-adjacent output. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… entry point The skills treated the three presentation mechanisms as interchangeable choices, so integrations shipped with the paywall gated solely behind a locked-feature tap. Now: every app ships a persistent upgrade entry point (settings/profile CTA) PLUS at least one contextual trigger (feature gate, moment-of-value, or onboarding paywall); the agent asks which monetization model fits and must name both placements in its completion report. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Agent post-mortem from a live integration traced its missteps to prompt framing: - the goal is now stated as a user experience (find Upgrade -> open paywall -> purchase -> entitlement unlocks, driven in-app in the app's normal dev run mode), not 'a simulated purchase that unlocks the entitlement' — CLI shortcuts supplement, never replace - 'debug test_ key' conflated WHICH key with WHEN to configure: the key selects the environment; configure() runs on every normal launch, never gated behind DEBUG/test/storage flags - RevenueCatUI renders ALL paywall UI: custom upsell/fallback purchase screens are forbidden; the only allowed custom view is a minimal 'unavailable' state Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Agents created only the test_store app by default, deferring the app_store/play_store record until the credential stage. The record needs no credentials to exist: create it at bootstrap with the bundle ID/applicationId read from the codebase so the project mirrors real life, the credential stages have their target, and both Apple keys attach together whenever available. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e build Agent-driven simulator puppeteering (boot/install/tap/screenshot loops) is slow, flaky, and permission-prompt heavy. Verification splits by nature: the agent proves the build and hands the user a 30-second checklist; the human confirms the experiential outcome. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…into rc-cli-astra-paywall-workflows
An agent parked mid-run waiting for the user to do Apple sign-in the user had deliberately deferred. Stage 7/8 are never blocking: when the human defers Apple, finish every independent stage (paywall, SDK, Test Store verification) and surface the Apple commands as remaining work in the completion report. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-to-file From an agent post-mortem: empty stdout read as 'silent non-JSON' (errors are a JSON envelope on stderr + exit code); activeness was asserted from simulate-purchase's differing shape (canonical: customer show active_entitlements.items[]); the schemas document truncated in a read buffer (write to file, query with jq). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
An offering has one paywall. When it's taken, agents were recreating an offering by hand from the old one's shape. The CLI now forks it: rc paywalls create --offering-id <id> --duplicate-offering (packages + products copied), or --standalone to attach later. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Updates the project-creation and paywall skills to use the new AI paywall workflow when available: generate a draft from product context, revise it with natural-language edits, review it, and publish separately.
Agents also get explicit guidance for async tasks and the non-AI fallback.
Validation
quick_validate.py