← ChatCutCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to ChatCut
Snapshot Sep 30, 2026 · 23:14 UTC · version 1.10.14
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "widget-forms",
"description": "Ask for structured ChatCut input using the current plugin host's supported form surface.",
"included_files": [],
"skill_md_contents": "---\nname: widget-forms\ndescription: Ask for structured ChatCut input using the current plugin host's supported form surface.\n---\n\n# Widget Forms Host Adapter\n\nThe canonical agent's raw `<widget>`, `<choices/>`, and `<visual-option>` tags render only inside ChatCut. Never emit those tags from the published Codex or Claude Code plugin.\n\n## Semantic contract mapping\n\nThis adapter owns how plugin hosts implement a caller's host-neutral form\ncontract. It does not decide which fields the workflow requires.\n\nMap semantic field types as follows:\n\n- `short_text`: one text input.\n- `explicit_consent`: one explicit, initially unselected confirmation control\n using the caller's full localized copy. An attachment or another submitted\n field is never consent.\n- `audio_reference`: plugin forms cannot record or upload media. Render the\n other fields, ask the user to attach the audio to the conversation, then load\n `asset-import`. Return the imported ChatCut audio `assetId` to the calling\n workflow; never return a local path, attachment URL, or raw bytes as an asset\n id.\n- `playable_single_choice`: one choice surface with stable option values,\n localized labels, and playable media when the host supports it. Keep the\n value-to-label map in context when a host returns the visible label.\n- `playable_preview`: one display-only, non-submitting audio surface using the\n exact caller-provided runtime media URL. Use only a host-supported safe media\n renderer; never emit raw `<audio>` HTML or expose the URL as ordinary prose.\n\n## Codex\n\nCall the ChatCut MCP tool `ask_followup_questions`. Put related fields into one form, write visible text in the user's language, and stop after the call until the submitted answer appears in chat. Use the current tool schema for field and option shapes.\n\nMap `playable_single_choice` to one `single` field with `variant:\"voice\"`.\nUse each stable value as the option id and keep its localized label,\ndescription, and `audioUrl` tied to the same caller-provided item. An action\nwithout playable media has no `audioUrl`.\n\nMap an MG reference style choice to one `single` field with `variant:\"visual\"`.\nUse the reference ID as the option id, its short title as the label, and the\nselected detail's `heroPreview.url` as `preview`. Include one `__other__` option\nlabeled \"Other\" in the user's language; the tool supplies its text input. That branch accepts\neither a new preference or a request for another batch; do not add a separate\nShow more option. Return the selected reference ID to the MG skill; it owns\napplication. Do not bind `apply_preset` directly to a reference ID.\n\nExample field, replacing the reference placeholders with the fetched shortlist\nand localizing the labels:\n\n```json\n{\n \"id\": \"mg_style\",\n \"label\": \"Choose a Motion Graphics style\",\n \"type\": \"single\",\n \"variant\": \"visual\",\n \"options\": [\n { \"id\": \"REFERENCE_ID\", \"label\": \"TITLE\", \"preview\": \"HERO_PREVIEW_URL\" },\n { \"id\": \"__other__\", \"label\": \"Other\" }\n ]\n}\n```\n\nThe Other answer returns to discovery, without applying a style or\nstarting production. Keep the image-option IDs unchanged in the next step.\n\nMap an AI-avatar identity choice to one `single` field with `variant:\"visual\"`.\nUse the live `identityId` as the option id, the returned `name` as its label,\n`previewVideoUrl` as `previewVideo`, and `previewImageUrl` as `preview`. The\nimage remains the poster and automatic fallback if video loading fails. Keep\n`create_avatar` as a label-only option. Selecting it returns that value to the\nworkflow; it does not open ChatCut's native avatar dialog, so request the source\nattachment separately and use `asset-import`.\n\nDo not call `ask_followup_questions` solely to display a `playable_preview`,\nbecause a passive preview is not a question. Use Codex's supported audio\nattachment/media rendering when available. If this host session has no safe\nruntime-URL audio renderer, say that the preview is available in the ChatCut\nproject assets and continue with the caller's separate branch decision; do not\nprint HTML, a bare URL, or a fake widget tag.\n\nMap `explicit_consent` to a single-select field containing only one confirmation\noption. Use the caller's full confirmation copy as its label and do not\npreselect it. Mark every blocking field as required and verify every required\nanswer after submission before continuing.\n\n## Claude Code\n\nFollow the structured-input recipe in `chatcut-plugin-basics-claude`: use one `visualize.show_widget` Elicitation form, submit only through `.elicit-submit`, and wait for the user to send the filled prompt. Never call ChatCut's `ask_followup_questions` in Claude Code because that host does not render its MCP-App result.\n\nMap `explicit_consent` to an unchecked checkbox using the caller's complete\nlocalized copy. Do not add a file chooser for `audio_reference`; request the\nconversation attachment outside the form and load `asset-import` after the\nuser sends it.\n\nFor `playable_single_choice`, resolve bundled media keys through\n`${CLAUDE_PLUGIN_ROOT}/assets/widget-media/manifest.json`; use a label-only card\nwhen a key is absent and never embed or process the original source URL. Keep\nthe stable value in the label-to-id map rather than exposing it as the DOM audio\nkey. Runtime media URLs are not in the bundled manifest: do not embed them in\nElicitation HTML. Present them through the host's normal safe link/audio\nsurface, then use a label-only confirmation control.\n\nAI-avatar previews are runtime catalog media and are not bundled in the plugin\nmanifest. Keep each authoritative `identityId` mapped to its returned `name`,\nuse label-only selectable cards in Elicitation, and tell the user that live\nvideo previews are available in ChatCut's AI Avatars library. Never embed or\nprint the provider preview URL. A `create_avatar` selection returns to the\nworkflow and then follows the normal conversation-attachment plus\n`asset-import` path.\n\nFor MG reference choices, look up the exact reference ID in the same manifest\n(`entries[referenceId]`, for example a `mg-reference:style:…` key). An image entry\nprovides `path`; resolve it against the manifest's immutable `baseUrl` and show\nthat image beside its short title in the Elicitation form. Keep reference IDs\nmapped to the displayed labels. Do not substitute a similarly named preset.\n\nThe manifest may not include newly added references yet. For missing entries,\nuse label-only choices and say their image previews are available in ChatCut;\ndo not invent CDN paths, download or republish media during the conversation,\nor embed the runtime S3 URL. Include a single label-only Other choice with a\ntext input. A preference or request for another batch returns to discovery,\nnot style application.\n"
}SHA-256: c8f3a83258a9fcf319325e9a55a7206f4b91f34a4e011133555733f22ea48df0