Skip to content

release: prepare v7.0.0#89

Merged
gaelic-ghost merged 6 commits into
mainfrom
docs/qwen-voice-design-guidance
May 9, 2026
Merged

release: prepare v7.0.0#89
gaelic-ghost merged 6 commits into
mainfrom
docs/qwen-voice-design-guidance

Conversation

@gaelic-ghost
Copy link
Copy Markdown
Owner

@gaelic-ghost gaelic-ghost commented May 9, 2026

Release

  • prepares v7.0.0 from branch docs/qwen-voice-design-guidance
  • keeps protected main updates behind pull request review and CI
  • release tag v7.0.0 will be created after CI and the review-comment gate pass, so failed or still-discussed release candidates do not get tagged

Review Loop

Before merge and tagging, scripts/repo-maintenance/release.sh watches CI and stops on review comments unless the maintainer has already addressed or resolved them and reruns with --review-comments-addressed.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 9, 2026

Review Change Stack

Caution

Review failed

The head commit changed during the review from 30f3f0c to 5054fb6.

📝 Walkthrough

Walkthrough

This PR removes legacy Marvis resident-policy and Qwen resident-model configuration support, eliminates the source_format parameter from speech-queuing APIs, and upgrades dependencies to SpeakSwiftly 8.0.0 and plugin version 7.0.0. The refactoring spans configuration storage, host state management, HTTP/MCP routing, test assertions, and documentation.

Changes

Legacy resident-model/policy and source-format removal

Layer / File(s) Summary
Dependency and version updates
.codex-plugin/plugin.json, Package.swift, Package.resolved, hooks/hooks.json, docs/codex-hooks-tts.md, docs/maintainers/source-layout.md, skills/speak-swiftly-codex-hooks/SKILL.md
Plugin version bumped from 6.2.1 to 7.0.0; SpeakSwiftly dependency updated from 7.2.7 to 8.0.0; Package.resolved origin hash and pin updated; hook command paths updated.
Type and data shape changes
Sources/SpeakSwiftlyServer/Config/RuntimeStartupConfiguration.swift, Sources/SpeakSwiftlyServer/Host/EmbeddedServerSnapshots.swift, Sources/SpeakSwiftlyServer/Host/ServerHostEvents.swift
Removed marvisResidentPolicy stored property and parameter from RuntimeStartupConfiguration; removed Qwen resident model and Marvis resident policy fields from RuntimeConfigurationSnapshot and RuntimeConfigurationStatusSnapshot; kept speech-backend and default-voice-profile fields.
Request/response payload models
Sources/SpeakSwiftlyServer/Host/ServerModels.swift
Removed helper functions for resident model/policy identifiers; removed source_format field and sourceFormatModel() resolver from SpeakRequestPayload; removed sourceFormat mapping from BatchItemRequestPayload.model(...); simplified RuntimeConfigurationUpdatePayload to accept only speech_backend; removed legacy resolver helpers.
Configuration storage and persistence
Sources/SpeakSwiftlyServer/Config/RuntimeStartupConfigurationStore.swift, Sources/SpeakSwiftlyServer/Config/ServerConfigPersistence.swift
Removed activeMarvisResidentPolicy parameter from store initializer; simplified snapshot() and save() to handle only speechBackend and defaultVoiceProfileName; removed marvis policy resolution and legacy environment fallback logic; removed marvisResidentPolicy from persisted YAML.
ServerHost runtime state
Sources/SpeakSwiftlyServer/Host/ServerHost.swift, Sources/SpeakSwiftlyServer/Host/ServerHost+EventMapping.swift, Sources/SpeakSwiftlyServer/Host/ServerHost+RuntimeControls.swift
Replaced activeMarvisResidentPolicy stored property with activeRuntimeSpeechBackend; removed activeMarvisResidentPolicy initializer parameter; updated snapshot emission to exclude resident-model/policy fields; simplified saveRuntimeConfiguration() signature.
Voice profile and request event controls
Sources/SpeakSwiftlyServer/Host/ServerHost+Profiles.swift, Sources/SpeakSwiftlyServer/Host/ServerHost+RequestEvents.swift
Removed activeMarvisResidentPolicy argument from saveDefaultVoiceProfileName() and snapshot() calls; updated backend-switch success path to refresh active speech-backend from validated snapshot.
Protocol interfaces and adapters
Sources/SpeakSwiftlyServer/Host/SpeakSwiftlyRuntimeServing.swift, Sources/SpeakSwiftlyServer/Host/SpeakSwiftlyRuntimeAdapter.swift
Removed sourceFormat: TextForSpeech.SourceFormat? parameter from queueSpeechLive() and queueSpeechFile() protocol methods and implementations.
Request handling and queuing
Sources/SpeakSwiftlyServer/Host/ServerHost+Requests.swift, Sources/SpeakSwiftlyServer/Host/EmbeddedServer.swift
Removed sourceFormat parameter from ServerHost.queueSpeechLive() and queueSpeechFile(); removed TextForSpeech import; updated EmbeddedServer action wiring to replace sourceFormat with qwenPreModelTextChunking.
HTTP routes, MCP tools, and bootstrapping
Sources/SpeakSwiftlyServer/HTTP/HTTPRuntimeRoutes.swift, Sources/SpeakSwiftlyServer/HTTP/HTTPSpeechRoutes.swift, Sources/SpeakSwiftlyServer/MCP/MCPToolCatalog.swift, Sources/SpeakSwiftlyServer/MCP/MCPToolHandlers.swift, Sources/SpeakSwiftlyServer/MCP/MCPToolSupport.swift, Sources/SpeakSwiftlyServer/EmbeddedServerSession.swift, Sources/SpeakSwiftlyServer/Resources/default-server.yaml
Removed sourceFormat argument from queueSpeechLive / queueSpeechFile calls in routes; removed qwenSpeechBackend and marvisResidentPolicy handling in PUT /configuration; updated MCP tool schemas and handlers to exclude source_format and resident-policy fields; removed source-format and policy-decoding helpers; updated embedded bootstrap action wiring.
Tests and mocks
Tests/SpeakSwiftlyServerLibraryTests/ConfigTests.swift, Tests/SpeakSwiftlyServerLibraryTests/HTTPWorkflowTests.swift, Tests/SpeakSwiftlyServerLibraryTests/HostStateTests.swift, Tests/SpeakSwiftlyServerLibraryTests/MCPCatalog*.swift, Tests/SpeakSwiftlyServerLibraryTests/MockRuntime*.swift, Tests/SpeakSwiftlyServerLibraryTests/SpeakSwiftlyServerHostTestSupport.swift
Removed assertions validating resident-model/policy snapshot fields; updated /configuration endpoint assertions to expect nil for resident fields; removed source_format from test payloads; removed sourceFormat from QueuedSpeechInvocation; updated mock runtime to set sourceFormat to nil; removed test case for unsupported format arguments.
Documentation and guides
API.md, Sources/SpeakSwiftlyServer/MCP/MCPPrompts.swift, Sources/SpeakSwiftlyServer/MCP/MCPResources.swift, docs/maintainers/speakswiftly-api-coverage-matrix.md, skills/speak-swiftly-voice-workflows/SKILL.md
Updated API contract to document only speech_backend for runtime configuration; removed source_format from POST /speech/live documentation; added voice-design guidance for Qwen3-TTS VoiceDesign self-contained design treatment; expanded voice-description prompt instructions; added speak-swiftly://voices/guide guidance; updated coverage matrix to align with SpeakSwiftly 8.x baseline.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Poem

