← VoiceLabsCONTENT HISTORY

Update to VoiceLabs

Snapshot Oct 27, 2026 · 06:06 UTC · version 1.0.1

WHAT CHANGED

Package or technical metadata updated

Package or technical metadata updated

Observed in package metadata. These changes alone do not establish a new customer-facing feature.

Save VoiceLabs and check future changes in Following.

Up to 3 plugins free · no card required.

All fields and original values.

These are saved file metadata. Open a changed file to read its text edits.

Package file

Before

Sep 30, 2026 · 22:54 UTC

1de9a83e9c096d394baec21c06345eae6f645593f3f56cead934d604edf8614e

After

Oct 27, 2026 · 06:06 UTC

314f0ce2cca1ccd2be8bf939b9ca4f33b63d04e162dcc08fed9efa8e63a91f7e

Package file

Before

Sep 30, 2026 · 22:54 UTC

127

After

Oct 27, 2026 · 06:06 UTC

101

Package file

Before

Sep 30, 2026 · 22:54 UTC

8db09d4eab968c394e2fd91cbcef7dda8629dd9c611c7c2b1db06753f6ebbdbf

After

Oct 27, 2026 · 06:06 UTC

97d26c30c38dbacfe61f78386fa335dcb0b8f185fc58379ba0ce6e6da5565241

Package file

Before

Sep 30, 2026 · 22:54 UTC

3187

After

Oct 27, 2026 · 06:06 UTC

8447

Compare saved observations

Download comparison JSON

Changed files

Choose a file to see its text changes. Binary or large files show metadata only.

.app.json →

.codex-plugin/plugin.json →

.mcp.json →

assets/icon-dark.png →

assets/icon.png →

assets/logo-dark.png →

assets/logo.png →

.codex-plugin/plugin.json

− removed · + added

--- before
+++ after
@@ -1,5 +1,4 @@
 {
-  "apps": "./.app.json",
   "author": {
     "name": "14930398 Canada Inc."
   },
@@ -19,8 +18,78 @@
     "shortDescription": "Text to speech and transcripts",
     "supportURL": "https://voicelabs.now/support",
     "termsOfServiceURL": "https://voicelabs.now/terms",
-    "websiteURL": "https://voicelabs.now/"
+    "websiteURL": "https://voicelabs.now/",
+    "logo": "./assets/logo.png",
+    "logoDark": "./assets/logo-dark.png",
+    "composerIcon": "./assets/icon.png",
+    "composerIconDark": "./assets/icon-dark.png"
   },
   "name": "app-6a7ae345f2dc8191bd52864d8358632a",
-  "version": "1.0.0"
-}
\ No newline at end of file
+  "version": "1.0.1",
+  "mcpServers": "./.mcp.json",
+  "extensions": {
+    "com.openai": {
+      "review": {
+        "test_cases": {
+          "positive": [
+            {
+              "description": "Tool list after consent",
+              "prompt": "What tools do you have from VoiceLabs?",
+              "tools_triggered": "tools/list",
+              "expected_behavior": "Exactly six tools are listed: list_voice_profiles, list_captures and get_generation (read-only), ensure_voice_profile (idempotent), speak and transcribe. Every tool carries all four behaviour annotations, including openWorldHint set to false, because the tools talk only to VoiceLabs' own per-account engine. If a scope was declined on the consent screen, the tools it covers are absent from this list entirely rather than failing at call time."
+            },
+            {
+              "description": "Browse the seeded voice library",
+              "prompt": "What voices do I have in my VoiceLabs library?",
+              "tools_triggered": "list_voice_profiles",
+              "expected_behavior": "Three profiles come back with a total of 3: Studio Narrator, Morning Briefing and Tutorial Explainer, each with language, default engine, voice type preset and a non-zero generation count. The response carries no emptyState block; that block appears only on a genuinely empty account."
+            },
+            {
+              "description": "Idempotent profile provisioning",
+              "prompt": "Create a built-in preset voice profile called Reviewer Narrator, then create it again with exactly the same name.",
+              "tools_triggered": "ensure_voice_profile (called twice with the same name)",
+              "expected_behavior": "The first call returns a new profile id with created set to true and voiceType preset. The second call with identical arguments returns the same id with created set to false, so nothing is duplicated. This demonstrates the idempotentHint annotation. The tool provisions only VoiceLabs' own built-in preset voices; it cannot create a cloned voice."
+            },
+            {
+              "description": "Generate speech and fetch audio",
+              "prompt": "Read this aloud in my Studio Narrator voice: The quick brown fox jumps over the lazy dog. Then tell me when it is ready and give me the audio link.",
+              "tools_triggered": "speak, get_generation",
+              "expected_behavior": "speak returns immediately with a generationId, status generating and a null audioUrl \u2014 that is success, not a failure, because synthesis is asynchronous. Polling get_generation flips the status to completed within a few seconds and returns a signed audio link on app.voicelabs.now that plays a real WAV; the link is scoped to that one generation and expires after roughly 15 minutes, so a later 403 or 404 is the link expiring rather than a broken tool. If an account's generation allowance for the period were ever used up, speak would instead return a structured QUOTA_EXCEEDED result stating the limit reached and when it resets in neutral terms, with nothing generated; the reviewer account has ample headroom, so this should not appear."
+            },
+            {
+              "description": "Transcribe a clip and list captures",
+              "prompt": "Transcribe the audio clip I just attached, then show me my most recent VoiceLabs captures.",
+              "tools_triggered": "transcribe, list_captures",
+              "expected_behavior": "transcribe is synchronous and returns a captureId, the transcript of the words actually spoken, the language and the duration in milliseconds. list_captures then shows that same capture at the top of the list with a matching transcript and source file, above the five seeded captures, newest first with pagination via limit and offset. Audio is passed as base64 capped at 10 MiB of base64 text; anything larger is refused as a clean INVALID_REQUEST before upload."
+            }
+          ],
+          "negative": [
+            {
+              "description": "Music or sound-effect generation",
+              "prompt": "Compose a 30 second background music bed for my podcast intro.",
+              "expected_behavior": ""
+            },
+            {
+              "description": "Transcribing media at a public URL",
+              "prompt": "Transcribe the audio from this YouTube link for me.",
+              "expected_behavior": ""
+            },
+            {
+              "description": "Audio editing, mixing and export",
+              "prompt": "Trim my last recording, mix music under it, and export it as an MP3 file.",
+              "expected_behavior": ""
+            }
+          ]
+        },
+        "demo_recording_url": "https://drive.google.com/file/d/1nDadWkdN4eRo0QlyBKedH19-MBeii4xG/view",
+        "commerce": false,
+        "commerce_description": ""
+      },
+      "publication": {
+        "countries": [],
+        "release_notes": "Logo refresh: the listing icons are replaced with the official 1024px brand logo. No change to the MCP server, tools, OAuth or test account."
+      }
+    }
+  },
+  "apps": "./.app.json"
+}
Full technical diff · 9 changed fields

changed /files/.app.json/sha256

BEFORE
"1de9a83e9c096d394baec21c06345eae6f645593f3f56cead934d604edf8614e"
AFTER
"314f0ce2cca1ccd2be8bf939b9ca4f33b63d04e162dcc08fed9efa8e63a91f7e"

changed /files/.app.json/size

BEFORE
127
AFTER
101

changed /files/.codex-plugin~1plugin.json/sha256

BEFORE
"8db09d4eab968c394e2fd91cbcef7dda8629dd9c611c7c2b1db06753f6ebbdbf"
AFTER
"97d26c30c38dbacfe61f78386fa335dcb0b8f185fc58379ba0ce6e6da5565241"

changed /files/.codex-plugin~1plugin.json/size

BEFORE
3187
AFTER
8447

added /files/.mcp.json

BEFORE
Field was absent
AFTER
{
  "sha256": "f6c51430769c3ae92357b162a47d5106af276016f76be9b8c3edee866eeb2a1d",
  "size": 105
}

added /files/assets~1icon-dark.png

BEFORE
Field was absent
AFTER
{
  "sha256": "80971b8531dd6d05e6cae394492ea6d513e769feb0c129fded323c5801a06f6a",
  "size": 149804
}

added /files/assets~1icon.png

BEFORE
Field was absent
AFTER
{
  "sha256": "80971b8531dd6d05e6cae394492ea6d513e769feb0c129fded323c5801a06f6a",
  "size": 149804
}

added /files/assets~1logo-dark.png

BEFORE
Field was absent
AFTER
{
  "sha256": "80971b8531dd6d05e6cae394492ea6d513e769feb0c129fded323c5801a06f6a",
  "size": 149804
}

added /files/assets~1logo.png

BEFORE
Field was absent
AFTER
{
  "sha256": "80971b8531dd6d05e6cae394492ea6d513e769feb0c129fded323c5801a06f6a",
  "size": 149804
}
Full snapshot data
{
  "files": {
    ".app.json": {
      "sha256": "314f0ce2cca1ccd2be8bf939b9ca4f33b63d04e162dcc08fed9efa8e63a91f7e",
      "size": 101
    },
    ".codex-plugin/plugin.json": {
      "sha256": "97d26c30c38dbacfe61f78386fa335dcb0b8f185fc58379ba0ce6e6da5565241",
      "size": 8447
    },
    ".mcp.json": {
      "sha256": "f6c51430769c3ae92357b162a47d5106af276016f76be9b8c3edee866eeb2a1d",
      "size": 105
    },
    "assets/icon-dark.png": {
      "sha256": "80971b8531dd6d05e6cae394492ea6d513e769feb0c129fded323c5801a06f6a",
      "size": 149804
    },
    "assets/icon.png": {
      "sha256": "80971b8531dd6d05e6cae394492ea6d513e769feb0c129fded323c5801a06f6a",
      "size": 149804
    },
    "assets/logo-dark.png": {
      "sha256": "80971b8531dd6d05e6cae394492ea6d513e769feb0c129fded323c5801a06f6a",
      "size": 149804
    },
    "assets/logo.png": {
      "sha256": "80971b8531dd6d05e6cae394492ea6d513e769feb0c129fded323c5801a06f6a",
      "size": 149804
    }
  }
}

SHA-256 of public snapshot: efb0f3787888809027b55a0f952bba5f09b5405d4483b96c4178148d50e7f90b