Propose edits for a person to review and approve in the Plotline dashboard. NOTHING is changed until someone approves it there. Supported today: AI Director objectives (decisioningObjectives): create, edit setup (Strategy brief = `statement`, Guardrails = `strategy`, goal events, audience, holdout/rollout), delete, and add/rename/move/remove topics and subtopics; and a subtopic's SMS, email or push copy (aiDirectorContent): add, edit or remove variants, or create the content for a subtopic that has none. Push variants have title, body and optional Android subtitle (plain text; image and deeplink are kept; a new push variant may copyFromSlot to reuse a sibling's image and deeplink). Email variants have subject, preheader and the text of the layout's blocks (read them with read_object on aiDirectorContent); addBlocks adds a block copied from an existing one; a new email variant needs copyFromSlot or templateId. New copy is saved as Draft unless the reviewer also approves it for sending; approved email is re-rendered after approval. And AI Director signals (decisioningSignals): create, edit (name, question, answer type, options, audience, evaluation windows, attribute key, default value, schedule) and delete; publishing and pausing stay in the dashboard. And SQL segments (cohorts): create, edit (name, description, sqlDefinition.query, sqlDefinition.description) and delete a segment whose members are a ClickHouse SELECT returning UserRefID. Test the SQL with analytics_query first and write sqlDefinition.description in plain words; read plotline://knowledge/recipes/sql-segment. Filter segments made in the dashboard can't be changed here. And standalone mobile push campaigns (outsideAppCampaigns, type PUSH): create a draft from a template, edit content (including the rich layout: text, images, buttons and links, carousels, countdown timers; read plotline://knowledge/recipes/push-layout), audience, trigger, schedule, frequency and goals, and delete; live campaigns keep their audience, trigger and schedule (goals stay editable); publishing, pausing and sending stay in the dashboard (read plotline://knowledge/recipes/push-campaign first). And standalone email campaigns (outsideAppCampaigns, type EMAIL): create a draft (sender, subject, preview text, subscription topic, a template's body via templateId), edit any of those and the body, a BeeFree page started from a template or written from scratch (read plotline://knowledge/recipes/email-body; there is no HTML input), audience, trigger, schedule, frequency and goals, and delete; live emails keep their body, audience, trigger and schedule; publishing, test sends and sending stay in the dashboard (read plotline://knowledge/recipes/email-campaign first). And standalone SMS campaigns (outsideAppCampaigns, type SMS): create a draft, edit the provider (an smsProviders _id) and message text (checked for length in SMS parts), audience, trigger, schedule, frequency and goals, and delete (read plotline://knowledge/recipes/sms-campaign first). And standalone web push campaigns (outsideAppCampaigns, type WEB_PUSH): create a draft, edit title, body, https click link, icon, image, up to 2 buttons and ttl, audience, trigger, schedule, frequency and goals, and delete (read plotline://knowledge/recipes/web-push-campaign first). And standalone RCS campaigns (outsideAppCampaigns, type RCS): create a draft from an rcsTemplates templateId or from scratch (messageType text, image, video, card or carousel, with content, suggestions and options, including an SMS fallback), edit the provider (an rcsProviders _id), audience, trigger, schedule, frequency and goals, and delete (read plotline://knowledge/recipes/rcs-campaign first). Live SMS, web push and RCS keep their audience, trigger, schedule and goals; publishing, test sends and sending stay in the dashboard. And in-app campaigns and widgets (flows + steps): insert each step (stepType MODAL, BOTTOMSHEET, TOOLTIP, SPOTLIGHT, FULLPAGECONTENT, FULLPAGEMODAL, PIPVIDEO, FLOATER, BANNER, or WIDGET for a widget; a layout tree of containers, text, buttons, images, video, Lottie, carousels, grids and custom HTML, or a templateId; placement on a pages screen and element; triggerEvents) with a ref and the flow that lists it (steps: ["$ref:<ref>"], isWidget true for a widget) in the same proposal; edit a step's layout, placement, trigger and behaviour; add, remove or reorder steps through the flow's steps; edit the flow's audience, schedule, frequency and goals; and delete. Live campaigns can be edited (it reports LIVE_EDIT and needs publish permission). Publishing, pausing, test users, real-time filters and A/B tests stay in the dashboard (read plotline://knowledge/recipes/inapp-campaign or plotline://knowledge/recipes/widget, and plotline://knowledge/recipes/inapp-layout, first). And stories (stories + slides): insert each slide (slideType IMAGE, VIDEO or LOTTIE with an https backgroundUrl, optional overlay layout) with a ref and the story that lists it (slides: ["$ref:<ref>"]), placed on a story strip element (page + clientElementId); edit, reorder or remove slides through the story; edit the story's label, thumbnail, audience, schedule and goals; and delete (read plotline://knowledge/recipes/story first). And surveys (studies): create a survey with its questions (TEXT, MCQ_SINGLE_CHOICE, MCQ_MULTIPLE_CHOICE, SCALE_NPS, SMILEY_RATING, PROMPT), answer rules and thank-you screen, edit them, the trigger events, audience, schedule, response limits and goals, and delete (read plotline://knowledge/recipes/survey first). And gamification (needs the gamification capability): rewards and coupons (rewards; read plotline://knowledge/recipes/reward); luck games, a flows document with isGamification true and a game object holding the template, theme, trigger, reward slots with probabilities and copy, for scratch card, spin the wheel, slot machine, gift or card reveal, video reveal and direct reward (read plotline://knowledge/recipes/luck-game); quizzes and skill games (studies; read plotline://knowledge/recipes/quiz); streaks and milestones (flows with campaignType STREAK or MILESTONE; read plotline://knowledge/recipes/streak or plotline://knowledge/recipes/milestone); and the rewards page (rewardsPage; read plotline://knowledge/recipes/rewards-page). A game gives only ACTIVE rewards, so propose the rewards first when they do not exist. Publishing and pausing stay in the dashboard. And journeys (journeys): create a draft journey graph (ENTRY, waits, conditions, action branches, splits, attribute, segment and track-event nodes, EXIT) whose message nodes are in-app overlay steps or push, email, SMS, web push or RCS campaigns inserted in the same proposal, each node's _id being its child's ref; edit nodes, edges, entry trigger, audience, schedule, re-entry and goals; edit a message's content through its step or campaign; remove a node (its child is deleted); delete a draft or stopped journey. WhatsApp, webhook, voice, widget and game nodes, publishing and test users stay in the dashboard (read plotline://knowledge/recipes/journey first). Before the first call, read plotline://knowledge/recipes/propose-changes with get_plotline_knowledge; read current documents with read_object so patches target real ids. Send one user intent per proposal (many changes are fine). Use dryRun:true to check without saving. Returns {status, changeSetId?, reviewUrl?, previewUrl?, previewExpiresAt?, summary, issues[]}: status INVALID means nothing was saved; fix each error (it has path and hint) and call again. previewUrl (saved proposals and dry runs) is a read-only page, valid 10 minutes, showing only the rendered preview (add ?view=both for before/after): if you have a browser, open it, wait for [data-preview-ready="true"], check the result, and show the user a screenshot. If you can view the preview, you MUST do so before telling the user the proposal is ready: compare it with what the user asked for (content, layout, images, buttons, each step) and, if it does not match, fix the proposal and call again with supersedes instead of handing it over. Always share previewUrl with the user as a link (valid 10 minutes). When saved, also share the reviewUrl and say it is waiting for their approval. To revise a pending proposal, pass supersedes=<changeSetId>.