🐰 Adieu, old models and source formats past,
We've tamed the config, made the API clean at last,
Speech-backend shines alone, so bright and clear,
Voice designs evolve in Qwen's sincere frontier. 🎙️
Version seven brings the future near!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 3.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title 'release: prepare v7.0.0' clearly and concisely summarizes the primary change: preparing a major version release. It directly aligns with the PR's stated objective of preparing v7.0.0.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/qwen-voice-design-guidance

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Sources/SpeakSwiftlyServer/Host/ServerModels.swift (1)

312-315: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Remove trailing comma that converts array to single-element tuple.

The trailing comma on line 314 after the array concatenation creates a single-element tuple ([String],) rather than an array. Tuples do not have a .joined(separator:) method, so this code will fail to compile.

🐛 Proposed fix
     let supportedFormats = (
         TextForSpeech.TextFormat.allCases.map(\.rawValue)
-            + TextForSpeech.SourceFormat.allCases.map(\.rawValue),
-    ).joined(separator: ", ")
+            + TextForSpeech.SourceFormat.allCases.map(\.rawValue)
+    ).joined(separator: ", ")
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Sources/SpeakSwiftlyServer/Host/ServerModels.swift` around lines 312 - 315,
The expression that builds supportedFormats is currently ending with a trailing
comma which creates a single-element tuple instead of an array, causing the
subsequent .joined(separator:) call to fail; fix this by removing the trailing
comma after the concatenation so the result is an Array (keep the concatenation
of TextForSpeech.TextFormat.allCases.map(\.rawValue) and
TextForSpeech.SourceFormat.allCases.map(\.rawValue) and then call
.joined(separator:) on that array), ensuring supportedFormats is a String as
intended.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Package.swift`:
- Line 32: Package.swift declares SpeakSwiftly at version "8.0.0" but
Package.resolved records a different revision; update Package.resolved so the
resolved entry for the package with URL
"https://github.com/gaelic-ghost/SpeakSwiftly.git" and the declared
product/version v8.0.0 uses the actual tag commit
075d5d984f38f52cca165dda7ec2351176a6393f (replace the incorrect revision
5d4b54a247fe4327901e35005b7696e7174d5df1) to keep Package.swift and
Package.resolved synchronized and ensure reproducible builds.

