Skip to content

Release 0.2.0a1 - #66

Open
github-actions[bot] wants to merge 58 commits into
masterfrom
release-0.2.0a1
Open

Release 0.2.0a1#66
github-actions[bot] wants to merge 58 commits into
masterfrom
release-0.2.0a1

Conversation

@github-actions

@github-actions github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown

Human review requested! This supersedes any earlier open release proposal for this repository.

renovate Bot and others added 30 commits December 19, 2025 21:04
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* Add French count locale

* Sync French count locale snapshots
* fix(i18n): normalize locale folder names to canonical BCP-47 form

Rename all locale directories to use canonical BCP-47 codes:
- Lowercase regions → uppercase (da-dk → da-DK, en-us → en-US)
- Bare language codes → full BCP-47 (da → da-DK, eu → eu-ES)
- Invalid codes remapped (eu-eu → eu-ES, fa-fa → fa-IR)
- Nested bare-language subdirs merged up (eu-ES/eu/ → eu-ES/)

This fixes wheel build failures caused by ZIP files containing
duplicate entries with different contents for the same logical path.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore(i18n): remove deprecated translations/ folder (gitlocalize)

The translations/ folder with JSON files was used by gitlocalize and
has been deprecated in favor of ovos-localize.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: aautomations

* ci: add standard GitHub Actions workflows
* fix: allow ovos-workshop 9.x

Lift the ovos-workshop upper bound from <9.0.0 to <10.0.0 so this fixture
skill can be installed alongside ovos-workshop 9.x in the ovos-core
ovoscope end-to-end suite.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(ci): wire test extra + relocate e2e tests for ovos-workshop 9.x

The skill declared no `test` extra, so `install_extras: test` (pip install
wheel[test]) never installed the e2e deps (ovos_bus_client / ovoscope),
breaking build_tests + coverage; the ovoscope job pointed at a non-existent
`test/end2end/` and collected 0 tests (hard-fail).

- setup.py: add get_requirements() helper; declare install_requires from
  requirements.txt and a `test` extra from test/requirements.txt.
- test/requirements.txt: bump ovoscope to >=1.0.0a1,<2.0.0 and add
  ovos-bus-client + ovos-core[plugins,lgpl]>=2.0.0a1 (provides the
  padatious/stop pipeline plugins the e2e suite needs).
- Move the ovoscope e2e test to test/end2end/test_stop.py (where the
  ovoscope workflow looks) and add test/unittests/ with pipeline-free unit
  tests (skill loading + plugin discovery) for build_tests/coverage.
- build-tests.yml / coverage.yml: run test/unittests with no extra. The unit
  tests only need the runtime deps + pytest; the `test` extra drags in fann2
  (padatious) which needs libfann-dev that those jobs don't install.
- ovoscope.yml: require_padatious so padatious tests run (and CI installs
  swig + libfann) instead of silently skipping.
- Refresh stale e2e expectations to current ovos-core 2.x / stop-pipeline
  behavior (stop:skill, trimmed stop callback, ovos.utterance.speak); ignore
  the parallel `*.stop.response` fan-out which has no stable cross-machine
  order.
- MANIFEST.in: ship test/requirements.txt in the sdist.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* fix: rename entry-point group to opm.skill

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* test: update stop e2e to the current intent-dispatch protocol

The end2end expectations predated the namespaced intent lifecycle. Running the
suite against the released stack shows the count skill itself emits nothing new;
the extra messages all come from ovos-core and the TTS layer:

- INTENT §8.1: every match is now bracketed by ovos.intent.matched,
  ovos.intent.handler.start and ovos.intent.handler.complete, alongside the
  legacy mycroft.skill.handler.start/complete
- INTENT §9.3: a miss is reported as ovos.intent.unmatched, replacing
  complete_intent_failure
- AUDIO-1 §5: the per-number TTS playback boundaries, and the speech.stop that
  silences an in-flight number, are timing-dependent and are now ignored

