Skip to main content

ovos-routing-judge

Who took an utterance, and was it the skill that should have?

One judge for every tool that replays golden utterances (test/end2end/golden_utterances_<lang>.jsonl) against OpenVoiceOS and asks whether each sentence reached the right skill. It is pure Python over the bus messages of one session: no messagebus connection, no UI, no store knowledge, no dependencies. So the same row gets the same verdict wherever it runs:

A failure in CI can then be reproduced on a device and judged the same way (andlo/ovos-klondike-mercantile#48).

Use

from ovos_routing_judge import Claim, in_session, judge

claim = Claim.from_messages(recorded, known_ids=loaded_skill_ids,   # Message objects or dicts
                            session_id=row_session_id)
v = judge(claim, own_ids={"ovos-skill-date-time.openvoiceos"},
          expected="ovos-skill-date-time.openvoiceos:what_time_is_it",
          hung=timed_out, known_ids=loaded_skill_ids)
v.kind     # hit | wrong_intent | captured | other | unhandled | hang
v.taker    # who took it
v.via      # its best signal: intent | provider | ocp | skill | speak
v.detail   # one line on what happened

Claim.observe(message, known_ids) folds messages in one at a time, for a live run that wants to know as soon as something matched.

known_ids is a filter by default: only loaded skills can take a row, so a pipeline plugin's own intent with nothing behind it is unhandled. A caller whose skill list may be incomplete (a live device with skills in other containers) passes strict_known=False: known skills still win, anyone else is the fallback.

Verdicts

kind meaning
hit the row's skill took it (with the expected intent, when the row names one)
wrong_intent the row's skill took it, and another of its intents is what fired (no visible intent at all is a hit)
captured the row's skill was waiting for an answer (get_response / converse) and took the sentence as that answer
other another skill took it (taker); a store can split this further
unhandled nobody took it, or only a pipeline stage with no skill behind it
hang nobody took it and the caller timed out

What counts as taking a sentence

Signals come in tiers; the taker is the first known skill in the best tier:

  1. intent: <skill_id>:<intent> dispatched, ovos.intent.matched, or a pending <skill_id>.converse.* capturing it
  2. provider: a pipeline plugin asked it for content (ovos.common_reading.fetch_content.<skill_id>)
  3. ocp: OCP picked its result (ovos.common_play.play media, or the first track of play / search.populate without a player)
  4. skill: handler start, a fallback that answered (fired as <skill_id>:fallback), common query's question:action (fired as <skill_id>:common_query)
  5. speak: it spoke in this session (speak or core 3's ovos.utterance.speak)

ovos.intent.unmatched means nobody, whatever else was seen.

With session_id, other sessions' messages are ignored, and a message without a session can show an intent, a provider or an OCP pick but never a tier 4 or 5 claim: unrelated skills' background activity (a scheduled event's handler, a fallback probe's reply) arrives without a session and is not theft (learned in ovos-test-harness's fleet suite).

Intent names are compared in one spelling: Name.intent (ovos-workshop 1.x) vs Name, CamelCase in older releases vs snake_case, padatious what.time.is.it vs padacioso what_time_is_it. A row with "intent_type": "ocp" must go through OCP.

The contract

tests/fixtures/cases.json holds recorded message sequences and the verdict each must get. When a core changes its signals, a case goes in there and every tool using the package gets the fix.

License

Apache-2.0

Metadata

Release files for ovos-routing-judge 0.0.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ovos-routing-judge 0.0.5
File Size Uploaded
ovos_routing_judge-0.0.5.tar.gz 16.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ovos-routing-judge 0.0.5
File Interpreter ABI Platform
ovos_routing_judge-0.0.5-py3-none-any.whl Python 3 none any Details

Total release size: 31.3 kB

Release files / ovos_routing_judge-0.0.5.tar.gz

Download URL ovos_routing_judge-0.0.5.tar.gz
Size 16.0 kB
Tags Source
SHA-256 checksum
How to use checksums
310f3b098edaa18ec29278fd2fc1b76b35e401d76f3430815704da4133ae7b15
BLAKE2b-256 checksum
How to use checksums
89670bbf6d6710963d78016c6569f5dbea5e51fd4db9adaca89e4d255ad39677
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.

Transparency log

Release files / ovos_routing_judge-0.0.5-py3-none-any.whl

Download URL ovos_routing_judge-0.0.5-py3-none-any.whl
Size 15.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c093c3296c33b317af10d3b971c48b6648b985e6d6ef8daaac74d570a5eadc32
BLAKE2b-256 checksum
How to use checksums
5d19afdabb970aaf4b75782c97d4c0604dbb4e94515426103a0b206a75bc2534
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.0.5 This release

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page