feat!: OVOS-STOP-1 reserved-intent_name dispatch + separable legacy bridge#802
feat!: OVOS-STOP-1 reserved-intent_name dispatch + separable legacy bridge#802JarbasAl wants to merge 3 commits into
Conversation
Add test_stop_spec_e2e.py asserting the spec dispatch (<skill_id>:stop with
Match.skill_id==skill_id, <pipeline_id>:global_stop with skill_id==pipeline_id,
suppress_activation suppressing {skill_id}.activate, ovos.stop broadcast, and the
§5.2/§6 session drain) and test_stop_legacy_e2e.py asserting the pre-spec
stop:global/stop:skill dispatch re-emit onto mycroft.stop / <skill_id>.stop.
Supersede the prior test_stop.py / test_stop_refactor.py suites.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Return the spec dispatch shape from the stop pipeline: a targeted stop on
<skill_id>:stop with Match.skill_id==skill_id (§2/§3.1) and a global stop on
<pipeline_id>:global_stop with skill_id==pipeline_id (§5). Both set
IntentHandlerMatch.suppress_activation, and the orchestrator honours it by
registering no activation (no active_handlers push, no {skill_id}.activate) for
such a dispatch (§6.2/§7.3). The §5.2/§6 session drain (active_handlers,
converse_handlers, response_mode) is committed via Match.updated_session before
dispatch. handle_global_stop broadcasts ovos.stop (§5.3).
BREAKING CHANGE: the stop pipeline no longer dispatches stop:global/stop:skill
with skill_id=stop.openvoiceos; it dispatches the reserved intent_names
<skill_id>:stop and <pipeline_id>:global_stop. Requires ovos-plugin-manager
>=2.9.0a1 for IntentHandlerMatch.suppress_activation.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Compose a self-contained shim that observes the §9.2 ovos.intent.matched notification and re-emits the pre-spec stop:global/stop:skill dispatch, and owns the legacy stop:global/stop:skill handlers that fan out to mycroft.stop and <skill_id>.stop. Un-migrated skills still consuming <skill_id>.stop keep working when the ovos-spec-tools namespace translator is inactive. The unit lives in its own module and is wired via three lines in StopService, so it is removed in one move once every skill consumes <skill_id>:stop and ovos.stop directly. A one-time deprecation warning is logged while active. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 52 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (10)
✨ Finishing Touches🧪 Generate unit tests (beta)
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 |
Tada! The results of the latest automation run are here. 🎉I've aggregated the results of the automated checks for this PR below. 📚 DocsEnsuring your contribution is moving forward. 🚀 ✅ All required documentation files present. ✅ 🔎 Type CheckI've got some results for you! 📝 ❌ mypy: 272 error(s) found
Errors (showing first 10/272)🌍 Locale BuildThe results are in the bag! 🎒 ✅ Locale properly configured (64 files, 17 languages) Locale directories found:
Localization coverage:
pyproject.toml: ✅
Build manifest: ✅ 31 locale files included in package 🏷️ Release PreviewThe release candidate is looking strong. 💪 Caution Breaking change — this PR will bump the MAJOR version ( Current:
✅ PR title follows conventional commit format. 🚀 Release Channel Compatibility Predicted next version:
📋 Repo HealthChecking the repo's cholesterol levels (aka code bloat). 🥩 ✅ All required files present. Latest Version: ✅ 📊 CoverageMeasuring the breadth of our automated checks. 📏 Files below 80% coverage (8 files)
Full report: download the 🔌 Plugin DetectionI've checked the plugin's 'platform' compatibility matrix. 💻 Plugin Info:
OPM Detection:
Entry Point Validation:
⊘ No Issues:
🔨 Build TestsCompiling thoughts and code into something real. 🧠 ✅ All versions pass
⚖️ License CheckReading the fine print with a magnifying glass. 🔍 ✅ No license violations found. Policy: Apache 2.0 (universal donor). StrongCopyleft / NetworkCopyleft / WeakCopyleft / Other / Error categories fail. MPL allowed. 🔌 Skill Tests (ovoscope)I've checked the skill's 'documentation' vs its 'behavior'. 📖 ✅ 6/28 passed ❌ **TestAdaptIntent** — 0/4
❌ **TestCancelIntentMidSentence** — 0/1
❌ **TestConverse** — 0/1
❌ **TestDeactivate** — 2/3
❌ **TestFallback** — 0/1
❌ **TestIntentPipelineRouting** — 0/4
❌ **TestLangDisambiguation** — 0/4
❌ **TestNoSkills** — 0/2
❌ **TestPadatiousIntent** — 0/4
🚌 Bus CoverageEnsuring no event path is left in the shadows. 🌑 🔴 Coverage Summary
📊 Per-Skill Breakdown
🔍 Detailed Message Type Breakdown
|
OVOS-STOP-1 conformance: reserved-intent_name dispatch + separable legacy bridge
Reworks the stop pipeline to implement OVOS-STOP-1 cleanly as a single spec
path, with backward compatibility isolated as one deletable unit.
The single spec design (
ovos_core/intent_services/stop_service.py)IntentHandlerMatch(match_type="<skill_id>:stop", skill_id=<skill_id>, suppress_activation=True, updated_session=<§6-drained>)(§2/§3.1). The skill is reached on<skill_id>:stop; the ovos-spec-toolsNamespaceTranslatorbridges it to the legacy<skill_id>.stopfor un-migrated skills.IntentHandlerMatch(match_type="<pipeline_id>:global_stop", skill_id=<pipeline_id>, suppress_activation=True, updated_session=<§5.2-drained>);pipeline_id="ovos-stop-pipeline-plugin"is shared across confidence tiers so exactly oneovos.stopbroadcast is emitted (§3.1).handle_global_stopemitsovos.stop(§5.3).IntentHandlerMatch.suppress_activationfield directly (no getattr): a suppress-activation dispatch registers noactive_handlerspush and no{skill_id}.activate(§6.2/§7.3). Requiresovos-plugin-manager>=2.9.0a1.Separable back-compat (
ovos_core/intent_services/stop_service_legacy.py)_LegacyStopBridgeobservesovos.intent.matched(§9.2) and re-emits thepre-spec
stop:global/stop:skilldispatch, and owns the legacy handlers thatfan out to
mycroft.stopand<skill_id>.stop. It holds no place in the specpath — the whole module plus three wiring lines in
StopServiceare removed inone move once skills consume
<skill_id>:stopandovos.stopdirectly (removalversion derived from
version.py). A one-time deprecation warning is logged.TDD (commit order)
test:— both e2e suites (test_stop_spec_e2e.py,test_stop_legacy_e2e.py).feat!:— spec core (breaking: reserved-intent_name dispatch).feat:— the droppable_LegacyStopBridge.Verified transitions: spec-core-only (no bridge) → spec 2 pass / legacy 2 fail; with the bridge → all 4 pass (xdist
-n4). Unit: 302 pass.