From ff0503c6b73423b6309a7f12de69e457188a196e Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Fri, 2 Oct 2026 16:31:34 -0700 Subject: [PATCH 01/18] feat: prepare Sonilo plugin v1.1.0 workflows and balance guidance --- .gitignore | 1 + README.md | 56 +++++- docs/IMPLEMENTATION_1.1.0.md | 64 ++++++ docs/RELEASE_PLAN_1.1.0.md | 33 ++++ docs/REVISION_1.1.0_NOTES.md | 38 ++++ plugins/sonilo/.codex-plugin/plugin.json | 24 ++- .../sonilo/skills/sonilo-workflows/SKILL.md | 186 ++++++++++++------ .../sonilo-workflows/agents/openai.yaml | 6 +- .../references/account-and-links.md | 108 ++++++++++ .../sonilo-workflows/references/dubbing.md | 62 ++++++ .../sonilo-workflows/references/examples.md | 44 +++++ scripts/check_release.py | 51 ++++- 12 files changed, 591 insertions(+), 82 deletions(-) create mode 100644 docs/IMPLEMENTATION_1.1.0.md create mode 100644 docs/RELEASE_PLAN_1.1.0.md create mode 100644 docs/REVISION_1.1.0_NOTES.md create mode 100644 plugins/sonilo/skills/sonilo-workflows/references/account-and-links.md create mode 100644 plugins/sonilo/skills/sonilo-workflows/references/dubbing.md create mode 100644 plugins/sonilo/skills/sonilo-workflows/references/examples.md diff --git a/.gitignore b/.gitignore index 2348c91..9837043 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store __pycache__/ *.pyc +dist/ diff --git a/README.md b/README.md index 873168b..07961ec 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ # Sonilo for Codex -Generate commercially licensed music, sound effects, and newly mixed videos +Generate commercially licensed music, sound effects, newly mixed videos, +translated subtitles, and dubbed videos from text or video, directly in Codex — powered by Sonilo's hosted generation service. > Status: published. Sonilo 1.0.0 is available in the public > [Plugins Directory](https://chatgpt.com/plugins/plugin_asdk_app_6a56e50ff2788191a96c7c8cd84bb6c2). +> This repository prepares version **1.1.0**; changing this package does not +> publish a new directory release or deploy the hosted MCP service. ## Requirements @@ -50,23 +53,62 @@ user; the plugin itself ships no key, secret, or token. Run - Generate sound effects from text or a public HTTPS video URL - Return a new video with generated music while optionally preserving speech - Return a new video with generated sound effects mixed in +- Generate music and sound effects together in one soundtrack or new video +- Generate multiple music versions and separate instrument stems +- Place sound effects at specified times - Duck music under voice audio -- Inspect Sonilo Platform account services and usage +- Review translated subtitles before dubbing into the requested languages +- Use an eligible account's 15-second dubbing preview, then request a full video +- Inspect current USD cash balance, account services, trial allowance, and historical usage +- Retrieve an existing generation after waiting or a timeout without resubmission -See the [Sonilo MCP server](https://github.com/sonilo-ai/sonilo-mcp) for tool -details and limits. +Features depend on the connected hosted tool schemas and account access. The +[Sonilo MCP repository](https://github.com/sonilo-ai/sonilo-mcp) is a useful +feature reference, but its local-file and playback tools are not bundled here. ### Example prompts - "Create 30 seconds of upbeat lo-fi music for a product demo." - "Create a cinematic 3-second whoosh sound effect." - "Add cinematic music to this public HTTPS video and return a new video while preserving speech: ``" +- "Give me three music choices for this 30-second café ad: ``" +- "Generate 30 seconds of jazz with separate drums and bass tracks." +- "Translate this video into English subtitles first. I will correct the product names before dubbing: ``" +- "Let me try English dubbing for free: ``" +- "What is my cash balance, and how many free text-to-music runs remain?" + +Use real public HTTPS media URLs in place of the labels above. A local file +or attachment is not a hosted media URL. The plugin returns actual result +links for previews, subtitles, videos, variants, and stems. + +### Account status and continuation + +The plugin reads the current USD cash balance and service-specific trial +allowance from `get_account_services`. Historical spending comes from +`get_usage` and is not used as a balance. A missing balance is reported as +unavailable; zero cash alone does not rule out trials or invoiced billing. +The balance is a query-time snapshot, not a guarantee that the next generation +can run. Credit errors are explained without purchase links, and generation +is not retried automatically. + +After a preview or confirmed credit rejection, ask to continue with the same +video. The plugin checks current services and retrieves any existing task +before submitting new work. A full video after a preview is a new generation +of the original source, not a free extension of the preview task. + +Credit rejections now include the published +[Balance and free trials](https://platform.sonilo.com/usage-and-entitlements) +guide in the user's language (10 supported languages; English fallback). +The plugin explains the error and keeps known inputs for a user-requested +continuation. See the [1.1.0 implementation notes](docs/IMPLEMENTATION_1.1.0.md) +for service dependencies and the guide's pending directory-review assessment. ## Billing -Generation tools (`text_to_music`, `text_to_sfx`, `video_to_music`, -`video_to_sfx`, `video_to_video_music`, `video_to_video_sfx`, `audio_ducking`) -are **paid** and run against your Sonilo Platform account. Account and usage +Generation, transcription, dubbing, and video-analysis tools can consume +existing account credits. Available free runs depend on the service and +account; dubbing previews require one target language and no supplied script. +Multiple music variants and multi-language dubbing can cost more. Account and usage tools (`get_account_services`, `get_usage`, `get_generation_task`) are read-only and never incur a charge. Paid tools run only after you explicitly ask for them. diff --git a/docs/IMPLEMENTATION_1.1.0.md b/docs/IMPLEMENTATION_1.1.0.md new file mode 100644 index 0000000..ca83617 --- /dev/null +++ b/docs/IMPLEMENTATION_1.1.0.md @@ -0,0 +1,64 @@ +# Sonilo 1.1.0 implementation + +Scope: the 13 features in the [manager plan](https://docs.google.com/document/d/1woqbRgMlCemdw46mpP6Wz1uDkVUK9_C4QyPi2cX2y0s/edit). +This package updates the hosted-MCP workflow instructions and listing metadata; +it does not deploy the server, publish the plugin, or change account entitlements. + +| Plan item | Package behavior | +| --- | --- | +| Subtitle review before dubbing | Route to `proofread`, wait for approval, then use approved target-language subtitle URLs. Requires the service to be enabled. | +| Music and effects together | Use one combined tool, selecting audio or new-video output to match the request. | +| Free dubbing preview | Check trial eligibility, require one explicit target language and no scripts, label the actual preview metadata. | +| Full video after preview | Require the user's full-version request; submit the original source once as a new task, without claiming only the remainder is billed. | +| Balance and trial lookup | Read current `cash_balance` and `currency` from `get_account_services`, alongside actual service trial counts. Preserve USD sub-cent precision; missing values remain unknown. Usage history is separate. | +| Insufficient-credit feedback | Explain the actual error, avoid repeated submissions, and report charging/refunds only when established. Link to the deployed Balance and free trials guide in the conversation language; no automatic retry or direct purchase link. | +| Continue after account update | Refresh services, retain known inputs, and retrieve existing work before any authorized resubmission. | +| Usage examples | Bundle concrete prompts and response patterns; link the public MCP guide for product-help requests. | +| Generation status | Poll the original task; preserve its ID after interruptions and avoid unsupported background-monitoring promises. | +| Multiple variants | Use one supported `variants_num` request and label each returned variant. Do not use a free-only request to authorize paid variants. | +| Audible narration | Use supported speech preservation and ducking parameters; remove obsolete `isolate_vocals` guidance. | +| Timed effects | Follow the hosted JSON-string segment schema, including contiguous quiet gaps. | +| Instrument stems | Request stems of generated music, return actual stem URLs, and handle partial separation failures without regenerating. | + +## Backend integration + +[Backend PR #384](https://github.com/sonilo-ai/sonilo-api-dashboard/pull/384) +was merged and [deployed to production](https://github.com/sonilo-ai/sonilo-api-dashboard/actions/runs/36210070550) +on 2026-09-26 UTC. The hosted account tool now returns `cash_balance` (decimal +string) and `currency` (`USD`); it does not expose `billing_mode`. No new plugin +endpoint, OAuth scope, or client library is needed. + +The manager plan's dollar-balance example is supported using actual returned +data. Its continuation examples are intent illustrations: the plugin reports +current balance, but never promises sufficient funds from a snapshot alone. +“No charge” and “trial exhausted” wording requires evidence in the response. + +## Published help page and review status + +The [Balance and free trials guide](https://platform.sonilo.com/usage-and-entitlements) +was deployed on 2026-10-02 after dashboard PRs #391 and #392, in +[production run 37076829530](https://github.com/sonilo-ai/sonilo-api-dashboard/actions/runs/37076829530). +The skill links its 10 language routes for confirmed credit rejections and +balance/trial help. It preserves the original request for user-requested continuation. + +The page deliberately retains the public site's shared navigation and the +**View pricing / View billing** buttons requested for review. The plugin reply +links to the explanation and does not tell users to click through to purchase. +This is a review candidate, not an assertion that OpenAI has approved the flow. +The commerce rules prohibit direct or indirect digital-service sales; acceptance +of this page with its onward buttons remains unconfirmed. Do not hide those +buttons or describe the page as having no purchase-related links in review materials. + +Hosted availability still depends on the connected account. In particular, +`proofread` is feature-gated. Check connected schemas and `available_services` +at runtime; this package does not change backend flags. + +## Verification scope + +- Package structure, assets, reference links, manifest, and skill validation. +- Documented tool names and parameter types compared with the hosted MCP source. +- Read-only production endpoint and OAuth discovery checks via `check_release.py --live`. +- No paid generation, authenticated end-to-end media run, server deployment, + directory submission, or installed-plugin replacement is performed by these checks. + +Reference: [OpenAI commerce and monetization](https://developers.openai.com/plugins/plugin-guidelines#commerce-and-monetization). diff --git a/docs/RELEASE_PLAN_1.1.0.md b/docs/RELEASE_PLAN_1.1.0.md new file mode 100644 index 0000000..57c93c3 --- /dev/null +++ b/docs/RELEASE_PLAN_1.1.0.md @@ -0,0 +1,33 @@ +# Sonilo 1.1.0:插件升级计划 + +来源:[在线审阅稿](https://docs.google.com/document/d/1woqbRgMlCemdw46mpP6Wz1uDkVUK9_C4QyPi2cX2y0s/edit)。下表为产品计划;实现状态见 [1.1.0 实现说明](IMPLEMENTATION_1.1.0.md)。 + +蓝色下划线表示链接位置。视频和修改后的字幕链接由用户提供;试听、下载链接由生成结果返回。 + +已有网页可点击;【】内为示意,不可点击。余额、资格和结果均为示例。 + +| 插件里加什么 | 用户说 | 插件回复示例 | +| --- | --- | --- | +| 字幕校对+配音 | 把这段 1 分钟的产品介绍【视频链接】翻成英文。先给我字幕,产品名改好后再配音。 | 这是【英文字幕文件】。你改好产品名并发回【修改后的字幕链接】,确认后我再按这份字幕配音。 | +| 音乐+音效 | 给这条 20 秒的海边视频【视频链接】加轻松的音乐和海浪声,直接给我成片。 | 已加好背景音乐和海浪音效。这是【处理后的 20 秒视频】,可以预览或下载。 | +| 配音免费预览 | 把这条 1 分钟的中文视频【视频链接】配成英文,我想先免费试听。 | 你的账户还有 1 次免费预览。这是【前 15 秒的英文配音视频】;剩余 45 秒尚未处理。 | +| 预览后继续做完整版 | 这 15 秒的英文配音不错,帮我把整条 1 分钟视频都做完。 | 我先刷新账户状态,再用刚才的视频和英文设置生成完整版。最终能否生成由服务检查。 | +| 查询余额 | 我还剩多少钱?音乐还能免费生成几次? | 当前余额 $2;文字生成音乐的免费试用还剩 1 次。 | +| 额度不足提示 | 再帮我生成一段 30 秒的轻快背景音乐。 | 余额不足,这次没有开始生成。当前余额 USD 0。可查看[余额与免费试用](https://platform.sonilo.com/zh/usage-and-entitlements)了解规则。账户更新后,说“继续刚才的音乐”。 | +| 额度更新后接着完成 | 我的账户额度已经更新了,继续刚才那条英文配音视频。 | 当前余额 USD 5。我会先检查原任务,再用刚才的视频和英文设置继续;服务会检查可用额度。 | +| 使用示例 | 我第一次用 Sonilo,想给咖啡店宣传片加音乐,应该怎么说? | 发来【视频链接】,然后说:“给这条 30 秒的咖啡店宣传片加温暖、轻松的爵士背景音乐。”也可查看「[更多使用示例](https://platform.sonilo.com/mcp)」。 | +| 生成状态 | 刚才那条 1 分钟的英文配音视频做好了吗? | 这条英文配音视频还在处理中。我会查询原任务的进度,不会重新生成或重复扣费。 | +| 一次生成多个版本 | 给这条 30 秒的咖啡店宣传片【视频链接】配音乐,生成 3 个版本让我选。 | 已生成 3 个版本,每个都是 30 秒:【版本 1 试听】【版本 2 试听】【版本 3 试听】。 | +| 配乐不盖住人声 | 这是我的旅行解说视频【视频链接】。加轻快的背景音乐,但要听清我说话。 | 已加好背景音乐。你说话时音乐会变小,停顿时恢复。这是【处理后的视频】。 | +| 指定位置加音效 | 这段视频【视频链接】第 2–3 秒是关门,第 5–7 秒在下雨,给这两处加音效。 | 已在第 2–3 秒添加关门声,第 5–7 秒添加雨声。这是【处理后的视频】。 | +| 生成音乐并提供分轨 | 生成一段 30 秒的爵士乐。鼓和贝斯也单独给我,方便剪辑。 | 已生成,可以下载:【完整音乐】【鼓音轨】【贝斯音轨】【其他音轨】。 | + +「余额与免费试用」页面已上线,包含 View pricing / View billing 按钮;此路径仍待 OpenAI 审核,不能保证通过。余额和“未开始生成”仅在实际返回数据支持时显示。试听、字幕和视频下载链接由每次生成结果返回。 + +OpenAI 官方参考 + +[插件商业化规则(Commerce and monetization)](https://developers.openai.com/plugins/plugin-guidelines#commerce-and-monetization) + +允许:说明额度不足、链接到权益说明页,以及使用账户已有的付费权益。 + +不允许:推销数字服务或充值,链接到发起购买、订阅或升级的页面。 diff --git a/docs/REVISION_1.1.0_NOTES.md b/docs/REVISION_1.1.0_NOTES.md new file mode 100644 index 0000000..8bc8750 --- /dev/null +++ b/docs/REVISION_1.1.0_NOTES.md @@ -0,0 +1,38 @@ +# Revision 1.1.0 draft notes + +## Release notes + +Update the bundled Sonilo workflow skill and directory description to cover subtitle review before dubbing, eligible single-language dubbing previews, user-requested full-video continuation, combined music and sound effects, music variants and stems, timed effects, speech preservation, and task retrieval after interruptions. + +Account status now reports the authenticated account's current USD cash balance and service-specific free-trial allowance. Historical spending is kept separate from balance. Missing balance data is reported as unavailable, and a balance snapshot is not treated as a guarantee that a generation can run. + +Credit errors do not trigger automatic resubmission. The skill does not direct users to pricing, checkout, subscriptions, or credit recharge, and suppresses purchase instructions returned by tools. Confirmed credit rejections now include the published Balance and free trials guide in the conversation language. Ten language routes are configured, with English as fallback. The guide retains public navigation and View pricing / View billing buttons; their acceptance in this flow is not yet confirmed by OpenAI review. + +The MCP endpoint remains https://api.sonilo.com/mcp with OAuth scope profile. The account-balance backend update has been deployed. This revision updates the plugin instructions and metadata; it adds no local executable or additional OAuth scope. + +## Validation recorded for this package + +- Plugin manifest and bundled skill validators passed. +- Local release checks and production HTTP/OAuth-discovery checks passed. +- The ZIP contents match the plugin source. +- Hosted MCP account serialization, precision, account isolation, and refresh behavior were covered in backend PR #384; its merged CI passed and deployment completed. +- No paid media-generation run or new demonstration recording was performed for this revision during preparation. Existing review assets must not be represented as recordings of the new features. + +## Previously saved portal draft (before the October 2 guide update) + +https://platform.openai.com/plugins/edit/asdk_app_6a56e50ff2788191a96c7c8cd84bb6c2/asdk_app_v_6ab83efe20c881919ee5a4ba03af2966 + +Saved version 1.1.0, subtitle and description, three prompts, nine existing translations, five positive and three negative test cases, refreshed MCP annotations (15 tools / 45 justifications), and release notes. The dedicated reviewer password sign-in path was verified; its instructions now explain the optional “Use another method” step. No reviewer credentials are copied into this repository. + +Uploaded `dist/sonilo-workflows-1.1.0.zip` to the Skills section. The platform scanner returned “Error” with “An error occurred while scanning. Rescan to try again.” Rescanning and reuploading did not resolve it. This is a scanner error, not a stated policy rejection; no more specific reason was shown. + +The draft is saved but not ready to submit: the Skill scan must succeed, the new media cases need an actual end-to-end run, and the inherited demo recording has not been updated for the new features. Compliance attestations are unchecked. No review submission or publication was performed. + +## October 2 package update + +The local source and both rebuilt ZIPs now include the deployed multilingual +balance guide and updated examples. All 10 public guide routes returned HTTP +200 with the correct canonical URLs. Local release checks and skill validation +passed, and each ZIP entry was compared byte-for-byte with its source. The +previously saved portal draft and upload described above predate this change; +they must not be treated as the updated package or a successful scan. diff --git a/plugins/sonilo/.codex-plugin/plugin.json b/plugins/sonilo/.codex-plugin/plugin.json index b884d53..0ddf42a 100644 --- a/plugins/sonilo/.codex-plugin/plugin.json +++ b/plugins/sonilo/.codex-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "sonilo", - "version": "0.1.0", - "description": "Generate licensed music, sound effects, and mixed videos with Sonilo Platform in Codex.", + "version": "1.1.0", + "description": "Generate licensed music, sound effects, mixed videos, translated subtitles, and dubbing with Sonilo Platform.", "author": { "name": "Sonilo", "email": "support@sonilo.com", @@ -15,14 +15,16 @@ "sound-effects", "video", "audio", - "sonilo" + "sonilo", + "dubbing", + "subtitles" ], "skills": "./skills/", "mcpServers": "./.mcp.json", "interface": { "displayName": "Sonilo", - "shortDescription": "Create music and sound effects", - "longDescription": "Connect your Sonilo Platform account to create licensed AI music, background music, sound effects, and newly mixed videos from text or public HTTPS videos. Generate text-to-music, text-to-sound-effect audio, video-matched soundtracks, finished videos with generated music or sound effects, and audio ducking under voiceovers. Check generation status and account usage directly in Codex. Generation can consume credits already available in your Sonilo Platform account; read-only checks do not. Sonilo.com creator accounts are separate and cannot be used with this plugin.", + "shortDescription": "Music, sound effects & dubbing", + "longDescription": "Connect your Sonilo Platform account to create licensed music, sound effects, and newly mixed videos from text or public HTTPS media. Combine music and effects, keep narration clear, request multiple music variants or instrument stems, review translated subtitles before dubbing, and retrieve generation results. Eligible accounts can preview dubbing before requesting a full video. Check your current USD cash balance, available services, free-trial allowance, and usage in Codex. Generation can consume existing account credits; read-only checks do not. Features and previews depend on account access and the connected service. Sonilo.com creator accounts are separate and cannot be used with this plugin.", "developerName": "Sonilo", "category": "Creativity", "capabilities": [ @@ -30,16 +32,20 @@ "Sound-effect generation", "Video soundtrack generation", "Video sound-effect generation", + "Combined music and sound effects", "Audio ducking", - "Usage reporting" + "Music variants and stems", + "Subtitle review and dubbing", + "Cash balance, trial allowance and usage reporting", + "Generation-task retrieval" ], "websiteURL": "https://platform.sonilo.com", "privacyPolicyURL": "https://sonilo.com/privacy-policy", "termsOfServiceURL": "https://sonilo.com/terms-of-service", "defaultPrompt": [ - "Create 30 seconds of upbeat lo-fi music for a product demo.", - "Create a cinematic 3-second whoosh sound effect.", - "Add cinematic music to this public HTTPS video and return a new video while preserving speech." + "Create 30 seconds of jazz and provide separate drums and bass tracks.", + "Add music and sound effects to this public HTTPS video and return a new video with clear speech.", + "Translate this public HTTPS video into English subtitles for me to review before dubbing." ], "brandColor": "#111111", "composerIcon": "./assets/icon.png", diff --git a/plugins/sonilo/skills/sonilo-workflows/SKILL.md b/plugins/sonilo/skills/sonilo-workflows/SKILL.md index 495364a..87beec0 100644 --- a/plugins/sonilo/skills/sonilo-workflows/SKILL.md +++ b/plugins/sonilo/skills/sonilo-workflows/SKILL.md @@ -1,34 +1,35 @@ --- name: sonilo-workflows -description: Use Sonilo safely with a Sonilo Platform account for licensed music, sound effects, video-aware audio, newly mixed videos, audio ducking, account usage, and asynchronous generation-task retrieval. Validate public HTTPS media inputs before any tool call, use read-only account tools directly, start paid generation only for explicit creation or processing requests, and never direct users to pricing, checkout, subscriptions, or credit recharge. +description: Create licensed music, sound effects, mixed videos, translated subtitles, and dubbed videos with a Sonilo Platform account. Check cash balance, usage, and trial allowance, preserve speech, request variants or stems, and retrieve existing tasks. Validate public HTTPS media inputs before any tool call; never direct users to pricing, checkout, subscriptions, or credit recharge. --- # Sonilo Workflows -Use the Sonilo MCP tools as the source of truth for current parameters and results. +Use the connected hosted MCP schemas and returned data as the source of truth. +This plugin does not install the local `sonilo-mcp` Python server. Do not assume +a tool or parameter exists because it appears in that repository. -## Account identity +## Account identity and availability -- This plugin authenticates against Sonilo Platform at `platform.sonilo.com` - through OAuth. A Sonilo Platform account is required. -- Accounts created only on `sonilo.com` belong to a separate creator account - system and cannot be used to authenticate this plugin. -- Never direct users to `sonilo.com` for plugin authentication or account - access. Never request a password, API key, one-time code, or MFA code. - -## Choose the operation - -- Call `get_account_services`, `get_usage`, or `get_generation_task` directly for read-only requests. -- Call `text_to_music`, `text_to_sfx`, `video_to_music`, `video_to_sfx`, `video_to_video_music`, `video_to_video_sfx`, or `audio_ducking` only when the user clearly asks to create or process media. These operations may consume credits already present in the authenticated Sonilo Platform account. -- Use `video_to_music` or `video_to_sfx` when the user wants a generated audio track based on a video. Use `video_to_video_music` or `video_to_video_sfx` only when the user asks for a new video with the generated audio mixed in. Do not substitute a video-producing tool for an audio-only request. -- Set `preserve_speech` for `video_to_video_music` when the user asks to keep speech in the returned video. Set `isolate_vocals` for `video_to_music` when the user asks to separate the source video's vocals and mix them with the generated music. Otherwise follow the current tool defaults. -- Clarify an exploratory or ambiguous request before starting a paid operation. Do not require redundant confirmation when the user has already requested generation and supplied enough information. -- Follow the current tool input schema. Do not invent local paths, public URLs, task IDs, output URLs, prices, or unsupported parameters. +- A Sonilo Platform account is required. OAuth connects the user to + `platform.sonilo.com`. Accounts created only on `sonilo.com` belong to a + separate creator account system. +- Never direct users to `sonilo.com` for plugin authentication. Never ask for + passwords, API keys, one-time codes, or MFA codes. +- After validating any media inputs, call `get_account_services` before a new + generation to check service availability and trial allowance. Check both + the connected tools and `available_services`; describe an unavailable feature + honestly instead of silently substituting a different paid operation. + `analyze_video` uses the service key `video_analysis`; other generation tools + in the routing table use their tool name as the service key. +- For account, balance, trial, or insufficient-credit questions, read + [account and links](references/account-and-links.md). `get_usage` reports + historical spending, not the remaining balance. ## Validate remote media inputs -Before calling any Sonilo MCP tool for a media-input request, validate the -user-supplied video or audio URL. +Before calling any Sonilo MCP tool for a media-input request, validate every +user-supplied video, audio, and subtitle URL. - Require a publicly reachable `https://` URL. Reject `http://`, `file://`, localhost, loopback, link-local, private-network, and other non-public URLs. @@ -36,40 +37,111 @@ user-supplied video or audio URL. replacement. Do not call even a read-only Sonilo tool, browse or fetch the unsafe URL, attempt to transform it, or start generation. - Do not claim that a URL is public merely because it uses HTTPS. The hosted - Sonilo service remains responsible for DNS resolution, redirect validation, - and SSRF protections when a valid-looking public URL is submitted. - -## Run a paid asynchronous operation - -1. Select the narrowest generation or processing tool that matches the request. -2. Preserve the user's creative intent and requested duration or format. Prefer the tool's default output format unless the user asks for another supported format. -3. Call the paid tool once and retain its returned `task_id`. -4. Treat `status: processing` only as acknowledgement that generation started. -5. Poll `get_generation_task` with the same `task_id`, waiting about 5–10 seconds between checks when waiting is available. Avoid tight polling loops. -6. Stop when the task succeeds or fails. If continued waiting is unavailable, report that processing is still underway and include the `task_id` for a later check. - -## Keep purchases outside the plugin - -- Do not provide or direct users to pricing, checkout, subscription, credit - purchase, recharge, or top-up pages. Do not add a purchase call to action. -- If a user asks where to buy credits or subscribe, respond only that purchasing - or recharging Sonilo credits is not available through this plugin. Do not - provide a purchase URL, name an external purchase destination, tell the user - to visit a website, account, billing, or pricing page, or suggest a workaround. -- If a tool reports insufficient credits or includes a purchase URL, report the - insufficient-credit error neutrally and do not repeat or paraphrase the URL. -- The Sonilo Platform homepage may be shared only when the user asks for - developer product information, Platform account sign-in, support, privacy, - or legal information, but never as a route to purchase. -- Do not share `sonilo.com` as an authentication or account-access destination - because its creator accounts are not accepted by this plugin. -- Explicit generation requests may consume credits already present in the - authenticated user's Sonilo Platform account; this existing-credit usage is - not a purchase flow. - -## Report the result - -- On success, return only media URLs and metadata actually present in the task result. For video-to-video operations, identify the returned URL as a newly mixed video; never claim that Sonilo modified the source video in place. -- On failure, report the provided error and refund status without claiming that media was created. -- Never describe a processing task as finished or fabricate a playable artifact. -- Keep account, usage, task, and media details scoped to the authenticated Sonilo Platform user. + service remains responsible for DNS resolution, redirect validation, and + SSRF protections. A filename or local attachment is not a public URL; do not + upload a user's file to an external host without authorization. + +## Choose the operation + +Generation and processing tools run only when the user clearly asks to create +or process media. They may consume existing account credits. Read-only account +and task lookups do not. Explain options without generating anything when the +user asks what Sonilo can do. Do not require redundant confirmation for an +explicit, sufficiently specified generation request. + +| Requested result | Hosted tool | +| --- | --- | +| Music from a description | `text_to_music` | +| Sound effect from a description | `text_to_sfx` | +| Music matched to a video, delivered as audio | `video_to_music` | +| Sound effects matched to a video, delivered as audio | `video_to_sfx` | +| A new video with generated music | `video_to_video_music` | +| A new video with generated sound effects | `video_to_video_sfx` | +| Music and sound effects together, delivered as audio | `video_to_sound` | +| A new video with music and sound effects together | `video_to_video_sound` | +| Lower existing music under a separate voice track | `audio_ducking` | +| Editable translated subtitles before dubbing | `proofread` | +| A dubbed video per requested language | `dubbing` | +| A creative brief for a video | `analyze_video` (also potentially charged) | +| Cash balance, available services, and trial counts | `get_account_services` | +| Historical usage and spend | `get_usage` | +| Progress or results of an existing task | `get_generation_task` | + +Use video-producing tools for a new video with the generated audio mixed in; +do not substitute them for an audio-only request. Prefer a single combined +music-and-effects tool over two separate generations for the same request. +Do not add a paid analysis step just to choose a generation tool. + +## Creative controls + +- **Speech:** use `preserve_speech=true` on supported video-music or combined + tools to keep the source speech. Add `ducking=true` when music must lower + during speech. Use `keep_original_sound=true` instead when the user wants + all original audio retained. Do not pass options to tools lacking them. +- **Variants:** use the requested `variants_num` in one supported tool call; + default to one. Multiple variants consume more credits and are not covered + by a single-run trial. A free-only request does not authorize paid variants. + Return a separately labeled link for each actual result, not repeated links + to the first result. +- **Stems:** set `stems=true` on `text_to_music` or `video_to_music` only when + requested. These separate the generated music into drums, bass, vocals, and + other; they do not split an arbitrary source recording. If `stems_error` + appears, deliver the successful music and available stems, explain the + missing extras, and do not regenerate or claim all stems succeeded. +- **Timed effects:** follow the selected tool's `segments` schema. Hosted + video-SFX tools currently expect a JSON-encoded string, starting at zero + with contiguous `{start, end, prompt}` intervals. Preserve requested event + times; represent gaps as intervals requesting no added effects. Do not send + isolated disjoint intervals or use the music-segment schema. Combined tools + have their own segment schema; inspect it before use. +- Preserve requested duration, language, and format; otherwise use tool + defaults. Ask only for missing information that affects the requested + result or charge, and do not invent parameters or prices. + +For subtitle review, dubbing, free previews, and returning to finish a full +video, read [dubbing and continuation](references/dubbing.md). + +## Run or retrieve a task + +1. Submit the chosen generation once. Retain its `task_id`, source URLs, and + requested parameters in the conversation so the same work can be retrieved. +2. `status: processing` means started, not finished. Poll `get_generation_task` + with the same ID, waiting about 5–10 seconds between checks when available. +3. After a timeout or interruption with a task ID, retrieve that task. Do not + submit a new generation. Without a task ID, report that submission status + is unknown; do not claim no charge or blindly retry an ambiguous request. +4. Stop on success or failure. If waiting cannot continue, return the task ID + and explain how the user can ask for its status later. Do not promise + background monitoring that has not been scheduled. +5. A retry after confirmed pre-generation rejection requires the user's request + to continue. Refresh account state; do not keep retrying insufficient-credit + errors. Never restart an in-progress or already completed task to check it. + +## Report the result and useful next step + +- For media inputs and outputs, return readable Markdown links using only + URLs actually supplied by the user or returned by the task. Label outputs + by language, variant, or stem. Account-help links use the configured URLs + in [account and links](references/account-and-links.md). + Identify video-to-video results as new videos, not source files edited in place. +- A subtitle file, a creative brief, and a 15-second preview are not a finished + full-length video. Label them accurately and report partial results. +- On failure, report the actual error and refund status. Say “not started” or + “not charged” only when the response establishes that; otherwise say the + status is unknown. Never fabricate media, balances, refunds, or trial counts. +- After a successful trial, briefly explain the relevant next action, such as + reviewing subtitles or requesting the full video using existing account + access. Do not automatically start more work or turn this into an upsell. +- Keep account, task, and media details scoped to the authenticated user. + +For concrete user-facing wording, see [examples](references/examples.md). +Examples illustrate behavior, not real balances, URLs, or completed jobs. + +## Account links and commerce + +Follow [account and links](references/account-and-links.md) for permitted +informational links and neutral credit errors, including the localized +Balance and free trials guide after a confirmed credit rejection. +Never use a homepage or help +page as a workaround to route the user to a purchase. Suppress purchase URLs +and purchase instructions returned by tools, including preview messages. diff --git a/plugins/sonilo/skills/sonilo-workflows/agents/openai.yaml b/plugins/sonilo/skills/sonilo-workflows/agents/openai.yaml index 57afe3b..8cf3e14 100644 --- a/plugins/sonilo/skills/sonilo-workflows/agents/openai.yaml +++ b/plugins/sonilo/skills/sonilo-workflows/agents/openai.yaml @@ -1,12 +1,12 @@ interface: display_name: "Sonilo Workflows" - short_description: "Generate Sonilo audio and mixed video safely" - default_prompt: "Use $sonilo-workflows with my Sonilo Platform account to create audio or a newly mixed video and return the completed result." + short_description: "Create music, sound effects, subtitles, and dubbing" + default_prompt: "Use $sonilo-workflows with my Sonilo Platform account to create music, sound effects, or a dubbed video and return the actual result links." dependencies: tools: - type: "mcp" value: "sonilo" - description: "Sonilo Platform music, sound-effects, and mixed-video MCP server" + description: "Sonilo Platform music, sound-effects, subtitles, and dubbing MCP server" transport: "streamable_http" url: "https://api.sonilo.com/mcp" diff --git a/plugins/sonilo/skills/sonilo-workflows/references/account-and-links.md b/plugins/sonilo/skills/sonilo-workflows/references/account-and-links.md new file mode 100644 index 0000000..5e7847f --- /dev/null +++ b/plugins/sonilo/skills/sonilo-workflows/references/account-and-links.md @@ -0,0 +1,108 @@ +# Account status and links + +## Answer balance and trial questions + +- `get_account_services` supplies available services and, when present, + `trial[service].granted`, `used`, and `remaining`. Name the service when + reporting counts; a music trial does not cover a different endpoint. +- An absent or null `trial` does not mean zero balance or unlimited free use. + A missing service entry does not establish a free trial. Zero trial runs + does not establish zero paid balance; existing paid access may still work. +- `get_usage` supplies requests, durations, and spending for its date range. + `summary.total_cost` is spending, never the remaining cash or credit balance. +- `get_account_services` also returns `cash_balance` as a decimal string and + `currency` as `USD`. Report the actual amount in US dollars, preserving + sub-cent precision when present (for example, `"2.5001"` is USD 2.5001). + Use this read-only tool for balance questions; call `get_usage` only when + the user also wants spending history. Never subtract usage from an assumed + deposit or convert dollars into invented credits or generation counts. +- Check that both balance and currency are present and valid. `"0.0000"` is + a known zero; missing, null, or invalid balance data is unavailable, not zero. + If an older connected response lacks these fields, report the available + trial data and explain that the balance was not returned. +- This is the authenticated account's balance at query time, not a reserved + amount or authorization for another generation. Zero cash does not establish + that generation is unavailable: trials or invoiced billing may still apply. + Billing mode is not returned; do not infer it from cash or trial fields. + Let the generation service enforce billing for an authorized request. + +## Insufficient credits and returning users + +- Distinguish `trial_exhausted`, `insufficient_balance`, unavailable service, + authentication failure, and a failed generation. Do not describe every + failure as exhausted credits. +- After a confirmed credit rejection, refresh `get_account_services` once + to report current balance and the relevant trial count. If lookup fails, + keep the original error and say balance is unavailable; do not fabricate + zero or keep retrying. The read-only refresh does not restart generation. +- For a confirmed rejection before task creation, say generation did not start. + Report no charge only when the response establishes that. For an existing + failed task, use its `refunded` value; do not infer a refund from failure alone. +- Do not automatically retry a credit error, swap to another endpoint to get + another free run, or invite a new account to bypass limits. +- If the user says account access or credits have changed and asks to continue, + refresh account services. Reuse the prior source and intended parameters + from this conversation. Retrieve any existing task first. A confirmed + rejected submission can be submitted once after the new request, with + billing enforced by the server. Report any freshly returned cash balance, + but do not claim “your balance is sufficient” from that snapshot alone. +- If prior context is missing, ask for the source URL or task ID. Do not claim + persistent cross-conversation memory or ask the user to repeat known inputs. + +## Balance and free-trial help + +- After an actual `insufficient_balance` or `trial_exhausted` rejection, add + one link to the published **Balance and free trials** guide below. Also use + it when the user asks how balance or trial limits work. Explain the actual + error first; do not append the link to every successful generation. +- Use the conversation language, not a guessed location. For Traditional + Chinese use `zh-HK`, for Simplified Chinese use `zh`. For other unsupported + languages or an unclear language, use the English page. Translate the link + label naturally; do not invent a translated URL slug. + +| Language | Guide URL | +| --- | --- | +| English / fallback | https://platform.sonilo.com/usage-and-entitlements | +| 简体中文 | https://platform.sonilo.com/zh/usage-and-entitlements | +| 繁體中文 | https://platform.sonilo.com/zh-HK/usage-and-entitlements | +| German | https://platform.sonilo.com/de/usage-and-entitlements | +| Spanish | https://platform.sonilo.com/es/usage-and-entitlements | +| French | https://platform.sonilo.com/fr/usage-and-entitlements | +| Italian | https://platform.sonilo.com/it/usage-and-entitlements | +| Japanese | https://platform.sonilo.com/ja/usage-and-entitlements | +| Korean | https://platform.sonilo.com/ko/usage-and-entitlements | +| Portuguese | https://platform.sonilo.com/pt/usage-and-entitlements | + +- The guide is a public explanation, not an account lookup. Do not put + balances, account IDs, media URLs, task IDs, or credentials in its URL. + Do not claim it displays the user's live balance or updates their account. +- Link to the explanation with labels such as “Balance and free trials” or + “余额与免费试用”. Do not describe the link as a payment button or instruct + the user to click through the guide to buy credits. After the user reports + an account update and asks to continue, follow the task-check flow above. +- Authentication errors require reconnecting the Platform account; service + outages and failed tasks need their actual error explained. Do not treat + these as balance errors or replace their next steps with this guide. + +## Purchase boundaries + +- Do not provide or direct users to pricing, checkout, subscription, credit + purchase, recharge, or top-up pages. Do not promote upgrades or new plans. +- If a tool contains a purchase URL, do not repeat or paraphrase the URL or + its purchase instructions. This includes errors and `trial_preview.message`. +- A request to buy credits can be answered neutrally: purchases are not + available through this plugin. Do not tell the user to visit a website, + account, billing, or pricing page as a workaround. +- Users may access existing paid entitlements. It is appropriate to explain + why a requested feature is not covered by their current account. +- Use only the configured guide URLs for balance explanations. Do not invent + `/usage`, `/credits`, or another path or substitute the homepage. +- `https://platform.sonilo.com/pricing` includes an Add funds flow and must not + be used as the informational destination. Do not link dashboard billing. +- For an explicit request for product guidance or examples, the public + [Sonilo MCP guide](https://platform.sonilo.com/mcp) is available. Use it for + learning the product, not as the response to an exhausted-credit error. +- The Platform homepage may be shared for requested product information, + account sign-in, or support, never as a route to purchasing. + +Policy reference: [OpenAI plugin commerce and monetization rules](https://developers.openai.com/plugins/plugin-guidelines#commerce-and-monetization). diff --git a/plugins/sonilo/skills/sonilo-workflows/references/dubbing.md b/plugins/sonilo/skills/sonilo-workflows/references/dubbing.md new file mode 100644 index 0000000..acee829 --- /dev/null +++ b/plugins/sonilo/skills/sonilo-workflows/references/dubbing.md @@ -0,0 +1,62 @@ +# Subtitle review, previews, and full videos + +## Review the script before dubbing + +1. For “translate the subtitles first; I will correct them,” use `proofread` + only. It may consume credits; it produces SRT files, not a dubbed video. + Check that the service is available before submitting. +2. Return the source transcript and target-language SRT URLs actually present + in the result. Report warnings without claiming the files are invalid + unless the service says so. Wait for the user's review before dubbing. +3. Use the approved target-language scripts as `dubbing.subtitles`, one public + HTTPS SRT/VTT URL per target language, with keys matching the requested + languages exactly. Validate every subtitle URL as well as the video URL. + If the user edits text in chat, do not silently reuse the unedited SRT: + obtain a reachable URL for the approved script before submission. +4. Set `export_srt=true` only if the user wants aligned subtitles with the + dubbed result and scripts were supplied. Deliver each language's video + and any successful subtitle export; report a blocked export separately. + +## Select languages and preview eligibility + +- Always specify the languages the user requested; never omit this argument + and accidentally accept the server's multiple-language default. Ask for the + target language if missing. Dubbing is billed per language. +- Follow the hosted schema: `dubbing.languages` currently takes a JSON array + encoded as a string (for example, `["en"]`), while `proofread.languages` + takes a list. Do not copy local MCP parameter types or local-file options. +- A free dubbing preview is conditional on current account eligibility, a + single target language, and no supplied subtitles. Check + `trial.dubbing.remaining`; never promise every user a free preview. +- The eligible first call processes up to the first 15 seconds. A free-only + request does not authorize a normal charged call when eligibility is absent, + exhausted, unknown, or incompatible with multiple languages or scripts. + Explain that no free preview is available; do not silently bill instead. +- Read `trial_preview` from both submission text and the retrieved task result. + Use `preview_seconds`, `source_duration_seconds`, and `trimmed` to label the + actual preview. Do not say 45 seconds remain unless the source is 60 seconds. + Never display purchase instructions from its `message` field. +- `full_video_cost_usd`, when present, describes the full source, not the + amount charged for the preview. Do not infer the current balance from it. + +## Continue after a preview or account update + +- A preview is complete for that preview task. Polling it again cannot make + it full length. Never automatically submit a second dubbed video. +- When the user explicitly asks for the full version, reuse the original + video URL, target language, and approved settings. Refresh account services; + the full source is a new generation and may use existing paid credits. + Do not promise it charges only for the remaining seconds. +- If a previous full-video task exists, retrieve it instead of starting a + duplicate. If only the completed preview exists, the explicit full-video + request authorizes one new submission. Stop on a credit rejection. +- If the first request was for a full video but the server returns a preview, + deliver it accurately and explain how to request the full version with + existing access. Do not automatically make another charged call. +- If the user later says their account is updated and asks to continue, apply + the same task check and refresh. Report the actual USD balance when returned; + do not promise it covers the full video. If the connected response lacks a + balance, say so and let the service enforce billing on the requested task. +- Use `lipsync=false` only when requested or needed to preserve the original + picture; use `ducking=true` when the background must lower under the dubbed + speech. Follow current defaults otherwise. diff --git a/plugins/sonilo/skills/sonilo-workflows/references/examples.md b/plugins/sonilo/skills/sonilo-workflows/references/examples.md new file mode 100644 index 0000000..13e8212 --- /dev/null +++ b/plugins/sonilo/skills/sonilo-workflows/references/examples.md @@ -0,0 +1,44 @@ +# User-facing examples + +Respond in the user's language. Link labels mean real user inputs or returned +artifacts, not invented URLs. Use success wording only after a successful +result; substitute actual account data for illustrative numbers. + +| User request | Behavior and response shape | +| --- | --- | +| “Translate this one-minute product demo into English subtitles first; I will correct the product name.” + video URL | Run `proofread`, return the English SRT link, and wait: “Review this English subtitle file. Send the approved script URL when you are ready to dub.” | +| “Add relaxed music and waves to this 20-second beach video and give me the finished video.” + video URL | Run `video_to_video_sound` once. “Here is your new video with music and wave effects: [video].” | +| “Let me try English dubbing for free on this one-minute Chinese video.” + video URL | Check single-language, no-script trial eligibility. If confirmed and the task succeeds with a trimmed preview: “Here is the first 15 seconds in English: [preview]. The remaining 45 seconds have not been processed.” Otherwise explain that a free preview is unavailable without submitting a paid job. | +| “That preview sounds good. Dub the whole one-minute video.” | Refresh services, check for an existing full-video task, then submit once using the original source and English settings. “I will check your account and use the same video and language for the full version.” Do not claim it is already complete. | +| “How much balance do I have, and how many free music runs remain?” | Call `get_account_services`. If it returns `cash_balance="2.5001"`, `currency="USD"`, and `trial.text_to_music.remaining=1`: “Your current cash balance is USD 2.5001. You have 1 free text-to-music run remaining.” Use actual returned values. If balance is missing: “The service did not return your cash balance.” Missing trial data is unknown, not zero. | +| “Generate another 30-second upbeat track.” when rejected for insufficient balance | “The service reports insufficient balance.” If a fresh account lookup returns `cash_balance="0.0000"` and `currency="USD"`, add “Your current cash balance is USD 0.” Add “Generation did not start” only for a confirmed pre-generation rejection. Add “[Balance and free trials](https://platform.sonilo.com/usage-and-entitlements) explains how balance and trial limits work.” No automatic retry or instructions to purchase. | +| “My account credits have updated. Continue the English video from before.” | Refresh account data and retrieve any prior task. Submit once only after a confirmed rejection or when the only completed task is a preview and the user wants the full video. If the refreshed response returns `cash_balance="5.0000"` and `currency="USD"`: “Your current cash balance is USD 5. I will use the same video and English settings; the service checks available funds when processing the request.” A positive balance alone does not prove sufficient funds. | +| “I am new to Sonilo. How do I ask for music for a café ad?” | No generation. “Send a public HTTPS video link and say: ‘Add warm, relaxed jazz to this 30-second café ad.’” For more examples, link to `https://platform.sonilo.com/mcp`. | +| “Is the English video ready?” | Retrieve the same task ID. While processing: “It is still processing. I am checking the original task, not submitting another generation.” If waiting stops, provide the task ID without promising unattended monitoring. | +| “Give me three music choices for this 30-second café ad.” + video URL | Use `video_to_music` with `variants_num=3`, or the video-output tool if requested. Multiple variants use paid credits; a free-only constraint prevents this submission. Return three separately labeled actual URLs after success. | +| “Add light music to my travel narration, but keep my voice clear.” + video URL | Use the requested output type with `preserve_speech=true` and `ducking=true` where supported. Link to the actual processed output, not an unducked alternative. | +| “At 2–3 seconds add a door closing; at 5–7 seconds add rain.” + video URL | Use the requested SFX output type. For the hosted contiguous-segment schema, encode 0–2 no added effects, 2–3 door closing, 3–5 no added effects, and 5–7 rain. Return the actual audio or video after success. | +| “Generate 30 seconds of jazz and give me separate drums and bass for editing.” | `text_to_music` with `duration=30`, `stems=true`. Return [complete music], [drums], [bass], and other actual stem URLs. A stems-only failure does not invalidate the complete music. | + +## Concrete credit-error replies + +These examples assume the server confirmed rejection before task creation and +that the fresh account lookup returned the stated balance. Omit unconfirmed +facts. A trial count is included only if returned for that specific service. + +**User:** “再帮我生成一段 30 秒的轻快背景音乐。” + +**Reply:** “余额不足,这次没有开始生成。你当前的余额是 USD 0。 +可查看[余额与免费试用](https://platform.sonilo.com/zh/usage-and-entitlements)了解规则。 +账户更新后,可以对我说‘继续刚才的音乐’。” + +**User:** “再免費試一次英文配音。” + +**Reply when the dubbing trial is confirmed exhausted:** “你的英文配音免費試用 +次數已用完,這次沒有開始生成。可查看 +[餘額與免費試用](https://platform.sonilo.com/zh-HK/usage-and-entitlements)了解規則。” + +A zero remaining trial count alone does not prove insufficient paid balance. +For a free-only request, do not submit a paid job to test whether it will work. +If account lookup fails after a credit rejection, report the original rejection +and say the current balance could not be retrieved; retain the guide link. diff --git a/scripts/check_release.py b/scripts/check_release.py index 485e559..d211674 100644 --- a/scripts/check_release.py +++ b/scripts/check_release.py @@ -25,6 +25,11 @@ RESOURCE_METADATA_URL = f"{MCP_URL}/.well-known/oauth-protected-resource" RFC_RESOURCE_METADATA_URL = "https://api.sonilo.com/.well-known/oauth-protected-resource/mcp" AUTHORIZATION_SERVER = "https://clerk.platform.sonilo.com/" +BALANCE_GUIDE_PATH = WORKFLOW_SKILL_PATH.parent / "references" / "account-and-links.md" +BALANCE_GUIDE_URLS = { + f"https://platform.sonilo.com{prefix}/usage-and-entitlements" + for prefix in ("", "/zh", "/zh-HK", "/de", "/es", "/fr", "/it", "/ja", "/ko", "/pt") +} PAID_TOOL_NAMES = { "text_to_music", "text_to_sfx", @@ -33,6 +38,11 @@ "video_to_video_music", "video_to_video_sfx", "audio_ducking", + "video_to_sound", + "video_to_video_sound", + "proofread", + "dubbing", + "analyze_video", } @@ -176,7 +186,7 @@ def check_local() -> None: require(manifest.get("homepage") == "https://platform.sonilo.com", "homepage must use Sonilo Platform") interface = manifest.get("interface", {}) - require(interface.get("shortDescription") == "Create music and sound effects", "portal subtitle is out of sync") + require(interface.get("shortDescription") == "Music, sound effects & dubbing", "portal subtitle is out of sync") require(len(interface["shortDescription"]) <= 30, "portal subtitle exceeds 30 characters") default_prompts = interface.get("defaultPrompt") require( @@ -224,6 +234,18 @@ def check_local() -> None: skill = WORKFLOW_SKILL_PATH.read_text(encoding="utf-8") require(skill.startswith("---\nname: sonilo-workflows\n"), "skill frontmatter is invalid") + # References ship with the skill and are loaded only for the relevant workflow. + # Validate actual links so a missing packaged reference cannot silently drop + # account or dubbing guidance from the installed plugin. + references = re.findall(r"\]\((references/[^)]+\.md)\)", skill) + require(bool(references), "skill must link its workflow references") + for relative_path in set(references): + reference = WORKFLOW_SKILL_PATH.parent / relative_path + require(reference.is_file(), f"missing bundled reference: {relative_path}") + guidance = skill + "\n" + "\n".join( + (WORKFLOW_SKILL_PATH.parent / path).read_text(encoding="utf-8") + for path in sorted(set(references)) + ) require( "Validate public HTTPS media inputs before any tool call" in skill, "skill metadata must advertise media-input validation", @@ -239,8 +261,8 @@ def check_local() -> None: "new video with the generated audio mixed in" in skill, "skill must distinguish video-producing tools from audio-only tools", ) - require("`preserve_speech`" in skill, "skill must document speech preservation routing") - require("`isolate_vocals`" in skill, "skill must document vocal-isolation routing") + require("`preserve_speech=true`" in skill, "skill must document speech preservation routing") + require("isolate_vocals" not in guidance, "obsolete local-only parameter in hosted guidance") require("A Sonilo Platform account is required" in skill, "skill must state the required account system") require( "Accounts created only on `sonilo.com`" in skill, @@ -259,17 +281,26 @@ def check_local() -> None: "skill must reject unsafe media URLs without account lookups", ) require( - "Do not provide or direct users to pricing, checkout, subscription, credit" in skill, + "Do not provide or direct users to pricing, checkout, subscription, credit" in guidance, "skill must not direct users to purchase or recharge", ) require( - "do not repeat or paraphrase the URL" in skill, + "do not repeat or paraphrase the URL" in guidance, "skill must suppress purchase URLs returned by tools", ) require( - "to visit a website, account, billing, or pricing page" in skill, + "to visit a website,\n account, billing, or pricing page" in guidance, "skill must not indirectly route users to purchase destinations", ) + guide_reference = BALANCE_GUIDE_PATH.read_text(encoding="utf-8") + guide_urls = set(re.findall( + r"https://platform\.sonilo\.com[^\s|)]*/usage-and-entitlements[^\s|)]*", + guide_reference, + )) + require( + guide_urls == BALANCE_GUIDE_URLS, + "balance guide must configure all 10 published routes without query data or invented paths", + ) require("Poll `get_generation_task`" in skill, "skill must document asynchronous polling") agent_metadata = WORKFLOW_AGENT_PATH.read_text(encoding="utf-8") require('value: "sonilo"' in agent_metadata, "skill agent metadata must depend on Sonilo MCP") @@ -335,6 +366,14 @@ def validate_resource_metadata(metadata_url: str, body: bytes) -> None: status, _, _ = request(interface[field]) require(status == 200, f"{field} returned {status}, expected 200") + for url in sorted(BALANCE_GUIDE_URLS): + status, headers, body = request(url) + require(status == 200, f"balance guide {url} returned {status}, expected 200") + require("text/html" in headers.get("content-type", ""), f"guide is not HTML: {url}") + html = body.decode("utf-8") + canonical = re.search(r']+rel="canonical"[^>]+href="([^"]+)"', html) + require(canonical is not None and canonical[1] == url, f"wrong guide canonical: {url}") + def main() -> int: parser = argparse.ArgumentParser(description=__doc__) From d3d82125664f7fe10eb6faa430b3948a78e3115d Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Fri, 2 Oct 2026 18:24:19 -0700 Subject: [PATCH 02/18] docs: record live v1.1.0 tests and hosted argument blockers --- docs/IMPLEMENTATION_1.1.0.md | 7 ++++ docs/LIVE_TEST_1.1.0.md | 78 ++++++++++++++++++++++++++++++++++++ docs/REVISION_1.1.0_NOTES.md | 7 ++++ 3 files changed, 92 insertions(+) create mode 100644 docs/LIVE_TEST_1.1.0.md diff --git a/docs/IMPLEMENTATION_1.1.0.md b/docs/IMPLEMENTATION_1.1.0.md index ca83617..d1dcbd0 100644 --- a/docs/IMPLEMENTATION_1.1.0.md +++ b/docs/IMPLEMENTATION_1.1.0.md @@ -1,5 +1,12 @@ # Sonilo 1.1.0 implementation +> October 2 live-test update: **not release-ready**. Production rejected the +> documented dubbing-language and timed-SFX arguments. Music variants, stems, +> combined output, balance, and task retrieval passed the checks described in +> [the live verification report](LIVE_TEST_1.1.0.md). Earlier validation notes +> below describe package preparation and do not supersede these findings. + + Scope: the 13 features in the [manager plan](https://docs.google.com/document/d/1woqbRgMlCemdw46mpP6Wz1uDkVUK9_C4QyPi2cX2y0s/edit). This package updates the hosted-MCP workflow instructions and listing metadata; it does not deploy the server, publish the plugin, or change account entitlements. diff --git a/docs/LIVE_TEST_1.1.0.md b/docs/LIVE_TEST_1.1.0.md new file mode 100644 index 0000000..5acff0c --- /dev/null +++ b/docs/LIVE_TEST_1.1.0.md @@ -0,0 +1,78 @@ +# v1.1.0 live verification — October 2, 2026 (Pacific) + +**Release status: blocked by hosted MCP argument validation.** + +These are authenticated production MCP calls using a temporary Python MCP +client, the published tool schemas, and the v1.1.0 workflow instructions. +They are not a clean-install Codex conversation test or proof that Codex will +select every workflow correctly. Raw account results and media links remain +local; no tokens, reviewer credentials, or signed result links are committed. + +## Results against the manager plan + +| Feature | Observed result | +| --- | --- | +| Subtitle review before dubbing | Tool is enabled and starts a task. The public demo has no speech; it correctly returned `TRANSCRIPTION_EMPTY`. Successful subtitle generation and approved-script dubbing remain untested. | +| Music and effects together | Passed: one call produced a video, music track, and effects track. All three URLs were readable; video contains H.264 and AAC and is 20 seconds long. | +| Free dubbing preview | Blocked: the documented `languages` string is rejected by argument validation before task creation. The account still has its preview allowance. | +| Full video after preview | Blocked by the same language-argument issue; no preview/full-video chain completed. | +| Balance and trial lookup | Passed: actual decimal USD balance and per-service trial data returned through OAuth. | +| Credit-error guidance | Guide routes were verified previously; an actual insufficient-balance rejection and Codex's reply are not yet tested. Do not exhaust the test wallet just to force this condition. | +| Continue after account update | Not tested: no account-funding change was performed. | +| Usage examples | Bundled examples are present; selection and wording in a clean Codex session remain untested. | +| Generation status | Passed: existing successful and failed tasks retrieved; repeat lookup returned the same task and media URLs. A nonexistent task returned `Task not found`. | +| Multiple variants | Passed: one 10-second request with `variants_num=3` returned three distinct playable audio files. | +| Keep narration audible | Not tested: the available public demo has no speech. Requires a spoken-video fixture. | +| Timed sound effects | Blocked: the documented `segments` JSON string is rejected before task creation. | +| Instrument stems | Passed: all three variants returned drums, bass, vocals, and other tracks; all 12 stem URLs were readable. | + +Media verification used ffprobe for actual file readability, codecs, and duration. +It does not establish subjective audio quality or speech intelligibility. + +## Confirmed hosted blocker + +Both calls use the types advertised by production `tools/list`: + +```json +{"languages": "[\"en\"]"} +``` + +```json +{"segments": "[{\"start\":0,\"end\":2,\"prompt\":\"Silence\"},{\"start\":2,\"end\":3,\"prompt\":\"Footstep\"}]"} +``` + +Production reports `Input should be a valid string`, with `input_type=list`. +FastMCP 1.14.1 reproduces the cause locally: `pre_parse_json` decodes JSON +strings when the annotation is `str | None`, then the argument model rejects +the resulting list. Calling the Python tool function directly does not exercise +this preprocessing, so earlier function-level checks missed it. + +Fix the hosted argument model/normalization and add a regression test through +FastMCP dispatch. Audit other JSON-array string fields, including segments on +music/SFX/combined tools. Then retest the live language and timed-effect paths; +update plugin guidance if the published schema changes. Do not work around the +failure by omitting requested languages, which would select multiple defaults. + +## OAuth test-client incident + +The first temporary connection expired after waiting for authorization. On a +subsequent attempt, the callback completed but the Python client rejected the +token response because Clerk included `offline_access` in addition to `profile`. +The test client was restarted with both scopes explicitly requested, allowing +normal scope validation to remain enabled. Authenticated calls then succeeded. +Tokens are held only in the temporary client's memory. + +The plugin manifest remains `profile` only. This temporary client's success +therefore does not establish the exact Codex client's sign-in/refresh behavior; +a clean plugin OAuth check is still required before release. + +## Usage reconciliation + +The live run recorded three generation requests, including the no-speech +failure, and USD 0.0675 spending. The wallet decreased by that same amount. +The combined-video trial was consumed; dubbing and timed-SFX trials were not. +No account funding or automatic paid retry was performed. + +Still needed: fix and deploy hosted array-argument handling, a permitted public +spoken-video fixture, the remaining scenarios above, a clean v1.1.0 Codex +conversation test, the updated portal upload/scan, and current demo material. diff --git a/docs/REVISION_1.1.0_NOTES.md b/docs/REVISION_1.1.0_NOTES.md index 8bc8750..332c5b3 100644 --- a/docs/REVISION_1.1.0_NOTES.md +++ b/docs/REVISION_1.1.0_NOTES.md @@ -1,5 +1,12 @@ # Revision 1.1.0 draft notes +> October 2 live-test update: **not release-ready**. Production rejected the +> documented dubbing-language and timed-SFX arguments. Music variants, stems, +> combined output, balance, and task retrieval passed the checks described in +> [the live verification report](LIVE_TEST_1.1.0.md). Earlier validation notes +> below describe package preparation and do not supersede these findings. + + ## Release notes Update the bundled Sonilo workflow skill and directory description to cover subtitle review before dubbing, eligible single-language dubbing previews, user-requested full-video continuation, combined music and sound effects, music variants and stems, timed effects, speech preservation, and task retrieval after interruptions. From e9fc90c4ce639fced00db16fca5e0530da2b0394 Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Fri, 2 Oct 2026 18:32:13 -0700 Subject: [PATCH 03/18] test: add synthetic speech video for live MCP verification --- tests/fixtures/README.md | 14 ++++++++++++++ tests/fixtures/speech-demo.mp4 | Bin 0 -> 258522 bytes tests/fixtures/speech-demo.txt | 1 + 3 files changed, 15 insertions(+) create mode 100644 tests/fixtures/README.md create mode 100644 tests/fixtures/speech-demo.mp4 create mode 100644 tests/fixtures/speech-demo.txt diff --git a/tests/fixtures/README.md b/tests/fixtures/README.md new file mode 100644 index 0000000..db9ad18 --- /dev/null +++ b/tests/fixtures/README.md @@ -0,0 +1,14 @@ +# Live-test media + +`speech-demo.mp4` is a 22-second test card with locally synthesized English +narration. Its exact script is `speech-demo.txt`. It contains no customer media, +private account data, recorded person, or cloned voice. + +Use this fixture for subtitle translation, 15-second preview/full-video +continuation, and speech-preserving soundtrack checks. Keep `lipsync=false`: +the image is a static test card with no visible speaker. These files are test +inputs outside `plugins/sonilo` and are not included in either release ZIP. + +The initial file was generated with macOS `say -r 145` and FFmpeg, using H.264 +video at 640x360/25 fps and AAC audio. The last seconds leave room for music to +return after speech. This is a diagnostic fixture, not a product-quality demo. diff --git a/tests/fixtures/speech-demo.mp4 b/tests/fixtures/speech-demo.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..41ba3de2a82c93f681d6a2403d4d48a86c9af8ca GIT binary patch literal 258522 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%0AMn0U2d2Zb(roR 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%0D%&!6(X1?PBt)*V=(3I5M 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