---

Outside diff comments:
In `@Sources/SpeakSwiftlyServer/Host/ServerModels.swift`:
- Around line 312-315: The expression that builds supportedFormats is currently
ending with a trailing comma which creates a single-element tuple instead of an
array, causing the subsequent .joined(separator:) call to fail; fix this by
removing the trailing comma after the concatenation so the result is an Array
(keep the concatenation of TextForSpeech.TextFormat.allCases.map(\.rawValue) and
TextForSpeech.SourceFormat.allCases.map(\.rawValue) and then call
.joined(separator:) on that array), ensuring supportedFormats is a String as
intended.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 4eeb90be-b902-4e17-9aec-976784922f91

📥 Commits

Reviewing files that changed from the base of the PR and between 6df105e and 5d3500c.

📒 Files selected for processing (44)
  • .codex-plugin/plugin.json
  • API.md
  • Package.resolved
  • Package.swift
  • Sources/SpeakSwiftlyServer/Config/RuntimeStartupConfiguration.swift
  • Sources/SpeakSwiftlyServer/Config/RuntimeStartupConfigurationStore.swift
  • Sources/SpeakSwiftlyServer/Config/ServerConfigPersistence.swift
  • Sources/SpeakSwiftlyServer/EmbeddedServerSession.swift
  • Sources/SpeakSwiftlyServer/HTTP/HTTPRuntimeRoutes.swift
  • Sources/SpeakSwiftlyServer/HTTP/HTTPSpeechRoutes.swift
  • Sources/SpeakSwiftlyServer/Host/EmbeddedServer.swift
  • Sources/SpeakSwiftlyServer/Host/EmbeddedServerSnapshots.swift
  • Sources/SpeakSwiftlyServer/Host/ServerHost+EventMapping.swift
  • Sources/SpeakSwiftlyServer/Host/ServerHost+Profiles.swift
  • Sources/SpeakSwiftlyServer/Host/ServerHost+RequestEvents.swift
  • Sources/SpeakSwiftlyServer/Host/ServerHost+Requests.swift
  • Sources/SpeakSwiftlyServer/Host/ServerHost+RuntimeControls.swift
  • Sources/SpeakSwiftlyServer/Host/ServerHost.swift
  • Sources/SpeakSwiftlyServer/Host/ServerHostEvents.swift
  • Sources/SpeakSwiftlyServer/Host/ServerModels.swift
  • Sources/SpeakSwiftlyServer/Host/SpeakSwiftlyRuntimeAdapter.swift
  • Sources/SpeakSwiftlyServer/Host/SpeakSwiftlyRuntimeServing.swift
  • Sources/SpeakSwiftlyServer/MCP/MCPPrompts.swift
  • Sources/SpeakSwiftlyServer/MCP/MCPResources.swift
  • Sources/SpeakSwiftlyServer/MCP/MCPToolCatalog.swift
  • Sources/SpeakSwiftlyServer/MCP/MCPToolHandlers.swift
  • Sources/SpeakSwiftlyServer/MCP/MCPToolSupport.swift
  • Sources/SpeakSwiftlyServer/Resources/default-server.yaml
  • Tests/SpeakSwiftlyServerLibraryTests/ConfigTests.swift
  • Tests/SpeakSwiftlyServerLibraryTests/HTTPWorkflowTests.swift
  • Tests/SpeakSwiftlyServerLibraryTests/HostStateTests.swift
  • Tests/SpeakSwiftlyServerLibraryTests/MCPCatalogListingTests.swift
  • Tests/SpeakSwiftlyServerLibraryTests/MCPCatalogResourceTests.swift
  • Tests/SpeakSwiftlyServerLibraryTests/MCPCatalogRuntimeTests.swift
  • Tests/SpeakSwiftlyServerLibraryTests/MCPValidationTests.swift
  • Tests/SpeakSwiftlyServerLibraryTests/MockRuntime+SpeechGeneration.swift
  • Tests/SpeakSwiftlyServerLibraryTests/MockRuntime.swift
  • Tests/SpeakSwiftlyServerLibraryTests/SpeakSwiftlyServerHostTestSupport.swift
  • docs/codex-hooks-tts.md
  • docs/maintainers/source-layout.md
  • docs/maintainers/speakswiftly-api-coverage-matrix.md
  • hooks/hooks.json
  • skills/speak-swiftly-codex-hooks/SKILL.md
  • skills/speak-swiftly-voice-workflows/SKILL.md
💤 Files with no reviewable changes (17)
  • Sources/SpeakSwiftlyServer/Resources/default-server.yaml
  • Sources/SpeakSwiftlyServer/Host/ServerHost+Requests.swift
  • Sources/SpeakSwiftlyServer/Host/ServerHost+EventMapping.swift
  • Tests/SpeakSwiftlyServerLibraryTests/MockRuntime.swift
  • Sources/SpeakSwiftlyServer/Host/SpeakSwiftlyRuntimeAdapter.swift
  • Tests/SpeakSwiftlyServerLibraryTests/MCPValidationTests.swift
  • Sources/SpeakSwiftlyServer/HTTP/HTTPRuntimeRoutes.swift
  • Sources/SpeakSwiftlyServer/Host/ServerHost+RequestEvents.swift
  • Sources/SpeakSwiftlyServer/Host/EmbeddedServerSnapshots.swift
  • Sources/SpeakSwiftlyServer/MCP/MCPToolSupport.swift
  • Sources/SpeakSwiftlyServer/Host/ServerHostEvents.swift
  • Sources/SpeakSwiftlyServer/Host/ServerHost.swift
  • Sources/SpeakSwiftlyServer/Host/ServerHost+Profiles.swift
  • Tests/SpeakSwiftlyServerLibraryTests/SpeakSwiftlyServerHostTestSupport.swift
  • Sources/SpeakSwiftlyServer/Host/ServerHost+RuntimeControls.swift
  • Sources/SpeakSwiftlyServer/Config/ServerConfigPersistence.swift
  • Sources/SpeakSwiftlyServer/Host/SpeakSwiftlyRuntimeServing.swift

Comment thread Package.swift
.package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.21.1"),
.package(url: "https://github.com/swiftlang/swift-docc-plugin", from: "1.1.0"),
.package(url: "https://github.com/gaelic-ghost/SpeakSwiftly.git", from: "7.2.7"),
.package(url: "https://github.com/gaelic-ghost/SpeakSwiftly.git", from: "8.0.0"),
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Verify SpeakSwiftly 8.0.0 tag exists on GitHub

# Check if tag v8.0.0 exists
gh api repos/gaelic-ghost/SpeakSwiftly/git/refs/tags/v8.0.0 --jq '.object.sha' 2>/dev/null || echo "Tag not found"

# Cross-check with the revision in Package.resolved
echo "Expected revision from Package.resolved: 5d4b54a247fe4327901e35005b7696e7174d5df1"

Repository: gaelic-ghost/SpeakSwiftlyServer

Length of output: 198


Package.swift and Package.resolved are out of sync for SpeakSwiftly 8.0.0.

The tag v8.0.0 exists on the upstream repository but points to commit 075d5d984f38f52cca165dda7ec2351176a6393f, while Package.resolved specifies revision 5d4b54a247fe4327901e35005b7696e7174d5df1. Per the coding guidelines, package graph changes in Package.swift must be kept synchronized with Package.resolved to ensure reproducible builds. Update Package.resolved to match the actual commit of the v8.0.0 tag.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Package.swift` at line 32, Package.swift declares SpeakSwiftly at version
"8.0.0" but Package.resolved records a different revision; update
Package.resolved so the resolved entry for the package with URL
"https://github.com/gaelic-ghost/SpeakSwiftly.git" and the declared
product/version v8.0.0 uses the actual tag commit
075d5d984f38f52cca165dda7ec2351176a6393f (replace the incorrect revision
5d4b54a247fe4327901e35005b7696e7174d5df1) to keep Package.swift and
Package.resolved synchronized and ensure reproducible builds.

@gaelic-ghost
Copy link
Copy Markdown
Owner Author

Addressed the normalization-format tuple concern in 30f3f0c and verified it with the focused Swift test plus diff whitespace check. The Package.resolved revision is already correct for SwiftPM: GitHub reports v8.0.0 as annotated tag object 075d5d984f38f52cca165dda7ec2351176a6393f and peeled commit 5d4b54a247fe4327901e35005b7696e7174d5df1, which is the revision recorded in Package.resolved.

@gaelic-ghost
Copy link
Copy Markdown
Owner Author

Correction: I restored the trailing comma in 5054fb6 because SwiftFormat requires it and the expression compiles; the concern is not valid for this Swift toolchain. Verified with a focused Swift test and .

@gaelic-ghost gaelic-ghost merged commit 1577d45 into main May 9, 2026
2 checks passed
@gaelic-ghost gaelic-ghost deleted the docs/qwen-voice-design-guidance branch May 9, 2026 00:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant