feat!: drop legacy wire compat (kill-switch — merge when fleet upgraded) - #501
feat!: drop legacy wire compat (kill-switch — merge when fleet upgraded)#501JarbasAl wants to merge 8 commits into
Conversation
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>
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
Look what I found! The automated check results are in. 🔍I've aggregated the results of the automated checks for this PR below. 📋 Repo HealthEnsuring the repository stays up to date. 🔄 ✅ All required files present. Latest Version: ✅ 🔍 LintAnalysis complete! Check out the details below. 📊 ❌ ruff: issues found — see job log ⚖️ License CheckEverything 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 TestsChecking the plumbing of your data flows. 🚰 ✅ All versions pass
🔒 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.
… 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>
…on' into feat/drop-legacy-compat
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_MAPrename. Until now the bus bridgedelivered both spellings, so it did not matter which one the framework used.
Once the bridge goes, it does.
skills/ovos.pyadd_event('mycroft.stop', ...)SpecMessage.STOP(STOP-1 §5.3)skills/ovos.pyemit("skill.stop.pong", ...)SpecMessage.STOP_PONG(STOP-1 §4.2)skills/ovos.pyadd_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_endSpecMessage.LISTENER_RECORD_STARTED/_ENDED(AUDIO-IN-1 §6.1–6.2)skills/ovos.pymsg.forward("mycroft.audio.speech.stop")(×2)SpecMessage.AUDIO_STOP(AUDIO-1 §6)decorators/killable.pyMessage("mycroft.audio.speech.stop")SpecMessage.AUDIO_STOPskills/common_play.pyadd_event("mycroft.stop", ...)SpecMessage.STOPWhat 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_MAPexcludes registrationexplicitly — 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-adapthas not adopted INTENT-4 yet. Removing the dual-emit today wouldsimply break adapt. The in-code
TODOs already track this.2.
detach_skill— INTENT-4 §8.4. Same reason:ovos-adaptlistens onthe 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@deprecatedPython API shim.Downstream this now requires
ovos-audioconsumingovos.audio.play_sound,ovos.audio.queue,ovos.audio.stop;ovos.listener.*andovos.mic.listen;ovos-coreemittingovos.stopand listening onovos.stop.pong— thathalf 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
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.
devThe 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_counterpartandovos_spec_tools.intent_topicsare pure functionsthe spec linter and migration tooling use. Nothing is dropped there.