Skip to content

Release 2.1.4a1#751

Open
github-actions[bot] wants to merge 18 commits intomasterfrom
release-2.1.4a1
Open

Release 2.1.4a1#751
github-actions[bot] wants to merge 18 commits intomasterfrom
release-2.1.4a1

Conversation

@github-actions
Copy link

Human review requested!

dependabot bot and others added 18 commits November 10, 2025 17:35
Updates the requirements on [ovos-workshop](https://github.com/OpenVoiceOS/OVOS-workshop) to permit the latest version.
- [Release notes](https://github.com/OpenVoiceOS/OVOS-workshop/releases)
- [Changelog](https://github.com/OpenVoiceOS/ovos-workshop/blob/dev/CHANGELOG.md)
- [Commits](OpenVoiceOS/ovos-workshop@7.0.6...8.0.0)

---
updated-dependencies:
- dependency-name: ovos-workshop
  dependency-version: 8.0.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Adina Vladu <adina.vladu@usc.es>
* Refine French stop intents

* Refine French stop voice intents
* Prevent duplicate skill loads during rescans

* chore: modernize GitHub workflows to use shared gh-automations reusables

- coverage.yml: replace py-cov-action custom workflow with
  coverage.yml@dev reusable (system deps, extras, deploy_pages: true)
- gh_pages_coverage.yml: deleted — superseded by deploy_pages: true
- pipaudit.yml: replace custom multi-version inline job with
  pip-audit.yml@dev reusable (preserves ignore list)
- release_workflow.yml: fix broken YAML (misplaced publish_pypi/
  notify_matrix keys); move them into publish_alpha with: block
- build_tests.yml: replace inline matrix job with build-tests.yml@dev
  reusable; add system_deps and install_extras

All workflows now reference @dev consistently.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Defer connectivity-triggered skill loads until intents are ready

* Guard deferred startup loads with a lock

* Make runtime requirements gating optional behind config flag

- Add skills.use_deferred_loading config flag (default: false)
- When disabled (default): all skills load unconditionally at startup
- When enabled: skills with network/internet requirements defer until those conditions are met
- Wrap connectivity event handler registration with flag check
- Branch run() method based on flag setting
- Preserves PR #749's deferred load bug fixes when flag is enabled

This builds on PR #749's improvements to deferred loading (thread safety, prevents
duplicate loads) while making the feature opt-in so the simpler unconditional loading
is the default behavior.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Add documentation for optional deferred loading config

- FAQ.md: document default unconditional loading and optional deferred loading
- SUGGESTIONS.md: mark S-001 as PARTIALLY ADDRESSED, explain opt-in config flag
- MAINTENANCE_REPORT.md: document change and integration with PR #749

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Add test coverage for deferred loading config flag

Add TestDeferredLoadingConfigFlag test class with tests for:
- Config flag defaults to false (deferred loading disabled)
- Config flag can be enabled via use_deferred_loading config
- Connectivity handlers NOT registered when deferred loading disabled
- Connectivity handlers ARE registered when deferred loading enabled
- load_plugin_skills does NOT gate on network/internet when disabled
- load_plugin_skills DOES gate on network/internet when enabled
- run() calls _load_new_skills directly when deferred loading disabled
- run() uses deferred loading flow when flag is enabled

Ensures both code paths (flag enabled and disabled) are properly tested.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Add required project configuration and documentation files

- pyproject.toml: Python project configuration (required for build)
- AUDIT.md: Known issues and technical debt documentation
- QUICK_FACTS.md: Machine-readable project reference
- docs/: Architecture and feature documentation
- .env: Environment configuration

These files were merged but not committed. Required for CI builds to succeed.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* update

* Address CodeRabbit PR review comments for PR #750

## Changes

1. **Fix _load_new_skills to bypass gating when deferred_loading disabled** (Major)
   - When deferred_loading is disabled, pass network=True, internet=True to load_plugin_skills()
   - This ensures skills with runtime requirements still load unconditionally
   - Reconciles test expectation with implementation

2. **Replace sequential atomicity test with concurrent thread test** (Major)
   - test_mark_startup_complete_and_consume_deferred_is_atomic now uses 2 threads
   - Verifies exactly one thread sees True (winner of race)
   - Removed redundant test_mark_startup_complete_concurrent_calls_race_safe

3. **Remove unused skill_manager variable bindings** (Minor)
   - test_connectivity_handlers_not_registered_when_deferred_loading_disabled: Line 472
   - test_connectivity_handlers_registered_when_deferred_loading_enabled: Line 497
   - Both tests only need side effects of instantiation, not the object itself

4. **Add assert_not_called for opposite branches** (Minor)
   - test_run_calls_load_new_skills_when_deferred_loading_disabled:
     Assert deferred loading methods NOT called
   - test_run_uses_deferred_loading_when_enabled:
     Assert _load_new_skills NOT called in startup phase
   - Ensures config flag acts as mutually exclusive switch

5. **Test improvement for load_plugin_skills_no_gating**
   - Changed to call _load_new_skills() instead of load_plugin_skills() directly
   - Properly tests end-to-end behavior of unconditional loading when disabled

## Notes
- test_instantiate was already fixed in prior work (no connectivity handlers by default)
- CI build failure (Install step) is pre-existing issue with pyproject.toml requires-python constraint

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix CI build failure by updating requires-python to >=3.10

The ovoscope dependency requires Python >=3.10, but pyproject.toml specified >=3.9.
This caused dependency resolution to fail in CI install step for Python 3.9.
Updated to match the minimum version required by test dependencies.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix GitHub Actions build_tests.yml install_extras syntax

The install_extras parameter was incorrectly specified with brackets:
  install_extras: '[mycroft,plugins,skills-essential,lgpl,test]'

This caused pip install to receive double brackets:
  pip install "wheel[[extras]]"

Changed to use correct syntax (gh-automations adds the brackets):
  install_extras: 'mycroft,plugins,skills-essential,lgpl,test'

This fixes the install step failure in the build tests workflow.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix test config patching by using context managers

The @patch.dict decorator applied to test methods may not correctly apply
during setUp() execution. Changed to use with patch.dict() context managers
inside each test method to ensure the patch is active when SkillManager is created.

This fixes:
- test_deferred_loading_enabled_via_config
- test_connectivity_handlers_registered_when_deferred_loading_enabled
- test_load_plugin_skills_gating_when_deferred_loading_enabled
- test_run_uses_deferred_loading_when_enabled

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Continue test fixes for config patching issues

- Convert test_deferred_loading_disabled_by_default to use context manager
- Convert test_connectivity_handlers_not_registered_when_deferred_loading_disabled to use context manager
- Convert test_load_plugin_skills_no_gating_when_deferred_loading_disabled to use context manager
- Convert test_run_calls_load_new_skills_when_deferred_loading_disabled to use context manager
- Fix test_load_plugin_skills_no_gating_when_deferred_loading_disabled to call load_plugin_skills directly with network=True, internet=True instead of calling _load_new_skills

This ensures all tests have config patches properly applied during SkillManager instantiation.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Explicitly set use_deferred_loading to False in all disabled-path tests

The patch.dict may not properly set None values. Explicitly set
use_deferred_loading to False in mock_config() calls for all tests
that expect the disabled-by-default behavior.

This ensures the config patch is correctly applied and the flag
is definitively set to False.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix missing initialization and logic in skill loading

- Add missing `_plugin_skills_lock` and `_loading_plugin_skills` attributes to __init__
- Restore reserve/release logic in `_load_plugin_skill` to prevent duplicate loads
- Fix `load_plugin_skills` to properly track loading state using `_is_plugin_skill_tracked`
- Add thread-safe locking when storing loaded skills
- Update test assertion to match the `reserved=True` parameter now passed

This fixes CI test failures where `_loading_plugin_skills` was accessed but not initialized,
and ensures concurrent skill loads are properly serialized.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* Fix test_instantiate flakiness due to config isolation

Ensure test_instantiate explicitly sets use_deferred_loading=False with
proper config isolation to prevent state leakage from other test classes
when pytest randomizes test order. This fixes intermittent test failures
where connectivity handlers were incorrectly registered due to config
pollution from TestDeferredLoadingConfigFlag tests.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Gaëtan Trellu <gaetan.trellu@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
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.

2 participants