Skip to content

feat!: OVOS-STOP-1 reserved-intent_name dispatch + separable legacy bridge#802

Open
JarbasAl wants to merge 3 commits into
devfrom
feat/stop-1-spec
Open

feat!: OVOS-STOP-1 reserved-intent_name dispatch + separable legacy bridge#802
JarbasAl wants to merge 3 commits into
devfrom
feat/stop-1-spec

Conversation

@JarbasAl

@JarbasAl JarbasAl commented Jul 3, 2026

Copy link
Copy Markdown
Member

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)

  • Targeted stopIntentHandlerMatch(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-tools NamespaceTranslator bridges it to the legacy <skill_id>.stop for un-migrated skills.
  • Global stopIntentHandlerMatch(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 one ovos.stop broadcast is emitted (§3.1). handle_global_stop emits ovos.stop (§5.3).
  • The §4.1 recency target selection + §5.2/§6 session drain are reused unchanged.
  • The orchestrator now honours the new IntentHandlerMatch.suppress_activation field directly (no getattr): a suppress-activation dispatch registers no active_handlers push and no {skill_id}.activate (§6.2/§7.3). Requires ovos-plugin-manager>=2.9.0a1.

Separable back-compat (ovos_core/intent_services/stop_service_legacy.py)

_LegacyStopBridge observes ovos.intent.matched (§9.2) and re-emits the
pre-spec stop:global/stop:skill dispatch, and owns the legacy handlers that
fan out to mycroft.stop and <skill_id>.stop. It holds no place in the spec
path — the whole module plus three wiring lines in StopService are removed in
one move once skills consume <skill_id>:stop and ovos.stop directly (removal
version derived from version.py). A one-time deprecation warning is logged.

TDD (commit order)

  1. test: — both e2e suites (test_stop_spec_e2e.py, test_stop_legacy_e2e.py).
  2. feat!: — spec core (breaking: reserved-intent_name dispatch).
  3. 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.

JarbasAl and others added 3 commits July 3, 2026 17:08
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>
@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@JarbasAl, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 52 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: d9cb54f0-faf1-44d6-b1d1-1e4b6eef62f0

📥 Commits

Reviewing files that changed from the base of the PR and between ad67abd and 28d8037.

📒 Files selected for processing (10)
  • ovos_core/intent_services/service.py
  • ovos_core/intent_services/stop_service.py
  • ovos_core/intent_services/stop_service_legacy.py
  • pyproject.toml
  • test/end2end/test_stop.py
  • test/end2end/test_stop_legacy_e2e.py
  • test/end2end/test_stop_refactor.py
  • test/end2end/test_stop_spec_e2e.py
  • test/unittests/test_intent_service_extended.py
  • test/unittests/test_stop_service.py
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/stop-1-spec

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 added breaking breaks backwards compatibility (kinda) feature labels Jul 3, 2026
@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown

Tada! The results of the latest automation run are here. 🎉

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

📚 Docs

Ensuring your contribution is moving forward. 🚀

✅ All required documentation files present.

README.md

🔎 Type Check

I've got some results for you! 📝

mypy: 272 error(s) found

ovos_core/main.py:24:1: error: Skipping analyzing "ovos_utils.log": module is installed, but missing library stubs or py.typed marker [import-untyped]

Errors (showing first 10/272)
test/unittests/test_skill/__init__.py:15:1: error: Skipping analyzing "ovos_workshop.skills.ovos": module is installed, but missing library stubs or py.typed marker  [import-untyped]
test/end2end/conftest.py:10:1: error: Cannot find implementation or library stub for module named "pytest"  [import-not-found]
ovos_core/transformers.py:2:1: error: Skipping analyzing "ovos_config": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:3:1: error: Skipping analyzing "ovos_plugin_manager.intent_transformers": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:4:1: error: Skipping analyzing "ovos_plugin_manager.metadata_transformers": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:5:1: error: Skipping analyzing "ovos_plugin_manager.text_transformers": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:7:1: error: Skipping analyzing "ovos_plugin_manager.templates.pipeline": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:8:1: error: Skipping analyzing "ovos_utils.json_helper": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:9:1: error: Skipping analyzing "ovos_utils.log": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:16:9: error: Need type annotation for "loaded_plugins" (hint: "loaded_plugins: dict[<type>, <type>] = ...")  [var-annotated]

🌍 Locale Build

The results are in the bag! 🎒

✅ Locale properly configured (64 files, 17 languages)

Locale directories found:

  • ovos_core/intent_services/locale

Localization coverage:

  • ovos_core/intent_services/locale: 64 files in 17 languages (eu-ES, es-es, it-it, de-de, uk-ua...)

pyproject.toml:[tool.setuptools.package-data.ovos_core] includes locale

  • intent_services/locale/*/*.voc

Build manifest: ✅ 31 locale files included in package

🏷️ Release Preview

The release candidate is looking strong. 💪

Caution

Breaking change — this PR will bump the MAJOR version (2.5.0a13.0.0a1).
Downstream dependents may break. Double-check compatibility before merging.

Current: 2.5.0a1Next: 3.0.0a1

Signal Value
Label (none)
PR title feat!: OVOS-STOP-1 reserved-intent_name dispatch + separable legacy bridge
Bump major

✅ PR title follows conventional commit format.


🚀 Release Channel Compatibility

Predicted next version: 3.0.0a1

Channel Status Note Current Constraint
Stable Too new (must be <1.4.0) ovos-core>=1.3.1,<1.4.0
Testing Too new (must be <3.0.0) ovos-core>=2.1.1,<3.0.0
Alpha Compatible ovos-core>=2.2.4a1

📋 Repo Health

Checking the repo's cholesterol levels (aka code bloat). 🥩

✅ All required files present.

Latest Version: 2.5.0a1

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

📊 Coverage

Measuring the breadth of our automated checks. 📏

⚠️ 64.6% total coverage

Files below 80% coverage (8 files)
File Coverage Missing lines
ovos_core/__init__.py 0.0% 7
ovos_core/__main__.py 0.0% 26
ovos_core/intent_services/__init__.py 0.0% 1
ovos_core/skill_installer.py 42.3% 139
ovos_core/intent_services/service.py 49.7% 184
ovos_core/skill_manager.py 58.8% 173
ovos_core/transformers.py 66.0% 49
ovos_core/intent_services/dispatcher.py 73.4% 29

Full report: download the coverage-report artifact.

🔌 Plugin Detection

I've checked the plugin's 'platform' compatibility matrix. 💻

⚠️ Plugin Status: WARNINGS (2)

Plugin Info:

  • Name: ovos-core
  • Description: The spiritual successor to Mycroft AI, OVOS is flexible voice assistant software that can be run almost anywhere!

OPM Detection:

Plugin Type Wheel Editable
pipeline

Entry Point Validation:

Entry Point Type Import Interface
ovos-converse-pipeline-plugin pipeline ✅ 11ms
ovos-fallback-pipeline-plugin pipeline ✅ 1ms
ovos-stop-pipeline-plugin pipeline ✅ 35ms

⊘ No settingsmeta.json
requires-python >=3.10 — running Python 3.11

Issues:

  • ⚠️ No settingsmeta.json found
  • ⚠️ No settingsmeta.json found

🔨 Build Tests

Compiling thoughts and code into something real. 🧠

✅ All versions pass

Python Build Install Tests
3.10
3.11
3.12
3.13
3.14

⚖️ License Check

Reading 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
Test Result
test_padatious_no_match ❌ subtests passed
test_skill_blacklist ❌ subtests passed
test_intent_blacklist ❌ subtests passed
test_adapt_match ❌ subtests passed

test_padatious_no_match failure:

[gw0] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_skill_blacklist failure:

[gw3] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_intent_blacklist failure:

[gw0] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestCancelIntentMidSentence** — 0/1
Test Result
test_cancel_match ❌ subtests passed

test_cancel_match failure:

[gw1] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestConverse** — 0/1
Test Result
test_parrot_mode ❌ subtests passed

test_parrot_mode failure:

[gw0] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestDeactivate** — 2/3
Test Result
test_activate ✅ passed
test_deactivate ✅ passed
test_deactivate_inside_converse ❌ subtests passed

test_deactivate_inside_converse failure:

[gw0] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestFallback** — 0/1
Test Result
test_fallback_match ❌ subtests passed

test_fallback_match failure:

[gw3] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
✅ **TestGlobalStopSpec** — 1/1
❌ **TestIntentPipelineRouting** — 0/4
Test Result
test_high_priority_stage_handles_before_low ❌ subtests passed
test_blacklisted_skill_falls_through_to_failure ❌ subtests passed
test_padatious_intent_matched ❌ subtests passed
test_no_match_produces_intent_failure ❌ subtests passed

test_high_priority_stage_handles_before_low failure:

[gw3] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_blacklisted_skill_falls_through_to_failure failure:

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_padatious_intent_matched failure:

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestLangDisambiguation** — 0/4
Test Result
test_stt_lang ❌ subtests passed
test_metadata_preferred_over_text_detection ❌ subtests passed
test_lang_text_detection ❌ subtests passed
test_invalid_lang_detection ❌ subtests passed

test_stt_lang failure:

[gw0] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_metadata_preferred_over_text_detection failure:

[gw1] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_lang_text_detection failure:

[gw0] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
✅ **TestLegacyGlobalStop** — 1/1 ✅ **TestLegacyTargetedStop** — 1/1
❌ **TestNoSkills** — 0/2
Test Result
test_complete_failure ❌ subtests passed
test_routing ❌ subtests passed

test_complete_failure failure:

[gw3] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_routing failure:

[gw0] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestPadatiousIntent** — 0/4
Test Result
test_intent_blacklist ❌ subtests passed
test_skill_blacklist ❌ subtests passed
test_adapt_no_match ❌ subtests passed
test_padatious_match ❌ subtests passed

test_intent_blacklist failure:

[gw1] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_skill_blacklist failure:

[gw1] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_adapt_no_match failure:

[gw0] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
✅ **TestTargetedStopSpec** — 1/1

🚌 Bus Coverage

Ensuring no event path is left in the shadows. 🌑

🔴 Coverage Summary

Metric Status Coverage
Listeners ██░░░░░░░░ 23.6% 54/229 handlers
Emitters ██████████ 100% 35/35 observed
Assertions ██████████ 100% 35/35 asserted

📊 Per-Skill Breakdown

Skill Listeners Observed Asserted
AdaptPipeline 4/14 (28.6%) 0/0 0/0
ConverseService 2/4 (50.0%) 0/0 0/0
DomainAdaptPipeline 4/14 (28.6%) 0/0 0/0
FallbackService 0/2 (0.0%) 0/0 0/0
HierarchicalAdaptPipeline 4/14 (28.6%) 0/0 0/0
IntentDispatcher 1/2 (50.0%) 0/0 0/0
IntentManifest 0/8 (0.0%) 0/0 0/0
IntentService 3/4 (75.0%) 0/0 0/0
Model2VecIntentPipeline 3/12 (25.0%) 0/0 0/0
Model2VecPrototypePipeline 3/12 (25.0%) 0/0 0/0
PadaciosoPipeline 2/11 (18.2%) 0/0 0/0
PadatiousPipeline 4/15 (26.7%) 0/0 0/0
SkillManager 0/4 (0.0%) 0/0 0/0
StopService 1/1 (100.0%) 0/0 0/0
_LegacyStopBridge 2/3 (66.7%) 0/0 0/0
__core__ 5/21 (23.8%) 7/7 7/7
ovos-skill-hello-world.openvoiceos 1/24 (4.2%) 0/0 0/0
ovos-skill-parrot.openvoiceos 7/33 (21.2%) 11/11 11/11
ovos-stop-pipeline-plugin 0/0 (0.0%) 3/3 3/3
test_activation.openvoiceos 6/27 (22.2%) 14/14 14/14
type 2/4 (50.0%) 0/0 0/0
🔍 Detailed Message Type Breakdown

AdaptPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.keyword (Intent)
  • detach_intent
  • intent.service.adapt.get
  • intent.service.adapt.vocab.manifest.get
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (87x)
  • intent.service.adapt.manifest.get (548x)
  • register_intent (78x)
  • register_vocab (456x)

ConverseService

⚠️ Uncovered Listeners:

  • intent.service.active_skills.get
  • intent.service.skills.activate
    ✅ Covered Listeners:
  • converse:skill (53x)
  • intent.service.skills.deactivate (3x)

DomainAdaptPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.keyword (Intent)
  • detach_intent
  • intent.service.adapt.get
  • intent.service.adapt.vocab.manifest.get
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (87x)
  • intent.service.adapt.manifest.get (548x)
  • register_intent (78x)
  • register_vocab (456x)

FallbackService

⚠️ Uncovered Listeners:

  • ovos.skills.fallback.deregister
  • ovos.skills.fallback.register

HierarchicalAdaptPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.keyword (Intent)
  • detach_intent
  • intent.service.adapt.get
  • intent.service.adapt.vocab.manifest.get
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (87x)
  • intent.service.adapt.manifest.get (548x)
  • register_intent (78x)
  • register_vocab (456x)

IntentDispatcher

⚠️ Uncovered Listeners:

  • mycroft.skill.handler.error
    ✅ Covered Listeners:
  • mycroft.skill.handler.complete (96x)

IntentManifest

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.describe (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.list (Intent)
  • ovos.intent.register.keyword (Intent)
  • ovos.intent.register.template (Intent)
  • ovos.skill.deregister

IntentService

⚠️ Uncovered Listeners:

  • intent.service.intent.get (Intent)
    ✅ Covered Listeners:
  • intent.service.pipelines.reload (155x)
  • intent.service.skills.deactivate (3x)
  • ovos.utterance.handle (124x)

Model2VecIntentPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.template (Intent)
  • detach_intent
  • mycroft.ready
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (87x)
  • padatious:register_intent (228x)
  • register_intent (78x)

Model2VecPrototypePipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.template (Intent)
  • detach_intent
  • mycroft.ready
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (87x)
  • padatious:register_intent (228x)
  • register_intent (78x)

PadaciosoPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.template (Intent)
  • padatious:register_entity (Intent)
  • detach_intent
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (87x)
  • padatious:register_intent (228x)

PadatiousPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.template (Intent)
  • padatious:register_entity (Intent)
  • detach_intent
  • intent.service.padatious.entities.manifest.get
  • intent.service.padatious.get
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (87x)
  • intent.service.padatious.manifest.get (548x)
  • mycroft.skills.train (155x)
  • padatious:register_intent (228x)

SkillManager

⚠️ Uncovered Listeners:

  • skillmanager.activate
  • skillmanager.deactivate
  • skillmanager.keep
  • skillmanager.list

StopService

✅ Covered Listeners:

  • ovos-stop-pipeline-plugin:global_stop (9x)

_LegacyStopBridge

⚠️ Uncovered Listeners:

  • stop:skill (Intent)
    ✅ Covered Listeners:
  • ovos.intent.matched (87x)
  • stop:global (9x)

__core__

⚠️ Uncovered Listeners:

  • add_context
  • clear_context
  • message
  • mycroft.ovos-skill-hello-world.openvoiceos.all_loaded
  • mycroft.ovos-skill-hello-world.openvoiceos.is_alive
  • mycroft.ovos-skill-hello-world.openvoiceos.is_ready
  • mycroft.ovos-skill-parrot.openvoiceos.all_loaded
  • mycroft.ovos-skill-parrot.openvoiceos.is_alive
  • mycroft.ovos-skill-parrot.openvoiceos.is_ready
  • ovos-skill-hello-world.openvoiceos.set
  • ovos-skill-parrot.openvoiceos.set
  • ovos.session.sync
  • ovos.skills.converse.force_timeout
  • remove_context
  • skill.converse.get_response.disable
  • skill.converse.get_response.enable
    ✅ Covered Listeners:
  • ovos.session.update_default (170x)
  • ovos.utterance.handled (280x)
  • ovos.utterance.speak (75x)
  • skill.converse.pong (75x)
  • skill.converse.response (51x)

📤 Emitters:

  • mycroft.audio.play_sound (Asserted ✅)
  • ovos-skill-parrot.openvoiceos.converse.ping (Asserted ✅)
  • ovos.intent.unmatched (Asserted ✅)
  • ovos.utterance.handle (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)
  • recognizer_loop:utterance (Asserted ✅)
  • test_activation.openvoiceos.converse.ping (Asserted ✅)

ovos-skill-hello-world.openvoiceos

⚠️ Uncovered Listeners:

  • ovos-skill-hello-world.openvoiceos:Greetings.intent (Intent)
  • ovos-skill-hello-world.openvoiceos:HelloWorldIntent (Intent)
  • ovos-skill-hello-world.openvoiceos:HowAreYou.intent (Intent)
  • ovos-skill-hello-world.openvoiceos:ThankYouIntent (Intent)
  • question:action (Intent)
  • question:action.ovos-skill-hello-world.openvoiceos (Intent)
  • question:query (Intent)
  • hello.world
  • homescreen.metadata.get
  • mycroft.ovos-skill-hello-world.openvoiceos.all_loaded
  • mycroft.ovos-skill-hello-world.openvoiceos.is_alive
  • mycroft.ovos-skill-hello-world.openvoiceos.is_ready
  • mycroft.skill.disable_intent
  • mycroft.skill.enable_intent
  • mycroft.skill.remove_cross_context
  • mycroft.skill.set_cross_context
  • mycroft.skills.settings.changed
  • ovos-skill-hello-world.openvoiceos.converse.get_response
  • ovos-skill-hello-world.openvoiceos.set
  • ovos-skill-hello-world.openvoiceos.stop
  • ovos-skill-hello-world.openvoiceos.stop.ping
  • ovos.common_query.ping
  • ovos.skills.settings_changed
    ✅ Covered Listeners:
  • mycroft.stop (9x)

ovos-skill-parrot.openvoiceos

⚠️ Uncovered Listeners:

  • ovos-skill-parrot.openvoiceos:did_you_hear_me.intent (Intent)
  • ovos-skill-parrot.openvoiceos:repeat_stt.intent (Intent)
  • ovos-skill-parrot.openvoiceos:repeat_tts.intent (Intent)
  • ovos-skill-parrot.openvoiceos:speak.intent (Intent)
  • ovos-skill-parrot.openvoiceos:stop_parrot.intent (Intent)
  • question:action (Intent)
  • question:action.ovos-skill-parrot.openvoiceos (Intent)
  • question:query (Intent)
  • homescreen.metadata.get
  • intent.service.skills.activated
  • mycroft.ovos-skill-parrot.openvoiceos.all_loaded
  • mycroft.ovos-skill-parrot.openvoiceos.is_alive
  • mycroft.ovos-skill-parrot.openvoiceos.is_ready
  • mycroft.skill.disable_intent
  • mycroft.skill.enable_intent
  • mycroft.skill.remove_cross_context
  • mycroft.skill.set_cross_context
  • mycroft.skills.settings.changed
  • ovos-skill-parrot.openvoiceos.converse.get_response
  • ovos-skill-parrot.openvoiceos.deactivate
  • ovos-skill-parrot.openvoiceos.set
  • ovos-skill-parrot.openvoiceos.stop
  • ovos-skill-parrot.openvoiceos.stop.ping
  • ovos.common_query.ping
  • ovos.skills.settings_changed
  • speak
    ✅ Covered Listeners:
  • intent.service.skills.deactivated (3x)
  • mycroft.stop (9x)
  • ovos-skill-parrot.openvoiceos.activate (75x)
  • ovos-skill-parrot.openvoiceos.converse.ping (75x)
  • ovos-skill-parrot.openvoiceos.converse.request (50x)
  • ovos-skill-parrot.openvoiceos:start_parrot.intent (25x)
  • recognizer_loop:utterance (100x)

📤 Emitters:

  • converse:skill (Asserted ✅)
  • mycroft.skill.handler.complete (Asserted ✅)
  • mycroft.skill.handler.start (Asserted ✅)
  • ovos-skill-parrot.openvoiceos.activate (Asserted ✅)
  • ovos-skill-parrot.openvoiceos.converse.request (Asserted ✅)
  • ovos-skill-parrot.openvoiceos:start_parrot.intent (Asserted ✅)
  • ovos.intent.matched (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)
  • ovos.utterance.speak (Asserted ✅)
  • skill.converse.pong (Asserted ✅)
  • skill.converse.response (Asserted ✅)

ovos-stop-pipeline-plugin

📤 Emitters:

  • ovos-stop-pipeline-plugin:global_stop (Asserted ✅)
  • ovos.stop (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)

test_activation.openvoiceos

⚠️ Uncovered Listeners:

  • question:action (Intent)
  • question:action.test_activation.openvoiceos (Intent)
  • question:query (Intent)
  • homescreen.metadata.get
  • intent.service.skills.activated
  • mycroft.skill.disable_intent
  • mycroft.skill.enable_intent
  • mycroft.skill.remove_cross_context
  • mycroft.skill.set_cross_context
  • mycroft.skills.settings.changed
  • mycroft.test_activation.openvoiceos.all_loaded
  • mycroft.test_activation.openvoiceos.is_alive
  • mycroft.test_activation.openvoiceos.is_ready
  • ovos.common_query.ping
  • ovos.skills.settings_changed
  • test_activate
  • test_activation.openvoiceos.converse.get_response
  • test_activation.openvoiceos.set
  • test_activation.openvoiceos.stop
  • test_activation.openvoiceos.stop.ping
  • test_deactivate
    ✅ Covered Listeners:
  • intent.service.skills.deactivated (3x)
  • mycroft.stop (2x)
  • test_activation.openvoiceos.activate (3x)
  • test_activation.openvoiceos.converse.ping (3x)
  • test_activation.openvoiceos.converse.request (3x)
  • test_activation.openvoiceos.deactivate (3x)

📤 Emitters:

  • converse:skill (Asserted ✅)
  • intent.service.skills.deactivate (Asserted ✅)
  • intent.service.skills.deactivated (Asserted ✅)
  • mycroft.skill.handler.complete (Asserted ✅)
  • mycroft.skill.handler.start (Asserted ✅)
  • ovos.intent.handler.complete (Asserted ✅)
  • ovos.intent.handler.start (Asserted ✅)
  • ovos.intent.matched (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)
  • skill.converse.pong (Asserted ✅)
  • skill.converse.response (Asserted ✅)
  • test_activation.openvoiceos.activate (Asserted ✅)
  • test_activation.openvoiceos.converse.request (Asserted ✅)
  • test_activation.openvoiceos.deactivate (Asserted ✅)

type

⚠️ Uncovered Listeners:

  • recognizer_loop:record_begin (Intent)
  • recognizer_loop:record_end (Intent)
    ✅ Covered Listeners:
  • recognizer_loop:audio_output_end (73x)
  • recognizer_loop:audio_output_start (75x)


Beep boop. See you in the next PR! 👋

@JarbasAl
JarbasAl marked this pull request as ready for review July 16, 2026 07:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking breaks backwards compatibility (kinda) feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant