{"ok":true,"version":"agent-action-contracts.v1","generatedAt":"2026-05-30T05:23:39.975Z","surface":{"id":"action-contracts","artistId":"laurel","safeForAgent":true,"browserAutomationRequired":false,"relatedIssues":[608,611,612,671,672,673,674,704,757,799,810,811,812,818,819,873,895,986,1078,1112,1113,1114,1192,1260,1282,1291,1292,1298,1299,1359,1546,1681,1692,1702,1710,1794,1795]},"communityMode":{"version":"fanful-community-mode.v1","contractDoc":"docs/platform/fanful-community-mode-contract.md","relatedIssues":[560,1075,1078],"source":"agent-action-contracts","selectedCommunity":{"id":"laurel","slug":"laurel-harned","name":"Laurel Harned","role":"first-default-community","isDefault":true,"artistSite":"https://fanful.net/","rawDatabaseIdsRedacted":true},"activeMode":"fan","availableModes":[{"id":"fan","status":"available","summary":"Listen, watch, chat, support, buy, and participate as a fan of the selected community.","requiredAuthorization":"Public or signed-in listener context for private fan state."},{"id":"publisher","status":"authorization-required","summary":"Administer creator/community commerce, live rooms, messaging, moderation, and settings.","requiredAuthorization":"Server-confirmed creator/admin authorization for selectedCommunity.id.","blockedUnless":"Do not expose or execute publisher actions until the backend resolves creator/admin authorization for this selected community."}],"modeSwitching":{"oneAccount":true,"requiresSignOut":false,"preservesPlayerSession":true,"preservesListenerIdentity":true,"authorizationBoundary":"Switching into publisher mode never grants authority by itself; each creator/admin action must still pass server-side scope and role checks for the selected community."},"agentInstructions":["Display selectedCommunity.name and activeMode before proposing community-scoped actions.","Offer fan actions by default; offer publisher actions only when publisher mode is available or when asking the human to authorize it.","Do not assume Laurel-only global context when future communities are added; carry selectedCommunity.id through proposals and confirmations."],"redactedFields":["community.databaseId","artist.internalId","admin.grantId","agentBearerToken"]},"agentAuthorization":{"id":"scoped-delegated-grants","designDoc":"docs/agent/agent-authorization-model.md","status":"selected-storage-pending","credentialPolicy":"Opaque bearer credentials must stay in HTTP Authorization headers or MCP client transport configuration, never prompt-visible tool input.","principalClasses":["guest","listener","creator_admin","owner","approved_automation"],"principalResolutionOrder":["scoped-agent-bearer-token","first-party-better-auth-session","env-gated-dev-operator-admin-token","guest"],"scopeFamilies":["public:read","listener:profile:read","listener:profile:write","listener:preferences:read","listener:preferences:write","listener:entitlements:read","listener:checkout:preview","listener:checkout:start","listener:listen-along:read","listener:listen-along:write","listener:community:post","listener:community:react","listener:ideas:read","listener:ideas:write","creator:<artistId>:read","creator:<artistId>:analytics:read","creator:<artistId>:email:read","creator:<artistId>:email:write","creator:<artistId>:commerce:preview","creator:<artistId>:commerce:write","creator:<artistId>:media:read","creator:<artistId>:media:write","creator:<artistId>:live:read","creator:<artistId>:live:write","creator:<artistId>:community:moderate","creator:<artistId>:community:speak","creator:<artistId>:rooms:read","creator:<artistId>:rooms:write","agent:workflow-triggers:read","agent:workflow-triggers:subscribe","agent:sessions:read","agent:sync-jobs:read","platform:ops:read"],"implementationBlockers":[]},"authModes":[{"id":"guest","summary":"Public manifest reads only. No private listener, creator, provider, or payment state."},{"id":"optional-session","summary":"Public reads plus signed-in listener summaries when a first-party session is present."},{"id":"signed-in-listener","summary":"Private listener reads and reversible listener-scoped writes."},{"id":"confirmed-listener","summary":"Listener-initiated purchase or public-content writes after explicit confirmation."},{"id":"artist-admin-or-approved-automation","summary":"Creator/admin reads and writes using first-party admin auth, a scoped delegated grant, or the current env-gated dev/operator fallback."},{"id":"platform-owner","summary":"Mark/platform-owner-only provider and workspace changes."},{"id":"scoped-agent-grant","summary":"Selected #810 model: a Better Auth human session delegates named scopes to an agent client; bearer credentials stay in transport headers and resolve server-side to a principal."}],"writeEnvelope":{"requiredBeforeMutatingMcpTools":true,"validationEndpoint":{"href":"https://fanful.net/api/agent/action-contracts/envelope","method":"POST","auth":"guest","description":"Validate and normalize the shared confirmed-write envelope without executing a mutation."},"contract":"agent-write-envelope.v1","fields":["resolvedPrincipal","actor","client","grantId","matchedScope","action","target","dryRun","confirmation","idempotencyKey","reason","auditCorrelationId"],"confirmation":"Any destructive, externally visible, billing-impacting, moderation, creator-speech, checkout, or provider mutation needs an explicit user confirmation that repeats the exact target and consequence.","audit":"Every creator/admin/platform write needs durable audit attribution. Listener public writes need visible user attribution plus agent-client metadata.","idempotency":"Every agent write should accept or derive a stable idempotency key so MCP/CLI/ChatGPT retries cannot duplicate charges, posts, go-live transitions, or provider changes."},"workflowTriggers":{"endpoint":{"href":"https://fanful.net/api/agent/workflow-triggers","method":"GET","auth":"guest","description":"Read the signed webhook trigger catalog for event-driven agent workflows."},"resourceUri":"fanful://agent/workflow-triggers/manifest","contract":"agent-workflow-triggers.v1","status":"manifest-ready-delivery-planned","issue":"#1112","policy":"Webhook payloads are redacted prompts to read current Fanful manifests before acting. They never authorize a write by themselves; mutating agent actions still require the shared write envelope and a ready action contract."},"agentSessions":{"endpoint":{"href":"https://fanful.net/api/agent/sessions","method":"GET","auth":"guest","description":"Read the external agent session and event-stream contract for multi-step agent runs."},"resourceUri":"fanful://agent/sessions/manifest","contract":"agent-sessions.v1","status":"manifest-ready-storage-planned","issue":"#1113","policy":"Agent sessions are redacted run histories and pending-approval records. They do not replace current MCP/action contracts, and pending approvals still require the shared write envelope before execution."},"syncJobs":{"endpoint":{"href":"https://fanful.net/api/agent/sync-jobs","method":"GET","auth":"guest","description":"Read the cursor-based sync job and checkpoint contract for imported creator/catalog data."},"resourceUri":"fanful://agent/sync-jobs/manifest","contract":"agent-sync-jobs.v1","status":"manual-run-ready","issue":"#1114/#1224","policy":"Sync jobs report redacted source/target/cursor/checkpoint state and can now run the first-party Stripe catalog app-reference drift worker with scoped/admin credentials. They never accept provider credentials or raw payment/media ids as tool input, and drift reports do not authorize writes without a ready action contract."},"filters":{"audience":"creator","domain":"commerce","returned":17,"total":35},"contracts":[{"id":"creator.commerce.lesson-credit-ledger-read","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Read the redacted admin lesson-credit ledger health contract for aggregate totals, event-type breakdowns, recent event markers, and blocked write identifiers.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"artist-admin-or-approved-automation","description":"Agent-safe creator commerce manifest with authorized commerce.adminLessonCreditLedger readback."},{"href":"https://fanful.net/api/admin/lesson-credit-ledger","method":"GET","auth":"artist-admin-or-approved-automation","description":"Human/admin API with the same redacted ledger readback shape."}],"futureToolName":"fanful_creator_lesson_credit_ledger_read","confirmation":{"required":false,"kind":"none","prompt":null},"audit":{"required":false,"currentRecord":null,"requiredBeforeExecutable":null,"attribution":"Read-only ledger health summary. Credit consumption, refund, renewal, skip-week, cancellation, and tier-benefit writes need separate confirmed-write contracts before becoming executable."},"idempotency":{"requiredForWrites":false,"keyScope":"not applicable"},"rateLimit":{"scope":"artist-admin-or-automation + lesson-credit-ledger-read","expectation":"Use normal creator/admin read limits; this route does not mutate state."},"blockers":[],"relatedIssues":["#530","#858","#1417","#1784","#1794","#1795"],"modelVisibleBoundaries":["Guest and listener callers must receive an explicit authorization blocker and no partial ledger data.","Do not expose raw lesson_credit_ledger_events ids, user ids, student emails, booking ids, purchase ids, policy ids, idempotency keys, reasons, metadata JSON, Stripe checkout sessions, or Stripe payment intents.","The model-visible recent event sample is limited to aggregate numbers, event type labels, timestamps, and boolean presence markers."]},{"id":"creator.commerce.preview-and-update","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Preview creator coaching/lesson price and policy impact, then execute confirmed lesson offering price writes through the shared agent write envelope. Broader product, tier, credit, cancellation, refund, and entitlement writes remain blocked.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Non-mutating lesson price preview and confirmed lesson price write actions."},{"href":"https://fanful.net/api/admin/lessons","method":"POST","auth":"artist-admin-or-approved-automation","description":"Existing lesson admin write route."},{"href":"https://fanful.net/api/admin/shop","method":"PATCH","auth":"artist-admin-or-approved-automation","description":"Existing shop admin write route."}],"futureToolName":"fanful_creator_service_price_policy_update","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm before/after public copy, price/currency, Stripe impact, affected surfaces, entitlement impact, cancellation terms, stale-state guard, idempotency key, and rollback plan."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + commerce-object-id + action + confirmed version"},"rateLimit":{"scope":"artist-admin-or-automation","expectation":"Throttle billing-impacting writes and keep preview calls non-mutating."},"blockers":["Only lesson_offerings.price_cents is executable in this contract. Use creator.commerce.stripe-price-select for existing lesson Stripe Price mapping changes, creator.commerce.stripe-price-create for replacement lesson Stripe Price creation, creator.commerce.shop-product-stripe-price-select/create for shop product Price mappings, or creator.commerce.shop-product-visibility-update for shop product visibility. Broader tier changes, credits, cancellation/refund terms, and entitlement changes remain blocked."],"relatedIssues":["#534","#608","#612","#671","#799","#945","#1057","#1083"],"modelVisibleBoundaries":["Do not expose Stripe price ids, checkout ids, student contact details, meeting URLs, booking instructions, download URLs, or private notes."]},{"id":"creator.commerce.lesson-policy-update","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Create or update lesson policy settings through a confirmed, audited write envelope. Refund execution, credit spending, bundle creation, and cancellation/reschedule workflows remain blocked.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed lesson policy settings write for one artist-default or offering-override row."},{"href":"https://fanful.net/api/lesson-policy-readiness","method":"GET","auth":"guest","description":"Shared web/native/agent lesson policy readiness contract."}],"futureToolName":"fanful_creator_lesson_policy_update","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm policy id, scope, offering override if any, cancellation/reschedule cutoffs, refund/no-show/skip-week settings, stale-state guard, idempotency key, audit correlation id, and the fact that no refund, credit, Stripe, or booking-state mutation will happen."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, redacted before/after policy settings, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + lesson-policy-settings-id + observed updated_at-or-policy-id-set + settings"},"rateLimit":{"scope":"artist-admin-or-automation + lesson-policy-settings-id","expectation":"Reject duplicate idempotency keys, stale policy rows, stale policy id catalogs, no-op updates, and invalid offering overrides before mutating."},"blockers":["This contract updates lesson_policy_settings only; cancellation/reschedule execution, refunds, credit ledger consumption, bundles, subscription renewals, and tier-linked benefit enforcement remain blocked in #530."],"relatedIssues":["#530","#799","#1371","#1413"],"modelVisibleBoundaries":["Do not expose student contact details, booking notes, meeting URLs, raw Stripe ids, refund ids, or private lesson notes."]},{"id":"creator.commerce.lesson-availability-update","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Create or update future lesson availability windows through a confirmed, audited write envelope. Booking, refund, credit, Stripe, meeting URL, and private note changes remain blocked.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed lesson availability write for one future open or cancelled window."},{"href":"https://fanful.net/api/admin/lessons","method":"POST","auth":"artist-admin-or-approved-automation","description":"Existing first-party lesson admin write route."}],"futureToolName":"fanful_creator_lesson_availability_update","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm availability id, offering id, start/end time, timezone, open/cancelled status, capacity, stale-state guard, idempotency key, audit correlation id, and the fact that no booking, refund, credit, Stripe, meeting URL, or private-note mutation will happen."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, redacted before/after availability summaries, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + lesson-availability-window-id + observed updated_at-or-availability-id-set + schedule settings"},"rateLimit":{"scope":"artist-admin-or-automation + lesson-availability-window-id","expectation":"Reject duplicate idempotency keys, stale availability rows, stale availability id catalogs, no-op updates, past windows, held/booked slot mutations, and unsafe side-effect fields before mutating."},"blockers":["This executable slice updates lesson_availability_windows scheduling fields only. Booking cancellation/reschedule execution, refunds, credit ledger consumption, meeting URL writes, and private notes remain blocked under #530 or need separate contracts."],"relatedIssues":["#530","#799","#1413","#1550"],"modelVisibleBoundaries":["Do not expose student contact details, booking notes, meeting URLs, raw Stripe ids, refund ids, or private lesson notes.","This wrapper never updates lesson_bookings, lesson_credit_ledger_events, Stripe checkout sessions, meeting_url, or notes."]},{"id":"creator.commerce.shop-product-create","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Create one shop product with safe catalog metadata through a confirmed, audited write envelope.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed shop product creation write."},{"href":"https://fanful.net/api/admin/shop","method":"GET","auth":"artist-admin-or-approved-automation","description":"Existing first-party shop product admin read."}],"futureToolName":"fanful_creator_shop_product_create","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm product title, kind, price, visibility state, inventory fields, safe fulfillment/display metadata, observed product ids, idempotency key, audit correlation id, and affected fan surfaces before creating a product."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute creation to the artist admin or approved automation identity, including agent client, redacted created product summary, observed product ids, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + shop-product-id + observed product ids + catalog metadata"},"rateLimit":{"scope":"artist-admin-or-automation + shop-product-create","expectation":"Reject duplicate idempotency keys, stale product catalogs, duplicate product ids or generated slugs, unsupported product kinds, invalid visibility combinations, non-download download metadata, and unsafe extra product mutation fields before mutating."},"blockers":["This executable slice inserts one store_items row with safe catalog metadata only. Raw download file URLs, external fulfillment URLs, Stripe Price ids, checkout sessions, purchase rows, fulfillment execution, order changes, refunds, and credits need separate contracts."],"relatedIssues":["#612","#671","#799","#1052","#1548","#1681","#1684","#1692"],"modelVisibleBoundaries":["Do not expose raw Stripe Price ids, checkout sessions, payment intents, external fulfillment URLs, private download URLs, inventory supplier notes, or buyer identifiers.","Model-visible responses may show product id, title, description, kind, price cents, active/showInShop booleans, inventory count, fulfillment note, download display filename/release notes, sort order, and booleans for sensitive fields only.","This wrapper never sets raw download file URLs, external URLs, Stripe Price mappings, checkout sessions, purchase rows, fulfillment execution, refunds, or credits. Use the dedicated existing-product wrappers for later visibility, details, and Stripe Price mapping changes."]},{"id":"creator.commerce.shop-product-visibility-update","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Update one editable shop product's active and public-shop visibility flags through a confirmed, audited write envelope.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed shop product visibility write for one editable product."},{"href":"https://fanful.net/api/admin/shop","method":"GET","auth":"artist-admin-or-approved-automation","description":"Existing first-party shop product admin read."}],"futureToolName":"fanful_creator_shop_product_visibility_update","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm shop product id, product title, requested active/showInShop state, stale-state guard, idempotency key, audit correlation id, and affected fan surfaces before changing product visibility."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, redacted before/after product visibility summaries, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + shop-product-id + active/showInShop + observed updated_at"},"rateLimit":{"scope":"artist-admin-or-automation + shop-product-id","expectation":"Reject duplicate idempotency keys, stale product rows, no-op visibility changes, unsupported product kinds, and unsafe extra product mutation fields before mutating."},"blockers":["This executable slice is limited to store_items.active and store_items.show_in_shop. Safe product detail edits use creator.commerce.shop-product-details-update; price and Stripe Price mapping use creator.commerce.shop-product-stripe-price-select/create. Raw download URL, external URL, checkout, fulfillment execution, order, and refund changes need separate contracts."],"relatedIssues":["#612","#671","#1052","#1517","#1548"],"modelVisibleBoundaries":["Do not expose raw Stripe Price ids, checkout sessions, payment intents, external fulfillment URLs, private download URLs, inventory supplier notes, or buyer identifiers.","Model-visible responses may show product id, title, kind, price cents, active/showInShop booleans, inventory count, and booleans for sensitive fields only.","This wrapper never changes product details, price, Stripe mapping, fulfillment terms, external URLs, or download URLs."]},{"id":"creator.commerce.shop-product-details-update","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Update one existing shop product's safe catalog copy, inventory, fulfillment note, download display metadata, or sort order through a confirmed, audited write envelope.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed shop product details write for one editable product."},{"href":"https://fanful.net/api/admin/shop","method":"GET","auth":"artist-admin-or-approved-automation","description":"Existing first-party shop product admin read."}],"futureToolName":"fanful_creator_shop_product_details_update","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm shop product id, title, requested detail fields, stale-state guard, idempotency key, audit correlation id, and affected fan surfaces before changing product details."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, redacted before/after product detail summaries, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + shop-product-id + requested details + observed updated_at"},"rateLimit":{"scope":"artist-admin-or-automation + shop-product-id","expectation":"Reject duplicate idempotency keys, stale product rows, no-op details changes, unsupported product kinds, duplicate generated slugs, and unsafe extra product mutation fields before mutating."},"blockers":["This executable slice is limited to store_items title/description/slug, inventory tracking/count, fulfillment note, download display metadata, and sort order. Price and Stripe Price mapping use creator.commerce.shop-product-stripe-price-select/create. Raw download URLs, external URLs, product kind/id, checkout sessions, order fulfillment, and refunds need separate contracts."],"relatedIssues":["#612","#671","#799","#1052","#1548","#1681"],"modelVisibleBoundaries":["Do not expose raw Stripe Price ids, checkout sessions, payment intents, external fulfillment URLs, private download URLs, inventory supplier notes, or buyer identifiers.","Model-visible responses may show product id, title, description, kind, price cents, active/showInShop booleans, inventory count, fulfillment note, download display filename/release notes, and booleans for sensitive fields only.","This wrapper never changes price, Stripe mapping, raw download file URLs, external URLs, product kind/id, checkout sessions, purchase rows, fulfillment execution, or refunds. Use creator.commerce.shop-product-stripe-price-select/create for shop product Price mappings."]},{"id":"creator.commerce.shop-product-stripe-price-select","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Select or clear an already-known Stripe Price mapping for one existing shop product through a confirmed, audited write envelope.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed shop product Stripe Price selection wrapper."},{"href":"https://fanful.net/api/admin/stripe-catalog","method":"GET","auth":"artist-admin-or-approved-automation","description":"Authenticated Stripe catalog readiness and app-state mapping contract."}],"futureToolName":"fanful_creator_shop_product_stripe_price_select","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm shop product id, selected or cleared Stripe Price mapping, stale-state guard, amount/currency compatibility, one-time Price compatibility, idempotency key, audit correlation id, and rollback path."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, redacted shop product Stripe Price mapping summaries, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + shop-product-id + selected-stripe-price-id + observed updated_at"},"rateLimit":{"scope":"artist-admin-or-automation + shop-product-id","expectation":"Reject duplicate idempotency keys, stale product state, no-op selections, unknown Stripe Price ids, recurring Price references, and amount/currency mismatches before mutating."},"blockers":["Selected Stripe Price ids must already appear in Laurel app-state Stripe catalog references and match the shop product amount/currency."],"relatedIssues":["#612","#671","#799","#1052","#1681","#1684"],"modelVisibleBoundaries":["Do not expose raw Stripe secret keys, raw Stripe Price ids, raw Stripe Product ids, checkout sessions, payment intents, customer ids, buyer identifiers, private download URLs, or fulfillment internals.","Model-visible responses may show redacted Stripe Price ids only; use the authenticated admin catalog for raw ids.","This wrapper updates only store_items.stripe_price_id; it never changes product price, copy, inventory, fulfillment, checkout sessions, orders, refunds, or credits."]},{"id":"creator.commerce.shop-product-stripe-price-create","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Create one replacement immutable one-time Stripe Price for one existing shop product, then select it through a confirmed, audited write envelope.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed shop product Stripe Price creation wrapper."},{"href":"https://fanful.net/api/admin/stripe-catalog","method":"GET","auth":"artist-admin-or-approved-automation","description":"Authenticated Stripe catalog readiness and app-state mapping contract."}],"futureToolName":"fanful_creator_shop_product_stripe_price_create","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm shop product id, new amount/currency, existing product context, stale-state guard, idempotency key, audit correlation id, and rollback path before creating and selecting a replacement one-time Stripe Price."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, redacted shop product Stripe Price creation summaries, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + shop-product-id + new-amount + currency + observed updated_at"},"rateLimit":{"scope":"artist-admin-or-automation + shop-product-id","expectation":"Reject duplicate idempotency keys, stale product state, no-op prices, missing credentials, missing product context, recurring Price context, and cross-currency changes before mutating app state."},"blockers":["Requires server-side Stripe credentials and an existing one-time shop product Stripe Price mapping to supply the Stripe Product context."],"relatedIssues":["#612","#671","#799","#1052","#1681","#1684"],"modelVisibleBoundaries":["Do not expose raw Stripe secret keys, raw Stripe Price ids, raw Stripe Product ids, checkout sessions, payment intents, customer ids, buyer identifiers, private download URLs, or fulfillment internals.","Model-visible responses may show redacted Stripe Price and Product ids only; use the authenticated admin catalog for raw ids.","This wrapper updates only store_items.price_cents and store_items.stripe_price_id; product copy, inventory, fulfillment, raw URLs, checkout sessions, orders, refunds, and credits remain out of scope."]},{"id":"creator.commerce.stripe-price-select","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Select or clear an already-known Stripe Price mapping for one lesson/coaching offering through a confirmed, audited write envelope. Replacement Stripe Price creation uses a separate confirmed wrapper; broader product/tier metadata writes remain blocked.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed lesson Stripe Price selection wrapper for one lesson offering."},{"href":"https://fanful.net/api/admin/stripe-catalog","method":"GET","auth":"artist-admin-or-approved-automation","description":"Authenticated Stripe catalog readiness and app-state mapping contract."}],"futureToolName":"fanful_creator_lesson_stripe_price_select","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm offering id, selected or cleared Stripe Price mapping, stale-state guard, amount/currency compatibility, idempotency key, audit correlation id, and rollback path."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, redacted Stripe Price mapping summaries, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + lesson-offering-id + selected-stripe-price-id + observed updated_at"},"rateLimit":{"scope":"artist-admin-or-automation + lesson-offering-id","expectation":"Reject duplicate idempotency keys, stale offering state, no-op selections, and unknown Stripe Price ids before mutating."},"blockers":["Selected Stripe Price ids must already appear in Laurel app-state Stripe catalog references."],"relatedIssues":["#534","#799","#925","#926","#1052","#1053","#1057","#1083"],"modelVisibleBoundaries":["Do not expose raw Stripe secret keys, checkout sessions, payment intents, customer ids, subscriptions, student contact details, meeting URLs, or private booking notes.","Model-visible responses may show redacted Stripe Price ids only; use the authenticated admin catalog for raw ids."]},{"id":"creator.commerce.stripe-price-create","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Create one replacement immutable Stripe Price for one lesson/coaching offering, then select it through a confirmed, audited write envelope.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed lesson Stripe Price creation wrapper for one lesson offering."},{"href":"https://fanful.net/api/admin/stripe-catalog","method":"GET","auth":"artist-admin-or-approved-automation","description":"Authenticated Stripe catalog readiness and app-state mapping contract."}],"futureToolName":"fanful_creator_lesson_stripe_price_create","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm offering id, new amount/currency, existing product context, stale-state guard, idempotency key, audit correlation id, and rollback path before creating and selecting a replacement Stripe Price."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, redacted Stripe Price creation summaries, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + lesson-offering-id + new-amount + currency + observed updated_at"},"rateLimit":{"scope":"artist-admin-or-automation + lesson-offering-id","expectation":"Reject duplicate idempotency keys, stale offering state, no-op prices, missing credentials, missing product context, and cross-currency changes before mutating app state."},"blockers":["Requires server-side Stripe credentials and an existing lesson Stripe Price mapping to supply the Stripe Product context."],"relatedIssues":["#534","#799","#925","#926","#1052","#1053","#1057","#1083"],"modelVisibleBoundaries":["Do not expose raw Stripe secret keys, raw Stripe Price ids, raw Stripe Product ids, checkout sessions, payment intents, customer ids, subscriptions, student contact details, meeting URLs, or private booking notes.","Model-visible responses may show redacted Stripe Price and Product ids only; use the authenticated admin catalog for raw ids.","This wrapper updates only lesson_offerings.price_cents and lesson_offerings.stripe_price_id; shop products, tiers, entitlements, credits, bundles, cancellation, and refund policy remain out of scope."]},{"id":"creator.commerce.membership-stripe-price-select","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Select or clear an already-known Stripe Price mapping for one membership tier through a confirmed, audited write envelope.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed membership-tier Stripe Price selection wrapper."},{"href":"https://fanful.net/api/admin/stripe-catalog","method":"GET","auth":"artist-admin-or-approved-automation","description":"Authenticated Stripe catalog readiness and app-state mapping contract."}],"futureToolName":"fanful_creator_membership_stripe_price_select","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm membership tier id, selected or cleared Stripe Price mapping, stale-state guard, amount/currency compatibility, idempotency key, audit correlation id, and rollback path."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, redacted Stripe Price mapping summaries, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + membership-tier-id + selected-stripe-price-id + observed updated_at"},"rateLimit":{"scope":"artist-admin-or-automation + membership-tier-id","expectation":"Reject duplicate idempotency keys, stale tier state, no-op selections, and unknown Stripe Price ids before mutating."},"blockers":["Selected Stripe Price ids must already appear in Laurel app-state Stripe catalog references."],"relatedIssues":["#534","#925","#926","#1052","#1186"],"modelVisibleBoundaries":["Do not expose raw Stripe secret keys, raw Stripe Price ids, checkout sessions, payment intents, customer ids, subscriptions, or entitlement internals.","Model-visible responses may show redacted Stripe Price ids only; use the authenticated admin catalog for raw ids."]},{"id":"creator.commerce.membership-stripe-price-create","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Create one replacement immutable recurring Stripe Price for one membership tier, then select it through a confirmed, audited write envelope.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed membership-tier Stripe Price creation wrapper."},{"href":"https://fanful.net/api/admin/stripe-catalog","method":"GET","auth":"artist-admin-or-approved-automation","description":"Authenticated Stripe catalog readiness and app-state mapping contract."}],"futureToolName":"fanful_creator_membership_stripe_price_create","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm membership tier id, new monthly amount/currency, existing product context, stale-state guard, idempotency key, audit correlation id, and rollback path before creating and selecting a replacement recurring Stripe Price."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, redacted Stripe Price creation summaries, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + membership-tier-id + new-monthly-amount + currency + observed updated_at"},"rateLimit":{"scope":"artist-admin-or-automation + membership-tier-id","expectation":"Reject duplicate idempotency keys, stale tier state, no-op prices, missing credentials, missing product context, and cross-currency changes before mutating app state."},"blockers":["Requires server-side Stripe credentials and an existing membership Stripe Price mapping to supply the Stripe Product context."],"relatedIssues":["#534","#925","#926","#1052","#1186"],"modelVisibleBoundaries":["Do not expose raw Stripe secret keys, raw Stripe Price ids, raw Stripe Product ids, checkout sessions, payment intents, customer ids, subscriptions, or entitlement internals.","Model-visible responses may show redacted Stripe Price and Product ids only; use the authenticated admin catalog for raw ids.","This wrapper updates only membership_tiers.monthly_amount_cents and membership_tiers.stripe_price_id; tier lifecycle, entitlement metadata, checkout policy, cancellation, and refunds remain out of scope."]},{"id":"creator.commerce.membership-tier-create","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Create one inactive membership tier with public profile, monthly amount, sort order, and benefits through a confirmed, audited write envelope.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed inactive membership-tier creation wrapper."}],"futureToolName":"fanful_creator_membership_tier_create","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm new tier id, profile fields, monthly amount/currency, inactive initial state, ordered benefits, observed catalog tier ids, idempotency key, audit correlation id, and rollback path."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, redacted tier profile and benefit summary, observed catalog ids, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + membership-tier-id + observed catalog tier ids + profile-benefits"},"rateLimit":{"scope":"artist-admin-or-automation + membership-tier-id","expectation":"Reject duplicate idempotency keys, duplicate tier ids, stale catalog reads, duplicate benefits, non-USD currency, and active-at-create requests before mutating."},"blockers":[],"relatedIssues":["#534","#1052","#1260","#1371","#1386"],"modelVisibleBoundaries":["Do not expose raw Stripe secret keys, raw Stripe Price ids, checkout sessions, payment intents, customer ids, subscriptions, listener membership ids, or payment identifiers.","This wrapper inserts membership_tiers and membership_tier_benefits only; new tiers start inactive until Stripe Price mapping and restore are confirmed separately.","This wrapper never creates Stripe Prices, selects stripe_price_id, grants memberships, changes checkout policy, or writes protected-surface entitlement metadata."]},{"id":"creator.commerce.membership-tier-update","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Update one membership tier's public profile and benefit copy through a confirmed, audited write envelope.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed membership-tier profile and benefit copy write."}],"futureToolName":"fanful_creator_membership_tier_update","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm membership tier id, profile fields, ordered benefits, stale-state guard, idempotency key, audit correlation id, and rollback path."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, redacted tier profile and benefit summaries, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + membership-tier-id + profile-benefits + observed updated_at"},"rateLimit":{"scope":"artist-admin-or-automation + membership-tier-id","expectation":"Reject duplicate idempotency keys, stale tier state, duplicate benefits, and no-op updates before mutating."},"blockers":[],"relatedIssues":["#534","#1052","#1260","#1371"],"modelVisibleBoundaries":["Do not expose raw Stripe secret keys, raw Stripe Price ids, checkout sessions, payment intents, customer ids, subscriptions, listener membership ids, or payment identifiers.","This wrapper updates only membership_tiers.name, membership_tiers.description, membership_tiers.sort_order, and membership_tier_benefits.","This wrapper never creates tiers, changes monthly_amount_cents, changes stripe_price_id, or writes protected-surface entitlement metadata."]},{"id":"creator.commerce.membership-tier-archive-state","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Archive or restore one membership tier through a confirmed, audited write envelope while preserving existing memberships.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed membership-tier archive/restore active-state write."}],"futureToolName":"fanful_creator_membership_tier_archive_state","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm membership tier id, requested active state, stale-state guard, idempotency key, audit correlation id, active member impact, and rollback path."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, redacted tier active-state summaries, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + membership-tier-id + archive-state + observed updated_at"},"rateLimit":{"scope":"artist-admin-or-automation + membership-tier-id","expectation":"Reject duplicate idempotency keys, stale tier state, no-op archive/restore requests, and archiving the last active public tier before mutating."},"blockers":[],"relatedIssues":["#534","#1052","#1260","#1371"],"modelVisibleBoundaries":["Do not expose raw Stripe secret keys, raw Stripe Price ids, checkout sessions, payment intents, customer ids, subscriptions, listener membership ids, or payment identifiers.","This wrapper updates only membership_tiers.active; existing membership entitlement history is preserved.","This wrapper never cancels subscriptions, refunds payments, creates tiers, changes prices, changes stripe_price_id, or writes protected-surface entitlement metadata."]},{"id":"creator.commerce.entitlement-metadata-update","domain":"commerce","audiences":["creator","operator"],"status":"ready","summary":"Update one protected community channel's membership-tier access metadata through a confirmed, audited write envelope.","existingEndpoints":[{"href":"https://fanful.net/api/agent/creator-commerce","method":"GET","auth":"guest","description":"Agent-safe creator commerce manifest."},{"href":"https://fanful.net/api/agent/creator-commerce","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed protected-surface entitlement metadata write."},{"href":"https://fanful.net/api/agent/community-chat","method":"GET","auth":"guest","description":"Agent-safe community channel access metadata read."}],"futureToolName":"fanful_creator_entitlement_metadata_update","confirmation":{"required":true,"kind":"creator-commerce","prompt":"Confirm community channel id, membership access mode, tier ids, stale-state guard, idempotency key, audit correlation id, and affected fan surfaces before changing protected-surface metadata."},"audit":{"required":true,"currentRecord":"creator_commerce_agent_actions + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute writes to the artist admin or approved automation identity, including agent client, before/after channel access summaries, idempotency key, and operator reason."},"idempotency":{"requiredForWrites":true,"keyScope":"artist-id + community-channel-id + access metadata + observed updated_at"},"rateLimit":{"scope":"artist-admin-or-automation + community-channel-id","expectation":"Reject duplicate idempotency keys, stale channel state, default #general changes, no-op access metadata, and unsupported entitlement-group writes before mutating."},"blockers":["This executable slice is limited to community channel tier-access metadata; lesson credits, paid rooms, entitlement groups, membership revocation, and active checkout readiness for newly created tiers remain separate blockers."],"relatedIssues":["#534","#560","#851","#1371","#1386"],"modelVisibleBoundaries":["Do not expose listener membership ids, payment identifiers, Stripe ids, private member directories, hidden messages, or notification recipient lists.","This wrapper updates only community_chat_channels.access_mode, access_tier_ids_json, and access_entitlement_group_ids_json.","This wrapper never creates tiers, changes prices, grants lesson credits, changes paid-room access, resolves entitlement groups, revokes memberships, or edits chat messages."]}],"nextBuildOrder":[{"issue":"#810","task":"Use the scoped delegated-grant model as the canonical private-agent auth contract."},{"issue":"#811","task":"Shipped: store and revoke scoped agent grants before private MCP/ChatGPT reads depend on them."},{"issue":"#812","task":"Shipped: resolve scoped principals in /mcp and /api/agent/*."},{"issue":"#818","task":"Shipped: approve scoped grants and exchange one-time codes for bearer tokens."},{"issue":"#819","task":"Shipped: let users inspect and revoke scoped agent grants from account settings."},{"issue":"#608","task":"Keep this manifest as the canonical cross-surface contract list and wire MCP/CLI clients to it."},{"issue":"#786","task":"Use the shared validation endpoint before any MCP, CLI, or ChatGPT mutating tool executes."},{"issue":"#757","task":"Shipped: atomic live-event audit writes keep status changes and audit rows together."},{"issue":"#800","task":"Shipped: use the non-mutating live status preview before confirmed writes."},{"issue":"#920","task":"Shipped: execute confirmed live status writes through the shared write envelope with stale-state, idempotency, and audit correlation."},{"issue":"#998","task":"Shipped: execute confirmed existing-event live schedule writes through the shared write envelope with stale-state, idempotency, and audit correlation."},{"issue":"#1012","task":"Shipped: execute confirmed new live-event creation through the shared write envelope with idempotency, blocker checks, and audit correlation."},{"issue":"#612","task":"Define checkout/link-cli purchase support using the confirmed-listener envelope."},{"issue":"#986","task":"Expose support-only listener checkout starts with persisted intents, idempotency, audit attribution, and redacted responses."},{"issue":"#611","task":"Build the CLI on these same MCP resources and tools instead of adding a separate contract."}]}