Skip to content

feat: dual-emit speak on ovos.utterance.speak (namespace migration)#424

Closed
JarbasAl wants to merge 3 commits into
devfrom
feat/speak-namespace-migration
Closed

feat: dual-emit speak on ovos.utterance.speak (namespace migration)#424
JarbasAl wants to merge 3 commits into
devfrom
feat/speak-namespace-migration

Conversation

@JarbasAl

Copy link
Copy Markdown
Member

What

OVOSSkill.speak() now participates in the speakovos.utterance.speak bus-namespace migration (architecture PIPELINE-1 §9.6).

During the migration nodes upgrade out of lockstep (e.g. a HiveMind satellite vs core), so the producer dual-emits the utterance on both the legacy speak topic and the new ovos.utterance.speak topic. Consumers listen on both and dedup on content (see ovos-audio companion PR).

  • Gated on Configuration().get("legacy_namespace", True):
    • True (default, during migration) → dual-emit on both topics via emit_migration_pair.
    • False → emit only the new ovos.utterance.speak topic.
  • The full payload (utterance, expect_response, meta, lang) and message context (skill_id, translation_data) are preserved on both emissions (Message.forward deep-copies context).
  • The wait/expect_response handshake is keyed on the session (SessionManager.wait_while_speaking), not on the topic, so it is unaffected by the topic change.

Flagged in code as a backwards-compat aid, removable next major (legacy branch + the speak emission go away once every node emits ovos.* only).

Changes

  • ovos_workshop/skills/ovos.py: import emit_migration_pair; dual-emit in speak().
  • pyproject.toml: pin ovos_bus_client>=2.1.2a1 (prerelease floor that carries the migration helper).
  • test/unittests/skills/test_ovos.py: TestSpeakNamespaceMigration — asserts both topics emitted when legacy_namespace=True (and by default), only the new topic when False, payload/context preserved.

Stacking / CI

Stacked on OpenVoiceOS/ovos-bus-client#228 (feat/namespace-migration-dedup), which adds TransitionalDeduplicator / utterance_key / emit_migration_pair. That release is unpublished, so the pinned >=2.1.2a1 floor is unresolvable on PyPI and CI will be red until ovos-bus-client publishes. Tests pass locally against the bus-client feature branch (17/17 in test_ovos.py).

🤖 Generated with Claude Code

OVOSSkill.speak() now emits the utterance on both the legacy "speak"
topic and the new "ovos.utterance.speak" topic (architecture PIPELINE-1
§9.6) during the bus-namespace migration, so consumers on either
namespace are reached. Gated on Configuration "legacy_namespace"
(default True); when False only the new ovos.* topic is emitted.

Uses emit_migration_pair from ovos-bus-client; full payload
(utterance/expect_response/meta/lang) and message context are preserved
on both emissions. The wait/expect_response handshake is keyed on the
session, not the topic, so it is unaffected.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b0e15c30-ef47-4d8c-bf86-9f62f0276bdd

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/speak-namespace-migration

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions

github-actions Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

I've combed through the code with a fine-tooth comb. 🔍

I've aggregated the results of the automated checks for this PR below.

📋 Repo Health

Ensuring the repo's immune system is strong (aka security checks). 🛡️

✅ All required files present.

Latest Version: 8.2.1a1

ovos_workshop/version.py — Version file
README.md — README
LICENSE — License file
pyproject.toml — pyproject.toml
⚠️ setup.py — setup.py
CHANGELOG.md — Changelog
ovos_workshop/version.py has valid version block markers

🔍 Lint

A quick update on the progress of your PR checks. 📈

ruff: issues found — see job log

🔒 Security (pip-audit)

Ensuring no malicious actors are hitching a ride. 🎭

✅ No known vulnerabilities found (72 packages scanned).

⚖️ License Check

Scanning for any 'no-derivatives' clauses. 🚫

✅ No license violations found.

Policy: Apache 2.0 (universal donor). StrongCopyleft / NetworkCopyleft / WeakCopyleft / Other / Error categories fail. MPL allowed.

🔨 Build Tests

Checking the structural resonance of the codebase. 🔊

Python Build Install Tests
3.10
3.11
3.12
3.13
3.14

❌ 3.10: Build OK, install failed
❌ 3.11: Build OK, install failed
❌ 3.12: Build OK, install failed
❌ 3.13: Build OK, install failed
❌ 3.14: Build OK, install failed
Check job logs for details.


The silent guardian of the dev branch. 🦇

JarbasAl and others added 2 commits June 25, 2026 16:52
The bus-client migration helper was reduced to a consumer-side
Deduplicator only (no emit helper), so emit the pair inline: always
emit "ovos.utterance.speak", and also emit the legacy "speak" while
Configuration "legacy_namespace" is True (default). Full payload
preserved on both; drops the removed emit_migration_pair import.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@JarbasAl JarbasAl closed this Jun 25, 2026
@JarbasAl JarbasAl deleted the feat/speak-namespace-migration branch July 1, 2026 12:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant