Epic — migrate OVOS repos onto ovos-spec-tools
Tracking epic for migrating the OVOS ecosystem onto ovos-spec-tools, the conformant reference implementation of the OVOS specifications. This is the concrete work behind the "all existing OVOS repos compliant" criterion of the adoption issue #5.
Why
The same machinery has been reimplemented and drifting across the ecosystem — template expansion duplicated in ~7 repos, the language-matching boilerplate (standardize_lang_tag + closest-match + distance < 10) in ~12, ad-hoc resource loaders in ~3, and the bus Message envelope re-implemented in ovos-bus-client alongside a separate FakeMessage in ovos-utils. ovos-spec-tools is the single conformant implementation each repo depends on.
Strategy
- Each repo migrates directly onto
ovos-spec-tools — no transitive routing through ovos-utils.
- Waves by dependency order, so a repo lands before its dependents.
- Conformance, not just refactor. The specs are prescriptive; migration may change behaviour (e.g. a malformed template now raises instead of silently degrading). Each such change is deliberate and tested.
- Full normalised BCP-47 tag everywhere, no macro flag. Engines reconcile at match time via
closest_lang.
Per-repo recipe
- Add the
ovos-spec-tools dependency.
- Replace the local implementation with a call to
ovos-spec-tools; delete the dead copy.
- Preserve the repo's public API as a thin wrapper (deprecation warning pointing at the spec-tools import).
- Run the repo's tests; reconcile divergences against the spec.
- For a repo shipping
locale/, add ovos-spec-lint to CI.
- One PR per repo.
Progress
Wave 1 — foundation
Wave 1.5 — bus Message primitive consolidation
The Message class moves to ovos-spec-tools as the single source of truth; ovos-bus-client and ovos-utils.fakebus re-export it.
Wave 2 — core libraries
Wave 3 — pipeline plugins
Wave 4 — leaf consumers
Forthcoming spec adoption
As the in-flight specs leave Draft, the per-repo recipe extends to adopting their topic names and conformance points. The topic-name catalogue belongs in ovos-pydantic-models, not in ovos-spec-tools; tracked separately.
Specs with pending implementation impact (open PRs — see issue #5):
Epic — migrate OVOS repos onto
ovos-spec-toolsTracking epic for migrating the OVOS ecosystem onto
ovos-spec-tools, the conformant reference implementation of the OVOS specifications. This is the concrete work behind the "all existing OVOS repos compliant" criterion of the adoption issue #5.Why
The same machinery has been reimplemented and drifting across the ecosystem — template expansion duplicated in ~7 repos, the language-matching boilerplate (
standardize_lang_tag+ closest-match +distance < 10) in ~12, ad-hoc resource loaders in ~3, and the busMessageenvelope re-implemented inovos-bus-clientalongside a separateFakeMessageinovos-utils.ovos-spec-toolsis the single conformant implementation each repo depends on.Strategy
ovos-spec-tools— no transitive routing throughovos-utils.closest_lang.Per-repo recipe
ovos-spec-toolsdependency.ovos-spec-tools; delete the dead copy.locale/, addovos-spec-lintto CI.Progress
Wave 1 — foundation
ovos-spec-tools— released to PyPI; alphas through0.5.0a1ovos-utils— template expansion → feat: migrate ovos-utils onto ovos-spec-tools ovos-utils#373ovos-spec-tools—lang_matches/iter_locale_dirs→ feat: lang_matches and iter_locale_dirs — pin the cross-component lang policy ovos-spec-tools#4ovos-spec-tools—LocaleResources.find→ feat: LocaleResources.find — public resource lookup by (name, ext, lang) ovos-spec-tools#6ovos-spec-tools—keyword_form/vocabulary_keywords/utterance_contains/strip_samples→ feat: keyword_form / vocabulary_keywords + utterance_contains / strip_samples ovos-spec-tools#8ovos-spec-tools—LocaleResources.voc_list/.voc_match/.remove_voc→ feat: LocaleResources.voc_list / .voc_match / .remove_voc ovos-spec-tools#10ovos-spec-tools— OVOS-MSG-1Messageenvelope → feat: OVOS-MSG-1 Message envelope ovos-spec-tools#12Wave 1.5 — bus Message primitive consolidation
The
Messageclass moves toovos-spec-toolsas the single source of truth;ovos-bus-clientandovos-utils.fakebusre-export it.ovos-spec-tools—Messageenvelope landedovos-bus-client— re-export +publishattachment → feat: Message subclasses ovos_spec_tools.Message — no API break ovos-bus-client#215ovos-utils— fakebus re-export +publishattachment → feat: fakebus Message subclasses ovos_spec_tools.Message — no API break ovos-utils#375Wave 2 — core libraries
ovos-bus-client—standardize_langmigration → refactor: migrate language matching to ovos-spec-tools ovos-bus-client#213 (merged in2.0.0a1)ovos-workshop— resource loading + dialog rendering → refactor: route OVOSSkill resource loading through ovos-spec-tools (back-compat) ovos-workshop#413ovos-core— language matching (intent services) → refactor: migrate language matching to ovos-spec-tools ovos-core#763ovos-plugin-manager— language matching (utils/config.py)Wave 3 — pipeline plugins
nebulento→ feat: migrate to ovos-spec-tools nebulento#27padacioso→ feat: migrate to ovos-spec-tools padacioso#55palavreado→ feat: migrate to ovos-spec-tools palavreado#25linha-fina→ feat: migrate to ovos-spec-tools TigreGotico/linha-fina#13jurebes→ feat: migrate to ovos-spec-tools TigreGotico/jurebes#11ovos-padatious-pipeline-plugin→ refactor: migrate to ovos-spec-tools ovos-padatious-pipeline-plugin#70ovos-adapt-pipeline-plugin→ fix: bucket engines by full BCP-47 tag, migrate to ovos-spec-tools ovos-adapt-pipeline-plugin#42ovos-ocp-pipeline-plugin→ feat: migrate to ovos-spec-tools ovos-ocp-pipeline-plugin#130Wave 4 — leaf consumers
ovos-lang-parserovos-option-matcher-fuzzy-pluginovos-solver-YesNo-pluginlocale/folderForthcoming spec adoption
As the in-flight specs leave Draft, the per-repo recipe extends to adopting their topic names and conformance points. The topic-name catalogue belongs in
ovos-pydantic-models, not inovos-spec-tools; tracked separately.Specs with pending implementation impact (open PRs — see issue #5):
skill_idreplacesowner_id;converse.ping/.pongtopic rename;session_idremoved from response data payloadovos.stop.ping/.pongcapability-discovery convention;skill_idin conformanceskill_idinMatch; per-type transformer ordering via session fields;blacklisted_*_transformerssession keysovos.utterance.handlereplacesrecognizer_loop:utterance;ovos.intent.handler.*replacesmycroft.skill.handler.*;ovos.intent.unmatchedreplacescomplete_intent_failurecontext.session.session_idas registration keysession_idrouting; site_id ownershipovos.utterance.handleemission contract; audio-transformer chain before STTsession.user_id,session.auth_level, and four per-signal fields (voice_id,face_id,name_id,passphrase_id,default_user_id) in SESSION-1 field registry; recognition plugin and bridge conformance obligations; skillauth_levelgating