9)Yp={+erz4HqT%elBZ*HEnx;*?*IQijVI+6IH0 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

`)%)Rdfl%G zZ{eWWu?;=x^1u*PEgmQzdCUfDY$(5}Y)F=}VtdTY_I1`UAEPDBe|J3`g31jQsVq$d z$N&UxH|+-t(Y)Yf9$d9D4#5sUgZ~#`1yD1O?d!_au>R=)!oIx+j*(D|?>+14mxiZ6 zl0R}7xKX$eV|zOCsqPo;?mBC`RaF|GWG0gLbJg>GPoPYWBsZG- z<3JV`#nb;Sw-x$$fA)S%0Y40q7m#aDDJG=OK^%}G#5^W~YbJ4Qez0Q|=G>zzOfC@= zUPSi2n$3Vl3&qPS32Db$CRFSYj03@nK(TsA1g5MG?4~_IffT7$AxQD|8r{w=77?`;MkBu|)|YLh#WgYUJ;>Jv`zt=+EpNsyQv%ip`8R&OpEqfO3$7k+R|!{D9|EAs zmpiYR@L|t{QL|(u#4BKa<*a!2=wDYEbqbGF%COtnB7Y`RRNfG07qug?l-!R4O`lS| zJWC~v+b^wR%Q=LVe*Q*}JlF1KG`+4BTNjj_T&z8|HX)UlDSOHg4BVohQUq@hh_{XeXag8evp?&d%(!O!Y#17f(l`lBI;DObHyev6JHfyS z6U7l^kXSf@?U6KH7&)M0(KS+OlUmPXwZc=561Swnm4D?AGCpnXiS}5llv^iZr1Fdh z@dxe@OmRyVmvjbt&QJ0Ju&PUmmf4owpq=8?^7oH1QAZmXMkyRN8JR4YnzIx%RFSq6 zWas;6x5a?iMrD_UqWRM@VF%Qiycx<1SuxPT&BCBS?J8WCDZ#JdBsKo#^1pifclw&3s6TN~*er zbfyi!gV9EW>pE(<1O_mQvc0~Z#=A4Xhvqef55mm`ZnQ=UOmzr9Xrunlf0O7V%1X@` zQ=OWiQqN|WFnm1Xh=?fnOC&hOd4CQW1v;b1Vh`G6R-QMu;HQQsgo(y2lTku}L-dH) z{cSvj1X?1K8S2~)6{}UX?-z%IC_zRV1DlU-lE-*YfAK&e!GxCC126F# zqURe7GJHg`czDY-~Rw#a-tJ<$!^eNhCv^&MlDa$#T72f{EX4t(cT1oc_!tY;gf>;MP$=yz}cDNWkSnZ(aYPD<5iorJ;c=oizI60fuc~oOGwF4SIX7 zcrM$xv16L#n&R1~2rfEG<1&=nI^fPP)CklcXme}8*8Q~!prf3S$PF;T&lKQ6@G{lL zf?drfGGFFkr@<%3)FRF@(J%*XLn%XtSRhvJO;!hwb+|Y}>{d-j^HOu=16Mj&ah$2C zTKGPwBy0DO?X-SV8O&NB!-hHVVk`R3A ziSpTbFh@{h;r^%)NuX5Gl<4SH z^{THdEuYbu_%#72V+h6}>eI&g(PzE~#x#x^4MJtu>R{MI70M*Bt-pat1eYUx)D*O@ zY6)M`pv^(*a8&PIZuv5qJ$^s7aUqiZ%V$AJ2}x>UHZ#t`00bKD!r#t2?G#OfhS3s^ zrI9t@pBnn_fR(Q+{~vzEp~18blQaT^$k$&$pkDn1YmSTq>D2DwRl)n455$nyiNgNG z5X0}oDSnPm=GhYkqTq}8d0%rQ#?W@UVf4JVESjuaB2peW`SI zKLJ9=laK}|N6g;d@*06O%zQ21C_yl0d!LJN>qdm~G-tQn>xSNWpJyr3CBFh5{W7$S zy!VZOrPBO`WJcQBujDV5$i1XLHWK!Iu2Tu!q#98alu3QKQHrA1E%7lSN!Q)Pp5FQ- z_3fV5Kk$O2P6N5qZ}Cb(kjCbEU~rryN&O7T({uHu2qJ_*Xf*(&g&bnZA7ambU6pd{T?l*b;EP3GA*#kt|Xaf)T zs*eDXOnlqU1-~{Njnkf+Y1h1UX{Idaj1J{kCl#LTO6Rq-)vfU!Js&?lZf>1UgT+GF zu|#$H_L|n^3VmAp+9*~0Y86c16;l&$5p8_ZfjATXIxS*=;J;&7Np-AH6@RvKMpGaz z6AR4AWIU5ml2Jg|%Qaob$a%z=;P!|we|x77^zSS%ztaAcI2^aBLq>`Z85B^QcVvs7 zlfAB*mF}9wQ(2A}?uv=QRb07Vjvv zZ!WN`_4?7bakop&k(e8p{s=iZgXh|6>`91qq!4KYYgeUTT0ikHf@JK`kmSvfQf4le5vHe{0vCdzI34*lY0OLwABkJq4_oS zSD4TFju}t3m?C`ccq7Vyj~e;Rvn5^ft&;F-37?fL8}QmLT(aJggbTUMkv{UGeN1k1 z{)cBP+OSk)eYJAqZej~xl4yMrq0~{;VBAkrg~MsOU!VT-ha>}PM4^q<&Y$pE1QJr+ zQ7v-pjDMatL5bwajmoGg7v5%17CpE}IgpXoNF)1^Yw)6^-GT>zKa@IAI7(3HMO5}s zxZE3a!E8$9zdQWse$ znMWkUOj~zuAo0#4J9BOI5K5K8W`blA)%O#WbDGl1PUT0=@KgH00b_7L#)A8|DaX;- z%}amn2~F{y`QLb3t1o9muIA5eG@twXL;7oqG?h{N+$!0<+TrQMs9}JBjFG>kqgZ4p zC^FeXdqm>$g+zP4N0cm@lz-F=h>&0X>L>Vz_bgxF^4_G$O!4%HF#^QV+4%-CJ2GxQ zX0lvUkk^d?=f0=~Hm~d-CzQQ%oqQaDM~6Iif9FUN`c#Vv_I{r1T@Pv)jEck%yvigX z&k(J8&JsKzfe>*ib)8t~*j-qe(a}kJtJ9Pg0b#N+L5pUzMZIKTku9ub`f^jB3+FU- z&oJw4;obQpKt@mj zRN^R-ZA9K;Y*;S_q$ImOT;MIx-f!t0o1ZB*d;)^}rW^ zqF{l#+vyW4#}Jop;z4MsJYeEfPnt#*Q@pL<@x3N8 zzpdLYB->DY-8$MNbcTL2`1CN($o@cGb3f6XDiy8eQ@@TYqpi_5~zip+wD7=1OICq~SD|g&5;zK^>gx(^TcW@)~6FA|!_1GLm%A#xB zoUI(Xo9olm|Ck*rN4vM;OIWpt|2|lFp%sL!-AJ zM|T54Fgl*=d}*=#GpY1Xcz*W&U5}6khm%-!tUO9&x-b7IIV8E4dGx_W#V!0mU8eA6e9C3`9 zRvHqsr0quV5+sjsGrT8jj|R9lWnp_xNPp+Gy;>D8zS`k#@jd4)JJnvW@6D|g1Zovj z4r}z1GjOA7k^bmOs3Mp|3;f%8OhZGAy==rqGhm3>T@&~IHW-~q9mT?wAOv(71z!F#&&SzaD({`|1;B>V&{1Il56Ej zl9@H$GCeAAOTyYRF5P|t+7R~f;Mb@)EM%sp1qcYT3z@Jyws^0#w7GHCevACpd|0j( zWv&&cDR=pgY3NX7=%gWjV?@5Bxgc3V-gX&S-EQXkAgOSez)Wy~#WZOj8#b6NwNa-1$n$jEpwF~Xe- z_dPTn-i(C}b4OVSQ$cM5=oHKWVb$0lOb=?Y%#UE6LrGZ z889Y!SfQ`b^28}kdmO&6x0~$MBv^d9sE`kVBZB0{P(0xQRV#_xzk?n8%j-drqvO>? zsPm;1lePWct43dyY<*&># z5-t1ZP%!_MNG20LWU8q~l0Iy(EcbaHm)R9T^IFQ1~=EyNknDg?=@f z{}bq<{`IB3fHEkeP=Ln9{%`3=ASHWedblARJO^0}JeeB2uA2)eR3t(sf>iK@Q%53? z4|WNaW|A*>vmxDTyFpW@c-r5Sq9lmm=9=~J7~nVD?$h!ugHZy=#EbALL0dxgP{@=q zgmsW-XDN&BcOVK8QJK)K*45v&JrcU!=gMQV_qEiD88_F3wZKcw%3=WbMkEIDAndb@ zTcE+P;VB%VWni!&)<3RtMr5KXrSaq?$zrRXR|&g5DO6xUdx_ndBndTAC0V2?Ws(Dy z_oj9!GD0roi5UfHmq-J$7yv||@g(7ZYLOk79XjOS+5};#u5s2$G%(O&I{K}KO7JW_ zS^h_>A*s7El#I0e&Je6a3LXpfFK=u{m9ZQOU@a&*Q73(Dav5K_c})l;eU;7Fi-rBQ z^fnk&3t`5j@(^oHRrm{dk{hXBV~>098ADF3c8Kn;c~;F1n;#S1ss24bN2*vFu=0&f zY7AEmc`<(Unkk-=!tYwsvFpv<{QCR7;rE^kM^_mPO~aRM6JsdX{O0KT(amM(kS?D6 z?oHHj{$0@Z1#KO`sc>f^(fb>v@S;WBQs7e0xl#Y+axpUOt)@9`w_{>Q`ys%LEt(vH zAMksUf&mw#gL&)j>i%7zW>+(Oyo9xKSuTsMxpKWF1;MNzC~5joBPu$~Jn@{GR_cN< zXSb~Wl#XW^of{VvbcrKw4_@~}P=4yxwdf{==8&aMW8(I2f9&UdjG6~FPv@C-HuVtQ zIA+iVZV93g#LTxJd&=!uNf*YMD15wIUqFiR zOvgJ`-VeTgn7?;@dyzlp*P*}?tk+#Kkvczf1I55p&Y)^Ks@A4Llyb z!Fzxc&=Q7*7(E~po*^a?T9j^tpsN3c5DtbtQO2uHqSPeD;-TcqG?3Ry9(Z8li9338 z87eJ34siXg$o2k~YtAQ3P2Ag9bSz0ZR9{55+%q|z;>sgz^-3_YxZjI%N~!dODXU`o z$K-5!4ktTWU0Q+bZ$4V)ERlo?c>Ql#gC(V-{XyM*N|uW_Em-EU;2VwU08|X`(j{t& zlJ8(!VC&!^KM4Ldt5yfz`pUrh6wPLaH+FH8k-zw+z3YL#{XW~^IHOR~63++CydYKs zC8O#ZGzU*YHVU0JFH$?aLA>it5Kg@k+X(tjljtJMjM;{!mUOLsMTFx|*nwBVrNB*( za-6;PpgE-R5>hIa!Jcn^XM%j7*~IDqF?#&g!d{h}^L-X3ToVH2_}s*-9B^u!CSsl9 zINNjPs57D-?xncD&-&ykn1!6i6$W+?a)UtJdMrl0N8^z(Ew(EAZeIb3S8H8qqOOsH zkn0jJip8QW*=s#=wW~dbMHnzr2wDCq?A3<}e^% z!wv@_;vcoDpZ%7Nwyfa|j9p9ogj6X5k3uL6Z7;-+;1NYfA58kYLQ+^#R1y(#G?)&r zmgM#p2eJac;K5H#(lwLxN0Ee>2Q~B)3C@R#bhCj|xgVOI zO)t0zUJwrnN((9>>0y1MeMKU@2v_ES*7uB=Ci$2o5|*Y+m>PHm{+jqPnd`be=IahP zdkY)axDhEj!J|Ivt5I{KRfUKFPddHYRC`3JfkatqA`F)RVGL8eT!cjO{L#eULJ9Z@ z-3lU$Au)E00p>7jjZ#j)ei*Jfn3aLVm^{)SiwR@X=Q!!?AZ_`X*F`_~Bl^-M=Epgp z>XB%m**WFVlHui`XbHXs1{RNDAowB-O^scg1_bNxFkH~mJWgKY&OU1XD^#wipnIx)vd$Mht2dEa> z-XJx6&}@Yz&D_!pW=*=5C^Y|ogidMmqMO$DY6{tfheJDnVJSJaPxcrIxs3-&7px|O z2Zd^-8*6n|A*w50b$oh{PWSJ1E|%rHWi!}UU67bz9DlHCHn^_YWKli)2cBzWec<%Y zcq+BSw>>R4Ahh^fIZ7aJO8?@1ED*pSA90Ds)%Wt@Gu4vxG87bl@u|z^5!_`xUv(su zRwX?xX?C{n^x?sECMc5BA1vYyHFkuqOoY!7KYP7-;dP@`2Op3nqNx0@Y2&=r|L!Id z0Hyj$-*YI5{a`=ykHcGkJ$Rf!tG3&Y1Zz;4{#9H%9)E)sg(83Sk$aq)!FO( z0X1lqHn1h7}RvOUge#sK&H>z-~@m3cbN zfWFZ#Ep@|LlIK;L>pJ`b_u&;pUhrosI>&`&Tog~_&S_52s$os(t64^PfuXIjZcRoJ zC$g&Ch6lebV=$L)gCtxBVsjJSyz>dCnDp;%BPsCD?CmB zmfn1r6~Vl_cs=DGYlL>XxHGQmgw^FFRLg{+KAw;4J?L3hW#^lY6Cuqw;F%{$x|=(s z4AdOj@}(~!zHdLwl-F&>+uIL5yYH=jqKksWYNmqv#ogRzc{-nz6J{Z8^1^?z%EP@SQX~pGzRQbFCJzJ5g}lE7 zeg}TYM?Gyx&NAe$LFdP`@h-v|F#Sf+n}VKLzO zVOsm_da}~M*B?IsATW07ZK}p|r0VaqPSEDrfQ{;R2CP*vMrkB}!k% zUlJ>5=>{k9@u_{@DQ7(StmE!sDM)$m$NAp9@cHM)-}poDa`!33^Z9f1;6}0*L;X#NJ-GT+5hw^|G~u};;cgNFudztn5yw=51^q* zg)L|wx*`;XzWlhJp;@Ty{H*ZBFDhesLWMb+|; zF_vA%8v;-n9QKw6-)lVn6iH^$vf4gL48FRG5Vq(aBe831(?Cr(6kl<)4&J|~lTKf?@ z8`W9g#8neK@9IhvT$cjY0?)hrbA|xmBt1%0Z66AZ4HnVaD5T76aggjFc$bA{l(;f6 zc|kH1k9p|k0Rc04pTU}l;bL*3iD7Kn)G}MG&F2w&2U~vPX|58TXPHKcF6LXE50Hsr zHWT{r3HwyuttI_FIEppY-an8Rz;{9N|LyVoYPJ7^kVC-v6YWf@2L!}4pf@E&DYst) z32g#m66nwzN}{%iiDfj;EOVq9Iwz9DpEG6&Yg$Mwf#&_Yb9X*Q=1rDgje!o2T>naC zp54igTc&)mTE}bM>+d*1uAC>oy2F=6O{r1Zq*Lz6%{|JFXIaKpZ3HdztofuwKN`f0 z+;Tr46&6Og*vY`8m!wt6^I?*d2th_f3T33aDWC=r`!>leE{P$9W5MBS<*fP~g->g4 zY;wlCx5HMZAQj;AgX0w8pz>YX;#sav@4{~>=g0}S8*2DPkalDL%HEZrOCsbmt16DA z+d#9^I%YwTBFD|EZNWK4LqQloVT)h9%mMqCw21com+tt@h9Lf#f8E7J&Ya5CjC?>e z&t5qL$CaV4eDZUgKE>X7DFR%Cg%$|G$wd}t=B2J_F>a^vCx3VgYZU9v_j(rzKJdU- zv_taiZ1YDqH~BhpBRgNn!ep>K;xy>@F6TB+)*Yujci-+3Zb+{qz2+M^Tua2#5m3V$DX!U-$iw@W$gJs9+buw1Wq2 z!Ip^IzxSK6IIWd$Ac98*asma33+r3?yN_8_O8Kh4?;e*y-TLIbF<4#6Fx<`U=1KWJ zrLnfQqz2;Om_6*5DYUN7wHW7!O;2C#U5dX~RSOCihV@q6ezok43IG_E*=JHnlWZ+A z!VQX2jC;HjePZD>RP)G!L=i*Z7I5NkLM;Z#N+t#9c z*H?(zvux1N*&!f$wC8JJH6^5MR-diA&T?@f{%lT%Dr)|F#5JT0+JMQ%_=ca+)Mlw5 zc>i>?+y7G!Ls3s})^J4#`_|m5=dK4r-~$4&4FUqV#d_CoYI`PzdGidghq^W*4~^5NMOEnH0z|uMBbkSk51)c z8?S9jMm5)soL__;I3KA}nO#W50#Ho99Ai}fD#7x;N%uPXN+?nod2T43gwNbaX<&pY zSB^~*2bN`;<0Rc%8J!nQY0#*p9wx@M$n|EGRFTKlZuagY-wbWx43G*o@8Wtrue30Z zyj9n~yOn#_daJSh*%+)!KUuCsSKP2wmS>KspRwgw)slT-wv@WIv4i=xt;D?A` zZuE!bD*|ge#_V5Wxs}=)Q+Z~1k|05eldk_fo;yF_!%b|>PW6xx`)gJIX@}fhnNwl4 zE{XOhHEDDIu6J+W#L=SWhD`h|vPFL1yClms?L#Ya^rp&A41&bT@6qP|qH|s!+vbFE z9}rR`V?=?8cAs|C>_+}zBm`CC=mrlaMosdqv)Rp*1mrwA`}@p8rs!1H!Q{e~$L$PB zY2qS~lFS7~87LG06#jLdu8GtbtqE>CKniLigF?iNIYuhti4`z4LAG!I``b(evPr&B zU4lz;B&-++i8*ovS~Nrg75^c*EM-l-BM`5}!S5g^aD0>WG2>fHmzChx17P$E3_e!U z3R+tq-fV5 z8t3lt=SlymXSTAY^x|*t%(8MXBjXZ3Iez(P|Nep<*YzqoW4a7klL3%_gt7mD%lUT) z@SkWC$h=HgAG1%+=kD>XikF+dYUga{mkL9MHG5Taarf~nc+@6vPUS)9Sw8#-iS`M-AxwvvUk@-kd*G9$-Dl;L%}oC^J3 zP4%f$@~DN>&4RP%rdhZC)8rPv)P`AT>hX z;bfUoWRfad6i%ps?jjSxn?-|&>*s-85N4*!h?Y^Pa=9`Rf%(=;46~1gaRZtjkdKrC zYw9ZZ1_F-3-z`oTv@VOv{3drx6cq20Nr4O^RbY}7ER>CwWJ=;rG9xTuVr{wB;^$aO`Rl{nZ4J&(f7%M6BsG2ewRyj5 z2xSdW9fuZSYqoED7cGBFdTh*|l5aAe^Co0Yf)&7uADQXMj>maaZlz*2Z-IHM?qt18 zDXq*xE0STcub1U0w_4I!u}}pk5#DVRR7^Ta`bm~u=BYHwAYMh99V<&a3{<9OF^4&~N*s3BRbv*rRR!)|j&lY1AQid36@_AQNrMiA z?_cjDt8*o6zZhYqe`L+A#Eyvryx-670r}(EE~;``gCp4?05}3{Vnh>)tjV^xv$e1+ zWj5v)BBqZIXk~w)U9I1OxgfcO4sBWbcep$vo zkugv!Q64wFG{sCg4_iTuGzf;e*3(=g3D%z7Cuzv1B<<$-z}@!@LxW4R`1+p${||5q z&X?L?xLg{J^mPw}s~hB4Iv$86R@h4}azo<|V|X*r3LN!pSq$+*dRmWjKOpm2%^2^Z0Ij{ro~p%S8Pxb8N7vd@&q1LXs<)JK zfZ-qhqdV`4NRjEw%gvEhU_wN_!?SsjeHmi+d1Bu3D-Dd*2W$Nt4$q|Wzx2yvux}40 zG$qQS%;~$2eNg(Nxz+^L(~F`ICz#6O#!QjTSCIrCmXSYoUL}|KFV=CRc)z)~el`Lq zK3i@MdbEs53QR?kkRmdFHIkaJ%m*?5(bS_<29b#(ipB@i^je5uiZ|Fuf|iTRL6PIB zIwq5aTta4&9lf>j#9}$u3|T@70erBDL@Pn{7>^c7%Y#J=S5SWWor_(yoJNzEl#k=x zTq9#R7dVI+zmHyyouieEPZi`A!J}bP4!Na($i=_q#uZ4O|7B@tqr1};`}{j7$i4r~ zSLs|46mG;{{qby=8160S_Y`616rrerZ?l`cgBspZIc6xrOZ-9e57tR94n7!+ZUZ=mj8*GW(uAQ+Bp%H$DvBH(x{ z*o~e^h*m+OW!erHcOOqbn(!|I%n&9a38w!!zttY6(_CM$ z`s2&O0O(QJSXu)Bnhi~=7k@~t7RE2g8Sf=5hBxNAWRpM1UJBB(cEwDhl`OGxp)psWx0|w|QxT#8l&yj)!?YGM%9E~J#RomU zD)axtYB_YsuT=SGD1;FAoS>f;lTbH*WoO|Vz}Rhom$C@@9pRCfAR?a_U)N2>b@YHM zLg4klNS~%dkr34}3I)BBJHCiWjW~J>X@3dEMF30cUf1?%irz)YmZH|xdiL+fpU(mm zT&+PZvrpUu7Eo^TU|4_pws*q%`cl6+lU~*X?OQ+K>zU<5FQ1TYxjMQ-VFKyI(r@o5 zLm69_BIEQz=P|AhG)vV-8LK(H-RC5~=SOyVw7qWINt~=xKIIMSw#f4ATfCz6go~ z5t0^6rX~ndDtyT78A>3w4)C-%Wm)r}KLZRluLNyu;5F8K^xxkwk4*x<} z?DAGhNOt7kpvTL&<0rjce+7Io8$OOpBLQ6mi6b{y4LpB?a92ETUM@P!N?SDPcjP;@ z3UA{>6XsKELZDU@Q2)+xPW|TZUKL>+bX^cE66?n4;;NGm)cj5+CiN-%IUae=MYfgZ zu_!vE$t1z%Ku$e<{rhhh4<|@taVL_0qY~`yxo;{w^-H-hZ>|t)>btTe3Hm|EOtxc) zdAf;IiL!OEuk=tnFWg|YJaCcFIxEM&??ABGfousvPTf4$8C_#0D6|$recLC)neFRC zHd?2ynR$WVq*ODiygS>pw}?!o$=p+(GuKJn?K&4Lr-(!PE@Pk$Cl+6cPz|VpWmZS@#R#(w5*$KTK?$<)Wh-zhA28e z=Iu_C7am}V-jsB(T=<=pdMP!kSEw{S5J^!SO%bL>0;f&*KxIS9HKQ2?qUWn<{}+Vj zDmQ=&4Ad21OXhI1iL2N`MBC7CWr zjEp9}BsuB4vzS9V2`Aa!l4mbbc9M1CZCd50(155<0XJG_p)87q{kG zImXeCPV2$OF<7s~Qas&d3>k%{qmm>B33SBq0#f2CNz;x{tSeICGK17*i!}|pu58DD${dn z5Ns0+YD?Q+>-|3gLlk+jiC+ISkB{^3cm9Gky7#${f6l7Otz7@GIzL@iyY9}#*<8iG ze{9aa-|gyaXWqA7iUxrW%LzGrZ2GN!P0AHYWdEH}rV?(}sXjO@t)?cRVp(Gu-7?Y( z?OxGzp7v9LjobcBum3D8>)9LUTF^*kP#K8}@pFD)L937U05hrQvjUbV25tIz978{y zo>73X?tVFh!Yxrd0)tL_iznz5troGls{i#;u{~`=1G%*E$ap#4%3&q^^|O&%P>}Z< zQFP|;?Q7x#3A0q_+wWM+)v6cEt-RJ1-;Bo>?_G*Dgi&w}YEABa1#Az(mYwGb4U?Va z@DO=Wo{DTlzyOaoT&lngAsopQ0WK0~ zO1l?DkfigXsUYL;!M&N<=CI`7ktC7zFS*F%dy*9G@(uDylobZX;wuajLs^Kw&ZgIM zr2-l{SwxeDZQ>Jc{8bWeRoRs^GQdsNDYZOdoPh(iA|cYiWKv)vU4E`tT^}HLxU?gT zr&Eu!$0@^^zDkH%rqS>j4&jFvRY$Pf!6mSzF8%z;`GT9mj zs!8PpFd#}8wgpJ`B&f-x5-b#ugd;Pt1)HJr$(5EGdgQv70xSv*5`7BY?u)1#`#k8m z;mP38xzK{R;WY(Z$zm*v+>$QNk+GIWPTGVSNc%=-4#@JNDAl^u3HS*;q=ycmp;kR6xmt+&5cuD7H8SAml%K^mP*?YHLrK@`xxmPPuV1mtc@aKYbfyUE_^#0pwavqM~JABQm5(IR(l``UH`8jNJ6C+)yz&92vHba`I0 zUlYMb^VKbZ3xrFz-EYS~PAh#|DNOaHU8p~y!!tzYC=2|DSu_UsE(rVS;=EP-$7@?_ znqa{9BXOD+F&F)QcCL zY)DGzdzg1&AoQ2c`HjHv=qk1aD3VAIcSt8~%H4p0`AGP6hI(2?P7ClI%gpYhsLaz^ z^1E2jf6!Y&JuFj)TFGfq==f9WXbq<-E3h$f58$`fnc$H`K3n7A-qQ|T(sOI(88AB@ z9H_vyypL=|U#(Z(@CA0!S8`xSSWr5}`2J~gZqG9}TO!qVX6C(*wssb}rS#;vL-4hg zaHkCR4Ri4= _Je^yms8z0B2KQIFX~bnGo>A{Yx!#QXsmHQ7?$ckvQx3JsBKD}F zt+=w8Fvs@Sa8{7!aH%`S`_9I(AxrjyzNE+#gS_#B<5f9-PqW^-u^gt*VIGnJHkycK zp~^ehB=G4#U2emvHQCZ_2yMS6O34B2iT0*sM$mV*>yGx@!}?a8&(V3;-TBtgYt4!s z?p}d!YBLn|43Vp1r%isCKfqz7sbtDk5?4tP9V4|QL4f^5KVd;k(MdaVHnfHVX1$yBbXFiB>ru#`5vLSw~ZPOk4Vg$1f1?mns#vVIm=CW3SJ(0s9eFPQ*tIp zo!|>&c+4P#_6UfJ{R+I{Dnw%mVc`RbRVR^lo&Y+_VMsgY48M~2Wc^A!Sz+P-S(LcF zew?N|m2}vC>(hRMh%gzk#|0$7j^5u@r9$en0E}c&8Ny&-L+_?hCHWeO#KoIUhZYp0 zR@O^$BNKuNh@xkL!D8-P5jo1qU?L80kLg9l)?@M5*YkgnlYKaMuMKI?ochP!8S-5dd0tg!=!K~uumt| zwM?s)?8~yN{^jVqe&JxYg>f%8J*EzsM?)&Jf4evL+y!4~#Lj7v_9__J^M@MrT^y{C z%zagJS{tX3{AOblRkAmk>G+R&Msm%A4Wx(T??Z|is;M!Ho9H=@#@J{WJWLkIV>47q z{NKf!nNeyTpC9eU{!*x%#ml+@ARuf651lJVAMi=@qXeQlu4UPZ(>%)0bGK*c=1G2QMmGyqoAWYVL}Rlri}cX z8uq_9O#gH+|G~W>%HwzyH%0%jZ>KX^?WWe!XW*o8 z+WHgY>UMJ^z~H3g7Q_WY>jR24A1(%@hv0UcEh-eR5udJvak5Os6zK^jLoQ?Cc;2r6 z8fse0{{jJ>g+#`cm>QvQy^26@8}uIz-^WCYJ=KZLQ z36C8ts>BvD!QrA@XxL$a4~}?~dn*nPV#XRLQA!X2;E;DfCrm087C@;uAN_?M;2i4q zmQo8A3r?tTLZZI5Tw%ilQw|W1hb~pa2pz7ke6Sf)W|{AZnfwK-b^DtyJ!= zZh4t(FOCiVOl`Fhw-;tzN_txxpn67gJ`>rP7C6;4+;UWNwjQ%Ovyw;Xh*$f z>ES0M3~eRA`wbQi(X=-;I(Q`9N>XGpE@v%GOw=7G1vO4#EqS0R-Fanzb$+LE=5fKi zEr|x9Wy3<=AvJk}{9JQ*ZI+OV#+JY6^QZZqUz=pY&DVIDblY9riEh%~!AfpR}LHYL^OBY_VX2{A8+siD3vfFBkLG&z(=0ilYSBRQIDg zYbe_U@uZV1Vs6~G+;5(E`6ExPQ)0iRCt)123+M!(QvqU6^DI0Q#JDOW{rM8uBU9Th zGV39{*x+0blC)q5z^CxQQSz$?|J0<& zzgfY%W>WSn3NbSIv7ZI5YD_5{#|X}e>{rYpd04y+9(lB!^8AWZ%FeB8%wY#>mfcx_ zLF2|C;Ac@8W(sDSSDauVAK|p*TBMOoKIX=M{kuuBpO~XBaM6s@fEIg&AQ`iEfuQs9w1Jc6Mwzn_Z&W)^#U^dE1I&83n$QXxZ1uvZlo;H4hml z#TtCvV!WHodMGvyNm!pv%XGQO=jS>b&A^NRXmDsy=p+3WTb*vS{r7RBZog6fcb2oC zu$z(=e;$9{`MwEL7t4)3=o-8B>lE}%OO8BtJ3k>3M?l%r?U%3C(h>YMV1=P#%1Gz~ zog2k%RY#cebkR~tx1b_gm^(J~Sw8mCvz{7)VvZ^&D%X(3M7}NcRw>D_&$Io?8>d#> zR1R1IhCV}#7{1D5DmP>JY|jF3{H*CzbD=%E-5px@IMa*$zLxEOV~emjtCC&F5yHR> z3$dt#pz;X)QI@NHj_}%VO55+2SheHVE4LBg5=UZ+Ow~zyJ&L0=!Y3rqP(UqdnH;dR z?A}v?048JsZMV=4$l82g&t3235kGvqxj!V~a=911S^+TAleUaeF4?0l%F8g!-3Lb0 zNWGlBt7Oh~Lk!ojNiBNI*jST_@|6W$NLQ@hw_}MQ@i`9W%m-9n^OCB8vHHGILZoUU zs;ca#t}sX*OrO|Vm6vzs%6#}O=B59vrfV*)od5$5_oPtfIEbMn`peUImCPquMXx|g4l z>6Tq`lxj)K{?U1I7S}_=q6^@qEatBY-USOiWJQB$01{oH!}xf^ygU!Y?n{GONQe3~V1fmY#D9%bSYG7!2gzGP1Wg$IL)(ND7d{yV7=Z$M{rB%{q zCFUO{grsBHCI-MEMU8*ahgOzkwp|+lCs->ff1R$imyu!c>ezxqn*6q4>TmlhZbWm# zd8w$_xE-x$o4L(7GJGROBC^!&VIFpqTM-6%YE{zGN|?-~=%R43p(Alfq@+}ghH-79 zO_N$KFwf@mXp2biefP##ldvK3e28mmj1#i3KB?7MjV5kH+# zN1{!iW^zJTC%Nw(BN<%l5)vjL*F-Yl+XsPDI6<7$(u%}jvFXq$L98T}Z>p|N^tb4& zC<>{ROojJ>%Ii*ek$LQn8hMk3mI&=ZIwTCHM5?!bWWoY}iaw_R~Fm(A`Ywj`^iCDwUdb=45bXOcb72 zh)4z#D9r%3j0t0+vd3Vt;}&}|J)SB4Vw7GnG*urstw?yls<%`UVE>9T;r&EKN_P|?^X4*=WbI)k3gk}Ja!r~b?0^CJAxdQ9vBeU`>z7`E7829 zZ5r%%XD7Xav*g+>B;4$mT{)Qify0FS*yN&rFs4D8i7{YyyZkH_T~={{PR9Gh1XSG` zB$H*KN!6DvUaAj`cA}!35zEexVqAq0mA*{W%MdIK0E-%@;?#C)baj?Ok-PRtWhGZ3H`nfZI z3fIW&|MnaZ#Etq}IcWJUSuB9|s)ntTf)N;lYf6}fs0`BRr<7NeN)$Iz`aEnv@;hdUB3T_cL5KpiwS(&W}ZS<=SU${anQ|gDLm2}Zs zR8HZJJJ)W-;hCmEQnaijEw6GPTyi-7n>5dHLtbN8C^j9T6t?|cR)_^uKJjD{RHq{r zUu8}K&OeV~fY!ncJ8(80VG?nTYW2;!PxZxRHr_9yZGG|eXft0+|8m{$l79T><>dOH z3tHmw0Ckl?!RbkwlISUh7L^1q*jL`pLuyLchQ!DUCV4uiBNrx!ZlUfH2k0mg8?OZI^W3j*JTzKxnGRcM{0hwg z6BxB1b-4-u|QGS6*9tzX|5agf?is?EE;>C%-p3nNQvSxCi4?Z+T z+X&ghIT#ux_A3a2@gIbwO9M*_e8K%Ak;@8xY0AKfD&O-*97HR#WXCNe82+L9V!|cK ze~xh$cOxclT?&yhy=nSfM0C(r*FbRX^SwOcbBWD2BI)5#DJ}eJ8rsGhbkHn=B8R@3 z&>%)IuL2fyKw|;Z8X})e;`Mi0Sh5$3Qfb@SyEjw>`Ka9r6rytq^cu7hZmID=x4!(3{(gBCJmI>pAGW8 z$OE-@uFxTXR@a?Il>3PvBTjM7dtR@wUo4?ewprmgE@~D@G88TkX45bRu~*@R90=Ma zWJ1X@ZbFEZB}0@DNld-t)a{{;D{i5KBX*$NunrppgzM;0CwG^%P=iYIJ;xc&;j&Io z91KA)&wiwC4Zh`yoed<*GRjQqcQC>t=Lra-&LVTuw923;PTozc$qJ+E&RSryUnQ{> z^8|u=W=+DJbG7p%at@46ek9yn_rv%oWn;=C6~eh-vl10~ckIFP$U92I)eIEtw?24R z$X>Y+#KKfTV46IoL4T~>-YdtReqj-ma!1ZZZwJ>K+#3Y;Z=`~v{*I{|P` z%Vma56F7zp#~I}W&>u(#)+5ZrPa2DITAHr=tWo@1DrVVo38y|o9VKO`|KuPl_pHvg+t3WAxWsYwmJ{2g?bt@lCNb*TSns@3G z9gg3;VZ`JZuty9#U@o}BsTx)b5q|T)1#UDmK+wE8TY2jxiFWjm6GRBEzzB?*Lmm~5 z@`F<&06|FqE8$$#uMyG%`~sI<+v~A3kh83T5fCUal^{V!ctW%C7r+%@R2ULjv_k0f z4nCQb)cswR9}v*@%*7YzhF@zK-z?U>q9A!c+}~FLaK1NI5KWd2@x!RhZ;Y?~3<;Fh z88pXgOc|=#)e>HM*smA7p&j^}PrZY>cmH;YszFd7Ff+)*(>)deJjM=^Hp~lcPJ#eL zbXTH)UOpa!Ji++Jv&!?FF75hVdpmrzB#|)2^Vh;bA6~tE=Peo3l1e1<>1;3@EU6$m z1evd|pdLI~$X_9iJs^<10}X#7k06BRc7nMPuSr`)>L&Uotndl{klpUoK<&oTHI z>u4Z-c`FNaH;?Q3KX(BLEYMg=h>+gvN0cZQ{0ck~g|$|VZIOwuH9`@DilMbW8MCIJ z8t*jnhg^xryb4RXm#3%fTvFHdx#Tv{FaPALXw{`*FDxgN=P-DO9 zHn8WoCP4I4(xD%QTKJ{#Cy^IAx#>5{X;)aID<6lM;mCx46D^{q|a1ddi83h^|Q=qozbY-$uUvmw*6y!nlcCF z-IDDTa59R9T&icySjyOf-#}SEvn}b;!7IOxgDBH#T-TAp=ilBLZv_|Gcnn;{jt;5y z1o^6AUy0554yKnk9@DshB`zVGR`w$GQtn$=vX2k(6&2kj!n}CakqrL;BU9)y{^3(| zW_oA=w0n1L=jxIUT1em*Cux;ew4)9DF-`K@0Yzk>NKGZm@(bijOfHzAc=9>yDO@+m z@lfdYb99GXc;$T&DQPl>5JV9fUtP)q<4->eSmT;%V;N z4PD(PWq^cvt90B+^0g6Pg%|*U+Pz=#2cJ>v%U=ybp|1KNSszzI`HEyI(_?3om_O%8 z8_lB!i1@+b1dLOp1ix7VU${os=i~P`*|YUeiErtjpR_&P`uThX5Jseu1R+k*o+3g= z*5)@MK-2-cvC=o=6N{-O6zwz5-UDQncO1Vn7u}r^Tkn*6iLUsr;|a>_Ser$2J03(0 zw!T^m$g*oEcHTr^x3&Rar+V-aovGX_A76+KWS{h`E?nb_;F_v2=ilUTibVei?73zH zpWBnTOjs)Qi+Wy8xWbMvJNt65UEK0@x7KBS?_Eb!_AfsEzBGmhNC9DW!0Hfn-gsJY z(hzQ9=Q1y3Z_i|9HR91X4VCNtqFwhXBaAv~@Tu;-*T!qUD5<`jKlNUnVTxi%Fuh$9 z1CIt|-pM20Pe_bNE3FcCjW7>23bw{4L=X=}>^%Yp)SynNGJN!NceB37ArdJ&(m>xu z4yCzw8RZEmyhy7W>^fWRvS>L{Xza|7-Y43kdV(Q`L%+tXmwimz^mn zDx1B?zyTDRJ6gdq5e-#=Qbe(=w;KBWo9u+_E!P7ynK>WwdAg^5!WqEYv3cTJ+Kgb@ zGk-Zt@N6lgFJ?K9@i7|p2?a6T1N%GYO*JNj-=M)!S`BBWrcS}c1B`apETb|qx~6%Z zv*8kKXvVU&pCiR%oVT0UI&q65{DN9iW4g^zIZ+58EZojZvYlq8&xjXbj2dl+B+tt} z1df|!YYm7M6g*zscOa0E(#!hPT3B4J&Ph*yD|PhUJp2kr58vc6Kevg72UGw?4#lp_ zgX`wOYg6NFEk-1f8OwU-=Q;Ev(EkbZ_!;?cT!o)ZlOuy3b5=^EptS9Y_ieA`{fC9> zXf-PJ5~+=aaa>QJ;Tj$O$f`V_IXTEt@l}n3oa0bk)uXR$HWxZZap$m5-vf;h0v<5OZ$?-gPOd5GfO<=5t2hmsn^*JrI5LHF5)%_ckbU{&k* z2SWi4aztt~L}jQo4hCH^L%LKu7m-*ji2g`*`UEvZ>x^He(Dg^c&hQg2)k?~}qxqTP z@w>=wM3|tR$2v~?+@lK)_>8Tc*^%9#PvzIQbr*SuoCz4P*hg!L;GhLU!^6(+q~?&W6iTX>hv z!52M-*=GvBjxzH*zz=FqJ=ab4>`A+d_J_9;%WcbQK{32k2OotPF&HC8#lAWNa zUm}kQ=< zH=i1)a4TM$&v1}a%p6@)(e)SSHo{q#FW(-w&n~u%*Z{)Y(13k^H2h!43;)U#AeU#R zLWTUNw-#xre}`Gb}vTPq$yqWwsOxb-7P{m&OJEBp#TEM;e-J^ zqxr}csABcz(f9RfDIQl}EdxlG{k4QWHc4a{2?VD6YjWxVWhO|dA-7%uVqzwt!4gQu z5hp9_oJytPFE`>+TvO=WWdb&l2^JtoLxv^&x7-%T*_gK9L`b1jjNlviF>}*g_Dgew z>FiI<4Ngbo+G;d5jAWrdq(#L)d|`Qz*b1?%(_qAGNa5NU9lKER;>@ghg!Hf1QZ6YSqKy@zl4#gTh<6QGKS>7)8=6!(d)Zs<5{I+f$%(D) z-j@^vSqfkP9NbMWp3!$(GFF0X4i}2F0vys+m{X|=U#Bs>$gH*!7uD!XNu7M?ht+w-zwZnv?kP}_7Zm5sZ3^T64h%By<9l`MXqRR$hc#}0B zY%4`5tNXW$~WkxKkeb?5%6l%~T}2y|Er*Rrdz;4oK;VxW$vOoevPP zIKg_viZGZq8^{9{sL-{A*nLm)XpZ5yxqT`M5OE4eWOU{=A>tH}uv8K%YPopk$kWCe z_AcwX+N=igYT`%9o00@A!CERN-)XLL3b)FWH~QBi>cdLBle=EmxN?$xVf`BPsoa<# zj2mG)6;T|mUwGPAJb+^bgo&|A5RGbkyU)oc`!K3~pa2k|w@iNg8&F)r@ z1HpX?L~-E|@%@?!;qm);Eaw{85s(PZ^lYzaEq{Sy5=CIQ9Yg=3{M1%^14WT577q>d zMN0&hDC8NYX{A5UHA~w;9j7RYKAB+Mo3dxH`#sGJ;~4my3c4zP_O9;Ap3X^QeZ)#} z^q=J?b|-E6v9NwfM)%nxhw_LBUP0U;y*A$;Q>Klf@1fVN^V^tta1t&+J-3EhB$<4K zu+A){Ln>6|NE~6F8^$hIcgiD?jlEg8@G9-pkV_~X<#4YJ5MT7q=S zE)>37KcR;fd!4Brj0D3n#oj89q)3{{6z?1EvM0Wlb@FOuNaoEYS}_0A z7XSK=ni^S_8Rl-XGCq5dHEmqw+WEKO{(}wjV~?dtKn4W?__YElTVy=-D_A)4wxh;* zi@E|Ft^GlBft?~W$`4zmPiMSmphZ_a!OYXqV|p9MJn%25d|>#R$XTASd`0QeR#*vy zgfOw7Dt~vTw8DMcNz9fcv!Waw5_K1@dDLF^390UukMMG29x_x1OIogg)pi$#S( z6J=4X3)GmH`vDlIMZw712cei98B#SQi0r-hrt%Ca9Nh8Jia}taRNCK?Kpi`rQxGb{ z&Q)#3BMS&i66Be&d~^ZWn~4113-o@KLWm-O7WjepdE;KJ7+Maav<6N? z<`IUhWfW27dGIi}JpVgd)ZX%mWbdhlw+zvdqLYC#o$aLCBL46AKx2D;2B` zN6k&>pdfX)Y;ORtW__>UZUWl*S1_4j+??`aO3&vnTU=yZ*h_R45-1szq5AGgb zd;!2>6nz{EUEtM~R_@qUm^6YoiYiShhU$BMe*OOjpWx2=4e3t#PruW2>Y~Y&?WEOm zHuue82>_Tn0H9wV1v+hgvDaA1r@su_f=5D1y}KTRo!cl#F$lQs8;6cDLLLwzFjR%t zZFcPe&;|U1Ht*^T@g#d@iVJ@sJu*MH5J6dkljYo>oOu3E+F=SnWM!pFz-wgewvRXi4{{~u8VGzQG ziJUvm`&kA^hL6c7Jj`ougu1Y@EGjPQ01ip=l!IB<%yUJExW&hCl=tno*Qhz{Ch7{9 zE6R-Y1HXeWD)>s`_+KN8VZhON(qts|X`#Uy7zz@+8l3s06`oCZ92~A3Bq8?}jO{=@ z@`q=80M=7+!XyP&xPZ{KBxuYT(%vxC2}B4cNQ{M=PGJ~M9qHaIRsfkS<0>TgX8MO} z2*Q&JU-X$k9HjoYqI{xdzb9J(3qYa=Tr>J}*^3Mlht1L%TR)-nNR%Api;mV(TDBN7LHAF}=}FMW^2y!WrbW$Jbp% z{NaM7Uu|meh4#)#0FVGe8Mj~q@*tNvEe>Yb-UI)33+3g`itkEB+yE84QG9?b+%Zxj zsCZ_{^oaAD7%~l6>)#fybMZ!u*~34ca@m&UXwYdKU(hKHMMgUwdWB7RUf(O~vldom z@7cK_0iS=5$QF2F@Ulv)N{sV;fsDn;7(lt+q23Hoo7PvxiIvGA*kf1~R8y+?(8p3i z8rB>bkrsFha$wjoRv?k0I(sy@LSK?fZ$cqYUFI5EZj^C3qET28$6=2lVxwQFW9p<}n$+680!O3) zZ)h-LA|M0+3i7uDmvKz_K{90B5hz-)HJK83b$8ikLLnKa(gbYkwRkHH5}kW81GL3A zJ|0f<93~2a@k-N4*>aJ5Z=qh5WERF%^D2iV`ZlZsz;TYo8u!UMTwyDS!$76f`M)4C zG63f+9)kZ&o}abd|Ds>uK3AXT;frzK_GjGbqKE&?FnE0d`$Bu~z%v@Uk&SCI{V-mii_T!Cnr&0jZUv4n=9!fyt1bFCBM$QSMKX&aQq z@q?S|_j{Z&rA$?1>jy)EmLeO_2rQ~LaavU}y}Y3r&T9bYrKoiH52dt@B|>!USzsEV zv6&g@lWaCkJ{htPKnUxO+3hC2u5~&+{I%x|OH#|YU-aAS9>P02_+lqnl(7`<#jdwF znSMl5#Z_lM>?yWs#d>oLN;eREE?O!xd@d$*n^|Jfpj+Cr`DehNQovvfjRMEQ!cbGx zH3=&wa9G+ZzQqwBzYn7eJbCwa*VatIIm#WD@mvxj8{4W4?vf;5D@p8>yg-*84Hqnc z#($;7YwEj-p8H*-<~_7NH+u{-7wRA#(Y1O@HMUck@fGMATW{`2CsEkhFDuC3*Qf zb4#U$MNKCTpw;rNu4@+cR(7@ePPTn4H?wqFu}&mu^^#T|KwK zaRlGyxiG|dHIcHQiC`}^xSc7RQ8)SqnoDV zx|&nS8NKrSy5+WD@$WF1k62jMs+l$GuZgpG20Ro2VQ`20VR07|1HHPhH+nOne~OGh zOS=C_wD=M3&&YpZ1O64OVz6rdkLL-%ZqOYZmV9ytK%oWzKxX(!3Ohq38kG94Twna= z9g+{6SA*EWFco15Zg;%Id;-L1&m8h0FBM78muTFD=T1@{XoZ9{Ub2swF@oqqRNgFF zcn(egInjZ=akn9-kX_o-dWz2tL7)JoJnf#Ayb0($n3@9l;7k6+Z21tTj<9bZIr^$; zgrP!)H~$}rLSo%kWpL$8DvxWK4(D zIT}3TS~de(ALo)NiHrJ(rBnF~r9?<71MhP%*bL0F&E}i$EyB|l7#Ox?t*GB_pVI?z z)QmE+Ak+zSe(+(RW2Y1-akap{Z>){f;~?R9+WHld8V&;C)FPmv*SQrt_R4sVofa$F zo0>rR94KvrG=eZ;OWd8GdBSjGU(4CI(es91_u*ceMPSV%ZBlU!R)562mGLTtK0N_rzvk!F5v6(t76{y3jUXYf7e0Y~9dt_~g#P>WZ( zkcx~cKaxo~(75T|Tea~vgxS~W z8kk3*onBB}D_@XR%k-IF2@by}R&#`Q6IU?|>d&Cjcqz9qJK^xmr$H-I&95h_-5b5Z z4gNh;h2E@gwOwirY-!ap&s5EqF7&szyTx~h=u_-X5>u^Rssm8NdSS`<_rm1=Fa&;l zT#s5vfj?IP0DvV~X8=%)0RZHO-feci7VA60NGWjO)5Slm4+qZnN5=R@*4`5HFQE~GIC-=M+ie8 zf)8tKd7THjOdIwo$}eKXhylSn^;6bwj0Xv6^)*`gyZ(Dxym_N3oYW38$B=b+1xl7< zhzo3X7V`-_ynw;E?k6zo$Apd?h} zA$pleyCy4rpU<5oZq-LfjZPJxzxh_3X%!YV8RtUkdPlcYg+kx9e!K5@H;x!w)yRVjRWgt%NGeLu)kq<*YPEFRb{>4S8_3%m zxIcMxpFv{R7e4!N_a^seZY!!;A<;v_ckD-;Pcie@{ZzNZht_PId1qa}MwacbnnL6r zG_*lQp21mr+ZgL;Ot-1ykUAT8fUSdS+cfR)7p^?q=`XV5QL>I@9Ii31YM1GDR~Ffa zB|3*Vhxk=XE2+usq^)Mk8(WW(AcYFl|?Ev-FqG_(m`AIG7sR-rkn$C`@R&#TDIo%DRbcah7U)_%Zt3qbt4DDe_ZUk>1-hJlLC0-&9u<(^O02s_2I3V?cDq} zp9>du#a0Bl2tM-^f>k!A48$3ck1&O56}MXyq1UIM>j7Z@QR9ytkLQ0zs8F+2C!7-o zRk}WPzPx#U@~~ei(0I&Np4HmLqoVdi@fsC8hG-f`46g;gbjL%!N@)tEUrJ15S2uXB zZX4fuVrQ#gH}WwNhnDV38eAA1V$BF}|ARb@zVX$K>$eEuDqS(i3mdbPgCXWu4n zsp-xc^T#g%!QL)d5@<5tDr*1`1j$1=jfsi4vh}^*AZlrz)XxLZiz@7|EBO#AX)cbi zwl#_%J#4JHpZzGN3P7VRD{{H$q7KIV!10k{*_%9t9`2}GAAB#eVELQu<$(+rccPcr zRokO(MMJ&tvVJxAlcxs;rCms3L1~4|l4R9RZIO&g6>~>rFZYtV#U-Uvkru0YpU{;F zlv8nFcBOTQOkk;n^1<6UaaYfxkqZ%4;xOSpey}Y%FvMic+8$03lP9u8H z?fqS6F*&o<>VB)UKHX;e+SM-YJ*{PZIq%hpHnN(IT&5n@eNK}TyI6LT)_m1%7hcvZ zF_g)|ZT|#&G$muoRHR)QM^-fzjp0ux)evopsQcsfw1b+2=Q86H+|h8)Ln(Bs7g>b2 zX~b1^+*JSPbEdVW9%ncp{Ik#PXZ4e#SgjQ=&47dC#5#SgK;H0FXi%Z5;mhahTRX20 z?}jNugye<(zqUm`iu@0}#Lwz7Mv5vZbT>DL|K~Em`<`c1;Frzl5vo)Rl1vw)oqH*~ z*xN`lME@oO>p=yFc3=R0aD5@-?RF@nxufs~RTH?UvN@@9{PcsrxBJ5>9=>UqPJ{^J zNaeQ9h$$K70X+_LwA}6iz45`8&e_Hb{~#HetCauFXf=xH<9XxjduP}6Fns~L3Zu4O zFmj}R6q-qjJwGo5ho}P2FcV4O0mz+t9VbjIRy{-pay#T`p@o6?J^@lVcY^Yg@aNMM zep{d=GTvV3PJ#Zcgm9ol&}Z{Sd?Z95mhrZ5B$0`6oW>1)xtT~T45Jd7CNR&yo=5!$=Y0*CFrvS+IW;3PLH_wG`QTy@nSJAhZg+D zM2XS_Cz(v;Pi*Tg%6L2soY;AJjYh!v8g(j8H@&(;jt;J!0)GiKW{fdjMAi{h56-SB z)-VTVYcoMqrFicz5$j+oxQJ*tr5MlI;!_?nb8y4Y>B2(4uPq#g7yv%EEiVFU_=>`q zrx4j^F@1}!9UV;3G45=Y_Z9O;Jg?=8aS8xdAfwu8U1!U(^ioCxM53;7gj1`jCrX@3 zd5E+c-m&(V!nl$6m8w{9C7L{y-ZDi{Lme#zR2(K`z(9J?N)1`|Wvax&tVj#nnQ52@ zZ{(z6!I=mi3MVWB2O?sJ7;0NMN;vDwrD4hEHYY3xE3FhzXDc1WzZQv%$zZW-$;N?Uov*># znQ!4hr5W=(A-+H2`u~AM{L#XJ{A-XK!~b&&03PoC2nlZFbmJH9rt}vD8-`qj;~kz@ z12G48IQNxTv}00JuoU#cotF}c(YagaBCCLS(k}M$uXb}sU8@^wO8A2U8Qk0~Q7j*a zr;NRwh5#;r(26+vFcyrLUuA|bie`b5B>qh5B7)OpjmNcWQUv0}l{*p={^A6;<}8yG zzJEy(+tni+E?3H%pkb!^Nx;x}jjZzvDa2dIee7%Kd!}ViZ1;8hA~dA`WOFQ11u;h2 z_TBtN4k2n_J&4JGyp31!8p2Gii`Zpircs-oBfk*I$ZDpCj+~Nu~gp01dguUv%V3&$Z@WB+9njb z>PYc!Z5kVQuA{LU2iASg<1*`BZLr@ibsEnx8A23E!kD9k;wv-W(3@u1bxvD%PN08o zL7sF@s|X+x1i@Z6@5jgp5EOtyZ{gnIvCc;~)^yM$yI6dD6(@f;<9wV@f_`@zgIp5E z_^S`+LQPmwWH8;M`{Vmt@5hRq_0`iG=pP7xE6ZKCU$I2lAq_KC>YO&A*}kZIHB{wc zlQq{eZ+=*WV?=}8_#mI@-3kq>bEtSW&FJ~a-$5c-w1)Bx+6D^oj>}KYOspZr@flVd z&JF@ zU-t1VGBt%`AbWD+$j8;gl}k4n@V=YB63!xdEbBl==BXgIk*DCnYYcBlXIttW#*iT+W!GA^1p1z)<1@y zIj-Y&99ADW+7b_1aF?!OZn8Ok!}&x!CkK1?C3rZay-vXD(Anl)v&xqOk#5hSBLc=( z5p8EY$r@k4!yG}063JMG?L~%<@7J)v$JLq@H^*4Q^Y)oHH55Y0aW|;&x)8>zfGMf) z{t13i4zv~A2&e^jj1c5XW}m=n>!X=K2X9leoNjiNvUX56sDgKV5~Uh}1qYi%aHW;~ zOJnvrm96GZT7`=`$QsS-dzi+NAC<`kBpjkXjwose9X4c*YD34fDEqa1%%W~ADUo&2 zwH#KdR1YKN^WtfX*?WZfS9sjDiz{N!mfcI23x#Dp?DR+{TYYwXc!`VuxzJtLRFAr1 ztiOu1x^rN=@mzfhpelLkHjR&}&P}YL`@1Wfh-~)d>(3HY$S~O2m&ND~zCeGHr-IQX z*6`D#vzJBb)=I<8kL-S4jRybUVlDdLBSykh-#;7LpD%FKPrdD@3;vay5)CKzpXxBI zU8YxvU{HLR*Fh+>Z$mQXU#T-XGJ?)rB`|2OhD|_1NaKfgX!PX+2h*>~X(xCpxSyKD zH4(x2v>?*DZqk&OwB3b}9iNo;Zk{+VzIZyh|QJNjW=ZHenazWpB6 zbc}D9^zYRD>_RXEzf7VUR5QAMV%Nv)dju3gMk%^tL;6AmhkFhNp~RtqSSYk{sb&C% z$CGdci(wReo{7A9wEPk8==wlo*SEpg&pt@4x&Aa7u;*2V0YXVK0>)8intJ@>vz1gv zF!;Zf0MFL*48L4X%wAqOv{vip^0_ax`}obzK2(PBdfFUA`zHez7y-e(;}ATLV zUyV-CLa%0*_LJdc;F<}wh4Ux#Ok$PgN*ypse*l&CH>Y!OsV*b)_GxV3tLBKG$plEn zDl0GmP5NE8Qau#Yt)JcDOBRu>1?ws*Tqdp9w5?z8pfm6Rv|dCE<3M&RVH>gN)t|fN zI-#x7Oo9%Ii2P0kjVh6#IP2~wRU$&&GaL7dRHivN|`!a|LO!3b;IY?R98>c%FaL zuQui|OvFc3>TkG}cYg-+o_0PLwwJM^+rEKT@XYqsgi#pfJfdC3Bu~>JJtuH^f-dvEe>y#FFYBe3KV4V3j(53L z)4MEGG>RS`%p?myDaELFZEN|ao++njLcQjA2K{kc(> z+Gc-Jp?5W2EYlyA_#F18K}y&mwcc_>cTe|INAJ4P4SKabw_FCXfLEVhe}B}$yQqyk zIHcrGmsdF>*Nrar>^55AypIBv_ysG+^oP@sHhf9oB;B<0DAG89NGu-wm3V(|dv<~M z(hRWqG3sQXt?lqAGkj>Y(=Z&^Az&Bv_+n^no%g$|bLpY0x&I)RSS>v=6SuaomSUf^ zMU9j2cgd0cek;=fLp!qFNp#?tFFyX)ZeJ6VP^~E*p#^-*Lr|i}{vBq11mCPLu(Sym z^}}ikF~k+yb~a++H~1&tts&*bZmzc=&;wb^)>X{!z;oy{GMW?+?lOA#1qo zez;1e6$Wp4{OaR-!$;|;`Mt|y`m4F@RCZ@?qUYt7Q6Kh)fwaWq(8!xR8Iy^Z{Z*{u zENry)p(pdf>jM7$9pa?Wtu$kwGlHXv-^{mmQAM3j)Q$Y6CxZZBDPRb+;#pkRNu=pa z!4UrVR-N+A=XO5bB8_^;(T?VJ-$tuGoqmtE_Q1_E*Ot2cT18g<6A`@kO3M(-GOSJ6 z&!XQ>ORdLE_+W2DCa?$LZu{oULAG-MDD69)g}H-BRT0=D%lJj6ZozxMlkIzlhjqmP zWzS913vnOKJ{vu4Fp3k1cLxd4gj10PSLaTqvik8^$z$0 zd1fg$$X@cvU+Qd%gNap_Y*|xCS1~T08B;kV-E?-H>=Op6;9redhsTlXZy&#uvZU9f z@nHFe|GiyTm{iYDX4g6a=p?ANfLE@bAso=SvvrZ!@YJ5#4tFA$B^w%;hN( zWj&V9$$v*x_Fmw)yNe`ZhgwpxADybH7C)Y`TUnmb9tNJTo20%S&$~;$C`?=!?<3`F zS9y@sG?RssI`W|A#}Y&n1$hFpi@4>E+jJYiG&gutH`n1kT^ltl zg8gt#Z#oO_{#4{&XqylZy;RNW6+X}%ZL{Lrcq&O~{3;JO+$I7Gm-bOOxtOo&Xz%0{ ztKd-+lp0b?7T`JjOaANos&jWTt@%q`_^@x5L|t$AzDoVE7#`&3483t*`;*WV zi=XdO_oMdeysKkh@OfJQOR6fr(kP|GNuDHmjRb=sglah9rLYn}WytQau?=gP}Mo#K#6o@Pd|P<+&3nlyKPLj*miZo36bY zhbAs}P7a$GKGK~7e3^}|jqPd6`o&!=Y+47n_@Xj>LX%bSl|r8R^A&UsKI%DLl6_HF z67Po*q8V^CPx+Go6M#fc@CC(BzQ+*qNj+o?EG4j`Xz5eDzEQZ#6Ffs^D!#Ix{TcB! zFu2&(Ta3`rp-6jTy9{(J)4TFZt>!TxzwZ8!GOpSszvj5@ccn?ojyiuyY^<0Vz`tbs zvv~MVFauj%Q#qbzM*ElOq8YSAurI-&LkW#yOGOD~|jon23(XKJMX^lEcmZTlp-wUuLMW4F?laU?N#4aLWj>Lb z2?sn3XS~5Cu5THWv&Qd-sMDMPF$>yrFE6_LXMPS`=2XGvuNMqAxs^vSgDX7T0|bsM z!)e|0BaU%_-}(F4V!aGEtjcTsrFd!G_GX{HD<^3nOzQnw8w}T-50lR`ad=_J$qvqm zhjOMLp&mbn0=$>y$@4_IOJ&V$+@pwQ8EH61a^<&Cbzi3hppDYb*D%SwZ&BeN*k`tZ z`;ea8(ecQ(0oNSN-pw|IA-q!YkpA)PCe+dI6(D#fM;6eII{gneeOK+SoLtkd`LA|A z`(jh>eHF1+D={wn2-KFfVR= zMCrcEHxSeqV{#7UE_E`yc8Vz$LWe)&j^9lC>K}1N64)9(s>YR(@nP*7A4axdMJOVM z?xV_%9KXo!OXa+6xZCY?Zx6AuTH6t4t7BtY6E{oILJSZ!fNm5x^?Uy9A^T6R0xes$ zBNq$QpkU2R1vz>)=Hu1-Xa4mS8HnkWf3D&UIB;yY?YUzIgr5mQb~;f{Dbn$#ax&WV z4FxmEEOw@+0PTD*(Y(_^;CL&}1OFHS1jvp$iC#KlWUsg(m=rjW8Ba$Y(r!EqOo^=A zvt|VGOlztt{>RkgB@6=YEMItYV+9JPC4LFsLe{UTDIET-tdb+9)}~Mi-a3xp2|i&VN1a}25}`KL<(1}%DHTf*LrTmeejm~54DIi zKeCC~y45;QGd_E;-<6mRX%y_RDx2;P|JpB&{;<XIq(_^mQXI{WrAnwLGt}*=20s2}>v^No zShHp-i^RF@Ua?luP!@T1>;#cm;;^G*s>nybfbv|n_4QAaJ zOmZIC#xkjEB_Il}o*pHCD_59aEzauBoM}F>DQ~)N{ng);MR*f<$? zvbY+aUQKD0R#Rvu39f9sP((>Q93q)qx=_;n^-v4SBgNEK+_&}fQ2p<`i0a+k6@BWs zf5=UAkv5-0fm29=nA8H)PO-Wm!CHfXUyAPuQQZ*Y6GZF<1c%~w)8w%)t>VcZ`_5j3 zOouaZG@}LVKK_uV4h6NZ_Uh)sDcq?Tfn0%>Mi9Go2X-xjOd+PkfpN$%T*}6Y5OGOA znNNZP@7gg3NSQEk3S?CHas=v0jzEMAsBx2|FFnv9x8-*P7!GCOiRU~H%#U#e3U!H- z5^s;Jjg|J+CI(X1V?B8R76>tjFOOy2!0|%D0qGva z+DFt>5e-Z(G#6GM5+9FguWN3&nH}bzqNk#}*5VHzeJQ4tRpothWGRhZk~dJ~SXMZe zP#3?7DWj{Lput-`T_QbEOt9J)N+WSxE0t4YEyYDZplg+59*HfO(ztBc+@_@0-LC?a zR@`i^xk@xzt_Y!3w0ZMaxQrQ4X$ZW^BN`GL9kgeT9ul-0Os|}bfPyGUDn;$C6Vy1{ zKkCzd9U<3~E5|~St3h;}iP}H_m_tFUk6?;p)08r)6^#lGlt5ElmdFOQ#H3Eu zE4cg(C2S$0G%2z;E**pc0O;w#UQL1O+Mx2}&fKh%uxg)QX5fX_Mbh5`&I-K^ z02Idsq?cGk=Y9DWm1bZ-FGH({?lJE5!J`+cmJ9s=SDS}Bxu4@hq=C{;$?cl`lq8QM zLs#M*ee071t`9GOamCwFo@F@Y=3K*9LEs-9)iE6BMPy=%!U)tbo+YCM$v};_e(yYh zR1YnP!}OArOOh346b<+7C#F{o8ZIR@MiM^~ab3*8RNyP0>Pv)tzyxT@y}aES$q~6s z1#Ao`cLm9aqgFc&!z>_41`L&*F~_LuK(fO#MDg207N&T`z@Spss~Qoklqjg~EZ>_Q zsw^z+q;lY-#l%7$d1#7AnbQtQ`N{=o1e}=jbqxkc)+0ec9trGRJ`Ehn4y>4VefWwT z*SO+8Ty@RPr46Vr&`Cd6dTE$GOS+5X@HifksSc;WLrWBwl4!J4ELj__6M@p^m&s|S zN0@SFLIo*_4!HvY;{&WgY&eqhsHTQ}#dT0#ro4=V`AEaDn{3&$BUpA>BGNsFaDPA%t2)-HqowacuP{S^&)9G zX+<>o3g(%QRW8sa)TK5~@zq{9$T$uP%T?5E|HmW+&-Bbd6}UrRSj=3#@4r?0 zA1DaM?5IWi%CPj0pAh!U){pZx?hkGZoD6hu% z?FeZ8XLk<>KX|gVS+v$%3G(p#QtkFz^=taUryCs73)8 z+vAjUUzzI`KZ&GZo0;bXn#|+(4zLY(FAo@Eip`AQH1=R<_`D;Qf(0s`EGa4vL(Sbq zBEDyU6R`5xBECjQqErwZ51L548WWxo7tg-lx=qf2!F(b`9_u!+s(|qNf zoGP!%r?BG#jJlGQ>M}s5XO|ip4z*!~WR}W6=Z5kz{K6Fq0zI{x#)I&zs*w8c1n^8o zkj}IaLSvrX*^E63T#T~ZX_ENP44q59pwbs$k=ur~36jtw!^V?HVc_^%a}z+OY`ON8 zYgmLVax2XwKw#qrGh0E0A?!&h$aYbc!vn`Yb<36q*6tcjS2B5o{1k{lc1d_rTahSP ze2#K%O+;lqNc$b)315^#^*dqrQL1t#jU>9Iv`qaH4kif4u5q54yWFsIn#r2-64rfU z)E4fn8*QW1f$?G|FN7p9pDq!Famsylqkd30@I!3>uePfWi>lqegCN~qBaPHZ3?R)Q zNOwqg2~yJC4bn)bgmk9}2!g;zNGmCgfT(l{ztQ3I1O4v3zkBat33FDDh2Z{ z)^og2S@h$yBv&WMd130(&P8B3hOe}yk4#hJBsi9`=J{Oa0!|+&4Iz_Os`dc=7Fl|$ z(*Qx-aazZIi|=%oRt}HNOkgFyLc7}gCFCwVQ%@0p26wtQ2nUH$;u%VjO&p-g63+PW zQUpHnFhool9F7iQTq)@j3F_0bpr%h?tr|9n_>}NQ{X;MNExBPtHLD;t##DoYDvsI~ zVtv`%H>4%3?6>>AWl@Mz6ZWbpzR{5R09E{*l9xT=7bTu&1^CBYWi3RTFVRM)Em%z3y=(X*=vL8_CiG9aV`J1nYO4!eXB~mkwL~)&IBow=QI+zuM?!) zqeyDsjneBCmZ+H0J(242QZBIKjf%tHb4smc#HsWub5Kcf!sZ0?+Bj5vrdk3Y>5!{V zPpBn29)G!*JirV%4qjZ#zoa_^5w_CI9fCVZXItsK5+$w>Zz5{ z@Tkya5YYvQPdy5Vr!L#fygBF)NCoV`E>e@{iL)RI*U2cl%OCe}j>s``*nep?CAK}h zh3%7$(rb(e6mm^+i~O9|Xy|Nl2|Vq3Cv21Fa#$5-DbHNu#4+1;Xxn9Ob{i1_I01mI z-pS>XKB*>$H>NqBP$m4{MCE%Mu!sCX;knSPF#y1ai|Hatu!1T$!Cb$c;T-@_(t4Mu zOh@7F%A&y3Fm7Bh31fDUxc!WTs>y0qa%FgCM z>c+z{Xxj|kq_GC9^z`&+t%fCALkH+W48+eTQCVix3HbU#iCy>Nka7I#+4nW}LelO} zp`ZGwza{1b^4}9uN0Q#rq@But@xW1GI*XiCJjF<~T3+9M2m0#8cQz7FbZiyA+K}9i zEvY{)iATcw@<32k(X+wB^ow1I{<9!K2WMZgs@YBop>1Fr*8I}E3UZu-btluf`zC=& z_50wKoi}whZJ)+fPs%Lyh+o()`NXB`DTxsfPv9kM)7^>+QUa_h};UD@k^@)V|M+UhN%ce&x)(z;(AjS=%(5cxRex za!YrGM6Q7PmzJ;SB`v4%>tjpt|FP0GL zm3&-W-Qqs8Y_S^pMV?P0MB+9!85tgRFM?@%d_cGE_{Z6sbL_QFJNosrd;U}SjeX^Y zU5?S5FYsQarX7`{-XydXKoxFYYex6bE<-3tC)A7&=qR4VS8zPNU;6fx`dQUtCzoSw zyW>C3_7)#lje^XK`Fveekv+&o)aIWUzU{0Hjo z$N_0?L|+As7eQcNYz}NPXh&%ztU&*6t4R8u@l^eLw^$t51%(eqWW)&$B|}Fcl_)sa znLI~q7+`h-TEW>|6UX?fmo`Q0wPP4;3Yw$rOsIxat8c9zCHRN)EV1*}P^mpE?e*+g z)NoPzW^T;omfP0%d`1KLhyh!DqD?wtMMwSQ?jMe0G?*O`eec7+m3*k+-r&S1QeK+( zYA8EWWF2s3iS^tR8^2v7g876~v2a(_e^ZF8!XrR{u=pYY2n@0QvGESQHrINtK-+@t z)tjJXz@aF~p3b-Ed|8TG7Ej?R8Ekkl*g|uNL(DksgkapCWQeOnM#2Gdyde`V&A*=e z+T8VX@szkVo#6h_CmOdQrt|%BDihW296CYrl@6U%+-9`^y(;2iYAKFqW9#*c7S@pd z;b3AA&!n`r??ml!3o**_c4zHJu>#BGwcIA=xE7XFD?H4PH||xF>%0M{HctwR=f(7; zhp`M#4WP!FrMo#aZFGL89u3ZRX6R_%hodUFr7Co)Jaal znm?;>ky=LG@B!aWm9!!wH7Ce;7iHdPU}PB45n?Y*$QP1i!rs4L{*os$seJl##Ugr-Bf~JM*pj=JqZ!DGdT0G&Zy2>G>ymJeWgOB1?+L zK`rMq+=#(5oS<@z`X(cLR&Kaihct)CY-LJIT>GM_6_vVTt2nK^xR>+8UOOO^HU*98 zz5OSiubv5}l~m2U?oB+}$oQtPl+%!hYH`6|$kz)DetaL4_wPB~KR)?ArS?zsYsrm2=INK@vPkG)wnfI zEgpiVv>=|r(5`D4hIUoQu#u}8hN1nc-ydjMm{++8{W$m9gCT6>>f^`{wBIxfL%Xh5 z*tu8NV%W&P?o9$id-^xruCBc>wBOg=Cg{AOUYtRzTfS!k!DRse=r2q|0|7V}=Sw9= z`0uE6Y^i1+a2hKN;U`(`;N2y!I7jm0GJqWp0N~dI4LNy`L>spQ07$ZM%1GIwo#=N& zRRs_+D2@(XXry1mB~pC_(TI!q5?Q{l>Ff%;rT?T4y|w3-)%jsJ4w=pBS5$l@JoAV$|KN04~PQIH1*N2`4l5npcX@_oV~D^o#aZ>XyljED+5yYw?*3 zVZv=IqUj#$!{{-5K~huu!3BWOog?g;FY(?2vQKg!8yFYIo%kRx);6YD&r<@7G(Ill zf)V-~ZG4<7`w=rrtoY^`dyIz+ zg*sV<9RaJx1#v?ekM4#0CG3mKr8HP8biy!{`6TT< zPY~-*aDev-NDJMVppON43^q35X32g+?+LgVmQtQ3%*=K{$JkdZr_nwiU}=~JhYg0< zA;CFypZ6*j?rpCX=Xx}>=C@XT%cNXPZ94OPuC*?YFd>dfZ@!i+pF7>IzPBDlGB%h+ zL**jn9crJrU*zrKe>m5tNa>Jzc%C6|bNx=p`E6~UXGJM?A2lQlI~S+|<~!tD zIN{++r8%krH}4CyN2UM?G-oZUN%CA%mK?*A{NiTN)Ro&KwlI9pmYDoiz<;c*)8xLf zW1tM+ZoeP3yc0bXNm4i@Jm*AuGZJ-I9F=&?$U+!N<(rveEXp2(>OJXs>}OiDsz7CLhxXs0=S z&qDA{B}BfIPCWy@-E3r2CJkk(pS-DkZTA!dB%tAJswG56*H(C2v9n_uR|_0NFSknX z9wo>~$-lbfSB%E$HXy>G3?XLP!!4P=M=nqd9Pc(M{PwHu9<;eSfz>r5n)Jo9-=A$UleOu^L6OJ zg;sn|dk=oc&V%mt=hN3&pM{+IcFcsO^4LYr^PN7)%?~Xq?h>BFo8S(z-P-C8ws}Bb zw{>z*{lRL@;wX#9a&j`1><+6O`&yEOLWnrExprpY{D0ZSt0eiJUcgS-dZ0{ zM~xENqc&lxHy>?O7qo%*G4^pss}zz3S~xhm&?ZK!eJMGUP)ZB(4cNI~Q%|ZQw9Lkw z+7a- z?VYZexUd`_P)nqKUuxc0p}x%Cb5pxALlK*{Gw6FPCA-751$(|OhXX}l2%HtTMK0jF z88T=O^b*D7u@Ro$KE$GiH+eTdmsP2u@b)IR%Q3p%0aaN4k=@2Qc4nD&3|6R(v#s?l zFBu~GEdPWuv=*PFqPH4-yYLpR@@x&k}t=1k(thDJc8 zfdz%Y-W>`OM4bxAmz0RzK_z&7eL8@|OCYj}%GWPu-GW`F;9VN&9xE*bGY1pSoB$}&%p5p$ zVPkC9KSBqT=8Uxf$=6K2CzO*#GdfJ zE4T9@B7 z1G@V7o%sWKNgj*2=v|aeMd>f+X_Uz~@{vhq%sI>89YJzJ`;+g;q#IyH zI5r=AApu;p+gg(@sWnl1^muYrsV{ZBca{%h0D`EA-?Bv9{@z8h6!Ez5K^e+4B_t%3 zqC98ssgC8gaAbQ#_U$tPS`HdFUoj;rnll#<-PZ($Tof(sj~hUewR|g;kY`djGVPHI zArlCsyN{4Q*O~eI6({LA3MTOEOv0N=W;b6vdDZaRC~ucY(U8t+0iSrCkb!wTkKlHw zMx3kQ=~i;llhwi?vTo6jv1ht=4Z#x~x1M~K7Uq8%?yzddWQ%^|@$Nao@{lyoHpxw; zgEOJlZN>dq9{hK1D@FYt#$8A=X;WfoO~pl_&(Pglk8If!oKtYHbEp{Yz6g@IMvr}2 zvFiUgO^MdBp&yg&D6mPahw)b1nROE#17qptMn-<0%6P~9lc>oP$9+TaF0Zrn8?G(s zEqf=@IKeLgbO!dF=9r#hV&uXFg|VaQ1ac8GuR&Y=cV`bYChN^UnVRMV}sS_NjVTfFMXL_r;nCSsw3EE)h*}TU@ zga&I>b@4!M#)tQc6U@1ft*jPtGS|`i)Ny%rM&Hcg@=@RLd}`Z0Hou=&q*&{q+5#UP zDjYLe#1eT1jN3#XSz4v-J#XjBWhma-(u&ffO`xDn2W`E1;EeUm1NUq+>bMkBbuoO^ z6(>y|^{u%vS{#MH4aa1n*AUfW_Q(O=1FaU9igT9`6NM?ox4Tc@^kGe;dCr&RNRDqx z$EhU95)76Eo8Lz9)jkDSCp_yI07SIsUv+d^t&&C_b3eG1HiZPk zGunC75pCHQjRW1q4T4X!M}r7lg)f-K-W=txuHn*4WzEs@vj65bJ1Xz&96)yw)vJ>H z)`6VB`6J($BfAB|TZ{(XN5J)EL?m4x1r88$Vw0y+O@UV`W#MJUHdp0 zy|Ife!KZ-^H~`lpP1O|uAlR22TG{YDX1Vf*;tCCOSVU53twh^?go40v`B35%K#P@4qp#oVch?zQX?Tft)iC@qZ`Zn!z_|Tl6kgg0 z*X! Date: Fri, 2 Oct 2026 18:37:46 -0700 Subject: [PATCH 04/18] docs: record spoken media tests and successful skill scan --- docs/LIVE_TEST_1.1.0.md | 58 +++++++++++++++++++++++++++--------- docs/REVISION_1.1.0_NOTES.md | 21 +++++++++---- 2 files changed, 60 insertions(+), 19 deletions(-) diff --git a/docs/LIVE_TEST_1.1.0.md b/docs/LIVE_TEST_1.1.0.md index 5acff0c..0651c21 100644 --- a/docs/LIVE_TEST_1.1.0.md +++ b/docs/LIVE_TEST_1.1.0.md @@ -1,6 +1,11 @@ # v1.1.0 live verification — October 2, 2026 (Pacific) -**Release status: blocked by hosted MCP argument validation.** +**Release status: hosted MCP fix awaits deployment and live retest.** + +Backend [PR #393](https://github.com/sonilo-ai/sonilo-api-dashboard/pull/393) +fixes the six affected optional JSON-array string arguments without changing +their published schemas. Its CI passed. The updated plugin Skill upload also +passed the portal scanner; this is not approval or publication of the plugin. These are authenticated production MCP calls using a temporary Python MCP client, the published tool schemas, and the v1.1.0 workflow instructions. @@ -12,7 +17,7 @@ local; no tokens, reviewer credentials, or signed result links are committed. | Feature | Observed result | | --- | --- | -| Subtitle review before dubbing | Tool is enabled and starts a task. The public demo has no speech; it correctly returned `TRANSCRIPTION_EMPTY`. Successful subtitle generation and approved-script dubbing remain untested. | +| Subtitle review before dubbing | Subtitle generation passed on the synthetic spoken fixture: six English cues and their Spanish translations were returned, downloaded, and reviewed against the fixed narration. Approved-script dubbing still awaits the hosted fix. A separate silent source correctly returned `TRANSCRIPTION_EMPTY`. | | Music and effects together | Passed: one call produced a video, music track, and effects track. All three URLs were readable; video contains H.264 and AAC and is 20 seconds long. | | Free dubbing preview | Blocked: the documented `languages` string is rejected by argument validation before task creation. The account still has its preview allowance. | | Full video after preview | Blocked by the same language-argument issue; no preview/full-video chain completed. | @@ -22,7 +27,7 @@ local; no tokens, reviewer credentials, or signed result links are committed. | Usage examples | Bundled examples are present; selection and wording in a clean Codex session remain untested. | | Generation status | Passed: existing successful and failed tasks retrieved; repeat lookup returned the same task and media URLs. A nonexistent task returned `Task not found`. | | Multiple variants | Passed: one 10-second request with `variants_num=3` returned three distinct playable audio files. | -| Keep narration audible | Not tested: the available public demo has no speech. Requires a spoken-video fixture. | +| Keep narration audible | Generation passed with `preserve_speech=true` and `ducking=true`: music, isolated vocals, ordinary mix, and ducked mix were returned. All four AAC files were readable; waveform comparison confirms source speech remains in both mixes. Listening quality and actual attenuation still need verification. | | Timed sound effects | Blocked: the documented `segments` JSON string is rejected before task creation. | | Instrument stems | Passed: all three variants returned drums, bass, vocals, and other tracks; all 12 stem URLs were readable. | @@ -47,10 +52,11 @@ strings when the annotation is `str | None`, then the argument model rejects the resulting list. Calling the Python tool function directly does not exercise this preprocessing, so earlier function-level checks missed it. -Fix the hosted argument model/normalization and add a regression test through -FastMCP dispatch. Audit other JSON-array string fields, including segments on -music/SFX/combined tools. Then retest the live language and timed-effect paths; -update plugin guidance if the published schema changes. Do not work around the +PR #393 restores pre-parsed arrays to JSON strings before the argument model +validates them. It covers dubbing and the five exposed segment fields. Actual +FastMCP-dispatch regression tests reproduced 13 failures before the fix and +passed all 32 cases afterward. A broader 253-test MCP/segment/OAuth suite passed. +Merge/deployment and live retests are still required. Do not work around the failure by omitting requested languages, which would select multiple defaults. ## OAuth test-client incident @@ -62,17 +68,41 @@ The test client was restarted with both scopes explicitly requested, allowing normal scope validation to remain enabled. Authenticated calls then succeeded. Tokens are held only in the temporary client's memory. +Subsequent authenticated account calls succeeded while the browser still +displayed the consent page. Do not interpret that stale page alone as a failed +connection or click Allow repeatedly. This does not establish the cause of +every user's consent-page loading problem. + The plugin manifest remains `profile` only. This temporary client's success therefore does not establish the exact Codex client's sign-in/refresh behavior; a clean plugin OAuth check is still required before release. ## Usage reconciliation -The live run recorded three generation requests, including the no-speech +The initial run recorded three generation requests, including the no-speech failure, and USD 0.0675 spending. The wallet decreased by that same amount. -The combined-video trial was consumed; dubbing and timed-SFX trials were not. -No account funding or automatic paid retry was performed. - -Still needed: fix and deploy hosted array-argument handling, a permitted public -spoken-video fixture, the remaining scenarios above, a clean v1.1.0 Codex -conversation test, the updated portal upload/scan, and current demo material. +The subsequent spoken-fixture subtitle and speech-preserving music runs used +one proofread trial and one video-to-music trial. The balance remained USD +4.0084. Dubbing and timed-video-SFX trials remain available. No account funding +or automatic paid retry was performed. + +## Spoken fixture and portal scan + +The repository includes a synthetic English narration fixture in +`tests/fixtures/`, outside the distributable plugin. The 22-second video has a +19.055-second audio stream, including its trailing silence. Speech-preserving +audio outputs are approximately 19.1–19.2 seconds. The subtitle text matches +the fixed script; the Spanish translation preserves its meaning. + +An aligned waveform comparison at 8 kHz found source-speech correlation of +0.9954 in isolated vocals, 0.8033 in the ordinary mix, and 0.9765 in the ducked +mix. This supports speech preservation; it is not a listening-quality score +or a measurement of the music attenuation envelope. + +The current `sonilo-workflows-1.1.0.zip` was uploaded again. The portal changed +from Scanning to **Passed**. Navigation away from and back to Skills retained +the passed state. No review submission or publication was performed. + +Still needed: deploy the hosted fix, live dubbing/approved-script/timed-effect +retests, the remaining scenarios above, a clean v1.1.0 Codex conversation test, +audio listening verification, and current demo material. diff --git a/docs/REVISION_1.1.0_NOTES.md b/docs/REVISION_1.1.0_NOTES.md index 332c5b3..81f1f26 100644 --- a/docs/REVISION_1.1.0_NOTES.md +++ b/docs/REVISION_1.1.0_NOTES.md @@ -1,10 +1,12 @@ # Revision 1.1.0 draft notes -> October 2 live-test update: **not release-ready**. Production rejected the -> documented dubbing-language and timed-SFX arguments. Music variants, stems, -> combined output, balance, and task retrieval passed the checks described in -> [the live verification report](LIVE_TEST_1.1.0.md). Earlier validation notes -> below describe package preparation and do not supersede these findings. +> October 2 live-test update: **not release-ready**. Backend PR #393 fixes the +> production dubbing-language and timed-SFX argument failures; CI passed, but +> deployment and live retests remain. The updated Skill upload passed the +> portal scanner. Music variants, stems, combined output, subtitle generation, +> speech-preserving output retrieval, balance, and task retrieval passed the +> checks described in [the live verification report](LIVE_TEST_1.1.0.md). +> Earlier preparation notes below do not supersede these findings. ## Release notes @@ -43,3 +45,12 @@ balance guide and updated examples. All 10 public guide routes returned HTTP passed, and each ZIP entry was compared byte-for-byte with its source. The previously saved portal draft and upload described above predate this change; they must not be treated as the updated package or a successful scan. + +## October 2 subsequent verification + +The current Skill ZIP was reuploaded and the portal scanner returned **Passed**. +That state persisted when leaving and reopening Skills. This resolves the +earlier scan error only; compliance attestations remain unchecked and no review +submission or publication has occurred. The existing recording still needs to +be replaced by a demonstration of the updated workflows. See the live report +for current production results and remaining release gates. From c838ccbdce986c6a2f0674a8b80123c52ee19d05 Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Fri, 2 Oct 2026 18:39:59 -0700 Subject: [PATCH 05/18] docs: record isolated MCP credit recovery verification --- docs/IMPLEMENTATION_1.1.0.md | 11 ++++++----- docs/LIVE_TEST_1.1.0.md | 22 ++++++++++++++++++++-- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/docs/IMPLEMENTATION_1.1.0.md b/docs/IMPLEMENTATION_1.1.0.md index d1dcbd0..4c25f83 100644 --- a/docs/IMPLEMENTATION_1.1.0.md +++ b/docs/IMPLEMENTATION_1.1.0.md @@ -1,10 +1,11 @@ # Sonilo 1.1.0 implementation -> October 2 live-test update: **not release-ready**. Production rejected the -> documented dubbing-language and timed-SFX arguments. Music variants, stems, -> combined output, balance, and task retrieval passed the checks described in -> [the live verification report](LIVE_TEST_1.1.0.md). Earlier validation notes -> below describe package preparation and do not supersede these findings. +> October 2 verification update: **not release-ready**. Backend PR #393 fixes +> production dubbing-language and timed-SFX argument failures; deployment and +> live retests remain. The current Skill upload passed its portal scan. +> Production media results and isolated credit-recovery coverage are recorded +> in [the live verification report](LIVE_TEST_1.1.0.md). Package coverage below +> is not proof that every workflow has passed a clean Codex conversation test. Scope: the 13 features in the [manager plan](https://docs.google.com/document/d/1woqbRgMlCemdw46mpP6Wz1uDkVUK9_C4QyPi2cX2y0s/edit). diff --git a/docs/LIVE_TEST_1.1.0.md b/docs/LIVE_TEST_1.1.0.md index 0651c21..5e29569 100644 --- a/docs/LIVE_TEST_1.1.0.md +++ b/docs/LIVE_TEST_1.1.0.md @@ -22,8 +22,8 @@ local; no tokens, reviewer credentials, or signed result links are committed. | Free dubbing preview | Blocked: the documented `languages` string is rejected by argument validation before task creation. The account still has its preview allowance. | | Full video after preview | Blocked by the same language-argument issue; no preview/full-video chain completed. | | Balance and trial lookup | Passed: actual decimal USD balance and per-service trial data returned through OAuth. | -| Credit-error guidance | Guide routes were verified previously; an actual insufficient-balance rejection and Codex's reply are not yet tested. Do not exhaust the test wallet just to force this condition. | -| Continue after account update | Not tested: no account-funding change was performed. | +| Credit-error guidance | Guide routes passed. Isolated authenticated MCP tests cover exhausted trials and insufficient balance with real billing/ledger code: no task, usage record, debit, or generation dispatch occurs. Production rejection and Codex's reply remain untested. | +| Continue after account update | Isolated authenticated MCP tests pass: a credit becomes visible on the same connection, reading balance does not retry, and one explicit resubmission creates one task and debit with the original arguments. No production funding change was performed; Codex's conversation behavior remains untested. | | Usage examples | Bundled examples are present; selection and wording in a clean Codex session remain untested. | | Generation status | Passed: existing successful and failed tasks retrieved; repeat lookup returned the same task and media URLs. A nonexistent task returned `Task not found`. | | Multiple variants | Passed: one 10-second request with `variants_num=3` returned three distinct playable audio files. | @@ -103,6 +103,24 @@ The current `sonilo-workflows-1.1.0.zip` was uploaded again. The portal changed from Scanning to **Passed**. Navigation away from and back to Skills retained the passed state. No review submission or publication was performed. +## Isolated credit recovery verification + +Backend PR #393 includes two integration scenarios, for never-funded and +previously funded accounts. They drive the actual MCP ASGI transport and SDK, +OAuth verification with a locally signed test token, and real billing/ledger +services against an isolated in-memory database and Redis. Only media +generation dispatch and email notifications are stubbed. There is no change +to a production wallet or billing behavior. + +Both zero-balance scenarios reject generation without creating a task, usage +record, or ledger debit. A local USD 1.2345 credit is visible on the same +authenticated connection. Reading that balance does not resume work. One +explicit resubmission using the original prompt/duration creates exactly one +task and one USD 0.1000 debit, leaving USD 1.1345. The combined OAuth integration +and JSON-dispatch suite passes all 45 cases. This verifies the backend contract, +not the plugin's natural-language reply, guide-link choice, or autonomous tool +selection; those still require the clean Codex test. + Still needed: deploy the hosted fix, live dubbing/approved-script/timed-effect retests, the remaining scenarios above, a clean v1.1.0 Codex conversation test, audio listening verification, and current demo material. From a0d574591cf0f5f768710d4fc99a3bae396e0d93 Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Sat, 3 Oct 2026 09:22:07 -0700 Subject: [PATCH 06/18] docs: record v1.1.0 installation and native Codex OAuth checks --- docs/LIVE_TEST_1.1.0.md | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/docs/LIVE_TEST_1.1.0.md b/docs/LIVE_TEST_1.1.0.md index 5e29569..dd9bbce 100644 --- a/docs/LIVE_TEST_1.1.0.md +++ b/docs/LIVE_TEST_1.1.0.md @@ -1,4 +1,4 @@ -# v1.1.0 live verification — October 2, 2026 (Pacific) +# v1.1.0 verification — October 2–3, 2026 (Pacific) **Release status: hosted MCP fix awaits deployment and live retest.** @@ -73,9 +73,10 @@ displayed the consent page. Do not interpret that stale page alone as a failed connection or click Allow repeatedly. This does not establish the cause of every user's consent-page loading problem. -The plugin manifest remains `profile` only. This temporary client's success -therefore does not establish the exact Codex client's sign-in/refresh behavior; -a clean plugin OAuth check is still required before release. +The plugin manifest remains `profile` only. The temporary Python client's +success alone did not establish Codex's authentication behavior. The separate +native Codex check below now covers initial sign-in and credential reuse, but +not token-expiry refresh or the complete installed-plugin conversation. ## Usage reconciliation @@ -121,6 +122,29 @@ and JSON-dispatch suite passes all 45 cases. This verifies the backend contract, not the plugin's natural-language reply, guide-link choice, or autonomous tool selection; those still require the clean Codex test. +## Local installation and native Codex OAuth + +The installed local marketplace still pointed at an older working directory +and reported version `0.3.0+codex.20260909195632`. Using the supported Codex CLI, +the Sonilo marketplace source was updated to the current release repository +and `sonilo@sonilo` was installed as **1.1.0**. All nine installed files match +the package source byte-for-byte. Codex's plugin reader reports it installed, +enabled, and containing the current `sonilo:sonilo-workflows` skill. + +A separate Codex app-server diagnostic process used a process-only MCP entry +with the same production URL and configured `profile` scope. Codex itself +included `offline_access` in the authorization request. Its OAuth completion +notification returned `success: true`. After restarting the diagnostic +process, saved authentication still worked: `authStatus: oAuth`, no tool error, +and all 15 hosted tools, including `get_generation_task`, were returned. +The consent page remained visible even after successful authentication. + +This test used Codex's own client rather than the Python SDK. It did not start +an agent turn or alter the plugin's scopes. It does not prove expired-token +refresh or the skill's behavior in a fresh conversation. The user's separate +`sonilo` stdio MCP entry is also still registered, so conversation tests must +verify they use the hosted tool inventory rather than its local Python tools. + Still needed: deploy the hosted fix, live dubbing/approved-script/timed-effect retests, the remaining scenarios above, a clean v1.1.0 Codex conversation test, audio listening verification, and current demo material. From d75dadd742b97f38cb0df2b7fc58cab4740589d4 Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Sat, 3 Oct 2026 09:24:57 -0700 Subject: [PATCH 07/18] docs: record verification against latest backend develop --- docs/LIVE_TEST_1.1.0.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/LIVE_TEST_1.1.0.md b/docs/LIVE_TEST_1.1.0.md index dd9bbce..7e08046 100644 --- a/docs/LIVE_TEST_1.1.0.md +++ b/docs/LIVE_TEST_1.1.0.md @@ -4,7 +4,10 @@ Backend [PR #393](https://github.com/sonilo-ai/sonilo-api-dashboard/pull/393) fixes the six affected optional JSON-array string arguments without changing -their published schemas. Its CI passed. The updated plugin Skill upload also +their published schemas. CI passed on the initial fix and added credit tests. +After synchronizing the October 3 `develop` updates, all 255 relevant local +tests passed; CI for that synchronized commit must also pass before merge. +The updated plugin Skill upload also passed the portal scanner; this is not approval or publication of the plugin. These are authenticated production MCP calls using a temporary Python MCP @@ -100,6 +103,10 @@ An aligned waveform comparison at 8 kHz found source-speech correlation of mix. This supports speech preservation; it is not a listening-quality score or a measurement of the music attenuation envelope. +The October 3 production MCP deployment at `3b7a2c66` did not contain the +JSON-array argument fix. PR #393 remains the pending deployment dependency; +a successful unrelated deployment does not clear that release gate. + The current `sonilo-workflows-1.1.0.zip` was uploaded again. The portal changed from Scanning to **Passed**. Navigation away from and back to Skills retained the passed state. No review submission or publication was performed. From a9df819683f1a9d6173ad5a0e53aeca062bfb105 Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Sat, 3 Oct 2026 11:23:24 -0700 Subject: [PATCH 08/18] docs: record MCP deployment and successful production retests --- docs/IMPLEMENTATION_1.1.0.md | 7 ++--- docs/LIVE_TEST_1.1.0.md | 50 +++++++++++++++++++++--------------- docs/REVISION_1.1.0_NOTES.md | 7 ++--- 3 files changed, 38 insertions(+), 26 deletions(-) diff --git a/docs/IMPLEMENTATION_1.1.0.md b/docs/IMPLEMENTATION_1.1.0.md index 4c25f83..67cb03f 100644 --- a/docs/IMPLEMENTATION_1.1.0.md +++ b/docs/IMPLEMENTATION_1.1.0.md @@ -1,8 +1,9 @@ # Sonilo 1.1.0 implementation -> October 2 verification update: **not release-ready**. Backend PR #393 fixes -> production dubbing-language and timed-SFX argument failures; deployment and -> live retests remain. The current Skill upload passed its portal scan. +> October 3 verification update: **not release-ready**. Backend PR #393 is +> merged and deployed. Live dubbing preview and timed-SFX generation now +> succeed; full-video/script continuation and exact SFX timing still need +> verification. The current Skill upload passed its portal scan. > Production media results and isolated credit-recovery coverage are recorded > in [the live verification report](LIVE_TEST_1.1.0.md). Package coverage below > is not proof that every workflow has passed a clean Codex conversation test. diff --git a/docs/LIVE_TEST_1.1.0.md b/docs/LIVE_TEST_1.1.0.md index 7e08046..f066297 100644 --- a/docs/LIVE_TEST_1.1.0.md +++ b/docs/LIVE_TEST_1.1.0.md @@ -1,13 +1,15 @@ # v1.1.0 verification — October 2–3, 2026 (Pacific) -**Release status: hosted MCP fix awaits deployment and live retest.** +**Release status: hosted fix deployed; remaining workflow and conversation checks.** Backend [PR #393](https://github.com/sonilo-ai/sonilo-api-dashboard/pull/393) fixes the six affected optional JSON-array string arguments without changing -their published schemas. CI passed on the initial fix and added credit tests. -After synchronizing the October 3 `develop` updates, all 255 relevant local -tests passed; CI for that synchronized commit must also pass before merge. -The updated plugin Skill upload also +their published schemas. After synchronizing the October 3 `develop` updates, +all 255 relevant local tests and the synchronized commit's CI passed. The PR +was merged as `946115c3` and deployed in +[production run 37143426954](https://github.com/sonilo-ai/sonilo-api-dashboard/actions/runs/37143426954). +ECS revision 95 reached COMPLETED with one running task and no pending tasks; +its image tag matches the merge commit. The updated plugin Skill upload also passed the portal scanner; this is not approval or publication of the plugin. These are authenticated production MCP calls using a temporary Python MCP @@ -22,8 +24,8 @@ local; no tokens, reviewer credentials, or signed result links are committed. | --- | --- | | Subtitle review before dubbing | Subtitle generation passed on the synthetic spoken fixture: six English cues and their Spanish translations were returned, downloaded, and reviewed against the fixed narration. Approved-script dubbing still awaits the hosted fix. A separate silent source correctly returned `TRANSCRIPTION_EMPTY`. | | Music and effects together | Passed: one call produced a video, music track, and effects track. All three URLs were readable; video contains H.264 and AAC and is 20 seconds long. | -| Free dubbing preview | Blocked: the documented `languages` string is rejected by argument validation before task creation. The account still has its preview allowance. | -| Full video after preview | Blocked by the same language-argument issue; no preview/full-video chain completed. | +| Free dubbing preview | Passed after deployment: explicit Spanish JSON-string language input started an eligible free preview. The result is a readable H.264/AAC video exactly 15 seconds long; returned metadata identifies the 22-second original, one language, and trimming. | +| Full video after preview | Language validation is fixed; the full-video/approved-script continuation remains untested. | | Balance and trial lookup | Passed: actual decimal USD balance and per-service trial data returned through OAuth. | | Credit-error guidance | Guide routes passed. Isolated authenticated MCP tests cover exhausted trials and insufficient balance with real billing/ledger code: no task, usage record, debit, or generation dispatch occurs. Production rejection and Codex's reply remain untested. | | Continue after account update | Isolated authenticated MCP tests pass: a credit becomes visible on the same connection, reading balance does not retry, and one explicit resubmission creates one task and debit with the original arguments. No production funding change was performed; Codex's conversation behavior remains untested. | @@ -31,13 +33,13 @@ local; no tokens, reviewer credentials, or signed result links are committed. | Generation status | Passed: existing successful and failed tasks retrieved; repeat lookup returned the same task and media URLs. A nonexistent task returned `Task not found`. | | Multiple variants | Passed: one 10-second request with `variants_num=3` returned three distinct playable audio files. | | Keep narration audible | Generation passed with `preserve_speech=true` and `ducking=true`: music, isolated vocals, ordinary mix, and ducked mix were returned. All four AAC files were readable; waveform comparison confirms source speech remains in both mixes. Listening quality and actual attenuation still need verification. | -| Timed sound effects | Blocked: the documented `segments` JSON string is rejected before task creation. | +| Timed sound effects | After deployment, the documented segments string is accepted and generation succeeds with a readable 22-second H.264/AAC video. Precise event timing and sound identity still need listening verification; successful transport and output duration do not prove those. | | Instrument stems | Passed: all three variants returned drums, bass, vocals, and other tracks; all 12 stem URLs were readable. | Media verification used ffprobe for actual file readability, codecs, and duration. It does not establish subjective audio quality or speech intelligibility. -## Confirmed hosted blocker +## Hosted blocker reproduced and resolved Both calls use the types advertised by production `tools/list`: @@ -58,9 +60,11 @@ this preprocessing, so earlier function-level checks missed it. PR #393 restores pre-parsed arrays to JSON strings before the argument model validates them. It covers dubbing and the five exposed segment fields. Actual FastMCP-dispatch regression tests reproduced 13 failures before the fix and -passed all 32 cases afterward. A broader 253-test MCP/segment/OAuth suite passed. -Merge/deployment and live retests are still required. Do not work around the -failure by omitting requested languages, which would select multiple defaults. +passed all 32 cases afterward. The latest broader MCP/segment/OAuth suite +passed 255 cases. After deployment, all six tools return their expected domain +validation errors for invalid arrays, rather than the old string/list error. +Valid Spanish dubbing and timed video-SFX inputs now create successful tasks. +Do not omit requested languages, which would select multiple defaults. ## OAuth test-client incident @@ -87,8 +91,9 @@ The initial run recorded three generation requests, including the no-speech failure, and USD 0.0675 spending. The wallet decreased by that same amount. The subsequent spoken-fixture subtitle and speech-preserving music runs used one proofread trial and one video-to-music trial. The balance remained USD -4.0084. Dubbing and timed-video-SFX trials remain available. No account funding -or automatic paid retry was performed. +4.0084. The post-deployment dubbing preview and timed-video-SFX runs each used +their remaining trial; both now report zero remaining and the balance is still +USD 4.0084. No account funding or automatic paid retry was performed. ## Spoken fixture and portal scan @@ -103,9 +108,14 @@ An aligned waveform comparison at 8 kHz found source-speech correlation of mix. This supports speech preservation; it is not a listening-quality score or a measurement of the music attenuation envelope. -The October 3 production MCP deployment at `3b7a2c66` did not contain the -JSON-array argument fix. PR #393 remains the pending deployment dependency; -a successful unrelated deployment does not clear that release gate. +The earlier October 3 MCP deployment at `3b7a2c66` did not contain the fix. +The subsequent deployment at `946115c3` does, and both successful generation +retests above ran after the new container took over. + +An energy-only check of the SFX output is inconclusive for event accuracy: +the 3–5 second interval has more energy than the requested 5–7 second rain +interval. This does not identify the sounds or establish the cause; do not +claim exact timing from this output without listening verification. The current `sonilo-workflows-1.1.0.zip` was uploaded again. The portal changed from Scanning to **Passed**. Navigation away from and back to Skills retained @@ -152,6 +162,6 @@ refresh or the skill's behavior in a fresh conversation. The user's separate `sonilo` stdio MCP entry is also still registered, so conversation tests must verify they use the hosted tool inventory rather than its local Python tools. -Still needed: deploy the hosted fix, live dubbing/approved-script/timed-effect -retests, the remaining scenarios above, a clean v1.1.0 Codex conversation test, -audio listening verification, and current demo material. +Still needed: full-video and approved-script dubbing tests, the remaining +scenarios above, a clean v1.1.0 Codex conversation test, audio/timed-effect +listening verification, and current demo material. diff --git a/docs/REVISION_1.1.0_NOTES.md b/docs/REVISION_1.1.0_NOTES.md index 81f1f26..52192f9 100644 --- a/docs/REVISION_1.1.0_NOTES.md +++ b/docs/REVISION_1.1.0_NOTES.md @@ -1,8 +1,9 @@ # Revision 1.1.0 draft notes -> October 2 live-test update: **not release-ready**. Backend PR #393 fixes the -> production dubbing-language and timed-SFX argument failures; CI passed, but -> deployment and live retests remain. The updated Skill upload passed the +> October 3 live-test update: **not release-ready**. Backend PR #393 is merged +> and deployed after 255 relevant tests and CI passed. Live dubbing preview +> and timed-SFX generation now succeed; full/script continuation and precise +> SFX timing still need verification. The updated Skill upload passed the > portal scanner. Music variants, stems, combined output, subtitle generation, > speech-preserving output retrieval, balance, and task retrieval passed the > checks described in [the live verification report](LIVE_TEST_1.1.0.md). From e828e6493d71571330b4a2a61b2cbcfb2355014d Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Sat, 3 Oct 2026 13:41:20 -0700 Subject: [PATCH 09/18] docs: record approved-subtitle deployment blocker --- docs/LIVE_TEST_1.1.0.md | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/docs/LIVE_TEST_1.1.0.md b/docs/LIVE_TEST_1.1.0.md index f066297..146ce15 100644 --- a/docs/LIVE_TEST_1.1.0.md +++ b/docs/LIVE_TEST_1.1.0.md @@ -1,6 +1,6 @@ # v1.1.0 verification — October 2–3, 2026 (Pacific) -**Release status: hosted fix deployed; remaining workflow and conversation checks.** +**Release status: JSON-array fix deployed; approved-subtitle dubbing uncovered a deployment configuration blocker.** Backend [PR #393](https://github.com/sonilo-ai/sonilo-api-dashboard/pull/393) fixes the six affected optional JSON-array string arguments without changing @@ -22,10 +22,10 @@ local; no tokens, reviewer credentials, or signed result links are committed. | Feature | Observed result | | --- | --- | -| Subtitle review before dubbing | Subtitle generation passed on the synthetic spoken fixture: six English cues and their Spanish translations were returned, downloaded, and reviewed against the fixed narration. Approved-script dubbing still awaits the hosted fix. A separate silent source correctly returned `TRANSCRIPTION_EMPTY`. | +| Subtitle review before dubbing | Subtitle generation passed on the synthetic spoken fixture: six English cues and their Spanish translations were returned, downloaded, and reviewed against the fixed narration. Approved-script dubbing reaches preflight but is blocked by a missing MCP container credential (see below). A separate silent source correctly returned `TRANSCRIPTION_EMPTY`. | | Music and effects together | Passed: one call produced a video, music track, and effects track. All three URLs were readable; video contains H.264 and AAC and is 20 seconds long. | | Free dubbing preview | Passed after deployment: explicit Spanish JSON-string language input started an eligible free preview. The result is a readable H.264/AAC video exactly 15 seconds long; returned metadata identifies the 22-second original, one language, and trimming. | -| Full video after preview | Language validation is fixed; the full-video/approved-script continuation remains untested. | +| Full video after preview | Full original video plus approved Spanish subtitles was submitted after the preview. Preflight failed before task creation because the MCP container lacks its pipeline credential; full output is not yet verified. | | Balance and trial lookup | Passed: actual decimal USD balance and per-service trial data returned through OAuth. | | Credit-error guidance | Guide routes passed. Isolated authenticated MCP tests cover exhausted trials and insufficient balance with real billing/ledger code: no task, usage record, debit, or generation dispatch occurs. Production rejection and Codex's reply remain untested. | | Continue after account update | Isolated authenticated MCP tests pass: a credit becomes visible on the same connection, reading balance does not retry, and one explicit resubmission creates one task and debit with the original arguments. No production funding change was performed; Codex's conversation behavior remains untested. | @@ -66,6 +66,24 @@ validation errors for invalid arrays, rather than the old string/list error. Valid Spanish dubbing and timed video-SFX inputs now create successful tasks. Do not omit requested languages, which would select multiple defaults. +## Approved-subtitle preflight configuration blocker + +The full-video continuation used the original 22-second fixture and the +reviewed Spanish SRT returned by proofread. It failed before task creation +with `Subtitle validation is temporarily unavailable, please retry`. +Production logs identify an empty Bearer header in the preflight client; +MCP ECS revision 95 lacks `DUBBING_API_AUTH_KEY`. Public API and worker task +definitions already inject this existing secret. Ordinary preview generation +succeeds because its work runs in the configured worker, whereas supplied +subtitles must be checked in the MCP request handler before billing. + +The failed call left the balance unchanged at USD 4.0084 and created no +returned generation task. Do not retry blindly or discard approved subtitles. +[PR #398](https://github.com/sonilo-ai/sonilo-api-dashboard/pull/398) adds +the existing secret reference to MCP and a regression +check covering both public and MCP preflight surfaces; the new check fails +against the old configuration and passes with the mapping. + ## OAuth test-client incident The first temporary connection expired after waiting for authorization. On a From 8dd2b49800aba7648bdd1cacec0a42f8faa0a2a0 Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Sat, 3 Oct 2026 13:54:57 -0700 Subject: [PATCH 10/18] docs: verify deployed subtitle fix and full dubbing continuation --- docs/LIVE_TEST_1.1.0.md | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/docs/LIVE_TEST_1.1.0.md b/docs/LIVE_TEST_1.1.0.md index 146ce15..cadc79e 100644 --- a/docs/LIVE_TEST_1.1.0.md +++ b/docs/LIVE_TEST_1.1.0.md @@ -1,6 +1,6 @@ # v1.1.0 verification — October 2–3, 2026 (Pacific) -**Release status: JSON-array fix deployed; approved-subtitle dubbing uncovered a deployment configuration blocker.** +**Release status: both hosted fixes deployed; full-video approved-subtitle flow passed. Conversation and listening checks remain.** Backend [PR #393](https://github.com/sonilo-ai/sonilo-api-dashboard/pull/393) fixes the six affected optional JSON-array string arguments without changing @@ -22,10 +22,10 @@ local; no tokens, reviewer credentials, or signed result links are committed. | Feature | Observed result | | --- | --- | -| Subtitle review before dubbing | Subtitle generation passed on the synthetic spoken fixture: six English cues and their Spanish translations were returned, downloaded, and reviewed against the fixed narration. Approved-script dubbing reaches preflight but is blocked by a missing MCP container credential (see below). A separate silent source correctly returned `TRANSCRIPTION_EMPTY`. | +| Subtitle review before dubbing | Subtitle generation passed on the synthetic spoken fixture: six English cues and their Spanish translations were returned, downloaded, and reviewed against the fixed narration. After PR #398, the same approved Spanish SRT passes preflight and produces a readable full 22-second video and aligned SRT; all six cues retain the approved text. A separate silent source correctly returned `TRANSCRIPTION_EMPTY`. | | Music and effects together | Passed: one call produced a video, music track, and effects track. All three URLs were readable; video contains H.264 and AAC and is 20 seconds long. | | Free dubbing preview | Passed after deployment: explicit Spanish JSON-string language input started an eligible free preview. The result is a readable H.264/AAC video exactly 15 seconds long; returned metadata identifies the 22-second original, one language, and trimming. | -| Full video after preview | Full original video plus approved Spanish subtitles was submitted after the preview. Preflight failed before task creation because the MCP container lacks its pipeline credential; full output is not yet verified. | +| Full video after preview | Passed after PR #398: the 15-second preview was followed by a request using the original 22-second video and approved Spanish subtitles. Both delivered video and audio are 22 seconds; no preview metadata appears in the full result. | | Balance and trial lookup | Passed: actual decimal USD balance and per-service trial data returned through OAuth. | | Credit-error guidance | Guide routes passed. Isolated authenticated MCP tests cover exhausted trials and insufficient balance with real billing/ledger code: no task, usage record, debit, or generation dispatch occurs. Production rejection and Codex's reply remain untested. | | Continue after account update | Isolated authenticated MCP tests pass: a credit becomes visible on the same connection, reading balance does not retry, and one explicit resubmission creates one task and debit with the original arguments. No production funding change was performed; Codex's conversation behavior remains untested. | @@ -66,7 +66,7 @@ validation errors for invalid arrays, rather than the old string/list error. Valid Spanish dubbing and timed video-SFX inputs now create successful tasks. Do not omit requested languages, which would select multiple defaults. -## Approved-subtitle preflight configuration blocker +## Approved-subtitle preflight configuration blocker resolved The full-video continuation used the original 22-second fixture and the reviewed Spanish SRT returned by proofread. It failed before task creation @@ -82,7 +82,17 @@ returned generation task. Do not retry blindly or discard approved subtitles. [PR #398](https://github.com/sonilo-ai/sonilo-api-dashboard/pull/398) adds the existing secret reference to MCP and a regression check covering both public and MCP preflight surfaces; the new check fails -against the old configuration and passes with the mapping. +against the old configuration and passes with the mapping. Its complete CI +passed 3,130 tests (19 skipped), and it merged as `e3f08de0`. +[Deployment run 37152729311](https://github.com/sonilo-ai/sonilo-api-dashboard/actions/runs/37152729311) +succeeded. ECS revision 96 reached COMPLETED with one running task and no +pending tasks; its image matches the merge commit and its secret mapping is +present. The same approved Spanish SRT now passes preflight (six cues, no +issues) and completes a full-video task. ffprobe confirms 22-second H.264 +video and 22-second AAC audio. All six aligned SRT cues preserve the approved +text exactly. Subtitle export succeeded with one informational +`zero_duration_characters` notice for one character in cue 1; every exported +cue has a positive duration. This does not establish subjective voice quality. ## OAuth test-client incident @@ -111,7 +121,11 @@ The subsequent spoken-fixture subtitle and speech-preserving music runs used one proofread trial and one video-to-music trial. The balance remained USD 4.0084. The post-deployment dubbing preview and timed-video-SFX runs each used their remaining trial; both now report zero remaining and the balance is still -USD 4.0084. No account funding or automatic paid retry was performed. +USD 4.0084. The failed preflight also left that balance unchanged. After +deploying the credential fix, one explicit full-video retest charged USD +1.2797, leaving USD 2.7287. Usage reports eight requests and USD 1.3472 total +spending, matching the original balance minus current balance. No production +account funding was changed or ambiguous request blindly resubmitted. ## Spoken fixture and portal scan @@ -180,6 +194,7 @@ refresh or the skill's behavior in a fresh conversation. The user's separate `sonilo` stdio MCP entry is also still registered, so conversation tests must verify they use the hosted tool inventory rather than its local Python tools. -Still needed: full-video and approved-script dubbing tests, the remaining -scenarios above, a clean v1.1.0 Codex conversation test, audio/timed-effect -listening verification, and current demo material. +Still needed: the remaining conversation scenarios above, a clean v1.1.0 +Codex conversation test, audio/timed-effect listening verification, and current +demo material. The fresh-conversation test awaits explicit authorization to +create a temporary Codex task; it will use read-only queries and existing media. From 95d00fff0c3ea46f19741628ac761ffb1bac4462 Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Sat, 3 Oct 2026 13:55:52 -0700 Subject: [PATCH 11/18] docs: align release notes with full dubbing verification --- docs/IMPLEMENTATION_1.1.0.md | 9 +++++---- docs/REVISION_1.1.0_NOTES.md | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/IMPLEMENTATION_1.1.0.md b/docs/IMPLEMENTATION_1.1.0.md index 67cb03f..4305937 100644 --- a/docs/IMPLEMENTATION_1.1.0.md +++ b/docs/IMPLEMENTATION_1.1.0.md @@ -1,9 +1,10 @@ # Sonilo 1.1.0 implementation -> October 3 verification update: **not release-ready**. Backend PR #393 is -> merged and deployed. Live dubbing preview and timed-SFX generation now -> succeed; full-video/script continuation and exact SFX timing still need -> verification. The current Skill upload passed its portal scan. +> October 3 verification update: **not release-ready**. Backend PRs #393 and +> #398 are merged and deployed. Live dubbing preview, full approved-script +> continuation, and timed-SFX generation now succeed. Clean Codex conversation +> checks and listening verification, including exact SFX timing, remain. +> The current Skill upload passed its portal scan. > Production media results and isolated credit-recovery coverage are recorded > in [the live verification report](LIVE_TEST_1.1.0.md). Package coverage below > is not proof that every workflow has passed a clean Codex conversation test. diff --git a/docs/REVISION_1.1.0_NOTES.md b/docs/REVISION_1.1.0_NOTES.md index 52192f9..914a329 100644 --- a/docs/REVISION_1.1.0_NOTES.md +++ b/docs/REVISION_1.1.0_NOTES.md @@ -1,9 +1,10 @@ # Revision 1.1.0 draft notes -> October 3 live-test update: **not release-ready**. Backend PR #393 is merged -> and deployed after 255 relevant tests and CI passed. Live dubbing preview -> and timed-SFX generation now succeed; full/script continuation and precise -> SFX timing still need verification. The updated Skill upload passed the +> October 3 live-test update: **not release-ready**. Backend PRs #393 and #398 +> are merged and deployed; the latest full CI passed 3,130 tests (19 skipped). +> Live dubbing preview, full approved-script continuation, and timed-SFX +> generation succeed. Clean Codex conversation and listening checks, including +> precise SFX timing, remain. The updated Skill upload passed the > portal scanner. Music variants, stems, combined output, subtitle generation, > speech-preserving output retrieval, balance, and task retrieval passed the > checks described in [the live verification report](LIVE_TEST_1.1.0.md). From 194b2542bbef1114aa7a2ad7a58d82a1faf3735c Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Sat, 3 Oct 2026 14:01:54 -0700 Subject: [PATCH 12/18] docs: verify ducking gain and prepare listening review --- docs/LIVE_TEST_1.1.0.md | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/docs/LIVE_TEST_1.1.0.md b/docs/LIVE_TEST_1.1.0.md index cadc79e..deb4829 100644 --- a/docs/LIVE_TEST_1.1.0.md +++ b/docs/LIVE_TEST_1.1.0.md @@ -32,7 +32,7 @@ local; no tokens, reviewer credentials, or signed result links are committed. | Usage examples | Bundled examples are present; selection and wording in a clean Codex session remain untested. | | Generation status | Passed: existing successful and failed tasks retrieved; repeat lookup returned the same task and media URLs. A nonexistent task returned `Task not found`. | | Multiple variants | Passed: one 10-second request with `variants_num=3` returned three distinct playable audio files. | -| Keep narration audible | Generation passed with `preserve_speech=true` and `ducking=true`: music, isolated vocals, ordinary mix, and ducked mix were returned. All four AAC files were readable; waveform comparison confirms source speech remains in both mixes. Listening quality and actual attenuation still need verification. | +| Keep narration audible | Generation passed with `preserve_speech=true` and `ducking=true`: music, isolated vocals, ordinary mix, and ducked mix were returned. All four AAC files were readable; waveform comparison confirms source speech remains in both mixes. Windowed mixture analysis measures about 10.5 dB lower music during speech than the ordinary mix, with recovery in pauses. Subjective listening quality still needs verification. | | Timed sound effects | After deployment, the documented segments string is accepted and generation succeeds with a readable 22-second H.264/AAC video. Precise event timing and sound identity still need listening verification; successful transport and output duration do not prove those. | | Instrument stems | Passed: all three variants returned drums, bass, vocals, and other tracks; all 12 stem URLs were readable. | @@ -137,8 +137,24 @@ the fixed script; the Spanish translation preserves its meaning. An aligned waveform comparison at 8 kHz found source-speech correlation of 0.9954 in isolated vocals, 0.8033 in the ordinary mix, and 0.9765 in the ducked -mix. This supports speech preservation; it is not a listening-quality score -or a measurement of the music attenuation envelope. +mix. This supports speech preservation; it is not a listening-quality score. + +A subsequent mixture analysis aligned the separately returned vocal and music +tracks to each mix at 8 kHz, then fitted their gains in 250 ms windows. Median +relative fit residuals were 1.41% (ordinary mix) and 1.61% (ducked mix). After +excluding weak music and high residuals, 62 speech windows and 11 quiet windows +remained in each mix. Median music gain during speech was 0.4232 in the +ordinary mix and 0.1270 in the ducked mix: about 10.5 dB attenuation. The ducked +music gain increased to a 0.1772 median in quiet windows and rose across the +final quiet tail from 0.1772 to 0.2876. This establishes attenuation and recovery +for this output, not subjective intelligibility or a guarantee for every input. + +A local listening page at `http://127.0.0.1:8123/` compares the actual ordinary +and ducked mixes, timed SFX, 15-second preview, and 22-second full dub. All five +browser players loaded without media errors; the SFX jump control seeks to +5 seconds without autoplay. Files and signed media links remain outside Git. +Human listening feedback on event identity/timing is pending. This page is a +result comparison, not a substitute for a fresh Codex conversation demo. The earlier October 3 MCP deployment at `3b7a2c66` did not contain the fix. The subsequent deployment at `946115c3` does, and both successful generation From 548d44f7377f3a9691f7812ee98e49d400e98f23 Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Sat, 3 Oct 2026 14:19:25 -0700 Subject: [PATCH 13/18] fix(plugin): clean public starter prompts and record fresh-session findings --- docs/LIVE_TEST_1.1.0.md | 41 ++++++++++++++++++------ plugins/sonilo/.codex-plugin/plugin.json | 4 +-- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/docs/LIVE_TEST_1.1.0.md b/docs/LIVE_TEST_1.1.0.md index deb4829..902e7a8 100644 --- a/docs/LIVE_TEST_1.1.0.md +++ b/docs/LIVE_TEST_1.1.0.md @@ -1,6 +1,6 @@ # v1.1.0 verification — October 2–3, 2026 (Pacific) -**Release status: both hosted fixes deployed; full-video approved-subtitle flow passed. Conversation and listening checks remain.** +**Release status: hosted fixes and live media checks passed; user listening acceptance recorded. Fresh conversation verification and updated review recording remain.** Backend [PR #393](https://github.com/sonilo-ai/sonilo-api-dashboard/pull/393) fixes the six affected optional JSON-array string arguments without changing @@ -32,8 +32,8 @@ local; no tokens, reviewer credentials, or signed result links are committed. | Usage examples | Bundled examples are present; selection and wording in a clean Codex session remain untested. | | Generation status | Passed: existing successful and failed tasks retrieved; repeat lookup returned the same task and media URLs. A nonexistent task returned `Task not found`. | | Multiple variants | Passed: one 10-second request with `variants_num=3` returned three distinct playable audio files. | -| Keep narration audible | Generation passed with `preserve_speech=true` and `ducking=true`: music, isolated vocals, ordinary mix, and ducked mix were returned. All four AAC files were readable; waveform comparison confirms source speech remains in both mixes. Windowed mixture analysis measures about 10.5 dB lower music during speech than the ordinary mix, with recovery in pauses. Subjective listening quality still needs verification. | -| Timed sound effects | After deployment, the documented segments string is accepted and generation succeeds with a readable 22-second H.264/AAC video. Precise event timing and sound identity still need listening verification; successful transport and output duration do not prove those. | +| Keep narration audible | Generation passed with `preserve_speech=true` and `ducking=true`: music, isolated vocals, ordinary mix, and ducked mix were returned. All four AAC files were readable; waveform comparison confirms source speech remains in both mixes. Windowed mixture analysis measures about 10.5 dB lower music during speech than the ordinary mix, with recovery in pauses. The user subsequently listened to the review page and reported no issues. | +| Timed sound effects | After deployment, the documented segments string is accepted and generation succeeds with a readable 22-second H.264/AAC video. The user subsequently listened to the review page (including the requested door/rain intervals) and reported no issues. This is human acceptance of the sample, not a guarantee of model accuracy on all inputs. | | Instrument stems | Passed: all three variants returned drums, bass, vocals, and other tracks; all 12 stem URLs were readable. | Media verification used ffprobe for actual file readability, codecs, and duration. @@ -153,7 +153,7 @@ A local listening page at `http://127.0.0.1:8123/` compares the actual ordinary and ducked mixes, timed SFX, 15-second preview, and 22-second full dub. All five browser players loaded without media errors; the SFX jump control seeks to 5 seconds without autoplay. Files and signed media links remain outside Git. -Human listening feedback on event identity/timing is pending. This page is a +On October 3, the user reported that the listening page sounded correct with no issues, resolving the subjective acceptance check. This page is a result comparison, not a substitute for a fresh Codex conversation demo. The earlier October 3 MCP deployment at `3b7a2c66` did not contain the fix. @@ -163,7 +163,8 @@ retests above ran after the new container took over. An energy-only check of the SFX output is inconclusive for event accuracy: the 3–5 second interval has more energy than the requested 5–7 second rain interval. This does not identify the sounds or establish the cause; do not -claim exact timing from this output without listening verification. +claim exact timing from the energy check alone. The user subsequently listened +to the review page and accepted the sample. The current `sonilo-workflows-1.1.0.zip` was uploaded again. The portal changed from Scanning to **Passed**. Navigation away from and back to Skills retained @@ -210,7 +211,29 @@ refresh or the skill's behavior in a fresh conversation. The user's separate `sonilo` stdio MCP entry is also still registered, so conversation tests must verify they use the hosted tool inventory rather than its local Python tools. -Still needed: the remaining conversation scenarios above, a clean v1.1.0 -Codex conversation test, audio/timed-effect listening verification, and current -demo material. The fresh-conversation test awaits explicit authorization to -create a temporary Codex task; it will use read-only queries and existing media. +Still needed: fresh conversation verification and current demo material. On +October 3 the user authorized a temporary Codex test task and accepted the +listening page. The task was created for account lookup, existing full-dub +retrieval, and usage examples, without generation or account changes. Its +first run did not pass: the installed 1.1.0 skill was selected, but only the +legacy local `mcp__sonilo__get_account_services` was available and it returned +`Invalid SONILO_API_KEY`. Hosted `get_generation_task` was absent. No generation +or account mutation occurred. Native default-config diagnostics likewise find +the installed plugin's declared `sonilo` MCP server, but runtime inventory shows +the legacy stdio server only. Disabling that legacy server in a temporary +process yields no hosted Sonilo tools; the user's actual settings are unchanged. +The connection/runtime-loading cause remains unresolved; do not count this as +a successful installed-plugin test or infer a hosted-backend regression. + +## Public sample-link cleanup + +The live 1.0.0 directory page includes an internal review-source URL in its +third starter prompt. This is distinct from the review recording field. The +1.1.0 portal draft and manifest omit that fixed URL; the remaining prompts now +use ordinary wording rather than asking users to understand public-HTTPS +terminology before they start. Media URL validation remains in the skill. +The live page will retain its current prompt until an approved update is +published. Do not delete the old sample while published prompts or review +cases still reference it. A future one-click sample should be an intentionally +public, rights-cleared asset on a stable examples URL, not a temporary reviewer +fixture. diff --git a/plugins/sonilo/.codex-plugin/plugin.json b/plugins/sonilo/.codex-plugin/plugin.json index 0ddf42a..0abab39 100644 --- a/plugins/sonilo/.codex-plugin/plugin.json +++ b/plugins/sonilo/.codex-plugin/plugin.json @@ -44,8 +44,8 @@ "termsOfServiceURL": "https://sonilo.com/terms-of-service", "defaultPrompt": [ "Create 30 seconds of jazz and provide separate drums and bass tracks.", - "Add music and sound effects to this public HTTPS video and return a new video with clear speech.", - "Translate this public HTTPS video into English subtitles for me to review before dubbing." + "Add music and sound effects to my video, keeping the voices clear.", + "Translate my video into English subtitles for me to review before dubbing." ], "brandColor": "#111111", "composerIcon": "./assets/icon.png", From 68219a07f60c579c5190b9c0cec467e05ec66322 Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Sat, 3 Oct 2026 14:35:18 -0700 Subject: [PATCH 14/18] fix(plugin): isolate hosted MCP from legacy local connection --- README.md | 6 ++- docs/IMPLEMENTATION_1.1.0.md | 5 ++- docs/LIVE_TEST_1.1.0.md | 42 ++++++++++++++++++- docs/REVISION_1.1.0_NOTES.md | 6 +-- plugins/sonilo/.mcp.json | 2 +- .../sonilo/skills/sonilo-workflows/SKILL.md | 7 ++++ .../sonilo-workflows/agents/openai.yaml | 2 +- scripts/check_release.py | 6 ++- 8 files changed, 64 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 07961ec..f0fadf6 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,11 @@ The first time Codex calls a Sonilo tool, it opens your browser to sign in to your [Sonilo Platform](https://platform.sonilo.com) account and approve access (authorize → consent → callback). Codex stores the resulting token locally per user; the plugin itself ships no key, secret, or token. Run -`codex mcp login sonilo` anytime to review or refresh the connection. +`codex mcp login sonilo_platform` anytime to review or refresh the connection. +The bundled connection is named `sonilo_platform` so an existing local Python +MCP named `sonilo` cannot override it. When upgrading a local installation, +reinstall the plugin and reconnect this hosted server. If the desktop app still +shows only the old tools, restart the app before starting a new conversation. ## Capabilities diff --git a/docs/IMPLEMENTATION_1.1.0.md b/docs/IMPLEMENTATION_1.1.0.md index 4305937..0e4b9fb 100644 --- a/docs/IMPLEMENTATION_1.1.0.md +++ b/docs/IMPLEMENTATION_1.1.0.md @@ -3,8 +3,9 @@ > October 3 verification update: **not release-ready**. Backend PRs #393 and > #398 are merged and deployed. Live dubbing preview, full approved-script > continuation, and timed-SFX generation now succeed. Clean Codex conversation -> checks and listening verification, including exact SFX timing, remain. -> The current Skill upload passed its portal scan. +> checks and updated review recording remain. The user accepted the listening page. +> The bundled MCP now uses `sonilo_platform` to avoid the legacy local name. +> A revised Skill upload is awaiting its new portal scan. > Production media results and isolated credit-recovery coverage are recorded > in [the live verification report](LIVE_TEST_1.1.0.md). Package coverage below > is not proof that every workflow has passed a clean Codex conversation test. diff --git a/docs/LIVE_TEST_1.1.0.md b/docs/LIVE_TEST_1.1.0.md index 902e7a8..7cad9e0 100644 --- a/docs/LIVE_TEST_1.1.0.md +++ b/docs/LIVE_TEST_1.1.0.md @@ -222,8 +222,8 @@ or account mutation occurred. Native default-config diagnostics likewise find the installed plugin's declared `sonilo` MCP server, but runtime inventory shows the legacy stdio server only. Disabling that legacy server in a temporary process yields no hosted Sonilo tools; the user's actual settings are unchanged. -The connection/runtime-loading cause remains unresolved; do not count this as -a successful installed-plugin test or infer a hosted-backend regression. +This first failure was not a successful installed-plugin test and did not +establish a hosted-backend regression. See the follow-up below. ## Public sample-link cleanup @@ -237,3 +237,41 @@ published. Do not delete the old sample while published prompts or review cases still reference it. A future one-click sample should be an intentionally public, rights-cleared asset on a stable examples URL, not a temporary reviewer fixture. + + +## Hosted/local MCP name collision repair (October 3) + +A controlled package-only change from the MCP key `sonilo` to `sonilo_platform` +resolves the connection collision in a fresh Codex app-server process, without +changing the user's global stdio configuration or injecting a replacement MCP +entry. Before the rename, the runtime exposed only the legacy local schemas. +After reinstalling the renamed plugin, it identifies the production HTTPS +origin and requests OAuth. Native OAuth completed successfully with the same +account and scopes; inventory then reports `authStatus: oAuth`, no tool error, +and all 15 hosted tools, including `get_generation_task`. + +The skill dependency and reconnect instructions now use `sonilo_platform`. +Workflow guidance explicitly prevents falling back to the legacy local server. +The release checker enforces the distinct server key and matching dependency. +All nine installed files match the current package source. Both ZIPs were +rebuilt, and the revised Skill ZIP was uploaded to the existing 1.1.0 draft. + +The running desktop app still exposes only legacy tools in both the existing +and a newly created temporary test chat. Those chats correctly stop without +calling the old server; they do not establish successful balance/task reads. +A separate CLI attempt to resume the existing chat was rejected because the +desktop app owns its active writer; no writer lock was removed. Do not count +successful standalone discovery as proof that the desktop cache has refreshed. + + +A fresh ephemeral Codex CLI conversation using the normal installed plugin +(no MCP config override, no direct SDK/HTTP fallback) passed both reads: +`mcp__sonilo_platform__get_account_services` returned cash balance `2.7287` +USD and the actual exhausted music/dubbing trial counts; +`mcp__sonilo_platform__get_generation_task` retrieved the existing successful +Spanish full dub with video and SRT. Both tool calls completed once, with no +new generation or charge. This verifies the installed plugin in a restarted +Codex runtime; the desktop process still requires a reload/restart and retest. +Local release validation and `git diff --check` pass. The latest uploaded Skill +was still scanning at the last portal observation; the earlier Passed badge +must not be attributed to this revised ZIP. diff --git a/docs/REVISION_1.1.0_NOTES.md b/docs/REVISION_1.1.0_NOTES.md index 914a329..e4db150 100644 --- a/docs/REVISION_1.1.0_NOTES.md +++ b/docs/REVISION_1.1.0_NOTES.md @@ -3,9 +3,9 @@ > October 3 live-test update: **not release-ready**. Backend PRs #393 and #398 > are merged and deployed; the latest full CI passed 3,130 tests (19 skipped). > Live dubbing preview, full approved-script continuation, and timed-SFX -> generation succeed. Clean Codex conversation and listening checks, including -> precise SFX timing, remain. The updated Skill upload passed the -> portal scanner. Music variants, stems, combined output, subtitle generation, +> generation succeed, and the user accepted the listening page. Clean Codex +> conversation checks and a current recording remain. The latest connection +> routing revision has been uploaded for a new Skill scan. Music variants, stems, combined output, subtitle generation, > speech-preserving output retrieval, balance, and task retrieval passed the > checks described in [the live verification report](LIVE_TEST_1.1.0.md). > Earlier preparation notes below do not supersede these findings. diff --git a/plugins/sonilo/.mcp.json b/plugins/sonilo/.mcp.json index c22e365..35f7576 100644 --- a/plugins/sonilo/.mcp.json +++ b/plugins/sonilo/.mcp.json @@ -1,6 +1,6 @@ { "mcpServers": { - "sonilo": { + "sonilo_platform": { "type": "http", "url": "https://api.sonilo.com/mcp", "scopes": [ diff --git a/plugins/sonilo/skills/sonilo-workflows/SKILL.md b/plugins/sonilo/skills/sonilo-workflows/SKILL.md index 87beec0..f02213e 100644 --- a/plugins/sonilo/skills/sonilo-workflows/SKILL.md +++ b/plugins/sonilo/skills/sonilo-workflows/SKILL.md @@ -9,6 +9,13 @@ Use the connected hosted MCP schemas and returned data as the source of truth. This plugin does not install the local `sonilo-mcp` Python server. Do not assume a tool or parameter exists because it appears in that repository. +For the bundled connection, use the `sonilo_platform` MCP server. If a legacy +local `sonilo` server is also available, do not use it for this workflow or +fall back to it after a hosted authentication error. Reconnect the hosted +Sonilo Platform connection instead. Registered directory connections may +use a different namespace; identify them by their hosted schemas, including +`get_generation_task`, rather than assuming every Sonilo tool is equivalent. + ## Account identity and availability - A Sonilo Platform account is required. OAuth connects the user to diff --git a/plugins/sonilo/skills/sonilo-workflows/agents/openai.yaml b/plugins/sonilo/skills/sonilo-workflows/agents/openai.yaml index 8cf3e14..c8f7c14 100644 --- a/plugins/sonilo/skills/sonilo-workflows/agents/openai.yaml +++ b/plugins/sonilo/skills/sonilo-workflows/agents/openai.yaml @@ -6,7 +6,7 @@ interface: dependencies: tools: - type: "mcp" - value: "sonilo" + value: "sonilo_platform" description: "Sonilo Platform music, sound-effects, subtitles, and dubbing MCP server" transport: "streamable_http" url: "https://api.sonilo.com/mcp" diff --git a/scripts/check_release.py b/scripts/check_release.py index d211674..65d65de 100644 --- a/scripts/check_release.py +++ b/scripts/check_release.py @@ -170,7 +170,9 @@ def check_local() -> None: require(manifest.get("mcpServers") == "./.mcp.json", "manifest must reference .mcp.json") require(WORKFLOW_SKILL_PATH.is_file(), "bundled sonilo-workflows skill is missing") require(WORKFLOW_AGENT_PATH.is_file(), "bundled sonilo-workflows agent metadata is missing") - sonilo_mcp = mcp_config.get("mcpServers", {}).get("sonilo", {}) + servers = mcp_config.get("mcpServers", {}) + require(set(servers) == {"sonilo_platform"}, "hosted MCP must avoid the legacy local sonilo server name") + sonilo_mcp = servers["sonilo_platform"] require(sonilo_mcp.get("type") == "http", "MCP transport type must be http") require(sonilo_mcp.get("url") == MCP_URL, f"MCP URL must be {MCP_URL}") require(sonilo_mcp.get("scopes") == ["profile"], "MCP OAuth scope must be limited to profile") @@ -303,7 +305,7 @@ def check_local() -> None: ) require("Poll `get_generation_task`" in skill, "skill must document asynchronous polling") agent_metadata = WORKFLOW_AGENT_PATH.read_text(encoding="utf-8") - require('value: "sonilo"' in agent_metadata, "skill agent metadata must depend on Sonilo MCP") + require('value: "sonilo_platform"' in agent_metadata, "skill dependency must match the hosted MCP server name") require(f'url: "{MCP_URL}"' in agent_metadata, "skill agent metadata has the wrong MCP URL") entries = marketplace.get("plugins", []) From beba602d7bf0c0dad294ed90ac92165bad967dc8 Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Sat, 3 Oct 2026 14:36:46 -0700 Subject: [PATCH 15/18] docs: record revised skill scan passing --- docs/IMPLEMENTATION_1.1.0.md | 2 +- docs/LIVE_TEST_1.1.0.md | 6 +++--- docs/REVISION_1.1.0_NOTES.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/IMPLEMENTATION_1.1.0.md b/docs/IMPLEMENTATION_1.1.0.md index 0e4b9fb..1e5e384 100644 --- a/docs/IMPLEMENTATION_1.1.0.md +++ b/docs/IMPLEMENTATION_1.1.0.md @@ -5,7 +5,7 @@ > continuation, and timed-SFX generation now succeed. Clean Codex conversation > checks and updated review recording remain. The user accepted the listening page. > The bundled MCP now uses `sonilo_platform` to avoid the legacy local name. -> A revised Skill upload is awaiting its new portal scan. +> The revised Skill upload passed its new portal scan. > Production media results and isolated credit-recovery coverage are recorded > in [the live verification report](LIVE_TEST_1.1.0.md). Package coverage below > is not proof that every workflow has passed a clean Codex conversation test. diff --git a/docs/LIVE_TEST_1.1.0.md b/docs/LIVE_TEST_1.1.0.md index 7cad9e0..9719489 100644 --- a/docs/LIVE_TEST_1.1.0.md +++ b/docs/LIVE_TEST_1.1.0.md @@ -272,6 +272,6 @@ USD and the actual exhausted music/dubbing trial counts; Spanish full dub with video and SRT. Both tool calls completed once, with no new generation or charge. This verifies the installed plugin in a restarted Codex runtime; the desktop process still requires a reload/restart and retest. -Local release validation and `git diff --check` pass. The latest uploaded Skill -was still scanning at the last portal observation; the earlier Passed badge -must not be attributed to this revised ZIP. +Local release validation and `git diff --check` pass. After the new upload +completed, reloading the portal and returning to Skills showed **Passed** for +the revised ZIP. This verifies its scanner result, not plugin review approval. diff --git a/docs/REVISION_1.1.0_NOTES.md b/docs/REVISION_1.1.0_NOTES.md index e4db150..c36a520 100644 --- a/docs/REVISION_1.1.0_NOTES.md +++ b/docs/REVISION_1.1.0_NOTES.md @@ -5,7 +5,7 @@ > Live dubbing preview, full approved-script continuation, and timed-SFX > generation succeed, and the user accepted the listening page. Clean Codex > conversation checks and a current recording remain. The latest connection -> routing revision has been uploaded for a new Skill scan. Music variants, stems, combined output, subtitle generation, +> routing revision passed its new Skill scan. Music variants, stems, combined output, subtitle generation, > speech-preserving output retrieval, balance, and task retrieval passed the > checks described in [the live verification report](LIVE_TEST_1.1.0.md). > Earlier preparation notes below do not supersede these findings. From 5a434ca041d1d8bf062795b745357b5ec8b1397b Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Sun, 4 Oct 2026 18:54:14 -0700 Subject: [PATCH 16/18] docs: record desktop acceptance and prepare review handoff --- docs/IMPLEMENTATION_1.1.0.md | 14 ++++----- docs/LIVE_TEST_1.1.0.md | 46 ++++++++++++++++++++++++++++- docs/REVIEW_RECORDING_1.1.0.md | 53 ++++++++++++++++++++++++++++++++++ docs/REVISION_1.1.0_NOTES.md | 14 ++++----- 4 files changed, 108 insertions(+), 19 deletions(-) create mode 100644 docs/REVIEW_RECORDING_1.1.0.md diff --git a/docs/IMPLEMENTATION_1.1.0.md b/docs/IMPLEMENTATION_1.1.0.md index 1e5e384..757e7b1 100644 --- a/docs/IMPLEMENTATION_1.1.0.md +++ b/docs/IMPLEMENTATION_1.1.0.md @@ -1,14 +1,10 @@ # Sonilo 1.1.0 implementation -> October 3 verification update: **not release-ready**. Backend PRs #393 and -> #398 are merged and deployed. Live dubbing preview, full approved-script -> continuation, and timed-SFX generation now succeed. Clean Codex conversation -> checks and updated review recording remain. The user accepted the listening page. -> The bundled MCP now uses `sonilo_platform` to avoid the legacy local name. -> The revised Skill upload passed its new portal scan. -> Production media results and isolated credit-recovery coverage are recorded -> in [the live verification report](LIVE_TEST_1.1.0.md). Package coverage below -> is not proof that every workflow has passed a clean Codex conversation test. +> October 4 update: desktop hosted balance/task reads and all three portal +> refusal scenarios pass. The user accepted the prior listening samples. +> Backend fixes are deployed and the Skill scan passed. A current actual +> walkthrough and final review attestations/submission remain. See +> [the live report](LIVE_TEST_1.1.0.md) for verification scope and limitations. Scope: the 13 features in the [manager plan](https://docs.google.com/document/d/1woqbRgMlCemdw46mpP6Wz1uDkVUK9_C4QyPi2cX2y0s/edit). diff --git a/docs/LIVE_TEST_1.1.0.md b/docs/LIVE_TEST_1.1.0.md index 9719489..f8742d2 100644 --- a/docs/LIVE_TEST_1.1.0.md +++ b/docs/LIVE_TEST_1.1.0.md @@ -1,6 +1,6 @@ # v1.1.0 verification — October 2–3, 2026 (Pacific) -**Release status: hosted fixes and live media checks passed; user listening acceptance recorded. Fresh conversation verification and updated review recording remain.** +**Release status: hosted fixes, media verification, desktop connection, and refusal checks passed. Updated recording and review submission remain.** Backend [PR #393](https://github.com/sonilo-ai/sonilo-api-dashboard/pull/393) fixes the six affected optional JSON-array string arguments without changing @@ -275,3 +275,47 @@ Codex runtime; the desktop process still requires a reload/restart and retest. Local release validation and `git diff --check` pass. After the new upload completed, reloading the portal and returning to Skills showed **Passed** for the revised ZIP. This verifies its scanner result, not plugin review approval. + + +## October 4 desktop acceptance and submission preparation + +The desktop conversation now exposes `sonilo_platform` alongside the legacy +local server. Direct hosted `get_account_services` and `get_generation_task` +calls succeed. Account data initially reported USD 2.7287; the existing full +Spanish dub returned succeeded, video, and SRT. This resolves the desktop +connection blocker above; no legacy tool was used. + +The temporary desktop acceptance chat passed six scenarios: account lookup, +existing-task continuation, an explanation-only preview/full-version question, +rejection of loopback and local-file media inputs, capability advice without +generation, and a nonexistent task returning `Task not found` without retry. +The three exact portal negative prompts were also checked independently: +creative music advice, unsupported visual editing, and HTTPS loopback media. +All three caused zero Sonilo calls. A separate `get_usage(days=30)` call passed +and was correctly distinguished from cash balance. + +Portal test cases now use the immutable 22-second synthetic spoken fixture +instead of the old temporary reviewer-source URL. The music case requests +10-second variants, matching the successful generation; timed effects include +the final 7–22 second quiet interval. Reviewer notes disclose the guide's +View pricing / View billing buttons and explicitly state that the replacement +walkthrough is still pending. The used dubbing trial is disclosed: a free-only +request must stop rather than silently become a paid job. + +The native computer-use tool rejected Terminal access, so an actual CLI screen +recording could not be captured with that tool. No output montage, rendered +transcript, or results page was substituted for a real plugin recording. +The previous recording URL remains in the draft and is marked as incomplete +coverage in the reviewer notes. The final page requires explicit acceptance +of OpenAI terms plus compliance, rights, and age-suitability attestations; +these remain unchecked. No submission or publication has occurred. + + +Two additional production generations on October 4 completed successfully +through the installed hosted tools: a 3-second cinematic text sound effect, +and the 22-second spoken fixture with combined music/effects, +`preserve_speech=true`, and `ducking=true`. The latter returned a new video, +music, effects, and processed-music tracks. The balance changed from USD +2.7287 to USD 2.4065 (USD 0.3222 for these tests). Earlier user listening +acceptance applies to the previous samples, not these new outputs. +The recording handoff is in [REVIEW_RECORDING_1.1.0.md](REVIEW_RECORDING_1.1.0.md). diff --git a/docs/REVIEW_RECORDING_1.1.0.md b/docs/REVIEW_RECORDING_1.1.0.md new file mode 100644 index 0000000..cefb15c --- /dev/null +++ b/docs/REVIEW_RECORDING_1.1.0.md @@ -0,0 +1,53 @@ +# v1.1.0 recording handoff + +Record the actual installed plugin in Codex or the supported developer-mode +client. Show the prompt, actual tool invocation, returned result, and playback. +Do not present the listening page or a recreated transcript as a conversation +recording. Waiting periods may be edited out if the edit is labeled. Keep +passwords, OAuth codes, tokens, and unrelated account information off screen. + +Use the synthetic 22-second spoken fixture: + +https://raw.githubusercontent.com/sonilo-ai/sonilo-codex-plugin/e9fc90c4ce639fced00db16fca5e0530da2b0394/tests/fixtures/speech-demo.mp4 + +## Five positive cases + +1. “What is my current cash balance, how many free text-to-music runs remain, + and how much have I spent in the past 30 days?” Show separate current balance + and historical usage; this does not generate media. +2. “Create three 10-second upbeat jazz music options for a product demo. + Include separate drums and bass tracks for editing.” Show three distinct + results and their actual stems; play one result. +3. “Create a cinematic 3-second whoosh sound effect.” Then separately request + door closing at 2–3 seconds and rain at 5–7 seconds on the fixture, with no + added effects elsewhere, and ask for a new video. Show actual outputs. +4. Ask for light cinematic music and subtle effects on the fixture, preserving + speech and lowering music while people speak. Ask “Is that video ready?” + while it is processing. Show reuse of the task ID and the final video. +5. Request Spanish subtitles first, inspect the returned Spanish SRT, then + explicitly approve that file for Spanish dubbing of the same full source. + Show the resulting full video and subtitles. In a separate conversation, + request a free-only Spanish preview. The reviewer account has used this + trial: the correct current response is no free preview, with no paid job. + +The generation requests above may consume existing balance. Check actual +account data first. Record a real rejection honestly; do not automatically +retry, alter production funds, or reset trial counters to stage a result. + +## Three negative cases + +- “What kinds of music could work for a calm product demo?” Advice only. +- “Change the colors, typography, and transitions in my presentation video.” + Explain the unsupported visual edits; do not generate unrelated audio. +- “Add music to https://127.0.0.1/private-video.mp4 and give me the finished + video.” Reject the private URL without fetching it or calling Sonilo. + +## Final handoff + +Upload the genuine recording to a stable reviewer-accessible URL, replace the +draft's Demo Recording URL, and confirm it plays without extra access steps. +The existing recording is legacy evidence and must not be described as this +v1.1.0 walkthrough. Review the portal's legal/compliance attestations at the +time of submission. The help page's onward pricing/billing buttons are already +disclosed in reviewer notes; their acceptance is not established. Submission +and publication are separate actions, with publication requiring approval. diff --git a/docs/REVISION_1.1.0_NOTES.md b/docs/REVISION_1.1.0_NOTES.md index c36a520..3af92f4 100644 --- a/docs/REVISION_1.1.0_NOTES.md +++ b/docs/REVISION_1.1.0_NOTES.md @@ -1,14 +1,10 @@ # Revision 1.1.0 draft notes -> October 3 live-test update: **not release-ready**. Backend PRs #393 and #398 -> are merged and deployed; the latest full CI passed 3,130 tests (19 skipped). -> Live dubbing preview, full approved-script continuation, and timed-SFX -> generation succeed, and the user accepted the listening page. Clean Codex -> conversation checks and a current recording remain. The latest connection -> routing revision passed its new Skill scan. Music variants, stems, combined output, subtitle generation, -> speech-preserving output retrieval, balance, and task retrieval passed the -> checks described in [the live verification report](LIVE_TEST_1.1.0.md). -> Earlier preparation notes below do not supersede these findings. +> October 4 update: desktop hosted balance/task reads and all three portal +> refusal scenarios pass. The user accepted the prior listening samples. +> Backend fixes are deployed and the Skill scan passed. A current actual +> walkthrough and final review attestations/submission remain. See +> [the live report](LIVE_TEST_1.1.0.md) for verification scope and limitations. ## Release notes From 1b466afc1286af825e3f910a28beac610916839e Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Thu, 8 Oct 2026 18:48:27 -0700 Subject: [PATCH 17/18] feat(skill): use create_upload_url for local files The hosted MCP server gains a free create_upload_url tool (sonilo-api-dashboard#407). The workflow skill told Codex to refuse a local file and ask for a public HTTPS URL, which would leave the new tool unused. Add a "Use a local file" section: upload only a file the user named, PUT it to the returned upload_url, pass file_url as the tool input, and fall back to asking for a public URL when the tool is missing or the PUT cannot be made. Uploading to any third-party host stays prohibited. Co-Authored-By: Claude Opus 5.5 (1M context) --- README.md | 5 +++- .../sonilo/skills/sonilo-workflows/SKILL.md | 30 ++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f0fadf6..edda901 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,10 @@ feature reference, but its local-file and playback tools are not bundled here. - "What is my cash balance, and how many free text-to-music runs remain?" Use real public HTTPS media URLs in place of the labels above. A local file -or attachment is not a hosted media URL. The plugin returns actual result +or attachment is not a hosted media URL: when the hosted `create_upload_url` +tool is available and Codex can run the upload, the plugin uploads a file you +name to temporary storage on your Sonilo Platform account and uses the link it +gets back; otherwise it asks for a public HTTPS URL. The plugin returns actual result links for previews, subtitles, videos, variants, and stems. ### Account status and continuation diff --git a/plugins/sonilo/skills/sonilo-workflows/SKILL.md b/plugins/sonilo/skills/sonilo-workflows/SKILL.md index f02213e..e186428 100644 --- a/plugins/sonilo/skills/sonilo-workflows/SKILL.md +++ b/plugins/sonilo/skills/sonilo-workflows/SKILL.md @@ -46,7 +46,34 @@ user-supplied video, audio, and subtitle URL. - Do not claim that a URL is public merely because it uses HTTPS. The hosted service remains responsible for DNS resolution, redirect validation, and SSRF protections. A filename or local attachment is not a public URL; do not - upload a user's file to an external host without authorization. + upload a user's file to a third-party host to obtain one. The only supported + upload path is the one below. + +## Use a local file + +When the user asks to process a file on their own machine, use the hosted +`create_upload_url` tool if it is among the connected tools and this +environment can send the file's bytes in an HTTP PUT. + +1. Proceed only when the request clearly covers that file, and say that the + file will be uploaded to temporary storage on the user's Sonilo Platform + account. Do not upload files the user did not name. +2. Call `create_upload_url` with the file's name and its exact size in bytes. + It is free and creates no task. It accepts video, audio, `.srt`, and `.vtt` + files up to `max_upload_size_mb` from `get_account_services`. +3. Send the raw bytes to the returned `upload_url` with one HTTP PUT, for + example `curl -T ""`, adding no authorization header. + A 403 means the size did not match or the URL expired: request a new URL + instead of retrying the old one. +4. Once the PUT succeeds, pass the returned `file_url` wherever the chosen + tool takes a media or subtitle URL. A `file_url` from this tool is a valid + input; do not ask for a public URL in its place. + +Treat `upload_url` as a credential for that one upload: never show it to the +user, log it, or reuse it. Do not present `file_url` as a result or download +link; uploads are temporary working files. If the tool is not connected or +the PUT cannot be made here, do not try another upload route: explain that a +public `https://` URL is needed instead. ## Choose the operation @@ -73,6 +100,7 @@ explicit, sufficiently specified generation request. | Cash balance, available services, and trial counts | `get_account_services` | | Historical usage and spend | `get_usage` | | Progress or results of an existing task | `get_generation_task` | +| Make a local video, audio, or subtitle file usable as an input | `create_upload_url` (free; see Use a local file) | Use video-producing tools for a new video with the generated audio mixed in; do not substitute them for an audio-only request. Prefer a single combined From 573fb98390cfb505e10e3f05effb404aa6ab741e Mon Sep 17 00:00:00 2001 From: Steven Pan Date: Fri, 9 Oct 2026 16:33:21 -0700 Subject: [PATCH 18/18] =?UTF-8?q?feat(plugin):=201.2.0=20draft=20=E2=80=94?= =?UTF-8?q?=20generate=5Fvideo=5Fsubtitles=20and=20local-file=20upload?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The hosted server no longer lists `proofread`; the subtitle tool is `generate_video_subtitles`, with `proofread` kept only as the service key that get_account_services reports. In fresh Codex sessions the 1.1.0 skill still picked the right tool 8 times out of 9, and gave up once because `proofread` was missing. The hosted server also gained `create_upload_url`, so a file on the user's machine can be used. The skill now uploads a file the user named to the one-time URL Sonilo returns, keeps that URL out of replies, and asks for a public HTTPS link where the upload cannot run. Rules for user-supplied URLs are unchanged. plugin.json also picks up the listing copy that was sitting uncommitted in the working tree (long description and first starter prompt), since the 1.2.0 wording builds on it. check_release.py guards against routing to the retired name and checks the upload rules. See docs/REVISION_1.2.0_NOTES.md for validation and what still has to change in the portal before this is submitted. Co-Authored-By: Claude Opus 5.5 (1M context) --- README.md | 20 +++-- docs/REVISION_1.2.0_NOTES.md | 78 +++++++++++++++++++ plugins/sonilo/.codex-plugin/plugin.json | 6 +- .../sonilo/skills/sonilo-workflows/SKILL.md | 38 +++++++-- .../sonilo-workflows/references/dubbing.md | 16 ++-- .../sonilo-workflows/references/examples.md | 5 +- scripts/check_release.py | 26 ++++++- 7 files changed, 165 insertions(+), 24 deletions(-) create mode 100644 docs/REVISION_1.2.0_NOTES.md diff --git a/README.md b/README.md index f0fadf6..660a131 100644 --- a/README.md +++ b/README.md @@ -62,13 +62,15 @@ shows only the old tools, restart the app before starting a new conversation. - Place sound effects at specified times - Duck music under voice audio - Review translated subtitles before dubbing into the requested languages +- Use a video, audio, or subtitle file from your computer by uploading it to Sonilo - Use an eligible account's 15-second dubbing preview, then request a full video - Inspect current USD cash balance, account services, trial allowance, and historical usage - Retrieve an existing generation after waiting or a timeout without resubmission Features depend on the connected hosted tool schemas and account access. The [Sonilo MCP repository](https://github.com/sonilo-ai/sonilo-mcp) is a useful -feature reference, but its local-file and playback tools are not bundled here. +feature reference, but its file-path parameters and playback tools are not +bundled here; local files go through the hosted upload tool instead. ### Example prompts @@ -79,10 +81,13 @@ feature reference, but its local-file and playback tools are not bundled here. - "Generate 30 seconds of jazz with separate drums and bass tracks." - "Translate this video into English subtitles first. I will correct the product names before dubbing: ``" - "Let me try English dubbing for free: ``" +- "Add music to `~/Videos/launch.mp4` and give me the finished video." - "What is my cash balance, and how many free text-to-music runs remain?" -Use real public HTTPS media URLs in place of the labels above. A local file -or attachment is not a hosted media URL. The plugin returns actual result +Use real public HTTPS media URLs in place of the labels above, or name a +file on your computer. A local file is uploaded to Sonilo with the hosted +`create_upload_url` tool before it is processed; this needs an environment +where Codex can read the file and run the upload. The plugin returns actual result links for previews, subtitles, videos, variants, and stems. ### Account status and continuation @@ -114,7 +119,7 @@ existing account credits. Available free runs depend on the service and account; dubbing previews require one target language and no supplied script. Multiple music variants and multi-language dubbing can cost more. Account and usage tools (`get_account_services`, `get_usage`, `get_generation_task`) are -read-only and never incur a charge. Paid tools run only after you explicitly +read-only and never incur a charge. Uploading a file is also free. Paid tools run only after you explicitly ask for them. ## What this plugin connects to @@ -125,10 +130,13 @@ hosted endpoint: - **Endpoint:** `https://api.sonilo.com/mcp` (HTTPS, Streamable HTTP MCP) - **Authorization server:** Sonilo's Clerk instance (OAuth 2.1 + PKCE; the plugin registers dynamically — no pre-shared client secret) -- **Data sent:** your prompts and any media URLs you provide to a tool +- **Data sent:** your prompts, any media URLs you provide to a tool, and any + local file you ask the plugin to process, which is uploaded to Sonilo as a + temporary working file - **Data stored:** the OAuth token, kept locally per user by Codex -No local command or binary is executed by this plugin. +The plugin bundles no local command or binary. Uploading a local file uses +an HTTP PUT that Codex runs in your environment when you ask for it. ## Support diff --git a/docs/REVISION_1.2.0_NOTES.md b/docs/REVISION_1.2.0_NOTES.md new file mode 100644 index 0000000..7a627d4 --- /dev/null +++ b/docs/REVISION_1.2.0_NOTES.md @@ -0,0 +1,78 @@ +# Revision 1.2.0 draft notes + +> Status — October 9, 2026: prepared locally on `codex/plugin-v1.2.0`. Not +> committed, packaged, uploaded, or submitted. Version 1.1.0 is still in +> review and has not been cancelled. + +## Why + +Two hosted tool changes landed after 1.1.0 was submitted: + +- The subtitle tool is now listed as `generate_video_subtitles`. The name + `proofread` is no longer in the hosted tool list, and OpenAI's scan no + longer shows it. The 1.1.0 skill still routes to `proofread`. +- `create_upload_url` lets the hosted server take a file from the user's + machine. The 1.1.0 skill tells the model that a local file cannot be used. + +## Release notes + +Subtitle review before dubbing now uses the hosted `generate_video_subtitles` +tool. Its availability and trial allowance are still reported under the +`proofread` service key, and the skill says so. + +Videos, audio, and subtitle files on your computer can now be used directly: +the skill uploads the file to Sonilo with the hosted upload tool and then +runs the requested workflow. Uploads go only to the one-time URL Sonilo +returns, only for a file the user named, and are temporary working files. +Where the upload cannot run, the skill asks for a public HTTPS link instead. +An edited subtitle file can be uploaded the same way before dubbing. + +Rules for user-supplied URLs are unchanged: public HTTPS only, and no tool +call for an unsafe URL. + +## Changed files + +- `plugins/sonilo/.codex-plugin/plugin.json`: version 1.2.0; the long + description no longer says media must be public HTTPS links. +- `plugins/sonilo/skills/sonilo-workflows/SKILL.md`: routing table, service-key + note, new "Use a file from the user's machine" section. +- `references/dubbing.md`, `references/examples.md`: tool name, upload of an + edited script, one local-file example. +- `scripts/check_release.py`: paid-tool list, a guard against routing to the + retired name, and guards for the upload rules. +- `README.md`: feature list, example, data-sent and local-command statements. + +## Validation recorded for this draft + +- `python3 scripts/check_release.py` and `--live` pass. +- Codex CLI 0.162.0-alpha.2, fresh non-interactive sessions, hosted MCP only + (the legacy local `sonilo` server removed from the test configuration): + - Baseline with the installed 1.1.0 skill: 8 of 9 subtitle requests chose + `generate_video_subtitles`; 1 stopped, reporting that `proofread` was not + available. + - With this draft: 6 of 6 subtitle requests chose `generate_video_subtitles`. + - Local file, network blocked: 2 of 2 called `create_upload_url`, could not + upload, started no generation, and asked for a public HTTPS link. + - Local file, network allowed: 1 of 1 uploaded (PUT 200) and then called + `video_to_video_music` with the returned link. + - Private-network `http://` URL: 1 of 1 refused with no tool call. +- Every generation call in these runs was stopped by the session's approval + policy before executing, so no task was created and nothing was charged. + The runs establish tool selection, not finished results. + +Not validated: a complete run through to a delivered result, the Codex +desktop app, ChatGPT web, the packaged ZIP, and the portal Skill scan. + +## Before submitting + +- The long description changed. The nine portal translations and + `docs/LISTING_COPY_1.1.0.json` still carry the old sentence. +- The portal's tool justifications were written for the 15 tools of 1.1.0. + They need entries for `generate_video_subtitles` and `create_upload_url`, + and the `proofread` entry removed. +- The privacy and data-use answers should mention that a local file the user + asks to process is uploaded to Sonilo. +- Check whether any of the three negative test cases expects a local file to + be refused; that behaviour changed. +- Record one end-to-end local-file run before claiming the feature in review + notes. diff --git a/plugins/sonilo/.codex-plugin/plugin.json b/plugins/sonilo/.codex-plugin/plugin.json index 0abab39..03b6f52 100644 --- a/plugins/sonilo/.codex-plugin/plugin.json +++ b/plugins/sonilo/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "sonilo", - "version": "1.1.0", + "version": "1.2.0", "description": "Generate licensed music, sound effects, mixed videos, translated subtitles, and dubbing with Sonilo Platform.", "author": { "name": "Sonilo", @@ -24,7 +24,7 @@ "interface": { "displayName": "Sonilo", "shortDescription": "Music, sound effects & dubbing", - "longDescription": "Connect your Sonilo Platform account to create licensed music, sound effects, and newly mixed videos from text or public HTTPS media. Combine music and effects, keep narration clear, request multiple music variants or instrument stems, review translated subtitles before dubbing, and retrieve generation results. Eligible accounts can preview dubbing before requesting a full video. Check your current USD cash balance, available services, free-trial allowance, and usage in Codex. Generation can consume existing account credits; read-only checks do not. Features and previews depend on account access and the connected service. Sonilo.com creator accounts are separate and cannot be used with this plugin.", + "longDescription": "Create licensed music, sound effects, and multilingual voiceovers for your videos with Sonilo.\n\n• Explore multiple music options and get separate instrument tracks for editing.\n• Get newly mixed videos with music and sound effects together, while keeping speech clear.\n• Review translated subtitles before creating a dubbed video.\n\nYou can also place sound effects at specific times, check your USD balance and free trials, and retrieve existing results after an interruption. Eligible accounts can preview dubbing before requesting the full video.\n\nConnect a Sonilo Platform account. Media inputs can be public HTTPS links or files on your computer, which are uploaded to Sonilo for processing. Generation may use existing account funds; account and task lookups are free. Features and previews depend on account access and service availability. Sonilo.com creator accounts are separate.", "developerName": "Sonilo", "category": "Creativity", "capabilities": [ @@ -43,7 +43,7 @@ "privacyPolicyURL": "https://sonilo.com/privacy-policy", "termsOfServiceURL": "https://sonilo.com/terms-of-service", "defaultPrompt": [ - "Create 30 seconds of jazz and provide separate drums and bass tracks.", + "Create three 10-second jazz music options with separate drums and bass tracks.", "Add music and sound effects to my video, keeping the voices clear.", "Translate my video into English subtitles for me to review before dubbing." ], diff --git a/plugins/sonilo/skills/sonilo-workflows/SKILL.md b/plugins/sonilo/skills/sonilo-workflows/SKILL.md index f02213e..6396542 100644 --- a/plugins/sonilo/skills/sonilo-workflows/SKILL.md +++ b/plugins/sonilo/skills/sonilo-workflows/SKILL.md @@ -1,6 +1,6 @@ --- name: sonilo-workflows -description: Create licensed music, sound effects, mixed videos, translated subtitles, and dubbed videos with a Sonilo Platform account. Check cash balance, usage, and trial allowance, preserve speech, request variants or stems, and retrieve existing tasks. Validate public HTTPS media inputs before any tool call; never direct users to pricing, checkout, subscriptions, or credit recharge. +description: Create licensed music, sound effects, mixed videos, translated subtitles, and dubbed videos with a Sonilo Platform account. Check cash balance, usage, and trial allowance, preserve speech, request variants or stems, and retrieve existing tasks. Validate public HTTPS media inputs before any tool call, and send a local file only through Sonilo's own upload tool; never direct users to pricing, checkout, subscriptions, or credit recharge. --- # Sonilo Workflows @@ -27,8 +27,9 @@ use a different namespace; identify them by their hosted schemas, including generation to check service availability and trial allowance. Check both the connected tools and `available_services`; describe an unavailable feature honestly instead of silently substituting a different paid operation. - `analyze_video` uses the service key `video_analysis`; other generation tools - in the routing table use their tool name as the service key. + `analyze_video` uses the service key `video_analysis`, and + `generate_video_subtitles` uses the service key `proofread`; other + generation tools in the routing table use their tool name as the service key. - For account, balance, trial, or insufficient-credit questions, read [account and links](references/account-and-links.md). `get_usage` reports historical spending, not the remaining balance. @@ -45,14 +46,36 @@ user-supplied video, audio, and subtitle URL. unsafe URL, attempt to transform it, or start generation. - Do not claim that a URL is public merely because it uses HTTPS. The hosted service remains responsible for DNS resolution, redirect validation, and - SSRF protections. A filename or local attachment is not a public URL; do not - upload a user's file to an external host without authorization. + SSRF protections. A filename or local attachment is not a public URL. + +## Use a file from the user's machine + +When the user asks to process a video, audio, or subtitle file that is on +their machine, upload it with `create_upload_url` instead of asking for a link. + +- Upload only a file the user named for this request, and only to the + `upload_url` that `create_upload_url` returns. Never upload a user's file to + any other host, and never upload files the user did not ask to process. +- `create_upload_url` is free. Pass the file's name and its exact size in + bytes, then send the raw bytes with one HTTP PUT whose length equals that + size, for example `curl -T ""`. Use the returned + `file_url` wherever a tool takes a URL. A `file_url` returned by this tool + already satisfies the URL rules above. +- Accepted types are common video and audio containers and `.srt` / `.vtt`. + The size limit is `max_upload_size_mb` from `get_account_services`. Report + a rejected type, size, or hourly upload limit as the service states it. +- `upload_url` is a short-lived credential: do not show it to the user or + reuse it. `file_url` is the link to keep, and an upload is a temporary + working file, not storage. +- If you cannot read the file or cannot run the upload in this environment, + say so and ask for a public HTTPS link. Do not claim an upload succeeded + unless the PUT returned 200. ## Choose the operation Generation and processing tools run only when the user clearly asks to create or process media. They may consume existing account credits. Read-only account -and task lookups do not. Explain options without generating anything when the +and task lookups do not, and neither does `create_upload_url`. Explain options without generating anything when the user asks what Sonilo can do. Do not require redundant confirmation for an explicit, sufficiently specified generation request. @@ -67,12 +90,13 @@ explicit, sufficiently specified generation request. | Music and sound effects together, delivered as audio | `video_to_sound` | | A new video with music and sound effects together | `video_to_video_sound` | | Lower existing music under a separate voice track | `audio_ducking` | -| Editable translated subtitles before dubbing | `proofread` | +| Editable translated subtitles before dubbing | `generate_video_subtitles` | | A dubbed video per requested language | `dubbing` | | A creative brief for a video | `analyze_video` (also potentially charged) | | Cash balance, available services, and trial counts | `get_account_services` | | Historical usage and spend | `get_usage` | | Progress or results of an existing task | `get_generation_task` | +| A usable link for a file on the user's machine | `create_upload_url` | Use video-producing tools for a new video with the generated audio mixed in; do not substitute them for an audio-only request. Prefer a single combined diff --git a/plugins/sonilo/skills/sonilo-workflows/references/dubbing.md b/plugins/sonilo/skills/sonilo-workflows/references/dubbing.md index acee829..aafd19e 100644 --- a/plugins/sonilo/skills/sonilo-workflows/references/dubbing.md +++ b/plugins/sonilo/skills/sonilo-workflows/references/dubbing.md @@ -2,8 +2,10 @@ ## Review the script before dubbing -1. For “translate the subtitles first; I will correct them,” use `proofread` - only. It may consume credits; it produces SRT files, not a dubbed video. +1. For “translate the subtitles first; I will correct them,” use + `generate_video_subtitles` only. Its availability and trial allowance are + listed under the service key `proofread`. It may consume credits; it + produces SRT files, not a dubbed video. Check that the service is available before submitting. 2. Return the source transcript and target-language SRT URLs actually present in the result. Report warnings without claiming the files are invalid @@ -12,7 +14,9 @@ HTTPS SRT/VTT URL per target language, with keys matching the requested languages exactly. Validate every subtitle URL as well as the video URL. If the user edits text in chat, do not silently reuse the unedited SRT: - obtain a reachable URL for the approved script before submission. + obtain a reachable URL for the approved script before submission. An + edited `.srt` or `.vtt` saved on the user's machine can be uploaded with + `create_upload_url`; use its `file_url` as the script URL. 4. Set `export_srt=true` only if the user wants aligned subtitles with the dubbed result and scripts were supplied. Deliver each language's video and any successful subtitle export; report a blocked export separately. @@ -23,8 +27,10 @@ and accidentally accept the server's multiple-language default. Ask for the target language if missing. Dubbing is billed per language. - Follow the hosted schema: `dubbing.languages` currently takes a JSON array - encoded as a string (for example, `["en"]`), while `proofread.languages` - takes a list. Do not copy local MCP parameter types or local-file options. + encoded as a string (for example, `["en"]`), while + `generate_video_subtitles.languages` takes a list. Do not copy local MCP + parameter types or path parameters; a local file goes through + `create_upload_url`. - A free dubbing preview is conditional on current account eligibility, a single target language, and no supplied subtitles. Check `trial.dubbing.remaining`; never promise every user a free preview. diff --git a/plugins/sonilo/skills/sonilo-workflows/references/examples.md b/plugins/sonilo/skills/sonilo-workflows/references/examples.md index 13e8212..e479957 100644 --- a/plugins/sonilo/skills/sonilo-workflows/references/examples.md +++ b/plugins/sonilo/skills/sonilo-workflows/references/examples.md @@ -6,14 +6,15 @@ result; substitute actual account data for illustrative numbers. | User request | Behavior and response shape | | --- | --- | -| “Translate this one-minute product demo into English subtitles first; I will correct the product name.” + video URL | Run `proofread`, return the English SRT link, and wait: “Review this English subtitle file. Send the approved script URL when you are ready to dub.” | +| “Translate this one-minute product demo into English subtitles first; I will correct the product name.” + video URL | Run `generate_video_subtitles`, return the English SRT link, and wait: “Review this English subtitle file. Send the approved script URL when you are ready to dub.” | +| “Add music to the clip at ~/Videos/launch.mp4 and give me the finished video.” | Call `create_upload_url` with the file's name and exact size, PUT the file to the returned `upload_url`, then run `video_to_video_music` once with the returned `file_url`. “I uploaded launch.mp4 to Sonilo for processing. Here is your new video with music: [video].” Never show `upload_url`. If the upload cannot run here, ask for a public HTTPS link instead. | | “Add relaxed music and waves to this 20-second beach video and give me the finished video.” + video URL | Run `video_to_video_sound` once. “Here is your new video with music and wave effects: [video].” | | “Let me try English dubbing for free on this one-minute Chinese video.” + video URL | Check single-language, no-script trial eligibility. If confirmed and the task succeeds with a trimmed preview: “Here is the first 15 seconds in English: [preview]. The remaining 45 seconds have not been processed.” Otherwise explain that a free preview is unavailable without submitting a paid job. | | “That preview sounds good. Dub the whole one-minute video.” | Refresh services, check for an existing full-video task, then submit once using the original source and English settings. “I will check your account and use the same video and language for the full version.” Do not claim it is already complete. | | “How much balance do I have, and how many free music runs remain?” | Call `get_account_services`. If it returns `cash_balance="2.5001"`, `currency="USD"`, and `trial.text_to_music.remaining=1`: “Your current cash balance is USD 2.5001. You have 1 free text-to-music run remaining.” Use actual returned values. If balance is missing: “The service did not return your cash balance.” Missing trial data is unknown, not zero. | | “Generate another 30-second upbeat track.” when rejected for insufficient balance | “The service reports insufficient balance.” If a fresh account lookup returns `cash_balance="0.0000"` and `currency="USD"`, add “Your current cash balance is USD 0.” Add “Generation did not start” only for a confirmed pre-generation rejection. Add “[Balance and free trials](https://platform.sonilo.com/usage-and-entitlements) explains how balance and trial limits work.” No automatic retry or instructions to purchase. | | “My account credits have updated. Continue the English video from before.” | Refresh account data and retrieve any prior task. Submit once only after a confirmed rejection or when the only completed task is a preview and the user wants the full video. If the refreshed response returns `cash_balance="5.0000"` and `currency="USD"`: “Your current cash balance is USD 5. I will use the same video and English settings; the service checks available funds when processing the request.” A positive balance alone does not prove sufficient funds. | -| “I am new to Sonilo. How do I ask for music for a café ad?” | No generation. “Send a public HTTPS video link and say: ‘Add warm, relaxed jazz to this 30-second café ad.’” For more examples, link to `https://platform.sonilo.com/mcp`. | +| “I am new to Sonilo. How do I ask for music for a café ad?” | No generation. “Send a public HTTPS video link, or name a video file on your computer, and say: ‘Add warm, relaxed jazz to this 30-second café ad.’” For more examples, link to `https://platform.sonilo.com/mcp`. | | “Is the English video ready?” | Retrieve the same task ID. While processing: “It is still processing. I am checking the original task, not submitting another generation.” If waiting stops, provide the task ID without promising unattended monitoring. | | “Give me three music choices for this 30-second café ad.” + video URL | Use `video_to_music` with `variants_num=3`, or the video-output tool if requested. Multiple variants use paid credits; a free-only constraint prevents this submission. Return three separately labeled actual URLs after success. | | “Add light music to my travel narration, but keep my voice clear.” + video URL | Use the requested output type with `preserve_speech=true` and `ducking=true` where supported. Link to the actual processed output, not an unducked alternative. | diff --git a/scripts/check_release.py b/scripts/check_release.py index 65d65de..14873f5 100644 --- a/scripts/check_release.py +++ b/scripts/check_release.py @@ -40,7 +40,7 @@ "audio_ducking", "video_to_sound", "video_to_video_sound", - "proofread", + "generate_video_subtitles", "dubbing", "analyze_video", } @@ -282,6 +282,30 @@ def check_local() -> None: "Do not call even a read-only Sonilo tool" in skill, "skill must reject unsafe media URLs without account lookups", ) + # `proofread` survives only as the service key that get_account_services + # reports; the hosted server no longer lists a tool by that name. + require( + "| `proofread` |" not in guidance and "use `proofread`" not in guidance + and "Run `proofread`" not in guidance, + "guidance must not route to the retired proofread tool name", + ) + require( + "uses the service key `proofread`" in skill, + "skill must map generate_video_subtitles to its proofread service key", + ) + require("`create_upload_url`" in skill, "skill is missing local-file upload guidance") + require( + "Never upload a user's file to\n any other host" in skill, + "skill must confine local-file uploads to Sonilo's upload URL", + ) + require( + "do not show it to the user" in skill, + "skill must keep the one-time upload URL out of replies", + ) + require( + "ask for a public HTTPS link" in skill, + "skill must fall back to a public link when an upload cannot run", + ) require( "Do not provide or direct users to pricing, checkout, subscription, credit" in guidance, "skill must not direct users to purchase or recharge",