Each added expectation is a protocol message, not a duplicate emitted by the
skill, so this tracks the current contract rather than masking a regression.

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* fix: lowercase intent base name per OVOS-INTENT-2 §2

Rename count_to_N.intent to count_to_n.intent across all locales and
update the intent handler and test references. Intent base names must
consist only of lowercase ASCII letters, digits and underscores.

Remove the orphaned count_to_N.error.dialog files: their base name
carried an illegal dot, they were never referenced by the skill, and
their text duplicated failed_extract_number.dialog, which is the dialog
the number-extraction failure path actually speaks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(test): drift-immune subset e2e for stop and counting

Replace the ordered expected_messages sequences (which double under the opt-in
dual-send migration and break on the speak -> ovos.utterance.speak and
complete_intent_failure -> ovos.intent.unmatched renames) with subset
assertions. Each test now asserts only the load-bearing facts: the matched
intent, whether a global/skill stop actually fired, and — for the counting
skill — its own active_sessions state, which is the ground truth of whether
counting is still running, instead of counting bus messages.

Emit the unbounded 'count to infinity' on a daemon thread (FakeBus.emit runs
handlers synchronously, so the infinite loop would otherwise block the test).
Isolate XDG paths per xdist worker to avoid FileExistsError races and floor-pin
ovoscope for CaptureSession/make_session helpers.

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* test: add ovoscope end-to-end intent-routing tests

Cover the en-US count_to_N.intent samples against the trained Padacioso
container, asserting the finite 'count to #', the scale/number-kind modifiers,
and the unbounded 'count forever'/'count infinitely' phrasings all route to
count_to_N.intent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(test): match padacioso's lowercase registered intent name

CI on feat/ovoscope-tests was failing: the padacioso container registers
count_to_N.intent under its lowercased, extension-stripped basename
(count_to_n), not the literal on-disk filename. Update the container-level
assertions to match the actual registered key instead of the file spelling.

* fix(test): drop stale .intent suffix from registered intent-name assertion

Same padacioso-registration drift as the previous commit: the bus event is
SKILL_ID:count_to_n, not SKILL_ID:count_to_n.intent.

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
JarbasAl and others added 28 commits August 12, 2026 13:42
Vendors the skill's slice of the shared ovoscope golden-utterance corpus
(5 rows, all "count forever ..." phrasings). Firing an unbounded count
through the real bus would run the counting handler's time.sleep loop
forever, so -- following this repo's own test_intents_en_us.py
convention -- golden rows are checked against the trained padacioso
container directly (container.calc_intent) rather than dispatched live.
All 5 rows pass green as-is; no template defects found. Adds 7 negative
utterances from other skills' domains, dispatched for real and asserted
NOT claimed.
… instances (#51)

The stop tests hardcoded the legacy mycroft.stop topic; current core emits
the canonical ovos.stop, so STOPPED is now a set accepting either spelling,
matching the file's existing NO_MATCH/SPOKE pattern. The skill-loading tests
never shut down the skills and loaders they start, leaving workshop
background threads mutating shared state during pytest teardown - a race
that trips CI's coverage job; a tearDown now stops every instance.
Submitted by @denics via OVOS Localize

Co-authored-by: ovos-localize[bot] <ovos-localize[bot]@users.noreply.github.com>
Submitted by @denics via OVOS Localize

Co-authored-by: ovos-localize[bot] <ovos-localize[bot]@users.noreply.github.com>
Submitted by @denics via OVOS Localize

Co-authored-by: ovos-localize[bot] <ovos-localize[bot]@users.noreply.github.com>
Submitted by @denics via OVOS Localize

Co-authored-by: ovos-localize[bot] <ovos-localize[bot]@users.noreply.github.com>
The count_to_N.intent templates for en-US, pt-PT, fr-FR and it-IT used
inline `#`/`##`/... digit wildcards, a padatious-specific pattern that
only ever matches bare digit sequences and never plain-language numbers
("count to five"). Replaced every wildcard occurrence with the portable
`{number}` slot (no .entity file, kept as an open slot) and deduplicated
the resulting flattened lines.

The intent handler already fell back to ovos-number-parser's
extract_number() over the raw utterance whenever no "number" slot was
present; now that a slot is always populated it needs to also accept
non-digit slot values, so the digit-only `int(number)` cast falls back to
extract_number(number, ...) on parse failure, letting word-form numbers
resolve through the slot path too.

Fail-before: reverted the source/locale changes with the new test still
in place; test_number_slot_parses_words_and_digits and
test_en_us_count_intents both failed (AssertionError: None !=
'ovos-skill-count.openvoiceos:count_to_n' : count to five). Reapplying
the fix makes both pass; full suite is 25 passed, 0 failed.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
The intent_handler decorator registers "count_to_n.intent" but the
it-IT locale shipped the file as "count_to_N.intent". Resource
resolution matches filenames exactly by case within the requested
lang directory; when it doesn't find one there it silently falls
back to a language-agnostic walk of the whole locale tree and
returns the first file with the right name it finds in any locale.
For it-IT this meant it silently loaded the en-US intent samples
instead of failing to find a resource at all, so the it-IT skill
was trained on English utterances.

Renamed the file to match the handler; en-US, fr-FR and pt-PT were
already correctly named. Added a regression test asserting the
it-IT resource resolves to the it-IT file (fails before the rename,
resolving to en-US instead; passes after).

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
The golden-utterance corpus for ovos-skill-count only carried five
"count forever ..." rows, all mapping to count_to_n.intent; no row
ever exercised the finite "count to <target>" phrasing that fills the
{number} slot, so a regression in the plain "count to {number}" or its
scale/kind-modifier variants could ship without the golden suite
noticing. Two other natural phrasings for the same finite target --
"can you count to five" and "count from one to twenty" -- were not
recognized by the en-US template at all.

Added six golden rows: a bare digit-word target ("count to ten"), a
bare numeral target ("count to 20"), a scale-modifier variant ("count
to 3 in long scale"), an ordinal-numbers variant ("count to five using
ordinal numbers"), and the two previously-unrecognized phrasings
("can you count to five", "count from one to twenty"). The handler
only ever counts from 1 (`for n in range(1, number + 1)`, no start
argument), so "count from one/1 to {number}" is anchored at one rather
than modeled as a general two-endpoint range the skill can't actually
serve. Added four new lines to the en-US count_to_n.intent template
("can you count to {number}", "could you count to {number}", "count
from one to {number}", "count from 1 to {number}") as flat literals
rather than "(a|b)" groups, matching this file's existing convention
of fully expanded lines and avoiding padacioso's per-line sampling cap
(a version using groups pushed the file's total expansions over 2000
samples, triggering padacioso to keep only one nondeterministic
expansion per line and making matches for the untrained branch flaky).

Verified via container.calc_intent probing that all six new
utterances route to count_to_n.intent, then fail-before'd the
assertions themselves: for the first four rows, stripping the bare
"count to {number}" line from the intent file made two of them fail
("count to ten", "count to five using ordinal numbers") and pass again
once restored; for the "can you .../count from ..." rows, reverting
just the four new template lines made both fail and pass again once
restored.

Full test/end2end suite: 24 passed / 2 failed after this change, vs
19 passed / 1 failed before. Both failures are in test_stop.py, whose
docstring-adjacent log output shows padaos "compiling in background,
serving last compiled state in the meantime" -- a known async-compile
race that is timing-sensitive under machine load; re-running
test_stop.py alone reproduces a single failure on a different test
each time, confirming this is pre-existing flakiness unrelated to the
golden_utterances.jsonl / count_to_n.intent changes in this commit.

Co-authored-by: Claude Sonnet 5 <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