Skip to content

chore: kill queued deprecation-warning hot-path reads - #879

Merged
JarbasAl merged 2 commits into
devfrom
chore/kill-warnings
Aug 14, 2026
Merged

chore: kill queued deprecation-warning hot-path reads#879
JarbasAl merged 2 commits into
devfrom
chore/kill-warnings

Conversation

@JarbasAl

@JarbasAl JarbasAl commented Aug 14, 2026

Copy link
Copy Markdown
Member

🤖 Auto-generated by Claude Fable 5 (claude-fable-5) via Claude Code — NOT human-reviewed. Verify before acting.

converse_service.py and stop_service.py read the legacy bus-client Session.active_skills and Session.utterance_states views on every converse/stop pass. Both are now deprecated write-through shims over the canonical active_handlers and response_mode fields, so every hot-path read fired a deprecation log on each access.

I swapped each site for the equivalent canonical-field expression, verified against the installed ovos-bus-client 2.8.2a1 shim implementation to make sure the mapping is exact:

  • [skill[0] for skill in session.active_skills] -> [h["skill_id"] for h in session.active_handlers] (stop_service.get_active_skills, converse_service.get_active_skills)
  • len(sess.active_skills) -> len(sess.active_handlers) (stop_service global-stop log line)
  • sess.utterance_states.get(skill_id, UtteranceState.INTENT) -> UtteranceState.RESPONSE if sess.response_mode and sess.response_mode.get("skill_id") == skill_id else UtteranceState.INTENT (stop_service, two sites)
  • session.utterance_states.get(skill_id, UtteranceState.INTENT) == UtteranceState.INTENT -> not (session.response_mode and session.response_mode.get("skill_id") == skill_id) (converse_service._collect_converse_skills)
  • session.utterance_states.get(skill_id, UtteranceState.INTENT) == UtteranceState.RESPONSE -> session.response_mode and session.response_mode.get("skill_id") == skill_id (converse_service.match)
  • session.active_skills = [...] read+write in _check_converse_timeout -> rewritten directly against session.active_handlers (same dict keys, skill_id/activated_at)

Left untouched: ConverseService.active_skills property/setter (lines ~187-195). It isn't referenced anywhere else in the repo, so it isn't on the hot path, and rewriting it would change its own public return shape (list of pairs vs list of handler dicts) rather than just kill a deprecation warning — that's a different kind of change than what was asked, so I left it alone.

Verification: full test/unittests suite is unchanged, 456 passed / 6 xfailed / 4 warnings before and after (those 4 warnings are unrelated pre-existing ovos_config.locale deprecations, not from this change). A direct probe against the installed bus-client confirms the old accessors fire two deprecation log calls and the new expressions fire zero.

Test plan

  • pytest test/unittests -W default -q — 456 passed, 6 xfailed, 4 warnings, before and after
  • Direct probe against installed ovos-bus-client 2.8.2a1 confirming zero deprecation log calls from the new expressions

Summary by CodeRabbit

  • Bug Fixes
    • Improved handling of active skills during conversational interactions and stop commands.
    • Stop confirmations and targeted stop actions now more reliably reflect the current response state.
    • Improved filtering of timed-out skills and response collection.
    • Global stop activity reporting now accurately reflects active handlers.

… in hot path

> 🤖 Auto-generated by Claude Fable 5 (claude-fable-5) via Claude Code — NOT human-reviewed. Verify before acting.

converse_service.py and stop_service.py read the legacy bus-client
Session.active_skills and Session.utterance_states views on every
converse/stop pass, which now log a deprecation warning on each access.
Both are write-through shims over the canonical active_handlers and
response_mode fields (verified against the installed ovos-bus-client
2.8.2a1 session.py), so every read site is swapped for the equivalent
canonical-field expression with identical output. The
ConverseService.active_skills property/setter is left untouched: it is
not on the hot path (unreferenced elsewhere in the repo) and rewriting
it would change its own public return shape rather than just kill a
warning.

Full unittest suite (test/unittests) is unchanged: 456 passed, 6
xfailed, 4 warnings before and after. A direct probe against the
installed bus-client confirms the swapped expressions trigger zero
deprecation log calls where the old accessors triggered two.
@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown

Greetings, human! The automated checks are complete. 👾

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

📋 Repo Health

Checking for any cluttered files or folders. 🧹

✅ All required files present.

Latest Version: 3.0.7a1

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

📚 Docs

Ensuring the codebase remains stable and healthy. 🛡️

✅ All required documentation files present.

README.md

🔒 Security (pip-audit)

Locking the doors and checking the windows... 🔒

✅ No known vulnerabilities found (113 packages scanned).

🔎 Type Check

The data is in, and it's looking interesting! 🧐

mypy: 300 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/300)
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:3:1: error: Skipping analyzing "ovos_config": 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.intent_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.metadata_transformers": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:6: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.transformer_services": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/intent_services/manifest.py:17:1: error: Skipping analyzing "ovos_bus_client.message": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/intent_services/manifest.py:18:1: error: Skipping analyzing "ovos_spec_tools": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/intent_services/manifest.py:19:1: error: Skipping analyzing "ovos_utils.log": module is installed, but missing library stubs or py.typed marker  [import-untyped]

🏷️ Release Preview

Ensuring the 'Thanks' section includes your name! 🤝

Current: 3.0.7a1Next: 3.0.7a2

Signal Value
Label ignore-for-release
PR title chore: kill queued deprecation-warning hot-path reads
Bump alpha

✅ PR title follows conventional commit format.


🚀 Release Channel Compatibility

Predicted next version: 3.0.7a2

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

🌍 Locale Build

I've finished the analysis you requested. 💡

✅ 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 (en-us, ca-es, fa-ir, de-de, gl-es...)

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

  • intent_services/locale/*/*.voc

Build manifest: ✅ 31 locale files included in package

🔌 Plugin Detection

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

Plugin Status: ERRORS (1)

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 ✅ 1760ms
ovos-fallback-pipeline-plugin pipeline ✅ 3ms
ovos-stop-pipeline-plugin pipeline ✅ 51ms

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

Issues:

  • ❌ Import time for ovos-converse-pipeline-plugin exceeds 500ms (1760ms)
  • ⚠️ No settingsmeta.json found
  • ⚠️ No settingsmeta.json found

📊 Coverage

Ensuring our safety net is wide enough. 🕸️

⚠️ 72.4% 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/transformers.py 33.3% 18
ovos_core/skill_installer.py 45.3% 134
ovos_core/skill_manager.py 62.5% 155
ovos_core/intent_services/service.py 70.8% 147
ovos_core/intent_services/dispatcher.py 75.7% 27

Full report: download the coverage-report artifact.

🔨 Build Tests

Everything is bolted down and ready to go. 🔩

✅ All versions pass

Python Build Install Tests
3.10
3.11
3.12
3.13
3.14

🔌 Skill Tests (ovoscope)

Scanning the conversational landscape for anomalies. 🕵️

13/37 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:

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

test_skill_blacklist failure:

[gw0] 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
✅ **TestContext1EndToEndReachability** — 3/3
❌ **TestConverse** — 0/1
Test Result
test_parrot_mode ❌ subtests passed

test_parrot_mode failure:

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

test_deactivate_inside_converse failure:

[gw2] 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:

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

test_padatious_intent_matched failure:

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

test_high_priority_stage_handles_before_low failure:

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

test_no_match_produces_intent_failure failure:

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

test_lang_text_detection failure:

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

test_metadata_preferred_over_text_detection failure:

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

test_stt_lang failure:

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
✅ **TestLegacyGlobalStop** — 1/1
❌ **TestLegacyIntentIdBackCompat** — 0/2
Test Result
test_legacy_dispatch_topic_fires_handler ❌ subtests passed
test_legacy_blacklist_id_suppresses ❌ subtests passed

test_legacy_dispatch_topic_fires_handler failure:

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

test_legacy_blacklist_id_suppresses failure:

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

test_complete_failure failure:

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

test_routing failure:

[gw3] 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_adapt_no_match ❌ subtests passed
test_skill_blacklist ❌ subtests passed
test_padatious_match ❌ subtests passed

test_intent_blacklist failure:

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

test_adapt_no_match failure:

[gw1] 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
✅ **TestResponseModeHolderStopE2E** — 2/2 ✅ **TestTargetedStopSpec** — 1/1

🚌 Bus Coverage

Ensuring every intent and event is reached by the test suite. 🎯

🔴 Coverage Summary

Metric Status Coverage
Listeners ░░░░░░░░░░ 9.1% 22/242 handlers
Emitters ██████████ 100% 43/43 observed
Assertions ██████████ 100% 43/43 asserted

📊 Per-Skill Breakdown

Skill Listeners Observed Asserted
AdaptPipeline 0/14 (0.0%) 0/0 0/0
ConverseService 1/4 (25.0%) 0/0 0/0
DomainAdaptPipeline 0/14 (0.0%) 0/0 0/0
FallbackService 2/4 (50.0%) 0/0 0/0
HierarchicalAdaptPipeline 0/14 (0.0%) 0/0 0/0
IntentDispatcher 1/2 (50.0%) 0/0 0/0
IntentManifest 0/8 (0.0%) 0/0 0/0
IntentService 2/4 (50.0%) 0/0 0/0
Model2VecPrototypePipeline 0/12 (0.0%) 0/0 0/0
PadaciosoPipeline 0/11 (0.0%) 0/0 0/0
PadatiousPipeline 0/15 (0.0%) 0/0 0/0
SkillManager 0/5 (0.0%) 0/0 0/0
_LegacyStopBridge 2/3 (66.7%) 0/0 0/0
__core__ 3/35 (8.6%) 14/14 14/14
ovos-skill-count.openvoiceos 3/20 (15.0%) 8/8 8/8
ovos-skill-fallback-unknown.openvoiceos 2/21 (9.5%) 4/4 4/4
ovos-skill-hello-world.openvoiceos 1/24 (4.2%) 9/9 9/9
stop.openvoiceos 0/0 (0.0%) 5/5 5/5
test_activation.openvoiceos 3/28 (10.7%) 3/3 3/3
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
  • detach_skill
  • intent.service.adapt.get
  • intent.service.adapt.manifest.get
  • intent.service.adapt.vocab.manifest.get
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
  • register_intent
  • register_vocab

ConverseService

⚠️ Uncovered Listeners:

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

DomainAdaptPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.keyword (Intent)
  • detach_intent
  • detach_skill
  • intent.service.adapt.get
  • intent.service.adapt.manifest.get
  • intent.service.adapt.vocab.manifest.get
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
  • register_intent
  • register_vocab

FallbackService

⚠️ Uncovered Listeners:

  • ovos.skills.fallback.deregister
  • ovos.skills.fallback.register
    ✅ Covered Listeners:
  • ovos.skills.fallback.ovos-skill-fallback-unknown.openvoiceos.response (2x)
  • ovos.skills.fallback.ovos-skill-fallback-unknown.openvoiceos.start (2x)

HierarchicalAdaptPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.keyword (Intent)
  • detach_intent
  • detach_skill
  • intent.service.adapt.get
  • intent.service.adapt.manifest.get
  • intent.service.adapt.vocab.manifest.get
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
  • register_intent
  • register_vocab

IntentDispatcher

⚠️ Uncovered Listeners:

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

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)
  • intent.service.pipelines.reload
    ✅ Covered Listeners:
  • intent.service.skills.deactivate (1x)
  • ovos.utterance.handle (7x)

Model2VecPrototypePipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.template (Intent)
  • padatious:register_intent (Intent)
  • detach_intent
  • detach_skill
  • mycroft.ready
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
  • register_intent

PadaciosoPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.template (Intent)
  • padatious:register_entity (Intent)
  • padatious:register_intent (Intent)
  • detach_intent
  • detach_skill
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister

PadatiousPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.template (Intent)
  • padatious:register_entity (Intent)
  • padatious:register_intent (Intent)
  • detach_intent
  • detach_skill
  • intent.service.padatious.entities.manifest.get
  • intent.service.padatious.get
  • intent.service.padatious.manifest.get
  • mycroft.skills.train
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister

SkillManager

⚠️ Uncovered Listeners:

  • skill.converse.get_response.disable
  • skillmanager.activate
  • skillmanager.deactivate
  • skillmanager.keep
  • skillmanager.list

_LegacyStopBridge

⚠️ Uncovered Listeners:

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

__core__

⚠️ Uncovered Listeners:

  • ovos-stop-pipeline-plugin:global_stop (Intent)
  • add_context
  • clear_context
  • message
  • mycroft.ovos-skill-count.openvoiceos.all_loaded
  • mycroft.ovos-skill-count.openvoiceos.is_alive
  • mycroft.ovos-skill-count.openvoiceos.is_ready
  • 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.test_activation.openvoiceos.all_loaded
  • mycroft.test_activation.openvoiceos.is_alive
  • mycroft.test_activation.openvoiceos.is_ready
  • ovos-skill-count.openvoiceos.set
  • ovos-skill-count.openvoiceos.stop.response
  • ovos-skill-hello-world.openvoiceos.set
  • ovos.ggwave.disable
  • ovos.ggwave.enable
  • ovos.pip.install
  • ovos.pip.uninstall
  • ovos.session.sync
  • ovos.session.update_default
  • ovos.skills.fallback.force_timeout
  • ovos.skills.fallback.ovos-skill-fallback-unknown.openvoiceos
  • ovos.skills.install
  • ovos.skills.uninstall
  • ovos.stop.pong
  • remove_context
  • skill.converse.get_response.enable
  • test-skill.openvoiceos.stop
  • test-skill.openvoiceos.stop.response
  • test_activation.openvoiceos.set
    ✅ Covered Listeners:
  • ovos.skills.fallback.pong (1x)
  • ovos.utterance.handled (13x)
  • ovos.utterance.speak (10x)

📤 Emitters:

  • mycroft.audio.play_sound (Asserted ✅)
  • ovos.intent.handler.complete (Asserted ✅)
  • ovos.intent.handler.start (Asserted ✅)
  • ovos.intent.matched (Asserted ✅)
  • ovos.intent.unmatched (Asserted ✅)
  • ovos.skills.fallback.ovos-skill-fallback-unknown.openvoiceos.request (Asserted ✅)
  • ovos.skills.fallback.ovos-skill-fallback-unknown.openvoiceos.response (Asserted ✅)
  • ovos.skills.fallback.ovos-skill-fallback-unknown.openvoiceos.start (Asserted ✅)
  • ovos.skills.fallback.ping (Asserted ✅)
  • ovos.utterance.cancelled (Asserted ✅)
  • ovos.utterance.handle (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)
  • recognizer_loop:utterance (Asserted ✅)
  • test_deactivate (Asserted ✅)

ovos-skill-count.openvoiceos

⚠️ Uncovered Listeners:

  • question:action (Intent)
  • question:action.ovos-skill-count.openvoiceos (Intent)
  • question:query (Intent)
  • homescreen.metadata.get
  • mycroft.ovos-skill-count.openvoiceos.all_loaded
  • mycroft.ovos-skill-count.openvoiceos.is_alive
  • mycroft.ovos-skill-count.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
  • mycroft.stop
  • ovos-skill-count.openvoiceos.converse.get_response
  • ovos-skill-count.openvoiceos.set
  • ovos.common_query.ping
  • ovos.skills.settings_changed
    ✅ Covered Listeners:
  • ovos-skill-count.openvoiceos.stop (1x)
  • ovos-skill-count.openvoiceos.stop.ping (1x)
  • ovos-skill-count.openvoiceos:count_to_n (2x)

📤 Emitters:

  • mycroft.skill.handler.complete (Asserted ✅)
  • mycroft.skill.handler.start (Asserted ✅)
  • ovos-skill-count.openvoiceos.activate (Asserted ✅)
  • ovos-skill-count.openvoiceos:count_to_n (Asserted ✅)
  • ovos.intent.handler.complete (Asserted ✅)
  • ovos.intent.handler.start (Asserted ✅)
  • ovos.intent.matched (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)

ovos-skill-fallback-unknown.openvoiceos

⚠️ Uncovered Listeners:

  • question:action (Intent)
  • question:action.ovos-skill-fallback-unknown.openvoiceos (Intent)
  • question:query (Intent)
  • homescreen.metadata.get
  • mycroft.ovos-skill-fallback-unknown.openvoiceos.all_loaded
  • mycroft.ovos-skill-fallback-unknown.openvoiceos.is_alive
  • mycroft.ovos-skill-fallback-unknown.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
  • mycroft.stop
  • ovos-skill-fallback-unknown.openvoiceos.converse.get_response
  • ovos-skill-fallback-unknown.openvoiceos.set
  • ovos-skill-fallback-unknown.openvoiceos.stop
  • ovos-skill-fallback-unknown.openvoiceos.stop.ping
  • ovos.common_query.ping
  • ovos.skills.settings_changed
    ✅ Covered Listeners:
  • ovos.skills.fallback.ovos-skill-fallback-unknown.openvoiceos.request (2x)
  • ovos.skills.fallback.ping (2x)

📤 Emitters:

  • mycroft.skill.handler.complete (Asserted ✅)
  • mycroft.skill.handler.start (Asserted ✅)
  • ovos.skills.fallback.pong (Asserted ✅)
  • ovos.utterance.speak (Asserted ✅)

ovos-skill-hello-world.openvoiceos

⚠️ Uncovered Listeners:

  • ovos-skill-hello-world.openvoiceos:HelloWorldIntent (Intent)
  • ovos-skill-hello-world.openvoiceos:HowAreYou (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
  • mycroft.stop
  • 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:
  • ovos-skill-hello-world.openvoiceos:Greetings (2x)

📤 Emitters:

  • mycroft.skill.handler.complete (Asserted ✅)
  • mycroft.skill.handler.start (Asserted ✅)
  • ovos-skill-hello-world.openvoiceos.activate (Asserted ✅)
  • ovos-skill-hello-world.openvoiceos:Greetings (Asserted ✅)
  • ovos.intent.handler.complete (Asserted ✅)
  • ovos.intent.handler.start (Asserted ✅)
  • ovos.intent.matched (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)
  • ovos.utterance.speak (Asserted ✅)

stop.openvoiceos

📤 Emitters:

  • mycroft.skill.handler.complete (Asserted ✅)
  • mycroft.skill.handler.start (Asserted ✅)
  • ovos-skill-count.openvoiceos.stop (Asserted ✅)
  • stop.openvoiceos.activate (Asserted ✅)
  • stop:skill (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.stop
  • mycroft.test_activation.openvoiceos.all_loaded
  • mycroft.test_activation.openvoiceos.is_alive
  • mycroft.test_activation.openvoiceos.is_ready
  • ovos.common_query.ping
  • ovos.converse.ping
  • ovos.skills.settings_changed
  • test_activate
  • test_activation.openvoiceos.activate
  • test_activation.openvoiceos.converse.get_response
  • test_activation.openvoiceos.converse.ping
  • test_activation.openvoiceos.converse.request
  • test_activation.openvoiceos.set
  • test_activation.openvoiceos.stop
  • test_activation.openvoiceos.stop.ping
    ✅ Covered Listeners:
  • intent.service.skills.deactivated (1x)
  • test_activation.openvoiceos.deactivate (1x)
  • test_deactivate (1x)

📤 Emitters:

  • intent.service.skills.deactivate (Asserted ✅)
  • intent.service.skills.deactivated (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 (7x)
  • recognizer_loop:audio_output_start (10x)

⚖️ License Check

Ensuring our copyright headers are in tip-top shape. ✍️

✅ No license violations found.

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


Your digital assistant in the world of OVOS 🤖

@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 97614dae-abac-449b-a428-2ae2418b204f

📥 Commits

Reviewing files that changed from the base of the PR and between c18db91 and 72b8bcd.

📒 Files selected for processing (2)
  • ovos_core/intent_services/converse_service.py
  • ovos_core/intent_services/stop_service.py

📝 Walkthrough

Walkthrough

Converse and stop services now use Session.active_handlers and Session.response_mode instead of legacy active-skill tuples and utterance_states.

Changes

Session state migration

Layer / File(s) Summary
Converse session handling
ovos_core/intent_services/converse_service.py
Converse skill discovery, timeout filtering, candidate selection, and response matching now use active handler dictionaries and response_mode.
Stop session handling
ovos_core/intent_services/stop_service.py
Stop handling now uses active handlers for skill discovery and logging, and uses response_mode with intent-state fallback for response classification.

Estimated code review effort: 2 (Simple) | ~10 minutes

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/kill-warnings

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.

@JarbasAl
JarbasAl marked this pull request as ready for review August 14, 2026 17:16
@JarbasAl
JarbasAl merged commit d3fd170 into dev Aug 14, 2026
18 checks passed
@JarbasAl
JarbasAl deleted the chore/kill-warnings branch August 14, 2026 17:16
JarbasAl added a commit that referenced this pull request Aug 14, 2026
…ll (#881)

Standing rule: every repo carries a version-stamped, newest-first log of
what changed since the last stable release, reset at each stable. This
adds it for ovos-core (since 2.1.1). Filled a docs gap along the way:
converse-fallback.md described only the sequential per-skill converse
request, not the OVOS-CONVERSE-1 broadcast contest poll added in #863.

> 🤖 Auto-generated by Claude Fable 5 (claude-fable-5) via Claude Code — NOT human-reviewed. Verify before acting.
> Verified against current source: context-lock fix (#868), _LegacyStopBridge
> presence and its removal note, registry-first session fold (#858),
> converse broadcast poll (#863), round-correlation guard (#862). #864 and
> #879 confirmed open/unmerged via gh pr view before being listed as
> pending.

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