Skip to content

feat!: drop legacy wire compat (kill-switch — merge when fleet upgraded) - #501

Draft
JarbasAl wants to merge 8 commits into
devfrom
feat/drop-legacy-compat
Draft

feat!: drop legacy wire compat (kill-switch — merge when fleet upgraded)#501
JarbasAl wants to merge 8 commits into
devfrom
feat/drop-legacy-compat

Conversation

@JarbasAl

@JarbasAl JarbasAl commented Aug 1, 2026

Copy link
Copy Markdown
Member

The kill-switch

This is a prepared trigger, not a change to merge today. It makes the skill
framework spec-pure on the wire.

Do not merge until the fleet upgrades, and merge it together with its
sibling drop PRs.

It is based on #500, which already removed the .intent-suffixed dual-bind.
That half really is empty now — but the survey found a second, larger family
of bridge-dependent legacy topics, so this PR is not empty.

What changed

Every topic below is a MIGRATION_MAP rename. Until now the bus bridge
delivered both spellings, so it did not matter which one the framework used.
Once the bridge goes, it does.

File Was Now
skills/ovos.py add_event('mycroft.stop', ...) SpecMessage.STOP (STOP-1 §5.3)
skills/ovos.py emit("skill.stop.pong", ...) SpecMessage.STOP_PONG (STOP-1 §4.2)
skills/ovos.py add_event('mycroft.skill.enable_intent' / '.disable_intent') SpecMessage.INTENT_ENABLE / INTENT_DISABLE (INTENT-4 §8.5)
skills/ovos.py "mycroft.audio.play_sound" / "mycroft.audio.queue" SpecMessage.AUDIO_PLAY_SOUND / AUDIO_QUEUE (AUDIO-1 §4.1–4.2)
skills/ovos.py 'mycroft.mic.listen' (×3) SpecMessage.MIC_LISTEN (AUDIO-1 §4.4)
skills/ovos.py "recognizer_loop:record_begin" / :record_end SpecMessage.LISTENER_RECORD_STARTED / _ENDED (AUDIO-IN-1 §6.1–6.2)
skills/ovos.py msg.forward("mycroft.audio.speech.stop") (×2) SpecMessage.AUDIO_STOP (AUDIO-1 §6)
decorators/killable.py Message("mycroft.audio.speech.stop") SpecMessage.AUDIO_STOP
skills/common_play.py add_event("mycroft.stop", ...) SpecMessage.STOP

What is deliberately left

Two families stay legacy on purpose. Both would have gone red in this repo's
own CI, which is the honest signal that they belong to a different train.

1. The INTENT-4 registration dual-emit (intents.py:
emit_legacy_register_vocab, emit_legacy_register_intent,
emit_legacy_register_entity, emit_legacy_register_template).

These are not a bridge dependency. MIGRATION_MAP excludes registration
explicitly — the rename is N→1, not 1:1, so no transparent bridge ever carried
it and the legacy emits still reach their consumers with the bridge gone.
Dropping them needs INTENT-4 adoption in the engines first:

ovos_adapt.opm     → listens on register_vocab, register_intent only
ovos_padatious.opm → consumes ovos.intent.register.template + ovos.entity.register

ovos-adapt has not adopted INTENT-4 yet. Removing the dual-emit today would
simply break adapt. The in-code TODOs already track this.

2. detach_skill — INTENT-4 §8.4. Same reason: ovos-adapt listens on
the legacy name and nothing else, so flipping the producer strands it. Grouped
with (1).

Also untouched, as out of scope for wire compat: mycroft.skill.handler.*
(the PIPELINE-1 §8 trio is deliberately excluded from the map),
{skill_id}.stop.ping / {skill_id}.stop (runtime-assembled placeholders),
mycroft.skill.set_cross_context / remove_cross_context,
mycroft.skills.settings.changed, question:query,
recognizer_loop:record_stop, and every @deprecated Python API shim.

Downstream this now requires

  • ovos-audio consuming ovos.audio.play_sound, ovos.audio.queue,
    ovos.audio.stop;
  • the listener consuming ovos.listener.* and ovos.mic.listen;
  • ovos-core emitting ovos.stop and listening on ovos.stop.pong — that
    half ships in the sibling ovos-core drop PR.

Tests

Assertions on the legacy spelling are flipped to the spec one:
test_decorators.py (TTS stop), test_skill.py (registered default events).

To test the post-compat world, stack the branches:

export PYTHONPATH=/path/to/ovos-spec-tools:\
/path/to/ovos-bus-client@feat/drop-legacy-wire-compat:\
/path/to/ovos-utils@feat/drop-fakebus-legacy-compat
pytest test/

Order

  1. ovos-spec-tools#88 — helpers (merged)
  2. ovos-bus-client#271, ovos-utils#411, refactor: register canonical intent topics; compat moves to ovos-spec-tools #500 — the compat train
  3. the four drop PRs, together

Merging any drop PR alone breaks the stack. They go in as one flip.


Implemented by Claude (opus), orchestrated by Claude Fable.

🤖 Generated with Claude Code

The four drop PRs

They flip together, or the stack breaks.

Repo Kill-switch PR Based on
ovos-bus-client OpenVoiceOS/ovos-bus-client#272 #271
ovos-utils OpenVoiceOS/ovos-utils#412 #411
ovos-core OpenVoiceOS/ovos-core#837 dev
ovos-workshop #501 #500

The compat train they undo: OpenVoiceOS/ovos-spec-tools#88 (merged),
OpenVoiceOS/ovos-bus-client#271, OpenVoiceOS/ovos-utils#411,
#500.

ovos-spec-tools keeps its helpers. MIGRATION_MAP, SPEC_TO_LEGACY,
migration_counterpart and ovos_spec_tools.intent_topics are pure functions
the spec linter and migration tooling use. Nothing is dropped there.

JarbasAl and others added 4 commits August 1, 2026 00:57
The dispatch topic is `<skill_id>:<intent_name>` (OVOS-MSG-1 §2.1.1). The
`.intent` extension is an authoring resource detail (OVOS-INTENT-2 §3), so it
must not reach the wire.

`register_intent_file` now derives the name with `canonical_intent_topic` and
binds one event, the canonical one. The dual add_event/remove_event on the
suffixed twin is gone; `disable_intent` / `enable_intent` /
`register_intent_layer` canonicalize the author-supplied name.

Old containerized skills still listen on the suffixed topic. That compat now
lives in ovos-spec-tools (`intent_topics`), gated by `emit_legacy` at the bus
layer, and no longer in the skill layer.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Relocated from ovoscope#127 (TestRegistrationNormalizationDedup) at the
maintainer's request: ovoscope is the harness library, not the stack, and
these guards belong next to the code they pin.

A legacy `X:Y.intent`-registered handler must still fire exactly once on a
canonical `X:Y` dispatch, and registering both spellings for one intent
must collapse to a single fire, not double-dispatch. Uses
ovos_spec_tools.intent_topics.IntentAliasRegistry (the real alias-collapse
API — the ovoscope draft referenced a nonexistent
ovos_spec_tools.intent_compat.normalize_intent_registration). Both pass
outright since #500 already registers canonical-only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1.6.0a1 is released; a bare >=1.6.0 floor cannot resolve an alpha.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ovos-workshop#500 removed the .intent-suffixed dual-bind, so that half of
the kill-switch is already done. The survey found a second, larger family:
MIGRATION_MAP renames where the framework still wrote the legacy spelling
and the bus bridge covered the difference. With the bridge gone it no longer
does.

Flipped to the SpecMessage constant:

* mycroft.stop                                   -> ovos.stop (STOP-1 §5.3)
* skill.stop.pong                                -> ovos.stop.pong (§4.2)
* mycroft.skill.enable_intent / .disable_intent  -> ovos.intent.enable /
                                                    .disable (INTENT-4 §8.5)
* mycroft.audio.play_sound / .queue              -> ovos.audio.play_sound /
                                                    ovos.audio.queue
* mycroft.mic.listen                             -> ovos.mic.listen
* recognizer_loop:record_begin / :record_end     -> ovos.listener.record.*
* mycroft.audio.speech.stop                      -> ovos.audio.stop

Two families stay legacy on purpose, and both would have gone red in this
repo's own CI - the honest signal that they belong to a different train.
The INTENT-4 registration dual-emit in intents.py is not a bridge
dependency at all: MIGRATION_MAP excludes registration because the rename
is N->1, so the legacy emits still reach their consumers. Dropping them
needs INTENT-4 adoption in the engines, and ovos-adapt still listens on
register_vocab / register_intent only. detach_skill is grouped with it for
the same reason.

BREAKING CHANGE: the skill framework emits and consumes OVOS-MSG-1 spec
topics only. ovos-audio must consume ovos.audio.play_sound, ovos.audio.queue
and ovos.audio.stop; the listener must emit ovos.listener.record.* and
consume ovos.mic.listen; ovos-core must emit ovos.stop and listen on
ovos.stop.pong.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 1, 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 Plus

Run ID: 838bc9d1-eaf5-436b-99b3-51c98cd322e3

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

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 Aug 1, 2026

Copy link
Copy Markdown
Contributor

Look what I found! The automated check results are in. 🔍

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

📋 Repo Health

Ensuring the repository stays up to date. 🔄

✅ All required files present.

Latest Version: 9.3.2a2

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

Analysis complete! Check out the details below. 📊

ruff: issues found — see job log

⚖️ License Check

Everything looks good on the legal front. ✅

✅ No license violations found.

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

🔨 Build Tests

Checking the plumbing of your data flows. 🚰

✅ All versions pass

Python Build Install Tests
3.10
3.11
3.12
3.13
3.14

🔒 Security (pip-audit)

Cybersecurity sweep: checking for vulnerabilities. 🕸️

✅ No known vulnerabilities found (74 packages scanned).


Keeping the bits in line, one repo at a time. 🔣

The alias registry is gone from ovos-spec-tools. The two guards assert the
same behavior with the pure helper the registry wrapped.
JarbasAl and others added 3 commits August 1, 2026 16:35
… into the kill-switch

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
spec-tools#92 (registry removal) merged and released as 1.6.0a2;
pin to the simplified intent_topics surface.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant