Skip to content

docs: rewrite review-campaign comment narration as plain invariants - #873

Merged
JarbasAl merged 1 commit into
devfrom
chore/comments-for-humans
Aug 14, 2026
Merged

docs: rewrite review-campaign comment narration as plain invariants#873
JarbasAl merged 1 commit into
devfrom
chore/comments-for-humans

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.

A quality audit found comments in the intent-context and stop pipelines that narrate the review campaign that produced them — "Round 5 (C1)", "Wave-3 CONFIRMED (round 4)", "F2 (round-3 adversarial re-review of 6e8c816)", "attack5.py", "regression guard (commit eec4ae0)" — instead of stating the constraint the code protects. A new contributor can't decode any of that. This rewrites each site as the plain invariant it enforces, keeping spec anchors (§ citations) since those are real constraints, not campaign trivia.

The session-fold rule ("a message's session snapshot folds onto the live registry session at lifecycle entry only; incidental messages must never fold") was previously re-explained at five separate sites in service.py and converse_service.py. It's now stated once, in _registry_session_for_context_write's docstring (SESSION-2 §2.6), with every other site shrunk to a one-line pointer back to it. handle_add_context's multi-round narration collapses into one comment block describing the two-dialect write it performs. stop_service.py's F2/CONFIRMED-N/attack comments become plain statements of the pop-before-branch and pre-drain-vs-live-read invariants, and its two oversized docstrings are trimmed to the essentials (the data-vs-context rule now lives once, in dispatcher.py's _pop, and is referenced from here).

The one non-comment change: StopService._was_active_pre_drain and _utt_state_pre_drain — two parallel dicts always written and popped together — are merged into a single _pre_drain dict of a PreDrainSnapshot NamedTuple, with one comment stating the drain-ordering invariant. Everything else is comments/docstrings only. Full test/unittests suite: 423 passed, 6 xfailed, identical to origin/dev's baseline.

Summary by CodeRabbit

  • Bug Fixes

    • Improved stop and timeout handling when sessions are drained, preserving response-abort behavior and preventing stale session state.
    • Improved lifecycle completion and error handling for targeted stop requests.
    • Improved reliability for concurrent stop requests across separate sessions.
    • Prevented duplicate delivery of legacy stop responses and improved handling of stale listeners.
  • Tests

    • Expanded regression coverage for session context expiry, stop behavior, lifecycle resolution, and stale-state cleanup.

A quality audit found comments across the intent-context/stop pipelines
narrating the review campaign that produced them ("Round 5 (C1)",
"Wave-3 CONFIRMED (round 4)", "attack5.py", "regression guard (commit
eec4ae0)") instead of stating the constraint being protected. Rewrite
each site to say what must hold, not the story of how it was found.

Consolidates the session-fold invariant into one canonical statement in
_registry_session_for_context_write's docstring (SESSION-2 §2.6), with
every other call site shrunk to a one-line pointer back to it. Folds
_was_active_pre_drain and _utt_state_pre_drain (StopService) into a single
PreDrainSnapshot NamedTuple dict, keyed and popped together, as the one
mechanical refactor in scope; no other behavior changes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@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: 503cf34c-0695-4197-b19c-a8ad059ae33d

📥 Commits

Reviewing files that changed from the base of the PR and between b159d14 and e2cc76e.

📒 Files selected for processing (8)
  • ovos_core/intent_services/converse_service.py
  • ovos_core/intent_services/service.py
  • ovos_core/intent_services/stop_service.py
  • pyproject.toml
  • test/end2end/test_context1_reachability.py
  • test/unittests/test_intent_context.py
  • test/unittests/test_intent_service_extended.py
  • test/unittests/test_stop_service.py

📝 Walkthrough

Walkthrough

The change clarifies session-folding and context-expiry rules, consolidates targeted-stop pre-drain state into PreDrainSnapshot, updates related regression-test documentation, and removes the ovos-spec-tools[langcodes] core dependency.

Changes

Session semantics and stop lifecycle

Layer / File(s) Summary
Session context rules
ovos_core/intent_services/converse_service.py, ovos_core/intent_services/service.py, test/end2end/test_context1_reachability.py, test/unittests/test_intent_context.py, test/unittests/test_intent_service_extended.py, pyproject.toml
Comments and test documentation describe registry-first session folding, context-key expiry, stale snapshots, and dispatch state propagation. The ovos-spec-tools[langcodes] dependency is removed.
Targeted-stop snapshot lifecycle
ovos_core/intent_services/stop_service.py
PreDrainSnapshot combines active and utterance state. Targeted stops capture the snapshot before draining, consume it atomically, and resolve stop lifecycle responses with explicit identity and error terminals.
Stop lifecycle regression coverage
test/unittests/test_stop_service.py, test/unittests/test_intent_service_extended.py
Tests document and verify snapshot cleanup, response handling, lifecycle resolution, intent filtering, presence gating, and concurrent same-skill stops across sessions.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant StopService
  participant IntentService
  participant StopResponse
  StopService->>StopService: Capture PreDrainSnapshot
  StopService->>IntentService: Drain session copy
  StopResponse->>StopService: Return targeted stop response
  StopService->>StopService: Consume snapshot and resolve lifecycle
Loading

Possibly related PRs

Suggested labels: fix

✨ 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/comments-for-humans

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 14, 2026

Copy link
Copy Markdown

Standard verification protocol finished. 📋

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

📚 Docs

A quick update on the progress of your PR checks. 📈

✅ All required documentation files present.

README.md

📋 Repo Health

Ensuring the repo's joints are well-oiled (aka CI/CD). ⚙️

✅ All required files present.

Latest Version: 3.0.3a1

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

🏷️ Release Preview

I've checked the 'Legal' section for the release. ⚖️

Current: 3.0.3a1Next: 3.0.3a2

Signal Value
Label (none)
PR title docs: rewrite review-campaign comment narration as plain invariants
Bump alpha

✅ PR title follows conventional commit format.


🚀 Release Channel Compatibility

Predicted next version: 3.0.3a2

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

The automated pipeline is running smoothly. 🚂

✅ 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

📊 Coverage

A forensic analysis of your test coverage. 🔍

⚠️ 70.8% 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.0% 157
ovos_core/intent_services/service.py 70.7% 147
ovos_core/intent_services/dispatcher.py 75.7% 27

Full report: download the coverage-report artifact.

🔒 Security (pip-audit)

Ensuring our cookies are secure and fresh. 🍪

✅ No known vulnerabilities found (113 packages scanned).

🔎 Type Check

The results have been compiled and are ready for review. 📑

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]

🔌 Plugin Detection

Checking for any potential plugin conflicts. ⚔️

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 ✅ 1253ms
ovos-fallback-pipeline-plugin pipeline ✅ 2ms
ovos-stop-pipeline-plugin pipeline ✅ 45ms

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

Issues:

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

🔌 Skill Tests (ovoscope)

Testing the skill's 'vocabulary' across different languages. 🌍

13/37 passed

❌ **TestAdaptIntent** — 0/4
Test Result
test_intent_blacklist ❌ subtests passed
test_skill_blacklist ❌ subtests passed
test_padatious_no_match ❌ subtests passed
test_adapt_match ❌ subtests passed

test_intent_blacklist failure:

[gw3] 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_padatious_no_match failure:

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

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestDeactivate** — 2/3
Test Result
test_deactivate ✅ passed
test_activate ✅ 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
✅ **TestGGWaveSkillInstall** — 2/2 ✅ **TestGlobalStopSpec** — 1/1
❌ **TestIntentPipelineRouting** — 0/4
Test Result
test_blacklisted_skill_falls_through_to_failure ❌ subtests passed
test_high_priority_stage_handles_before_low ❌ subtests passed
test_padatious_intent_matched ❌ subtests passed
test_no_match_produces_intent_failure ❌ subtests passed

test_blacklisted_skill_falls_through_to_failure failure:

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

test_high_priority_stage_handles_before_low failure:

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

test_padatious_intent_matched failure:

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

test_metadata_preferred_over_text_detection failure:

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

test_invalid_lang_detection failure:

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

test_stt_lang failure:

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

test_legacy_blacklist_id_suppresses failure:

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

test_legacy_dispatch_topic_fires_handler failure:

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

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

test_routing failure:

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

test_padatious_match failure:

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

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

🚌 Bus Coverage

Ensuring no message type is left behind! 🏃

🔴 Coverage Summary

Metric Status Coverage
Listeners ░░░░░░░░░░ 6.1% 11/180 handlers
Emitters ██████████ 100% 15/15 observed
Assertions ██████████ 100% 15/15 asserted

📊 Per-Skill Breakdown

Skill Listeners Observed Asserted
AdaptPipeline 0/14 (0.0%) 0/0 0/0
ConverseService 0/4 (0.0%) 0/0 0/0
DomainAdaptPipeline 0/14 (0.0%) 0/0 0/0
FallbackService 0/2 (0.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 1/4 (25.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/24 (12.5%) 7/7 7/7
ovos-skill-count.openvoiceos 2/20 (10.0%) 0/0 0/0
ovos-skill-hello-world.openvoiceos 0/24 (0.0%) 3/3 3/3
stop.openvoiceos 0/0 (0.0%) 5/5 5/5
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
  • intent.service.skills.deactivate

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

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 (4x)

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
  • intent.service.skills.deactivate
    ✅ Covered Listeners:
  • 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 (1x)
  • 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
  • ovos-skill-count.openvoiceos.set
  • ovos-skill-count.openvoiceos.stop.response
  • ovos-skill-hello-world.openvoiceos.set
  • ovos.session.sync
  • ovos.session.update_default
  • ovos.stop.pong
  • remove_context
  • skill.converse.get_response.enable
  • speak
  • test-skill.openvoiceos.stop
  • test-skill.openvoiceos.stop.response
    ✅ Covered Listeners:
  • mycroft.skill.handler.start (1x)
  • ovos.utterance.handled (13x)
  • ovos.utterance.speak (1x)

📤 Emitters:

  • mycroft.audio.play_sound (Asserted ✅)
  • ovos-skill-hello-world.openvoiceos:Greetings.intent (Asserted ✅)
  • ovos.intent.unmatched (Asserted ✅)
  • ovos.utterance.cancelled (Asserted ✅)
  • ovos.utterance.handle (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)
  • recognizer_loop:utterance (Asserted ✅)

ovos-skill-count.openvoiceos

⚠️ Uncovered Listeners:

  • ovos-skill-count.openvoiceos:count_to_n (Intent)
  • 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-hello-world.openvoiceos

⚠️ Uncovered Listeners:

  • ovos-skill-hello-world.openvoiceos:Greetings (Intent)
  • 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

📤 Emitters:

  • mycroft.skill.handler.complete (Asserted ✅)
  • mycroft.skill.handler.start (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 ✅)

type

⚠️ Uncovered Listeners:

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

⚖️ License Check

A detailed legal audit of your PR. 📖

✅ No license violations found.

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

🔨 Build Tests

I've put your code through the build grinder. ☕

✅ All versions pass

Python Build Install Tests
3.10
3.11
3.12
3.13
3.14

Standard Automated Signature v2.0 🏷️

@JarbasAl
JarbasAl marked this pull request as ready for review August 14, 2026 00:42
@JarbasAl
JarbasAl merged commit 8d1fed7 into dev Aug 14, 2026
19 checks passed
@JarbasAl
JarbasAl deleted the chore/comments-for-humans branch August 14, 2026 00:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant