Spec traceability

August 1, 2026 · View on GitHub

ovos-spec-tools exists for one reason: to be the reference implementation of the OVOS formal specifications. Every public symbol in the package implements a specific clause of a specific spec. There is no "general-purpose" code here. This page is the proof: every name exported from ovos_spec_tools, mapped to its authoritative spec section.

The specs live in the OpenVoiceOS/architecture repository. Section numbers (§N) refer to the spec named in the same row. Where a symbol is a shared primitive used across several spec clauses, the "primary" owning clause is cited and the dependents are noted.

Bus / message domain

The bus domain (message.py, messages.py) is the most heavily spec-annotated; its module and per-symbol docstrings cite OVOS-MSG-1 inline. See Bus messages and Bus namespaces for the prose.

message.py: OVOS-MSG-1 (Bus Message)

SymbolSpec§
MessageOVOS-MSG-1§2 (envelope)
Message.msg_type / .data / .contextOVOS-MSG-1§2.1 / §2.2 / §2.3
Message.__init__ (type checks)OVOS-MSG-1§2.1-§2.3, §7
Message.forwardOVOS-MSG-1§5.1
Message.replyOVOS-MSG-1§5.2
Message.responseOVOS-MSG-1§5.3
Message.serializeOVOS-MSG-1§6
Message.deserializeOVOS-MSG-1§6, §7
Message.as_dictOVOS-MSG-1§2, §6
MalformedMessageOVOS-MSG-1§2, §6, §7 (consumer "MUST reject")
DEFAULT_SESSION_IDOVOS-MSG-1§4.1 (reserved "default")
RoutingValue (type alias)OVOS-MSG-1§3 / §3.3 (routing key shape)

The routing keys (context.source / context.destination, §3) and the session carrier (context.session, §4) are carried by Message but their inner semantics are owned elsewhere: §3 by MSG-1 itself (opaque), §4's inner shape by OVOS-SESSION-1.

messages.py: the spec topic vocabulary and the migration bridge

SpecMessage members each name a topic owned by another spec; the bridge (MIGRATION_MAP / NamespaceTranslator) is the cross-cutting machinery that moves the bus onto those topics.

SymbolSpec§
SpecMessage.UTTERANCEOVOS-PIPELINE-1§9.1
SpecMessage.SPEAKOVOS-PIPELINE-1§9.6
SpecMessage.UTTERANCE_HANDLEDOVOS-PIPELINE-1§9.5
SpecMessage.UTTERANCE_CANCELLEDOVOS-TRANSFORM-1§8.2 (defined here; PIPELINE-1 §6.4 references it)
SpecMessage.INTENT_MATCHEDOVOS-PIPELINE-1§9.2
SpecMessage.INTENT_UNMATCHEDOVOS-PIPELINE-1§9.3
SpecMessage.INTENT_HANDLER_START / _COMPLETE / _ERROROVOS-PIPELINE-1§8.1
SpecMessage.INTENT_REGISTER_KEYWORDOVOS-INTENT-4§5
SpecMessage.INTENT_REGISTER_TEMPLATEOVOS-INTENT-4§6
SpecMessage.ENTITY_REGISTEROVOS-INTENT-4§7
SpecMessage.INTENT_DEREGISTEROVOS-INTENT-4§8.2
SpecMessage.ENTITY_DEREGISTEROVOS-INTENT-4§8.3
SpecMessage.SKILL_DEREGISTEROVOS-INTENT-4§8.4
SpecMessage.INTENT_ENABLE / INTENT_DISABLEOVOS-INTENT-4§8.5
SpecMessage.INTENT_LIST / _LIST_RESPONSEOVOS-INTENT-4§10.1
SpecMessage.INTENT_DESCRIBE / _DESCRIBE_RESPONSEOVOS-INTENT-4§10.2
SpecMessage.STOP_PING / STOP_PONGOVOS-STOP-1§4.2
SpecMessage.STOPOVOS-STOP-1§5.3
SpecMessage.LISTENER_RECORD_STARTED / _RECORD_ENDED / LISTENER_SLEEP / LISTENER_AWOKENOVOS-AUDIO-IN-1§6.1 / §6.2 / §6.3 / §6.4
SpecMessage.SPEAK_B64OVOS-AUDIO-1§3.4
SpecMessage.AUDIO_SPEECHOVOS-AUDIO-1§4.3
SpecMessage.AUDIO_QUEUE / AUDIO_PLAY_SOUNDOVOS-AUDIO-1§4.1 / §4.2
SpecMessage.AUDIO_STOPOVOS-AUDIO-1§6
SpecMessage.AUDIO_IS_SPEAKINGOVOS-AUDIO-1§5.3
SpecMessage.AUDIO_OUTPUT_STARTED / _OUTPUT_ENDEDOVOS-AUDIO-1§5.1 / §5.2
SpecMessage.MIC_LISTENOVOS-AUDIO-1§4.4
SpecMessage.SESSION_SYNCOVOS-SESSION-2§2.7 (bus table §7)
SpecMessage.CONVERSE_ACTIVE_LIST / _ACTIVE_LIST_RESPONSEOVOS-CONVERSE-1§6.1
SpecMessage.PERSONA_QUERY / _ANSWEROVOS-PERSONA-1§8.5 (§11 bus surface)
SpecMessage.PERSONA_LIST / _LIST_RESPONSEOVOS-PERSONA-1§8.7 (§11)
SpecMessage.PERSONA_REGISTER / _DEREGISTEROVOS-PERSONA-1§9 (§11)
SpecMessage.PERSONA_ACTIVATED / _DISMISSEDOVOS-PERSONA-1§11
SpecMessage.FALLBACK_REGISTER / _DEREGISTEROVOS-FALLBACK-1§3.1 / §3.2 (§9 bus surface)
SpecMessage.COMMON_QUERY_PING / _PONGOVOS-COMMON-QUERY-1§6.1 / §6.2 (§13 bus surface)
SpecMessage.TRANSFORMER_{AUDIO,UTTERANCE,METADATA,INTENT,DIALOG,TTS}_LIST / _LIST_RESPONSEOVOS-TRANSFORM-1§6 (six static query/response pairs)
SpecMessage.COMMON_PLAY_{PLAY,SEARCH}OVOS-OCP-1§4.2
SpecMessage.COMMON_PLAY_{PAUSE,RESUME,STOP,NEXT,PREVIOUS,SEEK}OVOS-OCP-1§4.3
SpecMessage.COMMON_PLAY_{PLAYER,MEDIA,TRACK}_STATEOVOS-OCP-1§4.4
MIGRATION_MAP(bridge)encodes the renames defined by PIPELINE-1 §8/§9, INTENT-4 §8, STOP-1 §4/§5, AUDIO-IN-1
SPEC_TO_LEGACY(bridge)reverse of MIGRATION_MAP
migration_counterpart(bridge)symmetric counterpart lookup
NamespaceTranslator(bridge)dual-emit + receive-dedup; mirrors ovos-bus-client / FakeBus
NamespaceTranslator.counterpart_topics(bridge)send-side dual-emit
NamespaceTranslator.is_migrated(bridge)participation pre-check
NamespaceTranslator.new_mirror_guard(bridge)receive-side mirror-window dedup

The bridge symbols are not owned by one numbered spec clause. They are the mechanism that carries the bus from the legacy topic names to the ovos.* topics the specs above define, while honouring OVOS-MSG-1 §6 (payload key order is not significant, used in the dedup fingerprint). The two topics the bridge deliberately does not map trace to OVOS-INTENT-4 §5 (N→1 registration consolidation) and OVOS-MSG-1 §2.1.1 (runtime-assembled placeholder topics); see Bus namespaces.

intent_topics.py — OVOS-MSG-1 §2.1.1 (runtime-assembled dispatch topic)

The per-intent dispatch topic <skill_id>:<intent_name> is assembled at runtime, so SpecMessage cannot name it. These helpers own its shape and the transitional translation of the legacy .intent-suffixed spelling old ovos-workshop releases put on the wire.

SymbolSpec§
is_intent_topicOVOS-MSG-1§2.1.1 (: is the structural separator)
canonical_intent_topicOVOS-MSG-1§2.1.1 (<intent_name>, not a filename)
legacy_intent_topic(migration)inverse of the above; historical spelling
INTENT_FILE_SUFFIXOVOS-INTENT-2§3 (.intent is an authoring resource extension)

Like the namespace bridge, the translation is a migration policy of this tooling, not a spec-mandated mechanism: no spec defines the suffixed topic.

Session domain: OVOS-SESSION-1

session.py is the reference implementation of the §4 session carrier's inner shape (which OVOS-MSG-1 §4 defers to OVOS-SESSION-1), plus the handler-list helpers that PIPELINE-1 and CONVERSE-1 keep in the session.

SymbolSpec§
SessionOVOS-SESSION-1§3 (registered field set)
SESSION1_REGISTERED_FIELDSOVOS-SESSION-1§3
SESSION1_OWNED_FIELDSOVOS-SESSION-1§3 (fields SESSION-1 itself owns)
DEFAULT_CONVERSE_HANDLERS_CAPOVOS-CONVERSE-1§2.1 (handler-list cap)
MalformedSessionOVOS-SESSION-1§3 (malformed wire shape)

(session.py is owned by an in-flight PR; the citations above describe the symbols it exports as imported by the package __init__.)

Intent template / locale domain

expansion.py: OVOS-INTENT-1 (Sentence Template Grammar)

SymbolSpec§
expandOVOS-INTENT-1§3 (grammar), §3.7 (inline vocab), §4 (sample set)
inline_keywordsOVOS-INTENT-1§3.7 (<name> inline vocabulary references)
MalformedTemplateOVOS-INTENT-1§3.6 (malformed templates)

resources.py: OVOS-INTENT-2 (Locale Resource Formats)

SymbolSpec§
LocaleResourcesOVOS-INTENT-2§2 (layout / override precedence), §4 (six roles)
read_resource_fileOVOS-INTENT-2§3 (common reader)
read_prompt_fileOVOS-INTENT-2§3, §4.4 (.prompt whole-file read)
iter_locale_dirsOVOS-INTENT-2§2 (locale layout) + §2.2 distance fallback
find_lang_dirOVOS-INTENT-2§2.2 (closest-language directory resolution)
keyword_formOVOS-INTENT-2§4.3 (slot-free template grouping)
normalize_for_matchOVOS-INTENT-2§4.3 (match-comparison normalization)
utterance_containsOVOS-INTENT-2§4.3 (vocabulary / keyword match)
strip_samplesOVOS-INTENT-2§4.3 (keyword removal)
MalformedResourceOVOS-INTENT-2§3, §4 (malformed file / layout)

dialog.py: OVOS-INTENT-2 §4.2 (Dialog)

SymbolSpec§
renderOVOS-INTENT-2§4.2 (select + fill a .dialog phrase)
DialogRendererOVOS-INTENT-2§4.2 (stateful, multilingual renderer)
UnfilledSlotOVOS-INTENT-2§4.2 (a chosen phrase has an unfilled slot)
verify_slot_consistencyOVOS-INTENT-1§7 + §5.5 (Dialog renderer MUST verify all phrases declare the same slot set)

prompt.py: OVOS-INTENT-2 §4.4 (.prompt)

SymbolSpec§
render_promptOVOS-INTENT-2§4.4 (conservative {name} substitution)
PromptRendererOVOS-INTENT-2§4.4 (stateful, multilingual prompt renderer)

Language matching: shared OVOS-INTENT-2 §2.2 primitive

language.py is the single implementation of "closest available language", the smart-fallback logic OVOS-INTENT-2 §2.2 relies on for resource resolution (and which TTS/STT plugins reuse).

SymbolSpec§
standardize_langOVOS-INTENT-2§2.2 (BCP-47 tag normalization)
lang_distanceOVOS-INTENT-2§2.2 (regional-match distance, <10 usable)
lang_matchesOVOS-INTENT-2§2.2 (match predicate)
closest_langOVOS-INTENT-2§2.2 (closest-match resolution)

Linting: OVOS-INTENT-1 / OVOS-INTENT-2

lint.py validates resource syntax (INTENT-1) and naming/layout (INTENT-2); the --spec-version switch flags features newer than a target spec version.

SymbolSpec§
lint_localeOVOS-INTENT-1 + OVOS-INTENT-2INTENT-1 §3 (syntax) + INTENT-2 §2/§4 (layout/roles)
Finding(tooling)a single lint result (severity/path/message)
ovos-spec-lint (CLI)(tooling)command wrapper over lint_locale

Package

SymbolSpec§
__version__(packaging)installed package version string

Coverage

Every name in ovos_spec_tools.__all__ appears in a table above. The only rows whose "spec" column is not a numbered OVOS spec clause are:

  • the bridge machinery (MIGRATION_MAP, SPEC_TO_LEGACY, migration_counterpart, NamespaceTranslator and its methods). These carry the bus onto spec topics rather than implementing one clause, and each entry/mapping is itself traced to the spec rename it encodes;
  • the intent-topic translation (legacy_intent_topic) — the same kind of migration carrier, tracing to the OVOS-MSG-1 §2.1.1 topic shape it restores;
  • tooling/packaging surface (Finding, the ovos-spec-lint command, __version__).

Everything else is a direct reference implementation of a cited OVOS-MSG-1, OVOS-SESSION-1, OVOS-SESSION-2, OVOS-INTENT-1, OVOS-INTENT-2, OVOS-INTENT-4, OVOS-PIPELINE-1, OVOS-STOP-1, OVOS-AUDIO-IN-1, OVOS-AUDIO-1, OVOS-CONVERSE-1, OVOS-PERSONA-1, OVOS-FALLBACK-1, OVOS-COMMON-QUERY-1, OVOS-TRANSFORM-1, or OVOS-OCP-1 clause.

SpecMessage is the static ovos.* topic vocabulary: it carries one member per spec-defined fixed-string topic and deliberately omits runtime-templated topics (MSG-1 §2.1.1: the <skill_id>:…, <pipeline_id>…, per-skill ping placeholders) and topics used by ovos-bus-client that no spec defines (ovos.session.update_default, ovos.session.start, ovos.context.set).


Home